Skip to content
LuoForge/Tungsten
← All recipes

Settings form

Account settings panel grouping several FormFields with help text under section headings. Shows FormField composing labelled controls in a denser, sectioned layout.

Preview

Account

Used for sign-in and notifications.

Notifications

How often we summarize activity.

Source

apps/docs/app/recipes/settings/recipe.tsx
'use client';

import { Button, FormField, FormProvider, Input, Select, useForm } from '@hey-mike/tungsten';

function SettingsFields() {
  const form = useForm();
  return (
    <form onSubmit={form.handleSubmit} className="flex w-full max-w-md flex-col gap-6" noValidate>
      <section className="flex flex-col gap-4">
        <h3 className="text-ink-2 text-2xs font-mono font-bold uppercase tracking-label">Account</h3>
        <FormField name="email" label="Email" help="Used for sign-in and notifications.">
          <Input type="email" autoComplete="email" />
        </FormField>
        <FormField name="timezone" label="Timezone">
          <Select>
            <option value="utc">UTC</option>
            <option value="pt">Pacific</option>
            <option value="et">Eastern</option>
          </Select>
        </FormField>
      </section>
      <section className="flex flex-col gap-4">
        <h3 className="text-ink-2 text-2xs font-mono font-bold uppercase tracking-label">
          Notifications
        </h3>
        <FormField name="digest" label="Email digest" help="How often we summarize activity.">
          <Select>
            <option value="daily">Daily</option>
            <option value="weekly">Weekly</option>
            <option value="off">Off</option>
          </Select>
        </FormField>
      </section>
      <Button type="submit" variant="primary" size="md">
        Save settings
      </Button>
    </form>
  );
}

export default function SettingsRecipe() {
  return (
    <FormProvider defaultValues={{ email: 'ada@example.com', timezone: 'utc', digest: 'weekly' }}>
      <SettingsFields />
    </FormProvider>
  );
}
'use client';

import { Button, FormField, FormProvider, Input, Select, useForm } from '@hey-mike/tungsten';

function SettingsFields() {
  const form = useForm();
  return (
    <form onSubmit={form.handleSubmit} className="flex w-full max-w-md flex-col gap-6" noValidate>
      <section className="flex flex-col gap-4">
        <h3 className="text-ink-2 text-2xs font-mono font-bold uppercase tracking-label">Account</h3>
        <FormField name="email" label="Email" help="Used for sign-in and notifications.">
          <Input type="email" autoComplete="email" />
        </FormField>
        <FormField name="timezone" label="Timezone">
          <Select>
            <option value="utc">UTC</option>
            <option value="pt">Pacific</option>
            <option value="et">Eastern</option>
          </Select>
        </FormField>
      </section>
      <section className="flex flex-col gap-4">
        <h3 className="text-ink-2 text-2xs font-mono font-bold uppercase tracking-label">
          Notifications
        </h3>
        <FormField name="digest" label="Email digest" help="How often we summarize activity.">
          <Select>
            <option value="daily">Daily</option>
            <option value="weekly">Weekly</option>
            <option value="off">Off</option>
          </Select>
        </FormField>
      </section>
      <Button type="submit" variant="primary" size="md">
        Save settings
      </Button>
    </form>
  );
}

export default function SettingsRecipe() {
  return (
    <FormProvider defaultValues={{ email: 'ada@example.com', timezone: 'utc', digest: 'weekly' }}>
      <SettingsFields />
    </FormProvider>
  );
}