@pipelex/mthds-form 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/utils.ts","../../src/react/concept-pill.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","React","jsx","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","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 { 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 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=\"font-mono text-[13px] font-medium leading-none text-foreground\"\n >\n {field.title ?? field.name}\n </label>\n <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 (the webapp bridges next-intl in `field-strings-intl.tsx`) by\n * mounting `FieldStringsProvider` above the form; stories and tests run on the\n * defaults, which match the app's `en.json` word for word.\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 (next-intl's ICU plurals in the app).\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';\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 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 = title !== undefined ? title : name;\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=\"font-mono text-[13px] font-medium leading-none text-foreground\"\n >\n {labelText}\n </Label>\n )}\n <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 {children}\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 { 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 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 className=\"font-mono text-[13px] font-medium leading-none text-foreground\">\n {field.title ?? field.name}\n </span>\n <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 { 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 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 className=\"font-mono text-[13px] font-medium leading-none text-foreground\">\n {field.title ?? field.name}\n </span>\n <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"]}
@@ -0,0 +1,2 @@
1
+ *,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }
2
+ /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.collapse{visibility:collapse}.absolute{position:absolute}.relative{position:relative}.left-2{left:.5rem}.z-50{z-index:50}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.ml-auto{margin-left:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.hidden{display:none}.size-3\.5{width:.875rem;height:.875rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-24{height:6rem}.h-28{height:7rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[78vh\]{height:78vh}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-px{height:1px}.max-h-\[--radix-select-content-available-height\]{max-height:var(--radix-select-content-available-height)}.max-h-\[640px\]{max-height:640px}.min-h-\[520px\]{min-height:520px}.min-h-\[80px\]{min-height:80px}.min-h-\[88px\]{min-height:88px}.w-11{width:2.75rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0}.min-w-10{min-width:2.5rem}.min-w-11{min-width:2.75rem}.min-w-9{min-width:2.25rem}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.origin-\[--radix-select-content-transform-origin\]{transform-origin:var(--radix-select-content-transform-origin)}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-y{resize:vertical}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-y-1{row-gap:.25rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-dashed{border-style:dashed}.border-border{border-color:hsl(var(--border))}.border-destructive\/50{border-color:hsl(var(--destructive)/.5)}.border-input{border-color:hsl(var(--input))}.border-primary\/60{border-color:hsl(var(--primary)/.6)}.border-transparent{border-color:transparent}.bg-background{background-color:hsl(var(--background))}.bg-card\/40{background-color:hsl(var(--card)/.4)}.bg-input{background-color:hsl(var(--input))}.bg-input\/50{background-color:hsl(var(--input)/.5)}.bg-muted{background-color:hsl(var(--muted))}.bg-popover{background-color:hsl(var(--popover))}.bg-primary\/5{background-color:hsl(var(--primary)/.05)}.bg-transparent{background-color:transparent}.object-contain{-o-object-fit:contain;object-fit:contain}.p-1{padding:.25rem}.p-3{padding:.75rem}.p-4{padding:1rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-wider{letter-spacing:.05em}.text-destructive{color:hsl(var(--destructive))}.text-foreground{color:hsl(var(--foreground))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/70{color:hsl(var(--muted-foreground)/.7)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-0{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0) scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0) scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}.\[appearance\:textfield\]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.\[field-sizing\:content\]{field-sizing:content}.placeholder\:text-muted-foreground\/70::-moz-placeholder{color:hsl(var(--muted-foreground)/.7)}.placeholder\:text-muted-foreground\/70::placeholder{color:hsl(var(--muted-foreground)/.7)}.hover\:border-border:hover{border-color:hsl(var(--border))}.hover\:border-primary\/40:hover{border-color:hsl(var(--primary)/.4)}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-muted-foreground:hover{color:hsl(var(--muted-foreground))}.focus\:border-ring:focus{border-color:hsl(var(--ring))}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus-visible\:border-primary:focus-visible{border-color:hsl(var(--primary))}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-primary\/40:focus-visible{--tw-ring-color:hsl(var(--primary)/0.4)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:hsl(var(--background))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.aria-\[invalid\=true\]\:border-destructive[aria-invalid=true]{border-color:hsl(var(--destructive))}.aria-\[invalid\=true\]\:ring-destructive\/30[aria-invalid=true]{--tw-ring-color:hsl(var(--destructive)/0.3)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:0.25rem}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom],.data-\[side\=left\]\:-translate-x-1[data-side=left]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:-0.25rem}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:0.25rem}.data-\[side\=right\]\:translate-x-1[data-side=right],.data-\[side\=top\]\:-translate-y-1[data-side=top]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:-0.25rem}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:1.25rem}.data-\[state\=checked\]\:translate-x-5[data-state=checked],.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:0px}.data-\[state\=on\]\:border-primary\/40[data-state=on]{border-color:hsl(var(--primary)/.4)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}.data-\[state\=on\]\:bg-accent[data-state=on]{background-color:hsl(var(--accent))}.data-\[state\=on\]\:bg-primary\/10[data-state=on]{background-color:hsl(var(--primary)/.1)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}.data-\[state\=on\]\:font-medium[data-state=on]{font-weight:500}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:hsl(var(--muted-foreground))}.data-\[state\=on\]\:text-accent-foreground[data-state=on]{color:hsl(var(--accent-foreground))}.data-\[state\=on\]\:text-foreground[data-state=on]{color:hsl(var(--foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-0.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:0.5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-0.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:0.5rem}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}
package/dist/theme.css ADDED
@@ -0,0 +1,76 @@
1
+ /*
2
+ * The theming contract, as a working default.
3
+ *
4
+ * Every colour the controls use is an HSL triplet in a custom property - never
5
+ * a literal. A host that already defines these (any shadcn/ui codebase does)
6
+ * needs nothing from this file: the controls pick up its palette automatically,
7
+ * which is the whole point of the arrangement. A host that defines none of them
8
+ * loads this file to get a neutral, accessible starting point.
9
+ *
10
+ * The values below are the stock shadcn/ui neutral palette, deliberately
11
+ * un-branded: this package renders MTHDS input specs, and the surrounding
12
+ * product supplies the brand.
13
+ *
14
+ * Dark mode follows the `.dark` class convention (Tailwind `darkMode: 'class'`).
15
+ */
16
+ :root {
17
+ --background: 0 0% 100%;
18
+ --foreground: 240 10% 3.9%;
19
+
20
+ --card: 0 0% 100%;
21
+ --card-foreground: 240 10% 3.9%;
22
+
23
+ --popover: 0 0% 100%;
24
+ --popover-foreground: 240 10% 3.9%;
25
+
26
+ --primary: 240 5.9% 10%;
27
+ --primary-foreground: 0 0% 98%;
28
+
29
+ --secondary: 240 4.8% 95.9%;
30
+ --secondary-foreground: 240 5.9% 10%;
31
+
32
+ --muted: 240 4.8% 95.9%;
33
+ --muted-foreground: 240 3.8% 46.1%;
34
+
35
+ --accent: 240 4.8% 95.9%;
36
+ --accent-foreground: 240 5.9% 10%;
37
+
38
+ --destructive: 0 84.2% 60.2%;
39
+ --destructive-foreground: 0 0% 98%;
40
+
41
+ --border: 240 5.9% 90%;
42
+ --input: 240 4.8% 95.9%;
43
+ --ring: 240 5.9% 10%;
44
+
45
+ --radius: 0.5rem;
46
+ }
47
+
48
+ .dark {
49
+ --background: 240 10% 3.9%;
50
+ --foreground: 0 0% 98%;
51
+
52
+ --card: 240 10% 3.9%;
53
+ --card-foreground: 0 0% 98%;
54
+
55
+ --popover: 240 10% 3.9%;
56
+ --popover-foreground: 0 0% 98%;
57
+
58
+ --primary: 0 0% 98%;
59
+ --primary-foreground: 240 5.9% 10%;
60
+
61
+ --secondary: 240 3.7% 15.9%;
62
+ --secondary-foreground: 0 0% 98%;
63
+
64
+ --muted: 240 3.7% 15.9%;
65
+ --muted-foreground: 240 5% 64.9%;
66
+
67
+ --accent: 240 3.7% 15.9%;
68
+ --accent-foreground: 0 0% 98%;
69
+
70
+ --destructive: 0 62.8% 50.6%;
71
+ --destructive-foreground: 0 0% 98%;
72
+
73
+ --border: 240 3.7% 15.9%;
74
+ --input: 240 3.7% 12%;
75
+ --ring: 240 4.9% 83.9%;
76
+ }
package/package.json ADDED
@@ -0,0 +1,92 @@
1
+ {
2
+ "name": "@pipelex/mthds-form",
3
+ "version": "0.1.0",
4
+ "description": "Headless form kernel and control set for MTHDS method inputs",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/Pipelex/mthds-form.git"
9
+ },
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "type": "module",
14
+ "sideEffects": [
15
+ "**/*.css"
16
+ ],
17
+ "engines": {
18
+ "node": ">=22"
19
+ },
20
+ "main": "./dist/core/index.js",
21
+ "types": "./dist/core/index.d.ts",
22
+ "exports": {
23
+ ".": {
24
+ "import": "./dist/core/index.js",
25
+ "types": "./dist/core/index.d.ts"
26
+ },
27
+ "./react": {
28
+ "import": "./dist/react/index.js",
29
+ "types": "./dist/react/index.d.ts"
30
+ },
31
+ "./styles.css": "./dist/styles.css",
32
+ "./theme.css": "./dist/theme.css"
33
+ },
34
+ "files": [
35
+ "dist"
36
+ ],
37
+ "scripts": {
38
+ "prepare": "npm run build",
39
+ "build": "tsup && npm run build:css",
40
+ "build:css": "tailwindcss -c tailwind.config.cjs -i src/styles/tailwind-entry.css -o dist/styles.css --minify && cp src/styles/theme.css dist/theme.css",
41
+ "lint": "eslint src/",
42
+ "format": "prettier --write \"src/**/*.{ts,tsx,css}\"",
43
+ "format:check": "prettier --check \"src/**/*.{ts,tsx,css}\"",
44
+ "typecheck": "tsc --noEmit",
45
+ "test": "vitest run",
46
+ "test:coverage": "vitest run --coverage",
47
+ "test:watch": "vitest",
48
+ "check": "npm run lint && npm run format:check && npm run typecheck && npm run test"
49
+ },
50
+ "dependencies": {
51
+ "@radix-ui/react-select": "^2.3.7",
52
+ "@radix-ui/react-switch": "^1.3.1",
53
+ "@radix-ui/react-toggle": "^1.1.12",
54
+ "@radix-ui/react-toggle-group": "^1.1.13",
55
+ "ajv": "^8.17.1",
56
+ "ajv-formats": "^2.1.1",
57
+ "class-variance-authority": "^0.7.1",
58
+ "clsx": "^2.1.1",
59
+ "lucide-react": "^0.462.0",
60
+ "react-dropzone": "^14.3.8",
61
+ "tailwind-merge": "^2.6.0"
62
+ },
63
+ "peerDependencies": {
64
+ "react": "^19",
65
+ "react-dom": "^19"
66
+ },
67
+ "peerDependenciesMeta": {
68
+ "react": {
69
+ "optional": true
70
+ },
71
+ "react-dom": {
72
+ "optional": true
73
+ }
74
+ },
75
+ "devDependencies": {
76
+ "@eslint/js": "^9.39.4",
77
+ "@types/node": "^22",
78
+ "@types/react": "^19",
79
+ "@types/react-dom": "^19.2.3",
80
+ "@vitest/coverage-v8": "^4.1.0",
81
+ "eslint": "^9.39.4",
82
+ "prettier": "^3.8.1",
83
+ "react": "^19",
84
+ "react-dom": "^19",
85
+ "tailwindcss": "^3.4.17",
86
+ "tailwindcss-animate": "^1.0.7",
87
+ "tsup": "^8.5.0",
88
+ "typescript": "^5.8.3",
89
+ "typescript-eslint": "^8.35.1",
90
+ "vitest": "^4.1.0"
91
+ }
92
+ }