JM Family Design System
Patterns

Form Layout

The structure that turns individual inputs into a task a user can complete: grouped fields, clear labels, useful helper text, recoverable validation, and actions that match the user's progress.

When to use it

Form layout starts once individual controls need to work together as one task. Use it to make field order, grouping, validation, and actions predictable.

Use form layout when

  • The user is providing structured informationThe task asks for fields, choices, confirmations, or preferences that must be submitted together.
  • Fields have a meaningful orderEarlier answers set context for later answers, or the workflow has a natural top-to-bottom sequence.
  • Validation and recovery matterThe system must tell the user what is missing, what is invalid, and how to continue without guessing.

Use something else when

  • The task is a single decisionUse a dialog, inline control, or action button when the user only needs to confirm or choose one thing.
  • The user is scanning dataUse a data table or list pattern when the main job is finding, comparing, sorting, or filtering records.
  • The workflow spans multiple distinct stagesUse a wizard or page template when each stage needs its own review, save point, or route.

Anatomy

A form layout owns the composition around field primitives: order, grouping, validation recovery, and action placement.

  • Form title

    Required

    A heading that names the task, not the database object. Use "New vendor request," not "Vendor form."

    Use a real heading and keep it aligned with the route or panel title.

  • Section heading

    Conditional

    Use sections when a form has multiple groups of fields. The section heading names the decision the group supports.

    Do not add section wrappers around short forms that already scan cleanly.

  • Field label

    Required

    Every input has a visible, persistent label. Placeholder text is not a label.

    Connect label and control with the component API or native htmlFor/id wiring.

  • Helper and error text

    Conditional

    Helper text explains why or how to answer before submission. Error text explains what to fix after validation.

    Use aria-describedby for helper and error text, and aria-invalid when a field is invalid.

  • Actions

    Required

    Primary and secondary actions sit after the fields. The primary action names the outcome: "Save vendor," "Submit request," "Send invite."

    Do not silently disable the primary action; explain missing requirements inline.

Variants

Pick the layout by task complexity. A short settings form, a grouped request, and a final review state need different structure.

Single-section form

One short task where every field belongs to the same idea.

Trigger: A settings edit, profile update, or small create flow with roughly three to seven fields.

Job: Keep the form compact, ordered, and easy to complete without extra section framing.

Grouped sections

A longer form split into sections that match the user's mental model.

Trigger: A create or edit flow where fields naturally cluster by business details, contact details, permissions, or settings.

Job: Make a longer form scannable without hiding fields behind unnecessary steps.

Review and submit

A form state that helps users check important entries before final submission.

Trigger: A consequential request, compliance workflow, or irreversible submission.

Job: Show the most important entered values, surface unresolved validation, and keep the final action explicit.

Examples

The rendered examples use existing form primitives. The pattern is the arrangement around them, not a new component.

Vendor details

Vendor details

Use one section when all fields answer the same question.

Use the name shown on tax documents.

Choose the closest category.

We use this for compliance reminders.

New vendor request

New vendor request

Group fields by the decision they support.

Business details

Primary contact

Vendor review

Review vendor request

Show the entries that matter before the final submit action.

Legal business name
Acme Services LLC
Service category
Facilities
Insurance certificate
Missing

Add this before submitting.

Primary action on an incomplete form

Wrong

Submit

The button is disabled until every required field is complete.

Right

Submit request

If required fields are missing, keep the user in the form and show exactly what needs attention.

Submit request

A disabled button hides the path forward. A clear submit action plus field-level recovery tells the user what happened and what to fix.

Long vendor request form

Wrong

Vendor information

All fields are stacked in one uninterrupted list.

Right

New vendor request

Fields are grouped into Business details and Primary contact so the user can scan the task in chunks.

Submit request

Grouping by decision makes a longer form easier to scan without turning it into an unnecessary wizard.

Voice and content

Labels, helper text, errors, and action labels carry the user through the form.

  • Use noun-first field labels

    Labels should name the information requested: "Primary contact email," not "Enter email."

  • Reserve helper text for decisions

    Helper text earns its space when it reduces uncertainty. Do not repeat the label or state the obvious.

  • Write errors as recovery instructions

    Tell the user what to fix and where. "Enter a valid email address" beats "Invalid input."

  • Name the submit outcome

    "Submit request" or "Save vendor" beats "Submit." The action label should match what happens next.

Accessibility

Form accessibility depends on wiring the group, label, description, error, and focus behavior together.

  • Every control has a visible label

    Labels remain visible when a field has a value. Placeholder-only forms fail this rule.

  • Group related controls semantically

    Use fieldset and legend for radio or checkbox groups when the group label is needed to understand the options.

  • Wire descriptions and errors

    Helper text and error text must be connected with aria-describedby. Invalid fields set aria-invalid.

  • Move focus predictably after failed submit

    If the user submits with errors, move focus to an error summary or the first invalid field and preserve entered values.

Implementation notes

Field primitives own control behavior. The pattern owns composition and review quality.

  • Compose from field primitives

    Use Text Input, Select, Checkbox, Radio, Toggle, and Button before building custom form controls.

    Primitives: Text Input, Select, Checkbox, Radio, Toggle, Button

  • Keep layout separate from field components

    Field primitives own labels, helper text, error text, and control states. The pattern owns ordering, grouping, section spacing, and action placement.

  • Validate without hiding requirements

    Avoid silently disabled submit buttons. Keep the primary action available when possible, then explain missing or invalid fields in context.

    Primitives: Button, Alert

Review checklist

Use this as the acceptance gate before approving a form layout.

  • Every input has a visible label.
  • Field order follows the user's task, not the database schema.
  • Sections exist only where they make the form easier to scan.
  • Helper text and error text are connected to their fields.
  • The primary action names the outcome and missing requirements are explained.