Inputs
Twee smaken inputs
- Ghost / verborgen veld. Standaard onzichtbaar — je ziet alleen het label en (indien ingevuld) de waarde. Hover geeft een subtiele vulling, focus opent het veld. Dit is het primaire veld op A4-papier.
- Normaal veld. Altijd zichtbaar met border en achtergrond. 36px hoog, radius
--radius-md. Gebruik in instellingen, modals en formulieren. - Gedeelde tokens. Beide varianten delen typografie, spacing en focus-ring (2px
--accent-blue-glow+ border--accent-blue). Fout =--dangerborder + hint-tekst.
1 · Ghost / verborgen veld
Hoofdveld op A4 papier. Rust = onzichtbaar. Hover = subtiele vulling. Focus = volle border + ring. Ingevuld + blur = alleen tekst.
2 · Text input
Standaard tekstveld. Ook voor email, telefoon, nummers — type verandert, styling niet.
3 · Textarea
Meerdere regels. Verticaal resizable, horizontaal niet.
4 · Select
Native select voor korte lijsten (≤ 10 opties). Voor grote lijsten: klant-picker / combobox.
5 · Checkbox & Radio
Checkbox = meerkeuze / boolean. Radio = precies één keuze uit een groep.
6 · Toggle switch
Voor instant on/off — instelling met direct effect. Niet gebruiken voor 'bevestigen' — dat is een checkbox.
7 · Search
Text-input met zoek-icoon links. Voor lijst-filters, tabellen, klant-picker.
8 · Filterbar
Vaste filter-component boven lijsten. Config-driven: één entry per filter in FILTER_DEFS. Chips staan links, '+ Filter' opent de picker, 'Alles wissen' rechts.
9 · Gebruik in code
Alle inputs delen dezelfde .ds-input wrapper — kies je control (input, textarea, select). Voor states: is-error, is-disabled.
<label className="ds-input">
<span className="ds-input__label">Klantnaam</span>
<input className="ds-input__control" placeholder="Bijv. Acme B.V." />
<span className="ds-input__hint">Optionele helptekst.</span>
</label>
/* Error state */
<label className="ds-input is-error">
<span className="ds-input__label">Postcode</span>
<input className="ds-input__control" />
<span className="ds-input__hint">Vul een geldige postcode in.</span>
</label>
/* Filterbar — config-driven */
const FILTER_DEFS = [
{ key: "status", label: "Status", icon: I.Check,
kind: "multi-select", options: STATUSES,
predicate: (item, v) => v.includes(item.status) },
{ key: "edited", label: "Bewerkt", icon: I.Calendar,
kind: "single-select", options: ["Vandaag","Afgelopen week","Deze maand","Alles"],
predicate: (item, v) => /* … */ true },
];
<FilterBar
defs={FILTER_DEFS}
active={filters}
onChange={setFilters}
allItems={items}
/>