Fee
The number on the cover is the number on the invoice.
Groups a label, control, and hint or error in one vertical field.
As it appears on the invoice.
The number on the cover is the number on the invoice.
Three ways in. They share one source, so the pixels match whichever you pick.
npm install @noorddev/vlak-react
// once, next to your app's root
import "@noorddev/vlak-react/css";
import { Field, FieldError, FieldHint, FieldLabel, Input } from "@noorddev/vlak-react";Precompiled React and one stylesheet. No compiler to configure. Per-component imports work too: @noorddev/vlak-react/components/field.
npx @noorddev/vlak-cli add field
The StyleX leaf lands in components/vlak/ with its dependencies, for your own compiler to own. See StyleX.
npx shadcn add https://vlak.dev/r/field.json
The same registry item, installed by shadcn's CLI.
<link rel="stylesheet" href="node_modules/@noorddev/vlak/css/vlak.css" />
No React. Link vlak.css and use the markup and classes below.
import { Field, FieldError, FieldHint, FieldLabel, Input } from "@noorddev/vlak-react";
<Field>
<FieldLabel htmlFor="name">Name</FieldLabel>
<Input plain id="name" />
<FieldHint>As it appears on the invoice.</FieldHint>
</Field>
<Field>
<FieldLabel htmlFor="iban">IBAN</FieldLabel>
<Input plain id="iban" />
<FieldError>Check the country code.</FieldError>
</Field>Stack: label, control, hint or error. The hint and error describe the control.
Also accepts HTMLAttributes<HTMLDivElement>.
Also accepts HTMLAttributes<HTMLParagraphElement>.
Also accepts HTMLAttributes<HTMLParagraphElement>.
Also accepts LabelHTMLAttributes<HTMLLabelElement>.
<div class="rs-field"><label class="rs-field-label" for="invoice-name">Name</label><input class="rs-input rs-input-full" id="invoice-name" aria-describedby="invoice-name-hint" /><p class="rs-field-hint" id="invoice-name-hint">As it appears on the invoice.</p></div>