Примитивы
10

Checkbox

Настоящий <input type="checkbox"> под кастомной отрисовкой. Подпись оборачивает input, а не ссылается на него, поэтому id не нужен и два чекбокса на странице не столкнутся.

чистая разметка — библиотеки на странице нет
отрендерил aura-react
отрендерил aura-vue
отрендерил aura-svelte
собрано из классов самого aura-angular

Код

index.html
<div class="aura-stack" style="--aura-dir:column;--aura-gap:var(--space-3)">
  <label class="aura-check">
    <input type="checkbox" class="aura-checkbox" />
    <span>Run all tests</span>
  </label>
  <div style="padding-inline-start: var(--space-5)">
    <div class="aura-stack" style="--aura-dir:column;--aura-gap:var(--space-3)">
      <label class="aura-check">
        <input type="checkbox" class="aura-checkbox" checked />
        <span>Unit</span>
      </label>
      <label class="aura-check">
        <input type="checkbox" class="aura-checkbox" />
        <span>Integration</span>
      </label>
      <label class="aura-check">
        <input type="checkbox" class="aura-checkbox" />
        <span>Browser</span>
      </label>
    </div>
  </div>
  <label class="aura-check">
    <input type="checkbox" class="aura-checkbox" checked disabled />
    <span>Locked by policy</span>
  </label>
</div>
Demo.tsx
import { useState } from 'react';
import { Checkbox, Stack } from '@ilomee/aura-react';

const TESTS = ['Unit', 'Integration', 'Browser'];

/**
 * «Частично» — это состояние «некоторые, но не все», и смысл оно имеет только относительно набора,
 * поэтому демо и есть набор. Собственного значения у родителя нет: он читает детей и показывает
 * галочку, когда отмечены все, полоску — когда только часть, и ничего, когда ни одного. Клик
 * приводит всех к тому состоянию, в котором они ещё не находятся. Показано именно так, потому что
 * одиночный чекбокс в состоянии «частично» сам себя продемонстрировать не может: у состояния нет
 * HTML-атрибута, только DOM-свойство, и клик всегда его снимает — полоска исчезла бы при первом же
 * использовании и больше не вернулась.
 */
export default function Demo() {
  const [checked, setChecked] = useState<string[]>(['Unit']);

  const all = checked.length === TESTS.length;
  const none = checked.length === 0;

  return (
    <Stack gap={3}>
      <Checkbox
        label="Run all tests"
        checked={all}
        indeterminate={!all && !none}
        onCheckedChange={() => setChecked(all ? [] : TESTS)}
      />
      {/* A plain div carries the indent so the nesting is visible; the four packages merge a
          caller's `style` into a layout component in their own order, and this keeps the markup
          identical across all of them for the parity diff. */}
      <div style={{ paddingInlineStart: 'var(--space-5)' }}>
        <Stack gap={3}>
          {TESTS.map((name) => (
            <Checkbox
              key={name}
              label={name}
              checked={checked.includes(name)}
              onCheckedChange={(on) =>
                setChecked((prev) => (on ? [...prev, name] : prev.filter((x) => x !== name)))
              }
            />
          ))}
        </Stack>
      </div>
      <Checkbox label="Locked by policy" defaultChecked disabled />
    </Stack>
  );
}

Настоящий нативный input под кастомной отрисовкой: он уходит с формой, связан со своей подписью и уже несёт поведение с клавиатуры и для скринридера. (Switch — сознательное исключение: это <button role="switch">, поэтому он не участвует в отправке формы.)

Demo.vue
<script setup lang="ts">
import { ref } from 'vue';
import { Checkbox } from '@ilomee/aura-vue';

const ok = ref(true);
</script>

<template>
  <Checkbox v-model="ok" label="Ship on Friday" />
</template>

Настоящий нативный input под кастомной отрисовкой: он уходит с формой, связан со своей подписью и уже несёт поведение с клавиатуры и для скринридера. (Switch — сознательное исключение: это <button role="switch">, поэтому он не участвует в отправке формы.)

Demo.svelte
<script lang="ts">
  import { Checkbox } from '@ilomee/aura-svelte';

  let ok = $state(true);
</script>

<Checkbox bind:checked={ok} label="Ship on Friday" />

Настоящий нативный input под кастомной отрисовкой: он уходит с формой, связан со своей подписью и уже несёт поведение с клавиатуры и для скринридера. (Switch — сознательное исключение: это <button role="switch">, поэтому он не участвует в отправке формы.)

Используется как aura-checkbox.

demo.component.ts
import { AuraCheckbox } from '@ilomee/aura-angular';

@Component({
  standalone: true,
  imports: [AuraCheckbox],
  template: `<aura-checkbox label="Ship on Friday" [(checked)]="ok" />`,
})
export class DemoComponent {
  ok = true;
}

Настоящий нативный input под кастомной отрисовкой: он уходит с формой, связан со своей подписью и уже несёт поведение с клавиатуры и для скринридера. (Switch — сознательное исключение: это <button role="switch">, поэтому он не участвует в отправке формы.)

Пропсы

У чистой разметки нет пропсов — классы ниже и есть весь API. Четыре пакета не делают ничего сверх того, что проставляют вам те же самые классы.
ИмяТипПо умолчаниюПримечания
labelstringРисует строку-обёртку.
checkedbooleanУправляемое значение.
defaultCheckedbooleanfalse
indeterminatebooleanfalseHTML-атрибута indeterminate не существует — только DOM-свойство, поэтому каждый пакет выставляет его императивно после рендера.
onCheckedChange(checked: boolean) => void
disabledboolean
ИмяТипПо умолчаниюПримечания
labelstring
modelValueдвустороннийbooleanРаботает через v-model.
defaultCheckedbooleanfalse
indeterminatebooleanfalseHTML-атрибута indeterminate не существует — только DOM-свойство, поэтому каждый пакет выставляет его императивно после рендера.
disabledbooleanfalse
update:modelValueсобытие(checked: boolean) => void
ИмяТипПо умолчаниюПримечания
labelstring
checkedдвустороннийbooleanfalse$bindable — используйте bind:checked.
indeterminatebooleanfalseHTML-атрибута indeterminate не существует — только DOM-свойство, поэтому каждый пакет выставляет его императивно после рендера.
disabledbooleanfalse
onchange(checked: boolean) => void
ИмяТипПо умолчаниюПримечания
labelstring
checkedbooleanfalse
indeterminatebooleanfalseHTML-атрибута indeterminate не существует — только DOM-свойство, поэтому каждый пакет выставляет его императивно после рендера.
disabledbooleanfalse
checkedChangeсобытиеEventEmitter<boolean>

Какие классы отдаёт

Все фреймворки отдают одни и те же классы — именно поэтому четыре библиотеки выглядят одинаково. Их можно использовать напрямую, вообще без библиотеки компонентов.

КлассРольПримечания
.aura-checkboxбазаОбязательный. Без него модификатор не работает.
.aura-checkбазаОбязательный. Без него модификатор не работает.

Токены и правила

components.css
коробка
var(--checkbox-size) · var(--checkbox-radius)
не отмечен
var(--surface) · var(--field-border)
отмечен
var(--accent)
галочка
clip-path polygon — no icon set needed
фокус
var(--focus-ring)