Skip to content

Forms

The form family covers the field shell that wraps every input, form-scope feedback, and compound form patterns. Three layers build on each other: the Field family handles a single label/control/message stack; FieldGroup composes multiple fields with consistent spacing and responsive orientation support; FormMessage renders non-field (form-scope) errors as a consolidated Alert.

Token surface: Color palette: light tokens.css-token:border, Color palette: light tokens.css-token:destructive, Color palette: light tokens.css-token:muted-foreground, Color palette: light tokens.css-token:ring, Semantic radius tokens.css-token:vueda-control-radius.

This page is the visual contract the default theme guarantees. Use it as the target spec when you re-skin: every cell shown here should still read as the same surface after a customization, even if its color, density, or spacing shifts. If a cell breaks, the change has crossed from skin into design language.

For the mechanics of overriding any of this, see Customize VUEDA Appearance. Values belong in CSS tokens; compositions belong in theme keys.

Field shell: anatomy

Field is the layout container. It groups a FieldLabel, a FieldContent column (which holds the control, optional FieldDescription, and any FieldMessage), and an optional required indicator. The orientation prop switches between vertical (default), horizontal, and responsive.

Theme keys: Field, FieldLabel, FieldContent, FieldDescription.

Field: validation states

FieldMessage handles both error and warning severity beneath the control. Error messages render in text-destructive; warning messages render in amber. Multiple messages automatically switch to a bulleted list. The invalid border on the input (aria-invalid="true") comes from the Input theme key, not the field shell.

Theme keys: FieldMessage. Token surface: Color palette: light tokens.css-token:destructive.

Form-level feedback

FormMessage renders non-field (form-scope) errors as a single Alert. When multiple messages arrive, they appear as a list inside one Alert rather than a stack of separate alerts. The type="message" prop switches the Alert variant to warning for non-blocking feedback.

Theme key: FormMessage. Token surface: Color palette: light tokens.css-token:destructive, Color palette: light tokens.css-token:warning.

Long-form layout: new customer

Section headers and a 2-column grid compose multi-section forms. A vk-form-section-title header groups related fields, and a divider separates sections. Repeating contact rows (FieldSet machinery) belong with the ObjectsGrid pass.

Auth patterns

Auth forms use a centered card on a flat neutral surface. The login form uses a w-[35rem] card with standard field layout. The authorizing form (2FA, change password) uses the same card in a narrower configuration. Both are composed from the same field primitives as any other form — the difference is only the page shell.

ActionForm: bulk action panel

ActionForm sits inline above the list of selected records — no overlay, no drawer. It frames a summary of the action, the affected records, and confirm/cancel buttons. The theme keys map 1:1: root, inner, list, buttons. The form-scope feedback block (for dry-run failures) uses the same consolidated Alert pattern as any other form.

Customization surface

The field shell is the most frequently customized part of VUEDA's theme. The highest-value keys for structural change are:

  • Field: root — gap between label and content, flex direction per orientation, invalid color cascade.
  • FieldLabel: root — font-weight, size, checked-state highlight on inline checkbox/radio labels.
  • FieldContent: root — gap between control, description, and message lines.
  • FieldDescription: root — text color, size, link decoration.
  • FieldMessage: root — error text color; list — multi-message bullet list layout.
  • FormMessage: root — margin around the consolidated Alert; list — list layout inside Alert.
  • FieldGroup: root — gap between fields, container-query scope for responsive orientation.

Documents matching: server v3.0.0a1.post1client v3.0.0-alpha.2