GrRadioGroup

  • ядро
  • Формы
  • API · 11 props
  • ⌨ клавиши

Берут, когда вариантов до семи и все видны.

import { GrRadioGroup } from '@feugene/granularity/components/GrRadioGroup'

Обзор

Когда брать

  • вариантов до семи и все видны — способ доставки, тип оплаты, роль: выбор без лишнего клика по панели;
  • у вариантов есть описание — строка пояснения под подписью, чего не даёт селект;
  • группа — часть формы — общее name, disabled и readonly раздаются через контекст;
  • вариант выглядит кнопкой — variant="button" без потери семантики radiogroup.

Когда взять другое

НужноБерите
Вариантов больше семиGrSelect
Вариантов 2–5 и они переключают вид, а не значениеGrSegmented
Можно выбрать несколькоGrCheckboxGroup
Переключатель один и он про «включено/выключено»GrSwitch
Один переключатель вне группыGrRadio

Варианты все тона и виды — настоящим компонентом

variant

  • radiobox
  • button

Размеры

  • xs
  • sm
  • md
  • lg

Состояния

  • обычная
  • disabled
  • readonly
  • invalid

Матрица живая: наводите и нажимайте. Состояний наведения, фокуса и нажатия здесь нет — они за браузером, а не за пропом.

Playground контролы выводятся из API, а не пишутся руками

Сцена

Загружается…

0 изменено· состояние — в адресе

Примеры 3 у каждого — живое демо и его код

  • Чем оплатить счёт

    Три способа оплаты сравнивают глазами, поэтому все они на виду — выпадающий список спрятал бы два за кликом. У каждого варианта своё description, а invalid отмечает группу, а не вариант: правило нарушает выбор целиком.

    Pay invoice INV-0418€1,284.50 · due 30 September
  • Настройки вида сегментами

    variant="button" превращает те же варианты в ряд сегментов: короткие выборы, которые читаются с одного взгляда, — тема, плотность, первый день недели — занимают меньше места и остаются группой переключателей для клавиатуры и скринридера.

    ThemeSystem follows your computer
    Table densityCompact fits 40% more rows
    Week starts onCalendars and weekly reports
  • Расписание дайджеста в одну строку

    Четыре коротких ответа помещаются в строку — orientation="horizontal". Один вариант выключен отдельно: ежедневный дайджест есть в тарифе Team, — и его описание говорит об этом, а не прячет вариант.

    Revenue digestAn email with revenue, churn and overdue invoices

API порождается из пакета · разойтись не может

Props

PropTypeпо умолчаниюОписание
disabledboolean | undefinedfalseВыключить всю группу. Складывается с `disabled` у `GrFormField`.
variantGrRadioGroupVariant | undefined"radiobox"Вид: `radiobox` — кружки с подписями, `button` — ряд склеенных кнопок. По умолчанию `radiobox`.
optionsGrRadioGroupOption[] | undefinedundefinedВарианты, из которых группа строит переключатели. Не нужны, если они разложены в слоте.
readonlyboolean | undefinedfalseТолько для чтения: выбор видно, но он не меняется.
invalidboolean | undefinedfalseВизуальное и ARIA-состояние ошибки.
requiredboolean | undefinedfalseОбязательное поле (`aria-required`).
size"xs" | "sm" | "md" | "lg" | undefinedundefinedСтупень размера переключателей. По умолчанию `md`; берётся из `GrConfigProvider`.
ariaLabelstring | undefinedundefinedДоступное имя группы. Не задано — имя берётся из подписи `GrFormField`.
namestring | undefinedundefinedИмя для нативной формы: выбранное значение уходит скрытым полем. Без имени не уходит.
orientationGrRadioGroupOrientation | undefined"vertical"Раскладка варианта `radiobox`. Кнопочный вариант всегда горизонтальный — его собирает `GrButtonGroup`.
modelValueобязательныйv-modelGrRadioValue—Выбранное значение (`v-model`): совпадает с `value` одного из переключателей.

Слоты

SlotTypeОписание
defaultanyСобственная разметка переключателей вместо генерации из `options`.

События

EventСигнатураОписание
update:modelValue(event: "update:modelValue", value: GrRadioValue): void—
change(event: "change", value: GrRadioValue): void—
focus(event: "focus", event: FocusEvent): void—
blur(event: "blur", event: FocusEvent): void—

Методы

MethodsСигнатураОписание
focus() => voidПоставить фокус на остановку `Tab` группы — обычно выбранный переключатель, а не первый.
blur() => voidСнять фокус с остановки `Tab` группы.

Типы

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

Импорт
import type { GrRadioGroupConfigurableProps, GrRadioGroupVariant, GrRadioGroupOrientation } from '@feugene/granularity/components/GrRadioGroup'

Файлdist/types/components/GrRadioGroup/config.d.ts

grRadioGroupConfigconst
const grRadioGroupConfig: import("@feugene/granum/contract").GranumComponentDescriptor<"GrRadioGroup">;

Файлdist/types/components/GrRadioGroup/defaults.d.ts

GrRadioGroupConfigurablePropsinterface

Пропы GrRadioGroup, настраиваемые глобально через <GrConfigProvider :component-defaults="{ GrRadioGroup: { … } }">. Только оформление — см. GrButton/defaults.ts.

interface GrRadioGroupConfigurableProps {
    size: GrButtonSize;
}

Файлdist/types/components/GrRadioGroup/GrRadioGroup.vue.d.ts

GrRadioGroupVarianttype
type GrRadioGroupVariant = 'radiobox' | 'button';
GrRadioGroupOrientationtype
type GrRadioGroupOrientation = 'vertical' | 'horizontal';
GrRadioGroupOptioninterface
interface GrRadioGroupOption {
    value: GrRadioValue;
    label: string;
    /** Отключить одну опцию, не переходя на слот. */
    disabled?: boolean;
    /** Пояснение под подписью. Рисуется только в варианте `radiobox`. */
    description?: string;
}
GrRadioGroupPropsinterface

GrRadioGroup — контейнер группы GrRadio. Может работать как через слот (ручной рендер GrRadio), так и через проп options. Предоставляет дочерним GrRadio общий modelValue/disabled/size/name через inject.

interface GrRadioGroupProps {
    /** Выбранное значение (`v-model`): совпадает с `value` одного из переключателей. */
    modelValue: GrRadioValue;
    /** Варианты, из которых группа строит переключатели. Не нужны, если они разложены в слоте. */
    options?: GrRadioGroupOption[];
    /** Имя для нативной формы: выбранное значение уходит скрытым полем. Без имени не уходит. */
    name?: string;
    /** Выключить всю группу. Складывается с `disabled` у `GrFormField`. */
    disabled?: boolean;
    /** Только для чтения: выбор видно, но он не меняется. */
    readonly?: boolean;
    /** Визуальное и ARIA-состояние ошибки. */
    invalid?: boolean;
    /** Обязательное поле (`aria-required`). */
    required?: boolean;
    /**
     * Вид: `radiobox` — кружки с подписями, `button` — ряд склеенных кнопок. По умолчанию
     * `radiobox`.
     */
    variant?: GrRadioGroupVariant;
    /**
     * Раскладка варианта `radiobox`. Кнопочный вариант всегда горизонтальный —
     * его собирает `GrButtonGroup`.
     */
    orientation?: GrRadioGroupOrientation;
    /** Ступень размера переключателей. По умолчанию `md`; берётся из `GrConfigProvider`. */
    size?: GrButtonSize;
    /** Доступное имя группы. Не задано — имя берётся из подписи `GrFormField`. */
    ariaLabel?: string;
}
GrRadioGroupEmitsinterface
interface GrRadioGroupEmits {
    /** Выбрано новое значение (`v-model`) — кликом или стрелкой: стрелка переносит и выбор. */
    (e: 'update:modelValue', value: GrRadioValue): void;
    /** Пользователь сменил выбор — тот же payload, что у `update:modelValue`. */
    (e: 'change', value: GrRadioValue): void;
    /** Фокус вошёл в группу. Переход стрелками между переключателями событием не считается. */
    (e: 'focus', event: FocusEvent): void;
    /** Фокус ушёл из группы целиком. */
    (e: 'blur', event: FocusEvent): void;
}

Файлdist/types/components/GrRadioGroup/index.d.ts

GrRadioGroupInstancetype
type GrRadioGroupInstance = ComponentExposed<typeof GrRadioGroupComponent>;

Доступность

Паттерн APG

radio

Клавиши

Enter↑ / ←

КлавишаДействие
—Space
Enterвыбрать; ↓/→ — следующий
↑ / ←предыдущий (выбор едет вместе с фокусом, по кругу); Home/End — первый/последний доступный. Группа — одна остановка Tab, отключённые варианты пропускаются

Использование из прозы библиотеки

Два режима
vue
<!-- Пропом: короткий путь для плоского списка. -->
<GrRadioGroup v-model="status" :options="options" />

<!-- Слотом: когда вариантам нужна своя разметка. -->
<GrRadioGroup v-model="status">
  <GrRadio value="draft">Черновик</GrRadio>
  <GrRadio value="review">На проверке</GrRadio>
</GrRadioGroup>

Оба режима получают одну и ту же клавиатуру и один и тот же контекст: состав группы собирается регистрацией детей, а не обходом DOM, поэтому работает и на сервере.

Опции
ts
interface GrRadioGroupOption {
  value: string | number | boolean
  label: string
  disabled?: boolean
  description?: string
}

disabled отключает один вариант, не переводя всю группу на слот — раньше это был единственный способ. description рисуется под подписью и только в варианте radiobox: у кнопочного чипа описанию негде жить.

Раскладка

orientation — vertical (по умолчанию) или horizontal. Кнопочный вариант всегда горизонтальный: его собирает GrButtonGroup, и orientation там ни на что не влияет.

Состояния

disabled гасит всю группу, readonly оставляет выбор видимым, но неизменяемым: aria-readonly объявляет сама группа (у роли radio такого атрибута нет), а переключатели перестают обещать клик курсором.

invalid и required доходят и до группы, и до вида переключателей. Внутри GrFormField то же самое приходит из контекста поля: имя через aria-labelledby, подсказка и текст ошибки — через aria-describedby, ошибка — через aria-invalid. Группа не labelable-элемент, поэтому <label for> для неё неприменим.

Клавиатура

Вся раскладка описана в карточке GrRadio: группа — одна остановка Tab, внутри ↑/↓/←/→ по кругу и Home/End на края. Отключённые варианты пропускаются везде — и в roving tabindex, и при обходе стрелками.