RadioGroup
Forma de pagamento
Com rótulo
import { RadioGroup } from '@rivocode/ui'Quando usar
Agrupa os Radio e cuida da escolha única e da navegação por setas. Passe
aria-label ou aponte para um título com aria-labelledby: sem isso o grupo
existe para o mouse e não para o leitor de tela.
No React Native
Traduz com items na raiz: não há Radio solto para compor, e tudo é controlado.
O label é o aria-label do web com outro nome. A página de lá já cobrava: sem nome, o grupo existe para o dedo e não para o leitor de tela. Aqui não havia como cobrar, e o buraco era pior do que faltar a prop: o forValue do subcaminho de formulário já entregava accessibilityLabel, mas o tipo é fechado e espalhamento em JSX não confere propriedade excedente, então o nome era descartado em silêncio com o TypeScript verde.
Ele não desenha nada: o texto visível é do Field, como no Select e no Combobox. Dentro de um FormField, repita ali o mesmo texto do label dele.
API
| Prop | Tipo |
|---|---|
defaultValue0.4.0The uncontrolled value of the radio button that should be initially selected. | unknown |
disabled0.4.0Whether the component should ignore user interaction. | boolean |
form0.4.0Identifies the form that owns the radio inputs. | string |
inputRef0.4.0A ref to access the hidden input element. | Ref<HTMLInputElement> |
name0.4.0Identifies the field when a form is submitted. | string |
onValueChange0.4.0Callback fired when the value changes. | ((value: unknown, eventDetails: { reason: "none"; event: Event; cancel: () => void; allowPropagation: () => void; isCanceled: boolean; isPropagationAllowed: boolean; trigger: Element | undefined; }) => void) |
readOnly0.4.0Whether the user should be unable to select a different radio button in the group. | boolean |
render0.4.0Allows you to replace the component's HTML element with a different tag, or compose it with another component. | ComponentRenderFn<HTMLProps, RadioGroupState>ReactElement<unknown, stringJSXElementConstructor<any>> |
required0.4.0Whether the user must choose a value before submitting a form. | boolean |
value0.4.0The controlled value of the radio item that should be currently selected. | unknown |
Além destas, a peça aceita className, style, id e children, repassados ao elemento de baixo.
Partes
RadioGroup se monta com estas peças. Todas vivem nesta página, porque separar cada uma num endereço obrigaria a abrir seis abas para montar uma tela.
Radio
/radio.mdO circulo, sem rótulo. O texto fica num <label> que envolve os dois, igual ao
Checkbox, para o clique no texto também marcar.
Use quando as opções cabem na tela e comparar entre elas importa. Passando de
umas cinco, o Select gasta menos espaço.
O rótulo
Passe o texto como filho e o círculo sai dentro de um <label>:
<RadioGroup defaultValue="pix">
<Radio value="pix">Pix</Radio>
<Radio value="boleto">Boleto</Radio>
</RadioGroup>
Sem filho, sai só o círculo, para quando o rótulo tiver estrutura própria.
Partes
classNames veste cada parte pelo nome: circle é o círculo de fora,
indicator é a marca de dentro e label é o <label> que embrulha os dois.
labelClassName é o nome antigo de classNames.label, e continua valendo.
<Radio value="pix" classNames={{ circle: 'size-5', indicator: 'size-2.5' }}>
Pix
</Radio>
O respiro entre o círculo e o texto é o mesmo do Checkbox e do Switch, que
aparecem na mesma lista de formulário. E é menor do que o que separa uma opção
da seguinte, senão o rótulo ficaria mais perto da opção de baixo do que do
próprio círculo.
O círculo marcado
O círculo marcado pinta accent-text, e não accent, com o ponto em
surface-raised. É a mesma troca da caixa do Checkbox e do trilho do
Switch: com a lima cheia o preenchimento media 1,21:1 sobre a página no tema
claro e 1,26:1 sobre o cartão, contra os 3:1 da WCAG 1.4.11. O ponto era
grafite e se lia, então o que sumia era a fronteira do círculo - a pessoa
via um ponto solto, e não uma opção escolhida.
Com accent-text a fronteira mede 5,55:1 sobre a página e 5,75:1 sobre o
cartão, e o ponto mede 5,75:1 dentro do preenchimento. No tema escuro os dois
papéis apontam para o mesmo valor, então lá o círculo não mudou de cor.
Desabilitado
Desabilitado se pinta com token, e não com opacidade: o fundo passa a
surface-raised e a marca vai para fg-disabled. É a mesma receita do
Checkbox, borda inclusive. Ela não muda com o estado. Opacidade rebaixaria
tudo de uma vez, e a guarda de contraste do repositório não mede opacidade: o
par aprovado no arquivo de tema poderia reprovar na tela sem nada acusar.
| Prop | Tipo |
|---|---|
valueobrigatória0.4.0The unique identifying value of the radio in a group. | unknown |
classNames0.5.0Classe por parte: `circle`, `indicator`, `label`. | Partial<Record<"circle""indicator""label", string>> |
disabled0.4.0Whether the component should ignore user interaction. | boolean |
inputRef0.4.0A ref to access the hidden input element. | Ref<HTMLInputElement> |
labelClassName0.4.0Classe do `<label>` de fora, quando ha texto. | string |
nativeButton0.4.0Whether the component renders a native `<button>` element when replacing it via the `render` prop. | boolean |
readOnly0.4.0Whether the user should be unable to select the radio button. | boolean |
render0.4.0Allows you to replace the component's HTML element with a different tag, or compose it with another component. | ComponentRenderFn<HTMLProps, RadioRootState>ReactElement<unknown, stringJSXElementConstructor<any>> |
required0.4.0Whether the user must choose a value before submitting a form. | boolean |
Além destas, a peça aceita className, style, id e children, repassados ao elemento de baixo.