@allhailai/formfoundry-core 1.2.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/node/events.ts","../src/node/globalRegistry.ts","../src/node/hooks.ts","../src/node/ledger.ts","../src/node/messages.ts","../src/node/index.ts","../src/i18n/index.ts","../src/validation/messages.ts","../src/validation/parseRules.ts","../src/validation/rules.ts","../src/validation/registry.ts","../src/validation/zodAdapter.ts","../src/validation/index.ts","../src/context/FormMetaContext.ts","../src/context/FormValuesContext.ts","../src/context/useFormContext.ts","../src/hooks/useFormFoundryField.ts","../src/hooks/useFormNode.ts","../src/print/useFormPrint.ts","../src/registry/index.ts","../src/components/FormFoundryProvider.tsx","../src/components/Form.tsx","../src/schema/expressions.ts","../src/components/SchemaRenderer.tsx","../src/plugins/index.ts","../src/resolvers/zodResolver.ts","../src/i18n/en.ts","../src/print/FormPrintButton.tsx","../src/print/FormPrintView.tsx","../src/print/PrintOverlay.tsx"],"names":["listeners","isEmpty","createContext","useContext","useId","useRef","useState","useCallback","msgs","useEffect","useMemo","jsx","defaultValues","useReducer","getNode","useImperativeHandle","React","Fragment","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["// ─── Node Events ───────────────────────────────────────────────────────────────\n// Event emitter for loosely-coupled observation of node lifecycle.\n// Unlike hooks (middleware), events are fire-and-forget — they cannot\n// transform payloads or short-circuit.\n\nexport type FormFoundryEventName =\n | 'created'\n | 'destroying'\n | 'settled'\n | 'input'\n | 'commit'\n | 'reset'\n | 'message-added'\n | 'message-removed'\n | string // Allow custom event names\n\nexport type FormFoundryEventListener = (payload: unknown) => void\n\nexport interface FormFoundryEventEmitter {\n /** Register a listener for an event. Returns an unregister function. */\n on: (event: FormFoundryEventName, listener: FormFoundryEventListener) => () => void\n /** Register a one-time listener. Automatically removed after first call. */\n once: (event: FormFoundryEventName, listener: FormFoundryEventListener) => () => void\n /** Emit an event with a payload. */\n emit: (event: FormFoundryEventName, payload?: unknown) => void\n /** Remove all listeners for an event, or all events if no name given. */\n off: (event?: FormFoundryEventName) => void\n}\n\n/** Create a new event emitter for a node. */\nexport function createEventEmitter(): FormFoundryEventEmitter {\n const listeners = new Map<string, Set<FormFoundryEventListener>>()\n\n const emitter: FormFoundryEventEmitter = {\n on(event, listener) {\n if (!listeners.has(event)) {\n listeners.set(event, new Set())\n }\n listeners.get(event)!.add(listener)\n return () => {\n listeners.get(event)?.delete(listener)\n }\n },\n\n once(event, listener) {\n const wrapper: FormFoundryEventListener = (payload) => {\n listener(payload)\n listeners.get(event)?.delete(wrapper)\n }\n return emitter.on(event, wrapper)\n },\n\n emit(event, payload) {\n const eventListeners = listeners.get(event)\n if (!eventListeners) return\n for (const listener of eventListeners) {\n // DESIGN-5 fix: protect against listener exceptions so\n // one failing listener doesn't prevent others from firing\n try {\n listener(payload)\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n console.error('[FormFoundry] Event listener error:', e)\n }\n }\n }\n },\n\n off(event) {\n if (event) {\n listeners.delete(event)\n } else {\n listeners.clear()\n }\n },\n }\n\n return emitter\n}\n","// ─── Global Node Registry ──────────────────────────────────────────────────────\n// A global Map<id, FormFoundryNode> that enables cross-form node access.\n// Mirrors FormKit's `getNode(id)` — retrieve any node from anywhere.\n\nimport type { FormFoundryNode } from './types'\n\nconst globalNodeMap = new Map<string, FormFoundryNode>()\n\n// ─── Registry Listeners ────────────────────────────────────────────────────────\n// Allows hooks like useFormNode to subscribe to registration events.\n\nexport type RegistryEvent = 'registered' | 'unregistered'\nexport type RegistryListener = (event: RegistryEvent, id: string, node: FormFoundryNode) => void\n\nconst listeners = new Set<RegistryListener>()\n\n/**\n * Subscribe to node registration/unregistration events.\n * Returns an unsubscribe function.\n *\n * Used by `useFormNode` to detect when a form mounts after the hook is called.\n */\nexport function subscribeToRegistry(fn: RegistryListener): () => void {\n listeners.add(fn)\n return () => listeners.delete(fn)\n}\n\n// ─── Core API ──────────────────────────────────────────────────────────────────\n\n/**\n * Retrieve any registered node by its ID from anywhere in the application.\n * This is the FormFoundry equivalent of FormKit's `getNode(id)`.\n */\nexport function getNode(id: string): FormFoundryNode | undefined {\n return globalNodeMap.get(id)\n}\n\n/**\n * Register a node in the global registry.\n * Called automatically by `createNode` — you typically don't call this directly.\n */\nexport function registerNode(node: FormFoundryNode): void {\n if (process.env.NODE_ENV !== 'production' && globalNodeMap.has(node.id)) {\n // BUG-11 fix: skip warning if it's the same node object (React Strict Mode)\n const existing = globalNodeMap.get(node.id)\n if (existing !== node) {\n console.warn(\n `[FormFoundry] Node with id \"${node.id}\" is already registered globally. ` +\n `The previous node will be overwritten.`\n )\n }\n }\n globalNodeMap.set(node.id, node)\n listeners.forEach(fn => fn('registered', node.id, node))\n}\n\n/**\n * Remove a node from the global registry.\n * Called automatically on `node.destroy()` — you typically don't call this directly.\n */\nexport function unregisterNode(id: string): void {\n const node = globalNodeMap.get(id)\n globalNodeMap.delete(id)\n if (node) {\n listeners.forEach(fn => fn('unregistered', id, node))\n }\n}\n\n/**\n * Clear the entire global registry.\n * Useful for test cleanup and SSR scenarios.\n *\n * **Note:** This does NOT clear registry listeners. Mounted `useFormNode`\n * hooks still need their listeners to detect re-registration. If you need\n * to clear listeners too (e.g. between isolated tests), call\n * `clearRegistryListeners()` separately after unmounting the React tree.\n */\nexport function clearGlobalRegistry(): void {\n // BUG-23 fix: snapshot entries before clearing to prevent unsafe\n // modification if a listener calls unregisterNode during iteration\n const entries = [...globalNodeMap.entries()]\n globalNodeMap.clear()\n // Fire 'unregistered' for each node so mounted hooks can react (BUG-10 fix)\n for (const [id, node] of entries) {\n listeners.forEach(fn => fn('unregistered', id, node))\n }\n // Do NOT clear listeners — mounted useFormNode hooks still need them\n}\n\n/**\n * Clear all registry listeners.\n * BUG-D1 fix: prevents listener leaks in SSR and test environments where\n * `clearGlobalRegistry()` is called between renders/tests without first\n * unmounting the React tree.\n *\n * **Call this AFTER unmounting your React tree** (e.g., in `afterEach`).\n */\nexport function clearRegistryListeners(): void {\n listeners.clear()\n}\n\n/**\n * Get a snapshot of all registered node IDs.\n * Useful for debugging.\n */\nexport function getRegisteredNodeIds(): string[] {\n return Array.from(globalNodeMap.keys())\n}\n","// ─── Lifecycle Hooks ───────────────────────────────────────────────────────────\n// Middleware dispatchers for key node lifecycle events.\n// Each hook runs a chain of middleware functions in sequence.\n// Middleware can transform the payload or short-circuit via not calling next().\n\n/**\n * A middleware function for a hook.\n * Receives the current payload and a `next` function to call the next middleware.\n * Must return the (potentially transformed) payload.\n */\nexport type FormFoundryMiddleware<T> = (\n payload: T,\n next: (payload: T) => T\n) => T\n\n/**\n * A single hook dispatcher. Maintains a stack of middleware and dispatches payloads through them.\n */\nexport interface FormFoundryHookDispatcher<T> {\n /** Register a middleware function. Returns an unregister function. */\n use: (middleware: FormFoundryMiddleware<T>) => () => void\n /** Dispatch a payload through the middleware chain (synchronous). */\n dispatch: (payload: T) => T\n /**\n * Dispatch a payload through the middleware chain, awaiting any async\n * middleware. BUG-34 fix: prevents Promises from being stored as values\n * when plugins use async transformations.\n */\n dispatchAsync: (payload: T) => Promise<T>\n}\n\n/**\n * All lifecycle hooks available on a node.\n *\n * - `init` — Runs when the node is created. Payload: the node itself.\n * - `input` — Runs when node.input(value) is called. Payload: the new value.\n * - `commit` — Runs when a value is committed (after debounce). Payload: the committed value.\n * - `prop` — Runs when a prop changes. Payload: { prop, value }.\n * - `message` — Runs when a message is added to the store. Payload: the message.\n * - `submit` — Runs on form submission. Payload: the form values.\n */\nexport interface FormFoundryHooks {\n init: FormFoundryHookDispatcher<unknown>\n input: FormFoundryHookDispatcher<unknown>\n commit: FormFoundryHookDispatcher<unknown>\n prop: FormFoundryHookDispatcher<{ prop: string; value: unknown }>\n message: FormFoundryHookDispatcher<unknown>\n submit: FormFoundryHookDispatcher<Record<string, unknown>>\n}\n\n// ─── Implementation ────────────────────────────────────────────────────────────\n\nfunction createHookDispatcher<T>(): FormFoundryHookDispatcher<T> {\n const middlewares: FormFoundryMiddleware<T>[] = []\n\n return {\n use(middleware: FormFoundryMiddleware<T>) {\n middlewares.push(middleware)\n return () => {\n const index = middlewares.indexOf(middleware)\n if (index !== -1) {\n middlewares.splice(index, 1)\n }\n }\n },\n\n dispatch(payload: T): T {\n if (middlewares.length === 0) return payload\n\n let index = 0\n const next = (current: T): T => {\n if (index >= middlewares.length) return current\n const middleware = middlewares[index++]!\n return middleware(current, next)\n }\n\n return next(payload)\n },\n\n // BUG-34 fix: async dispatch that awaits each middleware result\n async dispatchAsync(payload: T): Promise<T> {\n if (middlewares.length === 0) return payload\n\n let current: T = payload\n for (const middleware of middlewares) {\n const result = middleware(current, (p: T) => p)\n current = result instanceof Promise ? await result : result\n }\n return current\n },\n }\n}\n\n/** Create a fresh set of lifecycle hooks for a node. */\nexport function createHooks(): FormFoundryHooks {\n return {\n init: createHookDispatcher<unknown>(),\n input: createHookDispatcher<unknown>(),\n commit: createHookDispatcher<unknown>(),\n prop: createHookDispatcher<{ prop: string; value: unknown }>(),\n message: createHookDispatcher<unknown>(),\n submit: createHookDispatcher<Record<string, unknown>>(),\n }\n}\n","// ─── Ledger ────────────────────────────────────────────────────────────────────\n// Running tallies of messages matching criteria for O(1) validity checks.\n// Avoids re-walking the tree on every value change.\n\nimport type { FormFoundryMessage, FormFoundryMessageStore } from './messages'\n\nexport type LedgerCounterFilter = (message: FormFoundryMessage) => boolean\n\nexport interface LedgerCounter {\n /** Current count */\n readonly count: number\n /** Name of this counter (for debugging) */\n readonly name: string\n}\n\nexport interface FormFoundryLedger {\n /** Create a counter that tracks messages matching a filter. */\n count: (name: string, filter: LedgerCounterFilter) => LedgerCounter\n /** Get all counters. */\n counters: () => LedgerCounter[]\n /** Recalculate all counters from the current store. */\n recalculate: () => void\n /** Cleanup all subscriptions. */\n destroy: () => void\n}\n\n/** Create a ledger attached to a message store. */\nexport function createLedger(store: FormFoundryMessageStore): FormFoundryLedger {\n const counters: Array<{ name: string; filter: LedgerCounterFilter; count: number }> = []\n let unsubscribe: (() => void) | null = null\n\n function recalculate() {\n for (const counter of counters) {\n counter.count = 0\n for (const msg of store.messages.values()) {\n if (counter.filter(msg)) {\n counter.count++\n }\n }\n }\n }\n\n // Subscribe to store changes\n unsubscribe = store.on(() => {\n recalculate()\n })\n\n const ledger: FormFoundryLedger = {\n count(name, filter) {\n const counter = { name, filter, count: 0 }\n // Calculate initial count\n for (const msg of store.messages.values()) {\n if (filter(msg)) {\n counter.count++\n }\n }\n counters.push(counter)\n return counter as LedgerCounter\n },\n\n counters() {\n return counters as LedgerCounter[]\n },\n\n recalculate,\n\n destroy() {\n if (unsubscribe) {\n unsubscribe()\n unsubscribe = null\n }\n counters.length = 0\n },\n }\n\n return ledger\n}\n","// ─── Message Store ─────────────────────────────────────────────────────────────\n// Typed message system inspired by FormKit's store.\n// Used for validation errors, UI states, blocking messages, and plugin data.\n\n/** Message categories for filtering */\nexport type FormFoundryMessageType = 'validation' | 'state' | 'ui' | 'error'\n\n/**\n * A single message in the node's store.\n * Rich enough to support i18n, submission blocking, and visibility control.\n */\nexport interface FormFoundryMessage {\n /** Unique key identifying this message (e.g., rule name like 'required') */\n key: string\n /** Category for filtering (validation, state, ui, error) */\n type: FormFoundryMessageType\n /** The message content — typically a human-readable string */\n value: string\n /** Whether this message blocks form submission (default: true for validation) */\n blocking: boolean\n /** Whether this message should be shown to end users (default: true) */\n visible: boolean\n /** Optional metadata for i18n, custom plugins, etc. */\n meta: Record<string, unknown>\n}\n\n/**\n * Create a message with sensible defaults.\n * Only `key` and `value` are required — everything else has defaults.\n */\nexport function createMessage(\n partial: Partial<FormFoundryMessage> & { key: string; value: string }\n): FormFoundryMessage {\n return {\n type: 'validation',\n blocking: true,\n visible: true,\n meta: {},\n ...partial,\n }\n}\n\n// ─── Message Store ─────────────────────────────────────────────────────────────\n\nexport interface FormFoundryMessageStore {\n /** All messages in the store */\n readonly messages: Map<string, FormFoundryMessage>\n\n /** Add or replace a message by key */\n set: (message: FormFoundryMessage) => void\n /** Remove a message by key */\n remove: (key: string) => void\n /** Get a message by key */\n get: (key: string) => FormFoundryMessage | undefined\n /** Check if a message with this key exists */\n has: (key: string) => boolean\n /** Clear all messages, optionally filtered by type */\n clear: (type?: FormFoundryMessageType) => void\n\n /** Get all messages of a given type */\n filter: (type: FormFoundryMessageType) => FormFoundryMessage[]\n /** Get all visible messages (for display) */\n visible: () => FormFoundryMessage[]\n /** Check if any blocking messages exist */\n hasBlocking: () => boolean\n /** Get all blocking messages */\n blocking: () => FormFoundryMessage[]\n\n /** Subscribe to store changes */\n on: (listener: (store: FormFoundryMessageStore) => void) => () => void\n /**\n * Batch multiple store operations into a single notification.\n * Suppresses intermediate notifications during the batch.\n */\n batch: (fn: () => void) => void\n}\n\n// ─── Store Implementation ──────────────────────────────────────────────────────\n\nexport function createMessageStore(): FormFoundryMessageStore {\n const messages = new Map<string, FormFoundryMessage>()\n const listeners = new Set<(store: FormFoundryMessageStore) => void>()\n let batchDepth = 0\n let batchDirty = false\n\n const notify = () => {\n if (batchDepth > 0) {\n batchDirty = true\n return\n }\n for (const listener of listeners) {\n listener(store)\n }\n }\n\n const store: FormFoundryMessageStore = {\n get messages() {\n return messages\n },\n\n set(message: FormFoundryMessage) {\n messages.set(message.key, message)\n notify()\n },\n\n remove(key: string) {\n if (messages.delete(key)) {\n notify()\n }\n },\n\n get(key: string) {\n return messages.get(key)\n },\n\n has(key: string) {\n return messages.has(key)\n },\n\n clear(type?: FormFoundryMessageType) {\n if (type) {\n for (const [key, msg] of messages) {\n if (msg.type === type) {\n messages.delete(key)\n }\n }\n } else {\n messages.clear()\n }\n notify()\n },\n\n filter(type: FormFoundryMessageType) {\n const result: FormFoundryMessage[] = []\n for (const msg of messages.values()) {\n if (msg.type === type) {\n result.push(msg)\n }\n }\n return result\n },\n\n visible() {\n const result: FormFoundryMessage[] = []\n for (const msg of messages.values()) {\n if (msg.visible) {\n result.push(msg)\n }\n }\n return result\n },\n\n hasBlocking() {\n for (const msg of messages.values()) {\n if (msg.blocking) return true\n }\n return false\n },\n\n blocking() {\n const result: FormFoundryMessage[] = []\n for (const msg of messages.values()) {\n if (msg.blocking) {\n result.push(msg)\n }\n }\n return result\n },\n\n on(listener: (store: FormFoundryMessageStore) => void) {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n\n batch(fn: () => void) {\n batchDepth++\n try {\n fn()\n } finally {\n batchDepth--\n if (batchDepth === 0 && batchDirty) {\n batchDirty = false\n notify()\n }\n }\n },\n }\n\n return store\n}\n","// ─── createNode ────────────────────────────────────────────────────────────────\n// Factory function for creating FormFoundryNode instances.\n// Nodes are plain objects (not classes) for serializability and testability.\n\nimport { createEventEmitter } from './events'\nimport { registerNode, unregisterNode } from './globalRegistry'\nimport { createHooks } from './hooks'\nimport { createLedger } from './ledger'\nimport { createMessageStore } from './messages'\nimport type {\n FormFoundryNode,\n FormFoundryNodeConfig,\n FormFoundryNodeType,\n FormFoundryPlugin,\n} from './types'\n\n// ─── Options ───────────────────────────────────────────────────────────────────\n\nexport interface CreateNodeOptions {\n /** Node type: 'input' (default), 'list', or 'group' */\n type?: FormFoundryNodeType\n /** Field name (used as key in parent group) */\n name?: string\n /** Initial value */\n value?: unknown\n /** Optional stable ID (auto-generated if not provided) */\n id?: string\n /** Configuration (cascades to children) */\n config?: FormFoundryNodeConfig\n /** Children nodes (for group/list types) */\n children?: FormFoundryNode[]\n /** Parent node */\n parent?: FormFoundryNode\n /** Plugins to apply */\n plugins?: FormFoundryPlugin[]\n /** Per-instance props (override config) */\n props?: Record<string, unknown>\n}\n\n// ─── ID Generation ─────────────────────────────────────────────────────────────\n\nlet nodeCounter = 0\nfunction generateNodeId(type: FormFoundryNodeType): string {\n return `${type}_${++nodeCounter}`\n}\n\n// ─── Value Composition ─────────────────────────────────────────────────────────\n\n/**\n * Recompute this node's value from its children.\n * - group → Record<string, unknown> keyed by child name\n * - list → unknown[] ordered by child index\n * - input → no-op (leaf)\n */\nfunction recomputeValue(node: FormFoundryNode): void {\n if (node.type === 'group') {\n const obj: Record<string, unknown> = {}\n for (const child of node.children) {\n obj[child.name] = child.value\n }\n node.value = obj\n node._value = obj\n } else if (node.type === 'list') {\n node.value = node.children.map((child) => child.value)\n node._value = node.value\n }\n // Bubble up — if this node has a parent, recompute parent too\n if (node.parent) {\n recomputeValue(node.parent)\n }\n}\n\n/**\n * Hydrate children from an initial value.\n * For groups: set each child's value from the matching key.\n * For lists: set each child's value from the matching index.\n */\nasync function hydrateChildren(\n node: FormFoundryNode,\n initialValue: unknown,\n /** BUG-33 fix: when true, use child.input() so child hooks/events fire */\n emitEvents = false\n): Promise<void> {\n if (\n node.type === 'group' &&\n initialValue !== null &&\n typeof initialValue === 'object' &&\n !Array.isArray(initialValue)\n ) {\n const values = initialValue as Record<string, unknown>\n for (const child of node.children) {\n if (child.name in values) {\n if (emitEvents) {\n // BUG-33 fix: fire child hooks/events for value propagation\n // BUG-34 fix: await so async hook middleware resolves\n await child.input(values[child.name])\n } else {\n child.value = values[child.name]\n child._value = values[child.name]\n // BUG-3 fix: preserve hydrated value as defaultValue for reset()\n if (child.config.defaultValue === undefined) {\n child.config.defaultValue = values[child.name]\n }\n // Recursively hydrate if child is group/list\n if (child.type !== 'input') {\n hydrateChildren(child, child.value)\n }\n }\n }\n }\n } else if (node.type === 'list' && Array.isArray(initialValue)) {\n for (let i = 0; i < node.children.length && i < initialValue.length; i++) {\n const child = node.children[i]!\n if (emitEvents) {\n // BUG-33 fix: fire child hooks/events for value propagation\n // BUG-34 fix: await so async hook middleware resolves\n await child.input(initialValue[i])\n } else {\n child.value = initialValue[i]\n child._value = initialValue[i]\n // BUG-3 fix: preserve hydrated value as defaultValue for reset()\n if (child.config.defaultValue === undefined) {\n child.config.defaultValue = initialValue[i]\n }\n if (child.type !== 'input') {\n hydrateChildren(child, child.value)\n }\n }\n }\n }\n}\n\n// ─── Config Inheritance ────────────────────────────────────────────────────────\n\n/**\n * Resolve a config key by walking up the node tree.\n * node.config → parent.config → grandparent.config → ...\n */\nfunction resolveConfig(\n node: FormFoundryNode,\n key: string\n): unknown {\n if (key in node.config) {\n return node.config[key]\n }\n if (node.parent) {\n return resolveConfig(node.parent, key)\n }\n return undefined\n}\n\n// ─── Factory ───────────────────────────────────────────────────────────────────\n\nexport function createNode(options: CreateNodeOptions = {}): FormFoundryNode {\n const {\n type = 'input',\n name,\n value,\n id,\n config = {},\n children: initialChildren = [],\n parent = null,\n plugins = [],\n props = {},\n } = options\n\n const nodeId = id ?? generateNodeId(type)\n const nodeName = name ?? nodeId\n const store = createMessageStore()\n const hooks = createHooks()\n const events = createEventEmitter()\n const ledger = createLedger(store)\n\n // Track cleanup functions from plugins\n const pluginCleanups: Array<() => void> = []\n // BUG-2 fix: Track plugin cleanups per-child for proper lifecycle management\n const pluginCleanupsByChild = new Map<string, Array<() => void>>()\n\n // Async settlement tracking\n let pendingCount = 0\n let settleResolvers: Array<() => void> = []\n\n function trackPending() {\n pendingCount++\n }\n function resolvePending() {\n pendingCount--\n if (pendingCount <= 0) {\n pendingCount = 0\n // BUG-G2 fix: use microtask so re-entrant input() calls during\n // resolver execution can increment pendingCount before resolvers fire\n const resolvers = settleResolvers\n settleResolvers = []\n queueMicrotask(() => {\n if (pendingCount <= 0) {\n for (const resolve of resolvers) {\n resolve()\n }\n } else {\n // Re-entrant input() was called; defer these resolvers\n settleResolvers = [...resolvers, ...settleResolvers]\n }\n })\n }\n }\n\n const node: FormFoundryNode = {\n id: nodeId,\n name: nodeName,\n type,\n\n // Tree\n parent,\n children: [],\n\n // Value\n value: value ?? (type === 'group' ? {} : type === 'list' ? [] : undefined),\n _value: value ?? (type === 'group' ? {} : type === 'list' ? [] : undefined),\n\n // State\n touched: false,\n dirty: false,\n disabled: false,\n\n // Derived (computed from message store)\n get valid() {\n return !store.hasBlocking()\n },\n\n get errors() {\n return store\n .filter('validation')\n .filter((m) => m.visible)\n .map((m) => m.value)\n },\n\n // Subsystems\n store,\n hooks,\n events,\n ledger,\n config,\n props,\n\n // Methods\n async input(newValue: unknown) {\n trackPending()\n try {\n // BUG-34 fix: use dispatchAsync so async plugin middleware\n // is properly awaited instead of storing Promises as values\n const transformedValue = await hooks.input.dispatchAsync(newValue)\n node._value = transformedValue\n\n // Run 'commit' hook (also async-aware)\n const committedValue = await hooks.commit.dispatchAsync(transformedValue)\n node.value = committedValue\n\n // If this is a group/list, don't overwrite composed value — hydrate children\n // BUG-33 fix: pass emitEvents=true so child hooks and events fire\n if (node.type !== 'input' && committedValue != null) {\n await hydrateChildren(node, committedValue, true)\n }\n\n // Notify parent for value recomposition\n if (node.parent) {\n recomputeValue(node.parent)\n }\n\n // Emit event\n events.emit('input', committedValue)\n events.emit('commit', committedValue)\n } finally {\n resolvePending()\n }\n },\n\n addChild(child: FormFoundryNode, index?: number) {\n child.parent = node\n\n if (index !== undefined && index >= 0 && index <= node.children.length) {\n node.children.splice(index, 0, child)\n } else {\n node.children.push(child)\n }\n\n // Inherit plugins from parent — cleanups tracked per-child (BUG-2 fix)\n const parentPlugins = config.plugins ?? plugins\n const childCleanups: Array<() => void> = []\n for (const plugin of parentPlugins) {\n const cleanup = plugin(child)\n if (cleanup) childCleanups.push(cleanup)\n }\n if (childCleanups.length > 0) {\n pluginCleanupsByChild.set(child.id, childCleanups)\n }\n\n // Inherit config values the child doesn't explicitly set\n // (child reads via resolveConfig, which walks the tree)\n\n // BUG-16 + BUG-A1 fix: snapshot parent value BEFORE recompute so we\n // can hydrate late-added children (including group/list) from existing\n // form values — broadened from input-only to all child types\n const preAddValue = node.type === 'group'\n ? (node.value as Record<string, unknown> | null)\n : null\n\n // Recompute parent value\n recomputeValue(node)\n\n // BUG-16 + BUG-A1 fix: hydrate late-added child from parent's pre-recompute value\n // so dynamically registered fields pick up current form values\n if (preAddValue && typeof preAddValue === 'object' && child.name in preAddValue) {\n const existingVal = preAddValue[child.name]\n if (existingVal !== undefined) {\n // For input children: only hydrate if they have no explicit value\n // (preserves intentional child values like 'child@test.com')\n // For group/list children: always hydrate recursively (BUG-A1)\n const shouldHydrate = child.type !== 'input' || child.value === undefined\n if (shouldHydrate) {\n child.value = existingVal\n child._value = existingVal\n // BUG-A1 fix: recursively hydrate group/list children\n if (child.type !== 'input') {\n hydrateChildren(child, existingVal)\n }\n // Recompute again so parent reflects the hydrated child\n recomputeValue(node)\n }\n }\n }\n },\n\n removeChild(child: FormFoundryNode) {\n const index = node.children.indexOf(child)\n if (index !== -1) {\n node.children.splice(index, 1)\n child.parent = null\n // BUG-2 fix: run plugin cleanups for this child\n const childCleanups = pluginCleanupsByChild.get(child.id)\n if (childCleanups) {\n for (const cleanup of childCleanups) {\n cleanup()\n }\n pluginCleanupsByChild.delete(child.id)\n }\n recomputeValue(node)\n }\n },\n\n destroy() {\n events.emit('destroying', undefined)\n\n // Run this node's own plugin cleanups\n for (const cleanup of pluginCleanups) {\n cleanup()\n }\n\n // Remove from parent\n if (node.parent) {\n node.parent.removeChild(node)\n }\n\n // BUG-13 fix: snapshot children to avoid wasteful recomputeValue\n // BUG-24 fix: keep child.parent intact during child.destroy() so\n // listeners on 'destroying' can navigate the tree\n const childrenToDestroy = [...node.children]\n node.children = []\n\n // Destroy children — they still have parent reference for their\n // 'destroying' event, but won't call removeChild because\n // they're no longer in node.children\n for (const child of childrenToDestroy) {\n child.destroy()\n // BUG-24 fix: null parent AFTER destroy so 'destroying' listeners\n // can still access the parent reference\n child.parent = null\n }\n\n // Run inherited plugin cleanups for all children\n for (const cleanups of pluginCleanupsByChild.values()) {\n for (const cleanup of cleanups) {\n cleanup()\n }\n }\n pluginCleanupsByChild.clear()\n\n // Cleanup subsystems\n ledger.destroy()\n events.off()\n\n // Unregister from global registry\n unregisterNode(node.id)\n },\n\n walk(fn: (node: FormFoundryNode) => void) {\n fn(node)\n for (const child of node.children) {\n child.walk(fn)\n }\n },\n\n at(path: string) {\n const segments = path.split('.')\n let current: FormFoundryNode | undefined = node\n\n for (const segment of segments) {\n if (!current || current.type === 'input') return undefined\n current = current.children.find((c) => c.name === segment)\n }\n\n return current\n },\n\n reset(resetValue?: unknown) {\n node.touched = false\n node.dirty = false\n node.store.clear('validation')\n node.store.clear('error')\n\n // BUG-15 + BUG-A3 fix: reset children FIRST with their slice of\n // resetValue, then recompute this node's value from children.\n if (node.type === 'group' && node.children.length > 0) {\n const obj = (typeof resetValue === 'object' && resetValue !== null && !Array.isArray(resetValue))\n ? resetValue as Record<string, unknown>\n : undefined\n for (const child of node.children) {\n child.reset(obj?.[child.name])\n }\n recomputeValue(node)\n } else if (node.type === 'list' && node.children.length > 0) {\n const arr = Array.isArray(resetValue) ? resetValue : undefined\n for (let i = 0; i < node.children.length; i++) {\n node.children[i]!.reset(arr?.[i])\n }\n recomputeValue(node)\n } else {\n // Input node or childless group/list: use provided/default value\n const defaultVal = resetValue\n ?? node.config.defaultValue\n ?? (node.type === 'group' ? {} : node.type === 'list' ? [] : undefined)\n node.value = defaultVal\n node._value = defaultVal\n }\n\n // Bubble value change up to parent\n if (node.parent) {\n recomputeValue(node.parent)\n }\n\n events.emit('reset', node.value)\n },\n\n /**\n * Wait for all currently in-flight `input()` calls to complete.\n *\n * **Design note (G1):** If no `input()` calls are pending, `settle()`\n * resolves immediately. This is intentional — it means \"wait for\n * current async work\", not \"wait for the next input\". If you need to\n * wait for a future input, subscribe to the `'commit'` event instead.\n *\n * Uses a microtask-deferred resolver (G2 fix) so that re-entrant\n * `input()` calls triggered during resolver callbacks are captured\n * before settlement completes.\n */\n async settle() {\n if (pendingCount <= 0) return\n return new Promise<void>((resolve) => {\n settleResolvers.push(resolve)\n })\n },\n\n async submit() {\n // No-op by default. <Form> overrides this on its root node\n // with a real implementation that validates and calls onSubmit.\n },\n }\n\n // ─── Wire up children ──────────────────────────────────────────────────────\n for (const child of initialChildren) {\n node.addChild(child)\n }\n\n // ─── Hydrate from initial value ────────────────────────────────────────────\n if (value !== undefined && type !== 'input') {\n hydrateChildren(node, value)\n } else if (type !== 'input') {\n // Compose value from children\n recomputeValue(node)\n }\n\n // ─── Apply plugins ────────────────────────────────────────────────────────\n const allPlugins = [...(config.plugins ?? []), ...plugins]\n for (const plugin of allPlugins) {\n const cleanup = plugin(node)\n if (cleanup) pluginCleanups.push(cleanup)\n }\n\n // ─── Run init hook ─────────────────────────────────────────────────────────\n hooks.init.dispatch(node)\n\n // ─── Register globally ─────────────────────────────────────────────────────\n registerNode(node)\n events.emit('created', node)\n\n return node\n}\n\n// ─── Utility ───────────────────────────────────────────────────────────────────\n\n/** Resolve a config value by walking up the tree. */\nexport { resolveConfig }\n","// ─── i18n System ───────────────────────────────────────────────────────────────\n// Locale-based message system with {label} and {args} interpolation.\n// Inspired by FormKit's i18n plugin.\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\n/**\n * A locale message can be a static string or a function for dynamic messages.\n * Strings support `{label}`, `{name}`, and `{args.N}` interpolation tokens.\n *\n * Examples:\n * - `\"{label} is required.\"`\n * - `(ctx) => \\`\\${ctx.label} must be at least \\${ctx.args[0]} characters.\\``\n */\nexport type LocaleMessage = string | ((ctx: MessageContext) => string)\n\n/**\n * Context passed to dynamic message functions and used for interpolation.\n */\nexport interface MessageContext {\n /** Human-readable field label (falls back to name if not set) */\n label: string\n /** Field name (the programmatic key) */\n name: string\n /** Rule arguments (e.g., ['8'] for min:8) */\n args: unknown[]\n /** Form-level values (for cross-field messages) */\n values: Record<string, unknown>\n}\n\n/**\n * A locale is a complete set of validation messages for a language.\n */\nexport interface FormFoundryLocale {\n /** Locale code (e.g., 'en', 'es', 'fr') */\n code: string\n /** Human-readable name (e.g., 'English', 'Español') */\n name: string\n /** Rule name → message mapping */\n messages: Record<string, LocaleMessage>\n}\n\n// ─── Interpolation ─────────────────────────────────────────────────────────────\n\n/**\n * Interpolate tokens in a message string.\n *\n * Supported tokens:\n * - `{label}` → field label\n * - `{name}` → field name\n * - `{args.0}`, `{args.1}`, etc. → rule arguments by index\n * - `{0}`, `{1}`, etc. → shorthand for args\n */\nexport function interpolate(template: string, ctx: MessageContext): string {\n return template\n .replace(/\\{label\\}/g, ctx.label)\n .replace(/\\{name\\}/g, ctx.name)\n .replace(/\\{args\\.(\\d+)\\}/g, (_, i) => String(ctx.args[Number(i)] ?? ''))\n .replace(/\\{(\\d+)\\}/g, (_, i) => String(ctx.args[Number(i)] ?? ''))\n}\n\n/**\n * Resolve a locale message for a given rule and context.\n */\nexport function resolveLocaleMessage(\n locale: FormFoundryLocale,\n ruleName: string,\n ctx: MessageContext\n): string {\n const msg = locale.messages[ruleName]\n if (!msg) return `${ctx.label} is invalid.`\n\n if (typeof msg === 'function') {\n return msg(ctx)\n }\n return interpolate(msg, ctx)\n}\n\n// ─── Locale Registry ───────────────────────────────────────────────────────────\n\nconst localeRegistry = new Map<string, FormFoundryLocale>()\nlet activeLocaleCode = 'en'\n\n/** Register a locale. */\nexport function registerLocale(locale: FormFoundryLocale): void {\n localeRegistry.set(locale.code, locale)\n}\n\n/** Set the active locale by code. */\nexport function setActiveLocale(code: string): void {\n if (!localeRegistry.has(code)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[FormFoundry i18n] Locale \"${code}\" is not registered. ` +\n `Available: ${Array.from(localeRegistry.keys()).join(', ') || '(none)'}`\n )\n }\n }\n activeLocaleCode = code\n}\n\n/** Get the active locale. Returns `en` fallback if not found. */\nexport function getActiveLocale(): FormFoundryLocale | undefined {\n return localeRegistry.get(activeLocaleCode)\n}\n\n/** Get a specific locale by code. */\nexport function getLocale(code: string): FormFoundryLocale | undefined {\n return localeRegistry.get(code)\n}\n\n/** List all registered locale codes. */\nexport function getRegisteredLocales(): string[] {\n return Array.from(localeRegistry.keys())\n}\n","// ─── Default Validation Messages ───────────────────────────────────────────────\n// English defaults with argument interpolation.\n// Can be overridden globally via FormFoundryProvider messages config.\n\nimport { getActiveLocale, resolveLocaleMessage, type MessageContext } from '../i18n/index'\n\nexport const defaultMessages: Record<\n string,\n string | ((args: string[]) => string)\n> = {\n required: 'This field is required.',\n email: 'Please enter a valid email address.',\n url: 'Please enter a valid URL.',\n min: (args) => `Must be at least ${args[0] ?? '?'}.`,\n max: (args) => `Must be at most ${args[0] ?? '?'}.`,\n minLength: (args) => `Must be at least ${args[0] ?? '?'} characters.`,\n maxLength: (args) => `Must be at most ${args[0] ?? '?'} characters.`,\n matches: 'This field does not match the required pattern.',\n confirm: 'This field does not match.',\n alpha: 'This field must contain only alphabetical characters.',\n alphanumeric: 'This field must contain only alphanumeric characters.',\n date: 'Please enter a valid date.',\n between: (args) =>\n `Must be between ${args[0] ?? '?'} and ${args[1] ?? '?'}.`,\n number: 'This field must be a number.',\n accepted: 'This field must be accepted.',\n alpha_spaces: 'This field must contain only letters and spaces.',\n contains_alpha: 'This field must contain at least one letter.',\n contains_alphanumeric: 'This field must contain at least one letter or number.',\n contains_alpha_spaces: 'This field must contain at least one letter or space.',\n contains_lowercase: 'This field must contain at least one lowercase letter.',\n contains_uppercase: 'This field must contain at least one uppercase letter.',\n contains_numeric: 'This field must contain at least one number.',\n contains_symbol: 'This field must contain at least one symbol.',\n date_after: (args) => `Must be after ${args[0] ?? 'today'}.`,\n date_before: (args) => `Must be before ${args[0] ?? 'today'}.`,\n date_between: (args) =>\n `Must be between ${args[0] ?? '?'} and ${args[1] ?? '?'}.`,\n date_format: (args) => `Must match the format ${args[0] ?? 'YYYY-MM-DD'}.`,\n ends_with: (args) => `Must end with ${args.join(', ') || '?'}.`,\n is: (args) => `Must be one of: ${args.join(', ') || '?'}.`,\n length: (args) =>\n args[1]\n ? `Must be between ${args[0]} and ${args[1]} characters.`\n : `Must be exactly ${args[0] ?? '?'} characters.`,\n lowercase: 'This field must be all lowercase.',\n not: (args) => `Must not be: ${args.join(', ') || '?'}.`,\n require_one: 'At least one of these fields is required.',\n starts_with: (args) => `Must start with ${args.join(', ') || '?'}.`,\n symbol: 'This field must contain only symbols.',\n uppercase: 'This field must be all uppercase.',\n}\n\n/**\n * Resolve a validation message for a given rule.\n *\n * Resolution order:\n * 1. Custom messages (per-field or per-form overrides)\n * 2. Active i18n locale (if registered)\n * 3. Default English messages (fallback)\n *\n * The `label` and `name` parameters are optional. When provided with\n * an active locale, messages will use {label} interpolation.\n */\nexport function resolveMessage(\n ruleName: string,\n args: string[],\n customMessages?: Record<string, string | ((args: string[]) => string)>,\n label?: string,\n name?: string\n): string {\n // 1. Custom messages take highest priority\n const custom = customMessages?.[ruleName]\n if (custom) {\n return typeof custom === 'function' ? custom(args) : custom\n }\n\n // 2. Try active locale (with label interpolation)\n const activeLocale = getActiveLocale()\n if (activeLocale) {\n const ctx: MessageContext = {\n label: label ?? name ?? 'This field',\n name: name ?? '',\n args,\n values: {},\n }\n const localeMsg = activeLocale.messages[ruleName]\n if (localeMsg) {\n return resolveLocaleMessage(activeLocale, ruleName, ctx)\n }\n }\n\n // 3. Fall back to default messages\n const source = defaultMessages[ruleName]\n if (typeof source === 'function') return source(args)\n if (typeof source === 'string') return source\n return 'This field is invalid.'\n}\n","// ─── Rule Parser ───────────────────────────────────────────────────────────────\n// Parses FormKit-style validation strings and array syntax into ParsedRule[].\n//\n// String syntax: \"required|email|min:6|between:1,10\"\n// Hint syntax: \"(200)required|+email|*min:6|?between:1,10\"\n// Array syntax: [['required'], ['matches', /regex/], ['min', 6]]\n// Mixed: [myCustomFn, 'required|email']\n\nimport type { ParsedRule, RuleHints, ValidationRuleFn } from './types'\n\n/**\n * Parse a validation spec into structured rules.\n *\n * Accepts:\n * - `string` — pipe-delimited rules: `\"required|email|min:6\"`\n * - `Array<[string, ...unknown[]]>` — array syntax: `[['required'], ['min', 6]]`\n * - `Array<string | ValidationRuleFn | [string, ...unknown[]]>` — mixed\n */\nexport function parseRules(\n spec: string | Array<string | ValidationRuleFn | [string, ...unknown[]]>\n): ParsedRule[] {\n if (typeof spec === 'string') {\n return parseStringRules(spec)\n }\n\n if (Array.isArray(spec)) {\n return parseArrayRules(spec)\n }\n\n return []\n}\n\n// ─── String Parser ─────────────────────────────────────────────────────────────\n\nfunction parseStringRules(spec: string): ParsedRule[] {\n if (!spec.trim()) return []\n\n const rules = spec.split('|')\n return rules.map(parseStringRule).filter(Boolean) as ParsedRule[]\n}\n\n/**\n * Parse a single string rule with optional hints.\n *\n * Examples:\n * - `\"required\"` → { name: 'required', args: [], hints: {} }\n * - `\"min:6\"` → { name: 'min', args: ['6'], hints: {} }\n * - `\"between:1,10\"` → { name: 'between', args: ['1', '10'], hints: {} }\n * - `\"(200)required\"` → { name: 'required', args: [], hints: { debounce: 200 } }\n * - `\"+email\"` → { name: 'email', args: [], hints: { empty: true } }\n * - `\"*min:6\"` → { name: 'min', args: ['6'], hints: { force: true } }\n * - `\"?between:1,10\"` → { name: 'between', args: ['1', '10'], hints: { optional: true } }\n */\nfunction parseStringRule(rule: string): ParsedRule | null {\n let remaining = rule.trim()\n if (!remaining) return null\n\n const hints: RuleHints = {}\n\n // Parse hint prefix(es) — can be combined: \"(200)+*required\"\n while (remaining.length > 0) {\n // Debounce hint: (200)\n const debounceMatch = remaining.match(/^\\((\\d+)\\)/)\n if (debounceMatch) {\n hints.debounce = parseInt(debounceMatch[1]!, 10)\n remaining = remaining.slice(debounceMatch[0].length)\n continue\n }\n\n // Empty hint: +\n if (remaining.startsWith('+')) {\n hints.empty = true\n remaining = remaining.slice(1)\n continue\n }\n\n // Force hint: *\n if (remaining.startsWith('*')) {\n hints.force = true\n remaining = remaining.slice(1)\n continue\n }\n\n // Optional hint: ?\n if (remaining.startsWith('?')) {\n hints.optional = true\n remaining = remaining.slice(1)\n continue\n }\n\n break\n }\n\n // Parse name and args: \"name:arg1,arg2\"\n const colonIndex = remaining.indexOf(':')\n if (colonIndex === -1) {\n return { name: remaining, args: [], hints }\n }\n\n const name = remaining.slice(0, colonIndex)\n const argsString = remaining.slice(colonIndex + 1)\n const args = argsString.split(',').map((a) => a.trim())\n\n return { name, args, hints }\n}\n\n// ─── Array Parser ──────────────────────────────────────────────────────────────\n\nfunction parseArrayRules(\n spec: Array<string | ValidationRuleFn | [string, ...unknown[]]>\n): ParsedRule[] {\n const rules: ParsedRule[] = []\n\n for (const item of spec) {\n if (typeof item === 'string') {\n // String in array position — parse as string rules\n rules.push(...parseStringRules(item))\n } else if (typeof item === 'function') {\n // Inline function — wrap as a rule with auto-generated name\n rules.push({\n name: item.name || `custom_${rules.length}`,\n args: [],\n hints: {},\n handler: item as ValidationRuleFn,\n })\n } else if (Array.isArray(item)) {\n // Tuple: [name, ...args]\n const [name, ...args] = item\n if (typeof name === 'string') {\n rules.push({ name, args, hints: {} })\n }\n }\n }\n\n return rules\n}\n","// ─── Built-in Validation Rules ─────────────────────────────────────────────────\n// All rules follow the same signature:\n// (value, args, context) => string | null | Promise<string | null>\n// Return null for valid, error string for invalid.\n\nimport { defaultMessages } from './messages'\nimport type { ValidationRuleFn } from './types'\n\n// ─── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction isEmpty(value: unknown): boolean {\n if (value === null || value === undefined || value === '') return true\n if (Array.isArray(value) && value.length === 0) return true\n return false\n}\n\nfunction toNumber(value: unknown): number | null {\n if (typeof value === 'number') return value\n if (typeof value === 'string') {\n const parsed = Number(value)\n return isNaN(parsed) ? null : parsed\n }\n return null\n}\n\nfunction toString(value: unknown): string {\n if (typeof value === 'string') return value\n if (value === null || value === undefined) return ''\n return String(value)\n}\n\nfunction getMessage(ruleName: string, args: unknown[]): string {\n const msgFactory = defaultMessages[ruleName]\n if (typeof msgFactory === 'function') {\n return msgFactory(args.map(String))\n }\n if (typeof msgFactory === 'string') {\n return msgFactory\n }\n return `This field is invalid.`\n}\n\n// ─── Rules ─────────────────────────────────────────────────────────────────────\n\nconst required: ValidationRuleFn = (value, args) => {\n if (isEmpty(value)) return getMessage('required', args)\n if (typeof value === 'boolean' && !value) return getMessage('required', args)\n return null\n}\n\nconst email: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null // empty values handled by `required`\n const re = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return re.test(str) ? null : getMessage('email', args)\n}\n\nconst url: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n try {\n new URL(str)\n return null\n } catch {\n return getMessage('url', args)\n }\n}\n\nconst min: ValidationRuleFn = (value, args) => {\n const num = toNumber(value)\n const threshold = toNumber(args[0])\n if (num === null || threshold === null) return null\n return num >= threshold ? null : getMessage('min', args)\n}\n\nconst max: ValidationRuleFn = (value, args) => {\n const num = toNumber(value)\n const threshold = toNumber(args[0])\n if (num === null || threshold === null) return null\n return num <= threshold ? null : getMessage('max', args)\n}\n\nconst minLength: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n const threshold = toNumber(args[0])\n if (threshold === null) return null\n return str.length >= threshold ? null : getMessage('minLength', args)\n}\n\nconst maxLength: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n const threshold = toNumber(args[0])\n if (threshold === null) return null\n return str.length <= threshold ? null : getMessage('maxLength', args)\n}\n\nconst matches: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n const pattern = args[0]\n if (pattern instanceof RegExp) {\n return pattern.test(str) ? null : getMessage('matches', args)\n }\n if (typeof pattern === 'string') {\n const re = new RegExp(pattern)\n return re.test(str) ? null : getMessage('matches', args)\n }\n return null\n}\n\nconst confirm: ValidationRuleFn = (value, args, context) => {\n const siblingName =\n typeof args[0] === 'string' ? args[0] : `${context.name}_confirm`\n const siblingValue = context.values[siblingName]\n return value === siblingValue ? null : getMessage('confirm', args)\n}\n\nconst alpha: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n return /^[a-zA-Z]+$/.test(str) ? null : getMessage('alpha', args)\n}\n\nconst alphanumeric: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n return /^[a-zA-Z0-9]+$/.test(str) ? null : getMessage('alphanumeric', args)\n}\n\nconst date: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n const d = new Date(str)\n return isNaN(d.getTime()) ? getMessage('date', args) : null\n}\n\nconst between: ValidationRuleFn = (value, args) => {\n const num = toNumber(value)\n const lo = toNumber(args[0])\n const hi = toNumber(args[1])\n if (num === null || lo === null || hi === null) return null\n return num >= lo && num <= hi ? null : getMessage('between', args)\n}\n\nconst number: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n return isNaN(Number(str)) ? getMessage('number', args) : null\n}\n\nconst accepted: ValidationRuleFn = (value, args) => {\n const v = typeof value === 'string' ? value.toLowerCase() : value\n if (v === true || v === 'yes' || v === 'on' || v === '1' || v === 1) return null\n return getMessage('accepted', args)\n}\n\nconst alpha_spaces: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n return /^[a-zA-Z\\s]+$/.test(str) ? null : getMessage('alpha_spaces', args)\n}\n\nconst contains_alpha: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n return /[a-zA-Z]/.test(str) ? null : getMessage('contains_alpha', args)\n}\n\nconst contains_alphanumeric: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n return /[a-zA-Z0-9]/.test(str) ? null : getMessage('contains_alphanumeric', args)\n}\n\nconst contains_alpha_spaces: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n return /[a-zA-Z\\s]/.test(str) ? null : getMessage('contains_alpha_spaces', args)\n}\n\nconst contains_lowercase: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n return /[a-z]/.test(str) ? null : getMessage('contains_lowercase', args)\n}\n\nconst contains_uppercase: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n return /[A-Z]/.test(str) ? null : getMessage('contains_uppercase', args)\n}\n\nconst contains_numeric: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n return /\\d/.test(str) ? null : getMessage('contains_numeric', args)\n}\n\nconst contains_symbol: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n return /[^a-zA-Z0-9\\s]/.test(str) ? null : getMessage('contains_symbol', args)\n}\n\nconst date_after: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n const d = new Date(str)\n if (isNaN(d.getTime())) return getMessage('date_after', args)\n const after = args[0] ? new Date(String(args[0])) : new Date()\n if (isNaN(after.getTime())) return null\n return d > after ? null : getMessage('date_after', args)\n}\n\nconst date_before: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n const d = new Date(str)\n if (isNaN(d.getTime())) return getMessage('date_before', args)\n const before = args[0] ? new Date(String(args[0])) : new Date()\n if (isNaN(before.getTime())) return null\n return d < before ? null : getMessage('date_before', args)\n}\n\nconst date_between: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n const d = new Date(str)\n if (isNaN(d.getTime())) return getMessage('date_between', args)\n const lo = args[0] ? new Date(String(args[0])) : null\n const hi = args[1] ? new Date(String(args[1])) : null\n if (!lo || !hi || isNaN(lo.getTime()) || isNaN(hi.getTime())) return null\n return d >= lo && d <= hi ? null : getMessage('date_between', args)\n}\n\nconst date_format: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n const format = typeof args[0] === 'string' ? args[0] : 'YYYY-MM-DD'\n // Build regex from format string\n const regex = format\n .replace(/YYYY/g, '\\\\d{4}')\n .replace(/MM/g, '\\\\d{2}')\n .replace(/DD/g, '\\\\d{2}')\n .replace(/HH/g, '\\\\d{2}')\n .replace(/mm/g, '\\\\d{2}')\n .replace(/ss/g, '\\\\d{2}')\n return new RegExp(`^${regex}$`).test(str) ? null : getMessage('date_format', args)\n}\n\nconst ends_with: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n const suffixes = args.map(String)\n return suffixes.some((s) => str.endsWith(s)) ? null : getMessage('ends_with', args)\n}\n\nconst is: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n return args.some((arg) => String(arg) === str) ? null : getMessage('is', args)\n}\n\nconst length: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n const len = str.length\n const lo = toNumber(args[0])\n const hi = args[1] !== undefined ? toNumber(args[1]) : lo\n if (lo === null) return null\n if (hi === null) return len === lo ? null : getMessage('length', args)\n return len >= lo && len <= hi ? null : getMessage('length', args)\n}\n\nconst lowercase: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n return str === str.toLowerCase() ? null : getMessage('lowercase', args)\n}\n\nconst not: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n return args.some((arg) => String(arg) === str) ? getMessage('not', args) : null\n}\n\nconst require_one: ValidationRuleFn = (value, args, context) => {\n // At least one of the named siblings must have a value\n const fieldNames = args.map(String)\n const hasSome = fieldNames.some((name) => {\n const v = context.values[name]\n return v !== null && v !== undefined && v !== ''\n })\n return hasSome ? null : getMessage('require_one', args)\n}\n\nconst starts_with: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n const prefixes = args.map(String)\n return prefixes.some((p) => str.startsWith(p)) ? null : getMessage('starts_with', args)\n}\n\nconst symbol: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n return /^[^a-zA-Z0-9\\s]+$/.test(str) ? null : getMessage('symbol', args)\n}\n\nconst uppercase: ValidationRuleFn = (value, args) => {\n const str = toString(value)\n if (!str) return null\n return str === str.toUpperCase() ? null : getMessage('uppercase', args)\n}\n\n// ─── Rule Map ──────────────────────────────────────────────────────────────────\n\nexport const builtInRules = {\n required,\n email,\n url,\n min,\n max,\n minLength,\n maxLength,\n matches,\n confirm,\n alpha,\n alphanumeric,\n date,\n between,\n number,\n accepted,\n alpha_spaces,\n contains_alpha,\n contains_alphanumeric,\n contains_alpha_spaces,\n contains_lowercase,\n contains_uppercase,\n contains_numeric,\n contains_symbol,\n date_after,\n date_before,\n date_between,\n date_format,\n ends_with,\n is,\n length,\n lowercase,\n not,\n require_one,\n starts_with,\n symbol,\n uppercase,\n} satisfies Record<string, ValidationRuleFn>\n","// ─── Custom Rule Registry ──────────────────────────────────────────────────────\n// Global registry for custom validation rules.\n// Rules registered here are available to all forms in the application.\n\nimport { builtInRules } from './rules'\nimport type { ValidationRuleFn } from './types'\n\nconst customRules = new Map<string, ValidationRuleFn>()\n\n/**\n * Register a custom validation rule globally.\n *\n * ```ts\n * registerRule('unique', async (value, args, ctx) => {\n * const exists = await checkUnique(value)\n * return exists ? 'This value is already taken' : null\n * })\n * ```\n */\nexport function registerRule(name: string, rule: ValidationRuleFn): void {\n customRules.set(name, rule)\n}\n\n/**\n * Get a validation rule by name.\n * Checks custom rules first, then built-in rules.\n */\nexport function getRule(name: string): ValidationRuleFn | undefined {\n return customRules.get(name) ?? (builtInRules as Record<string, ValidationRuleFn>)[name]\n}\n\n/**\n * Check if a rule with this name exists.\n */\nexport function hasRule(name: string): boolean {\n return customRules.has(name) || name in builtInRules\n}\n\n/**\n * Remove a custom rule registration.\n */\nexport function unregisterRule(name: string): void {\n customRules.delete(name)\n}\n","// ─── Zod Adapter ───────────────────────────────────────────────────────────────\n// Runs Zod schema.safeParse and maps ZodError issues to FormFoundry messages.\n\nimport type { ZodTypeAny } from 'zod'\nimport type { FormFoundryMessage } from '../node/messages'\nimport { createMessage } from '../node/messages'\n\n/**\n * Validate a value against a Zod schema.\n * Returns an array of FormFoundryMessages for any validation errors.\n */\nexport function validateWithZod(\n schema: ZodTypeAny,\n value: unknown\n): FormFoundryMessage[] {\n const result = schema.safeParse(value)\n if (result.success) return []\n\n return result.error.issues.map((issue) => {\n const path = issue.path.join('.')\n return createMessage({\n key: `zod_${path || 'root'}_${issue.code}`,\n type: 'validation',\n value: issue.message,\n blocking: true,\n visible: true,\n meta: {\n zodCode: issue.code,\n path: issue.path,\n },\n })\n })\n}\n\n/**\n * Validate form-level values against a Zod schema.\n * Returns a map of field name → error messages.\n */\nexport function validateFormWithZod(\n schema: ZodTypeAny,\n values: Record<string, unknown>\n): Record<string, string[]> {\n const result = schema.safeParse(values)\n if (result.success) return {}\n\n const errors: Record<string, string[]> = {}\n for (const issue of result.error.issues) {\n const fieldName = issue.path[0]\n if (typeof fieldName === 'string') {\n if (!errors[fieldName]) {\n errors[fieldName] = []\n }\n errors[fieldName].push(issue.message)\n }\n }\n\n return errors\n}\n","// ─── Validation Engine ─────────────────────────────────────────────────────────\n// Orchestrates rule execution: parses specs, resolves rules, runs them with\n// hint behavior (debounce, empty, force, optional), and produces messages.\n\nexport { defaultMessages, resolveMessage } from './messages'\nexport { parseRules } from './parseRules'\nexport { getRule, hasRule, registerRule, unregisterRule } from './registry'\nexport { builtInRules } from './rules'\nexport type {\n ParsedRule, RuleHints, ValidationContext, ValidationRuleFn\n} from './types'\nexport { validateFormWithZod, validateWithZod } from './zodAdapter'\n\nimport type { FormFoundryMessage } from '../node/messages'\nimport { createMessage } from '../node/messages'\nimport { parseRules } from './parseRules'\nimport { getRule } from './registry'\nimport type { ParsedRule, ValidationContext } from './types'\n\n/**\n * Run a validation spec against a value and return messages for any failures.\n *\n * Respects rule hints:\n * - Rules are skipped on empty values (unless `+empty` hint or rule is `required`)\n * - Execution stops on first failure (unless `*force` hint)\n * - `?optional` marks messages as non-blocking\n */\nexport async function runValidation(\n spec: string | Array<string | Function | [string, ...unknown[]]>,\n value: unknown,\n context: ValidationContext,\n customMessages?: Record<string, string | ((args: string[]) => string)>\n): Promise<FormFoundryMessage[]> {\n const rules = parseRules(spec as Parameters<typeof parseRules>[0])\n const messages: FormFoundryMessage[] = []\n const valueIsEmpty = isEmpty(value)\n\n for (const rule of rules) {\n // Skip on empty values unless hint says otherwise or rule is 'required'\n if (valueIsEmpty && !rule.hints.empty && rule.name !== 'required') {\n continue\n }\n\n const error = await executeRule(rule, value, context, customMessages)\n if (error) {\n messages.push(error)\n // Stop on first failure unless force hint\n if (!rule.hints.force) {\n break\n }\n }\n }\n\n return messages\n}\n\n/** Execute a single parsed rule */\nasync function executeRule(\n rule: ParsedRule,\n value: unknown,\n context: ValidationContext,\n customMessages?: Record<string, string | ((args: string[]) => string)>\n): Promise<FormFoundryMessage | null> {\n // Resolve the rule handler\n const handler = rule.handler ?? getRule(rule.name)\n if (!handler) {\n console.warn(`[FormFoundry] Unknown validation rule: \"${rule.name}\"`)\n return null\n }\n\n // Execute\n const errorString = await handler(value, rule.args, context)\n if (errorString === null) return null\n\n // Check custom message override\n const source = customMessages?.[rule.name]\n let messageValue = errorString\n if (source) {\n messageValue =\n typeof source === 'function'\n ? source(rule.args.map(String))\n : source\n }\n\n return createMessage({\n key: `rule_${rule.name}`,\n type: 'validation',\n value: messageValue,\n blocking: !rule.hints.optional,\n visible: true,\n meta: {\n ruleName: rule.name,\n ruleArgs: rule.args,\n },\n })\n}\n\nfunction isEmpty(value: unknown): boolean {\n if (value === null || value === undefined || value === '') return true\n if (Array.isArray(value) && value.length === 0) return true\n return false\n}\n","// ─── Form Meta Context ─────────────────────────────────────────────────────────\n// Low-churn context: submission state, validity, registry, node management.\n// Changes less frequently than values.\n'use client'\n\nimport { createContext, useContext } from 'react'\nimport type { FormFoundryGlobalConfig, FormFoundryNode } from '../node/types'\n\nexport interface FormMetaContextValue {\n /** Whether the form is currently submitting */\n isSubmitting: boolean\n /** Whether all fields are valid (no blocking messages) */\n isValid: boolean\n /** Aggregated errors by field name */\n errors: Record<string, string[]>\n /** Register a field node */\n register: (name: string, node: FormFoundryNode) => void\n /** Unregister a field node */\n unregister: (name: string) => void\n /** BUG-29 fix: update validate callback without re-registering node in tree */\n updateValidateCallback?: (name: string, validate: () => Promise<void>) => void\n /** Get a registered node by name */\n getNode: (name: string) => FormFoundryNode | undefined\n /** Trigger validation for a specific field or all fields */\n triggerValidation: (name?: string) => Promise<boolean>\n /** Whether error messages should be shown (e.g., after failed submission) */\n showErrors: boolean\n /** Global config */\n config: FormFoundryGlobalConfig\n /** The form's root node */\n formNode: FormFoundryNode | null\n /** Reset the form to default values, clearing dirty/touched/errors state */\n reset: (values?: Record<string, unknown>) => void\n /** Number of times the form has been submitted */\n submitCount: number\n /** Inject external errors (e.g., from server-side validation) */\n setExternalErrors: (errors: Record<string, string | string[]>) => void\n /** Clear all external errors */\n clearExternalErrors: () => void\n /** Whether the form is globally disabled (e.g., during submission) */\n isDisabled: boolean\n}\n\nconst defaultMeta: FormMetaContextValue = {\n isSubmitting: false,\n isValid: true,\n errors: {},\n register: () => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[FormFoundry] register called outside of a <Form> component')\n }\n },\n unregister: () => { },\n getNode: () => undefined,\n triggerValidation: async () => true,\n showErrors: false,\n config: {},\n formNode: null,\n reset: () => { },\n submitCount: 0,\n setExternalErrors: () => { },\n clearExternalErrors: () => { },\n isDisabled: false,\n}\n\nexport const FormMetaContext =\n createContext<FormMetaContextValue>(defaultMeta)\n\nexport function useFormMeta(): FormMetaContextValue {\n return useContext(FormMetaContext)\n}\n","// ─── Form Values Context ───────────────────────────────────────────────────────\n// High-churn context: holds raw form values only.\n// Separated from meta context to minimize re-renders.\n'use client'\n\nimport { createContext, useContext } from 'react'\n\nexport interface FormValuesContextValue {\n /** All form values as key-value map */\n values: Record<string, unknown>\n /** Get a single field value by name */\n getValue: (name: string) => unknown\n /** Set a single field value by name */\n setValue: (name: string, value: unknown) => void\n}\n\nconst defaultValues: FormValuesContextValue = {\n values: {},\n getValue: () => undefined,\n setValue: () => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[FormFoundry] setValue called outside of a <Form> component')\n }\n },\n}\n\nexport const FormValuesContext =\n createContext<FormValuesContextValue>(defaultValues)\n\nexport function useFormValues(): FormValuesContextValue {\n return useContext(FormValuesContext)\n}\n","// ─── useFormContext ────────────────────────────────────────────────────────────\n// Combined accessor for both values and meta contexts.\n'use client'\n\nimport { useFormMeta, type FormMetaContextValue } from './FormMetaContext'\nimport { useFormValues, type FormValuesContextValue } from './FormValuesContext'\n\nexport interface FormContextValue {\n values: FormValuesContextValue\n meta: FormMetaContextValue\n}\n\n/**\n * Access both form values and meta contexts.\n * Use this when you need both; prefer `useFormValues()` or `useFormMeta()`\n * individually when possible to minimize re-renders.\n */\nexport function useFormContext(): FormContextValue {\n return {\n values: useFormValues(),\n meta: useFormMeta(),\n }\n}\n\nexport { useFormMeta, useFormValues }\nexport type { FormMetaContextValue, FormValuesContextValue }\n\n","// ─── useFormFoundryField ─────────────────────────────────────────────────────────\n// The core field hook. UI-agnostic — returns data and callbacks, not components.\n// Registers a node with FormMetaContext, manages validation, produces fieldProps.\n'use client'\n\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport type { ZodTypeAny } from 'zod'\nimport { useFormMeta } from '../context/FormMetaContext'\nimport { useFormValues } from '../context/FormValuesContext'\nimport { createNode } from '../node/index'\nimport type {\n FormFoundryNode,\n FormFoundryPlugin,\n ValidationBehavior,\n ValidationSpec,\n} from '../node/types'\nimport { runValidation } from '../validation/index'\nimport { validateWithZod } from '../validation/zodAdapter'\n\n// ─── Options ───────────────────────────────────────────────────────────────────\n\nexport interface UseFormFoundryFieldOptions {\n /** Field name — required */\n name: string\n /** Validation spec: string rules, array rules, or Zod schema */\n validation?: ValidationSpec | string | Array<unknown> | object\n /** When validation runs */\n validationBehavior?: ValidationBehavior\n /** Default value */\n defaultValue?: unknown\n /** Per-field plugins */\n plugins?: FormFoundryPlugin[]\n /** Whether the field is disabled */\n disabled?: boolean\n /** Label for validation messages */\n label?: string\n /** Input type identifier for print renderer (e.g., 'text', 'checkbox', 'select') */\n inputType?: string\n /** Options for select/radio/checkboxgroup (stored for print renderer) */\n selectOptions?: Array<{ label: string; value: string | number }>\n /** Fields this field depends on (for cross-field validation) */\n dependsOn?: string[]\n}\n\n// ─── Return Type ───────────────────────────────────────────────────────────────\n\nexport interface UseFormFoundryFieldReturn {\n // State\n value: unknown\n error: string | null\n errors: string[]\n touched: boolean\n dirty: boolean\n valid: boolean\n\n // Handlers\n onChange: (value: unknown) => void\n onBlur: () => void\n\n // Pre-composed props ready to spread onto an input\n fieldProps: {\n value: unknown\n onChange: (value: unknown) => void\n onBlur: () => void\n 'aria-invalid'?: boolean\n 'aria-describedby'?: string\n id: string\n name: string\n disabled?: boolean\n }\n\n // Identity\n id: string\n node: FormFoundryNode\n}\n\n// ─── Hook ──────────────────────────────────────────────────────────────────────\n\nexport function useFormFoundryField(\n options: UseFormFoundryFieldOptions\n): UseFormFoundryFieldReturn {\n const {\n name,\n validation,\n validationBehavior: fieldBehavior,\n defaultValue,\n plugins,\n disabled = false,\n label,\n inputType,\n selectOptions,\n dependsOn,\n } = options\n\n const reactId = useId()\n const fieldId = `formfoundry-${name}-${reactId}`\n\n const { values, getValue, setValue } = useFormValues()\n const meta = useFormMeta()\n\n // Resolve validation behavior: field → form → provider → default\n const validationBehavior: ValidationBehavior =\n fieldBehavior ?? meta.config.validationBehavior ?? 'blur'\n\n // ─── Create Node ─────────────────────────────────────────────────────────\n const nodeRef = useRef<FormFoundryNode | null>(null)\n if (!nodeRef.current) {\n nodeRef.current = createNode({\n type: 'input',\n name,\n id: fieldId,\n value: getValue(name) ?? defaultValue,\n config: {\n validation: validation as ValidationSpec | undefined,\n validationBehavior,\n defaultValue,\n plugins,\n // Store label and inputType for print renderer access\n label,\n inputType: inputType ?? 'text',\n options: selectOptions,\n },\n })\n }\n const node = nodeRef.current\n\n // Keep label and options in sync on config for print renderer\n if (label !== undefined) {\n node.config.label = label\n }\n if (inputType !== undefined) {\n node.config.inputType = inputType\n }\n if (selectOptions !== undefined) {\n node.config.options = selectOptions\n }\n\n // BUG-6 fix: detect name changes and update the node\n if (node.name !== name) {\n const oldName = node.name\n node.name = name\n meta.unregister(oldName)\n meta.register(name, node)\n }\n\n // ─── Local State (driven from node) ──────────────────────────────────────\n const [touched, setTouched] = useState(false)\n const [dirty, setDirty] = useState(false)\n const [errorStrings, setErrorStrings] = useState<string[]>([])\n const hasBlurredRef = useRef(false)\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // BUG-4 fix: stable ref for values to avoid recreating validate on every keystroke\n const valuesRef = useRef(values)\n valuesRef.current = values\n\n // BUG-B1 fix: stable ref for getValue to avoid recreating validate on every\n // keystroke — getValue changes reference on every values-context update\n const getValueRef = useRef(getValue)\n getValueRef.current = getValue\n\n // BUG-8 fix: generation counter to discard stale async validation results\n const validationGenRef = useRef(0)\n\n // BUG-5 fix: stable ref for defaultValue to use in dirty comparison\n const defaultValueRef = useRef(defaultValue)\n defaultValueRef.current = defaultValue\n const defaultValueJsonRef = useRef(JSON.stringify(defaultValue))\n defaultValueJsonRef.current = JSON.stringify(defaultValue)\n\n // ─── Validate ────────────────────────────────────────────────────────────\n const validate = useCallback(async () => {\n // BUG-8 fix: track generation to discard stale results\n const gen = ++validationGenRef.current\n\n if (!validation) {\n setErrorStrings([])\n node.store.clear('validation')\n return\n }\n\n // Zod schema mode\n if (isZodSchema(validation as ValidationSpec)) {\n const msgs = validateWithZod(validation as ZodTypeAny, getValueRef.current(name))\n if (gen !== validationGenRef.current) return // stale\n // BUG-9 + BUG-C1 fix: atomic clear+set+errorStrings via batch\n node.store.batch(() => {\n node.store.clear('validation')\n for (const msg of msgs) {\n node.store.set(msg)\n }\n })\n setErrorStrings(msgs.filter((m) => m.visible).map((m) => m.value))\n return\n }\n\n // String / array rule mode\n // BUG-4 fix: use valuesRef.current instead of values to avoid dep on values\n const msgs = await runValidation(\n validation as string | Array<string | Function | [string, ...unknown[]]>,\n getValueRef.current(name),\n {\n values: valuesRef.current as Record<string, unknown>,\n name,\n label,\n },\n meta.config.messages\n )\n\n // BUG-8 fix: discard stale async results\n if (gen !== validationGenRef.current) return\n\n // BUG-9 + BUG-C1 fix: atomic clear+set+errorStrings via batch\n node.store.batch(() => {\n node.store.clear('validation')\n for (const msg of msgs) {\n node.store.set(msg)\n }\n })\n setErrorStrings(msgs.filter((m) => m.visible).map((m) => m.value))\n }, [validation, name, label, meta.config.messages, node])\n // ^^^^^ BUG-4 fix: 'values' removed from deps\n // ^^^^^ BUG-B1 fix: 'getValue' removed from deps (use getValueRef instead)\n\n // ─── Register / Unregister with Form ─────────────────────────────────────\n // BUG-29 fix: separate node tree attachment from validate callback updates.\n // Node tree attachment runs once; validate callback updates independently.\n useEffect(() => {\n meta.register(name, node)\n return () => {\n meta.unregister(name)\n }\n }, [name, node, meta])\n\n // BUG-29 fix: update validate callback without re-registering node in tree\n useEffect(() => {\n meta.updateValidateCallback?.(name, validate)\n }, [name, validate, meta])\n\n // ─── onChange ─────────────────────────────────────────────────────────────\n const onChange = useCallback(\n (newValue: unknown) => {\n setValue(name, newValue)\n // BUG-17 fix: call node.input() so hooks middleware (input/commit)\n // and events are properly triggered for plugins\n // BUG-28 fix: after input completes, sync context with node's\n // committed value so hook-transformed values propagate\n void node.input(newValue).then(() => {\n const committedValue = node.value\n if (committedValue !== newValue) {\n setValue(name, committedValue)\n }\n\n // BUG-35 fix: dirty check AFTER hook transformation so we\n // compare the committed value, not the raw input\n const def = defaultValueRef.current ?? undefined\n let isDirty: boolean\n if (def !== null && typeof def === 'object') {\n isDirty = JSON.stringify(committedValue) !== defaultValueJsonRef.current\n } else {\n isDirty = committedValue !== def\n }\n setDirty(isDirty)\n node.dirty = isDirty\n })\n\n // BUG-36 fix: include 'submit' behavior after failed submission so\n // fields re-validate when the user corrects them\n if (\n validationBehavior === 'live' ||\n (validationBehavior === 'blur' && hasBlurredRef.current) ||\n (validationBehavior === 'dirty' && newValue !== (defaultValueRef.current ?? undefined)) ||\n (validationBehavior === 'submit' && meta.submitCount > 0)\n ) {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n const debounceMs = meta.config.validationDebounce ?? 150\n debounceTimerRef.current = setTimeout(() => {\n void validate()\n }, debounceMs)\n }\n },\n [name, setValue, validationBehavior, validate, meta.config.validationDebounce, meta.submitCount, node]\n )\n\n // ─── onBlur ──────────────────────────────────────────────────────────────\n const onBlur = useCallback(() => {\n setTouched(true)\n node.touched = true\n hasBlurredRef.current = true\n\n if (validationBehavior === 'blur') {\n void validate()\n }\n }, [validationBehavior, validate, node])\n\n // ─── Cross-field reactive validation ─────────────────────────────────────\n // BUG-7 fix: track both dependsOn identity and their values separately\n const depsKey = dependsOn?.join(',') ?? ''\n // BUG-19 fix: use JSON.stringify for type-safe comparison\n const depsValues = dependsOn?.map((dep) => JSON.stringify(getValue(dep))).join('|') ?? ''\n\n useEffect(() => {\n if (!dependsOn || dependsOn.length === 0) return\n // When any depended field changes, re-validate this field\n if (touched || hasBlurredRef.current) {\n void validate()\n }\n }, [depsKey, depsValues, validate]) // BUG-B3 fix: added validate to prevent stale closure\n\n // ─── Cleanup debounce timer ──────────────────────────────────────────────\n useEffect(() => {\n return () => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n }\n }, [])\n\n // ─── Computed ────────────────────────────────────────────────────────────\n const value = getValue(name) ?? defaultValue\n const valid = errorStrings.length === 0\n const error = errorStrings[0] ?? null\n const showErrors = touched || meta.showErrors\n\n const fieldDisabled = disabled || meta.isDisabled\n\n // ─── fieldProps ──────────────────────────────────────────────────────────\n const fieldProps = useMemo(\n () => ({\n value: value ?? '',\n onChange,\n onBlur,\n 'aria-invalid': showErrors && !valid ? true : undefined,\n 'aria-describedby':\n showErrors && error ? `${fieldId}-error` : undefined,\n id: fieldId,\n name,\n disabled: fieldDisabled || undefined,\n }),\n [value, onChange, onBlur, showErrors, valid, error, fieldId, name, fieldDisabled]\n )\n\n return {\n value,\n error: showErrors ? error : null,\n errors: showErrors ? errorStrings : [],\n touched,\n dirty,\n valid,\n onChange,\n onBlur,\n fieldProps,\n id: fieldId,\n node,\n }\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction isZodSchema(\n validation: ValidationSpec\n): validation is ZodTypeAny {\n return (\n typeof validation === 'object' &&\n validation !== null &&\n '_def' in validation &&\n 'safeParse' in validation\n )\n}\n","// ─── useFormNode / useFormNodes ─────────────────────────────────────────────────\n// React hooks for accessing FormFoundryNode instances from the global registry.\n// Equivalent to FormKit's `useFormKitNodeById`.\n'use client'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { getNode, subscribeToRegistry } from '../node/globalRegistry'\nimport type { FormFoundryNode } from '../node/types'\n\n// ─── Subscription Engine ───────────────────────────────────────────────────────\n\n/**\n * Creates a subscription to a node's state-changing events.\n * Returns an unsubscribe function.\n */\nfunction subscribeToNode(\n node: FormFoundryNode,\n onChange: () => void\n): () => void {\n const unsubs = [\n node.events.on('commit', onChange),\n node.events.on('reset', onChange),\n node.events.on('message-added', onChange),\n node.events.on('message-removed', onChange),\n ]\n return () => unsubs.forEach((u) => u())\n}\n\n// ─── useFormNode ───────────────────────────────────────────────────────────────\n\n/**\n * React hook that resolves a FormFoundryNode by ID from the global registry.\n * Re-renders when the node's state changes (commit, reset, validation).\n * Automatically resolves deferred nodes via registry subscription.\n *\n * Equivalent to FormKit's `useFormKitNodeById`.\n *\n * @param id - The node ID to resolve, or undefined to skip\n * @returns The resolved node, or undefined if not found\n *\n * @example\n * ```tsx\n * const slotNode = useFormNode('slot-form')\n * if (slotNode?.dirty) { ... }\n * await slotNode?.submit()\n * ```\n */\nexport function useFormNode(\n id: string | undefined\n): FormFoundryNode | undefined {\n const [, forceRender] = useState(0)\n const nodeUnsubRef = useRef<(() => void) | null>(null)\n\n const triggerRender = useCallback(() => {\n forceRender((n) => n + 1)\n }, [])\n\n // Subscribe to node events when a node is available\n const subscribeToNodeEvents = useCallback(\n (node: FormFoundryNode) => {\n nodeUnsubRef.current?.()\n nodeUnsubRef.current = subscribeToNode(node, triggerRender)\n },\n [triggerRender]\n )\n\n useEffect(() => {\n if (!id) return\n\n // Try to resolve immediately\n const node = getNode(id)\n if (node) {\n subscribeToNodeEvents(node)\n }\n\n // Subscribe to registry for deferred resolution and unregistration\n const unsubRegistry = subscribeToRegistry((event, registeredId, registeredNode) => {\n if (registeredId !== id) return\n\n if (event === 'registered') {\n subscribeToNodeEvents(registeredNode)\n triggerRender()\n } else if (event === 'unregistered') {\n nodeUnsubRef.current?.()\n nodeUnsubRef.current = null\n triggerRender()\n }\n })\n\n return () => {\n unsubRegistry()\n nodeUnsubRef.current?.()\n nodeUnsubRef.current = null\n }\n }, [id, triggerRender, subscribeToNodeEvents])\n\n return id ? getNode(id) : undefined\n}\n\n// ─── useFormNodes ──────────────────────────────────────────────────────────────\n\n/**\n * React hook that resolves multiple FormFoundryNode instances by ID.\n * Re-renders when any tracked node's state changes.\n * Automatically resolves deferred nodes via registry subscription.\n *\n * @param ids - Array of node IDs to resolve\n * @returns A Map of ID → node (or undefined if not found)\n *\n * @example\n * ```tsx\n * const nodes = useFormNodes(['task-form', 'slot-form'])\n * const isDirty = [...nodes.values()].some(n => n?.dirty)\n * const canSave = [...nodes.values()].every(n => n?.valid ?? true)\n *\n * await Promise.allSettled(\n * [...nodes.values()].map(n => n?.submit())\n * )\n * ```\n */\nexport function useFormNodes(\n ids: string[]\n): Map<string, FormFoundryNode | undefined> {\n const [, forceRender] = useState(0)\n const nodeUnsubsRef = useRef<Map<string, () => void>>(new Map())\n\n const triggerRender = useCallback(() => {\n forceRender((n) => n + 1)\n }, [])\n\n // Track ids for deep comparison\n const idsKey = ids.join(',')\n\n useEffect(() => {\n // Cleanup all previous node subscriptions\n for (const unsub of nodeUnsubsRef.current.values()) {\n unsub()\n }\n nodeUnsubsRef.current.clear()\n\n const idSet = new Set(ids)\n\n // Subscribe to immediately available nodes\n for (const id of ids) {\n const node = getNode(id)\n if (node) {\n nodeUnsubsRef.current.set(id, subscribeToNode(node, triggerRender))\n }\n }\n\n // Subscribe to registry for deferred resolution and unregistration\n const unsubRegistry = subscribeToRegistry((event, registeredId, registeredNode) => {\n if (!idSet.has(registeredId)) return\n\n if (event === 'registered') {\n // Clean up any previous subscription for this ID\n nodeUnsubsRef.current.get(registeredId)?.()\n nodeUnsubsRef.current.set(\n registeredId,\n subscribeToNode(registeredNode, triggerRender)\n )\n triggerRender()\n } else if (event === 'unregistered') {\n nodeUnsubsRef.current.get(registeredId)?.()\n nodeUnsubsRef.current.delete(registeredId)\n triggerRender()\n }\n })\n\n return () => {\n unsubRegistry()\n for (const unsub of nodeUnsubsRef.current.values()) {\n unsub()\n }\n nodeUnsubsRef.current.clear()\n }\n }, [idsKey, triggerRender]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Build result map\n const result = new Map<string, FormFoundryNode | undefined>()\n for (const id of ids) {\n result.set(id, getNode(id))\n }\n return result\n}\n","// ─── useFormPrint Hook ──────────────────────────────────────────────────────────\n// Provides a `printForm()` function that renders a print-optimized overlay\n// of the current form and triggers `window.print()`.\n'use client'\n\nimport { useCallback, useRef } from 'react'\nimport { useFormMeta } from '../context/FormMetaContext'\nimport { useFormValues } from '../context/FormValuesContext'\nimport type { PrintFieldDescriptor, PrintMode, PrintOptions } from './types'\n\nexport interface UseFormPrintReturn {\n /** Trigger the browser print dialog with a print-optimized form view */\n printForm: (overrides?: PrintOptions) => void\n /** Get current field descriptors (useful for custom print UIs) */\n getFieldDescriptors: (mode?: PrintMode) => PrintFieldDescriptor[]\n}\n\n/**\n * Hook that provides form printing capabilities.\n * Must be used inside a `<Form>` component.\n *\n * @example\n * ```tsx\n * function MyForm() {\n * const { printForm } = useFormPrint({ title: 'Contact Form' })\n * return (\n * <Form onSubmit={handleSubmit}>\n * <TextInput name=\"name\" label=\"Name\" />\n * <button type=\"button\" onClick={() => printForm({ mode: 'blank' })}>\n * Print Blank\n * </button>\n * </Form>\n * )\n * }\n * ```\n */\nexport function useFormPrint(defaultOptions?: PrintOptions): UseFormPrintReturn {\n const { values } = useFormValues()\n const meta = useFormMeta()\n const printContainerRef = useRef<HTMLDivElement | null>(null)\n\n const getFieldDescriptors = useCallback(\n (_mode?: PrintMode): PrintFieldDescriptor[] => {\n const descriptors: PrintFieldDescriptor[] = []\n const formNode = meta.formNode\n\n if (!formNode) return descriptors\n\n // Iterate over registered child nodes to build field descriptors\n for (const child of formNode.children) {\n const name = child.name\n const config = child.config ?? {}\n const label = (config as Record<string, unknown>).label as string | undefined\n const type = child.type === 'input' ? ((config as Record<string, unknown>).inputType as string ?? 'text') : child.type\n\n // Skip group/list nodes — only render input nodes\n if (child.type !== 'input') continue\n\n const descriptor: PrintFieldDescriptor = {\n name,\n label: label ?? name,\n type: type,\n value: values[name],\n options: (config as Record<string, unknown>).options as PrintFieldDescriptor['options'],\n }\n\n descriptors.push(descriptor)\n }\n\n return descriptors\n },\n [meta.formNode, values]\n )\n\n const printForm = useCallback(\n (overrides?: PrintOptions) => {\n const options = { ...defaultOptions, ...overrides }\n const mode = options.mode ?? 'filled'\n const fields = getFieldDescriptors(mode)\n\n // Inject print CSS if not already present\n injectPrintCSS()\n\n // Create the print container\n const container = document.createElement('div')\n container.setAttribute('data-formfoundry-print-root', '')\n container.style.display = 'none'\n\n // Build the HTML content\n const resolvedMode = mode === 'current' ? 'filled' : mode\n container.innerHTML = buildPrintHTML(fields, resolvedMode, options)\n\n // Append to body\n document.body.appendChild(container)\n printContainerRef.current = container\n\n // Show container for print and trigger print\n container.style.display = 'block'\n\n // Use requestAnimationFrame to ensure DOM is painted before printing\n requestAnimationFrame(() => {\n window.print()\n\n // Clean up after print dialog closes\n setTimeout(() => {\n if (printContainerRef.current) {\n document.body.removeChild(printContainerRef.current)\n printContainerRef.current = null\n }\n }, 100)\n })\n },\n [defaultOptions, getFieldDescriptors]\n )\n\n return { printForm, getFieldDescriptors }\n}\n\n// ─── HTML Builder ───────────────────────────────────────────────────────────────\n// Builds static HTML for the print view (no React rendering needed for print overlay)\n\nfunction buildPrintHTML(\n fields: PrintFieldDescriptor[],\n mode: 'blank' | 'filled',\n options: PrintOptions\n): string {\n const header = options.title || options.subtitle\n ? `<div class=\"ff-print__header\">\n ${options.title ? `<h1 class=\"ff-print__title\">${escapeHtml(options.title)}</h1>` : ''}\n ${options.subtitle ? `<p class=\"ff-print__subtitle\">${escapeHtml(options.subtitle)}</p>` : ''}\n </div>`\n : ''\n\n const fieldRows = fields.map((field) => {\n const label = escapeHtml(field.label || field.name)\n const isTextarea = field.type === 'textarea'\n const fieldClass = `ff-print__field${isTextarea ? ' ff-print__field--textarea' : ''}`\n const valueHtml = mode === 'blank' ? buildBlankValue(field) : buildFilledValue(field)\n\n return `<li class=\"${fieldClass}\">\n <span class=\"ff-print__label\">${label}:</span>\n <span class=\"ff-print__value\">${valueHtml}</span>\n </li>`\n }).join('\\n')\n\n const footer = options.footer\n ? `<div class=\"ff-print__footer\">${escapeHtml(options.footer)}</div>`\n : ''\n\n return `<div class=\"ff-print${options.className ? ` ${options.className}` : ''}\">\n ${header}\n <ul class=\"ff-print__fields\">${fieldRows}</ul>\n ${footer}\n </div>`\n}\n\nfunction buildBlankValue(field: PrintFieldDescriptor): string {\n switch (field.type) {\n case 'checkbox':\n case 'switch':\n return '<span class=\"ff-print__blank-box\"></span>'\n\n case 'radio':\n return `<span class=\"ff-print__blank-options\">\n ${(field.options ?? []).map((opt) =>\n `<span class=\"ff-print__blank-option\"><span class=\"ff-print__blank-radio\"></span>${escapeHtml(opt.label)}</span>`\n ).join('')}\n </span>`\n\n case 'select':\n case 'checkboxgroup':\n return `<span class=\"ff-print__blank-options\">\n ${(field.options ?? []).map((opt) =>\n `<span class=\"ff-print__blank-option\"><span class=\"ff-print__blank-box\"></span>${escapeHtml(opt.label)}</span>`\n ).join('')}\n </span>`\n\n case 'textarea':\n return '<div class=\"ff-print__blank-textarea\"></div>'\n\n default:\n return '<span class=\"ff-print__blank-line\"></span>'\n }\n}\n\nfunction buildFilledValue(field: PrintFieldDescriptor): string {\n const { value, type } = field\n\n switch (type) {\n case 'checkbox':\n case 'switch':\n return `<span class=\"ff-print__filled-check\">${value ? '☑' : '☐'}</span>`\n\n case 'radio':\n case 'select': {\n const selected = field.options?.find(\n (opt) => String(opt.value) === String(value)\n )\n return `<span class=\"ff-print__filled-value\">${escapeHtml(selected?.label ?? String(value ?? '—'))}</span>`\n }\n\n case 'checkboxgroup': {\n const selectedValues = Array.isArray(value) ? value : []\n const labels = (field.options ?? [])\n .filter((opt) => selectedValues.includes(opt.value))\n .map((opt) => opt.label)\n return `<span class=\"ff-print__filled-value\">${escapeHtml(labels.length > 0 ? labels.join(', ') : '—')}</span>`\n }\n\n case 'textarea':\n return `<div class=\"ff-print__filled-textarea\">${escapeHtml(String(value ?? ''))}</div>`\n\n case 'file':\n return `<span class=\"ff-print__filled-value\">${value ? escapeHtml(String(value)) : 'No file selected'}</span>`\n\n case 'hidden':\n return ''\n\n default:\n return `<span class=\"ff-print__filled-value\">${value != null && value !== '' ? escapeHtml(String(value)) : '—'}</span>`\n }\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n}\n\n// ─── CSS Injection ──────────────────────────────────────────────────────────────\n// Injects the print stylesheet as a <style> tag in the document head.\n// Idempotent: only injects once.\n\nconst PRINT_STYLE_ID = 'formfoundry-print-css'\n\nfunction injectPrintCSS(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(PRINT_STYLE_ID)) return\n\n const style = document.createElement('style')\n style.id = PRINT_STYLE_ID\n style.textContent = PRINT_CSS\n document.head.appendChild(style)\n}\n\nconst PRINT_CSS = `\n@media print {\n body > *:not([data-formfoundry-print-root]) {\n display: none !important;\n }\n [data-formfoundry-print-root] {\n display: block !important;\n position: static !important;\n width: 100% !important;\n background: white !important;\n color: black !important;\n }\n}\n.ff-print {\n font-family: 'Georgia', 'Times New Roman', serif;\n font-size: 12pt;\n line-height: 1.5;\n color: #000;\n background: #fff;\n padding: 0.5in;\n max-width: 8.5in;\n margin: 0 auto;\n}\n.ff-print__header {\n text-align: center;\n margin-bottom: 1.5rem;\n padding-bottom: 0.75rem;\n border-bottom: 2px solid #000;\n}\n.ff-print__title {\n font-size: 18pt;\n font-weight: 700;\n margin: 0 0 0.25rem 0;\n}\n.ff-print__subtitle {\n font-size: 10pt;\n color: #555;\n margin: 0;\n font-style: italic;\n}\n.ff-print__fields {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n.ff-print__field {\n display: flex;\n align-items: baseline;\n padding: 0.4rem 0;\n border-bottom: 1px solid #e5e5e5;\n break-inside: avoid;\n page-break-inside: avoid;\n}\n.ff-print__field--textarea {\n flex-direction: column;\n align-items: stretch;\n}\n.ff-print__label {\n font-weight: 600;\n font-size: 10pt;\n min-width: 160px;\n flex-shrink: 0;\n color: #333;\n}\n.ff-print__value {\n flex: 1;\n font-size: 11pt;\n}\n.ff-print__blank-line {\n flex: 1;\n border-bottom: 1px solid #999;\n min-height: 1.2em;\n margin-left: 0.5rem;\n}\n.ff-print__blank-box {\n display: inline-block;\n width: 14px;\n height: 14px;\n border: 1.5px solid #666;\n vertical-align: middle;\n margin-right: 0.25rem;\n border-radius: 2px;\n}\n.ff-print__blank-radio {\n display: inline-block;\n width: 14px;\n height: 14px;\n border: 1.5px solid #666;\n vertical-align: middle;\n margin-right: 0.25rem;\n border-radius: 50%;\n}\n.ff-print__blank-textarea {\n border: 1px solid #999;\n min-height: 4em;\n margin-top: 0.35rem;\n border-radius: 2px;\n}\n.ff-print__blank-options {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n margin-left: 0.5rem;\n}\n.ff-print__blank-option {\n display: flex;\n align-items: center;\n gap: 0.35rem;\n font-size: 10pt;\n}\n.ff-print__filled-value {\n font-size: 11pt;\n margin-left: 0.5rem;\n}\n.ff-print__filled-check {\n font-size: 13pt;\n margin-left: 0.5rem;\n}\n.ff-print__filled-textarea {\n white-space: pre-wrap;\n font-size: 10pt;\n margin-top: 0.35rem;\n padding: 0.35rem;\n background: #fafafa;\n border: 1px solid #e0e0e0;\n border-radius: 2px;\n min-height: 2em;\n}\n.ff-print__footer {\n margin-top: 2rem;\n padding-top: 0.75rem;\n border-top: 1px solid #ccc;\n font-size: 9pt;\n color: #888;\n text-align: center;\n}\n.ff-print--preview {\n border: 1px solid #ddd;\n border-radius: 8px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);\n margin: 1rem 0;\n}\n`\n","// ─── Input Registry ────────────────────────────────────────────────────────────\n// Context-based, not global. Avoids SSR hydration issues, testing isolation\n// problems, and import-order dependencies.\n'use client'\n\nimport React, { createContext, useContext } from 'react'\nimport type { FormFoundryInputProps } from '../adapter/types'\n\n// ─── Registry Interface ────────────────────────────────────────────────────────\n\nexport interface InputRegistry {\n /** Register a component for a type key */\n register: (\n type: string,\n component: React.ComponentType<FormFoundryInputProps>\n ) => void\n /** Get a registered component by type key */\n get: (type: string) => React.ComponentType<FormFoundryInputProps> | undefined\n /** Check if a type key is registered */\n has: (type: string) => boolean\n /** List all registered type keys */\n keys: () => string[]\n}\n\n// ─── Context ───────────────────────────────────────────────────────────────────\n\nexport const InputRegistryContext = createContext<InputRegistry | null>(null)\n\nexport function useInputRegistry(): InputRegistry {\n const registry = useContext(InputRegistryContext)\n if (!registry) {\n throw new Error(\n '[FormFoundry] useInputRegistry must be used within a <FormFoundryProvider>. ' +\n 'Wrap your application or form tree with <FormFoundryProvider>.'\n )\n }\n return registry\n}\n\n// ─── Factory ───────────────────────────────────────────────────────────────────\n\n/**\n * Create a new InputRegistry instance.\n * Pass initial entries as a record of type → component.\n */\nexport function createRegistry(\n entries?: Record<string, React.ComponentType<FormFoundryInputProps>>\n): InputRegistry {\n const map = new Map<string, React.ComponentType<FormFoundryInputProps>>()\n\n if (entries) {\n for (const [type, component] of Object.entries(entries)) {\n map.set(type, component)\n }\n }\n\n return {\n register(type, component) {\n map.set(type, component)\n },\n get(type) {\n return map.get(type)\n },\n has(type) {\n return map.has(type)\n },\n keys() {\n return [...map.keys()]\n },\n }\n}\n\n/**\n * Create the default (empty) registry.\n * Adapter packages add their inputs via the registry.\n */\nexport function createDefaultRegistry(): InputRegistry {\n return createRegistry()\n}\n","// ─── FormFoundryProvider ─────────────────────────────────────────────────────────\n// Global configuration wrapper. Establishes config inheritance root,\n// input registry, and global plugins.\n'use client'\n\nimport React, { createContext, useContext, useMemo } from 'react'\nimport type { FormFoundryLocale } from '../i18n/index'\nimport type { FormFoundryGlobalConfig, FormFoundryPlugin, ValidationBehavior } from '../node/types'\nimport type { InputRegistry } from '../registry/index'\nimport { createDefaultRegistry, InputRegistryContext } from '../registry/index'\n\n// ─── Provider Context ──────────────────────────────────────────────────────────\n\nexport interface FormFoundryProviderValue {\n config?: FormFoundryGlobalConfig\n plugins?: FormFoundryPlugin[]\n}\n\nconst FormFoundryProviderContext = createContext<FormFoundryProviderValue>({})\n\nexport function useFormFoundryProvider(): FormFoundryProviderValue {\n return useContext(FormFoundryProviderContext)\n}\n\n// ─── Props ─────────────────────────────────────────────────────────────────────\n\nexport interface FormFoundryProviderProps {\n config?: {\n validationBehavior?: ValidationBehavior\n validationDebounce?: number\n classConfig?: Record<string, string>\n messages?: Record<string, string | ((args: string[]) => string)>\n }\n /** Active locale for i18n message resolution */\n locale?: FormFoundryLocale\n registry?: InputRegistry\n plugins?: FormFoundryPlugin[]\n children: React.ReactNode\n}\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\nexport function FormFoundryProvider({\n config,\n locale,\n registry,\n plugins,\n children,\n}: FormFoundryProviderProps) {\n const inputRegistry = useMemo(\n () => registry ?? createDefaultRegistry(),\n [registry]\n )\n\n const providerValue = useMemo<FormFoundryProviderValue>(\n () => ({\n config: config ? { ...config, locale } : locale ? { locale } : undefined,\n plugins,\n }),\n [config, locale, plugins]\n )\n\n return (\n <FormFoundryProviderContext.Provider value={providerValue}>\n <InputRegistryContext.Provider value={inputRegistry}>\n {children}\n </InputRegistryContext.Provider>\n </FormFoundryProviderContext.Provider>\n )\n}\n","// ─── Form Component ────────────────────────────────────────────────────────────\n// The headless form wrapper. Creates a group node, manages aggregate state,\n// orchestrates validation, and handles submission.\n'use client'\n\nimport React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useReducer,\n useRef,\n useState,\n type FormEvent,\n} from 'react'\nimport type { ZodTypeAny } from 'zod'\nimport { FormMetaContext, type FormMetaContextValue } from '../context/FormMetaContext'\nimport { FormValuesContext, type FormValuesContextValue } from '../context/FormValuesContext'\nimport { createNode } from '../node/index'\nimport type { FormFoundryNode, FormFoundryPlugin, ValidationBehavior } from '../node/types'\nimport type { PrintOptions } from '../print/types'\nimport { useFormPrint } from '../print/useFormPrint'\nimport type { FormFoundryResolver } from '../resolvers/zodResolver'\nimport { validateFormWithZod } from '../validation/zodAdapter'\nimport { useFormFoundryProvider } from './FormFoundryProvider'\n\n// ─── State ─────────────────────────────────────────────────────────────────────\n\ninterface FormState {\n values: Record<string, unknown>\n isSubmitting: boolean\n showErrors: boolean\n submitCount: number\n externalErrors: Record<string, string[]>\n}\n\ntype FormAction =\n | { type: 'SET_VALUE'; name: string; value: unknown }\n | { type: 'SET_VALUES'; values: Record<string, unknown> }\n | { type: 'SET_SUBMITTING'; isSubmitting: boolean }\n | { type: 'SHOW_ERRORS' }\n | { type: 'RESET'; values: Record<string, unknown> }\n | { type: 'INCREMENT_SUBMIT_COUNT' }\n | { type: 'SET_EXTERNAL_ERRORS'; errors: Record<string, string[]> }\n | { type: 'CLEAR_EXTERNAL_ERRORS' }\n\nfunction formReducer(state: FormState, action: FormAction): FormState {\n switch (action.type) {\n case 'SET_VALUE':\n return {\n ...state,\n values: { ...state.values, [action.name]: action.value },\n }\n case 'SET_VALUES':\n return { ...state, values: action.values }\n case 'SET_SUBMITTING':\n return { ...state, isSubmitting: action.isSubmitting }\n case 'SHOW_ERRORS':\n return { ...state, showErrors: true }\n case 'RESET':\n return {\n values: action.values,\n isSubmitting: false,\n showErrors: false,\n submitCount: 0,\n externalErrors: {},\n }\n case 'INCREMENT_SUBMIT_COUNT':\n return { ...state, submitCount: state.submitCount + 1 }\n case 'SET_EXTERNAL_ERRORS':\n return { ...state, externalErrors: action.errors }\n case 'CLEAR_EXTERNAL_ERRORS':\n return { ...state, externalErrors: {} }\n default:\n return state\n }\n}\n\n// ─── Imperative Handle ─────────────────────────────────────────────────────────\n\n/**\n * Imperative handle for programmatic form control.\n * Access via React ref or via `getNode(id).submit()` on the form's node.\n */\nexport interface FormFoundryHandle {\n /** Programmatically trigger validation + submission. */\n submit: () => Promise<void>\n /** Reset the form to default (or provided) values. */\n reset: (values?: Record<string, unknown>) => void\n /** Get a snapshot of current form values. */\n getValues: () => Record<string, unknown>\n /** Check if all fields are currently valid. */\n isValid: () => boolean\n /** Print the form in the specified mode ('blank' | 'filled' | 'current'). */\n printForm: (options?: PrintOptions) => void\n}\n\n// ─── Props ─────────────────────────────────────────────────────────────────────\n\nexport interface FormProps {\n /** Stable form ID — enables `getNode(id).submit()` for cross-form coordination */\n id?: string\n /** React ref for imperative access (convenience wrapper over node API) */\n ref?: React.Ref<FormFoundryHandle>\n /** Called on successful submission with all form values */\n onSubmit: (values: Record<string, unknown>) => void | Promise<void>\n /** Called on every submit attempt, even if validation fails */\n onSubmitRaw?: (values: Record<string, unknown>) => void\n /** Initial field values */\n defaultValues?: Record<string, unknown>\n /** Form-level Zod schema validation */\n schema?: ZodTypeAny\n /** Alternative resolver pattern (React Hook Form style) */\n resolver?: FormFoundryResolver\n /** Plugins applied to all fields in this form */\n plugins?: FormFoundryPlugin[]\n /** Default validation behavior for all fields */\n validationBehavior?: ValidationBehavior\n /** Show error summary on submit failure */\n showErrors?: boolean\n /** Auto-disable all fields during submission (default: true) */\n disableOnSubmit?: boolean\n /** Render as a different element (default: 'form') */\n as?: React.ElementType\n /** Children */\n children: React.ReactNode\n /** Optional className */\n className?: string\n}\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\nexport function Form({\n id: formId,\n ref,\n onSubmit,\n onSubmitRaw,\n defaultValues = {},\n schema,\n resolver,\n plugins,\n validationBehavior,\n showErrors: showErrorsProp,\n disableOnSubmit = true,\n as: Component = 'form',\n children,\n className,\n}: FormProps) {\n const providerConfig = useFormFoundryProvider()\n\n const [state, dispatch] = useReducer(formReducer, {\n values: defaultValues,\n isSubmitting: false,\n showErrors: false,\n submitCount: 0,\n externalErrors: {},\n })\n\n // BUG-30/31 fix: counter that increments when any field validation completes,\n // forcing aggregatedErrors and isValid memos to recompute\n const [validationVersion, setValidationVersion] = useState(0)\n\n // ─── Node Registry ─────────────────────────────────────────────────────\n const nodesRef = useRef<Map<string, FormFoundryNode>>(new Map())\n // BUG-22 fix: store validate callbacks so triggerValidation can invoke them\n const validateCallbacksRef = useRef<Map<string, () => Promise<void>>>(new Map())\n\n // ─── Form Root Node ─────────────────────────────────────────────────────\n const formNodeRef = useRef<FormFoundryNode | null>(null)\n if (!formNodeRef.current) {\n formNodeRef.current = createNode({\n type: 'group',\n name: '__form__',\n id: formId,\n value: defaultValues,\n config: {\n validationBehavior: validationBehavior ?? providerConfig.config?.validationBehavior,\n plugins: [...(providerConfig.plugins ?? []), ...(plugins ?? [])],\n },\n })\n }\n\n // ─── Default Values Ref (for reset) ────────────────────────────────────\n const defaultValuesRef = useRef(defaultValues)\n defaultValuesRef.current = defaultValues\n\n // ─── Values Context ─────────────────────────────────────────────────────\n const valuesContext = useMemo<FormValuesContextValue>(\n () => ({\n values: state.values,\n getValue: (name: string) => state.values[name],\n setValue: (name: string, value: unknown) => {\n dispatch({ type: 'SET_VALUE', name, value })\n },\n }),\n [state.values]\n )\n\n // BUG-21 fix: stable ref for latest values to avoid stale closure in performSubmit\n const valuesRef = useRef(state.values)\n valuesRef.current = state.values\n\n // BUG-37 fix: stable ref for external errors to avoid recreating imperative handle every keystroke\n const externalErrorsRef = useRef(state.externalErrors)\n externalErrorsRef.current = state.externalErrors\n\n // ─── Meta Context ──────────────────────────────────────────────────────\n // BUG-29 fix: register only attaches node to tree (guards double-add)\n const register = useCallback((name: string, node: FormFoundryNode) => {\n nodesRef.current.set(name, node)\n // Guard: only add to tree if not already a child\n if (formNodeRef.current && !formNodeRef.current.children.includes(node)) {\n formNodeRef.current.addChild(node)\n }\n }, [])\n\n // BUG-29 fix: separate callback for updating validate without re-registration\n const updateValidateCallback = useCallback((name: string, validate: () => Promise<void>) => {\n // BUG-30/31 fix: wrap validate to bump validationVersion on completion\n const wrappedValidate = async () => {\n await validate()\n setValidationVersion(v => v + 1)\n }\n validateCallbacksRef.current.set(name, wrappedValidate)\n }, [])\n\n const unregister = useCallback((name: string) => {\n const node = nodesRef.current.get(name)\n if (node) {\n formNodeRef.current?.removeChild(node)\n }\n nodesRef.current.delete(name)\n validateCallbacksRef.current.delete(name)\n }, [])\n\n const getNode = useCallback(\n (name: string) => nodesRef.current.get(name),\n []\n )\n\n const triggerValidation = useCallback(\n async (name?: string): Promise<boolean> => {\n if (name) {\n // BUG-22 fix: run the field's validate callback if available\n const validateFn = validateCallbacksRef.current.get(name)\n if (validateFn) {\n await validateFn()\n }\n const node = nodesRef.current.get(name)\n return node ? node.valid : true\n }\n\n // BUG-22 fix: run validation on ALL fields (critical for 'submit' behavior)\n const validationPromises: Promise<void>[] = []\n for (const validateFn of validateCallbacksRef.current.values()) {\n validationPromises.push(validateFn())\n }\n await Promise.all(validationPromises)\n\n // Now check validity after validation has actually run\n let allValid = true\n for (const node of nodesRef.current.values()) {\n if (!node.valid) {\n allValid = false\n }\n }\n\n // Form-level schema validation\n if (schema) {\n const formErrors = validateFormWithZod(schema, valuesRef.current)\n if (Object.keys(formErrors).length > 0) {\n allValid = false\n }\n }\n\n // Resolver validation\n if (resolver) {\n const result = await resolver(valuesRef.current)\n if (Object.keys(result.errors).length > 0) {\n allValid = false\n }\n }\n\n return allValid\n },\n [schema, resolver]\n )\n\n // ─── Reset ─────────────────────────────────────────────────────────────\n const reset = useCallback((values?: Record<string, unknown>) => {\n const resetValues = values ?? defaultValuesRef.current\n\n // BUG-20 fix: call node.reset() so 'reset' events are emitted\n // and config.defaultValue is properly consulted\n for (const [fieldName, node] of nodesRef.current) {\n node.reset(resetValues[fieldName])\n }\n\n dispatch({ type: 'RESET', values: resetValues })\n }, [])\n\n // ─── External Errors ───────────────────────────────────────────────────\n const setExternalErrors = useCallback((errors: Record<string, string | string[]>) => {\n const normalized: Record<string, string[]> = {}\n for (const [key, val] of Object.entries(errors)) {\n normalized[key] = Array.isArray(val) ? val : [val]\n }\n dispatch({ type: 'SET_EXTERNAL_ERRORS', errors: normalized })\n }, [])\n\n const clearExternalErrors = useCallback(() => {\n dispatch({ type: 'CLEAR_EXTERNAL_ERRORS' })\n }, [])\n\n // Compute aggregated errors (field errors + external errors)\n const aggregatedErrors = useMemo(() => {\n const errors: Record<string, string[]> = {}\n\n // Field-level errors from nodes\n for (const [name, node] of nodesRef.current) {\n if (node.errors.length > 0) {\n errors[name] = [...node.errors]\n }\n }\n\n // Merge external errors\n for (const [name, extErrors] of Object.entries(state.externalErrors)) {\n if (!errors[name]) {\n errors[name] = []\n }\n errors[name].push(...extErrors)\n }\n\n return errors\n }, [state.values, state.externalErrors, validationVersion]) // BUG-30 fix: recompute after validation\n\n const isValid = useMemo(() => {\n for (const node of nodesRef.current.values()) {\n if (!node.valid) return false\n }\n return Object.keys(state.externalErrors).length === 0\n }, [state.values, state.externalErrors, validationVersion]) // BUG-31 fix: recompute after validation\n\n const isDisabled = disableOnSubmit && state.isSubmitting\n\n const metaContext = useMemo<FormMetaContextValue>(\n () => ({\n isSubmitting: state.isSubmitting,\n isValid,\n errors: aggregatedErrors,\n register,\n unregister,\n updateValidateCallback,\n getNode,\n triggerValidation,\n showErrors: state.showErrors || (showErrorsProp ?? false),\n config: {\n ...providerConfig.config,\n validationBehavior: validationBehavior ?? providerConfig.config?.validationBehavior,\n },\n formNode: formNodeRef.current,\n reset,\n submitCount: state.submitCount,\n setExternalErrors,\n clearExternalErrors,\n isDisabled,\n }),\n [\n state.isSubmitting,\n state.showErrors,\n state.submitCount,\n state.externalErrors,\n isValid,\n isDisabled,\n aggregatedErrors,\n register,\n unregister,\n updateValidateCallback,\n getNode,\n triggerValidation,\n showErrorsProp,\n providerConfig.config,\n validationBehavior,\n reset,\n setExternalErrors,\n clearExternalErrors,\n ]\n )\n\n // ─── Core Submit Logic ──────────────────────────────────────────────────\n // Shared by both DOM form submit and imperative node.submit() / ref.submit()\n const performSubmit = useCallback(\n async () => {\n dispatch({ type: 'INCREMENT_SUBMIT_COUNT' })\n\n // BUG-21 fix: use valuesRef.current for latest values\n // Fire onSubmitRaw regardless of validity\n onSubmitRaw?.(valuesRef.current)\n\n // Show errors on submit attempt\n dispatch({ type: 'SHOW_ERRORS' })\n\n // Run validation on all fields\n const valid = await triggerValidation()\n if (!valid) return\n\n dispatch({ type: 'SET_SUBMITTING', isSubmitting: true })\n\n try {\n // Run submit hook on form node\n const formNode = formNodeRef.current\n const currentValues = valuesRef.current\n const values = formNode\n ? (formNode.hooks.submit.dispatch({ ...currentValues }) as Record<string, unknown>)\n : currentValues\n\n await onSubmit(values)\n } finally {\n dispatch({ type: 'SET_SUBMITTING', isSubmitting: false })\n }\n },\n [triggerValidation, onSubmit, onSubmitRaw]\n )\n\n // DOM form submit handler\n const handleSubmit = useCallback(\n async (e: FormEvent) => {\n e.preventDefault()\n await performSubmit()\n },\n [performSubmit]\n )\n\n // ─── Wire node.submit() ────────────────────────────────────────────────\n // This enables getNode(id).submit() for cross-form coordination\n useEffect(() => {\n const formNode = formNodeRef.current\n if (formNode) {\n formNode.submit = performSubmit\n }\n }, [performSubmit])\n\n // ─── Print Integration ──────────────────────────────────────────────────\n const { printForm } = useFormPrint()\n\n // ─── Imperative Handle (convenience ref) ───────────────────────────────\n // BUG-37 fix: use refs so handle is only recreated when stable callbacks change\n useImperativeHandle(ref, () => ({\n submit: performSubmit,\n reset,\n getValues: () => ({ ...valuesRef.current }),\n isValid: () => {\n for (const node of nodesRef.current.values()) {\n if (!node.valid) return false\n }\n return Object.keys(externalErrorsRef.current).length === 0\n },\n printForm,\n }), [performSubmit, reset, printForm])\n\n return (\n <FormValuesContext.Provider value={valuesContext}>\n <FormMetaContext.Provider value={metaContext}>\n <Component\n onSubmit={Component === 'form' ? handleSubmit : undefined}\n className={className}\n noValidate={Component === 'form' ? true : undefined}\n >\n {children}\n </Component>\n </FormMetaContext.Provider>\n </FormValuesContext.Provider>\n )\n}\n\n","// ─── Schema Expressions ────────────────────────────────────────────────────────\n// A mini expression language for computed attributes, children, and bindings\n// within FormFoundry schemas. Inspired by FormKit's `$:` expression prefix.\n//\n// Supported syntax:\n// - Variable references: `$name`, `$formValues.email`\n// - String literals: `'hello'`, `\"world\"`\n// - Numeric literals: `42`, `3.14`\n// - Boolean literals: `true`, `false`\n// - String concatenation: `\"Qty: \" + $count`\n// - Arithmetic: `$a + $b`, `$a - $b`, `$a * $b`, `$a / $b`, `$a % $b`\n// - Comparisons: `$a === $b`, `$a !== $b`, `$a > $b`, `$a < $b`, `$a >= $b`, `$a <= $b`\n// - Logical: `$a && $b`, `$a || $b`, `!$a`\n// - Ternary: `$isActive ? 'Yes' : 'No'`\n// - Property access: `$user.name`, `$items.length`\n// - Grouping: `($a + $b) * $c`\n//\n// Usage:\n// isExpression('$: \"Hello \" + $name') // true\n// evaluateExpression('$: \"Hello \" + $name', { name: 'World' }) // 'Hello World'\n// resolveExpressionValue('$name', data) // value of data.name\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\n/**\n * Expression prefix. Strings starting with this are treated as expressions.\n */\nexport const EXPRESSION_PREFIX = '$: '\n\n/**\n * Check if a value is an expression string (starts with `$: `).\n */\nexport function isExpression(value: unknown): value is string {\n return typeof value === 'string' && value.startsWith(EXPRESSION_PREFIX)\n}\n\n/**\n * Check if a value is a simple variable reference (starts with `$` but not `$: `).\n */\nexport function isVariableRef(value: unknown): value is string {\n return (\n typeof value === 'string' &&\n value.startsWith('$') &&\n !value.startsWith('$: ') &&\n !value.startsWith('$el') &&\n !value.startsWith('$cmp') &&\n !value.startsWith('$formfoundry')\n )\n}\n\n// ─── Token Types ───────────────────────────────────────────────────────────────\n\ntype TokenType =\n | 'number'\n | 'string'\n | 'boolean'\n | 'variable'\n | 'operator'\n | 'paren'\n | 'ternary_q'\n | 'ternary_c'\n | 'not'\n | 'dot'\n\ninterface Token {\n type: TokenType\n value: string | number | boolean\n}\n\n// ─── Tokenizer ─────────────────────────────────────────────────────────────────\n\nfunction tokenize(expr: string): Token[] {\n const tokens: Token[] = []\n let i = 0\n\n while (i < expr.length) {\n const ch = expr[i]!\n\n // Whitespace\n if (/\\s/.test(ch)) {\n i++\n continue\n }\n\n // Numbers\n if (/[0-9]/.test(ch) || (ch === '.' && i + 1 < expr.length && /[0-9]/.test(expr[i + 1]!))) {\n let num = ''\n while (i < expr.length && /[0-9.]/.test(expr[i]!)) {\n num += expr[i]!\n i++\n }\n tokens.push({ type: 'number', value: parseFloat(num) })\n continue\n }\n\n // String literal (single or double quotes)\n if (ch === \"'\" || ch === '\"') {\n const quote = ch\n i++\n let str = ''\n while (i < expr.length && expr[i] !== quote) {\n if (expr[i] === '\\\\' && i + 1 < expr.length) {\n i++\n str += expr[i]\n } else {\n str += expr[i]\n }\n i++\n }\n i++ // closing quote\n tokens.push({ type: 'string', value: str })\n continue\n }\n\n // Variable reference (`$name`, `$user.name`, `$user.address.city`)\n if (ch === '$') {\n i++ // skip $\n let varName = ''\n while (i < expr.length && /[a-zA-Z0-9_]/.test(expr[i]!)) {\n varName += expr[i]!\n i++\n }\n // Consume dot-delimited path segments (e.g., $user.name.first)\n while (i < expr.length && expr[i] === '.' && i + 1 < expr.length && /[a-zA-Z_]/.test(expr[i + 1]!)) {\n varName += '.'\n i++ // skip dot\n while (i < expr.length && /[a-zA-Z0-9_]/.test(expr[i]!)) {\n varName += expr[i]!\n i++\n }\n }\n tokens.push({ type: 'variable', value: varName })\n continue\n }\n\n // Boolean literals\n if (expr.slice(i, i + 4) === 'true' && (i + 4 >= expr.length || !/[a-zA-Z0-9_]/.test(expr[i + 4]!))) {\n tokens.push({ type: 'boolean', value: true })\n i += 4\n continue\n }\n if (expr.slice(i, i + 5) === 'false' && (i + 5 >= expr.length || !/[a-zA-Z0-9_]/.test(expr[i + 5]!))) {\n tokens.push({ type: 'boolean', value: false })\n i += 5\n continue\n }\n\n // Multi-character operators\n if (expr.slice(i, i + 3) === '===' || expr.slice(i, i + 3) === '!==') {\n tokens.push({ type: 'operator', value: expr.slice(i, i + 3) })\n i += 3\n continue\n }\n if (\n expr.slice(i, i + 2) === '&&' ||\n expr.slice(i, i + 2) === '||' ||\n expr.slice(i, i + 2) === '>=' ||\n expr.slice(i, i + 2) === '<='\n ) {\n tokens.push({ type: 'operator', value: expr.slice(i, i + 2) })\n i += 2\n continue\n }\n\n // Single char operators\n if (ch === '+' || ch === '-' || ch === '*' || ch === '/' || ch === '%' || ch === '>' || ch === '<') {\n tokens.push({ type: 'operator', value: ch })\n i++\n continue\n }\n\n // Dot (property access)\n if (ch === '.') {\n tokens.push({ type: 'dot', value: '.' })\n i++\n continue\n }\n\n // Ternary\n if (ch === '?') {\n tokens.push({ type: 'ternary_q', value: '?' })\n i++\n continue\n }\n if (ch === ':') {\n tokens.push({ type: 'ternary_c', value: ':' })\n i++\n continue\n }\n\n // Parens\n if (ch === '(' || ch === ')') {\n tokens.push({ type: 'paren', value: ch })\n i++\n continue\n }\n\n // Logical NOT\n if (ch === '!' && (i + 1 >= expr.length || expr[i + 1] !== '=')) {\n tokens.push({ type: 'not', value: '!' })\n i++\n continue\n }\n\n // Unknown — skip\n i++\n }\n\n return tokens\n}\n\n// ─── Parser (recursive descent) ────────────────────────────────────────────────\n// Precedence (low → high):\n// ternary → or → and → equality → comparison → additive → multiplicative → unary → primary\n\ntype ASTNode =\n | { kind: 'literal'; value: unknown }\n | { kind: 'variable'; path: string[] }\n | { kind: 'binary'; op: string; left: ASTNode; right: ASTNode }\n | { kind: 'unary'; op: string; operand: ASTNode }\n | { kind: 'ternary'; condition: ASTNode; consequent: ASTNode; alternate: ASTNode }\n\nclass Parser {\n private pos = 0\n constructor(private tokens: Token[]) { }\n\n parse(): ASTNode {\n const ast = this.parseTernary()\n return ast\n }\n\n private peek(): Token | undefined {\n return this.tokens[this.pos]\n }\n\n private consume(): Token {\n return this.tokens[this.pos++]!\n }\n\n private parseTernary(): ASTNode {\n let node = this.parseOr()\n if (this.peek()?.type === 'ternary_q') {\n this.consume() // ?\n const consequent = this.parseTernary()\n if (this.peek()?.type === 'ternary_c') {\n this.consume() // :\n }\n const alternate = this.parseTernary()\n node = { kind: 'ternary', condition: node, consequent, alternate }\n }\n return node\n }\n\n private parseOr(): ASTNode {\n let node = this.parseAnd()\n while (this.peek()?.type === 'operator' && this.peek()?.value === '||') {\n const op = this.consume().value as string\n const right = this.parseAnd()\n node = { kind: 'binary', op, left: node, right }\n }\n return node\n }\n\n private parseAnd(): ASTNode {\n let node = this.parseEquality()\n while (this.peek()?.type === 'operator' && this.peek()?.value === '&&') {\n const op = this.consume().value as string\n const right = this.parseEquality()\n node = { kind: 'binary', op, left: node, right }\n }\n return node\n }\n\n private parseEquality(): ASTNode {\n let node = this.parseComparison()\n while (\n this.peek()?.type === 'operator' &&\n (this.peek()?.value === '===' || this.peek()?.value === '!==')\n ) {\n const op = this.consume().value as string\n const right = this.parseComparison()\n node = { kind: 'binary', op, left: node, right }\n }\n return node\n }\n\n private parseComparison(): ASTNode {\n let node = this.parseAdditive()\n while (\n this.peek()?.type === 'operator' &&\n (this.peek()?.value === '>' ||\n this.peek()?.value === '<' ||\n this.peek()?.value === '>=' ||\n this.peek()?.value === '<=')\n ) {\n const op = this.consume().value as string\n const right = this.parseAdditive()\n node = { kind: 'binary', op, left: node, right }\n }\n return node\n }\n\n private parseAdditive(): ASTNode {\n let node = this.parseMultiplicative()\n while (\n this.peek()?.type === 'operator' &&\n (this.peek()?.value === '+' || this.peek()?.value === '-')\n ) {\n const op = this.consume().value as string\n const right = this.parseMultiplicative()\n node = { kind: 'binary', op, left: node, right }\n }\n return node\n }\n\n private parseMultiplicative(): ASTNode {\n let node = this.parseUnary()\n while (\n this.peek()?.type === 'operator' &&\n (this.peek()?.value === '*' || this.peek()?.value === '/' || this.peek()?.value === '%')\n ) {\n const op = this.consume().value as string\n const right = this.parseUnary()\n node = { kind: 'binary', op, left: node, right }\n }\n return node\n }\n\n private parseUnary(): ASTNode {\n if (this.peek()?.type === 'not') {\n this.consume()\n const operand = this.parseUnary()\n return { kind: 'unary', op: '!', operand }\n }\n return this.parsePrimary()\n }\n\n private parsePrimary(): ASTNode {\n const token = this.peek()\n\n if (!token) {\n return { kind: 'literal', value: undefined }\n }\n\n // Parenthesized expression\n if (token.type === 'paren' && token.value === '(') {\n this.consume()\n const node = this.parseTernary()\n if (this.peek()?.type === 'paren' && this.peek()?.value === ')') {\n this.consume()\n }\n return node\n }\n\n // Literals\n if (token.type === 'number' || token.type === 'string' || token.type === 'boolean') {\n this.consume()\n return { kind: 'literal', value: token.value }\n }\n\n // Variable (path may include dots, e.g., token value \"user.name\")\n if (token.type === 'variable') {\n this.consume()\n const path = (token.value as string).split('.')\n return { kind: 'variable', path }\n }\n\n // Fallback\n this.consume()\n return { kind: 'literal', value: undefined }\n }\n}\n\n// ─── Evaluator ─────────────────────────────────────────────────────────────────\n\nfunction resolvePath(data: Record<string, unknown>, path: string[]): unknown {\n let current: unknown = data\n for (const segment of path) {\n if (current == null || typeof current !== 'object') return undefined\n current = (current as Record<string, unknown>)[segment]\n }\n return current\n}\n\nfunction evaluate(ast: ASTNode, data: Record<string, unknown>): unknown {\n switch (ast.kind) {\n case 'literal':\n return ast.value\n\n case 'variable':\n return resolvePath(data, ast.path)\n\n case 'unary': {\n const val = evaluate(ast.operand, data)\n if (ast.op === '!') return !val\n return val\n }\n\n case 'binary': {\n const left = evaluate(ast.left, data)\n const right = evaluate(ast.right, data)\n\n switch (ast.op) {\n case '+': {\n if (typeof left === 'string' || typeof right === 'string') {\n return String(left ?? '') + String(right ?? '')\n }\n return (left as number) + (right as number)\n }\n case '-': return (left as number) - (right as number)\n case '*': return (left as number) * (right as number)\n case '/': return (right as number) !== 0 ? (left as number) / (right as number) : 0\n case '%': return (right as number) !== 0 ? (left as number) % (right as number) : 0\n case '===': return left === right\n case '!==': return left !== right\n case '>': return (left as number) > (right as number)\n case '<': return (left as number) < (right as number)\n case '>=': return (left as number) >= (right as number)\n case '<=': return (left as number) <= (right as number)\n case '&&': return left && right\n case '||': return left || right\n default: return undefined\n }\n }\n\n case 'ternary': {\n const condition = evaluate(ast.condition, data)\n return condition\n ? evaluate(ast.consequent, data)\n : evaluate(ast.alternate, data)\n }\n }\n}\n\n// ─── Public API ────────────────────────────────────────────────────────────────\n\n/**\n * Evaluate a `$: ` prefixed expression string against a data context.\n *\n * ```ts\n * evaluateExpression('$: \"Hello \" + $name', { name: 'World' })\n * // → 'Hello World'\n * ```\n */\nexport function evaluateExpression(\n expression: string,\n data: Record<string, unknown>\n): unknown {\n const raw = expression.startsWith(EXPRESSION_PREFIX)\n ? expression.slice(EXPRESSION_PREFIX.length)\n : expression\n const tokens = tokenize(raw)\n const parser = new Parser(tokens)\n const ast = parser.parse()\n return evaluate(ast, data)\n}\n\n/**\n * Resolve a `$variable` reference against a data context.\n *\n * ```ts\n * resolveVariableRef('$user.name', { user: { name: 'Alice' } })\n * // → 'Alice'\n * ```\n */\nexport function resolveVariableRef(\n ref: string,\n data: Record<string, unknown>\n): unknown {\n const path = ref.slice(1).split('.') // remove leading $\n return resolvePath(data, path)\n}\n\n/**\n * Resolve any schema value — if it's an expression or variable ref, evaluate it.\n * Otherwise return it as-is.\n */\nexport function resolveSchemaValue(\n value: unknown,\n data: Record<string, unknown>\n): unknown {\n if (isExpression(value)) {\n return evaluateExpression(value, data)\n }\n if (isVariableRef(value)) {\n return resolveVariableRef(value, data)\n }\n return value\n}\n","// ─── Schema Renderer ───────────────────────────────────────────────────────────\n// Renders forms from declarative JSON schemas.\n// Supports node types: $formfoundry, $el, $cmp\n// Supports control flow: if predicate, if/then/else objects, for loops\n// Supports reactive data binding via `data` prop\n'use client'\n\nimport React, { createContext, useContext, useMemo } from 'react'\nimport type { FormFoundryInputProps } from '../adapter/types'\nimport { useFormValues } from '../context/FormValuesContext'\nimport { useInputRegistry } from '../registry/index'\nimport { isExpression, isVariableRef, resolveSchemaValue } from '../schema/expressions'\n\n// ─── Schema Data Context ───────────────────────────────────────────────────────\n// Merges form values with user-provided `data` for schema expressions.\n\ninterface SchemaDataContextValue {\n values: Record<string, unknown>\n data: Record<string, unknown>\n /** Merged values + data (data takes precedence) */\n merged: Record<string, unknown>\n}\n\nconst SchemaDataContext = createContext<SchemaDataContextValue>({\n values: {},\n data: {},\n merged: {},\n})\n\nfunction useSchemaData() {\n return useContext(SchemaDataContext)\n}\n\n// ─── Schema Node Types ─────────────────────────────────────────────────────────\n\nexport interface FormFoundrySchemaInput {\n /** Registry key (e.g., 'text', 'select', 'checkbox') */\n $formfoundry: string\n /** Field name */\n name: string\n /** Conditional rendering — function predicate */\n if?: (values: Record<string, unknown>) => boolean\n /** Forwarded as props to the resolved component */\n [key: string]: unknown\n}\n\nexport interface FormFoundrySchemaElement {\n /** HTML element tag (e.g., 'div', 'h1', 'section') */\n $el: string\n /** HTML attributes */\n attrs?: Record<string, unknown>\n /** Children — text content or nested schema nodes */\n children?: string | FormFoundrySchemaNode[]\n /** Conditional rendering */\n if?: (values: Record<string, unknown>) => boolean\n}\n\nexport interface FormFoundrySchemaComponent {\n /** Component key from the library prop */\n $cmp: string\n /** Component props */\n props?: Record<string, unknown>\n /** Children — text content or nested schema nodes */\n children?: string | FormFoundrySchemaNode[]\n /** Conditional rendering */\n if?: (values: Record<string, unknown>) => boolean\n}\n\n/**\n * If/then/else conditional block.\n * Renders `then` schema if `if` predicate is true, otherwise renders `else`.\n */\nexport interface FormFoundrySchemaConditional {\n /** Predicate function */\n if: (values: Record<string, unknown>) => boolean\n /** Schema nodes to render when predicate is true */\n then: FormFoundrySchemaNode[]\n /** Schema nodes to render when predicate is false (optional) */\n else?: FormFoundrySchemaNode[]\n}\n\n/**\n * Loop construct.\n * Repeats children for each item in the iterable.\n *\n * ```ts\n * { for: ['item', 'index', items], children: [...] }\n * ```\n */\nexport interface FormFoundrySchemaLoop {\n /** [itemName, indexName, iterable] — iterable can be an array or a key into data */\n for: [string, string, unknown[] | string]\n /** Schema nodes to repeat for each item */\n children: FormFoundrySchemaNode[]\n}\n\nexport type FormFoundrySchemaNode =\n | FormFoundrySchemaInput\n | FormFoundrySchemaElement\n | FormFoundrySchemaComponent\n | FormFoundrySchemaConditional\n | FormFoundrySchemaLoop\n\n// ─── Props ─────────────────────────────────────────────────────────────────────\n\nexport interface SchemaRendererProps {\n /** Array of schema nodes to render */\n schema: FormFoundrySchemaNode[]\n /** Component library for $cmp references */\n library?: Record<string, React.ComponentType<Record<string, unknown>>>\n /** Reactive data available in schema predicates (merged with form values) */\n data?: Record<string, unknown>\n}\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\nexport function SchemaRenderer({ schema, library, data = {} }: SchemaRendererProps) {\n const registry = useInputRegistry()\n const { values } = useFormValues()\n\n const schemaDataContext = useMemo<SchemaDataContextValue>(\n () => ({\n values: values as Record<string, unknown>,\n data,\n merged: { ...(values as Record<string, unknown>), ...data },\n }),\n [values, data]\n )\n\n return (\n <SchemaDataContext.Provider value={schemaDataContext}>\n {schema.map((node, index) => (\n <SchemaNodeRenderer\n key={getNodeKey(node, index)}\n node={node}\n registry={registry}\n library={library}\n />\n ))}\n </SchemaDataContext.Provider>\n )\n}\n\n// ─── Individual Node Renderer ──────────────────────────────────────────────────\n\ninterface SchemaNodeRendererProps {\n node: FormFoundrySchemaNode\n registry: ReturnType<typeof useInputRegistry>\n library?: Record<string, React.ComponentType<Record<string, unknown>>>\n}\n\nfunction SchemaNodeRenderer({\n node,\n registry,\n library,\n}: SchemaNodeRendererProps) {\n const { merged } = useSchemaData()\n\n // ─── Loop construct ───────────────────────────────────────────────────\n if ('for' in node && Array.isArray((node as FormFoundrySchemaLoop).for)) {\n return renderLoop(node as FormFoundrySchemaLoop, registry, library, merged)\n }\n\n // ─── If/then/else conditional ─────────────────────────────────────────\n if (\n 'then' in node &&\n 'if' in node &&\n !('$formfoundry' in node) &&\n !('$el' in node) &&\n !('$cmp' in node)\n ) {\n return renderConditional(\n node as FormFoundrySchemaConditional,\n registry,\n library,\n merged\n )\n }\n\n // ─── Simple `if` predicate ────────────────────────────────────────────\n if ('if' in node && typeof node.if === 'function' && !node.if(merged)) {\n return null\n }\n\n // $formfoundry → registry lookup\n if ('$formfoundry' in node) {\n return renderFormFoundryInput(node as FormFoundrySchemaInput, registry, merged)\n }\n\n // $el → HTML element\n if ('$el' in node) {\n return renderHtmlElement(\n node as FormFoundrySchemaElement,\n registry,\n library,\n merged\n )\n }\n\n // $cmp → custom component\n if ('$cmp' in node) {\n return renderComponent(\n node as FormFoundrySchemaComponent,\n registry,\n library,\n merged\n )\n }\n\n return null\n}\n\n// ─── Render Helpers ────────────────────────────────────────────────────────────\n\nfunction renderFormFoundryInput(\n node: FormFoundrySchemaInput,\n registry: ReturnType<typeof useInputRegistry>,\n merged: Record<string, unknown> = {}\n) {\n const { $formfoundry, if: _if, ...rawProps } = node\n const Component = registry.get($formfoundry)\n\n if (!Component) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[FormFoundry] No input registered for type \"${$formfoundry}\". ` +\n `Available types: ${registry.keys().join(', ') || '(none)'}`\n )\n }\n return null\n }\n\n // Resolve expressions in props\n const props = resolveObjectExpressions(rawProps, merged)\n\n return <Component {...(props as unknown as FormFoundryInputProps<unknown>)} />\n}\n\nfunction renderHtmlElement(\n node: FormFoundrySchemaElement,\n registry: ReturnType<typeof useInputRegistry>,\n library: SchemaRendererProps['library'],\n merged: Record<string, unknown> = {}\n) {\n const { $el, attrs: rawAttrs, children, if: _if } = node\n\n // Resolve expressions in attributes\n const attrs = rawAttrs ? resolveObjectExpressions(rawAttrs, merged) : undefined\n\n const childContent = resolveChildren(children, registry, library, merged)\n\n return React.createElement($el, attrs, childContent)\n}\n\nfunction renderComponent(\n node: FormFoundrySchemaComponent,\n registry: ReturnType<typeof useInputRegistry>,\n library: SchemaRendererProps['library'],\n merged: Record<string, unknown> = {}\n) {\n const { $cmp, props: rawProps, children, if: _if } = node\n const Component = library?.[$cmp]\n\n if (!Component) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[FormFoundry] No component found for \"$cmp: ${$cmp}\" in library.`\n )\n }\n return null\n }\n\n // Resolve expressions in props\n const resolvedProps = rawProps ? resolveObjectExpressions(rawProps, merged) : {}\n\n const childContent = resolveChildren(children, registry, library, merged)\n\n return <Component {...resolvedProps}>{childContent}</Component>\n}\n\nfunction renderConditional(\n node: FormFoundrySchemaConditional,\n registry: ReturnType<typeof useInputRegistry>,\n library: SchemaRendererProps['library'],\n merged: Record<string, unknown>\n) {\n const branch = node.if(merged) ? node.then : node.else\n if (!branch) return null\n\n return (\n <>\n {branch.map((child, index) => (\n <SchemaNodeRenderer\n key={getNodeKey(child, index)}\n node={child}\n registry={registry}\n library={library}\n />\n ))}\n </>\n )\n}\n\nfunction renderLoop(\n node: FormFoundrySchemaLoop,\n registry: ReturnType<typeof useInputRegistry>,\n library: SchemaRendererProps['library'],\n merged: Record<string, unknown>\n) {\n const [itemName, indexName, source] = node.for\n\n // Resolve source — could be an array or a string key into merged data\n const items: unknown[] =\n typeof source === 'string'\n ? ((merged[source] as unknown[]) ?? [])\n : (source ?? [])\n\n if (!Array.isArray(items)) return null\n\n return (\n <>\n {items.map((item, idx) => {\n // Create a scoped data context for this iteration\n const loopData = {\n ...merged,\n [itemName]: item,\n [indexName]: idx,\n }\n\n return (\n <SchemaDataContext.Provider\n key={`loop_${idx}`}\n value={{ values: {}, data: loopData, merged: loopData }}\n >\n {node.children.map((child, childIdx) => (\n <SchemaNodeRenderer\n key={getNodeKey(child, childIdx)}\n node={child}\n registry={registry}\n library={library}\n />\n ))}\n </SchemaDataContext.Provider>\n )\n })}\n </>\n )\n}\n\n// ─── Expression Helpers ────────────────────────────────────────────────────────\n\n/**\n * Resolve all expression values in a flat object.\n * Keys with `$: ` or `$variable` values are evaluated against the data context.\n */\nfunction resolveObjectExpressions(\n obj: Record<string, unknown>,\n data: Record<string, unknown>\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n resolved[key] = resolveSchemaValue(value, data)\n }\n return resolved\n}\n\n/**\n * Resolve children — handles string (with expression support), arrays, or undefined.\n */\nfunction resolveChildren(\n children: string | FormFoundrySchemaNode[] | undefined,\n registry: ReturnType<typeof useInputRegistry>,\n library: SchemaRendererProps['library'],\n merged: Record<string, unknown>\n): React.ReactNode {\n if (children === undefined) return null\n\n if (typeof children === 'string') {\n // Resolve expression or variable ref in text content\n if (isExpression(children) || isVariableRef(children)) {\n return String(resolveSchemaValue(children, merged) ?? '')\n }\n return children\n }\n\n return children.map((child, index) => (\n <SchemaNodeRenderer\n key={getNodeKey(child, index)}\n node={child}\n registry={registry}\n library={library}\n />\n ))\n}\n\n// ─── Utilities ─────────────────────────────────────────────────────────────────\n\nfunction getNodeKey(node: FormFoundrySchemaNode, index: number): string {\n if ('name' in node && typeof node.name === 'string') {\n return node.name\n }\n if ('$el' in node) {\n return `el_${index}`\n }\n if ('$cmp' in node) {\n return `cmp_${(node as FormFoundrySchemaComponent).$cmp}_${index}`\n }\n return `node_${index}`\n}\n","// ─── Plugin System ─────────────────────────────────────────────────────────────\n// Plugins are functions that receive a node after creation.\n// They can return a cleanup function for teardown.\n// Applied at three levels: global (provider), form, field.\n// Inherited by children (FormKit pattern).\n\nexport type { FormFoundryPlugin } from '../node/types'\n\n// ─── Plugin Utilities ──────────────────────────────────────────────────────────\n\nimport type { FormFoundryNode, FormFoundryPlugin } from '../node/types'\n\n/**\n * Apply plugins to a node and collect cleanup functions.\n */\nexport function applyPlugins(\n node: FormFoundryNode,\n plugins: FormFoundryPlugin[]\n): Array<() => void> {\n const cleanups: Array<() => void> = []\n\n for (const plugin of plugins) {\n const cleanup = plugin(node)\n if (cleanup) {\n cleanups.push(cleanup)\n }\n }\n\n return cleanups\n}\n\n/**\n * Create a plugin that logs all node value changes.\n * Useful for debugging.\n */\nexport function createDebugPlugin(prefix = '[FormFoundry]'): FormFoundryPlugin {\n return (node) => {\n const unsubscribe = node.hooks.commit.use((value, next) => {\n console.log(`${prefix} ${node.name} committed:`, value)\n return next(value)\n })\n return unsubscribe\n }\n}\n\n/**\n * Create a plugin that auto-trims string values.\n */\nexport function createAutoTrimPlugin(): FormFoundryPlugin {\n return (node) => {\n const unsubscribe = node.hooks.commit.use((value, next) => {\n if (typeof value === 'string') {\n return next(value.trim())\n }\n return next(value)\n })\n return unsubscribe\n }\n}\n","// ─── Zod Resolver ──────────────────────────────────────────────────────────────\n// Following the React Hook Form resolver pattern for familiarity.\n\nimport type { ZodTypeAny } from 'zod'\n\n/**\n * A form-level resolver function.\n * Takes all form values and returns field-level errors.\n */\nexport type FormFoundryResolver = (\n values: Record<string, unknown>\n) => Promise<{ errors: Record<string, string[]> }>\n\n/**\n * Create a resolver from a Zod schema.\n *\n * ```ts\n * const resolver = zodResolver(z.object({\n * email: z.string().email(),\n * password: z.string().min(8),\n * }))\n * ```\n */\nexport function zodResolver(schema: ZodTypeAny): FormFoundryResolver {\n return async (values: Record<string, unknown>) => {\n const result = schema.safeParse(values)\n\n if (result.success) {\n return { errors: {} }\n }\n\n const errors: Record<string, string[]> = {}\n for (const issue of result.error.issues) {\n const fieldName = issue.path[0]\n if (typeof fieldName === 'string') {\n if (!errors[fieldName]) {\n errors[fieldName] = []\n }\n errors[fieldName].push(issue.message)\n }\n }\n\n return { errors }\n }\n}\n","// ─── English Locale ────────────────────────────────────────────────────────────\n// Default English locale pack for FormFoundry.\n// All messages use {label} interpolation for field-specific messaging.\n\nimport type { FormFoundryLocale } from './index'\n\nexport const en: FormFoundryLocale = {\n code: 'en',\n name: 'English',\n messages: {\n // ─── Core rules ────────────────────────────────────────────────────\n required: '{label} is required.',\n email: '{label} must be a valid email address.',\n url: '{label} must be a valid URL.',\n min: '{label} must be at least {0}.',\n max: '{label} must be at most {0}.',\n minLength: '{label} must be at least {0} characters.',\n maxLength: '{label} must be at most {0} characters.',\n matches: '{label} does not match the required pattern.',\n confirm: '{label} does not match.',\n alpha: '{label} must contain only alphabetical characters.',\n alphanumeric: '{label} must contain only alphanumeric characters.',\n date: '{label} must be a valid date.',\n between: '{label} must be between {0} and {1}.',\n number: '{label} must be a number.',\n\n // ─── Extended rules ────────────────────────────────────────────────\n accepted: '{label} must be accepted.',\n alpha_spaces: '{label} must contain only letters and spaces.',\n contains_alpha: '{label} must contain at least one letter.',\n contains_alphanumeric: '{label} must contain at least one letter or number.',\n contains_alpha_spaces: '{label} must contain at least one letter or space.',\n contains_lowercase: '{label} must contain at least one lowercase letter.',\n contains_uppercase: '{label} must contain at least one uppercase letter.',\n contains_numeric: '{label} must contain at least one number.',\n contains_symbol: '{label} must contain at least one symbol.',\n date_after: '{label} must be after {0}.',\n date_before: '{label} must be before {0}.',\n date_between: '{label} must be between {0} and {1}.',\n date_format: '{label} must match the format {0}.',\n ends_with: ({ label, args }) => `${label} must end with ${(args as string[]).join(', ') || '?'}.`,\n is: ({ label, args }) => `${label} must be one of: ${(args as string[]).join(', ') || '?'}.`,\n length: ({ label, args }) =>\n args[1]\n ? `${label} must be between ${args[0]} and ${args[1]} characters.`\n : `${label} must be exactly ${args[0] ?? '?'} characters.`,\n lowercase: '{label} must be all lowercase.',\n not: ({ label, args }) => `${label} must not be: ${(args as string[]).join(', ') || '?'}.`,\n require_one: 'At least one of these fields is required.',\n starts_with: ({ label, args }) => `${label} must start with ${(args as string[]).join(', ') || '?'}.`,\n symbol: '{label} must contain only symbols.',\n uppercase: '{label} must be all uppercase.',\n },\n}\n","// ─── Form Print Button ──────────────────────────────────────────────────────────\n// Convenience component: a button that triggers form printing via useFormPrint.\n'use client'\n\nimport React from 'react'\nimport type { PrintOptions } from './types'\nimport { useFormPrint } from './useFormPrint'\n\nexport interface FormPrintButtonProps {\n /** Print options (mode, title, subtitle, footer) */\n options?: PrintOptions\n /** Button label text. Default: 'Print' */\n children?: React.ReactNode\n /** Extra className for the button */\n className?: string\n /** Disabled state */\n disabled?: boolean\n}\n\n/**\n * A button that prints the enclosing `<Form>` when clicked.\n * Must be rendered inside a `<Form>` component.\n *\n * @example\n * ```tsx\n * <Form onSubmit={handleSubmit}>\n * <TextInput name=\"name\" label=\"Name\" />\n * <FormPrintButton options={{ mode: 'blank', title: 'Contact Form' }}>\n * 🖨️ Print Blank\n * </FormPrintButton>\n * </Form>\n * ```\n */\nexport function FormPrintButton({\n options,\n children = 'Print',\n className,\n disabled,\n}: FormPrintButtonProps) {\n const { printForm } = useFormPrint(options)\n\n return (\n <button\n type=\"button\"\n onClick={() => printForm()}\n className={className}\n disabled={disabled}\n data-formfoundry=\"print-button\"\n >\n {children}\n </button>\n )\n}\n","// ─── Form Print View ────────────────────────────────────────────────────────────\n// Renders a static, print-optimized view of form fields.\n// Supports 'blank' mode (empty fields for hand-filling) and 'filled' mode\n// (current values as static text).\n'use client'\n\nimport React from 'react'\nimport type { PrintFieldDescriptor, PrintMode } from './types'\n\n// ─── Props ──────────────────────────────────────────────────────────────────────\n\nexport interface FormPrintViewProps {\n /** Array of field descriptors to render */\n fields: PrintFieldDescriptor[]\n /** Print mode — 'blank' for empty fields, 'filled' for current values */\n mode: PrintMode\n /** Optional title shown at the top of the print view */\n title?: string\n /** Optional subtitle (e.g., date, form ID) */\n subtitle?: string\n /** Optional footer text */\n footer?: string\n /** Optional extra className for the root element */\n className?: string\n /** Whether this is a screen preview (adds border/shadow styling) */\n preview?: boolean\n}\n\n// ─── Component ──────────────────────────────────────────────────────────────────\n\nexport function FormPrintView({\n fields,\n mode,\n title,\n subtitle,\n footer,\n className,\n preview = false,\n}: FormPrintViewProps) {\n const resolvedMode = mode === 'current' ? 'filled' : mode\n\n return (\n <div className={`ff-print${preview ? ' ff-print--preview' : ''}${className ? ` ${className}` : ''}`}>\n {/* Header */}\n {(title || subtitle) && (\n <div className=\"ff-print__header\">\n {title && <h1 className=\"ff-print__title\">{title}</h1>}\n {subtitle && <p className=\"ff-print__subtitle\">{subtitle}</p>}\n </div>\n )}\n\n {/* Fields */}\n <ul className=\"ff-print__fields\">\n {fields.map((field) => (\n <PrintField\n key={field.name}\n field={field}\n mode={resolvedMode}\n />\n ))}\n </ul>\n\n {/* Footer */}\n {footer && <div className=\"ff-print__footer\">{footer}</div>}\n </div>\n )\n}\n\n// ─── Individual Field Renderer ──────────────────────────────────────────────────\n\ninterface PrintFieldProps {\n field: PrintFieldDescriptor\n mode: 'blank' | 'filled'\n}\n\nfunction PrintField({ field, mode }: PrintFieldProps) {\n const isTextarea = field.type === 'textarea'\n const label = field.label || field.name\n\n return (\n <li className={`ff-print__field${isTextarea ? ' ff-print__field--textarea' : ''}`}>\n <span className=\"ff-print__label\">{label}:</span>\n <span className=\"ff-print__value\">\n {mode === 'blank'\n ? renderBlank(field)\n : renderFilled(field)}\n </span>\n </li>\n )\n}\n\n// ─── Blank Mode Renderers ───────────────────────────────────────────────────────\n\nfunction renderBlank(field: PrintFieldDescriptor): React.ReactNode {\n switch (field.type) {\n case 'checkbox':\n case 'switch':\n return <span className=\"ff-print__blank-box\" />\n\n case 'radio':\n return (\n <span className=\"ff-print__blank-options\">\n {(field.options ?? []).map((opt) => (\n <span key={opt.value} className=\"ff-print__blank-option\">\n <span className=\"ff-print__blank-radio\" />\n {opt.label}\n </span>\n ))}\n </span>\n )\n\n case 'select':\n return (\n <span className=\"ff-print__blank-options\">\n {(field.options ?? []).map((opt) => (\n <span key={opt.value} className=\"ff-print__blank-option\">\n <span className=\"ff-print__blank-box\" />\n {opt.label}\n </span>\n ))}\n </span>\n )\n\n case 'textarea':\n return <div className=\"ff-print__blank-textarea\" />\n\n case 'checkboxgroup':\n return (\n <span className=\"ff-print__blank-options\">\n {(field.options ?? []).map((opt) => (\n <span key={opt.value} className=\"ff-print__blank-option\">\n <span className=\"ff-print__blank-box\" />\n {opt.label}\n </span>\n ))}\n </span>\n )\n\n // text, email, password, url, tel, number, date, color, slider, file, hidden\n default:\n return <span className=\"ff-print__blank-line\" />\n }\n}\n\n// ─── Filled Mode Renderers ──────────────────────────────────────────────────────\n\nfunction renderFilled(field: PrintFieldDescriptor): React.ReactNode {\n const { value, type } = field\n\n switch (type) {\n case 'checkbox':\n case 'switch':\n return (\n <span className=\"ff-print__filled-check\">\n {value ? '☑' : '☐'}\n </span>\n )\n\n case 'radio':\n case 'select': {\n const selected = field.options?.find(\n (opt) => String(opt.value) === String(value)\n )\n return (\n <span className=\"ff-print__filled-value\">\n {selected?.label ?? String(value ?? '—')}\n </span>\n )\n }\n\n case 'checkboxgroup': {\n const selectedValues = Array.isArray(value) ? value : []\n const selectedLabels = (field.options ?? [])\n .filter((opt) => selectedValues.includes(opt.value))\n .map((opt) => opt.label)\n return (\n <span className=\"ff-print__filled-value\">\n {selectedLabels.length > 0 ? selectedLabels.join(', ') : '—'}\n </span>\n )\n }\n\n case 'textarea':\n return (\n <div className=\"ff-print__filled-textarea\">\n {String(value ?? '')}\n </div>\n )\n\n case 'file':\n return (\n <span className=\"ff-print__filled-value\">\n {value ? String(value) : 'No file selected'}\n </span>\n )\n\n case 'color':\n return (\n <span className=\"ff-print__filled-value\">\n {value ? (\n <>\n <span\n style={{\n display: 'inline-block',\n width: 14,\n height: 14,\n backgroundColor: String(value),\n border: '1px solid #999',\n verticalAlign: 'middle',\n marginRight: 6,\n borderRadius: 2,\n }}\n />\n {String(value)}\n </>\n ) : '—'}\n </span>\n )\n\n case 'hidden':\n return null\n\n // text, email, password, url, tel, number, date, slider\n default:\n return (\n <span className=\"ff-print__filled-value\">\n {value != null && value !== '' ? String(value) : '—'}\n </span>\n )\n }\n}\n","// ─── Print Overlay ──────────────────────────────────────────────────────────────\n// A React component that renders the FormPrintView, hidden on screen\n// but visible during @media print via CSS rules.\n'use client'\n\nimport { FormPrintView } from './FormPrintView'\nimport type { PrintFieldDescriptor, PrintMode } from './types'\n\nexport interface PrintOverlayProps {\n /** Field descriptors to render */\n fields: PrintFieldDescriptor[]\n /** Print mode */\n mode: PrintMode\n /** Title for the print header */\n title?: string\n /** Subtitle for the print header */\n subtitle?: string\n /** Footer text */\n footer?: string\n /** Extra className */\n className?: string\n /** Whether the overlay is active (default: true) */\n open?: boolean\n}\n\n/**\n * Overlay that renders `FormPrintView` hidden on screen but visible\n * during `@media print`. No portal needed — uses CSS to control visibility.\n *\n * @example\n * ```tsx\n * <PrintOverlay\n * fields={descriptors}\n * mode=\"filled\"\n * title=\"Patient Intake Form\"\n * />\n * ```\n */\nexport function PrintOverlay({\n fields,\n mode,\n title,\n subtitle,\n footer,\n className,\n open = true,\n}: PrintOverlayProps) {\n if (!open || fields.length === 0) return null\n\n return (\n <div\n data-formfoundry-print-root=\"\"\n style={{ display: 'none' }}\n >\n <FormPrintView\n fields={fields}\n mode={mode}\n title={title}\n subtitle={subtitle}\n footer={footer}\n className={className}\n />\n </div>\n )\n}\n"]}