Skip to content
LuoForge/Tungsten
← All recipes

Profile edit form

Pre-filled profile form using FormProvider defaultValues, mixing Input, Select, and Textarea controls — all wired through FormField with no per-control glue.

Preview

A short sentence shown on your public profile.

Source

apps/docs/app/recipes/profile-edit/recipe.tsx
'use client';

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

function ProfileFields() {
  const form = useForm();
  return (
    <form onSubmit={form.handleSubmit} className="flex w-full max-w-sm flex-col gap-4" noValidate>
      <FormField name="name" label="Display name" required validate={(v) => (v ? undefined : 'Required')}>
        <Input autoComplete="name" />
      </FormField>
      <FormField name="role" label="Role">
        <Select>
          <option value="engineer">Engineer</option>
          <option value="designer">Designer</option>
          <option value="manager">Manager</option>
        </Select>
      </FormField>
      <FormField name="bio" label="Bio" help="A short sentence shown on your public profile.">
        <Textarea placeholder="Tell us about yourself" />
      </FormField>
      <Button type="submit" variant="primary" size="md">
        Save changes
      </Button>
    </form>
  );
}

export default function ProfileEditRecipe() {
  return (
    <FormProvider
      defaultValues={{ name: 'Ada Lovelace', role: 'engineer', bio: 'Building reliable systems.' }}
    >
      <ProfileFields />
    </FormProvider>
  );
}
'use client';

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

function ProfileFields() {
  const form = useForm();
  return (
    <form onSubmit={form.handleSubmit} className="flex w-full max-w-sm flex-col gap-4" noValidate>
      <FormField name="name" label="Display name" required validate={(v) => (v ? undefined : 'Required')}>
        <Input autoComplete="name" />
      </FormField>
      <FormField name="role" label="Role">
        <Select>
          <option value="engineer">Engineer</option>
          <option value="designer">Designer</option>
          <option value="manager">Manager</option>
        </Select>
      </FormField>
      <FormField name="bio" label="Bio" help="A short sentence shown on your public profile.">
        <Textarea placeholder="Tell us about yourself" />
      </FormField>
      <Button type="submit" variant="primary" size="md">
        Save changes
      </Button>
    </form>
  );
}

export default function ProfileEditRecipe() {
  return (
    <FormProvider
      defaultValues={{ name: 'Ada Lovelace', role: 'engineer', bio: 'Building reliable systems.' }}
    >
      <ProfileFields />
    </FormProvider>
  );
}