@pipelex/mthds-form 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -7
- package/dist/chunk-25I6JDIK.js +28 -0
- package/dist/chunk-25I6JDIK.js.map +1 -0
- package/dist/chunk-5Q2W6HBA.js +201 -0
- package/dist/chunk-5Q2W6HBA.js.map +1 -0
- package/dist/chunk-GCXV76WU.js +213 -0
- package/dist/chunk-GCXV76WU.js.map +1 -0
- package/dist/chunk-GKV77RAS.js +46 -0
- package/dist/chunk-GKV77RAS.js.map +1 -0
- package/dist/chunk-IIJRJGZQ.js +128 -0
- package/dist/chunk-IIJRJGZQ.js.map +1 -0
- package/dist/chunk-IM2AHWBR.js +99 -0
- package/dist/chunk-IM2AHWBR.js.map +1 -0
- package/dist/chunk-LBFZXYCY.js +44 -0
- package/dist/chunk-LBFZXYCY.js.map +1 -0
- package/dist/chunk-OD3VYXUY.js +156 -0
- package/dist/chunk-OD3VYXUY.js.map +1 -0
- package/dist/chunk-PM55AHRO.js +52 -0
- package/dist/chunk-PM55AHRO.js.map +1 -0
- package/dist/chunk-RPA7DNSK.js +41 -0
- package/dist/chunk-RPA7DNSK.js.map +1 -0
- package/dist/chunk-V3OV2XQT.js +12 -0
- package/dist/chunk-V3OV2XQT.js.map +1 -0
- package/dist/chunk-VTPUDBSJ.js +61 -0
- package/dist/chunk-VTPUDBSJ.js.map +1 -0
- package/dist/chunk-XYQ7NXQZ.js +31 -0
- package/dist/chunk-XYQ7NXQZ.js.map +1 -0
- package/dist/chunk-YEVVR6FE.js +66 -0
- package/dist/chunk-YEVVR6FE.js.map +1 -0
- package/dist/core/contracts.d.ts +114 -0
- package/dist/core/contracts.js +4 -0
- package/dist/core/contracts.js.map +1 -0
- package/dist/core/date-format.d.ts +87 -0
- package/dist/core/date-format.js +3 -0
- package/dist/core/date-format.js.map +1 -0
- package/dist/core/derive.d.ts +55 -0
- package/dist/core/derive.js +6 -0
- package/dist/core/derive.js.map +1 -0
- package/dist/core/descriptor.d.ts +172 -0
- package/dist/core/descriptor.js +3 -0
- package/dist/core/descriptor.js.map +1 -0
- package/dist/core/gate-validator.d.ts +27 -0
- package/dist/core/gate-validator.js +4 -0
- package/dist/core/gate-validator.js.map +1 -0
- package/dist/core/gate.d.ts +144 -0
- package/dist/core/gate.js +12 -0
- package/dist/core/gate.js.map +1 -0
- package/dist/core/gating-fields.d.ts +38 -0
- package/dist/core/gating-fields.js +6 -0
- package/dist/core/gating-fields.js.map +1 -0
- package/dist/core/index.d.ts +13 -623
- package/dist/core/index.js +14 -1
- package/dist/core/normalize-schema.d.ts +30 -0
- package/dist/core/normalize-schema.js +4 -0
- package/dist/core/normalize-schema.js.map +1 -0
- package/dist/core/own-property.d.ts +46 -0
- package/dist/core/own-property.js +3 -0
- package/dist/core/own-property.js.map +1 -0
- package/dist/core/readiness.d.ts +91 -0
- package/dist/core/readiness.js +4 -0
- package/dist/core/readiness.js.map +1 -0
- package/dist/core/schema-utils.d.ts +86 -0
- package/dist/core/schema-utils.js +3 -0
- package/dist/core/schema-utils.js.map +1 -0
- package/dist/core/validation-message.d.ts +39 -0
- package/dist/core/validation-message.js +4 -0
- package/dist/core/validation-message.js.map +1 -0
- package/dist/core/values.d.ts +98 -0
- package/dist/core/values.js +10 -0
- package/dist/core/values.js.map +1 -0
- package/dist/core/wire-format.d.ts +95 -0
- package/dist/core/wire-format.js +6 -0
- package/dist/core/wire-format.js.map +1 -0
- package/dist/react/index.d.ts +43 -2
- package/dist/react/index.js +166 -64
- package/dist/react/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +7 -1
- package/dist/chunk-S6KOTTGD.js +0 -990
- package/dist/chunk-S6KOTTGD.js.map +0 -1
- package/dist/descriptor-DPrrfAjL.d.ts +0 -101
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/utils.ts","../../src/react/concept-pill.tsx","../../src/react/field-presentation.tsx","../../src/react/ui/switch.tsx","../../src/react/boolean-field.tsx","../../src/react/field-strings.tsx","../../src/react/field-shell.tsx","../../src/react/field-styles.ts","../../src/react/date-field.tsx","../../src/react/file-field.tsx","../../src/react/ui/select.tsx","../../src/react/ui/toggle.tsx","../../src/react/ui/toggle-group.tsx","../../src/react/enum-field.tsx","../../src/react/number-field.tsx","../../src/react/text-field.tsx","../../src/react/optional-toggle.tsx","../../src/react/object-field.tsx","../../src/react/list-field.tsx","../../src/react/unknown-field.tsx","../../src/react/field-renderer.tsx"],"names":["ImageIcon","Icon","jsx","React","jsxs","createContext","Label","FileText","React3","React4","Check","Minus","Plus","useState"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * Order-independent deep equality for JSON-shaped values (form data, inputs).\n * Objects compare by key set + value, arrays by index. Enough for comparing\n * two plain data snapshots; not a general structural-equality library (no\n * Map/Set/Date/cycle handling - none of which appear in the data it guards).\n */\nexport function isDeepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n return a.every((item, i) => isDeepEqual(item, b[i]));\n }\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((k) => Object.hasOwn(bObj, k) && isDeepEqual(aObj[k], bObj[k]));\n}\n","'use client';\n\nimport {\n Braces,\n CalendarDays,\n FileText,\n Hash,\n Image as ImageIcon,\n List,\n ListChecks,\n ToggleLeft,\n Type,\n} from 'lucide-react';\nimport { cn } from './utils';\nimport type { ConceptCategory } from '../core';\n\nconst CATEGORY_ICON: Record<ConceptCategory, typeof Type> = {\n text: Type,\n date: CalendarDays,\n document: FileText,\n image: ImageIcon,\n number: Hash,\n boolean: ToggleLeft,\n choice: ListChecks,\n structured: Braces,\n list: List,\n};\n\ninterface ConceptPillProps {\n /** The concept identifier, e.g. `native.Document`, `demo.Invoice`. */\n conceptRef?: string;\n category: ConceptCategory;\n className?: string;\n}\n\n/**\n * The small monospace type tag shown beside an input's name. Mono + a line icon\n * (never a colored chip) keeps the technical Pipelex voice without spending a\n * chromatic accent - the concept *type* is information, not a status.\n */\nexport function ConceptPill({ conceptRef, category, className }: ConceptPillProps) {\n const Icon = CATEGORY_ICON[category];\n const label = conceptRef ?? category;\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 font-mono text-[10.5px] leading-none text-muted-foreground',\n className,\n )}\n >\n <Icon className=\"h-3 w-3 shrink-0 opacity-70\" strokeWidth={1.75} aria-hidden />\n <span className=\"truncate\">{label}</span>\n </span>\n );\n}\n","'use client';\n\nimport { createContext, use, type ReactNode } from 'react';\n\n/**\n * How a field's LABEL chrome should read. The control itself never changes.\n *\n * - `studio` (default): the field's name verbatim in mono, with its concept\n * pill. The name IS the identifier a builder writes in the `.mthds` file, so\n * showing it exactly - and typed - is the point.\n * - `app`: the field's name as a human question in sans, no concept pill. Inside\n * a method app, `full_name` and `native.Text` are implementation detail; the\n * person filling the form has never seen the method's source.\n *\n * Deliberately a context rather than a prop or a `FieldEnv` flag: only the\n * components that own label chrome read it - `FieldShell`, `ObjectField`,\n * `BooleanField` and `ListField` - and threading a prop would have meant\n * editing every field control and both recursive containers.\n */\nexport type FieldPresentation = 'studio' | 'app';\n\nconst FieldPresentationContext = createContext<FieldPresentation>('studio');\n\nexport function FieldPresentationProvider({\n presentation,\n children,\n}: {\n presentation: FieldPresentation;\n children: ReactNode;\n}) {\n return <FieldPresentationContext value={presentation}>{children}</FieldPresentationContext>;\n}\n\nexport function useFieldPresentation(): FieldPresentation {\n return use(FieldPresentationContext);\n}\n\n/**\n * `full_name` → `Full name`. Only the first word is capitalised: these are\n * labels, not titles, and Title Case on every word reads as a form from 2009.\n * Takes IDENTIFIERS only - snake_case or kebab-case names, where a separator\n * is structure. An authored `title` never goes through here: it is already\n * human-facing, and its hyphens are spelling (`E-mail address`), not structure.\n */\nexport function humanizeFieldName(name: string): string {\n const words = name.replace(/[_-]+/g, ' ').trim();\n if (words === '') return name;\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * The one label expression every chrome-owning component uses: an authored\n * `title` is authoritative and shown verbatim in both presentations; only the\n * identifier fallback is humanised in app mode. An empty title stays empty -\n * that is how a list row suppresses its per-row label.\n */\nexport function fieldLabel(\n title: string | undefined,\n name: string,\n presentation: FieldPresentation,\n): string {\n if (title !== undefined) return title;\n return presentation === 'app' ? humanizeFieldName(name) : name;\n}\n","import * as React from 'react';\nimport * as SwitchPrimitives from '@radix-ui/react-switch';\n\nimport { cn } from '../utils';\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n 'peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input',\n className,\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n 'pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0',\n )}\n />\n </SwitchPrimitives.Root>\n));\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\n","'use client';\n\nimport { cn } from './utils';\nimport type { BooleanRunField } from '../core';\nimport { ConceptPill } from './concept-pill';\nimport { fieldLabel, useFieldPresentation } from './field-presentation';\nimport { Switch } from './ui/switch';\n\ninterface BooleanFieldProps {\n field: BooleanRunField;\n value: boolean | undefined;\n onChange: (value: boolean) => void;\n id: string;\n disabled?: boolean;\n}\n\n/**\n * A toggle. Unlike the other fields the label sits inline with the control on a\n * single hairline row - a boolean reads better as a switchable statement than as\n * a labelled box.\n */\nexport function BooleanField({ field, value, onChange, id, disabled }: BooleanFieldProps) {\n // Same label chrome switch as `FieldShell` - this control owns its own label\n // because it sits inline with the switch. See `field-presentation.tsx`.\n const presentation = useFieldPresentation();\n const isApp = presentation === 'app';\n return (\n <div\n className={cn(\n 'flex items-center justify-between gap-4 rounded-md border border-border bg-input px-3.5 py-3',\n disabled && 'opacity-50',\n )}\n >\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-baseline gap-x-2 gap-y-1\">\n <label\n htmlFor={id}\n className={cn(\n 'text-[13px] font-medium leading-none text-foreground',\n isApp ? 'text-[13.5px]' : 'font-mono',\n )}\n >\n {fieldLabel(field.title, field.name, presentation)}\n </label>\n {!isApp && <ConceptPill conceptRef={field.conceptRef} category=\"boolean\" />}\n </div>\n {field.description && (\n <p className=\"text-[12px] leading-relaxed text-muted-foreground\">{field.description}</p>\n )}\n </div>\n <Switch\n id={id}\n checked={value ?? false}\n onCheckedChange={onChange}\n disabled={disabled}\n className=\"shrink-0\"\n />\n </div>\n );\n}\n","'use client';\n\n/**\n * The controls' i18n seam. The field controls are kernel code - they cannot\n * import `next-intl` - so every user-visible string they render comes through\n * this typed contract, with English defaults baked in. A host app injects its\n * own values (a next-intl host bridges them in its own `field-strings-intl.tsx`)\n * by mounting `FieldStringsProvider` above the form; stories and tests run on\n * the defaults.\n *\n * Count-bearing messages are FUNCTIONS, not templates: the default English\n * pluralization lives here, and an injecting host applies its own locale's\n * rules (ICU plurals under next-intl, for instance).\n */\nimport { createContext, useContext, useMemo, type ReactNode } from 'react';\n\nexport interface FieldStrings {\n /** Badge on an optional field's header row. */\n optionalBadge: string;\n selectPlaceholder: string;\n typeValuePlaceholder: string;\n writeHerePlaceholder: string;\n /** Helper under the raw-JSON escape hatch. */\n jsonHint: string;\n decrease: string;\n increase: string;\n noItemsYet: string;\n addItem: string;\n removeItemAria: (index: number) => string;\n itemsCount: (count: number) => string;\n uploading: string;\n dropToUpload: string;\n dropOrBrowse: string;\n pasteUrlInstead: string;\n urlPlaceholder: string;\n uploadedFile: string;\n preview: string;\n removeFileAria: string;\n previewUnavailablePdf: string;\n /** The optional-entries disclosure (\"field\" inside a concept, \"input\" at top level). */\n hideOptionalFields: string;\n hideOptionalInputs: string;\n optionalFieldsCount: (count: number) => string;\n optionalInputsCount: (count: number) => string;\n}\n\nexport const DEFAULT_FIELD_STRINGS: FieldStrings = {\n optionalBadge: 'optional',\n selectPlaceholder: 'Select…',\n typeValuePlaceholder: 'Type a value…',\n writeHerePlaceholder: 'Write here…',\n jsonHint: 'Enter this value as raw JSON.',\n decrease: 'Decrease',\n increase: 'Increase',\n noItemsYet: 'No items yet',\n addItem: 'Add item',\n removeItemAria: (index) => `Remove item ${index}`,\n itemsCount: (count) => (count === 1 ? '1 item' : `${count} items`),\n uploading: 'Uploading…',\n dropToUpload: 'Drop to upload',\n dropOrBrowse: 'Drop a file or click to browse',\n pasteUrlInstead: 'paste a URL instead',\n urlPlaceholder: 'https://… or pipelex-storage://…',\n uploadedFile: 'Uploaded file',\n preview: 'Preview',\n removeFileAria: 'Remove file',\n previewUnavailablePdf: 'Preview unavailable - open to view.',\n hideOptionalFields: 'Hide optional fields',\n hideOptionalInputs: 'Hide optional inputs',\n optionalFieldsCount: (count) => (count === 1 ? '1 optional field' : `${count} optional fields`),\n optionalInputsCount: (count) => (count === 1 ? '1 optional input' : `${count} optional inputs`),\n};\n\nconst FieldStringsContext = createContext<FieldStrings>(DEFAULT_FIELD_STRINGS);\n\n/** Inject host-app strings over the English defaults for every control below. */\nexport function FieldStringsProvider({\n strings,\n children,\n}: {\n strings: Partial<FieldStrings>;\n children: ReactNode;\n}) {\n const merged = useMemo(() => ({ ...DEFAULT_FIELD_STRINGS, ...strings }), [strings]);\n return <FieldStringsContext.Provider value={merged}>{children}</FieldStringsContext.Provider>;\n}\n\n/** The strings the nearest provider supplies (English defaults when none does). */\nexport function useFieldStrings(): FieldStrings {\n return useContext(FieldStringsContext);\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { cn } from './utils';\nimport type { ConceptCategory } from '../core';\nimport { ConceptPill } from './concept-pill';\nimport { useFieldStrings } from './field-strings';\nimport { fieldLabel, useFieldPresentation } from './field-presentation';\n\ninterface FieldShellProps {\n name: string;\n title?: string;\n conceptRef?: string;\n category: ConceptCategory;\n description?: string;\n required: boolean;\n /** Validation message; renders in danger text under the control. */\n error?: string;\n /** Links the rendered name to the control for screen readers. */\n htmlFor?: string;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * The label / type / description / error chrome around a single input control.\n * Every field type composes this so the form reads as one consistent column -\n * the control itself is the only thing that varies.\n */\nexport function FieldShell({\n name,\n title,\n conceptRef,\n category,\n description,\n required,\n error,\n htmlFor,\n children,\n className,\n}: FieldShellProps) {\n const s = useFieldStrings();\n // Inside a method app the label is a question, not an identifier: sans,\n // humanised, and with no concept pill. Everywhere else it stays the exact\n // mono name a builder wrote. See `field-presentation.tsx`.\n const presentation = useFieldPresentation();\n const isApp = presentation === 'app';\n const Label = htmlFor ? 'label' : 'div';\n // A list item passes title=\"\" - the row index already labels it, so we drop\n // the name and keep only the type pill to avoid a redundant header per row.\n const labelText = fieldLabel(title, name, presentation);\n const showLabel = labelText.trim() !== '';\n return (\n <div className={cn('space-y-2', className)}>\n <div className=\"flex flex-wrap items-baseline gap-x-2 gap-y-1\">\n {showLabel && (\n <Label\n {...(htmlFor ? { htmlFor } : {})}\n className={cn(\n 'text-[13px] font-medium leading-none text-foreground',\n isApp ? 'text-[13.5px]' : 'font-mono',\n )}\n >\n {labelText}\n </Label>\n )}\n {!isApp && <ConceptPill conceptRef={conceptRef} category={category} />}\n {!required && (\n <span className=\"ml-auto font-mono text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n {s.optionalBadge}\n </span>\n )}\n </div>\n {description && (\n <p className=\"text-[12px] leading-relaxed text-muted-foreground\">{description}</p>\n )}\n {/* A field in error is OUTLINED, not just annotated - inside an app the\n red caption alone is easy to miss on a tall form, and it is the only\n signal on controls whose `aria-invalid` sits on an element the user\n cannot see (the file dropzone's hidden input, most of all). Scoped to\n the app presentation so the studio's look is unchanged. */}\n {isApp && error ? (\n <div className=\"rounded-lg ring-1 ring-destructive/70 ring-offset-4 ring-offset-background\">\n {children}\n </div>\n ) : (\n children\n )}\n {error && (\n <p className=\"flex items-center gap-1 text-[11px] text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n}\n","/**\n * Shared control styling for the run form. One comfortable, theme-aware input\n * surface (the dedicated `--input` token, hairline border, accent focus ring)\n * so every field type reads as the same family - generous enough for touch\n * (≥44px tall) and never the cramped `text-xs` of the old playground panel.\n */\nimport { cn } from './utils';\n\nexport const fieldControlClass = cn(\n 'w-full rounded-md border border-border bg-input text-sm text-foreground',\n 'placeholder:text-muted-foreground/70 transition-colors',\n 'focus-visible:outline-none focus-visible:border-primary focus-visible:ring-1 focus-visible:ring-primary/40',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'aria-[invalid=true]:border-destructive aria-[invalid=true]:ring-destructive/30',\n);\n","'use client';\n\nimport { cn } from './utils';\nimport type { DateRunField } from '../core';\nimport { toDateInputValue, toStoredDateValue } from '../core';\nimport { FieldShell } from './field-shell';\nimport { fieldControlClass } from './field-styles';\n\ninterface DateFieldProps {\n field: DateRunField;\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n id: string;\n error?: string;\n disabled?: boolean;\n}\n\n/**\n * A calendar-date input. The control only asks for a day (no hand-typed\n * hours/seconds); for a `date-time` concept it stores midnight-UTC so the value\n * still satisfies the API's `date-time` format.\n */\nexport function DateField({ field, value, onChange, id, error, disabled }: DateFieldProps) {\n return (\n <FieldShell\n name={field.name}\n title={field.title}\n conceptRef={field.conceptRef}\n category=\"date\"\n description={field.description}\n required={field.required}\n error={error}\n htmlFor={id}\n >\n <input\n id={id}\n type=\"date\"\n value={toDateInputValue(value)}\n disabled={disabled}\n aria-invalid={!!error}\n onChange={(e) => onChange(toStoredDateValue(e.target.value, field.datetime))}\n className={cn(fieldControlClass, 'h-11 px-3 font-mono tabular-nums')}\n />\n </FieldShell>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDropzone } from 'react-dropzone';\nimport { Eye, EyeOff, FileText, ImageOff, Link2, Loader2, Upload, X } from 'lucide-react';\nimport { cn } from './utils';\nimport type { FileRunField } from '../core';\nimport { FieldShell } from './field-shell';\nimport { useFieldStrings } from './field-strings';\nimport { fieldControlClass } from './field-styles';\n\n/** The serializable value of a file field. URL is what the runner sends. */\nexport interface FileValue {\n url?: string;\n filename?: string;\n}\n\ninterface FileFieldProps {\n field: FileRunField;\n value: FileValue | undefined;\n /** Called when a file is dropped/picked - the parent uploads and sets value. */\n onDropFile: (file: File) => void;\n /** Manual URL paste / clear flows through here too. */\n onChange: (value: FileValue | undefined) => void;\n id: string;\n /** Parent-driven async state. */\n uploading?: boolean;\n /** Resolve a `pipelex-storage://` URI to a viewable URL (stored-file preview). */\n resolveUrl?: (uri: string) => Promise<string | null>;\n error?: string;\n disabled?: boolean;\n}\n\nconst IMAGE_EXT_RE = /\\.(jpg|jpeg|png|gif|webp|bmp|svg|avif)(\\?|$)/i;\nconst PDF_EXT_RE = /\\.pdf(\\?|$)/i;\n\n/** Document variant: a file shown as a PDF preview (or chip for other docs). */\nexport function DocumentField(props: FileFieldProps) {\n return <FileField {...props} category=\"document\" />;\n}\n\n/** Image variant: a file shown as a real image preview. */\nexport function ImageField(props: FileFieldProps) {\n return <FileField {...props} category=\"image\" />;\n}\n\nfunction FileField({\n field,\n value,\n onDropFile,\n onChange,\n id,\n uploading,\n resolveUrl,\n error,\n disabled,\n category,\n}: FileFieldProps & { category: 'document' | 'image' }) {\n const s = useFieldStrings();\n const [showUrl, setShowUrl] = useState(false);\n // The preview is collapsed by default - opened on demand via a \"Preview\" button.\n const [previewOpen, setPreviewOpen] = useState(false);\n // A browser-viewable URL for the just-dropped file (the stored value is a\n // `pipelex-storage://` URI that the browser can't render), so the user sees a\n // real preview the moment they add a file. Revoked when replaced/unmounted.\n const [localPreview, setLocalPreview] = useState<{ url: string; type: string } | null>(null);\n const localUrlRef = useRef<string | null>(null);\n\n const setLocal = useCallback((next: { url: string; type: string } | null) => {\n if (localUrlRef.current) URL.revokeObjectURL(localUrlRef.current);\n localUrlRef.current = next?.url ?? null;\n setLocalPreview(next);\n }, []);\n useEffect(() => () => setLocal(null), [setLocal]);\n\n const handleFile = useCallback(\n (file: File) => {\n setLocal({ url: URL.createObjectURL(file), type: file.type });\n onDropFile(file);\n },\n [setLocal, onDropFile],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n maxFiles: 1,\n multiple: false,\n disabled: disabled || uploading,\n onDrop: (files) => {\n const file = files[0];\n if (file) handleFile(file);\n },\n });\n\n const clear = useCallback(() => {\n setLocal(null);\n setResolvedSrc(null);\n setPreviewOpen(false);\n onChange(undefined);\n }, [setLocal, onChange]);\n\n const hasFile = !!value?.url;\n const ref = `${value?.filename ?? ''} ${value?.url ?? ''}`;\n\n const isImage =\n category === 'image' || localPreview?.type.startsWith('image/') || IMAGE_EXT_RE.test(ref);\n const isPdf = localPreview?.type === 'application/pdf' || PDF_EXT_RE.test(ref);\n const canPreview = isImage || isPdf;\n\n // Resolve a stored `pipelex-storage://` URI to a presigned URL - lazily, only\n // when the user opens the preview, so a closed field never fetches one.\n const [resolvedSrc, setResolvedSrc] = useState<string | null>(null);\n const storageUri = value?.url && !value.url.startsWith('http') ? value.url : null;\n useEffect(() => {\n if (!previewOpen || !storageUri || localPreview || !resolveUrl) return;\n let cancelled = false;\n void resolveUrl(storageUri).then((url) => {\n if (!cancelled) setResolvedSrc(url);\n });\n return () => {\n cancelled = true;\n };\n }, [previewOpen, storageUri, localPreview, resolveUrl]);\n\n // A browser-viewable source: the local object URL, an http(s) URL, or a\n // resolved presigned URL for a stored file.\n const previewSrc =\n localPreview?.url ?? (value?.url?.startsWith('http') ? value.url : (resolvedSrc ?? undefined));\n\n return (\n <FieldShell\n name={field.name}\n title={field.title}\n conceptRef={field.conceptRef}\n category={category}\n description={field.description}\n required={field.required}\n error={error}\n >\n {hasFile && !uploading ? (\n <div className=\"space-y-2\">\n <FileChip\n value={value}\n disabled={disabled}\n onClear={clear}\n canPreview={canPreview}\n previewOpen={previewOpen}\n onTogglePreview={() => setPreviewOpen((v) => !v)}\n />\n {previewOpen &&\n (previewSrc && isImage ? (\n <ImagePreview src={previewSrc} filename={value?.filename} />\n ) : previewSrc && isPdf ? (\n <PdfPreview src={previewSrc} />\n ) : (\n <div className=\"flex h-24 items-center justify-center rounded-md border border-border bg-muted\">\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n </div>\n ))}\n </div>\n ) : (\n <div\n {...getRootProps()}\n className={cn(\n 'flex flex-col items-center justify-center gap-2 rounded-lg border border-dashed px-4 py-6 text-center',\n 'cursor-pointer select-none transition-colors',\n isDragActive\n ? 'border-primary/60 bg-primary/5'\n : 'border-border bg-input hover:border-border hover:bg-muted',\n (disabled || uploading) && 'cursor-not-allowed opacity-60',\n )}\n >\n <input {...getInputProps()} id={id} aria-invalid={!!error} />\n {uploading ? (\n <>\n <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\n <p className=\"text-[12px] text-muted-foreground\">{s.uploading}</p>\n </>\n ) : (\n <>\n <Upload className=\"h-5 w-5 text-muted-foreground\" strokeWidth={1.75} />\n <div className=\"space-y-0.5\">\n <p className=\"text-[13px] text-foreground\">\n {isDragActive ? s.dropToUpload : s.dropOrBrowse}\n </p>\n {field.accept && (\n <p className=\"font-mono text-[10.5px] text-muted-foreground\">{field.accept}</p>\n )}\n </div>\n </>\n )}\n </div>\n )}\n\n {/* URL escape hatch - collapsed by default to keep the happy path clean. */}\n {!showUrl ? (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => setShowUrl(true)}\n className=\"inline-flex items-center gap-1 font-mono text-[11px] text-muted-foreground transition-colors hover:text-foreground disabled:opacity-50\"\n >\n <Link2 className=\"h-3 w-3\" />\n {s.pasteUrlInstead}\n </button>\n ) : (\n <input\n type=\"text\"\n autoFocus\n value={value?.url ?? ''}\n disabled={disabled}\n placeholder={s.urlPlaceholder}\n onChange={(e) => {\n setLocal(null);\n onChange(e.target.value ? { url: e.target.value } : undefined);\n }}\n className={cn(fieldControlClass, 'h-9 px-3 font-mono text-[12px]')}\n />\n )}\n </FieldShell>\n );\n}\n\nfunction ImagePreview({ src, filename }: { src: string; filename?: string }) {\n const s = useFieldStrings();\n const [broken, setBroken] = useState(false);\n if (broken) {\n return (\n <div className=\"flex h-28 items-center justify-center rounded-md border border-border bg-muted\">\n <ImageOff className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n );\n }\n return (\n <div className=\"flex max-h-[640px] justify-center overflow-auto rounded-md border border-border bg-muted\">\n <img\n src={src}\n alt={filename ?? s.preview}\n className=\"h-auto w-full max-w-full object-contain\"\n onError={() => setBroken(true)}\n />\n </div>\n );\n}\n\nfunction PdfPreview({ src }: { src: string }) {\n const s = useFieldStrings();\n // A tall viewport so the whole document is readable; the browser's native PDF\n // viewer scrolls/paginates within it. `#view=FitH` fits the page width.\n return (\n <object\n data={`${src}#view=FitH`}\n type=\"application/pdf\"\n className=\"h-[78vh] min-h-[520px] w-full rounded-md border border-border bg-muted\"\n >\n <div className=\"flex h-28 flex-col items-center justify-center gap-1.5 text-center\">\n <FileText className=\"h-5 w-5 text-muted-foreground\" />\n <p className=\"text-[12px] text-muted-foreground\">{s.previewUnavailablePdf}</p>\n </div>\n </object>\n );\n}\n\nfunction FileChip({\n value,\n disabled,\n onClear,\n canPreview,\n previewOpen,\n onTogglePreview,\n}: {\n value: FileValue | undefined;\n disabled?: boolean;\n onClear: () => void;\n canPreview?: boolean;\n previewOpen?: boolean;\n onTogglePreview?: () => void;\n}) {\n const s = useFieldStrings();\n return (\n <div className=\"flex items-center gap-3 rounded-md border border-border bg-input px-3 py-2.5\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-muted\">\n <FileText className=\"h-4 w-4 text-muted-foreground\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-[13px] font-medium text-foreground\">\n {value?.filename ?? s.uploadedFile}\n </p>\n <p className=\"truncate font-mono text-[10.5px] text-muted-foreground\">{value?.url}</p>\n </div>\n {canPreview && (\n <button\n type=\"button\"\n onClick={onTogglePreview}\n className=\"inline-flex h-7 shrink-0 items-center gap-1 rounded-md border border-border px-2 text-[11px] text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n {previewOpen ? <EyeOff className=\"h-3.5 w-3.5\" /> : <Eye className=\"h-3.5 w-3.5\" />}\n {s.preview}\n </button>\n )}\n <ClearButton disabled={disabled} onClick={onClear} />\n </div>\n );\n}\n\nfunction ClearButton({ disabled, onClick }: { disabled?: boolean; onClick: () => void }) {\n const s = useFieldStrings();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={s.removeFileAria}\n className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react';\n\nimport { cn } from '../utils';\n\nconst Select = SelectPrimitive.Root;\n\nconst SelectGroup = SelectPrimitive.Group;\n\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n // Adapted from the registry to DESIGN.md (\"Inputs\"): the `--input` surface,\n // a hairline `--border`, and a border-color focus signal instead of the\n // upstream 2px focus ring (\"No focus glow by default\").\n 'flex h-10 w-full items-center justify-between rounded-md border border-border bg-input px-3 py-2 text-sm transition-colors data-[placeholder]:text-muted-foreground focus:border-ring focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 aria-[invalid=true]:border-destructive [&>span]:line-clamp-1',\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n};\n","'use client';\n\nimport * as React from 'react';\nimport * as TogglePrimitive from '@radix-ui/react-toggle';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../utils';\n\nconst toggleVariants = cva(\n 'inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 gap-2',\n {\n variants: {\n variant: {\n default: 'bg-transparent',\n outline: 'border border-input bg-transparent hover:bg-accent hover:text-accent-foreground',\n },\n size: {\n default: 'h-10 px-3 min-w-10',\n sm: 'h-9 px-2.5 min-w-9',\n lg: 'h-11 px-5 min-w-11',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root\n ref={ref}\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n));\n\nToggle.displayName = TogglePrimitive.Root.displayName;\n\nexport { Toggle, toggleVariants };\n","import * as React from 'react';\nimport * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';\nimport { type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../utils';\nimport { toggleVariants } from './toggle';\n\nconst ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants>>({\n size: 'default',\n variant: 'default',\n});\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, children, ...props }, ref) => (\n <ToggleGroupPrimitive.Root\n ref={ref}\n className={cn('flex items-center justify-center gap-1', className)}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size }}>{children}</ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n));\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleVariants>\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext);\n\n return (\n <ToggleGroupPrimitive.Item\n ref={ref}\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className,\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n );\n});\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;\n\nexport { ToggleGroup, ToggleGroupItem };\n","'use client';\n\nimport { Check } from 'lucide-react';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select';\nimport { ToggleGroup, ToggleGroupItem } from './ui/toggle-group';\nimport type { EnumRunField } from '../core';\nimport { FieldShell } from './field-shell';\nimport { useFieldStrings } from './field-strings';\n\ninterface EnumFieldProps {\n field: EnumRunField;\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n id: string;\n error?: string;\n disabled?: boolean;\n}\n\n/**\n * Radix `Select` cannot carry an item whose value is `\"\"` - it reserves the empty\n * string for \"no selection\". The field is optional and was clearable through a\n * blank `<option>`, so the clear entry rides a sentinel instead and maps back to\n * `undefined` on the way out.\n */\nconst CLEAR_VALUE = '__none__';\n\n/**\n * Pick-one. A short option set (≤4, each label brief) renders as a segmented\n * control - every choice visible at a glance - and falls back to a select once\n * the set grows past what fits on a row.\n */\nexport function EnumField({ field, value, onChange, id, error, disabled }: EnumFieldProps) {\n const s = useFieldStrings();\n const isSegmented = field.options.length <= 4 && field.options.every((o) => o.length <= 16);\n\n return (\n <FieldShell\n name={field.name}\n title={field.title}\n conceptRef={field.conceptRef}\n category=\"choice\"\n description={field.description}\n required={field.required}\n error={error}\n htmlFor={isSegmented ? undefined : id}\n >\n {isSegmented ? (\n // `type=\"single\"` gives the roving tabindex and arrow-key navigation a\n // radiogroup owes its user, and emits `''` when the active item is\n // pressed again - which is the field's \"clear\" path.\n <ToggleGroup\n type=\"single\"\n value={value ?? ''}\n onValueChange={(next) => onChange(next === '' ? undefined : next)}\n disabled={disabled}\n aria-label={field.title ?? field.name}\n className=\"flex flex-wrap justify-start gap-1.5\"\n >\n {field.options.map((option) => (\n <ToggleGroupItem\n key={option}\n value={option}\n variant=\"outline\"\n className=\"h-9 min-w-0 gap-1.5 border-border bg-input px-3 text-[13px] text-muted-foreground hover:bg-muted hover:text-foreground data-[state=on]:border-primary/40 data-[state=on]:bg-primary/10 data-[state=on]:font-medium data-[state=on]:text-foreground\"\n >\n {value === option && (\n <Check className=\"size-3.5 text-primary\" strokeWidth={2.5} aria-hidden=\"true\" />\n )}\n {option}\n </ToggleGroupItem>\n ))}\n </ToggleGroup>\n ) : (\n <Select\n value={value ?? ''}\n disabled={disabled}\n onValueChange={(next) => onChange(next === CLEAR_VALUE ? undefined : next)}\n >\n <SelectTrigger id={id} aria-invalid={!!error} className=\"h-11\">\n <SelectValue placeholder={s.selectPlaceholder} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={CLEAR_VALUE}>{s.selectPlaceholder}</SelectItem>\n {field.options.map((option) => (\n <SelectItem key={option} value={option}>\n {option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </FieldShell>\n );\n}\n","'use client';\n\nimport { Minus, Plus } from 'lucide-react';\nimport { cn } from './utils';\nimport type { NumberRunField } from '../core';\nimport { FieldShell } from './field-shell';\nimport { useFieldStrings } from './field-strings';\nimport { fieldControlClass } from './field-styles';\n\ninterface NumberFieldProps {\n field: NumberRunField;\n value: number | undefined;\n onChange: (value: number | undefined) => void;\n id: string;\n error?: string;\n disabled?: boolean;\n}\n\n/** Numeric input with steppers and min/max clamping. */\nexport function NumberField({ field, value, onChange, id, error, disabled }: NumberFieldProps) {\n const s = useFieldStrings();\n const step = field.integer ? 1 : 0.1;\n\n const clamp = (n: number) => {\n let next = n;\n if (typeof field.min === 'number') next = Math.max(field.min, next);\n if (typeof field.max === 'number') next = Math.min(field.max, next);\n return field.integer ? Math.round(next) : next;\n };\n\n const nudge = (delta: number) => onChange(clamp((value ?? 0) + delta));\n\n const rangeHint =\n field.min !== undefined || field.max !== undefined\n ? `${field.min ?? '−∞'} – ${field.max ?? '∞'}`\n : undefined;\n\n return (\n <FieldShell\n name={field.name}\n title={field.title}\n conceptRef={field.conceptRef}\n category=\"number\"\n description={field.description ?? rangeHint}\n required={field.required}\n error={error}\n htmlFor={id}\n >\n <div className=\"flex items-stretch gap-1.5\">\n <input\n id={id}\n type=\"number\"\n inputMode={field.integer ? 'numeric' : 'decimal'}\n value={value ?? ''}\n step={step}\n min={field.min}\n max={field.max}\n disabled={disabled}\n aria-invalid={!!error}\n placeholder=\"0\"\n onChange={(e) => onChange(e.target.value === '' ? undefined : Number(e.target.value))}\n className={cn(\n fieldControlClass,\n 'h-11 px-3 font-mono tabular-nums [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none',\n )}\n />\n <StepButton onClick={() => nudge(-step)} disabled={disabled} label={s.decrease}>\n <Minus className=\"h-4 w-4\" />\n </StepButton>\n <StepButton onClick={() => nudge(step)} disabled={disabled} label={s.increase}>\n <Plus className=\"h-4 w-4\" />\n </StepButton>\n </div>\n </FieldShell>\n );\n}\n\nfunction StepButton({\n onClick,\n disabled,\n label,\n children,\n}: {\n onClick: () => void;\n disabled?: boolean;\n label: string;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={label}\n className={cn(\n 'flex h-11 w-11 shrink-0 items-center justify-center rounded-md border border-border bg-input text-muted-foreground transition-colors',\n 'hover:border-border hover:bg-muted hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50',\n )}\n >\n {children}\n </button>\n );\n}\n","'use client';\n\nimport { cn } from './utils';\nimport type { ProseRunField, TextRunField } from '../core';\nimport { FieldShell } from './field-shell';\nimport { useFieldStrings } from './field-strings';\nimport { fieldControlClass } from './field-styles';\n\ninterface TextFieldProps {\n field: TextRunField;\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n id: string;\n error?: string;\n disabled?: boolean;\n}\n\n/** Single-line string input (short native.Text or a plain string property). */\nexport function TextField({ field, value, onChange, id, error, disabled }: TextFieldProps) {\n const s = useFieldStrings();\n return (\n <FieldShell\n name={field.name}\n title={field.title}\n conceptRef={field.conceptRef}\n category=\"text\"\n description={field.description}\n required={field.required}\n error={error}\n htmlFor={id}\n >\n <input\n id={id}\n type=\"text\"\n value={value ?? ''}\n disabled={disabled}\n aria-invalid={!!error}\n placeholder={field.placeholder ?? s.typeValuePlaceholder}\n onChange={(e) => onChange(e.target.value === '' ? undefined : e.target.value)}\n className={cn(fieldControlClass, 'h-11 px-3')}\n />\n </FieldShell>\n );\n}\n\ninterface ProseFieldProps {\n field: ProseRunField;\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n id: string;\n error?: string;\n disabled?: boolean;\n}\n\n/**\n * Multi-line free text. Auto-grows with content (`field-sizing-content`) so long\n * prompts don't trap the user in a tiny scrollbox - the field that carries most\n * of a method's intent should feel roomy.\n */\nexport function ProseField({ field, value, onChange, id, error, disabled }: ProseFieldProps) {\n const s = useFieldStrings();\n return (\n <FieldShell\n name={field.name}\n title={field.title}\n conceptRef={field.conceptRef}\n category=\"text\"\n description={field.description}\n required={field.required}\n error={error}\n htmlFor={id}\n >\n <textarea\n id={id}\n value={value ?? ''}\n disabled={disabled}\n aria-invalid={!!error}\n rows={3}\n placeholder={field.placeholder ?? s.writeHerePlaceholder}\n onChange={(e) => onChange(e.target.value === '' ? undefined : e.target.value)}\n className={cn(\n fieldControlClass,\n 'min-h-[88px] resize-y px-3 py-2.5 leading-relaxed [field-sizing:content]',\n )}\n />\n </FieldShell>\n );\n}\n","'use client';\n\nimport { Minus, Plus } from 'lucide-react';\nimport { useFieldStrings } from './field-strings';\n\ninterface OptionalToggleProps {\n /** How many empty optional entries are currently hidden. */\n count: number;\n expanded: boolean;\n onToggle: () => void;\n /** \"field\" inside a concept, \"input\" at the top level. */\n noun?: 'field' | 'input';\n}\n\n/**\n * The disclosure for empty optional entries. Optional inputs stay hidden until\n * the user asks for them - required (and already-filled) entries always show, so\n * the form opens at its simplest and grows only on demand. Used at the top level\n * and inside every structured concept, at any nesting depth.\n */\nexport function OptionalToggle({ count, expanded, onToggle, noun = 'field' }: OptionalToggleProps) {\n const s = useFieldStrings();\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"inline-flex items-center gap-1.5 text-[11px] text-muted-foreground transition-colors hover:text-foreground\"\n >\n {expanded ? <Minus className=\"h-3 w-3\" /> : <Plus className=\"h-3 w-3\" />}\n {expanded\n ? noun === 'field'\n ? s.hideOptionalFields\n : s.hideOptionalInputs\n : noun === 'field'\n ? s.optionalFieldsCount(count)\n : s.optionalInputsCount(count)}\n </button>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { cn } from './utils';\nimport { isFilled, type ObjectRunField } from '../core';\nimport { ConceptPill } from './concept-pill';\nimport { FieldRenderer, type FieldEnv } from './field-renderer';\nimport { fieldLabel, useFieldPresentation } from './field-presentation';\nimport { useFieldStrings } from './field-strings';\nimport { OptionalToggle } from './optional-toggle';\n\ninterface ObjectFieldProps {\n field: ObjectRunField;\n value: Record<string, unknown> | undefined;\n onChange: (value: Record<string, unknown>) => void;\n id: string;\n error?: string;\n env?: FieldEnv;\n}\n\n/**\n * A structured concept: its sub-fields rendered inside one hairline-grouped\n * card so nesting stays legible. Empty optional sub-fields collapse behind a\n * \"+ N optional\" toggle - required and already-filled fields always show.\n */\nexport function ObjectField({ field, value, onChange, id, error, env }: ObjectFieldProps) {\n const s = useFieldStrings();\n const [showOptional, setShowOptional] = useState(false);\n // A grouped concept reads as a section heading in an app, not as a typed field.\n const presentation = useFieldPresentation();\n const isApp = presentation === 'app';\n const data = value ?? {};\n\n const setChild = (name: string, childValue: unknown) => onChange({ ...data, [name]: childValue });\n\n const optionalEmpty = field.fields.filter((f) => !f.required && !isFilled(data[f.name]));\n const visible = showOptional\n ? field.fields\n : field.fields.filter((f) => f.required || isFilled(data[f.name]));\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap items-baseline gap-x-2 gap-y-1\">\n <span\n className={cn(\n 'text-[13px] font-medium leading-none text-foreground',\n isApp ? 'text-[13.5px]' : 'font-mono',\n )}\n >\n {fieldLabel(field.title, field.name, presentation)}\n </span>\n {!isApp && <ConceptPill conceptRef={field.conceptRef} category=\"structured\" />}\n {!field.required && (\n <span className=\"ml-auto font-mono text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n {s.optionalBadge}\n </span>\n )}\n </div>\n {field.description && (\n <p className=\"text-[12px] leading-relaxed text-muted-foreground\">{field.description}</p>\n )}\n\n <div\n className={cn(\n 'space-y-4 rounded-lg border bg-card/40 p-4',\n error ? 'border-destructive/50' : 'border-border',\n )}\n >\n {visible.map((child) => (\n <FieldRenderer\n key={child.name}\n field={child}\n value={data[child.name]}\n onChange={(v) => setChild(child.name, v)}\n id={`${id}.${child.name}`}\n env={env}\n />\n ))}\n\n {optionalEmpty.length > 0 && (\n <OptionalToggle\n count={optionalEmpty.length}\n expanded={showOptional}\n onToggle={() => setShowOptional((v) => !v)}\n noun=\"field\"\n />\n )}\n </div>\n {error && (\n <p className=\"text-[11px] text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { Plus, Trash2 } from 'lucide-react';\nimport { cn } from './utils';\nimport { type ListRunField, type RunField } from '../core';\nimport { ConceptPill } from './concept-pill';\nimport { fieldLabel, useFieldPresentation } from './field-presentation';\nimport { FieldRenderer, type FieldEnv } from './field-renderer';\nimport { useFieldStrings } from './field-strings';\n\ninterface ListFieldProps {\n field: ListRunField;\n value: unknown[] | undefined;\n onChange: (value: unknown[]) => void;\n id: string;\n error?: string;\n env?: FieldEnv;\n}\n\n/**\n * A repeatable list of one element type. Each item is an indexed row with its\n * own remove control; \"Add\" appends a fresh entry. The element renders through\n * the same `FieldRenderer`, so a list of documents gets dropzones and a list of\n * structured concepts gets nested cards - no special-casing per element type.\n */\nexport function ListField({ field, value, onChange, id, error, env }: ListFieldProps) {\n const s = useFieldStrings();\n // Same label chrome switch as `FieldShell` - this control owns its own label\n // because the items-count badge sits beside it. See `field-presentation.tsx`.\n const presentation = useFieldPresentation();\n const isApp = presentation === 'app';\n const items = value ?? [];\n\n const setItem = (index: number, itemValue: unknown) => {\n const next = items.slice();\n next[index] = itemValue;\n onChange(next);\n };\n const removeItem = (index: number) => onChange(items.filter((_, i) => i !== index));\n const addItem = () => onChange([...items, emptyValue(field.item)]);\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap items-baseline gap-x-2 gap-y-1\">\n <span\n className={cn(\n 'text-[13px] font-medium leading-none text-foreground',\n isApp ? 'text-[13.5px]' : 'font-mono',\n )}\n >\n {fieldLabel(field.title, field.name, presentation)}\n </span>\n {!isApp && <ConceptPill conceptRef={field.conceptRef} category=\"list\" />}\n <span className=\"font-mono text-[10.5px] text-muted-foreground\">\n {s.itemsCount(items.length)}\n </span>\n {!field.required && (\n <span className=\"ml-auto font-mono text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n {s.optionalBadge}\n </span>\n )}\n </div>\n {field.description && (\n <p className=\"text-[12px] leading-relaxed text-muted-foreground\">{field.description}</p>\n )}\n\n <div className=\"space-y-2\">\n {items.length === 0 && (\n <p className=\"rounded-md border border-dashed border-border bg-input/50 px-3 py-4 text-center text-[12px] text-muted-foreground\">\n {s.noItemsYet}\n </p>\n )}\n {items.map((item, index) => (\n <div\n key={index}\n className=\"flex items-start gap-2 rounded-md border border-border bg-card/40 p-3\"\n >\n <span className=\"mt-1 w-5 shrink-0 text-center font-mono text-[11px] text-muted-foreground\">\n {index + 1}\n </span>\n <div className=\"min-w-0 flex-1\">\n <FieldRenderer\n field={{ ...field.item, title: '', name: `${field.name}[${index}]` }}\n value={item}\n onChange={(v) => setItem(index, v)}\n id={`${id}.${index}`}\n env={env}\n />\n </div>\n <button\n type=\"button\"\n onClick={() => removeItem(index)}\n disabled={env?.disabled}\n aria-label={s.removeItemAria(index + 1)}\n className=\"mt-0.5 flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-destructive disabled:opacity-50\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n ))}\n\n <button\n type=\"button\"\n onClick={addItem}\n disabled={env?.disabled}\n className={cn(\n 'inline-flex h-9 w-full items-center justify-center gap-1.5 rounded-md border border-dashed border-border text-[13px] text-muted-foreground transition-colors',\n 'hover:border-primary/40 hover:bg-muted hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50',\n )}\n >\n <Plus className=\"h-4 w-4\" />\n {s.addItem}\n </button>\n </div>\n {error && (\n <p className=\"text-[11px] text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n/** A sensible empty starting value for a freshly added list item. */\nfunction emptyValue(field: RunField): unknown {\n switch (field.kind) {\n case 'boolean':\n return false;\n case 'object':\n return {};\n case 'list':\n return [];\n case 'document':\n case 'image':\n return undefined;\n default:\n return undefined;\n }\n}\n","'use client';\n\nimport { cn } from './utils';\nimport type { UnknownRunField } from '../core';\nimport { FieldShell } from './field-shell';\nimport { useFieldStrings } from './field-strings';\nimport { fieldControlClass } from './field-styles';\n\ninterface UnknownFieldProps {\n field: UnknownRunField;\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n id: string;\n error?: string;\n disabled?: boolean;\n}\n\n/**\n * Escape hatch for a concept whose shape we can't map to a known control. Rather\n * than block the run, we let the user hand-write the value as JSON - rare, but it\n * keeps every method runnable instead of dead-ending on an unusual input.\n */\nexport function UnknownField({ field, value, onChange, id, error, disabled }: UnknownFieldProps) {\n const s = useFieldStrings();\n return (\n <FieldShell\n name={field.name}\n title={field.title}\n conceptRef={field.conceptRef}\n category=\"structured\"\n description={field.description ?? s.jsonHint}\n required={field.required}\n error={error}\n htmlFor={id}\n >\n <textarea\n id={id}\n value={value ?? ''}\n disabled={disabled}\n aria-invalid={!!error}\n rows={3}\n spellCheck={false}\n placeholder={'{\\n \"key\": \"value\"\\n}'}\n onChange={(e) => onChange(e.target.value === '' ? undefined : e.target.value)}\n className={cn(fieldControlClass, 'min-h-[80px] resize-y px-3 py-2.5 font-mono text-[12px]')}\n />\n </FieldShell>\n );\n}\n","'use client';\n\nimport type { RunField } from '../core';\nimport { BooleanField } from './boolean-field';\nimport { DateField } from './date-field';\nimport { DocumentField, ImageField, type FileValue } from './file-field';\nimport { EnumField } from './enum-field';\nimport { NumberField } from './number-field';\nimport { ProseField, TextField } from './text-field';\nimport { ObjectField } from './object-field';\nimport { ListField } from './list-field';\nimport { UnknownField } from './unknown-field';\n\n/**\n * Ambient state that any field in the tree may need, threaded unchanged through\n * the recursion so containers don't have to re-plumb it for every child.\n */\nexport interface FieldEnv {\n disabled?: boolean;\n /** A file field asks its parent to upload; the parent sets the value later. */\n onDropFile?: (id: string, file: File) => void;\n /** Ids currently mid-upload. */\n uploadingIds?: ReadonlySet<string>;\n /** Resolve a `pipelex-storage://` URI to a browser-viewable URL (for previews\n * of already-stored files). */\n resolveUrl?: (uri: string) => Promise<string | null>;\n}\n\nexport interface FieldRendererProps {\n field: RunField;\n value: unknown;\n onChange: (value: unknown) => void;\n /** Unique, stable id used for label linkage and upload tracking. */\n id: string;\n error?: string;\n env?: FieldEnv;\n}\n\n/**\n * The single dispatch point: a normalized `RunField` → the matching control.\n * Object and list fields recurse back through here, so the whole form is one\n * data-driven tree with no per-type branching anywhere else.\n */\nexport function FieldRenderer({ field, value, onChange, id, error, env }: FieldRendererProps) {\n const disabled = env?.disabled;\n\n switch (field.kind) {\n case 'text':\n return (\n <TextField\n field={field}\n value={value as string | undefined}\n onChange={onChange}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n case 'prose':\n return (\n <ProseField\n field={field}\n value={value as string | undefined}\n onChange={onChange}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n case 'date':\n return (\n <DateField\n field={field}\n value={value as string | undefined}\n onChange={onChange}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n case 'number':\n return (\n <NumberField\n field={field}\n value={value as number | undefined}\n onChange={onChange}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n case 'boolean':\n return (\n <BooleanField\n field={field}\n value={value as boolean | undefined}\n onChange={onChange}\n id={id}\n disabled={disabled}\n />\n );\n case 'enum':\n return (\n <EnumField\n field={field}\n value={value as string | undefined}\n onChange={onChange}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n case 'document':\n return (\n <DocumentField\n field={field}\n value={value as FileValue | undefined}\n onChange={onChange}\n onDropFile={(file) => env?.onDropFile?.(id, file)}\n uploading={env?.uploadingIds?.has(id)}\n resolveUrl={env?.resolveUrl}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n case 'image':\n return (\n <ImageField\n field={field}\n value={value as FileValue | undefined}\n onChange={onChange}\n onDropFile={(file) => env?.onDropFile?.(id, file)}\n uploading={env?.uploadingIds?.has(id)}\n resolveUrl={env?.resolveUrl}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n case 'object':\n return (\n <ObjectField\n field={field}\n value={value as Record<string, unknown> | undefined}\n onChange={onChange}\n id={id}\n error={error}\n env={env}\n />\n );\n case 'list':\n return (\n <ListField\n field={field}\n value={value as unknown[] | undefined}\n onChange={onChange}\n id={id}\n error={error}\n env={env}\n />\n );\n default:\n return (\n <UnknownField\n field={field}\n value={value as string | undefined}\n onChange={onChange}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/utils.ts","../../src/react/concept-pill.tsx","../../src/react/field-presentation.tsx","../../src/react/ui/switch.tsx","../../src/react/field-dom-id.tsx","../../src/react/boolean-field.tsx","../../src/react/field-strings.tsx","../../src/react/field-shell.tsx","../../src/react/field-styles.ts","../../src/react/date-field.tsx","../../src/react/file-field.tsx","../../src/react/ui/select.tsx","../../src/react/ui/toggle.tsx","../../src/react/ui/toggle-group.tsx","../../src/react/enum-field.tsx","../../src/react/number-field.tsx","../../src/react/text-field.tsx","../../src/react/optional-toggle.tsx","../../src/react/object-field.tsx","../../src/react/list-field.tsx","../../src/react/unknown-field.tsx","../../src/react/field-renderer.tsx"],"names":["ImageIcon","Icon","jsx","React","createContext","use","jsxs","Label","FileText","React3","React4","Check","Minus","Plus","useState"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * Order-independent deep equality for JSON-shaped values (form data, inputs).\n * Objects compare by key set + value, arrays by index. Enough for comparing\n * two plain data snapshots; not a general structural-equality library (no\n * Map/Set/Date/cycle handling - none of which appear in the data it guards).\n */\nexport function isDeepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n return a.every((item, i) => isDeepEqual(item, b[i]));\n }\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((k) => Object.hasOwn(bObj, k) && isDeepEqual(aObj[k], bObj[k]));\n}\n","'use client';\n\nimport {\n Braces,\n CalendarDays,\n FileText,\n Hash,\n Image as ImageIcon,\n List,\n ListChecks,\n ToggleLeft,\n Type,\n} from 'lucide-react';\nimport { cn } from './utils';\nimport type { ConceptCategory } from '../core';\n\nconst CATEGORY_ICON: Record<ConceptCategory, typeof Type> = {\n text: Type,\n date: CalendarDays,\n document: FileText,\n image: ImageIcon,\n number: Hash,\n boolean: ToggleLeft,\n choice: ListChecks,\n structured: Braces,\n list: List,\n};\n\ninterface ConceptPillProps {\n /** The concept identifier, e.g. `native.Document`, `demo.Invoice`. */\n conceptRef?: string;\n category: ConceptCategory;\n className?: string;\n}\n\n/**\n * The small monospace type tag shown beside an input's name. Mono + a line icon\n * (never a colored chip) keeps the technical Pipelex voice without spending a\n * chromatic accent - the concept *type* is information, not a status.\n */\nexport function ConceptPill({ conceptRef, category, className }: ConceptPillProps) {\n const Icon = CATEGORY_ICON[category];\n const label = conceptRef ?? category;\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 font-mono text-[10.5px] leading-none text-muted-foreground',\n className,\n )}\n >\n <Icon className=\"h-3 w-3 shrink-0 opacity-70\" strokeWidth={1.75} aria-hidden />\n <span className=\"truncate\">{label}</span>\n </span>\n );\n}\n","'use client';\n\nimport { createContext, use, type ReactNode } from 'react';\n\n/**\n * How a field's LABEL chrome should read. The control itself never changes.\n *\n * - `studio` (default): the field's name verbatim in mono, with its concept\n * pill. The name IS the identifier a builder writes in the `.mthds` file, so\n * showing it exactly - and typed - is the point.\n * - `app`: the field's name as a human question in sans, no concept pill. Inside\n * a method app, `full_name` and `native.Text` are implementation detail; the\n * person filling the form has never seen the method's source.\n *\n * Deliberately a context rather than a prop or a `FieldEnv` flag: only the\n * components that own label chrome read it - `FieldShell`, `ObjectField`,\n * `BooleanField` and `ListField` - and threading a prop would have meant\n * editing every field control and both recursive containers.\n */\nexport type FieldPresentation = 'studio' | 'app';\n\nconst FieldPresentationContext = createContext<FieldPresentation>('studio');\n\nexport function FieldPresentationProvider({\n presentation,\n children,\n}: {\n presentation: FieldPresentation;\n children: ReactNode;\n}) {\n return <FieldPresentationContext value={presentation}>{children}</FieldPresentationContext>;\n}\n\nexport function useFieldPresentation(): FieldPresentation {\n return use(FieldPresentationContext);\n}\n\n/**\n * `full_name` → `Full name`. Only the first word is capitalised: these are\n * labels, not titles, and Title Case on every word reads as a form from 2009.\n * Takes IDENTIFIERS only - snake_case or kebab-case names, where a separator\n * is structure. An authored `title` never goes through here: it is already\n * human-facing, and its hyphens are spelling (`E-mail address`), not structure.\n */\nexport function humanizeFieldName(name: string): string {\n const words = name.replace(/[_-]+/g, ' ').trim();\n if (words === '') return name;\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * The one label expression every chrome-owning component uses: an authored\n * `title` is authoritative and shown verbatim in both presentations; only the\n * identifier fallback is humanised in app mode. An empty title stays empty -\n * that is how a list row suppresses its per-row label.\n */\nexport function fieldLabel(\n title: string | undefined,\n name: string,\n presentation: FieldPresentation,\n): string {\n if (title !== undefined) return title;\n return presentation === 'app' ? humanizeFieldName(name) : name;\n}\n","import * as React from 'react';\nimport * as SwitchPrimitives from '@radix-ui/react-switch';\n\nimport { cn } from '../utils';\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n 'peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input',\n className,\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n 'pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0',\n )}\n />\n </SwitchPrimitives.Root>\n));\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\n","'use client';\n\nimport { createContext, use, useId, type ReactNode } from 'react';\n\n/**\n * The DOM id a control writes, derived from the field id rather than equal to it.\n *\n * `FieldRenderer`'s `id` is a value PATH - `ObjectField` composes children as\n * `parent.child`, `ListField` rows as `list.0`, and a host writes an upload back\n * with `setValueAtPath(values, id.split('.'), uploaded)`. See `upload-seam.md`;\n * that contract is unchanged and this module does not touch it.\n *\n * The same string used to be written verbatim as the control's `id` and its\n * `<label for>` target, where it must instead be document-UNIQUE, and nothing\n * made it so. Two forms mounted at once whose methods each declare an input\n * named `text` emitted two `<textarea id=\"text\">`; per HTML a `<label for>` binds\n * the first element in tree order, so the second form's label went dead and its\n * control fell down the accessible-name chain to its placeholder - a screen\n * reader announcing \"Write here…\" instead of the field's name.\n *\n * A path is not unique across forms and cannot be made so without breaking the\n * write-back, so the two roles are separated instead: the path stays the path,\n * and only the DOM write is namespaced.\n *\n * **No host change is required.** With no provider above it, each control mints\n * its own prefix from `useId`, which is unique per instance within a React\n * root and hydration-stable - so mounting the same method twice in one app is\n * correct by default. `useId` cannot see across roots, though: separate roots\n * left on React's default `identifierPrefix` may emit the same sequences, so a\n * host mounting forms in separate roots (islands, microfrontends) gives each\n * root its own `identifierPrefix` - or each root's provider a distinct prefix.\n * `FieldDomIdProvider` is for hosts that want the ids to be PREDICTABLE rather\n * than merely unique: a deterministic prefix makes `getElementById` and\n * deep-link focus work. Predictability moves the uniqueness obligation to the\n * host - a provider scopes ONE form, since everything under it shares its one\n * prefix, and an explicit prefix must be unique in the document. Passing\n * `prefix=\"\"` restores path-as-id exactly, which is the escape hatch for a\n * host that addressed the old ids and has not moved yet - and it reintroduces\n * the collision, so it is only safe for one form.\n */\nconst FieldDomIdContext = createContext<string | null>(null);\n\nexport function FieldDomIdProvider({\n prefix,\n children,\n}: {\n /**\n * Omit to mint one from `useId`; `''` writes the path unprefixed. An explicit\n * prefix must be unique in the document - one provider, one form.\n */\n prefix?: string;\n children: ReactNode;\n}) {\n const generated = useId();\n return <FieldDomIdContext value={prefix ?? generated}>{children}</FieldDomIdContext>;\n}\n\n/**\n * The DOM id for a field path - the ONE place a path becomes an attribute.\n *\n * Called once per control so the `<label for>` and the control's `id` are the\n * same string by construction: the pairing cannot drift, because there is only\n * one call. `useId` runs unconditionally (hooks must) and is simply unused when\n * a provider supplies the prefix.\n */\nexport function useFieldDomId(path: string): string {\n const scoped = use(FieldDomIdContext);\n const local = useId();\n const prefix = scoped ?? local;\n return prefix === '' ? path : `${prefix}-${path}`;\n}\n","'use client';\n\nimport { cn } from './utils';\nimport type { BooleanRunField } from '../core';\nimport { ConceptPill } from './concept-pill';\nimport { fieldLabel, useFieldPresentation } from './field-presentation';\nimport { Switch } from './ui/switch';\nimport { useFieldDomId } from './field-dom-id';\n\ninterface BooleanFieldProps {\n field: BooleanRunField;\n value: boolean | undefined;\n onChange: (value: boolean) => void;\n id: string;\n disabled?: boolean;\n}\n\n/**\n * A toggle. Unlike the other fields the label sits inline with the control on a\n * single hairline row - a boolean reads better as a switchable statement than as\n * a labelled box.\n */\nexport function BooleanField({ field, value, onChange, id, disabled }: BooleanFieldProps) {\n // Same label chrome switch as `FieldShell` - this control owns its own label\n // because it sits inline with the switch. See `field-presentation.tsx`.\n const presentation = useFieldPresentation();\n const isApp = presentation === 'app';\n const domId = useFieldDomId(id);\n return (\n <div\n className={cn(\n 'flex items-center justify-between gap-4 rounded-md border border-border bg-input px-3.5 py-3',\n disabled && 'opacity-50',\n )}\n >\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-baseline gap-x-2 gap-y-1\">\n <label\n htmlFor={domId}\n className={cn(\n 'text-[13px] font-medium leading-none text-foreground',\n isApp ? 'text-[13.5px]' : 'font-mono',\n )}\n >\n {fieldLabel(field.title, field.name, presentation)}\n </label>\n {!isApp && <ConceptPill conceptRef={field.conceptRef} category=\"boolean\" />}\n </div>\n {field.description && (\n <p className=\"text-[12px] leading-relaxed text-muted-foreground\">{field.description}</p>\n )}\n </div>\n <Switch\n id={domId}\n checked={value ?? false}\n onCheckedChange={onChange}\n disabled={disabled}\n className=\"shrink-0\"\n />\n </div>\n );\n}\n","'use client';\n\n/**\n * The controls' i18n seam. The field controls are kernel code - they cannot\n * import `next-intl` - so every user-visible string they render comes through\n * this typed contract, with English defaults baked in. A host app injects its\n * own values (a next-intl host bridges them in its own `field-strings-intl.tsx`)\n * by mounting `FieldStringsProvider` above the form; stories and tests run on\n * the defaults.\n *\n * Count-bearing messages are FUNCTIONS, not templates: the default English\n * pluralization lives here, and an injecting host applies its own locale's\n * rules (ICU plurals under next-intl, for instance).\n */\nimport { createContext, useContext, useMemo, type ReactNode } from 'react';\n\nexport interface FieldStrings {\n /** Badge on an optional field's header row. */\n optionalBadge: string;\n selectPlaceholder: string;\n typeValuePlaceholder: string;\n writeHerePlaceholder: string;\n /** Helper under the raw-JSON escape hatch. */\n jsonHint: string;\n decrease: string;\n increase: string;\n noItemsYet: string;\n addItem: string;\n removeItemAria: (index: number) => string;\n itemsCount: (count: number) => string;\n /** The same badge for a list the method gave an exact count (`Concept[N]`). */\n itemsCountOf: (count: number, total: number) => string;\n uploading: string;\n dropToUpload: string;\n dropOrBrowse: string;\n pasteUrlInstead: string;\n urlPlaceholder: string;\n uploadedFile: string;\n preview: string;\n removeFileAria: string;\n previewUnavailablePdf: string;\n /** The optional-entries disclosure (\"field\" inside a concept, \"input\" at top level). */\n hideOptionalFields: string;\n hideOptionalInputs: string;\n optionalFieldsCount: (count: number) => string;\n optionalInputsCount: (count: number) => string;\n}\n\nexport const DEFAULT_FIELD_STRINGS: FieldStrings = {\n optionalBadge: 'optional',\n selectPlaceholder: 'Select…',\n typeValuePlaceholder: 'Type a value…',\n writeHerePlaceholder: 'Write here…',\n jsonHint: 'Enter this value as raw JSON.',\n decrease: 'Decrease',\n increase: 'Increase',\n noItemsYet: 'No items yet',\n addItem: 'Add item',\n removeItemAria: (index) => `Remove item ${index}`,\n itemsCount: (count) => (count === 1 ? '1 item' : `${count} items`),\n itemsCountOf: (count, total) => `${count} of ${total} ${total === 1 ? 'item' : 'items'}`,\n uploading: 'Uploading…',\n dropToUpload: 'Drop to upload',\n dropOrBrowse: 'Drop a file or click to browse',\n pasteUrlInstead: 'paste a URL instead',\n urlPlaceholder: 'https://… or pipelex-storage://…',\n uploadedFile: 'Uploaded file',\n preview: 'Preview',\n removeFileAria: 'Remove file',\n previewUnavailablePdf: 'Preview unavailable - open to view.',\n hideOptionalFields: 'Hide optional fields',\n hideOptionalInputs: 'Hide optional inputs',\n optionalFieldsCount: (count) => (count === 1 ? '1 optional field' : `${count} optional fields`),\n optionalInputsCount: (count) => (count === 1 ? '1 optional input' : `${count} optional inputs`),\n};\n\nconst FieldStringsContext = createContext<FieldStrings>(DEFAULT_FIELD_STRINGS);\n\n/** Inject host-app strings over the English defaults for every control below. */\nexport function FieldStringsProvider({\n strings,\n children,\n}: {\n strings: Partial<FieldStrings>;\n children: ReactNode;\n}) {\n const merged = useMemo(() => ({ ...DEFAULT_FIELD_STRINGS, ...strings }), [strings]);\n return <FieldStringsContext.Provider value={merged}>{children}</FieldStringsContext.Provider>;\n}\n\n/** The strings the nearest provider supplies (English defaults when none does). */\nexport function useFieldStrings(): FieldStrings {\n return useContext(FieldStringsContext);\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { cn } from './utils';\nimport type { ConceptCategory } from '../core';\nimport { ConceptPill } from './concept-pill';\nimport { useFieldStrings } from './field-strings';\nimport { fieldLabel, useFieldPresentation } from './field-presentation';\n\ninterface FieldShellProps {\n name: string;\n title?: string;\n conceptRef?: string;\n category: ConceptCategory;\n description?: string;\n required: boolean;\n /** Validation message; renders in danger text under the control. */\n error?: string;\n /** Links the rendered name to the control for screen readers. */\n htmlFor?: string;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * The label / type / description / error chrome around a single input control.\n * Every field type composes this so the form reads as one consistent column -\n * the control itself is the only thing that varies.\n */\nexport function FieldShell({\n name,\n title,\n conceptRef,\n category,\n description,\n required,\n error,\n htmlFor,\n children,\n className,\n}: FieldShellProps) {\n const s = useFieldStrings();\n // Inside a method app the label is a question, not an identifier: sans,\n // humanised, and with no concept pill. Everywhere else it stays the exact\n // mono name a builder wrote. See `field-presentation.tsx`.\n const presentation = useFieldPresentation();\n const isApp = presentation === 'app';\n const Label = htmlFor ? 'label' : 'div';\n // A list item passes title=\"\" - the row index already labels it, so we drop\n // the name and keep only the type pill to avoid a redundant header per row.\n const labelText = fieldLabel(title, name, presentation);\n const showLabel = labelText.trim() !== '';\n return (\n <div className={cn('space-y-2', className)}>\n <div className=\"flex flex-wrap items-baseline gap-x-2 gap-y-1\">\n {showLabel && (\n <Label\n {...(htmlFor ? { htmlFor } : {})}\n className={cn(\n 'text-[13px] font-medium leading-none text-foreground',\n isApp ? 'text-[13.5px]' : 'font-mono',\n )}\n >\n {labelText}\n </Label>\n )}\n {!isApp && <ConceptPill conceptRef={conceptRef} category={category} />}\n {!required && (\n <span className=\"ml-auto font-mono text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n {s.optionalBadge}\n </span>\n )}\n </div>\n {description && (\n <p className=\"text-[12px] leading-relaxed text-muted-foreground\">{description}</p>\n )}\n {/* A field in error is OUTLINED, not just annotated - inside an app the\n red caption alone is easy to miss on a tall form, and it is the only\n signal on controls whose `aria-invalid` sits on an element the user\n cannot see (the file dropzone's hidden input, most of all). Scoped to\n the app presentation so the studio's look is unchanged. */}\n {isApp && error ? (\n <div className=\"rounded-lg ring-1 ring-destructive/70 ring-offset-4 ring-offset-background\">\n {children}\n </div>\n ) : (\n children\n )}\n {error && (\n <p className=\"flex items-center gap-1 text-[11px] text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n}\n","/**\n * Shared control styling for the run form. One comfortable, theme-aware input\n * surface (the dedicated `--input` token, hairline border, accent focus ring)\n * so every field type reads as the same family - generous enough for touch\n * (≥44px tall) and never the cramped `text-xs` of the old playground panel.\n */\nimport { cn } from './utils';\n\nexport const fieldControlClass = cn(\n 'w-full rounded-md border border-border bg-input text-sm text-foreground',\n 'placeholder:text-muted-foreground/70 transition-colors',\n 'focus-visible:outline-none focus-visible:border-primary focus-visible:ring-1 focus-visible:ring-primary/40',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'aria-[invalid=true]:border-destructive aria-[invalid=true]:ring-destructive/30',\n);\n","'use client';\n\nimport { cn } from './utils';\nimport type { DateRunField } from '../core';\nimport { toDateInputValue, toStoredDateValue } from '../core/date-format';\nimport { FieldShell } from './field-shell';\nimport { fieldControlClass } from './field-styles';\nimport { useFieldDomId } from './field-dom-id';\n\ninterface DateFieldProps {\n field: DateRunField;\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n id: string;\n error?: string;\n disabled?: boolean;\n}\n\n/**\n * A calendar-date input. The control only asks for a day (no hand-typed\n * hours/seconds); for a `date-time` concept it stores midnight-UTC so the value\n * still satisfies the API's `date-time` format.\n */\nexport function DateField({ field, value, onChange, id, error, disabled }: DateFieldProps) {\n const domId = useFieldDomId(id);\n return (\n <FieldShell\n name={field.name}\n title={field.title}\n conceptRef={field.conceptRef}\n category=\"date\"\n description={field.description}\n required={field.required}\n error={error}\n htmlFor={domId}\n >\n <input\n id={domId}\n type=\"date\"\n value={toDateInputValue(value)}\n disabled={disabled}\n aria-invalid={!!error}\n onChange={(e) => onChange(toStoredDateValue(e.target.value, field.datetime))}\n className={cn(fieldControlClass, 'h-11 px-3 font-mono tabular-nums')}\n />\n </FieldShell>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDropzone } from 'react-dropzone';\nimport { Eye, EyeOff, FileText, ImageOff, Link2, Loader2, Upload, X } from 'lucide-react';\nimport { cn } from './utils';\nimport type { FileRunField } from '../core';\nimport { FieldShell } from './field-shell';\nimport { useFieldStrings } from './field-strings';\nimport { fieldControlClass } from './field-styles';\nimport { useFieldDomId } from './field-dom-id';\n\n/** The serializable value of a file field. URL is what the runner sends. */\nexport interface FileValue {\n url?: string;\n filename?: string;\n}\n\ninterface FileFieldProps {\n field: FileRunField;\n value: FileValue | undefined;\n /** Called when a file is dropped/picked - the parent uploads and sets value. */\n onDropFile: (file: File) => void;\n /** Manual URL paste / clear flows through here too. */\n onChange: (value: FileValue | undefined) => void;\n id: string;\n /** Parent-driven async state. */\n uploading?: boolean;\n /** Resolve a `pipelex-storage://` URI to a viewable URL (stored-file preview). */\n resolveUrl?: (uri: string) => Promise<string | null>;\n error?: string;\n disabled?: boolean;\n}\n\nconst IMAGE_EXT_RE = /\\.(jpg|jpeg|png|gif|webp|bmp|svg|avif)(\\?|$)/i;\nconst PDF_EXT_RE = /\\.pdf(\\?|$)/i;\nconst DATA_URL_MIME_RE = /^data:([^;,]+)/i;\n\n/**\n * True when the browser can render this URL as-is.\n *\n * `data:` is the one that used to be missing, and its absence cost a preview\n * rather than a fetch: any URL that is not `http` was treated as a stored URI\n * needing `resolveUrl`, so a host with no resolver got a spinner that never\n * stopped over a value the browser could have rendered immediately.\n */\nfunction isDirectlyViewable(url: string | undefined): url is string {\n return !!url && (/^https?:/i.test(url) || /^data:/i.test(url) || /^blob:/i.test(url));\n}\n\n/** The MIME type a `data:` URL declares, which is the only type it carries. */\nfunction dataUrlMime(url: string): string | undefined {\n return DATA_URL_MIME_RE.exec(url)?.[1]?.toLowerCase();\n}\n\n/**\n * A preview of the file this control's own dropzone just took, held until the\n * host writes the uploaded value back.\n *\n * The object URL is the only way to show a file the moment it is dropped: the\n * value the host writes is a `pipelex-storage://` URI the browser cannot\n * render. What it must NOT do is outlive the value it belongs to, and that is\n * what `boundUrl` is for - it used to win over `value` unconditionally and was\n * cleared only by this control's own clear button, so a host writing a\n * different file at the same path got a chip naming B over a preview showing A.\n */\ninterface LocalPreview {\n objectUrl: string;\n type: string;\n /**\n * The `value.url` this preview is the preview OF, or `undefined` while the\n * upload it came from has not landed yet. The control cannot know the URL at\n * drop time - the host assigns it - so the first value that appears after the\n * upload stops being in flight is adopted as this preview's own, and any\n * later change to a different one retires it.\n */\n boundUrl?: string;\n}\n\n/** Document variant: a file shown as a PDF preview (or chip for other docs). */\nexport function DocumentField(props: FileFieldProps) {\n return <FileField {...props} category=\"document\" />;\n}\n\n/** Image variant: a file shown as a real image preview. */\nexport function ImageField(props: FileFieldProps) {\n return <FileField {...props} category=\"image\" />;\n}\n\nfunction FileField({\n field,\n value,\n onDropFile,\n onChange,\n id,\n uploading,\n resolveUrl,\n error,\n disabled,\n category,\n}: FileFieldProps & { category: 'document' | 'image' }) {\n const s = useFieldStrings();\n const domId = useFieldDomId(id);\n const [showUrl, setShowUrl] = useState(false);\n // The preview is collapsed by default - opened on demand via a \"Preview\" button.\n const [previewOpen, setPreviewOpen] = useState(false);\n const [localPreview, setLocalPreview] = useState<LocalPreview | null>(null);\n // Resolved lazily, only when the user opens the preview, so a closed field\n // never fetches a presigned URL. Keyed by the URI it was resolved FROM, the\n // way `LocalPreview` is bound to the value it is the preview OF - a cached\n // source with no record of its provenance is painted under whatever name the\n // value carries next.\n const [resolved, setResolved] = useState<{ uri: string; src: string } | null>(null);\n const localUrlRef = useRef<string | null>(null);\n\n const setLocal = useCallback((next: LocalPreview | null) => {\n if (localUrlRef.current) URL.revokeObjectURL(localUrlRef.current);\n localUrlRef.current = next?.objectUrl ?? null;\n setLocalPreview(next);\n }, []);\n useEffect(() => () => setLocal(null), [setLocal]);\n\n const handleFile = useCallback(\n (file: File) => {\n setLocal({ objectUrl: URL.createObjectURL(file), type: file.type });\n onDropFile(file);\n },\n [setLocal, onDropFile],\n );\n\n const busy = disabled || uploading;\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n maxFiles: 1,\n multiple: false,\n disabled: busy,\n // The tab stop belongs on the INPUT, not on this div - see the root element\n // below. Without this, react-dropzone puts `tabIndex: 0` and its own key\n // handlers on a `role=\"presentation\"` div, and the element a keyboard or\n // voice-control user lands on is a generic with no role and no name.\n noKeyboard: true,\n onDrop: (files) => {\n const file = files[0];\n if (file) handleFile(file);\n },\n });\n\n const clear = useCallback(() => {\n setLocal(null);\n setResolved(null);\n setPreviewOpen(false);\n onChange(undefined);\n }, [setLocal, onChange]);\n\n // Whether the local preview still describes the value on screen. Computed in\n // render rather than left to the effect below, so the frame in which the host\n // writes a different file does not show the old one.\n const localIsCurrent =\n !!localPreview && (localPreview.boundUrl === undefined || localPreview.boundUrl === value?.url);\n\n useEffect(() => {\n if (!localPreview) return;\n if (localPreview.boundUrl === undefined) {\n // Still waiting for the host's write. `uploading` is the honest signal\n // that it has not happened yet; a host that does not report it falls back\n // to \"the first URL to appear\", which for the ordinary case - an empty\n // field the user drops into - is the same moment.\n if (uploading || !value?.url) return;\n setLocalPreview({ ...localPreview, boundUrl: value.url });\n return;\n }\n if (value?.url !== localPreview.boundUrl) setLocal(null);\n }, [localPreview, value?.url, uploading, setLocal]);\n\n const hasFile = !!value?.url;\n const localType = localIsCurrent ? localPreview?.type : undefined;\n // Sniffed SEPARATELY, because they used to be concatenated into one string\n // and tested with `/\\.pdf(\\?|$)/i` - so a filename's extension was always\n // followed by a space and could never match. Only a URL that carried its own\n // extension was ever previewable; a `data:` URL or an opaque storage id with\n // a perfectly good filename beside it was not offered a preview at all.\n const filename = value?.filename ?? '';\n const url = value?.url ?? '';\n const urlMime = dataUrlMime(url);\n\n const isImage =\n category === 'image' ||\n localType?.startsWith('image/') === true ||\n urlMime?.startsWith('image/') === true ||\n IMAGE_EXT_RE.test(filename) ||\n IMAGE_EXT_RE.test(url);\n const isPdf =\n localType === 'application/pdf' ||\n urlMime === 'application/pdf' ||\n PDF_EXT_RE.test(filename) ||\n PDF_EXT_RE.test(url);\n const canPreview = isImage || isPdf;\n\n const storageUri = value?.url && !isDirectlyViewable(value.url) ? value.url : null;\n useEffect(() => {\n if (!previewOpen || !storageUri || localIsCurrent || !resolveUrl) return;\n let cancelled = false;\n void resolveUrl(storageUri)\n .then((src) => {\n // A resolver that ANSWERS with nothing is the same outcome as one that\n // rejects, and it has to be recorded as one. Skipping `setResolved` on\n // an empty answer left the previous resolution standing, and it was not\n // even stale by URI - reopening the SAME file after its signed URL\n // expired kept painting the dead URL under a resolver that had just\n // said it had none.\n if (!cancelled) setResolved(src ? { uri: storageUri, src } : null);\n })\n .catch(() => {\n // A resolution that failed must leave the spinner, not the file before\n // it - and must not escape as an unhandled rejection into the host's\n // app. `resolveUrl` is a network call; rejecting is ordinary.\n if (!cancelled) setResolved(null);\n });\n return () => {\n cancelled = true;\n };\n }, [previewOpen, storageUri, localIsCurrent, resolveUrl]);\n\n // A browser-viewable source: the local object URL, a directly-viewable URL, or\n // a resolved presigned URL for a stored file. The resolution counts only while\n // it still belongs to the value on screen, which is what makes staleness\n // impossible rather than merely brief: clearing it from an effect would still\n // paint one frame of the old file, exactly as `localIsCurrent` above is\n // computed in render for the same reason.\n const resolvedSrc = resolved && resolved.uri === storageUri ? resolved.src : undefined;\n const previewSrc =\n (localIsCurrent ? localPreview?.objectUrl : undefined) ??\n (isDirectlyViewable(value?.url) ? value.url : resolvedSrc);\n\n return (\n <FieldShell\n name={field.name}\n title={field.title}\n conceptRef={field.conceptRef}\n category={category}\n description={field.description}\n required={field.required}\n error={error}\n // Names the file input, the way every other control in the set names its\n // own. Without it `FieldShell` renders the title as a `<div>` bound to\n // nothing and the input's accessible name computes to the empty string.\n htmlFor={domId}\n >\n {hasFile && !uploading ? (\n <div className=\"space-y-2\">\n <FileChip\n value={value}\n disabled={disabled}\n onClear={clear}\n canPreview={canPreview}\n previewOpen={previewOpen}\n onTogglePreview={() => setPreviewOpen((v) => !v)}\n />\n {previewOpen &&\n (previewSrc && isImage ? (\n <ImagePreview src={previewSrc} filename={value?.filename} />\n ) : previewSrc && isPdf ? (\n <PdfPreview src={previewSrc} />\n ) : (\n <div className=\"flex h-24 items-center justify-center rounded-md border border-border bg-muted\">\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n </div>\n ))}\n </div>\n ) : (\n // `role=\"presentation\"` and no tab stop: this div is the drop TARGET and\n // the visual affordance, and the control inside it is a real\n // `<input type=\"file\">`, which already has the right role and now has a\n // name. Giving the div a `role=\"button\"` of its own would put a second\n // named control in the accessibility tree for one value. The focus ring\n // is `focus-within` because the element that takes focus is clip-hidden.\n <div\n {...getRootProps()}\n className={cn(\n 'flex flex-col items-center justify-center gap-2 rounded-lg border border-dashed px-4 py-6 text-center',\n 'cursor-pointer select-none transition-colors',\n 'focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 focus-within:ring-offset-background',\n isDragActive\n ? 'border-primary/60 bg-primary/5'\n : 'border-border bg-input hover:border-border hover:bg-muted',\n busy && 'cursor-not-allowed opacity-60',\n )}\n >\n <input\n {...getInputProps({ tabIndex: 0 })}\n id={domId}\n disabled={busy}\n aria-invalid={!!error}\n />\n {uploading ? (\n <>\n <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\n <p className=\"text-[12px] text-muted-foreground\">{s.uploading}</p>\n </>\n ) : (\n <>\n <Upload className=\"h-5 w-5 text-muted-foreground\" strokeWidth={1.75} />\n <div className=\"space-y-0.5\">\n <p className=\"text-[13px] text-foreground\">\n {isDragActive ? s.dropToUpload : s.dropOrBrowse}\n </p>\n {field.accept && (\n <p className=\"font-mono text-[10.5px] text-muted-foreground\">{field.accept}</p>\n )}\n </div>\n </>\n )}\n </div>\n )}\n\n {/* URL escape hatch - collapsed by default to keep the happy path clean.\n It reads `busy`, not `disabled`: an upload is a door into this value\n like any other, and leaving these two live while the dropzone was shut\n let a user paste a URL over a file that was still arriving - or, on the\n host side, abandon a started and billed run client-side. The seam\n promises the control is disabled while its id is uploading, and that\n has to mean every way in. */}\n {!showUrl ? (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => setShowUrl(true)}\n className=\"inline-flex items-center gap-1 font-mono text-[11px] text-muted-foreground transition-colors hover:text-foreground disabled:opacity-50\"\n >\n <Link2 className=\"h-3 w-3\" />\n {s.pasteUrlInstead}\n </button>\n ) : (\n <input\n type=\"text\"\n autoFocus\n value={value?.url ?? ''}\n disabled={busy}\n placeholder={s.urlPlaceholder}\n onChange={(e) => {\n setLocal(null);\n onChange(e.target.value ? { url: e.target.value } : undefined);\n }}\n className={cn(fieldControlClass, 'h-9 px-3 font-mono text-[12px]')}\n />\n )}\n </FieldShell>\n );\n}\n\nfunction ImagePreview({ src, filename }: { src: string; filename?: string }) {\n const s = useFieldStrings();\n const [broken, setBroken] = useState(false);\n if (broken) {\n return (\n <div className=\"flex h-28 items-center justify-center rounded-md border border-border bg-muted\">\n <ImageOff className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n );\n }\n return (\n <div className=\"flex max-h-[640px] justify-center overflow-auto rounded-md border border-border bg-muted\">\n <img\n src={src}\n alt={filename ?? s.preview}\n className=\"h-auto w-full max-w-full object-contain\"\n onError={() => setBroken(true)}\n />\n </div>\n );\n}\n\nfunction PdfPreview({ src }: { src: string }) {\n const s = useFieldStrings();\n // A tall viewport so the whole document is readable; the browser's native PDF\n // viewer scrolls/paginates within it. `#view=FitH` fits the page width.\n return (\n <object\n data={`${src}#view=FitH`}\n type=\"application/pdf\"\n className=\"h-[78vh] min-h-[520px] w-full rounded-md border border-border bg-muted\"\n >\n <div className=\"flex h-28 flex-col items-center justify-center gap-1.5 text-center\">\n <FileText className=\"h-5 w-5 text-muted-foreground\" />\n <p className=\"text-[12px] text-muted-foreground\">{s.previewUnavailablePdf}</p>\n </div>\n </object>\n );\n}\n\nfunction FileChip({\n value,\n disabled,\n onClear,\n canPreview,\n previewOpen,\n onTogglePreview,\n}: {\n value: FileValue | undefined;\n disabled?: boolean;\n onClear: () => void;\n canPreview?: boolean;\n previewOpen?: boolean;\n onTogglePreview?: () => void;\n}) {\n const s = useFieldStrings();\n return (\n <div className=\"flex items-center gap-3 rounded-md border border-border bg-input px-3 py-2.5\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-muted\">\n <FileText className=\"h-4 w-4 text-muted-foreground\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-[13px] font-medium text-foreground\">\n {value?.filename ?? s.uploadedFile}\n </p>\n <p className=\"truncate font-mono text-[10.5px] text-muted-foreground\">{value?.url}</p>\n </div>\n {canPreview && (\n <button\n type=\"button\"\n onClick={onTogglePreview}\n className=\"inline-flex h-7 shrink-0 items-center gap-1 rounded-md border border-border px-2 text-[11px] text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n {previewOpen ? <EyeOff className=\"h-3.5 w-3.5\" /> : <Eye className=\"h-3.5 w-3.5\" />}\n {s.preview}\n </button>\n )}\n <ClearButton disabled={disabled} onClick={onClear} />\n </div>\n );\n}\n\nfunction ClearButton({ disabled, onClick }: { disabled?: boolean; onClick: () => void }) {\n const s = useFieldStrings();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={s.removeFileAria}\n className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react';\n\nimport { cn } from '../utils';\n\nconst Select = SelectPrimitive.Root;\n\nconst SelectGroup = SelectPrimitive.Group;\n\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n // Adapted from the registry to DESIGN.md (\"Inputs\"): the `--input` surface,\n // a hairline `--border`, and a border-color focus signal instead of the\n // upstream 2px focus ring (\"No focus glow by default\").\n 'flex h-10 w-full items-center justify-between rounded-md border border-border bg-input px-3 py-2 text-sm transition-colors data-[placeholder]:text-muted-foreground focus:border-ring focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 aria-[invalid=true]:border-destructive [&>span]:line-clamp-1',\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n};\n","'use client';\n\nimport * as React from 'react';\nimport * as TogglePrimitive from '@radix-ui/react-toggle';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../utils';\n\nconst toggleVariants = cva(\n 'inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 gap-2',\n {\n variants: {\n variant: {\n default: 'bg-transparent',\n outline: 'border border-input bg-transparent hover:bg-accent hover:text-accent-foreground',\n },\n size: {\n default: 'h-10 px-3 min-w-10',\n sm: 'h-9 px-2.5 min-w-9',\n lg: 'h-11 px-5 min-w-11',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root\n ref={ref}\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n));\n\nToggle.displayName = TogglePrimitive.Root.displayName;\n\nexport { Toggle, toggleVariants };\n","import * as React from 'react';\nimport * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';\nimport { type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../utils';\nimport { toggleVariants } from './toggle';\n\nconst ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants>>({\n size: 'default',\n variant: 'default',\n});\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, children, ...props }, ref) => (\n <ToggleGroupPrimitive.Root\n ref={ref}\n className={cn('flex items-center justify-center gap-1', className)}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size }}>{children}</ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n));\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleVariants>\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext);\n\n return (\n <ToggleGroupPrimitive.Item\n ref={ref}\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className,\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n );\n});\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;\n\nexport { ToggleGroup, ToggleGroupItem };\n","'use client';\n\nimport { Check } from 'lucide-react';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select';\nimport { ToggleGroup, ToggleGroupItem } from './ui/toggle-group';\nimport type { EnumRunField } from '../core';\nimport { FieldShell } from './field-shell';\nimport { useFieldStrings } from './field-strings';\nimport { useFieldDomId } from './field-dom-id';\n\ninterface EnumFieldProps {\n field: EnumRunField;\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n id: string;\n error?: string;\n disabled?: boolean;\n}\n\n/**\n * Radix `Select` cannot carry an item whose value is `\"\"` - it reserves the empty\n * string for \"no selection\". The field is optional and was clearable through a\n * blank `<option>`, so the clear entry rides a sentinel instead and maps back to\n * `undefined` on the way out.\n */\nconst CLEAR_VALUE = '__none__';\n\n/**\n * Pick-one. A short option set (≤4, each label brief) renders as a segmented\n * control - every choice visible at a glance - and falls back to a select once\n * the set grows past what fits on a row.\n */\nexport function EnumField({ field, value, onChange, id, error, disabled }: EnumFieldProps) {\n const s = useFieldStrings();\n const isSegmented = field.options.length <= 4 && field.options.every((o) => o.length <= 16);\n const domId = useFieldDomId(id);\n\n return (\n <FieldShell\n name={field.name}\n title={field.title}\n conceptRef={field.conceptRef}\n category=\"choice\"\n description={field.description}\n required={field.required}\n error={error}\n htmlFor={isSegmented ? undefined : domId}\n >\n {isSegmented ? (\n // `type=\"single\"` gives the roving tabindex and arrow-key navigation a\n // radiogroup owes its user, and emits `''` when the active item is\n // pressed again - which is the field's \"clear\" path.\n <ToggleGroup\n type=\"single\"\n value={value ?? ''}\n onValueChange={(next) => onChange(next === '' ? undefined : next)}\n disabled={disabled}\n aria-label={field.title ?? field.name}\n className=\"flex flex-wrap justify-start gap-1.5\"\n >\n {field.options.map((option) => (\n <ToggleGroupItem\n key={option}\n value={option}\n variant=\"outline\"\n className=\"h-9 min-w-0 gap-1.5 border-border bg-input px-3 text-[13px] text-muted-foreground hover:bg-muted hover:text-foreground data-[state=on]:border-primary/40 data-[state=on]:bg-primary/10 data-[state=on]:font-medium data-[state=on]:text-foreground\"\n >\n {value === option && (\n <Check className=\"size-3.5 text-primary\" strokeWidth={2.5} aria-hidden=\"true\" />\n )}\n {option}\n </ToggleGroupItem>\n ))}\n </ToggleGroup>\n ) : (\n <Select\n value={value ?? ''}\n disabled={disabled}\n onValueChange={(next) => onChange(next === CLEAR_VALUE ? undefined : next)}\n >\n <SelectTrigger id={domId} aria-invalid={!!error} className=\"h-11\">\n <SelectValue placeholder={s.selectPlaceholder} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={CLEAR_VALUE}>{s.selectPlaceholder}</SelectItem>\n {field.options.map((option) => (\n <SelectItem key={option} value={option}>\n {option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </FieldShell>\n );\n}\n","'use client';\n\nimport { Minus, Plus } from 'lucide-react';\nimport { cn } from './utils';\nimport type { NumberRunField } from '../core';\nimport { FieldShell } from './field-shell';\nimport { useFieldStrings } from './field-strings';\nimport { fieldControlClass } from './field-styles';\nimport { useFieldDomId } from './field-dom-id';\n\ninterface NumberFieldProps {\n field: NumberRunField;\n value: number | undefined;\n onChange: (value: number | undefined) => void;\n id: string;\n error?: string;\n disabled?: boolean;\n}\n\n/** Numeric input with steppers and min/max clamping. */\nexport function NumberField({ field, value, onChange, id, error, disabled }: NumberFieldProps) {\n const s = useFieldStrings();\n const domId = useFieldDomId(id);\n const step = field.integer ? 1 : 0.1;\n\n const clamp = (n: number) => {\n let next = n;\n if (typeof field.min === 'number') next = Math.max(field.min, next);\n if (typeof field.max === 'number') next = Math.min(field.max, next);\n return field.integer ? Math.round(next) : next;\n };\n\n const nudge = (delta: number) => onChange(clamp((value ?? 0) + delta));\n\n const rangeHint =\n field.min !== undefined || field.max !== undefined\n ? `${field.min ?? '−∞'} – ${field.max ?? '∞'}`\n : undefined;\n\n return (\n <FieldShell\n name={field.name}\n title={field.title}\n conceptRef={field.conceptRef}\n category=\"number\"\n description={field.description ?? rangeHint}\n required={field.required}\n error={error}\n htmlFor={domId}\n >\n <div className=\"flex items-stretch gap-1.5\">\n <input\n id={domId}\n type=\"number\"\n inputMode={field.integer ? 'numeric' : 'decimal'}\n value={value ?? ''}\n step={step}\n min={field.min}\n max={field.max}\n disabled={disabled}\n aria-invalid={!!error}\n placeholder=\"0\"\n onChange={(e) => onChange(e.target.value === '' ? undefined : Number(e.target.value))}\n className={cn(\n fieldControlClass,\n 'h-11 px-3 font-mono tabular-nums [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none',\n )}\n />\n <StepButton onClick={() => nudge(-step)} disabled={disabled} label={s.decrease}>\n <Minus className=\"h-4 w-4\" />\n </StepButton>\n <StepButton onClick={() => nudge(step)} disabled={disabled} label={s.increase}>\n <Plus className=\"h-4 w-4\" />\n </StepButton>\n </div>\n </FieldShell>\n );\n}\n\nfunction StepButton({\n onClick,\n disabled,\n label,\n children,\n}: {\n onClick: () => void;\n disabled?: boolean;\n label: string;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={label}\n className={cn(\n 'flex h-11 w-11 shrink-0 items-center justify-center rounded-md border border-border bg-input text-muted-foreground transition-colors',\n 'hover:border-border hover:bg-muted hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50',\n )}\n >\n {children}\n </button>\n );\n}\n","'use client';\n\nimport { cn } from './utils';\nimport type { ProseRunField, TextRunField } from '../core';\nimport { FieldShell } from './field-shell';\nimport { useFieldStrings } from './field-strings';\nimport { fieldControlClass } from './field-styles';\nimport { useFieldDomId } from './field-dom-id';\n\ninterface TextFieldProps {\n field: TextRunField;\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n id: string;\n error?: string;\n disabled?: boolean;\n}\n\n/** Single-line string input (short native.Text or a plain string property). */\nexport function TextField({ field, value, onChange, id, error, disabled }: TextFieldProps) {\n const s = useFieldStrings();\n const domId = useFieldDomId(id);\n return (\n <FieldShell\n name={field.name}\n title={field.title}\n conceptRef={field.conceptRef}\n category=\"text\"\n description={field.description}\n required={field.required}\n error={error}\n htmlFor={domId}\n >\n <input\n id={domId}\n type=\"text\"\n value={value ?? ''}\n disabled={disabled}\n aria-invalid={!!error}\n placeholder={field.placeholder ?? s.typeValuePlaceholder}\n onChange={(e) => onChange(e.target.value === '' ? undefined : e.target.value)}\n className={cn(fieldControlClass, 'h-11 px-3')}\n />\n </FieldShell>\n );\n}\n\ninterface ProseFieldProps {\n field: ProseRunField;\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n id: string;\n error?: string;\n disabled?: boolean;\n}\n\n/**\n * Multi-line free text. Auto-grows with content (`field-sizing-content`) so long\n * prompts don't trap the user in a tiny scrollbox - the field that carries most\n * of a method's intent should feel roomy.\n */\nexport function ProseField({ field, value, onChange, id, error, disabled }: ProseFieldProps) {\n const s = useFieldStrings();\n const domId = useFieldDomId(id);\n return (\n <FieldShell\n name={field.name}\n title={field.title}\n conceptRef={field.conceptRef}\n category=\"text\"\n description={field.description}\n required={field.required}\n error={error}\n htmlFor={domId}\n >\n <textarea\n id={domId}\n value={value ?? ''}\n disabled={disabled}\n aria-invalid={!!error}\n rows={3}\n placeholder={field.placeholder ?? s.writeHerePlaceholder}\n onChange={(e) => onChange(e.target.value === '' ? undefined : e.target.value)}\n className={cn(\n fieldControlClass,\n 'min-h-[88px] resize-y px-3 py-2.5 leading-relaxed [field-sizing:content]',\n )}\n />\n </FieldShell>\n );\n}\n","'use client';\n\nimport { Minus, Plus } from 'lucide-react';\nimport { useFieldStrings } from './field-strings';\n\ninterface OptionalToggleProps {\n /** How many empty optional entries are currently hidden. */\n count: number;\n expanded: boolean;\n onToggle: () => void;\n /** \"field\" inside a concept, \"input\" at the top level. */\n noun?: 'field' | 'input';\n}\n\n/**\n * The disclosure for empty optional entries. Optional inputs stay hidden until\n * the user asks for them - required (and already-filled) entries always show, so\n * the form opens at its simplest and grows only on demand. Used at the top level\n * and inside every structured concept, at any nesting depth.\n */\nexport function OptionalToggle({ count, expanded, onToggle, noun = 'field' }: OptionalToggleProps) {\n const s = useFieldStrings();\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"inline-flex items-center gap-1.5 text-[11px] text-muted-foreground transition-colors hover:text-foreground\"\n >\n {expanded ? <Minus className=\"h-3 w-3\" /> : <Plus className=\"h-3 w-3\" />}\n {expanded\n ? noun === 'field'\n ? s.hideOptionalFields\n : s.hideOptionalInputs\n : noun === 'field'\n ? s.optionalFieldsCount(count)\n : s.optionalInputsCount(count)}\n </button>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { cn } from './utils';\nimport type { ObjectRunField } from '../core';\nimport { ownProp } from '../core/own-property';\nimport { isFilled } from '../core/readiness';\nimport { ConceptPill } from './concept-pill';\nimport { FieldRenderer, type FieldEnv } from './field-renderer';\nimport { fieldLabel, useFieldPresentation } from './field-presentation';\nimport { useFieldStrings } from './field-strings';\nimport { OptionalToggle } from './optional-toggle';\n\ninterface ObjectFieldProps {\n field: ObjectRunField;\n value: Record<string, unknown> | undefined;\n onChange: (value: Record<string, unknown>) => void;\n id: string;\n error?: string;\n env?: FieldEnv;\n}\n\n/**\n * A structured concept: its sub-fields rendered inside one hairline-grouped\n * card so nesting stays legible. Empty optional sub-fields collapse behind a\n * \"+ N optional\" toggle - required and already-filled fields always show.\n */\nexport function ObjectField({ field, value, onChange, id, error, env }: ObjectFieldProps) {\n const s = useFieldStrings();\n const [showOptional, setShowOptional] = useState(false);\n // A grouped concept reads as a section heading in an app, not as a typed field.\n const presentation = useFieldPresentation();\n const isApp = presentation === 'app';\n const data = value ?? {};\n\n const setChild = (name: string, childValue: unknown) => onChange({ ...data, [name]: childValue });\n\n // `ownProp`, not `data[f.name]`: the name is the method author's, the record\n // is a plain object a host built, and a child named `constructor` or\n // `toString` reads as the inherited function from a bare index. The kernel\n // spells this read one way at every one of its sites; the control set is the\n // other half of \"every\".\n const optionalEmpty = field.fields.filter((f) => !f.required && !isFilled(ownProp(data, f.name)));\n const visible = showOptional\n ? field.fields\n : field.fields.filter((f) => f.required || isFilled(ownProp(data, f.name)));\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap items-baseline gap-x-2 gap-y-1\">\n <span\n className={cn(\n 'text-[13px] font-medium leading-none text-foreground',\n isApp ? 'text-[13.5px]' : 'font-mono',\n )}\n >\n {fieldLabel(field.title, field.name, presentation)}\n </span>\n {!isApp && <ConceptPill conceptRef={field.conceptRef} category=\"structured\" />}\n {!field.required && (\n <span className=\"ml-auto font-mono text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n {s.optionalBadge}\n </span>\n )}\n </div>\n {field.description && (\n <p className=\"text-[12px] leading-relaxed text-muted-foreground\">{field.description}</p>\n )}\n\n <div\n className={cn(\n 'space-y-4 rounded-lg border bg-card/40 p-4',\n error ? 'border-destructive/50' : 'border-border',\n )}\n >\n {visible.map((child) => (\n <FieldRenderer\n key={child.name}\n field={child}\n value={ownProp(data, child.name)}\n onChange={(v) => setChild(child.name, v)}\n id={`${id}.${child.name}`}\n env={env}\n />\n ))}\n\n {optionalEmpty.length > 0 && (\n <OptionalToggle\n count={optionalEmpty.length}\n expanded={showOptional}\n onToggle={() => setShowOptional((v) => !v)}\n noun=\"field\"\n />\n )}\n </div>\n {error && (\n <p className=\"text-[11px] text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { Plus, Trash2 } from 'lucide-react';\nimport { cn } from './utils';\nimport type { ListRunField, RunField } from '../core';\nimport { ConceptPill } from './concept-pill';\nimport { fieldLabel, useFieldPresentation } from './field-presentation';\nimport { FieldRenderer, type FieldEnv } from './field-renderer';\nimport { useFieldStrings } from './field-strings';\n\ninterface ListFieldProps {\n field: ListRunField;\n value: unknown[] | undefined;\n onChange: (value: unknown[]) => void;\n id: string;\n error?: string;\n env?: FieldEnv;\n}\n\n/**\n * A repeatable list of one element type. Each item is an indexed row with its\n * own remove control; \"Add\" appends a fresh entry. The element renders through\n * the same `FieldRenderer`, so a list of documents gets dropzones and a list of\n * structured concepts gets nested cards - no special-casing per element type.\n *\n * **A row is a thing, not a slot.** Its React key is generated when the row\n * appears and travels with it, so removing an earlier row moves the later ones\n * instead of renumbering them into each other - which is what used to drop a\n * half-typed value or a pending preview onto the neighbouring row. The row's\n * field ID stays POSITIONAL (`cvs.1`), because that ID is a PATH: a host writes\n * an upload back with `setValueAtPath(values, id.split('.'), value)`, and\n * `setValueAtPath` is a pure function of the value tree. Handing out an opaque\n * token instead would mean the kernel keeping a live token-to-index registry for\n * that function to consult, which is exactly the kind of hidden state the\n * headless core does not have.\n *\n * The positional ID is why removal is BLOCKED while a file is arriving anywhere\n * in this list - see `listIsBusy`. Together those two are the whole fix: a\n * generated key cannot rescue a write-back either, because the keys live in this\n * control's state and not in the value, so a host that replaces `values`\n * wholesale reconciles by length just as positions do. What a stable identity\n * buys over a position is exactly the reorderings the KERNEL performs, and it\n * performs one.\n */\nexport function ListField({ field, value, onChange, id, error, env }: ListFieldProps) {\n const s = useFieldStrings();\n // Same label chrome switch as `FieldShell` - this control owns its own label\n // because the items-count badge sits beside it. See `field-presentation.tsx`.\n const presentation = useFieldPresentation();\n const isApp = presentation === 'app';\n const items = value ?? [];\n const [rowKeys, setRowKeys] = useRowKeys(items.length);\n\n const setItem = (index: number, itemValue: unknown) => {\n const next = items.slice();\n next[index] = itemValue;\n onChange(next);\n };\n const removeItem = (index: number) => {\n // Drop the identity WITH the row rather than letting the length\n // reconciliation lop one off the end, or every row below this one would\n // take its neighbour's key and remount holding its neighbour's state.\n setRowKeys((prev) => prev.filter((_, i) => i !== index));\n onChange(items.filter((_, i) => i !== index));\n };\n const addItem = () => onChange([...items, emptyValue(field.item)]);\n\n // A file arriving anywhere in this list - a row that IS a dropzone, or one\n // that contains one - pins the row numbering until it lands. Removing a row\n // renumbers every row after it, and an upload the host is still holding\n // resolves against the ID it was handed at drop time: the file would be\n // written into whichever row had moved into that position. Silently, and with\n // the form still looking correctly filled.\n //\n // ADD stays available on purpose. Appending leaves every existing index where\n // it was, so an in-flight write-back is unaffected, and freezing it would make\n // filling a list of files needlessly serial.\n const busy = listIsBusy(id, env?.uploadingIds);\n // A `Concept[N]` slot is full at N. The bound is the method's, read off the\n // same `maxItems` ajv enforces, so offering one more row would offer one the\n // gate then refuses. It is deliberately NOT `itemCount`, which is the LOWER\n // bound: a schema stating \"at least two\" would otherwise be presented as a\n // list of exactly two, with Add dead over a list the method lets you grow.\n const isFull = field.maxItemCount !== undefined && items.length >= field.maxItemCount;\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap items-baseline gap-x-2 gap-y-1\">\n <span\n className={cn(\n 'text-[13px] font-medium leading-none text-foreground',\n isApp ? 'text-[13.5px]' : 'font-mono',\n )}\n >\n {fieldLabel(field.title, field.name, presentation)}\n </span>\n {!isApp && <ConceptPill conceptRef={field.conceptRef} category=\"list\" />}\n <span className=\"font-mono text-[10.5px] text-muted-foreground\">\n {/* \"of N\" is a claim about an EXACT count, so it needs both bounds and\n needs them equal. Read off `itemCount` alone - the LOWER bound - a\n model saying \"at least two\" was announced as a list of exactly two\n and then read `3 of 2 items` the moment a third row arrived. Every\n other list is a plain count, which is the honest thing to say\n about a slot with room to grow. */}\n {field.itemCount !== undefined && field.maxItemCount === field.itemCount\n ? s.itemsCountOf(items.length, field.itemCount)\n : s.itemsCount(items.length)}\n </span>\n {!field.required && (\n <span className=\"ml-auto font-mono text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n {s.optionalBadge}\n </span>\n )}\n </div>\n {field.description && (\n <p className=\"text-[12px] leading-relaxed text-muted-foreground\">{field.description}</p>\n )}\n\n <div className=\"space-y-2\">\n {items.length === 0 && (\n <p className=\"rounded-md border border-dashed border-border bg-input/50 px-3 py-4 text-center text-[12px] text-muted-foreground\">\n {s.noItemsYet}\n </p>\n )}\n {items.map((item, index) => (\n <div\n key={rowKeys[index] ?? index}\n className=\"flex items-start gap-2 rounded-md border border-border bg-card/40 p-3\"\n >\n <span className=\"mt-1 w-5 shrink-0 text-center font-mono text-[11px] text-muted-foreground\">\n {index + 1}\n </span>\n <div className=\"min-w-0 flex-1\">\n <FieldRenderer\n field={{ ...field.item, title: '', name: `${field.name}[${index}]` }}\n value={item}\n onChange={(v) => setItem(index, v)}\n id={`${id}.${index}`}\n env={env}\n />\n </div>\n <button\n type=\"button\"\n onClick={() => removeItem(index)}\n disabled={env?.disabled || busy}\n aria-label={s.removeItemAria(index + 1)}\n className=\"mt-0.5 flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-destructive disabled:opacity-50\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n ))}\n\n <button\n type=\"button\"\n onClick={addItem}\n disabled={env?.disabled || isFull}\n className={cn(\n 'inline-flex h-9 w-full items-center justify-center gap-1.5 rounded-md border border-dashed border-border text-[13px] text-muted-foreground transition-colors',\n 'hover:border-primary/40 hover:bg-muted hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50',\n )}\n >\n <Plus className=\"h-4 w-4\" />\n {s.addItem}\n </button>\n </div>\n {error && (\n <p className=\"text-[11px] text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n/**\n * True when a file is arriving anywhere inside this list.\n *\n * A prefix test rather than an exact one, because the busy row is not always the\n * list's own row: a list of DOCUMENTS uploads at `cvs.1`, a list of structures\n * holding a document uploads at `cvs.1.resume`. The dot is what keeps `cvs.` off\n * a sibling input called `cvs_extra`.\n */\nfunction listIsBusy(id: string, uploadingIds: ReadonlySet<string> | undefined): boolean {\n if (!uploadingIds?.size) return false;\n const prefix = `${id}.`;\n for (const uploading of uploadingIds) if (uploading.startsWith(prefix)) return true;\n return false;\n}\n\ninterface RowKeyState {\n keys: number[];\n next: number;\n}\n\n/**\n * One identity per row, minted when the row appears and kept until it goes.\n *\n * The keys are React keys and nothing else - they are never rendered, never put\n * in an ID, and never leave this control - so the counter lives in component\n * state rather than in a module, and a server render and its hydration can\n * disagree about the numbers without disagreeing about the markup.\n *\n * The length reconciliation runs during render, which is the supported way to\n * adjust state when props change: React re-renders immediately without\n * committing the first pass. It is the fallback for a value that changed from\n * OUTSIDE the control (a host seeding or replacing `values`), where there is\n * nothing to match rows by and length is the only honest answer. Removals go\n * through `removeItem`, which drops the right key instead.\n */\nfunction useRowKeys(length: number): [number[], (update: (prev: number[]) => number[]) => void] {\n const [state, setState] = useState<RowKeyState>(() => ({\n keys: Array.from({ length }, (_, i) => i),\n next: length,\n }));\n\n if (state.keys.length !== length) {\n setState((prev) => {\n if (length <= prev.keys.length) return { keys: prev.keys.slice(0, length), next: prev.next };\n const added = length - prev.keys.length;\n return {\n keys: [...prev.keys, ...Array.from({ length: added }, (_, i) => prev.next + i)],\n next: prev.next + added,\n };\n });\n }\n\n const update = (fn: (prev: number[]) => number[]) =>\n setState((prev) => ({ keys: fn(prev.keys), next: prev.next }));\n\n return [state.keys, update];\n}\n\n/** A sensible empty starting value for a freshly added list item. */\nfunction emptyValue(field: RunField): unknown {\n switch (field.kind) {\n case 'boolean':\n return false;\n case 'object':\n return {};\n case 'list':\n return [];\n case 'document':\n case 'image':\n return undefined;\n default:\n return undefined;\n }\n}\n","'use client';\n\nimport { cn } from './utils';\nimport type { UnknownRunField } from '../core';\nimport { FieldShell } from './field-shell';\nimport { useFieldStrings } from './field-strings';\nimport { fieldControlClass } from './field-styles';\nimport { useFieldDomId } from './field-dom-id';\n\ninterface UnknownFieldProps {\n field: UnknownRunField;\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n id: string;\n error?: string;\n disabled?: boolean;\n}\n\n/**\n * Escape hatch for a concept whose shape we can't map to a known control. Rather\n * than block the run, we let the user hand-write the value as JSON - rare, but it\n * keeps every method runnable instead of dead-ending on an unusual input.\n */\nexport function UnknownField({ field, value, onChange, id, error, disabled }: UnknownFieldProps) {\n const s = useFieldStrings();\n const domId = useFieldDomId(id);\n return (\n <FieldShell\n name={field.name}\n title={field.title}\n conceptRef={field.conceptRef}\n category=\"structured\"\n description={field.description ?? s.jsonHint}\n required={field.required}\n error={error}\n htmlFor={domId}\n >\n <textarea\n id={domId}\n value={value ?? ''}\n disabled={disabled}\n aria-invalid={!!error}\n rows={3}\n spellCheck={false}\n placeholder={'{\\n \"key\": \"value\"\\n}'}\n onChange={(e) => onChange(e.target.value === '' ? undefined : e.target.value)}\n className={cn(fieldControlClass, 'min-h-[80px] resize-y px-3 py-2.5 font-mono text-[12px]')}\n />\n </FieldShell>\n );\n}\n","'use client';\n\nimport type { RunField } from '../core';\nimport { BooleanField } from './boolean-field';\nimport { DateField } from './date-field';\nimport { DocumentField, ImageField, type FileValue } from './file-field';\nimport { EnumField } from './enum-field';\nimport { NumberField } from './number-field';\nimport { ProseField, TextField } from './text-field';\nimport { ObjectField } from './object-field';\nimport { ListField } from './list-field';\nimport { UnknownField } from './unknown-field';\n\n/**\n * Ambient state that any field in the tree may need, threaded unchanged through\n * the recursion so containers don't have to re-plumb it for every child.\n */\nexport interface FieldEnv {\n disabled?: boolean;\n /** A file field asks its parent to upload; the parent sets the value later. */\n onDropFile?: (id: string, file: File) => void;\n /** Ids currently mid-upload. */\n uploadingIds?: ReadonlySet<string>;\n /** Resolve a `pipelex-storage://` URI to a browser-viewable URL (for previews\n * of already-stored files). */\n resolveUrl?: (uri: string) => Promise<string | null>;\n}\n\nexport interface FieldRendererProps {\n field: RunField;\n value: unknown;\n onChange: (value: unknown) => void;\n /** Unique, stable id used for label linkage and upload tracking. */\n id: string;\n error?: string;\n env?: FieldEnv;\n}\n\n/**\n * The single dispatch point: a normalized `RunField` → the matching control.\n * Object and list fields recurse back through here, so the whole form is one\n * data-driven tree with no per-type branching anywhere else.\n */\nexport function FieldRenderer({ field, value, onChange, id, error, env }: FieldRendererProps) {\n const disabled = env?.disabled;\n\n switch (field.kind) {\n case 'text':\n return (\n <TextField\n field={field}\n value={value as string | undefined}\n onChange={onChange}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n case 'prose':\n return (\n <ProseField\n field={field}\n value={value as string | undefined}\n onChange={onChange}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n case 'date':\n return (\n <DateField\n field={field}\n value={value as string | undefined}\n onChange={onChange}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n case 'number':\n return (\n <NumberField\n field={field}\n value={value as number | undefined}\n onChange={onChange}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n case 'boolean':\n return (\n <BooleanField\n field={field}\n value={value as boolean | undefined}\n onChange={onChange}\n id={id}\n disabled={disabled}\n />\n );\n case 'enum':\n return (\n <EnumField\n field={field}\n value={value as string | undefined}\n onChange={onChange}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n case 'document':\n return (\n <DocumentField\n field={field}\n value={value as FileValue | undefined}\n onChange={onChange}\n onDropFile={(file) => env?.onDropFile?.(id, file)}\n uploading={env?.uploadingIds?.has(id)}\n resolveUrl={env?.resolveUrl}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n case 'image':\n return (\n <ImageField\n field={field}\n value={value as FileValue | undefined}\n onChange={onChange}\n onDropFile={(file) => env?.onDropFile?.(id, file)}\n uploading={env?.uploadingIds?.has(id)}\n resolveUrl={env?.resolveUrl}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n case 'object':\n return (\n <ObjectField\n field={field}\n value={value as Record<string, unknown> | undefined}\n onChange={onChange}\n id={id}\n error={error}\n env={env}\n />\n );\n case 'list':\n return (\n <ListField\n field={field}\n value={value as unknown[] | undefined}\n onChange={onChange}\n id={id}\n error={error}\n env={env}\n />\n );\n default:\n return (\n <UnknownField\n field={field}\n value={value as string | undefined}\n onChange={onChange}\n id={id}\n error={error}\n disabled={disabled}\n />\n );\n }\n}\n"]}
|