"use client"; import * as React from "react"; import { cn } from "./lib/utils"; export interface BuilderField { id: string; kind: "text" | "number" | "date"; label: string; } export interface FormBuilderProps extends React.HTMLAttributes { onBuild?: (fields: BuilderField[]) => void; } /** Form builder: add, rename and remove fields with live count. */ export function FormBuilder({ onBuild, className, ...props }: FormBuilderProps) { const [fields, setFields] = React.useState([ { id: "f1", kind: "text", label: "Holder name" }, ]); const add = (kind: BuilderField["kind"]) => { const next = [...fields, { id: `f${Date.now()}`, kind, label: `Field ${fields.length + 1}` }]; setFields(next); onBuild?.(next); }; return (

Form builder

{fields.length} fields
    {fields.map((f) => (
  • {f.kind} setFields((prev) => prev.map((p) => (p.id === f.id ? { ...p, label: e.target.value } : p)))} aria-label="Field label" className="min-w-0 flex-1 bg-transparent text-xs font-bold focus-visible:outline-none" />
  • ))}
{(["text", "number", "date"] as const).map((k) => ( ))}
); }