Komponenter
Radio
Radio er et alternativ brukeren kan velge. Bruk flere radio for å vise en liste med alternativer. Brukerne kan bytte mellom alternativene, men kan kun velge ett.
HTML
Unable to parse html
const Preview = () => { return <Radio label='Radio' value='value' name='name' />; }; render(<Preview />)
Bruk
Bruk klassen ds-input på <input> sammen med type="radio".
For et gyldig form-element anbefaler vi å bruke <ds-field> sammen med en <label>.
CSS variabler og data-attributter
Størrelser styres med data-size og farger med data-color. Komponenten vil arve nærmeste forelder med disse satt.
Radio er ds-input med type="radio" så variabler og data-attributter som gjelder for input gjelder også for radio.
| Navn | Verdi |
|---|---|
| --dsc-input-padding-block | var(--ds-size-2) |
| --dsc-input-padding-inline | var(--ds-size-3) |
| --dsc-input-padding | var(--dsc-input-padding-block) var(--dsc-input-padding-inline) |
| --dsc-input-size--toggle | var(--ds-size-6) |
| --dsc-input-size | var(--ds-size-12) |
| --dsc-input-background--readonly | var(--ds-color-neutral-surface-tinted) |
| --dsc-input-background | var(--ds-color-neutral-surface-default) |
| --dsc-input-border-color--readonly | var(--ds-color-neutral-border-subtle) |
| --dsc-input-border-color | var(--ds-color-neutral-border-default) |
| --dsc-input-border-style | solid |
| --dsc-input-border-width--toggle | max(var(--ds-border-width-default),calc(var(--ds-size-1)/2)) |
| --dsc-input-border-width | var(--ds-border-width-default) |
| --dsc-input-outline-color--hover | var(--ds-color-neutral-border-default) |
| --dsc-input-outline-color--toggle--hover | var(--dsc-input-accent-color) |
| --dsc-input-outline-width--hover | var(--ds-border-width-default) |
| --dsc-input-outline-style--hover | solid |
| --dsc-input-color--readonly | var(--ds-color-neutral-text-default) |
| --dsc-input-color | var(--ds-color-neutral-text-default) |
| --dsc-input-stroke-color | var(--ds-color-base-contrast-default) |
| --dsc-input-stroke-color--invalid | var(--ds-color-danger-base-contrast-default) |
| --dsc-input-stroke-width | 0.05em |
| --dsc-input-accent-color | var(--ds-color-base-default) |
| --dsc-input-accent-color--invalid | var(--ds-color-danger-text-subtle) |
| --dsc-input-line-height | var(--ds-line-height-md) |
| Navn | Verdi |
|---|---|
| data-width | auto |
Eksempel
Gruppering
Bruk fieldset for gruppering av flere valg.
HTML
Unable to parse html
const Group = () => { const { getRadioProps } = useRadioGroup({ name: 'kontakt', value: 'epost', }); return ( <Fieldset> <Fieldset.Legend>Hvordan ønsker du at vi kontakter deg?</Fieldset.Legend> <Fieldset.Description> Velg metoden som passer best for deg. Vi bruker dette kun til å sende viktig informasjon om saken din. </Fieldset.Description> <Radio label='E-post' description='Vi bruker e-postadressen du har oppgitt tidligere (navn@epost.no)' {...getRadioProps('epost')} /> <Radio label='SMS' description='Vi bruker telefonnummeret du har oppgitt tidligere (99 99 99 99)' {...getRadioProps('sms')} /> <Radio label='Brev' description='Levering kan ta 3-5 virkedager, avhengig av posttjenesten.' {...getRadioProps('brev')} /> </Fieldset> ); }; render(<Group />)
Outline
data-variant="outline" legger på ekstra padding og en ramme rundt valget slik at det blir en større klikkflate.
HTML
Unable to parse html
const Outline = () => { const { getRadioProps } = useRadioGroup({ name: 'course-level', variant: 'outline', }); return ( <Fieldset> <Fieldset.Legend>Hvilket kursnivå passer deg best?</Fieldset.Legend> <Fieldset.Description> Velg nivået som beskriver din erfaring med temaet. </Fieldset.Description> <Radio label='Nybegynner' description='Passer for deg som er helt ny og ønsker en rolig introduksjon.' {...getRadioProps('beginner')} /> <Radio label='Viderekommen' description='Passer for deg som kjenner grunnleggende begreper og vil gå dypere.' {...getRadioProps('intermediate')} /> <Radio label='Ekspert' description='Passer for deg som ønsker avanserte temaer og praktiske case.' {...getRadioProps('expert')} /> </Fieldset> ); }; render(<Outline />)
Inline
Radio kan plasseres horisontalt med flex, men skal som hovedregel plasseres vertikalt.
HTML
Unable to parse html
const Inline = () => { return ( <Fieldset> <Fieldset.Legend>Kontaktes på e-post?</Fieldset.Legend> <Fieldset.Description> Bekreft om du ønsker å bli kontaktet per e-post. </Fieldset.Description> <div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--ds-size-6)' }} > <Radio name='my-inline' label='Ja' value='ja' /> <Radio name='my-inline' label='Nei' value='nei' /> </div> </Fieldset> ); }; render(<Inline />)
ReadOnly
type="radio" er alltid :read-only, og har ikke støtte for dette på samme måte som input-typer du kan skrive i.
Dersom du setter readonly på radio sørger vi for at den oppfører seg som om den kun har lesetilgang, ved å stoppe onClick og onChange.
Brukeren vil fortsatt kunne fokusere på elementet.
HTML
Unable to parse html
const ReadOnly = () => ( <Radio label='Radio' value='value' name='name' readOnly /> ); render(<ReadOnly />)
React
I React er det enklere å bygge opp en radio, da vi har en ferdig komponent som tar seg av det meste av logikken og tilstandshåndteringen for oss.
Radio er en sammensatt komponent som bruker field, label, validation message og input for å lage en radio.
I tillegg har vi en egen useRadioGroup React-hook for å lettere håndtere en gruppe av Radio-komponenter.
- disabled
- Description
Disables element @note Avoid using if possible for accessibility purposes
- Type
boolean
- readOnly
- Description
Toggle `readOnly`
- Type
boolean
- data-indeterminate
- Description
Indeterminate state for checkbox inputs Only works when used inside `Field` component
- Type
boolean- Default
false
- aria-label
- Description
Optional aria-label
- Type
string
- label
- Description
Radio label
- Type
ReactNode
- description
- Description
Description for field
- Type
ReactNode
- value
- Description
Value of the `input` element
- Type
string | number | readonly string[]
- error
- Description
Error message for field
- Type
ReactNode
- variant
- Description
If outline, the radio will have a border.
- Type
"outline"
- aria-labelledby
- Type
string
| Name | Type | Default | Description |
|---|---|---|---|
| disabled | boolean | - | Disables element @note Avoid using if possible for accessibility purposes |
| readOnly | boolean | - | Toggle `readOnly` |
| data-indeterminate | boolean | false | Indeterminate state for checkbox inputs Only works when used inside `Field` component |
| aria-label | string | - | Optional aria-label |
| label | ReactNode | - | Radio label |
| description | ReactNode | - | Description for field |
| value | string | number | readonly string[] | - | Value of the `input` element |
| error | ReactNode | - | Error message for field |
| variant | "outline" | - | If outline, the radio will have a border. |
| aria-labelledby | string | - | - |