{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "tsf-fields-04",
  "title": "Slider",
  "description": "Numeric slider wired with form.Field, validated against a Zod range.",
  "dependencies": [
    "@tanstack/react-form",
    "zod",
    "sonner"
  ],
  "registryDependencies": [
    "field",
    "slider",
    "button"
  ],
  "files": [
    {
      "path": "registry/forms/tanstack-form/fields/tsf-fields-04.tsx",
      "content": "'use client'\n\nimport { useForm } from '@tanstack/react-form'\nimport { toast } from 'sonner'\nimport * as z from 'zod'\n\nimport { Button } from '@/components/ui/button'\nimport {\n  Field,\n  FieldContent,\n  FieldDescription,\n  FieldError,\n  FieldGroup,\n  FieldLabel,\n} from '@/components/ui/field'\nimport { Slider } from '@/components/ui/slider'\n\nconst formSchema = z.object({\n  budget: z\n    .number()\n    .min(10, 'Budget must be at least $10.')\n    .max(100, 'Budget cannot exceed $100.'),\n})\n\nexport function TsfFields04() {\n  const form = useForm({\n    defaultValues: { budget: 0 },\n    validators: { onSubmit: formSchema },\n    onSubmit: async ({ value }) => {\n      toast.success('Budget set', { description: `$${value.budget} / month` })\n    },\n  })\n\n  return (\n    <form\n      onSubmit={(e) => {\n        e.preventDefault()\n        form.handleSubmit()\n      }}\n      className=\"flex w-full max-w-sm flex-col gap-6\"\n    >\n      <FieldGroup>\n        <form.Field name=\"budget\">\n          {(field) => {\n            const isInvalid =\n              field.state.meta.isTouched && !field.state.meta.isValid\n            return (\n              <Field data-invalid={isInvalid}>\n                <FieldContent>\n                  <FieldLabel htmlFor={field.name}>Monthly budget</FieldLabel>\n                  <FieldDescription>\n                    ${field.state.value} / month\n                  </FieldDescription>\n                </FieldContent>\n                <Slider\n                  id={field.name}\n                  min={0}\n                  max={100}\n                  step={5}\n                  value={[field.state.value]}\n                  onValueChange={(v) => field.handleChange((v as number[])[0])}\n                  aria-invalid={isInvalid}\n                />\n                {isInvalid && <FieldError errors={field.state.meta.errors} />}\n              </Field>\n            )\n          }}\n        </form.Field>\n      </FieldGroup>\n      <Button type=\"submit\" size=\"sm\">\n        Save\n      </Button>\n    </form>\n  )\n}\n",
      "type": "registry:component",
      "target": "components/flx/forms/tanstack-form/tsf-fields-04.tsx"
    }
  ],
  "type": "registry:block"
}