import { ArgTypes, Meta, Canvas } from '@storybook/addon-docs/blocks';
import { CssVariables, JumpTo } from '../../.storybook/blocks';
import * as stories from './field.stories';
import { Details } from '../react';

<Meta of={stories} />

# Field
> Field er et hjelpemiddel for å automatisk koble et felt sammen med Label, Field. Description, ValidationMessage og Field.Counter. Field kan brukes sammen med Input, Textarea og Select. 

<JumpTo />

## Kode
- Legg klassen `field` på `<ds-field>` rundt ledetekst og skjemafelt
- Field beriker indre skjemaelementer med f.eks automatisk sammenkobling av `<label>` og `<input>`, beskrivelser (`<p data-field="validation">`) og valideringer `validation data-field="validation"`, samt `textarea` skalering, tegn teller, `suggestion` posisjonering etc.
- **Flere inputs for én label?** Field skal kun inneholde ét skjemaelementet, men du kan knytte flere sammen (f.eks fornavn + etternavn osv.) med [Fieldset](/?path=/story/designsystem-fieldset--with-texts)
- **Mønster:** [Se mønster for merking av obligatoriske felter](https://www.designsystemet.no/no/patterns/required-and-optional-fields)

<Details>
  <Details.Summary>Se egne parameter for React</Details.Summary>
<div>
I React kan du velge å bruke `<Field>` med `<label>`, `<Input>` osv. for full kontroll, eller med `as="input"`/`as="select"` og props for automatisk oppsett av elementer:
<ArgTypes of={stories} />
</div>
</Details>

<Canvas of={stories.Default} />

## Obligatorisk felt
- Legg `required` eller `aria-required` på skjemaelementet
- Da får du automatisk teksten `Må fylles ut` i `<label>`
- Teksten `Må fylles ut` oversettes automatisk til `Required` dersom du setter `<html lang="en">`. Du kan også selv endre tekst med CSS custom property: `--mtds-text-required: "Må fylles ut";`
- **Merk:** Dersom du ønsker å skru denne [lovpålagte merkingen av obligatoriske felter](https://www.designsystemet.no/monstre/obligatoriske-og-valgfrie-felt), kan du legge `data-required="hidden"` på hvilket som helst element (f.eks. `<html data-required="hidden">` for å skru av for hele dokumentet)
<Canvas of={stories.Required} />

## Radio / Check / Switch
- Ved bruk av `<input type="checkbox | radio"` vil `<label>`, `<p data-field="description">` og `class="styles.validation" data-field="validation"` legge seg etter input
<Canvas of={stories.Toggles} />

## Delvis valgt checkbox
- Bruk `indeterminate` ([via javascript](https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/indeterminate)) på `<input type="checkbox">` for delvis valgt checkbox
<Canvas of={stories.Indeterminate} />

## Feilmelding
- Legg klassen `validation` på et element for å tilknytte feilmelding
<Canvas of={stories.WithValidation} />

## Innebygget skjemavalidering
- Nettleserens innebyggede valideringsmeldinger skjules pga. begrenset styling og universell utforming
- Du kan allikevel få [nettleserens innebygge skjemavalidering](https://developer.mozilla.org/en-US/docs/Learn_web_development/Extensions/Forms/Form_validation#using_built-in_form_validation) til å automatisk skjule og vise [validation-komponentet](?path=/docs/designsystem-validation--docs) ved å legge `data-validation="form"` på `form` 
- **Merk:** `ds-suggestion` krever `input aria-required="true"` (ikke `input required`) siden suggestion ikke er et native skjemaelement
<Canvas of={stories.WithValidationForm} />

## Prefiks og suffiks
- Legg klassen `affixes` på en `<div>` rundt `input`
- Legg elementer før eller etter `input` for å legge til ikon eller tekst
- **Merk:** for god tilgjengelighet, beskriv ønsket innhold i `<p data-field="description">` eller `<label>`, f.eks.: "Pris i NOK per måned"
<Canvas of={stories.WithAffixes} />

## Antall tegn
- Legg klassen `validation` og attributt `data-field="counter"` på typisk en `<p>` etter `input`
- Du kan endre teksten med `data-over="%d characters too many"` og `data-under="%d characters remaining"`
<Canvas of={stories.WithCharacterCount} />

## Med suggestion (Combobox)
- Legg klassen `suggestion` på `<ds-suggestion>` rundt `<input>` og `<datalist>` med `<option>`s for å lage forslag
- Legg en `<select hidden name="NAME-HERE">` i `<ds-suggestion>` for å få med verdien i skjemaet
- Legg en `<del hidden aria-label=""></del>` etter input for å få en tøm-knapp
- Bruk `data-nofilter` på `<u-datalist>` for å skru av filtrering
- Trenger du egne hjelpetekster for skjemleser? Se attributter [for ds-suggestion](https://u-elements.github.io/u-elements/elements/u-combobox#attributes-and-props) og for [for u-datalist](https://u-elements.github.io/u-elements/elements/u-datalist#attributes-and-props)
- **Merk:** Suggestion må alltid ha en tilknyttet `<label>`, men denne kan skjules med `hidden`
- **React?** Bruk `<Field.Suggestion>`, `<Field.Datalist>` og `<Field.Option>` eller<br />`<Field as={Field.Suggestion}>` ([se eksempel](?path=/story/designsystem-field--react-with-suggestion))
<Details>
<Details.Summary>Hva er `ds-suggestion`?</Details.Summary>

ds-suggestion bygger på [u-combobox](https://u-elements.github.io/u-elements/elements/u-combobox),
som sikrer universell utforming. Dette lastes automatisk når du bruker `@mattilsynet/design`.
Du kan også hente inn tilhørende HTMLElement interface ved behov:
```
import { DSSuggestionElement } from '@mattilsynet/design'
```
</Details>

<Canvas of={stories.WithSuggestion} />

<CssVariables component="field" />