Carbon Components Svelte предоставляет возможность создавать собственные компоненты, полностью интегрированные с системой дизайна IBM Carbon. Важной особенностью является соблюдение единого визуального языка и поведения, что обеспечивает консистентность интерфейса.
Любой компонент в Svelte состоит из трёх основных частей: script, style и markup. Для соответствия Carbon рекомендуется:
Пример базовой структуры собственного компонента:
<script>
import { Button } from 'carbon-components-svelte';
export let label = "Нажми меня";
let clicked = false;
function handleClick() {
clicked = !clicked;
console.log(`Кнопка ${clicked ? 'активирована' : 'деактивирована'}`);
}
</script>
<div class="my-component">
<Button on:click={handleClick}>{label}</Button>
{#if clicked}
<p>Состояние кнопки: активное</p>
{/if}
</div>
<style>
.my-component {
margin: 1rem;
}
</style>
Все стилизованные элементы должны использовать классы
bx-- из Carbon. Для создания новых компонентов следует:
carbon-components-svelte/css для цветовой схемы и
отступов.<style>
.my-component__header {
@include bx--type-heading-03;
color: $bx--text-heading;
}
</style>
Carbon активно использует состояния: hover,
focus, disabled, selected. В
Svelte их можно управлять через реактивные переменные и биндинги:
<script>
let isDisabled = false;
</script>
<Button disabled={isDisabled}>Отправить</Button>
<input type="checkbox" bind:checked={isDisabled}> Отключить кнопку
Важно: визуальные состояния компонентов должны соответствовать
стандартам Carbon, поэтому рекомендуется использовать встроенные классы
состояния (bx--btn--disabled,
bx--list-box--expanded и т.д.), а не создавать новые.
Для повторного использования компонентов Carbon в собственных компонентах применяются слоты. Слоты позволяют динамически вставлять контент в заранее определённые участки компонента.
<script>
export let title = "Заголовок";
</script>
<div class="card">
<div class="card-header">
<slot name="header">{title}</slot>
</div>
<div class="card-content">
<slot>Основное содержимое карточки</slot>
</div>
</div>
Слоты особенно полезны для создания обёрток над компонентами Carbon, например, карточек с кнопками, модальных окон или кастомных форм.
Carbon предоставляет набор утилит для работы с событиями, анимациями, формами и доступностью. При разработке собственных компонентов важно:
FocusTrap,
FloatingMenu для управления модальными окнами и
всплывающими списками.FormItem, Checkbox,
RadioButton для консистентных форм.carbon-icons-svelte для добавления иконок в
кнопки и элементы управления.<script>
import { Close20 } from 'carbon-icons-svelte';
</script>
<Button>
<Close20 slot="icon"/> Закрыть
</Button>
Carbon поддерживает кастомизацию темы через Sass-переменные и CSS-переменные. Для собственных компонентов:
$my-component-background: $bx--interactive-01;.<style>
.my-component {
background-color: var(--my-component-bg, $bx--interactive-01);
}
</style>
Этот подход позволяет создавать новые элементы интерфейса, которые органично вписываются в экосистему Carbon, оставаясь масштабируемыми и удобными для поддержки.