@pebble-software/bonsai 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -5
- package/dist/chunks/{create-renderer-C4nV9RV6.js → create-renderer-kgClEYyp.js} +55 -55
- package/dist/chunks/create-renderer-kgClEYyp.js.map +1 -0
- package/dist/chunks/{render-shared-Cwb527d4.js → render-shared-CrG0OFhJ.js} +2 -2
- package/dist/chunks/render-shared-CrG0OFhJ.js.map +1 -0
- package/dist/classes.d.ts +33 -0
- package/dist/classes.js +18 -0
- package/dist/classes.js.map +1 -0
- package/dist/classes.json +1 -0
- package/dist/core.js +3 -3
- package/dist/index.js +244 -189
- package/dist/index.js.map +1 -1
- package/dist/lib/ast/class-names.d.ts +13 -0
- package/dist/presets/signature.js +1 -1
- package/package.json +8 -1
- package/dist/chunks/create-renderer-C4nV9RV6.js.map +0 -1
- package/dist/chunks/render-shared-Cwb527d4.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pebble-software/bonsai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"**/*.css"
|
|
@@ -63,6 +63,12 @@
|
|
|
63
63
|
"import": "./dist/ast.js",
|
|
64
64
|
"default": "./dist/ast.js"
|
|
65
65
|
},
|
|
66
|
+
"./classes": {
|
|
67
|
+
"types": "./dist/classes.d.ts",
|
|
68
|
+
"import": "./dist/classes.js",
|
|
69
|
+
"default": "./dist/classes.js"
|
|
70
|
+
},
|
|
71
|
+
"./classes.json": "./dist/classes.json",
|
|
66
72
|
"./index.css": {
|
|
67
73
|
"style": "./dist/index.css",
|
|
68
74
|
"import": "./dist/index.css",
|
|
@@ -88,6 +94,7 @@
|
|
|
88
94
|
"@bonsai/constants": "workspace:*",
|
|
89
95
|
"@bonsai/schemas": "workspace:*",
|
|
90
96
|
"@eslint/js": "^10.0.1",
|
|
97
|
+
"@tailwindcss/oxide": "^4.1.11",
|
|
91
98
|
"@tailwindcss/vite": "^4.1.11",
|
|
92
99
|
"@testing-library/jest-dom": "^6.9.1",
|
|
93
100
|
"@testing-library/react": "^16.3.2",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-renderer-C4nV9RV6.js","sources":["../../src/components/core/render-tree-server.tsx","../../src/components/core/render-tree-client.tsx","../../src/components/core/bonsai.tsx","../../src/renderer/create-renderer.tsx"],"sourcesContent":["import { createElement, memo, useCallback } from \"react\";\nimport { type CompiledNode } from \"../../lib/renderer/compile-template\";\nimport { compileTemplate } from \"../../lib/renderer/compile-template\";\nimport {\n BonsaiRoot,\n useBonsaiRegistry,\n buildDataSlice,\n getValue,\n resolveWrapper,\n renderCompiledNode,\n type GlobalData,\n type NodeCtx,\n type RenderStrategy,\n type BonsaiProps,\n} from \"./render-shared\";\n\ninterface RenderTreeServerProps {\n // Precompiled metadata for this node; `node.source` is the raw template node.\n node: CompiledNode;\n index?: number;\n path?: string;\n data: GlobalData;\n // Alias -> real store path prefix set by an ancestor `each` (e.g. { applicant: \"applicants.3\" }); SSR-only.\n scope?: Record<string, string>;\n}\n\n// SSR ctx is the prop-drilled global data object plus the current `each` scope.\ninterface ServerCtx extends NodeCtx {\n data: GlobalData;\n}\n\nconst SERVER_MODE: RenderStrategy<ServerCtx> = {\n dataSlice(node, _ctx, globalData) {\n return buildDataSlice(node.dynamicKeys, (key) => {\n if (key in globalData && key !== \"data\") return globalData[key];\n return getValue(globalData.data ?? globalData, key);\n });\n },\n rowCtx(ctx, globalData, item, i, each, realItemsPath) {\n const { as, indexAlias } = each;\n const rowData = {\n ...globalData,\n data: {\n ...(globalData.data ?? globalData),\n [as]: item,\n ...(indexAlias ? { [indexAlias]: i } : {}),\n },\n };\n const rowScope = realItemsPath\n ? { ...ctx.scope, [as]: `${realItemsPath}.${i}` }\n : ctx.scope;\n return { data: rowData, scope: rowScope };\n },\n renderChild(child, i, path, ctx, key) {\n return (\n <RenderTreeServer\n key={key}\n node={child}\n index={i}\n path={path}\n data={ctx.data}\n scope={ctx.scope}\n />\n );\n },\n};\n\n// SSR: single-pass render over a plain, prop-drilled object — no store, no snapshots.\nconst RenderTreeServer = memo(\n ({ node, index = 0, path = \"root\", data, scope }: RenderTreeServerProps) => {\n const registry = useBonsaiRegistry();\n const updateData = useCallback(() => {\n // Attached for the controlled-component contract but never invoked during SSR.\n }, []);\n\n return renderCompiledNode(\n node,\n index,\n path,\n { data, scope },\n data,\n registry,\n updateData,\n SERVER_MODE,\n );\n },\n);\n\nexport function BonsaiServer({\n template,\n expiry,\n data,\n status = \"pending\",\n render = \"web\",\n as,\n registry,\n}: BonsaiProps) {\n const ctx = {\n data: data ?? {},\n expiry: expiry ?? \"\",\n status,\n submitting: false,\n };\n\n // Cached by template identity, so N instances of the same template compile once.\n const root = compileTemplate(template).root;\n const Wrapper = resolveWrapper(render, as);\n\n return (\n <BonsaiRoot registry={registry} render={render}>\n {createElement(\n Wrapper,\n {\n \"data-mode\": render,\n className: `group bonsai-root${render === \"pdf\" ? \" w-full\" : \"\"}`,\n },\n <RenderTreeServer node={root} index={0} path=\"root\" data={ctx} />,\n )}\n </BonsaiRoot>\n );\n}\n","import {\n createContext,\n createElement,\n memo,\n useCallback,\n useContext,\n useEffect,\n useEffectEvent,\n useLayoutEffect,\n useRef,\n useState,\n type SubmitEvent,\n} from \"react\";\nimport { proxy, snapshot, subscribe, useSnapshot } from \"valtio\";\nimport { type CompiledNode } from \"../../lib/renderer/compile-template\";\nimport { compileTemplate } from \"../../lib/renderer/compile-template\";\nimport {\n BonsaiRoot,\n useBonsaiRegistry,\n VOID_ELEMENTS,\n getKey,\n getValue,\n setValue,\n resolveScopedPath,\n pathRoot,\n buildDataSlice,\n resolveElementType,\n prepareState,\n resolveWrapper,\n cloneData,\n renderCompiledNode,\n type GlobalData,\n type NodeCtx,\n type RenderStrategy,\n type BonsaiProps,\n} from \"./render-shared\";\n\n// scope/indexScope/valueScope are the only things an `each` row hands its children on the live path —\n// store data is never prop-drilled (valueScope carries only computed-row items, which have no store path).\ninterface RenderTreeClientProps {\n node: CompiledNode;\n index?: number;\n path?: string;\n scope?: Record<string, string>;\n indexScope?: Record<string, number>;\n valueScope?: Record<string, unknown>;\n}\n\ntype BonsaiState = {\n status: string;\n expiry: string;\n data: Record<string, unknown>;\n submitting: boolean;\n};\n\nconst BonsaiContext = createContext<ReturnType<\n typeof proxy<BonsaiState>\n> | null>(null);\n\nfunction useBonsaiStore(): ReturnType<typeof proxy<BonsaiState>> {\n const store = useContext(BonsaiContext);\n if (!store) {\n throw new Error(\"useBonsaiStore must be used within a <Bonsai> component\");\n }\n return store;\n}\n\nexport function useUpdateData() {\n const store = useBonsaiStore();\n return useCallback(\n (path: string, value: unknown) => setValue(store.data, path, value),\n [store],\n );\n}\n\n// Live-path lookup: resolves each-scoped aliases at read time against a fresh snapshot.\nfunction resolveKeyValue(\n key: string,\n globalData: GlobalData,\n scope: Record<string, string> | undefined,\n indexScope: Record<string, number> | undefined,\n valueScope: Record<string, unknown> | undefined,\n): unknown {\n const root = pathRoot(key);\n\n if (indexScope && root in indexScope) {\n return key === root ? indexScope[root] : undefined;\n }\n\n if (scope && root in scope) {\n return getValue(globalData.data ?? globalData, resolveScopedPath(key, scope));\n }\n\n if (valueScope && Object.hasOwn(valueScope, root)) {\n return getValue(valueScope, key);\n }\n\n if (key in globalData && key !== \"data\") {\n return globalData[key];\n }\n\n return getValue(globalData.data ?? globalData, key);\n}\n\n// Children still go through `renderClientNode`, so a binding nested inside an unbound wrapper stays reactive.\nconst StaticNode = memo(\n ({ node, index = 0, path = \"root\", scope, indexScope, valueScope }: RenderTreeClientProps) => {\n const registry = useBonsaiRegistry();\n const tree = node.source;\n\n if (!tree) return null;\n if (node.isText) {\n // `isStatic` guarantees this has no `{{...}}` binding to evaluate.\n return tree as unknown as string;\n }\n\n try {\n const type = node.type;\n const ElementType = resolveElementType(registry, type);\n const key = getKey(node, index, path);\n const props = prepareState(node, {}, key);\n\n if (node.isImage && (props.src === \"\" || props.src == null)) {\n return null;\n }\n\n const childNodes =\n node.children.length > 0\n ? node.children.map((branch: CompiledNode, i: number) =>\n renderClientNode(\n branch,\n i,\n `${path}-${index}`,\n scope,\n indexScope,\n valueScope,\n getKey(node, i, `${path}-${index}`),\n ),\n )\n : undefined;\n\n const safeChildNodes =\n typeof ElementType === \"string\" && VOID_ELEMENTS.has(ElementType)\n ? undefined\n : childNodes;\n\n if (safeChildNodes !== undefined) {\n return createElement(ElementType, props, safeChildNodes);\n }\n return createElement(ElementType, props);\n } catch (error) {\n console.error(`Error at ${path}-${index}:`, error);\n return null;\n }\n },\n);\n\n// A plain function, not a hook, since it decides which component type to mount — always a safe conditional.\nfunction renderClientNode(\n node: CompiledNode,\n index: number,\n path: string,\n scope: Record<string, string> | undefined,\n indexScope: Record<string, number> | undefined,\n valueScope: Record<string, unknown> | undefined,\n key: string,\n): React.ReactNode {\n return node.isStatic ? (\n <StaticNode\n key={key}\n node={node}\n index={index}\n path={path}\n scope={scope}\n indexScope={indexScope}\n valueScope={valueScope}\n />\n ) : (\n <RenderTreeClient\n key={key}\n node={node}\n index={index}\n path={path}\n scope={scope}\n indexScope={indexScope}\n valueScope={valueScope}\n />\n );\n}\n\n// Client ctx carries only what an `each` row hands its children on this path — no data is prop-drilled.\ninterface ClientCtx extends NodeCtx {\n indexScope?: Record<string, number>;\n}\n\nfunction omitKey<T>(\n obj: Record<string, T> | undefined,\n key: string,\n): Record<string, T> | undefined {\n if (!obj || !Object.hasOwn(obj, key)) return obj;\n const rest = { ...obj };\n delete rest[key];\n return rest;\n}\n\nconst CLIENT_MODE: RenderStrategy<ClientCtx> = {\n dataSlice(node, ctx, globalData) {\n return buildDataSlice(node.dynamicKeys, (key) =>\n resolveKeyValue(key, globalData, ctx.scope, ctx.indexScope, ctx.valueScope),\n );\n },\n rowCtx(ctx, _globalData, item, i, each, realItemsPath) {\n const { as, indexAlias } = each;\n const rowIndexScope = indexAlias\n ? { ...ctx.indexScope, [indexAlias]: i }\n : ctx.indexScope;\n // A plain-path row resolves its alias against the store; a computed row has no store path, so it\n // carries the item itself. Each clears the alias from the other map so an inner alias shadows an outer one.\n if (realItemsPath) {\n return {\n scope: { ...ctx.scope, [as]: `${realItemsPath}.${i}` },\n indexScope: rowIndexScope,\n valueScope: omitKey(ctx.valueScope, as),\n };\n }\n return {\n scope: omitKey(ctx.scope, as),\n indexScope: rowIndexScope,\n valueScope: { ...ctx.valueScope, [as]: item },\n };\n },\n renderChild(child, i, path, ctx, key) {\n return renderClientNode(child, i, path, ctx.scope, ctx.indexScope, ctx.valueScope, key);\n },\n};\n\n// Client: every node calls useSnapshot itself, so it only re-renders when a path it actually reads changes.\nconst RenderTreeClient = memo(\n ({ node, index = 0, path = \"root\", scope, indexScope, valueScope }: RenderTreeClientProps) => {\n const registry = useBonsaiRegistry();\n const store = useBonsaiStore();\n // sync: true keeps the store write and its re-render in the same event, avoiding a one-tick display lag.\n const globalData = useSnapshot(store, { sync: true });\n const updateData = useUpdateData();\n\n return renderCompiledNode(\n node,\n index,\n path,\n { scope, indexScope, valueScope },\n globalData,\n registry,\n updateData,\n CLIENT_MODE,\n );\n },\n);\n\nexport function BonsaiClient({\n captureUrl,\n template,\n render = \"web\",\n as,\n onSubmit,\n onError,\n registry,\n}: BonsaiProps) {\n const store = useBonsaiStore();\n\n const submit = async (e: SubmitEvent) => {\n e.preventDefault();\n // Already captured/completed/revoked: nothing to send, and the lifecycle flags stay as they are.\n if (store.status !== \"pending\") return;\n // Display-only instance: nothing to submit to, so don't touch the lifecycle.\n if (!onSubmit && !captureUrl) return;\n\n // eslint-disable-next-line react-hooks/immutability -- the store is a valtio proxy, mutated by design\n store.submitting = true;\n try {\n if (onSubmit) {\n await onSubmit(snapshot(store.data) as Record<string, unknown>);\n } else {\n const res = await fetch(captureUrl!, {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n data: store.data,\n }),\n });\n // fetch only rejects on network failure; an error status must not count as captured.\n if (!res.ok) {\n throw new Error(`Capture failed: ${res.status} ${res.statusText}`.trim());\n }\n }\n\n store.status = \"captured\";\n } catch (error) {\n // Without an `onError`, this keeps the pre-existing behaviour of letting\n // the failure propagate out of the submit handler.\n if (!onError) throw error;\n onError(error);\n } finally {\n store.submitting = false;\n }\n };\n\n // Cached by template identity, so N instances of the same template compile once.\n const root = compileTemplate(template).root;\n const Wrapper = resolveWrapper(render, as);\n\n return (\n <BonsaiRoot registry={registry} render={render}>\n {createElement(\n Wrapper,\n {\n \"data-mode\": render,\n className: `group bonsai-root${render === \"pdf\" ? \" w-full\" : \"\"}`,\n ...(Wrapper === \"form\" ? { onSubmit: submit } : {}),\n },\n renderClientNode(root, 0, \"root\", undefined, undefined, undefined, \"root-0\"),\n )}\n </BonsaiRoot>\n );\n}\n\nexport function BonsaiProvider(props: BonsaiProps) {\n const [store] = useState(() =>\n proxy<BonsaiState>({\n status: props.status ?? \"pending\",\n expiry: props.expiry ?? \"\",\n data: cloneData(props.data ?? {}),\n submitting: false,\n }),\n );\n // The `data` object identity this store was last seeded from.\n const seenDataRef = useRef<BonsaiProps[\"data\"]>(props.data);\n // Set while the provider itself writes to the store, so a parent-driven\n // resync isn't echoed back out through `onDataChange`.\n const resyncingRef = useRef(false);\n const onDataChange = useEffectEvent((next: Record<string, unknown>) => {\n props.onDataChange?.(next);\n });\n\n useLayoutEffect(() => {\n // A new `data` object arrived from the parent — adopt it before paint.\n // Same-reference renders (including in-place mutations) are deliberately ignored.\n if (Object.is(seenDataRef.current, props.data)) return;\n seenDataRef.current = props.data;\n resyncingRef.current = true;\n try {\n store.data = cloneData(props.data ?? {});\n } finally {\n resyncingRef.current = false;\n }\n }, [store, props.data]);\n\n useEffect(() => {\n // valtio only populates subscription `ops` when the (unstable) op tracking\n // is switched on globally, so changes are detected by snapshot identity\n // instead: `snapshot` is memoised per version, so an unchanged `data`\n // subtree returns the very same object and is filtered out here.\n //\n // Notify in sync: the resync flag below is only reliable if the callback\n // runs inside the write, not on a later microtask.\n let previous = snapshot(store.data);\n return subscribe(\n store,\n () => {\n const next = snapshot(store.data);\n if (next === previous) return;\n previous = next;\n // A parent-driven resync isn't a user edit — don't echo it back.\n if (resyncingRef.current) return;\n onDataChange(next as Record<string, unknown>);\n },\n true,\n );\n }, [store]);\n\n return (\n <BonsaiContext.Provider value={store}>\n <BonsaiClient {...props} />\n </BonsaiContext.Provider>\n );\n}\n","import { BonsaiServer } from \"./render-tree-server\";\nimport { BonsaiProvider } from \"./render-tree-client\";\nimport type { BonsaiProps } from \"./render-shared\";\n\nexport {\n BonsaiRegistryContext,\n getValue,\n setValue,\n useBonsaiRenderMode,\n type BonsaiProps,\n type RenderMode,\n} from \"./render-shared\";\nexport { useUpdateData, BonsaiClient, BonsaiProvider } from \"./render-tree-client\";\nexport { BonsaiServer } from \"./render-tree-server\";\n\nexport function Bonsai(props: BonsaiProps) {\n if (typeof window === \"undefined\") {\n return <BonsaiServer {...props} />;\n }\n\n return <BonsaiProvider {...props} />;\n}\n","import {\n Bonsai as BonsaiRenderer,\n BonsaiRegistryContext,\n type BonsaiProps,\n} from \"../components/core/bonsai\";\nimport {\n coreRegistry,\n extendRegistry,\n type ComponentRegistry,\n type ControlledInputRegistry,\n} from \"./core-registry\";\nimport type { BonsaiRegistry } from \"../lib/registry/types\";\n\nexport interface BonsaiRendererOptions {\n /** Base registry. Defaults to the lightweight core registry. */\n registry?: BonsaiRegistry;\n /** Extra components layered over `registry` (they win on key collision). */\n components?: Partial<ComponentRegistry>;\n controlledInputs?: Partial<ControlledInputRegistry>;\n}\n\nexport interface BonsaiRendererInstance {\n Bonsai: React.ComponentType<BonsaiProps>;\n}\n\n/**\n * Builds a renderer bound to its own component registry.\n *\n * The registry is `options.registry` (the lightweight core set by default)\n * plus whatever components the caller supplies (caller entries win on key\n * collision); a `registry` prop on an individual `<Bonsai>` still overrides it. It is captured in a React context at\n * this call, so registries never leak between renderer instances and consumers\n * never have to mutate the exported `componentMap`.\n *\n * Heavy built-ins are opt-in via the presets in `renderer/presets/*`:\n *\n * ```ts\n * import { createBonsaiRenderer } from \"@pebble-software/bonsai/core\";\n * import { calendarPreset } from \"@pebble-software/bonsai/presets/calendar\";\n *\n * const { Bonsai } = createBonsaiRenderer({\n * components: { ...calendarPreset.components, rating: Rating },\n * controlledInputs: { ...calendarPreset.controlledInputs },\n * });\n * ```\n *\n * Call this at module scope: each call returns a fresh component type, so\n * calling it during render would remount the whole tree every time.\n */\nexport function createBonsaiRenderer(\n options: BonsaiRendererOptions = {},\n): BonsaiRendererInstance {\n // Cast: a `Partial<...>` widens values to `| undefined`, but it only ever\n // holds keys the caller actually supplied.\n const registry = extendRegistry(options.registry ?? coreRegistry, {\n components: options.components as ComponentRegistry | undefined,\n controlledInputs: options.controlledInputs as ControlledInputRegistry | undefined,\n });\n\n function Bonsai(props: BonsaiProps) {\n return (\n <BonsaiRegistryContext.Provider value={registry}>\n <BonsaiRenderer {...props} />\n </BonsaiRegistryContext.Provider>\n );\n }\n Bonsai.displayName = \"Bonsai\";\n\n return { Bonsai };\n}\n"],"names":["SERVER_MODE","node","_ctx","globalData","buildDataSlice","key","getValue","ctx","item","i","each","realItemsPath","as","indexAlias","rowData","rowScope","child","path","jsx","RenderTreeServer","memo","index","data","scope","registry","useBonsaiRegistry","updateData","useCallback","renderCompiledNode","BonsaiServer","template","expiry","status","render","root","compileTemplate","Wrapper","resolveWrapper","BonsaiRoot","createElement","BonsaiContext","createContext","useBonsaiStore","store","useContext","useUpdateData","value","setValue","resolveKeyValue","indexScope","valueScope","pathRoot","resolveScopedPath","StaticNode","tree","type","ElementType","resolveElementType","getKey","props","prepareState","childNodes","branch","renderClientNode","safeChildNodes","VOID_ELEMENTS","error","RenderTreeClient","omitKey","obj","rest","CLIENT_MODE","_globalData","rowIndexScope","useSnapshot","BonsaiClient","captureUrl","onSubmit","onError","submit","e","snapshot","res","BonsaiProvider","useState","proxy","cloneData","seenDataRef","useRef","resyncingRef","onDataChange","useEffectEvent","next","useLayoutEffect","useEffect","previous","subscribe","Bonsai","createBonsaiRenderer","options","extendRegistry","coreRegistry","BonsaiRegistryContext","BonsaiRenderer"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"render-shared-Cwb527d4.js","sources":["../../src/lib/renderer/safe-props.ts","../../src/lib/renderer/compile-template.ts","../../src/lib/registry/types.ts","../../src/components/ui/a.tsx","../../src/components/ui/h.tsx","../../src/components/ui/p.tsx","../../src/components/ui/accordion.tsx","../../src/components/ui/alert.tsx","../../src/components/ui/avatar.tsx","../../src/components/ui/badge.tsx","../../src/components/ui/card.tsx","../../src/components/ui/checkbox.tsx","../../src/components/ui/collapsible.tsx","../../src/components/ui/input.tsx","../../src/components/ui/input-otp.tsx","../../src/components/ui/textarea.tsx","../../src/components/ui/input-group.tsx","../../src/components/ui/label.tsx","../../src/components/ui/progress.tsx","../../src/components/ui/separator.tsx","../../src/components/ui/skeleton.tsx","../../src/components/ui/switch.tsx","../../src/components/ui/table.tsx","../../src/renderer/core-registry.ts","../../src/components/core/render-shared.tsx"],"sourcesContent":["// Template `args` become element props, so this is the gate between untrusted template\n// JSON and the DOM. React already escapes text and attribute values; what it can't know\n// is that a prop *name* or a URL *scheme* came from a template. `compileNode` drops\n// blocked args and unsafe static URLs once per template; URLs that only exist after a\n// `{{binding}}` resolves are checked by `prepareState` at render time.\n\n// Raw-HTML sinks, plus overrides that would send the host form's submission elsewhere.\n// `on*` isn't listed: JSON can't carry a function, and React ignores string handlers.\n// `__proto__` is never a prop, and assigning it would swap the compiled args' prototype.\nexport const BLOCKED_ARGS: ReadonlySet<string> = new Set([\n \"__proto__\",\n \"dangerouslySetInnerHTML\",\n \"srcDoc\",\n \"formAction\",\n \"formMethod\",\n \"formTarget\",\n \"formEncType\",\n]);\n\n// Props a browser navigates to or loads from — the ones React 19 guards against `javascript:`.\nexport const URL_ARGS: ReadonlySet<string> = new Set([\"href\", \"src\", \"action\", \"xlinkHref\"]);\n\n// An allowed scheme, `data:` for images only (signatures render as `data:image/png`), or\n// no scheme at all: no `:` before the first `/`, `?` or `#` means a relative URL.\nconst SAFE_URL = /^(?:(?:https?|mailto|tel):|data:image\\/|[^:]*(?:[/?#]|$))/i;\n\n/** `value` when it's safe to put in a URL prop, otherwise `undefined` so the prop is omitted. */\nexport function safeUrl(value: unknown): unknown {\n // Tested as a string because that's what React writes to the attribute (e.g. an array joins).\n return value == null || SAFE_URL.test(String(value)) ? value : undefined;\n}\n","import { COMPONENT } from \"@bonsai/constants\";\nimport type { Config, ConfigNode } from \"../../types\";\nimport { LRUCache } from \"../ast/cache\";\nimport { compileExpression, type CompiledExpression } from \"../ast\";\nimport { staticPath } from \"../ast/utils\";\nimport { BLOCKED_ARGS, URL_ARGS, safeUrl } from \"./safe-props\";\n\n/**\n * Ahead-of-render metadata for one template node.\n *\n * Everything here is *scope-independent*: it is a pure function of the template\n * node itself, so it survives being reused by every `each` row, every renderer\n * instance and both render paths. Anything that depends on a row's `scope` /\n * `indexScope`, on the live store, or on the `BonsaiRegistry` read from React\n * context deliberately stays in the render path.\n */\nexport interface CompiledNode {\n /** The raw template node this was compiled from. */\n source: Config;\n /** The template's `args` minus blocked props and unsafe static URLs: what the renderer spreads as props. */\n args: Record<string, unknown>;\n /** True when the node is a bare string leaf. */\n isText: boolean;\n /** Element type *string* only — the registry lookup stays at render time. */\n type: string;\n isEach: boolean;\n isIf: boolean;\n isImage: boolean;\n /** Variables the node's own bindings read, pre-split into path segments. */\n dynamicKeys: CompiledKey[];\n /** Arg names whose value is a `{{...}}` expression, so static props skip evaluation. */\n dynamicArgs: Set<string>;\n /**\n * Arg name -> unresolved store path, only for args whose expression is a plain\n * path (`{{user.name}}`, `{{rows[0].x}}`). Formulas (`{{a + b}}`, `{{xs.filter(...)}}`)\n * have no path to write back to, so they're left out.\n */\n argPaths: Record<string, string>;\n /** Parsed expressions keyed by arg name; `text` for a string leaf. */\n expressions: Record<string, CompiledExpression>;\n text: CompiledExpression | null;\n /** True when the node has no bindings, actions or control flow, so it can render as a memoised static subtree. */\n isStatic: boolean;\n /** `args.onClick` store writes, or null when the node has none. `to` stays raw for render-time evaluation. */\n actions: ClickAction[] | null;\n each: CompiledEach | null;\n children: CompiledNode[];\n}\n\n/** A dynamic key with the path-splitting work already done. */\nexport interface CompiledKey {\n /** The key exactly as `extractVariables` produced it, e.g. `applicant.name`. */\n key: string;\n /** `key` split and unwrapped, e.g. `[\"rows\", \"0\", \"label\"]`. */\n segments: string[];\n /** `numericNext[i]` is true when `segments[i + 1]` is an array index. */\n numericNext: boolean[];\n}\n\nexport interface ClickAction {\n set: string;\n to: unknown;\n}\n\nexport interface CompiledEach {\n as: string;\n indexAlias: string | undefined;\n keyExpr: unknown;\n /**\n * The unresolved store path the array lives at (`\"\"` for a computed items\n * expression). Resolving it against a row's `scope` stays at render time.\n */\n rawItemsPath: string;\n}\n\nexport interface CompiledTemplate {\n root: CompiledNode;\n source: Config;\n}\n\nconst PATH_SEGMENTS_RE =\n /[^.[\\]]+|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/g;\n\nexport function splitPathSegments(path: string): string[] {\n return path.match(PATH_SEGMENTS_RE) || [];\n}\n\nexport function unwrapSegment(seg: string): string {\n return seg.startsWith(\"[\") && seg.endsWith(\"]\")\n ? seg.slice(1, -1).replace(/^[\"']|[\"']$/g, \"\")\n : seg;\n}\n\nfunction compileKey(key: string): CompiledKey {\n const segments = splitPathSegments(key).map(unwrapSegment);\n const numericNext = segments.map((_, i) => {\n const next = segments[i + 1];\n return next !== undefined && /^\\d+$/.test(next);\n });\n return { key, segments, numericNext };\n}\n\nfunction compileNode(source: Config): CompiledNode {\n const isText = typeof source === \"string\";\n const node: ConfigNode | undefined = isText ? undefined : source;\n\n // Null-prototype so a registry-supplied prop name like \"constructor\" can't\n // resolve to an inherited member (same hazard Task 1 closed for the registries).\n const expressions: Record<string, CompiledExpression> = Object.create(null);\n // A plain object, not null-prototype like the maps above: V8 keeps those in dictionary\n // mode, which makes the per-render `{ ...node.args }` spread several times slower.\n const args: Record<string, unknown> = {};\n const dynamicArgs = new Set<string>();\n const argPaths: Record<string, string> = Object.create(null);\n const keys = new Set<string>();\n\n let text: CompiledExpression | null = null;\n let actions: ClickAction[] | null = null;\n\n if (isText) {\n text = compileExpression(source);\n text?.variables.forEach((v) => keys.add(v));\n } else {\n // Mirrors `extractDynamicKeys`: args only, in declaration order, never children.\n for (const [name, value] of Object.entries(node?.args ?? {})) {\n if (BLOCKED_ARGS.has(name)) continue;\n const compiled = compileExpression(value);\n if (!compiled) {\n // A bound URL is only known once it resolves, so `prepareState` checks those.\n args[name] = URL_ARGS.has(name) ? safeUrl(value) : value;\n continue;\n }\n args[name] = value;\n expressions[name] = compiled;\n dynamicArgs.add(name);\n if (compiled.ast && staticPath(compiled.ast) != null) {\n argPaths[name] = compiled.content;\n }\n compiled.variables.forEach((v) => keys.add(v));\n }\n\n const onClick = node?.args?.onClick;\n if (Array.isArray(onClick)) {\n // Malformed entries are dropped here so the click handler never sees them.\n actions = onClick.filter(\n (a: { set?: unknown } | null): a is ClickAction => typeof a?.set === \"string\" && a.set !== \"\",\n );\n // `to` is only evaluated on click, but it reads from the same data slice as the node's args.\n actions.forEach((a) => compileExpression(a.to)?.variables.forEach((v) => keys.add(v)));\n }\n }\n\n const rawType = node?.type;\n // Text leaves report \"div\" so element keys keep matching the pre-compiler\n // `getKey(leaf, ...)`, which read `leaf.type` off a string and got undefined.\n const type = rawType || \"div\";\n const isEach = rawType === COMPONENT.EACH;\n const isIf = rawType === COMPONENT.IF;\n\n // The `each` args shape `validateTemplate` enforces; like every arg, read here unvalidated.\n const eachArgs = node?.args as { as: string; index?: string; key?: unknown } | undefined;\n const each: CompiledEach | null = isEach\n ? {\n as: eachArgs?.as as string,\n indexAlias: eachArgs?.index,\n keyExpr: eachArgs?.key,\n rawItemsPath: argPaths[\"items\"] ?? \"\",\n }\n : null;\n\n const dynamicKeys = Array.from(keys, compileKey);\n\n return {\n source,\n args,\n isText,\n type,\n isEach,\n isIf,\n isImage: rawType === COMPONENT.IMAGE,\n dynamicKeys,\n dynamicArgs,\n argPaths,\n expressions,\n text,\n // Matches `isStaticLeaf`: control nodes always re-render, otherwise \"no bindings of its own\".\n isStatic: !isEach && !isIf && dynamicKeys.length === 0 && !actions,\n actions,\n each,\n children: isText\n ? []\n : (node?.children ?? []).map(compileNode),\n };\n}\n\n// Object templates are keyed by identity and collected with the template itself.\nconst templateCache = new WeakMap<object, CompiledTemplate>();\n// String templates can't key a WeakMap, so they fall back to the same bounded LRU\n// strategy the expression cache uses.\nconst stringTemplateCache = new LRUCache<string, CompiledTemplate>(50);\n\n/**\n * Compiles a template once and caches it by object identity, so mounting the\n * same template in N renderer instances does the work once. Both `RenderTree`\n * (SSR) and `RenderTreeClient` (client) consume the result.\n */\nexport function compileTemplate(template: Config): CompiledTemplate {\n if (typeof template === \"string\") {\n const hit = stringTemplateCache.get(template);\n if (hit) return hit;\n const compiled: CompiledTemplate = {\n root: compileNode(template),\n source: template,\n };\n stringTemplateCache.set(template, compiled);\n return compiled;\n }\n\n if (template == null || typeof template !== \"object\") {\n return { root: compileNode(template), source: template };\n }\n\n const hit = templateCache.get(template);\n if (hit) return hit;\n\n const compiled: CompiledTemplate = {\n root: compileNode(template),\n source: template,\n };\n templateCache.set(template, compiled);\n return compiled;\n}\n","import type { ComponentType } from \"react\";\nimport type { ZodType } from \"zod\";\n\nexport type ComponentCapability =\n | \"children\"\n | \"bindings\"\n | \"events\"\n | \"formField\"\n | \"ssr\"\n | \"pdf\";\n\nexport interface ControlledFieldSpec {\n valueProp: string;\n changeProp: string;\n extract: (eventOrValue: unknown) => unknown;\n}\n\nexport interface ComponentDefinition {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- component props are arbitrary per registry entry\n component: ComponentType<any> | string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- schema shape is registry-specific\n propsSchema?: ZodType<any>;\n capabilities?: ComponentCapability[];\n // A component with subtype-dependent controlled behavior (e.g. <input type=\"number\">\n // vs type=\"text\") keys this by `args.type`, with a mandatory \"default\" entry.\n controlled?: ControlledFieldSpec | Record<string, ControlledFieldSpec>;\n assets?: {\n css?: string[];\n fonts?: string[];\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- fallback component props are arbitrary\nexport type RegistryFallback = \"error\" | \"div\" | ComponentType<any>;\n\nexport interface BonsaiRegistry {\n id: string;\n version: string;\n namespace?: string;\n // Set on registries resolved from a Case A manifest so `validateTemplate`'s pin\n // check can catch a manifest edited in place at a stable URL. Absent on\n // object-form (build-time) registries.\n manifestHash?: string;\n components: Record<string, ComponentDefinition>;\n fallback?: RegistryFallback;\n}\n\nexport function defineComponent(def: ComponentDefinition): ComponentDefinition {\n return def;\n}\n\nexport function defineBonsaiRegistry(registry: BonsaiRegistry): BonsaiRegistry {\n return registry;\n}\n","import * as React from \"react\";\n\nconst A = React.forwardRef<HTMLAnchorElement>(({ ...props }, ref) => {\n return <a ref={ref} {...props} />;\n});\nA.displayName = \"A\";\n\nexport { A };\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nconst hVariants = cva(\"font-heading font-semibold scroll-m-20\", {\n variants: {\n variant: {\n h1: \"text-6xl font-semibold tracking-tight\",\n h2: \"text-4xl font-semibold tracking-tight first:mt-0\",\n h3: \"text-2xl font-semibold tracking-tight\",\n h4: \"text-xl font-semibold tracking-tight\",\n h5: \"text-lg font-semibold tracking-tight\",\n h6: \"text-base font-semibold tracking-tight\",\n },\n },\n defaultVariants: {\n variant: \"h3\",\n },\n});\n\ninterface HeadingProps\n extends\n React.HTMLAttributes<HTMLHeadingElement>,\n VariantProps<typeof hVariants> {\n as?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n}\n\nconst H = React.forwardRef<HTMLHeadingElement, HeadingProps>(\n ({ className, variant, as, ...props }, ref) => {\n const Comp = as || variant || \"h3\";\n return (\n <Comp\n ref={ref}\n className={cn(hVariants({ variant }), className)}\n {...props}\n />\n );\n },\n);\n\nH.displayName = \"H\";\n\nexport { H, hVariants };\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nconst pVariants = cva(\"text-base\", {\n variants: {\n variant: {\n default: \"\",\n muted: \"text-muted\",\n },\n size: {\n xs: \"text-xs font-light leading-snug\",\n sm: \"text-sm font-light leading-snug\",\n md: \"text-base\",\n lg: \"text-lg font-semibold\",\n xl: \"text-xl font-bold\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n});\n\ninterface ParagraphProps\n extends\n React.HTMLAttributes<HTMLParagraphElement>,\n VariantProps<typeof pVariants> {\n as?: \"p\" | \"div\" | \"span\";\n}\n\nconst P = React.forwardRef<HTMLParagraphElement, ParagraphProps>(\n ({ className, variant, size, as: Comp = \"p\", ...props }, ref) => {\n return (\n <Comp\n ref={ref}\n className={cn(pVariants({ variant, size }), className)}\n {...props}\n />\n );\n },\n);\nP.displayName = \"P\";\n\nexport { P, pVariants };\n","\"use client\";\n\nimport { Accordion as AccordionPrimitive } from \"@base-ui/react/accordion\";\nimport { IconChevronDown, type IconProps } from \"@tabler/icons-react\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { useHaptics, HAPTIC_ACCORDION } from \"@/lib/haptics\";\n\nconst accordionVariants = cva(\"flex w-full flex-col\", {\n variants: {\n variant: {\n default: \"\",\n contained: \"\",\n separated: \"gap-4\",\n },\n raised: {\n xs: \"\",\n sm: \"\",\n md: \"\",\n lg: \"\",\n },\n extrude: {\n xs: \"\",\n sm: \"\",\n md: \"\",\n lg: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n});\n\ninterface AccordionProps\n extends\n AccordionPrimitive.Root.Props,\n VariantProps<typeof accordionVariants> {}\n\nfunction Accordion({\n className,\n variant = \"default\",\n raised,\n extrude,\n ...props\n}: AccordionProps) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n data-variant={variant}\n data-raised={raised ?? undefined}\n data-extrude={extrude ?? undefined}\n className={cn(\n accordionVariants({ variant, raised, extrude }),\n \"group/accordion\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AccordionItem({ className, ...props }: AccordionPrimitive.Item.Props) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\n \"group/accordion-item\",\n \"data-closed:z-1 data-open:z-2 transition-[box-shadow,translate] linear duration-200\",\n \"group-data-[variant=default]/accordion:bg-surface\",\n \"group-data-[variant=default]/accordion:first:rounded-t-base\",\n \"group-data-[variant=default]/accordion:last:rounded-b-base\",\n \"group-data-[variant=default]/accordion:border-b\",\n \"group-data-[variant=default]/accordion:last:border-b-transparent\",\n\n \"group-data-[variant=contained]/accordion:bg-surface\",\n \"group-data-[variant=contained]/accordion:first:rounded-t-base\",\n \"group-data-[variant=contained]/accordion:last:rounded-b-base\",\n \"group-data-[variant=contained]/accordion:border-2\",\n \"group-data-[variant=contained]/accordion:border-border\",\n \"group-data-[variant=contained]/accordion:not-last:data-closed:-mb-1\",\n\n \"group-data-[variant=separated]/accordion:bg-surface\",\n \"group-data-[variant=separated]/accordion:border-2\",\n \"group-data-[variant=separated]/accordion:border-border\",\n \"group-data-[variant=separated]/accordion:rounded-base\",\n \"group-data-[variant=separated]/accordion:data-closed:not-last:mb-0\",\n\n \"group-data-raised/accordion:data-open:z-1\",\n \"group-data-raised/accordion:border\",\n \"group-data-raised/accordion:border-border\",\n \"group-data-raised/accordion:not-last:data-closed:-mb-1\",\n\n \"group-data-[raised=xs]/accordion:shadow-xs group-data-[raised=xs]/accordion:-translate-0.5\",\n \"group-data-[raised=sm]/accordion:shadow-sm group-data-[raised=sm]/accordion:-translate-0.75\",\n \"group-data-[raised=md]/accordion:shadow-md group-data-[raised=md]/accordion:-translate-1\",\n \"group-data-[raised=lg]/accordion:shadow-lg group-data-[raised=lg]/accordion:-translate-1.25\",\n\n \"group-data-extrude/accordion:data-open:z-1\",\n \"group-data-extrude/accordion:border\",\n \"group-data-extrude/accordion:data-open:border-border\",\n \"group-data-extrude/accordion:not-last:data-open:-mb-1\",\n \"group-data-extrude/accordion:border-t-transparent\",\n \"group-data-extrude/accordion:border-l-transparent\",\n \"group-data-extrude/accordion:border-r-transparent\",\n\n \"group-data-[extrude=xs]/accordion:data-open:shadow-xs group-data-[extrude=xs]/accordion:data-open:-translate-0.5\",\n \"group-data-[extrude=sm]/accordion:data-open:shadow-sm group-data-[extrude=sm]/accordion:data-open:-translate-0.75\",\n \"group-data-[extrude=md]/accordion:data-open:shadow-md group-data-[extrude=md]/accordion:data-open:-translate-1\",\n \"group-data-[extrude=lg]/accordion:data-open:shadow-lg group-data-[extrude=lg]/accordion:data-open:-translate-1.25\",\n\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AccordionTrigger({\n className,\n children,\n icon: Icon = IconChevronDown,\n onClick,\n ...props\n}: AccordionPrimitive.Trigger.Props & {\n icon?: React.ElementType<IconProps>;\n}) {\n const { trigger } = useHaptics();\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"neo-base neo-accordion-focus pt-3 text-left text-base font-medium cursor-pointer shrink-0 group/accordion-trigger relative flex flex-1 items-center justify-between border border-transparent transition-[opacity,border], data-disabled:pointer-events-none data-disabled:opacity-50\",\n \"p-4\",\n \"hover:underline\",\n \"group-first/accordion-item:rounded-t-base\",\n \"group-last/accordion-item:group-data-closed/accordion-item:rounded-b-base\",\n \"group-data-open/accordion-item:group-has-data-[slot=accordion-content]/accordion-item:pb-2\",\n \"group-data-open/accordion-item:group-has-data-[slot=accordion-content]/accordion-item:mb-2\",\n \"group-data-[variant=separated]/accordion:pt-4\",\n className,\n )}\n onClick={(event) => {\n trigger(HAPTIC_ACCORDION);\n onClick?.(event);\n }}\n {...props}\n >\n {children}\n <Icon\n data-slot=\"accordion-trigger-icon\"\n className={cn(\n \"group-aria-expanded/accordion-trigger:-rotate-180 transition-[rotate] duration-300\",\n \"text-muted ml-auto size-4 pointer-events-none\",\n )}\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: AccordionPrimitive.Panel.Props) {\n return (\n <AccordionPrimitive.Panel\n data-slot=\"accordion-content\"\n keepMounted\n className=\"overflow-hidden text-sm transition-[height] duration-300 ease-out data-ending-style:h-0 data-starting-style:h-0 h-(--accordion-panel-height)\"\n {...props}\n >\n <div\n className={cn(\n \"pt-0 px-4 pb-4 data-ending-style:h-0 data-starting-style:h-0 [&_p:not(:last-child)]:mb-4\",\n className,\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Panel>\n );\n}\n\nexport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n accordionVariants,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst alertVariants = cva(\n \"relative grid px-4 py-3 gap-0.5 rounded-base border text-left text-sm *:[svg]:row-span-2 *:[svg]:translate-y-1 *:[svg]:text-current has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-24 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2.5\",\n {\n variants: {\n variant: {\n default: \"bg-surface text-card-foreground\",\n success: \"bg-main-secondary text-card-foreground\",\n warning: \"text-foreground bg-accent-yellow-secondary\",\n destructive:\n \"text-foreground bg-accent-red-secondary border-border *:[svg]:text-current\",\n },\n size: {\n default: \"w-full\",\n sm: \"w-sm\",\n lg: \"w-full\",\n },\n raised: {\n xs: \"shadow-xs -translate-0.5\",\n sm: \"shadow-sm -translate-0.75\",\n md: \"shadow-md -translate-1\",\n lg: \"shadow-lg -translate-1.25\",\n xl: \"shadow-xl -translate-1.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction Alert({\n className,\n variant = \"default\",\n size = \"default\",\n raised,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(\n alertVariants({ variant, raised, size }),\n \"group/alert\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"font-heading text-lg font-medium [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3\",\n \"group-has-[>svg]/alert:col-start-2\",\n \"group-has-[size=sm]:text-sm\",\n \"group-has-[size=lg]:text-2xl\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-muted text-sm text-balance md:text-pretty [&_p:not(:last-child)]:mb-4 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3\",\n \"group-has-[variant=destructive]:text-foreground\",\n \"group-has-[size=sm]:text-xs\",\n \"group-has-[size=lg]:text-lg\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-action\"\n className={cn(\n \"absolute top-2.5 right-3\",\n \"group-has-[variant=destructive]:text-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertTitle, AlertDescription, AlertAction, alertVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst avatarVariants = cva(\"relative flex shrink-0 select-none\", {\n variants: {\n size: {\n full: \"size-full\",\n sm: \"size-8\",\n md: \"size-10\",\n lg: \"size-12\",\n xl: \"size-14\",\n },\n raised: {\n xs: \"shadow-xs -translate-0.5 ring-0\",\n sm: \"shadow-sm -translate-0.75 ring-0\",\n md: \"shadow-md -translate-1 ring-0\",\n lg: \"shadow-lg -translate-1.25 ring-0\",\n },\n rounded: {\n none: \"\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n },\n },\n defaultVariants: {\n size: \"md\",\n rounded: \"full\",\n },\n});\n\ntype AvatarProps = Omit<AvatarPrimitive.Root.Props, \"children\"> &\n VariantProps<typeof avatarVariants> & {\n src?: string;\n alt?: string;\n fallback?: React.ReactNode;\n badge?: React.ReactNode;\n children?: React.ReactNode;\n };\n\nfunction Avatar({\n className,\n size = \"md\",\n rounded = \"full\",\n raised,\n src,\n alt,\n fallback,\n badge,\n children,\n ...props\n}: AvatarProps) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n data-raised={raised}\n data-rounded={rounded}\n className={cn(\n avatarVariants({ size, rounded, raised }),\n \"group/avatar\",\n className,\n )}\n {...props}\n >\n {children ?? (\n <>\n {src && (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"aspect-square size-full object-cover border\",\n \"group-data-[rounded=sm]/avatar:rounded-sm\",\n \"group-data-[rounded=md]/avatar:rounded-md\",\n \"group-data-[rounded=lg]/avatar:rounded-lg\",\n \"group-data-[rounded=full]/avatar:rounded-full\",\n )}\n src={src}\n alt={alt}\n />\n )}\n {fallback != null && (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"text-foreground bg-surface flex size-full items-center justify-center border text-sm \",\n \"group-data-[size=sm]/avatar:text-xs\",\n \"group-data-[rounded=sm]/avatar:rounded-sm\",\n \"group-data-[rounded=md]/avatar:rounded-md\",\n \"group-data-[rounded=lg]/avatar:rounded-lg\",\n \"group-data-[rounded=full]/avatar:rounded-full\",\n )}\n delay={150}\n >\n {fallback}\n </AvatarPrimitive.Fallback>\n )}\n {badge != null && (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"overflow-hidden text-primary-foreground ring-surface absolute right-1 bottom-1 z-10 inline-flex items-center justify-center bg-main select-none border-1\",\n \"group-data-[size=sm]/avatar:size-3\",\n \"group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=sm]/avatar:translate-0.75\",\n \"group-data-[size=md]/avatar:size-4\",\n \"group-data-[size=md]/avatar:[&>svg]:size-3\",\n \"group-data-[size=md]/avatar:translate-1.5\",\n \"group-data-[size=lg]/avatar:size-5\",\n \"group-data-[size=lg]/avatar:[&>svg]:size-4\",\n \"group-data-[size=lg]/avatar:translate-1.5\",\n \"group-data-[size=xl]/avatar:size-6\",\n \"group-data-[size=xl]/avatar:[&>svg]:size-5\",\n \"group-data-[size=xl]/avatar:translate-1.5\",\n \"group-data-[size=full]/avatar:size-4\",\n \"group-data-[size=full]/avatar:[&>svg]:size-3\",\n \"group-data-[size=full]/avatar:translate-1.5\",\n\n \"group-data-[raised=xs]/avatar:shadow-xs\",\n \"group-data-[raised=sm]/avatar:shadow-sm\",\n \"group-data-[raised=md]/avatar:shadow-md\",\n \"group-data-[raised=lg]/avatar:shadow-lg\",\n\n \"group-data-[rounded=sm]/avatar:rounded-sm\",\n \"group-data-[rounded=md]/avatar:rounded-md\",\n \"group-data-[rounded=lg]/avatar:rounded-lg\",\n \"group-data-[rounded=full]/avatar:rounded-full\",\n \"group-data-[rounded=full]/avatar:translate-0\",\n )}\n >\n {badge}\n </span>\n )}\n </>\n )}\n </AvatarPrimitive.Root>\n );\n}\n\ntype AvatarGroupProps = React.ComponentProps<\"div\"> & {\n max?: number;\n};\n\nfunction AvatarGroup({\n className,\n max = 3,\n children,\n ...props\n}: AvatarGroupProps) {\n const childArray = React.Children.toArray(children);\n const hasOverflow = max != null && childArray.length > max;\n const visibleChildren = hasOverflow ? childArray.slice(0, max) : childArray;\n const overflowCount = hasOverflow ? childArray.length - max : 0;\n\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\"group/avatar-group flex -space-x-2\", className)}\n {...props}\n >\n {visibleChildren}\n {overflowCount > 0 && (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n \"grid grid-cols-1 origin-bottom-left\",\n \"*:col-span-1 *:col-start-1 *:row-start-1 *:my-auto *:border-2 *:bg-main-secondary *:text-sm *:text-foreground *:relative *:flex *:shrink-0 *:items-center *:justify-center *:[&>svg]:size-4\",\n \"*:size-8 hover:*:size-10 hover:*:-mr-2 *:transition-[color,translate,opacity,border,width,height,margin] *:duration-300 *:linear\",\n\n \"*:group-has-data-[size=sm]/avatar-group:size-6 hover:*:group-has-data-[size=sm]/avatar-group:size-8\",\n \"*:group-has-data-[size=sm]/avatar-group:text-[0.7rem]\",\n \"*:group-has-data-[size=sm]/avatar-group:[&>svg]:size-3\",\n \"hover:*:group-has-data-[size=sm]/avatar-group:-mr-2\",\n\n \"*:group-has-data-[size=lg]/avatar-group:size-9 hover:*:group-has-data-[size=lg]/avatar-group:size-12\",\n \"*:group-has-data-[size=lg]/avatar-group:[&>svg]:size-5\",\n \"hover:*:group-has-data-[size=lg]/avatar-group:-mr-3\",\n\n \"*:group-has-data-[size=xl]/avatar-group:size-11 hover:*:group-has-data-[size=xl]/avatar-group:size-14\",\n \"*:group-has-data-[size=xl]/avatar-group:[&>svg]:size-6\",\n \"hover:*:group-has-data-[size=xl]/avatar-group:-mr-3\",\n\n \"*:group-has-data-[rounded=sm]/avatar-group:rounded-sm\",\n \"*:group-has-data-[rounded=md]/avatar-group:rounded-md\",\n \"*:group-has-data-[rounded=lg]/avatar-group:rounded-lg\",\n \"*:group-has-data-[rounded=full]/avatar-group:rounded-full\",\n\n \"*:group-has-data-[raised=xs]/avatar-group:shadow-xs *:group-has-data-[raised=xs]/avatar-group:-translate-0.5\",\n \"*:group-has-data-[raised=sm]/avatar-group:shadow-sm *:group-has-data-[raised=sm]/avatar-group:-translate-0.75\",\n \"*:group-has-data-[raised=md]/avatar-group:shadow-md *:group-has-data-[raised=md]/avatar-group:-translate-1\",\n \"*:group-has-data-[raised=lg]/avatar-group:shadow-lg *:group-has-data-[raised=lg]/avatar-group:-translate-1.25\",\n )}\n >\n <div className=\"z-[-1]\" />\n <div className=\"shadow-none\">+{overflowCount}</div>\n </div>\n )}\n </div>\n );\n}\n\nexport { Avatar, AvatarGroup };\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\n\nconst badgeVariants = cva(\n \"gap-1 px-2 py-0.5 [button]:cursor-pointer rounded-full border text-xs font-medium transition-[color,box-shadow,translate] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 inline-flex items-center justify-center w-fit whitespace-nowrap shrink-0 [&>svg]:pointer-events-none aria-invalid:border-accent-red duration-200 overflow-hidden\",\n {\n variants: {\n variant: {\n default: \"bg-main text-foreground\",\n secondary: \"bg-main-secondary text-foreground\",\n destructive: \"bg-accent-red text-foreground\",\n outline: \"border-border text-foreground\",\n ghost: \"text-muted hover:bg-foreground/20 border-transparent\",\n },\n size: {\n sm: \"h-5 text-xs [&>svg]:size-3\",\n md: \"text-sm [&>svg]:size-4\",\n lg: \"text-base [&>svg]:size-5\",\n },\n raised: {\n xs: \"shadow-xs -translate-px\",\n sm: \"shadow-sm -translate-0.5\",\n md: \"shadow-md -translate-0.75\",\n lg: \"shadow-lg -translate-1\",\n },\n extrude: {\n xs: \"hover:shadow-xs hover:-translate-px focus-visible:shadow-xs focus-visible:-translate-px active:shadow-none active:translate-0 disabled:shadow-none disabled:translate-0\",\n sm: \"hover:shadow-sm hover:-translate-0.5 focus-visible:shadow-sm focus-visible:-translate-0.5 active:shadow-none active:translate-0 disabled:shadow-none disabled:translate-0\",\n md: \"hover:shadow-md hover:-translate-0.75 focus-visible:shadow-md focus-visible:-translate-0.75 active:shadow-none active:translate-0 disabled:shadow-none disabled:translate-0\",\n lg: \"hover:shadow-lg hover:-translate-1 focus-visible:shadow-lg focus-visible:-translate-1 active:shadow-none active:translate-0 disabled:shadow-none disabled:translate-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n },\n);\n\nfunction Badge({\n className,\n variant = \"default\",\n size = \"md\",\n raised,\n extrude,\n render,\n ...props\n}: useRender.ComponentProps<\"span\"> & VariantProps<typeof badgeVariants>) {\n return useRender({\n defaultTagName: \"span\",\n props: mergeProps<\"span\">(\n {\n className: cn(\n badgeVariants({ size, variant, raised, extrude }),\n \"group/badge\",\n className,\n ),\n tabIndex: props.tabIndex,\n },\n props,\n ),\n render,\n state: {\n slot: \"badge\",\n variant,\n },\n });\n}\n\nexport { Badge, badgeVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst cardVariants = cva(\n \"bg-surface border text-foreground overflow-hidden rounded-base text-sm flex flex-col\",\n {\n variants: {\n size: {\n sm: \"gap-3 py-3 md:gap-4 md:py-4\",\n md: \"gap-4 py-4 md:gap-6 md:py-6\",\n },\n raised: {\n none: \"shadow-none\",\n xs: \"shadow-xs -translate-0.5\",\n sm: \"shadow-sm -translate-0.75\",\n md: \"shadow-md -translate-1\",\n lg: \"shadow-lg -translate-1.25\",\n xl: \"shadow-xl -translate-1.5\",\n },\n },\n defaultVariants: {\n size: \"md\",\n raised: \"md\",\n },\n },\n);\n\nfunction Card({\n className,\n size = \"md\",\n raised = \"md\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof cardVariants>) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(cardVariants({ raised, size }), \"group/card\", className)}\n {...props}\n />\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]\",\n \"gap-1 group/card-header @container/card-header grid auto-rows-min items-start\",\n \"group-data-[size=sm]/card:px-3 group-data-[size=sm]/card:[.border-b]:pb-3\",\n \"group-data-[size=md]/card:px-4 group-data-[size=md]/card:[.border-b]:pb-4\",\n \"md:group-data-[size=sm]/card:px-4 md:group-data-[size=sm]/card:[.border-b]:pb-4\",\n \"md:group-data-[size=md]/card:px-6 md:group-data-[size=md]/card:[.border-b]:pb-6\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n \"col-start-1 row-start-1 font-heading leading-normal font-medium mt-0.5 self-center\",\n \"group-has-data-[slot=card-description]/card-header:leading-tight\",\n \"group-has-data-[slot=card-description]/card-header:mt-0\",\n \"group-data-[size=sm]/card:text-base\",\n \"group-data-[size=md]/card:text-lg\",\n \"group-has-data-[slot=card-icon]/card-header:group-data-[size=sm]/card:pl-9\",\n \"group-has-data-[slot=card-icon]/card-header:group-data-[size=md]/card:pl-12\",\n \"group-has-data-[slot=card-icon]/card-header:group-has-data-[slot=card-description]/card-header:group-data-[size=sm]/card:pl-13\",\n \"group-has-data-[slot=card-icon]/card-header:group-has-data-[slot=card-description]/card-header:group-data-[size=md]/card:pl-14\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\n \"text-muted col-start-1 row-start-2\",\n \"group-data-[size=sm]/card:text-xs\",\n \"group-data-[size=md]/card:text-sm\",\n \"group-has-data-[slot=card-icon]/card-header:group-data-[size=sm]/card:pl-13\",\n \"group-has-data-[slot=card-icon]/card-header:group-data-[size=md]/card:pl-14\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardIcon({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-icon\"\n className={cn(\n \"bg-main col-span-1 row-span-2 col-start-1 row-start-1 rounded-sm border-2 flex items-center justify-center self-start\",\n \"group-data-[size=sm]/card:p-0.75\",\n \"group-data-[size=md]/card:p-1\",\n \"group-data-[size=sm]/card:size-7\",\n \"group-data-[size=md]/card:size-8\",\n \"group-has-data-[slot=card-description]/card-header:group-data-[size=sm]/card:size-10\",\n \"group-has-data-[slot=card-description]/card-header:group-data-[size=md]/card:size-11\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\n \"group-data-[size=sm]/card:px-3\",\n \"group-data-[size=md]/card:px-4\",\n \"md:group-data-[size=sm]/card:px-4\",\n \"md:group-data-[size=md]/card:px-6\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center justify-end\",\n \"group-data-[size=sm]/card:px-3 group-data-[size=sm]/card:[.border-t]:pt-3\",\n \"group-data-[size=md]/card:px-4 group-data-[size=md]/card:[.border-t]:pt-4\",\n \"md:group-data-[size=sm]/card:px-4 md:group-data-[size=sm]/card:[.border-t]:pt-4\",\n \"md:group-data-[size=md]/card:px-6 md:group-data-[size=md]/card:[.border-t]:pt-6\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardIcon,\n CardDescription,\n CardContent,\n cardVariants,\n};\n","\"use client\";\n\nimport { Checkbox as CheckboxPrimitive } from \"@base-ui/react/checkbox\";\nimport { IconCheck } from \"@tabler/icons-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\nimport { useHaptics, HAPTIC_CHECKBOX } from \"@/lib/haptics\";\n\nconst checkboxVariants = cva(\n \"neo-base neo-checkbox-focus flex size-5 cursor-pointer items-center justify-center rounded-md border relative shrink-0 transition-[color,opacity,box-shadow,translate] data-checked:bg-main aria-disabled:pointer-events-none aria-disabled:cursor-not-allowed aria-disabled:opacity-50 aria-invalid:bg-accent-red-secondary\",\n {\n variants: {\n size: {\n xs: \"size-4.5\",\n sm: \"size-5\",\n md: \"size-5.5\",\n lg: \"size-6\",\n xl: \"size-6.5\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n },\n);\n\nfunction Checkbox({\n className,\n size,\n onCheckedChange,\n ...props\n}: CheckboxPrimitive.Root.Props & VariantProps<typeof checkboxVariants>) {\n const { trigger } = useHaptics();\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n data-size={size}\n className={cn(\n checkboxVariants({ size }),\n \"peer group/checkbox\",\n className,\n )}\n aria-label={props[\"aria-label\"] ?? \"checkbox\"}\n onCheckedChange={(checked, event) => {\n trigger(HAPTIC_CHECKBOX);\n onCheckedChange?.(checked, event);\n }}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"grid place-content-center text-current\"\n >\n <IconCheck\n stroke={3.5}\n className={cn(\n \"size-4\",\n \"group-data-[size=xs]/checkbox:size-3\",\n \"group-data-[size=sm]/checkbox:size-3.5\",\n \"group-data-[size=md]/checkbox:size-4\",\n \"group-data-[size=lg]/checkbox:size-4.5\",\n \"group-data-[size=xl]/checkbox:size-5\",\n )}\n />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n\nexport { Checkbox, checkboxVariants };\n","\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Collapsible as CollapsiblePrimitive } from \"@base-ui/react/collapsible\";\n\nfunction Collapsible({ className, ...props }: CollapsiblePrimitive.Root.Props) {\n return (\n <CollapsiblePrimitive.Root\n className={cn(\"group/collapsible\", className)}\n data-slot=\"collapsible\"\n {...props}\n />\n );\n}\n\nfunction CollapsibleTrigger({\n className,\n ...props\n}: CollapsiblePrimitive.Trigger.Props) {\n return (\n <CollapsiblePrimitive.Trigger\n className={cn(\n \"group-data-open/collapsible:[&_svg]:-scale-y-100\",\n className,\n )}\n data-slot=\"collapsible-trigger\"\n {...props}\n />\n );\n}\n\nfunction CollapsibleContent({\n className,\n children,\n ...props\n}: CollapsiblePrimitive.Panel.Props) {\n return (\n <CollapsiblePrimitive.Panel\n className={cn(\"group overflow-hidden\", className)}\n data-slot=\"collapsible-content\"\n keepMounted\n {...props}\n >\n <div\n data-slot=\"collapsible-content-container\"\n className={cn(\n \"transition-[opacity,translate] duration-300\",\n \"group-data-starting-style:-translate-y-20 group-data-starting-style:opacity-0\",\n \"group-data-ending-style:-translate-y-20 group-data-ending-style:opacity-0\",\n )}\n >\n {children}\n </div>\n </CollapsiblePrimitive.Panel>\n );\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Input as InputPrimitive } from \"@base-ui/react/input\";\nimport { cn } from \"@/lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n \"neo-base neo-input-focus transition-[translate,box-shadow] h-10 w-full min-w-0 placeholder:text-subtle rounded-base border px-2.5 py-1 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 bg-surface\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { OTPInput, OTPInputContext } from \"input-otp\";\nimport { IconMinus } from \"@tabler/icons-react\";\nimport { cn } from \"@/lib/utils\";\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string;\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"cn-input-otp flex items-center has-disabled:opacity-50\",\n containerClassName,\n )}\n spellCheck={false}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n );\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\"rounded-base flex items-center gap-0\", className)}\n {...props}\n />\n );\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number;\n}) {\n const inputOTPContext = React.useContext(OTPInputContext);\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n data-has-value={char !== null}\n className={cn(\n \"bg-surface border-2 size-9 -mb-0.5 -mr-0.5 outline-none text-sm relative flex items-center justify-center\",\n \"transition-[translate,border,box-shadow] ease-in\",\n \"hover:shadow-md hover:-translate-1\",\n \"data-[has-value=true]:shadow-none data-[has-value=true]:translate-0\",\n \"data-[active=true]:ease-out data-[active=true]:z-10 data-[active=true]:shadow-md data-[active=true]:-translate-1 data-[active=true]:not-first:rounded-l-sm data-[active=true]:not-last:rounded-r-sm\",\n \"focus-visible:shadow-md focus-visible:-translate-1\",\n \"first:rounded-l-base last:rounded-r-base\",\n className,\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"animate-caret-blink duration-1000 bg-foreground h-4 w-0.5\" />\n </div>\n )}\n </div>\n );\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-separator\"\n className=\"[&_svg:not([class*='size-'])]:size-4 flex items-center mx-1 *:stroke-3\"\n role=\"separator\"\n {...props}\n >\n <IconMinus />\n </div>\n );\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nfunction Textarea({\n className,\n onInput,\n autosize = false,\n ...props\n}: React.ComponentProps<\"textarea\"> & { autosize?: boolean }) {\n const handleInput = (e: React.FormEvent<HTMLTextAreaElement>) => {\n if (autosize) {\n const textarea = e.currentTarget;\n textarea.style.height = \"auto\";\n textarea.style.height = textarea.scrollHeight + \"px\";\n }\n };\n\n return (\n <textarea\n data-slot=\"textarea\"\n onInput={onInput ? onInput : handleInput}\n className={cn(\n \"neo-base neo-input-focus\",\n \"flex field-sizing-content transition-all\",\n \"h-10 min-h-16 w-full min-w-0\",\n \"placeholder:text-subtle\",\n \"rounded-base border px-2.5 py-2\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group\",\n \"relative flex w-full min-w-0 items-center border-border h-10 rounded-base border shadow-none has-[>textarea]:h-auto\",\n \"has-[>[data-align=block-end]]:p-1 has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:h-auto\",\n \"has-[>[data-align=block-start]]:p-1 has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:h-auto\",\n className,\n )}\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted h-full gap-2 p-2 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 flex cursor-text items-center justify-center select-none\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"mr-0.5 has-[>button]:mr-0 has-[>kbd]:mr-0 has-[>button]:-ml-0.75 has-[>kbd]:-ml-0.75 order-first\",\n \"inline-end\":\n \"ml-0.5 has-[>button]:ml-0 has-[>kbd]:ml-0 has-[>button]:-mr-0.75 has-[>kbd]:-mr-0.75 order-last\",\n \"block-start\": \"mb-1 [.border-b]:pb-3 order-first w-full justify-start\",\n \"block-end\": \"mt-1 [.border-t]:pt-3 order-last w-full justify-start\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n },\n);\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return;\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus();\n }}\n {...props}\n />\n );\n}\n\nconst inputGroupButtonVariants = cva(\"gap-2 text-sm flex items-center\", {\n variants: {\n size: {\n xs: \"h-7 gap-1 rounded-sm px-1.5 py-0.5\",\n sm: \"\",\n \"icon-xs\": \"size-6 rounded-sm p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-10 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n});\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"outline\",\n extrude = \"xs\",\n size,\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\" | \"type\"> &\n VariantProps<typeof inputGroupButtonVariants> & {\n type?: \"button\" | \"submit\" | \"reset\";\n }) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n extrude={extrude ?? null}\n aria-label={props[\"aria-label\"] ?? \"input-button\"}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"text-subtle gap-2 font-base flex items-center [&_svg]:pointer-events-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"h-10 hover:border-border focus:border-border flex-1 bg-surface -m-0.5\",\n \"group-has-[>[data-align=block-start]]/input-group:m-0\",\n \"group-has-[>[data-align=block-end]]/input-group:m-0\",\n \"group-has-[>[data-align=inline-start]]/input-group:pl-1.5\",\n \"group-has-[>[data-align=inline-end]]/input-group:pr-1.5\",\n \"group-has-[>[data-align=block-start]]/input-group:rounded-base\",\n \"group-has-[>[data-align=block-end]]/input-group:rounded-base\",\n \"group-has-[>[data-align=inline-start]]/input-group:rounded-l-none\",\n \"group-has-[>[data-align=inline-start]]/input-group:hover:rounded-l-sm\",\n \"group-has-[>[data-align=inline-start]]/input-group:focus:rounded-l-sm\",\n \"group-has-[>[data-align=inline-end]]/input-group:rounded-r-none\",\n \"group-has-[>[data-align=inline-end]]/input-group:hover:rounded-r-sm\",\n \"group-has-[>[data-align=inline-end]]/input-group:focus:rounded-r-sm\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"h-auto hover:border-border focus:border-border flex-1 bg-surface\",\n \"group-has-[>[data-align=block-start]]/input-group:m-0\",\n \"group-has-[>[data-align=block-end]]/input-group:m-0\",\n \"group-has-[>[data-align=block-start]]/input-group:rounded-base\",\n \"group-has-[>[data-align=block-end]]/input-group:rounded-base\",\n \"group-has-[>[data-align=inline-start]]/input-group:rounded-l-none\",\n \"group-has-[>[data-align=inline-start]]/input-group:hover:rounded-l-base\",\n \"group-has-[>[data-align=inline-start]]/input-group:focus:rounded-l-base\",\n \"group-has-[>[data-align=inline-end]]/input-group:rounded-r-none\",\n \"group-has-[>[data-align=inline-end]]/input-group:hover:rounded-r-base\",\n \"group-has-[>[data-align=inline-end]]/input-group:focus:rounded-r-base\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n inputGroupAddonVariants,\n};\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst labelVariants = cva(\n \"gap-2 leading-none group-data-[disabled=true]:opacity-50 peer-disabled:opacity-50 flex items-center select-none group-data-[disabled=true]:pointer-events-none peer-disabled:cursor-not-allowed\",\n {\n variants: {\n variant: {\n default: \"\",\n underline:\n \"hover:underline hover:underline-offset-3 hover:decoration-2\",\n destructive: \"font-bold! text-accent-red\",\n },\n size: {\n xs: \"text-xs font-normal\",\n sm: \"text-sm font-medium\",\n md: \"text-base font-medium\",\n lg: \"text-lg font-semibold\",\n xl: \"text-xl font-semibold\",\n },\n },\n },\n);\n\nfunction Label({\n size = \"sm\",\n variant,\n className,\n htmlFor,\n ...props\n}: React.ComponentProps<\"label\"> & VariantProps<typeof labelVariants> & { htmlFor: string }) {\n return (\n <label\n data-slot=\"label\"\n htmlFor={htmlFor}\n className={cn(labelVariants({ size, variant }), className)}\n {...props}\n />\n );\n}\n\nexport { Label, labelVariants };\n","\"use client\";\n\nimport { Progress as ProgressPrimitive } from \"@base-ui/react/progress\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst progressVariants = cva(\"group/progress flex flex-wrap\", {\n variants: {\n size: {\n xs: \"gap-1\",\n sm: \"gap-1\",\n md: \"gap-1\",\n lg: \"gap-2\",\n xl: \"gap-2\",\n },\n raised: {\n default: \"\",\n xs: \"*:-translate-0.5\",\n sm: \"*:-translate-0.75\",\n md: \"*:-translate-1\",\n lg: \"*:-translate-[4.75px]\",\n xl: \"*:-translate-[5.5px]\",\n },\n stacked: {\n default: \"[--stack-translate:--spacing(0)]\",\n xs: \"[--stack-translate:--spacing(0.5)] **:data-[value=100]:rounded-xl **:data-[value=100]:scale-x-101\",\n sm: \"[--stack-translate:3px] **:data-[value=100]:rounded-xl **:data-[value=100]:scale-x-101\",\n md: \"[--stack-translate:--spacing(1)] **:data-[value=100]:rounded-xl **:data-[value=100]:scale-x-101\",\n lg: \"[--stack-translate:4.75px] **:data-[value=100]:rounded-xl **:data-[value=100]:scale-x-101\",\n xl: \"[--stack-translate:5.5px] **:data-[value=100]:rounded-xl **:data-[value=100]:scale-x-101\",\n },\n },\n});\n\ninterface ProgressValue extends ProgressPrimitive.Indicator.Props {\n name?: string;\n value: number;\n className?: string;\n}\ninterface ProgressBaseProps\n extends\n Omit<ProgressPrimitive.Root.Props, \"value\">,\n VariantProps<typeof progressVariants> {\n className?: string;\n children?: React.ReactNode;\n}\n\ntype ProgressSingleProps = ProgressBaseProps & {\n mode?: \"single\";\n value: number | null;\n};\n\ntype ProgressMultipleProps = ProgressBaseProps & {\n mode: \"multiple\";\n value: ProgressValue[];\n};\n\nexport type ProgressProps = ProgressSingleProps | ProgressMultipleProps;\n\nfunction Progress(props: ProgressProps) {\n const {\n size = \"md\",\n raised = \"default\",\n stacked = \"default\",\n className,\n children,\n ...rest\n } = props;\n\n if (props.mode === \"multiple\") {\n const indicators = [...props.value].sort((a, b) => b.value - a.value);\n\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n data-size={size}\n data-raised={raised}\n data-stacked={stacked}\n className={cn(progressVariants({ size, raised, stacked }), className)}\n {...(rest as ProgressPrimitive.Root.Props)}\n >\n {children}\n <ProgressTrack\n style={{\n marginTop: `calc(var(--stack-translate, 0px) * ${indicators.length - 1})`,\n transform: `translateX(calc(var(--stack-translate, 0px) * ${indicators.length - 1}))`,\n }}\n className=\"grid grid-cols-1 *:row-start-1 *:col-start-1 *:row-end-1 *:col-end-1 items-end *:self-start\"\n >\n {indicators.map((item, i) => (\n <ProgressIndicatorGroup\n key={i}\n index={i}\n data-value={item.value}\n {...item}\n >\n <ProgressPrimitive.Value\n className={cn(\n item.value < 5 ? \"pr-0.5\" : \"\",\n \"text-muted leading-none font-heading tabular-nums h-full flex flex-row items-end justify-end gap-1 ml-auto my-auto\",\n \"group-data-[size=xs]/progress:hidden\",\n \"group-data-[size=sm]/progress:hidden\",\n \"group-data-[size=md]/progress:text-[11px]\",\n \"group-data-[size=lg]/progress:text-xs\",\n \"group-data-[size=xl]/progress:text-xs\",\n\n \"group-data-[size=md]/progress:pb-px group-data-[size=md]/progress:pr-1.25\",\n \"group-data-[size=lg]/progress:pb-1 group-data-[size=lg]/progress:pr-1.5 group-data-[size=lg]/progress:translate-y-px\",\n \"group-data-[size=xl]/progress:pb-1.75 group-data-[size=xl]/progress:pr-1.75 group-data-[size=xl]/progress:translate-y-0.5\",\n\n \"group-data-[stacked=default]/progress:translate-y-0 group-data-[stacked=default]/progress:items-center\",\n )}\n data-slot=\"progress-indicator-group-value\"\n >\n {() => (\n <>\n {item.name && (\n <span\n className=\"font-semibold line-clamp-1 opacity-0 -translate-y-10 transition-[opacity,translate] duration-200 hover:ease-in ease-out\"\n data-slot=\"progress-name\"\n >\n {item.name}\n </span>\n )}\n {item.value.toLocaleString(\"default\", {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n })}\n {item.value < 5 ? \"\" : \"%\"}\n </>\n )}\n </ProgressPrimitive.Value>\n </ProgressIndicatorGroup>\n ))}\n </ProgressTrack>\n </ProgressPrimitive.Root>\n );\n }\n\n return (\n <ProgressPrimitive.Root\n {...rest}\n value={props.value}\n data-slot=\"progress\"\n data-size={size}\n data-raised={raised}\n data-stacked={stacked}\n className={cn(progressVariants({ size, raised, stacked }), className)}\n >\n {children}\n\n <ProgressTrack>\n <ProgressIndicator data-value={props.value} />\n </ProgressTrack>\n </ProgressPrimitive.Root>\n );\n}\n\nfunction ProgressTrack({ className, ...props }: ProgressPrimitive.Track.Props) {\n return (\n <ProgressPrimitive.Track\n className={cn(\n \"bg-surface border-2 rounded-full relative flex w-full items-center\",\n \"group-data-[raised=xs]/progress:shadow-xs\",\n \"group-data-[raised=sm]/progress:shadow-sm\",\n \"group-data-[raised=md]/progress:shadow-md\",\n \"group-data-[raised=lg]/progress:shadow-lg\",\n \"group-data-[raised=xl]/progress:shadow-xl\",\n \"group-data-[size=xs]/progress:h-3\",\n \"group-data-[size=sm]/progress:h-4\",\n \"group-data-[size=md]/progress:h-5\",\n \"group-data-[size=lg]/progress:h-6\",\n \"group-data-[size=xl]/progress:h-7\",\n \"group-data-[stacked=default]/progress:overflow-hidden\",\n \"overflow-visible\",\n className,\n )}\n data-slot=\"progress-track\"\n {...props}\n />\n );\n}\n\nfunction ProgressIndicator({\n className,\n ...props\n}: ProgressPrimitive.Indicator.Props) {\n return (\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className={cn(\n \"bg-main h-full transition-all overflow-hidden border-2 rounded-l-xl\",\n \"group-data-[stacked=default]/progress:rounded-l-none\",\n \"group-data-[stacked=default]/progress:border-0\",\n \"group-data-[stacked=xs]/progress:shadow-xs group-data-[stacked=xs]/progress:-translate-0.5\",\n \"group-data-[stacked=sm]/progress:shadow-sm group-data-[stacked=sm]/progress:-translate-0.75\",\n \"group-data-[stacked=md]/progress:shadow-md group-data-[stacked=md]/progress:-translate-1\",\n \"group-data-[stacked=lg]/progress:shadow-lg group-data-[stacked=lg]/progress:-translate-[4.75px]\",\n \"group-data-[stacked=xl]/progress:shadow-xl group-data-[stacked=xl]/progress:-translate-[5.5px]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ProgressIndicatorGroup({\n className,\n children,\n value,\n index,\n ...props\n}: ProgressPrimitive.Indicator.Props & {\n value: number;\n index: number;\n}) {\n return (\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator-group\"\n data-value={value}\n data-group={true}\n className={cn(\n \"group/progress-indicator-group bg-main overflow-hidden transition-height duration-200 ease-in hover:ease-out border-2 rounded-l-xl\",\n \"group-data-[size=xs]/progress:h-2.5 group-data-[size=xs]/progress:hover:h-2.5 group-data-[stacked=default]/progress:group-data-[size=xs]/progress:hover:h-2.5\",\n \"group-data-[size=sm]/progress:h-3.5 group-data-[size=sm]/progress:hover:h-3.5 group-data-[stacked=default]/progress:group-data-[size=sm]/progress:hover:h-3.5\",\n \"group-data-[size=md]/progress:h-4.5 group-data-[size=md]/progress:hover:h-7.75 group-data-[stacked=default]/progress:group-data-[size=md]/progress:hover:h-4.5\",\n \"group-data-[size=lg]/progress:h-5.5 group-data-[size=lg]/progress:hover:h-9.75 group-data-[stacked=default]/progress:group-data-[size=lg]/progress:hover:h-5.5\",\n \"group-data-[size=xl]/progress:h-6.5 group-data-[size=xl]/progress:hover:h-11.25 group-data-[stacked=default]/progress:group-data-[size=xl]/progress:hover:h-6.5\",\n\n \"group-data-[stacked=default]/progress:rounded-none group-data-[stacked=default]/progress:border-0 group-data-[stacked=default]/progress:rounded-l-none\",\n \"group-data-[stacked=xs]/progress:shadow-xs group-data-[stacked=xs]/progress:-translate-0.5\",\n \"group-data-[stacked=sm]/progress:shadow-sm group-data-[stacked=sm]/progress:-translate-0.75\",\n \"group-data-[stacked=md]/progress:shadow-md group-data-[stacked=md]/progress:-translate-1\",\n \"group-data-[stacked=lg]/progress:shadow-lg group-data-[stacked=lg]/progress:-translate-[4.75px]\",\n \"group-data-[stacked=xl]/progress:shadow-xl group-data-[stacked=xl]/progress:-translate-[5.5px]\",\n\n \"hover:**:data-[slot=progress-value]:flex-wrap hover:**:text-foreground hover:**:**:data-[slot=progress-name]:opacity-100 hover:**:data-[slot=progress-name]:translate-0\",\n className,\n )}\n {...props}\n style={{\n minWidth: `${value}%`,\n maxWidth: `${value}%`,\n transform: `translateX(calc(var(--stack-translate, 0px) * -${index})) translateY(calc(var(--stack-translate, 0px) * -${index}))`,\n }}\n >\n {children}\n </ProgressPrimitive.Indicator>\n );\n}\n\nfunction ProgressLabel({ className, ...props }: ProgressPrimitive.Label.Props) {\n return (\n <ProgressPrimitive.Label\n className={cn(\n \"font-heading font-medium\",\n \"group-data-[size=xs]/progress:text-sm\",\n \"group-data-[size=sm]/progress:text-sm\",\n \"group-data-[size=md]/progress:text-base\",\n \"group-data-[size=lg]/progress:text-lg\",\n \"group-data-[size=xl]/progress:text-xl\",\n className,\n )}\n data-slot=\"progress-label\"\n {...props}\n />\n );\n}\n\nfunction ProgressValue({ className, ...props }: ProgressPrimitive.Value.Props) {\n return (\n <ProgressPrimitive.Value\n className={cn(\n \"text-muted ml-auto my-auto font-heading tabular-nums\",\n \"group-data-[size=xs]/progress:text-xs\",\n \"group-data-[size=sm]/progress:text-xs\",\n \"group-data-[size=md]/progress:text-sm\",\n \"group-data-[size=lg]/progress:text-base\",\n \"group-data-[size=xl]/progress:text-base\",\n className,\n )}\n data-slot=\"progress-value\"\n {...props}\n />\n );\n}\n\nexport {\n type ProgressSingleProps,\n type ProgressMultipleProps,\n Progress,\n ProgressTrack,\n ProgressIndicator,\n ProgressLabel,\n ProgressValue,\n progressVariants,\n};\n","\"use client\";\n\nimport { Separator as SeparatorPrimitive } from \"@base-ui/react/separator\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst separatorVariants = cva(\"bg-border shrink-0\", {\n variants: {\n stroke: {\n thin: \"border-0.5\",\n regular: \"border-1\",\n thick: \"border-2\",\n },\n orientation: {\n horizontal: \"h-px w-full\",\n vertical: \"w-px self-stretch\",\n },\n },\n defaultVariants: {\n stroke: \"regular\",\n orientation: \"horizontal\",\n },\n});\n\nfunction Separator({\n className,\n orientation,\n stroke,\n ...props\n}: SeparatorPrimitive.Props & VariantProps<typeof separatorVariants>) {\n return (\n <SeparatorPrimitive\n data-slot=\"separator\"\n orientation={orientation}\n className={cn(separatorVariants({ orientation, stroke }), className)}\n {...props}\n />\n );\n}\n\nexport { Separator };\n","\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst skeletonVariants = cva(\"bg-foreground/30 rounded-base\", {\n variants: {\n variant: {\n circle: \"aspect-square w-auto rounded-full\",\n square: \"aspect-square w-auto\",\n default: \"grow\",\n text: \"aspect-[1/19] w-auto rounded-full max-h-10\",\n },\n animate: {\n true: \"animate-pulse\",\n false: \"\",\n },\n },\n});\n\nfunction Skeleton({\n variant = \"default\",\n animate = true,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof skeletonVariants>) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(skeletonVariants({ variant, animate }), className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton, skeletonVariants };\n","\"use client\";\n\nimport { Switch as SwitchPrimitive } from \"@base-ui/react/switch\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { useHaptics, HAPTIC_SWITCH } from \"@/lib/haptics\";\n\nconst switchVariants = cva(\n \"neo-base neo-switch-focus relative cursor-pointer inline-flex items-center data-checked:bg-main data-unchecked:bg-surface shrink-0 border-2 border-border transition-[translate,box-shadow,color] aria-disabled:cursor-not-allowed aria-disabled:opacity-50\",\n {\n variants: {\n size: {\n sm: \"h-5 w-10\",\n md: \"h-6 w-12\",\n lg: \"h-7 w-14\",\n },\n rounded: {\n none: \"rounded-none\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-[999px]\",\n },\n },\n defaultVariants: {\n size: \"md\",\n rounded: \"full\",\n },\n },\n);\n\nfunction Switch({\n className,\n size = \"md\",\n rounded = \"full\",\n onCheckedChange,\n ...props\n}: SwitchPrimitive.Root.Props & VariantProps<typeof switchVariants>) {\n const { trigger } = useHaptics();\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n data-rounded={rounded}\n className={cn(\n switchVariants({ size, rounded }),\n \"peer group/switch\",\n className,\n )}\n aria-label={props[\"aria-label\"] ?? \"switch\"}\n onCheckedChange={(checked, event) => {\n trigger(HAPTIC_SWITCH);\n onCheckedChange?.(checked, event);\n }}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"bg-surface border-2 border-border pointer-events-none block transition-[translate] duration-300\",\n \"group-data-checked/switch:ml-px group-data-unchecked/switch:-ml-px\",\n \"group-data-[rounded=full]/switch:group-data-checked/switch:ml-0 group-data-[rounded=full]/switch:group-data-unchecked/switch:ml-0\",\n\n \"group-data-unchecked/switch:translate-x-1\",\n\n \"group-data-[size=sm]/switch:size-3\",\n \"group-data-[size=md]/switch:size-4\",\n \"group-data-[size=lg]/switch:size-5\",\n \"group-data-[size=sm]/switch:group-data-checked/switch:translate-x-5\",\n \"group-data-[size=md]/switch:group-data-checked/switch:translate-x-6\",\n \"group-data-[size=lg]/switch:group-data-checked/switch:translate-x-7\",\n\n \"group-data-[rounded=none]/switch:rounded-none\",\n \"group-data-[rounded=sm]/switch:rounded-sm\",\n \"group-data-[rounded=md]/switch:rounded-md\",\n \"group-data-[rounded=lg]/switch:rounded-lg\",\n \"group-data-[rounded=full]/switch:rounded-full\",\n )}\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch, switchVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst tableVariants = cva(\"w-full caption-bottom text-sm\", {\n variants: {\n variant: {\n default: \"\",\n filled: \"\",\n lines: \"\",\n },\n },\n});\n\nfunction Table({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"table\"> & VariantProps<typeof tableVariants>) {\n return (\n <div\n data-slot=\"table-container\"\n className=\"relative w-full overflow-x-auto\"\n >\n <table\n data-slot=\"table\"\n data-variant={variant}\n className={cn(tableVariants({ variant }), \"group/table\", className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b font-heading\", className)}\n {...props}\n />\n );\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n );\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"*:bg-transparent border-t font-medium font-heading [&>tr]:last:border-b-0\",\n \"group-data-[variant=default]/table:bg-surface\",\n \"group-data-[variant=filled]/table:bg-main-secondary\",\n \"group-data-[variant=lines]/table:bg-surface\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b transition-colors duration-300 ease\",\n \"group-data-[variant=default]/table:bg-surface\",\n \"group-data-[variant=default]/table:hover:even:bg-main\",\n \"group-data-[variant=default]/table:hover:odd:bg-main-secondary\",\n \"group-data-[variant=default]/table:data-[state=selected]:bg-subtle\",\n\n \"group-data-[variant=filled]/table:bg-main\",\n \"group-data-[variant=filled]/table:hover:odd:bg-surface\",\n \"group-data-[variant=filled]/table:hover:even:bg-main-secondary\",\n \"group-data-[variant=filled]/table:data-[state=selected]:bg-foreground/25\",\n \"group-data-[variant=filled]/table:last:border-b-2\",\n\n \"group-data-[variant=lines]/table:bg-surface\",\n \"group-data-[variant=lines]/table:hover:even:bg-main\",\n \"group-data-[variant=lines]/table:hover:odd:bg-main-secondary\",\n \"group-data-[variant=lines]/table:data-[state=selected]:bg-main/50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0\",\n \"group-data-[variant=filled]/table:border-r-2 group-data-[variant=filled]/table:border-t-2 group-data-[variant=filled]/table:first:border-l-2\",\n \"group-data-[variant=lines]/table:not-last:border-r-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0\",\n \"group-data-[variant=filled]/table:first:border-l-2 group-data-[variant=filled]/table:border-r-2\",\n \"group-data-[variant=lines]/table:not-last:border-r-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\n \"text-muted hover:text-foreground mt-4 text-sm font-heading\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n tableVariants,\n};\n","import type { ChangeEvent, ElementType } from \"react\";\n\nimport { COMPONENT } from \"@bonsai/constants\";\n\nimport {\n defineBonsaiRegistry,\n defineComponent,\n type BonsaiRegistry,\n type ComponentCapability,\n type ControlledFieldSpec,\n} from \"../lib/registry/types\";\n\nimport { A } from \"../components/ui/a\";\nimport { H } from \"../components/ui/h\";\nimport { P } from \"../components/ui/p\";\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from \"../components/ui/accordion\";\nimport { Alert } from \"../components/ui/alert\";\nimport { Avatar } from \"../components/ui/avatar\";\nimport { Badge } from \"../components/ui/badge\";\nimport { Button } from \"../components/ui/button\";\nimport {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n CardAction,\n CardIcon,\n} from \"../components/ui/card\";\nimport { Checkbox } from \"../components/ui/checkbox\";\nimport {\n Collapsible,\n CollapsibleTrigger,\n CollapsibleContent,\n} from \"../components/ui/collapsible\";\nimport { Input } from \"../components/ui/input\";\nimport { InputOTP } from \"../components/ui/input-otp\";\nimport {\n InputGroup,\n InputGroupText,\n InputGroupAddon,\n InputGroupInput,\n InputGroupButton,\n InputGroupTextarea,\n} from \"../components/ui/input-group\";\nimport { Label } from \"../components/ui/label\";\nimport { Loader } from \"../components/ui/loader\";\nimport { Progress } from \"../components/ui/progress\";\nimport { Separator } from \"../components/ui/separator\";\nimport { Skeleton } from \"../components/ui/skeleton\";\nimport { Switch } from \"../components/ui/switch\";\nimport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} from \"../components/ui/table\";\nimport { Textarea } from \"../components/ui/textarea\";\n\n/**\n * Describes how the renderer two-way-binds a component to the store: which prop\n * carries the value, which prop reports a change, and how to pull the new value\n * out of whatever that prop is called with.\n */\nexport interface ControlledInput {\n valueProp: string;\n changeProp: string;\n // Method syntax keeps the parameter bivariant, so each extractor declares what its\n // component's change prop passes (an event, a string, a Date, ...).\n extractor(eventOrValue: unknown): unknown;\n}\n\n/**\n * A controlled-input entry is either a single binding or, for components whose\n * binding depends on `args.type` (e.g. `input`), a map of subtype -> binding\n * with a `default` fallback.\n */\nexport type ControlledInputEntry =\n | ControlledInput\n | Record<string, ControlledInput>;\n\nexport type ComponentRegistry = Record<string, ElementType>;\nexport type ControlledInputRegistry = Record<string, ControlledInputEntry>;\n\n/**\n * A bundle of components plus their controlled-input bindings. Both the\n * built-in heavy presets (`renderer/presets/*`) and consumer-supplied\n * extensions to `createBonsaiRenderer` use this shape; `extendRegistry`\n * layers it onto the `BonsaiRegistry` the renderer consumes.\n */\nexport interface BonsaiPreset {\n components?: ComponentRegistry;\n controlledInputs?: ControlledInputRegistry;\n}\n\nconst FORM_FIELD_CAPABILITIES: ComponentCapability[] = [\"bindings\", \"formField\", \"events\", \"ssr\", \"pdf\"];\nconst DEFAULT_CAPABILITIES: ComponentCapability[] = [\"children\", \"bindings\", \"events\", \"ssr\", \"pdf\"];\n\nfunction toControlledFieldSpec(entry: ControlledInput): ControlledFieldSpec {\n return {\n valueProp: entry.valueProp,\n changeProp: entry.changeProp,\n extract: entry.extractor,\n };\n}\n\nfunction toControlled(\n entry: ControlledInputEntry | undefined,\n): ControlledFieldSpec | Record<string, ControlledFieldSpec> | undefined {\n if (!entry) return undefined;\n if (typeof entry === \"object\" && \"default\" in entry) {\n return Object.fromEntries(\n Object.entries(entry as Record<string, ControlledInput>).map(([subtype, spec]) => [\n subtype,\n toControlledFieldSpec(spec),\n ]),\n );\n }\n return toControlledFieldSpec(entry as ControlledInput);\n}\n\n/**\n * Layers a preset over `base`, type by type: a supplied component replaces the\n * base's component but keeps its binding, and a supplied binding re-binds the\n * base's component — the same \"caller wins per key\" semantics as spreading the\n * two maps separately.\n */\nexport function extendRegistry(\n base: BonsaiRegistry,\n { components = {}, controlledInputs = {} }: BonsaiPreset,\n): BonsaiRegistry {\n const merged = { ...base.components };\n for (const type of new Set([...Object.keys(components), ...Object.keys(controlledInputs)])) {\n const prev = Object.hasOwn(merged, type) ? merged[type] : undefined;\n const component = Object.hasOwn(components, type) ? components[type] : prev?.component;\n if (component === undefined) continue;\n const controlled = Object.hasOwn(controlledInputs, type)\n ? toControlled(controlledInputs[type])\n : prev?.controlled;\n merged[type] = defineComponent({\n ...prev,\n component,\n controlled,\n capabilities: prev?.capabilities ?? (controlled ? FORM_FIELD_CAPABILITIES : DEFAULT_CAPABILITIES),\n });\n }\n return { ...base, components: merged };\n}\n\n/**\n * Every built-in component that carries no heavy third-party dependency.\n * Deliberately excludes `map`, `calendar` and `signature` — those live in\n * `renderer/presets/*` so a core consumer never bundles MapLibre,\n * react-day-picker or react-signature-canvas.\n */\nexport const coreComponents: ComponentRegistry = {\n [COMPONENT.A]: A,\n [COMPONENT.H]: H,\n [COMPONENT.P]: P,\n [COMPONENT.OL]: \"ol\",\n [COMPONENT.UL]: \"ul\",\n [COMPONENT.LI]: \"li\",\n [COMPONENT.DIV]: \"div\",\n [COMPONENT.SPAN]: \"span\",\n [COMPONENT.IMAGE]: \"img\",\n [COMPONENT.ACCORDION]: Accordion,\n [COMPONENT.ACCORDION_ITEM]: AccordionItem,\n [COMPONENT.ACCORDION_TRIGGER]: AccordionTrigger,\n [COMPONENT.ACCORDION_CONTENT]: AccordionContent,\n [COMPONENT.ALERT]: Alert,\n [COMPONENT.AVATAR]: Avatar,\n [COMPONENT.BADGE]: Badge,\n [COMPONENT.BUTTON]: Button,\n [COMPONENT.CARD]: Card,\n [COMPONENT.CARD_HEADER]: CardHeader,\n [COMPONENT.CARD_TITLE]: CardTitle,\n [COMPONENT.CARD_DESCRIPTION]: CardDescription,\n [COMPONENT.CARD_CONTENT]: CardContent,\n [COMPONENT.CARD_FOOTER]: CardFooter,\n [COMPONENT.CARD_ACTION]: CardAction,\n [COMPONENT.CARD_ICON]: CardIcon,\n [COMPONENT.CHECKBOX]: Checkbox,\n [COMPONENT.COLLAPSIBLE]: Collapsible,\n [COMPONENT.COLLAPSIBLE_TRIGGER]: CollapsibleTrigger,\n [COMPONENT.COLLAPSIBLE_CONTENT]: CollapsibleContent,\n [COMPONENT.OTP]: InputOTP,\n [COMPONENT.INPUT]: Input,\n [COMPONENT.INPUT_GROUP]: InputGroup,\n [COMPONENT.INPUT_GROUP_TEXT]: InputGroupText,\n [COMPONENT.INPUT_GROUP_ADDON]: InputGroupAddon,\n [COMPONENT.INPUT_GROUP_INPUT]: InputGroupInput,\n [COMPONENT.INPUT_GROUP_BUTTON]: InputGroupButton,\n [COMPONENT.INPUT_GROUP_TEXTAREA]: InputGroupTextarea,\n [COMPONENT.LABEL]: Label,\n [COMPONENT.LOADER]: Loader,\n [COMPONENT.PROGRESS]: Progress,\n [COMPONENT.SWITCH]: Switch,\n [COMPONENT.SEPARATOR]: Separator,\n [COMPONENT.SKELETON]: Skeleton,\n [COMPONENT.TABLE]: Table,\n [COMPONENT.TABLE_HEADER]: TableHeader,\n [COMPONENT.TABLE_BODY]: TableBody,\n [COMPONENT.TABLE_FOOTER]: TableFooter,\n [COMPONENT.TABLE_HEAD]: TableHead,\n [COMPONENT.TABLE_ROW]: TableRow,\n [COMPONENT.TABLE_CELL]: TableCell,\n [COMPONENT.TABLE_CAPTION]: TableCaption,\n [COMPONENT.TEXTAREA]: Textarea,\n};\n\n/** Controlled-input bindings for the components in `coreComponents`. */\nexport const coreControlledInputs: ControlledInputRegistry = {\n [COMPONENT.INPUT]: {\n text: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e: ChangeEvent<HTMLInputElement>) => e.target.value,\n },\n email: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e: ChangeEvent<HTMLInputElement>) => e.target.value,\n },\n password: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e: ChangeEvent<HTMLInputElement>) => e.target.value,\n },\n number: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n // valueAsNumber is NaN (never nullish) for an empty or partial entry; keep the raw string then.\n extractor: (e: ChangeEvent<HTMLInputElement>) =>\n Number.isNaN(e.target.valueAsNumber)\n ? e.target.value\n : e.target.valueAsNumber,\n },\n default: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e: ChangeEvent<HTMLInputElement>) => e.target.value,\n },\n },\n // input-otp calls onChange with the new string, not an event.\n [COMPONENT.OTP]: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (value: string) => value,\n },\n [COMPONENT.CHECKBOX]: {\n valueProp: \"checked\",\n changeProp: \"onCheckedChange\",\n extractor: (checked) => checked,\n },\n [COMPONENT.TEXTAREA]: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e: ChangeEvent<HTMLTextAreaElement>) => e.target.value,\n },\n [COMPONENT.INPUT_GROUP_INPUT]: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e: ChangeEvent<HTMLInputElement>) => e.target.value,\n },\n [COMPONENT.INPUT_GROUP_TEXTAREA]: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e: ChangeEvent<HTMLTextAreaElement>) => e.target.value,\n },\n [COMPONENT.SWITCH]: {\n valueProp: \"checked\",\n changeProp: \"onCheckedChange\",\n extractor: (checked) => checked,\n },\n};\n\n/**\n * The registry used when no renderer-scoped registry is provided. Same library\n * identity as `pebbleRegistry` (it is a subset of it), but without per-component\n * `propsSchema`s so the core entry never bundles `@bonsai/schemas`.\n */\nexport const coreRegistry: BonsaiRegistry = extendRegistry(\n defineBonsaiRegistry({\n id: \"pebble-ui\",\n version: \"1.0.0\",\n namespace: \"pebble\",\n fallback: \"div\",\n components: {},\n }),\n { components: coreComponents, controlledInputs: coreControlledInputs },\n);\n","import { createContext, createElement, Fragment, useContext } from \"react\";\nimport type { Config, ConfigNode } from \"../../types\";\nimport { coreRegistry } from \"../../renderer/core-registry\";\nimport type { BonsaiRegistry, ControlledFieldSpec } from \"../../lib/registry/types\";\nimport { parseExpression } from \"../../lib/ast\";\nimport {\n splitPathSegments,\n unwrapSegment,\n type ClickAction,\n type CompiledEach,\n type CompiledKey,\n type CompiledNode,\n} from \"../../lib/renderer/compile-template\";\nimport { URL_ARGS, safeUrl } from \"../../lib/renderer/safe-props\";\n\n/**\n * Registry the renderer resolves component types against. Defaults to the\n * lightweight core registry; `createBonsaiRenderer` provides a scoped one, so\n * two renderers never share (or mutate) each other's components.\n */\nexport const BonsaiRegistryContext = createContext<BonsaiRegistry>(coreRegistry);\n\nexport function useBonsaiRegistry(): BonsaiRegistry {\n return useContext(BonsaiRegistryContext);\n}\n\n// The render mode (\"web\" | \"pdf\" | \"preview\") is declared at the root but must\n// reach leaf components — a `pdf` signature is a static <img>, not the\n// interactive pad. Prop-drilling it through every node would touch dozens of\n// call sites for one consumer, so it travels by context instead. Defaults to\n// \"web\" so any component rendered outside a <Bonsai> root keeps its\n// interactive behaviour.\nexport type RenderMode = \"web\" | \"pdf\" | \"preview\";\nconst BonsaiRenderModeContext = createContext<RenderMode>(\"web\");\n\n/** Read by leaf components that render differently in a non-interactive document. */\nexport function useBonsaiRenderMode(): RenderMode {\n return useContext(BonsaiRenderModeContext);\n}\n\n/**\n * Provides the per-instance render mode, plus the `registry` prop when given\n * (otherwise the inherited renderer-scoped registry stays in effect).\n */\nexport function BonsaiRoot({\n registry,\n render = \"web\",\n children,\n}: Pick<BonsaiProps, \"registry\" | \"render\"> & { children: React.ReactNode }) {\n const inherited = useBonsaiRegistry();\n return (\n <BonsaiRegistryContext.Provider value={registry ?? inherited}>\n <BonsaiRenderModeContext.Provider value={render}>{children}</BonsaiRenderModeContext.Provider>\n </BonsaiRegistryContext.Provider>\n );\n}\n\nexport const VOID_ELEMENTS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\nexport const getKey = (leaf: CompiledNode, index: number, path: string): string => {\n return `${leaf.type}-${path}-${index}`;\n};\n\nexport function getValue(data: unknown, path: string, def?: unknown): unknown {\n if (!path) return data;\n const segments = splitPathSegments(path);\n return (\n segments.reduce<unknown>((acc, seg) => {\n if (acc == null) return undefined;\n return (acc as Record<string, unknown>)[unwrapSegment(seg)];\n }, data) ?? def\n );\n}\n\nexport function setValue(obj: Record<string, unknown>, path: string, value: unknown) {\n if (!path) {\n Object.assign(obj, value);\n return;\n }\n const segments = splitPathSegments(path).map(unwrapSegment);\n // Paths come from templates: never write through `__proto__`, and only walk own\n // keys, so e.g. `constructor.prototype.x` can't reach a shared prototype.\n if (segments.includes(\"__proto__\")) return;\n let current = obj;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n if (!Object.hasOwn(current, seg) || current[seg] == null) {\n current[seg] = /^\\d+$/.test(segments[i + 1]) ? [] : {};\n }\n current = current[seg] as Record<string, unknown>;\n }\n current[segments[segments.length - 1]] = value;\n}\n\n// Leading identifier of a path, e.g. \"applicant\" for \"applicant.name\" or \"rows[0].x\" -> \"rows\".\nexport function pathRoot(path: string): string {\n const rootMatch = path.match(/^[^.[]+/);\n return rootMatch ? rootMatch[0] : path;\n}\n\n// True when a path starts at an alias bound to a row *value* (a computed `each` row) rather than a store path.\nexport function isValueScoped(\n path: string,\n valueScope?: Record<string, unknown>,\n): boolean {\n return !!valueScope && Object.hasOwn(valueScope, pathRoot(path));\n}\n\n// Resolves an `each`-scoped alias path to its real store path, e.g. \"applicant.name\" -> \"applicants.3.name\".\nexport function resolveScopedPath(\n path: string,\n scope?: Record<string, string>,\n): string {\n if (!scope) return path;\n const root = pathRoot(path);\n const prefix = scope[root];\n return prefix == null ? path : prefix + path.slice(root.length);\n}\n\nexport const evaluateDynamicValue = (value: unknown, data: Record<string, unknown>): unknown => {\n return parseExpression(value, data);\n};\n\n// Builds the nested data slice a node evaluates its bindings against, from its\n// precompiled keys. The splitting/unwrapping happened once at compile time; only\n// the value lookup (which depends on scope and the live store) happens here.\nexport function buildDataSlice(\n keys: CompiledKey[],\n resolveValue: (key: string) => unknown,\n): Record<string, unknown> {\n const acc: Record<string, unknown> = {};\n for (const { key, segments, numericNext } of keys) {\n const value = resolveValue(key);\n if (segments.length === 1) {\n acc[key] = value;\n continue;\n }\n let current = acc;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n if (\n !(seg in current) ||\n typeof current[seg] !== \"object\" ||\n current[seg] === null\n ) {\n current[seg] = numericNext[i] ? [] : {};\n }\n current = current[seg] as Record<string, unknown>;\n }\n current[segments[segments.length - 1]] = value;\n }\n return acc;\n}\n\n// Unknown types (including custom ones the active registry doesn't know about)\n// follow the registry's `fallback`: a plain <div> by default, a custom\n// component, or — with `\"error\"` — a throw (caught by the node's error guard).\n// `hasOwn` keeps prototype keys like \"constructor\" from resolving.\nexport const resolveElementType = (\n registry: BonsaiRegistry,\n type?: string,\n): React.ElementType => {\n if (!type) return \"div\";\n if (Object.hasOwn(registry.components, type)) {\n return registry.components[type].component as React.ElementType;\n }\n if (registry.fallback === \"error\") {\n throw new Error(\n `Bonsai: unknown component type \"${type}\" in registry \"${registry.id}\"@\"${registry.version}\"`,\n );\n }\n if (registry.fallback && registry.fallback !== \"div\") return registry.fallback;\n return \"div\";\n};\n\n// Only args the compiler classified as `{{...}}` expressions (plus caller-supplied\n// `extra`, whose values aren't known ahead of time) go through the evaluator;\n// static props are passed straight through, which is what they evaluated to anyway.\n// `node.args` is already sanitised, so only evaluated URLs still need checking.\nexport const prepareState = (\n node: CompiledNode,\n dataSlice: Record<string, unknown>,\n key: string,\n extra: Record<string, unknown> = {},\n): Record<string, unknown> => {\n const baseProps: Record<string, unknown> = {\n key,\n ...node.args,\n ...extra,\n };\n for (const k of Object.keys(baseProps)) {\n if (node.dynamicArgs.has(k) || Object.hasOwn(extra, k)) {\n const value = evaluateDynamicValue(baseProps[k], dataSlice);\n baseProps[k] = URL_ARGS.has(k) ? safeUrl(value) : value;\n }\n }\n return baseProps;\n};\n\n// Pure (no hooks) so it can be called unconditionally from either render path.\nexport function computeControlledOverrides(\n ctrlInput: ControlledFieldSpec,\n keyPath: string,\n storeValue: unknown,\n rawArgs: Record<string, unknown>,\n updateData: (path: string, value: unknown) => void,\n): Record<string, unknown> {\n if (rawArgs[ctrlInput.changeProp]) return {};\n return {\n [ctrlInput.changeProp]: (eventOrValue: unknown) =>\n updateData(keyPath, ctrlInput.extract(eventOrValue)),\n [ctrlInput.valueProp]: storeValue,\n };\n}\n\nconst ignoreUpdate = () => {};\n\n// `onClick` from a template: each action writes a value to a store path. Every `to`\n// reads the render-time slice, so later actions in one click see the pre-click state.\nfunction clickHandler(\n actions: ClickAction[],\n data: Record<string, unknown>,\n ctx: NodeCtx,\n updateData: (path: string, value: unknown) => void,\n) {\n return () => {\n for (const { set, to } of actions) {\n // A computed `each` row has no store path to write to, same as its controlled inputs.\n if (isValueScoped(set, ctx.valueScope)) continue;\n // Cloned so the store never aliases the template or a frozen snapshot.\n updateData(resolveScopedPath(set, ctx.scope), cloneData(evaluateDynamicValue(to, data)));\n }\n };\n}\n\n// Isolated so \"controlled or not\" is a conditional mount, not a conditional hook call within one component instance.\nexport function ControlledLeaf({\n node,\n dataSlice,\n elementKey,\n ElementType,\n ctrlInput,\n keyPath,\n storeValue,\n updateData,\n actionProps,\n children,\n}: {\n node: CompiledNode;\n dataSlice: Record<string, unknown>;\n elementKey: string;\n ElementType: React.ElementType;\n ctrlInput: ControlledFieldSpec;\n keyPath: string;\n storeValue: unknown;\n updateData: (path: string, value: unknown) => void;\n actionProps?: Record<string, unknown>;\n children?: React.ReactNode;\n}) {\n const overrides = computeControlledOverrides(\n ctrlInput,\n keyPath,\n storeValue,\n node.args,\n updateData,\n );\n const props = prepareState(node, dataSlice, elementKey, { ...actionProps, ...overrides });\n return children !== undefined\n ? createElement(ElementType, props, children)\n : createElement(ElementType, props);\n}\n\nexport function resolveCtrlInput(\n registry: BonsaiRegistry,\n type: string,\n tree: ConfigNode,\n): ControlledFieldSpec | undefined {\n if (!Object.hasOwn(registry.components, type)) return undefined;\n const entry = registry.components[type].controlled;\n if (!entry) return undefined;\n if (typeof entry === \"object\" && \"default\" in entry) {\n // `args.type` is the input's subtype (e.g. \"number\"), a string per the input schema.\n const subtype = (tree.args?.type as string | undefined) || \"default\";\n const byType = entry as Record<string, ControlledFieldSpec>;\n return (Object.hasOwn(byType, subtype) ? byType[subtype] : undefined) || byType.default;\n }\n return entry as ControlledFieldSpec;\n}\n\nexport interface BonsaiProps {\n /** Template to render. Compiled once per template identity. */\n template: Config;\n /**\n * Seed data for this instance. Read by reference: the store is (re)seeded\n * from it on mount and whenever a *different object* is passed. Mutating the\n * same object in place does nothing — pass a new object to force an update.\n */\n data?: Record<string, unknown>;\n /** Fired after every store-data change that came from inside the renderer (a user edit). */\n onDataChange?: (data: Record<string, unknown>) => void;\n /** When supplied, replaces the `captureUrl` fetch on submit. Throw to signal failure. */\n onSubmit?: (data: Record<string, unknown>) => void | Promise<void>;\n /** Receives anything `onSubmit`/the capture fetch throws. Without it, the error propagates. */\n onError?: (error: unknown) => void;\n /** Compatibility capture endpoint, used only when `onSubmit` is absent. */\n captureUrl?: string;\n expiry?: string;\n status?: \"pending\" | \"captured\" | \"completed\" | \"error\" | \"revoked\";\n /** Rendering mode, readable by leaves via `useBonsaiRenderMode`. `\"pdf\"` always renders a plain wrapper. */\n render?: RenderMode;\n /**\n * Registry to resolve component types against for this instance. Defaults to\n * the registry of the renderer it was created from (see `createBonsaiRenderer`).\n */\n registry?: BonsaiRegistry;\n /** Wrapper element. `\"div\"` lets instances embed inside a host form without nesting `<form>`s. */\n as?: \"form\" | \"div\";\n}\n\n/**\n * The wrapper element for an instance. `render: \"pdf\"` has always produced a\n * plain container, so it wins over `as`; otherwise `as` decides.\n */\nexport function resolveWrapper(\n render: BonsaiProps[\"render\"],\n as: BonsaiProps[\"as\"],\n): \"form\" | \"div\" {\n if (render === \"pdf\") return \"div\";\n return as === \"div\" ? \"div\" : \"form\";\n}\n\n/**\n * Deep-copies the plain objects/arrays in `value`, passing anything else\n * (Dates, class instances, functions, files) through by reference.\n *\n * Two reasons this is required rather than nice-to-have:\n * 1. valtio caches proxies by source object, so seeding two instances from the\n * same `data` object would hand both the *same* proxy — edits in one would\n * appear in the other.\n * 2. Writes through a valtio proxy reach the source object, so an uncloned seed\n * would let user edits mutate the caller's `data` prop.\n */\nexport function cloneData<T>(value: T): T {\n if (Array.isArray(value)) return value.map((item) => cloneData(item)) as T;\n if (value !== null && typeof value === \"object\") {\n const proto = Object.getPrototypeOf(value);\n if (proto === Object.prototype || proto === null) {\n const out: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n out[key] = cloneData(item);\n }\n return out as T;\n }\n }\n return value;\n}\n\n/**\n * What a node's bindings resolve against: the instance's store (`data` plus\n * top-level fields like `status`), or a bare data object, since lookups fall\n * back to it when there's no `data` key.\n */\nexport type GlobalData = { data?: Record<string, unknown>; [field: string]: unknown };\n\n// The one thing every `each` row hands its descendants, in whichever shape a\n// given mode threads through its tree — `scope` is the only thing both modes\n// share, since both resolve `each`-scoped alias paths against it.\nexport interface NodeCtx {\n scope?: Record<string, string>;\n /**\n * Alias -> row value, for rows of a computed `each` (e.g. `{{xs.filter(...)}}`),\n * which have no store path to resolve against. Only the client sets it; SSR\n * already prop-drills each row's value.\n */\n valueScope?: Record<string, unknown>;\n}\n\n/**\n * The seam between `RenderTreeServer` and `RenderTreeClient`: everything that\n * differs between prop-drilled SSR data and the client's per-node\n * `useSnapshot` subscription is captured here, verbatim from each original\n * implementation. `renderCompiledNode` below owns the control flow (isText /\n * isIf / isEach / element dispatch) that is identical in both; it never\n * merges the two lookup strategies a mode implements.\n */\nexport interface RenderStrategy<Ctx extends NodeCtx> {\n /** Builds the data slice a node evaluates its own bindings against. */\n dataSlice(node: CompiledNode, ctx: Ctx, globalData: GlobalData): Record<string, unknown>;\n /** Derives the child context an `each` row hands its descendants. */\n rowCtx(\n ctx: Ctx,\n globalData: GlobalData,\n item: unknown,\n i: number,\n each: CompiledEach,\n realItemsPath: string,\n ): Ctx;\n /** Renders one child node at `path`, keyed by the precomputed `key`. */\n renderChild(\n child: CompiledNode,\n i: number,\n path: string,\n ctx: Ctx,\n key: string,\n ): React.ReactNode;\n}\n\n/**\n * Hook-free control flow shared by `RenderTreeServer` and `RenderTreeClient`:\n * isText / isIf / isEach / ctrlInput-binding / image-guard / void-element /\n * error-boundary dispatch. Callers do their own hook work (registry,\n * snapshot, updateData) before calling in, then hand the mode-specific\n * lookup/recursion behaviour through `mode`.\n */\nexport function renderCompiledNode<Ctx extends NodeCtx>(\n node: CompiledNode,\n index: number,\n path: string,\n ctx: Ctx,\n globalData: GlobalData,\n registry: BonsaiRegistry,\n updateData: (path: string, value: unknown) => void,\n mode: RenderStrategy<Ctx>,\n): React.ReactNode {\n const tree = node.source;\n if (!tree) return null;\n\n const data = mode.dataSlice(node, ctx, globalData);\n\n // Same check as `node.isText`, written out so `tree` narrows to a component node below.\n if (typeof tree === \"string\") {\n return evaluateDynamicValue(tree, data) as React.ReactNode;\n }\n\n try {\n const type = node.type;\n\n if (node.isIf) {\n const conditionValue = evaluateDynamicValue(tree.args?.condition, data);\n if (!conditionValue) return null;\n return (\n <>\n {node.children.map((child, i) =>\n mode.renderChild(\n child,\n i,\n `${path}-${index}-if`,\n ctx,\n getKey(child, i, `${path}-${index}-if`),\n ),\n )}\n </>\n );\n }\n\n if (node.isEach) {\n const each = node.each!;\n const { as, keyExpr, rawItemsPath } = each;\n const itemsValue = evaluateDynamicValue(tree.args?.items, data);\n const items: unknown[] = Array.isArray(itemsValue) ? itemsValue : [];\n\n // Real store path the array lives at, so two-way binding in a row writes back to the right index;\n // only meaningful for a plain-path `items` binding — a computed/filtered array (or a path under a\n // computed row's alias) has no store path, so its rows render read-only.\n const realItemsPath =\n rawItemsPath && !isValueScoped(rawItemsPath, ctx.valueScope)\n ? resolveScopedPath(rawItemsPath, ctx.scope)\n : \"\";\n\n return (\n <>\n {items.map((item, i) => {\n const rowCtxValue = mode.rowCtx(ctx, globalData, item, i, each, realItemsPath);\n const rowKey = keyExpr\n ? evaluateDynamicValue(keyExpr, { ...data, [as]: item })\n : i;\n // Keyed on rowKey, not the volatile index `i`, so descendants' keys stay stable across reorders too.\n const rowPath = `${path}-${index}-each-${rowKey}`;\n\n return (\n <Fragment key={String(rowKey)}>\n {node.children.map((child, ci) =>\n mode.renderChild(\n child,\n ci,\n rowPath,\n rowCtxValue,\n getKey(child, ci, rowPath),\n ),\n )}\n </Fragment>\n );\n })}\n </>\n );\n }\n\n const ElementType = resolveElementType(registry, type);\n const key = getKey(node, index, path);\n const ctrlInput = resolveCtrlInput(registry, type, tree);\n\n let binding:\n | { keyPath: string; storeValue: unknown; readOnly?: boolean }\n | undefined;\n if (ctrlInput) {\n // The unresolved binding path was extracted at compile time; resolving it\n // against this row's scope stays here.\n const rawKeyPath = node.argPaths[ctrlInput.valueProp];\n if (rawKeyPath !== undefined && isValueScoped(rawKeyPath, ctx.valueScope)) {\n // Bound to a computed `each` row: show the value, but there's no store path to write edits to.\n binding = {\n keyPath: rawKeyPath,\n storeValue: getValue(ctx.valueScope, rawKeyPath),\n readOnly: true,\n };\n } else if (rawKeyPath !== undefined) {\n const keyPath = resolveScopedPath(rawKeyPath, ctx.scope);\n binding = {\n keyPath,\n storeValue: getValue(globalData.data ?? globalData, keyPath),\n };\n } else if (node.dynamicArgs.has(ctrlInput.valueProp)) {\n // A formula (`{{a + b}}`) has no store path: show its result, ignore edits.\n binding = {\n keyPath: \"\",\n storeValue: evaluateDynamicValue(tree.args?.[ctrlInput.valueProp], data),\n readOnly: true,\n };\n }\n }\n\n if (node.isImage) {\n // Same checked value `prepareState` renders, so SSR and the client's static path agree.\n const src = safeUrl(evaluateDynamicValue(node.args.src, data));\n if (src === \"\" || src == null) return null;\n }\n\n // A registry entry that lists capabilities must include \"events\" to get a handler;\n // either way the raw action list is replaced, so it never reaches the component.\n let actionProps: Record<string, unknown> | undefined;\n if (node.actions) {\n const caps = Object.hasOwn(registry.components, type)\n ? registry.components[type].capabilities\n : undefined;\n actionProps = {\n onClick: !caps || caps.includes(\"events\")\n ? clickHandler(node.actions, data, ctx, updateData)\n : undefined,\n };\n }\n\n const childNodes =\n node.children.length > 0\n ? node.children.map((branch: CompiledNode, i: number) =>\n mode.renderChild(\n branch,\n i,\n `${path}-${index}`,\n ctx,\n getKey(node, i, `${path}-${index}`),\n ),\n )\n : undefined;\n\n const safeChildNodes =\n typeof ElementType === \"string\" && VOID_ELEMENTS.has(ElementType)\n ? undefined\n : childNodes;\n\n if (binding && ctrlInput) {\n return (\n <ControlledLeaf\n node={node}\n dataSlice={data}\n elementKey={key}\n ElementType={ElementType}\n ctrlInput={ctrlInput}\n keyPath={binding.keyPath}\n storeValue={binding.storeValue}\n updateData={binding.readOnly ? ignoreUpdate : updateData}\n actionProps={actionProps}\n >\n {safeChildNodes}\n </ControlledLeaf>\n );\n }\n\n const props = prepareState(node, data, key, actionProps);\n if (safeChildNodes !== undefined) {\n return createElement(ElementType, props, safeChildNodes);\n }\n return createElement(ElementType, props);\n } catch (error) {\n console.error(`Error at ${path}-${index}:`, error);\n return null;\n }\n}\n"],"names":["BLOCKED_ARGS","URL_ARGS","SAFE_URL","safeUrl","value","PATH_SEGMENTS_RE","splitPathSegments","path","unwrapSegment","seg","compileKey","key","segments","numericNext","_","i","next","compileNode","source","isText","node","expressions","args","dynamicArgs","argPaths","keys","text","actions","compileExpression","v","name","compiled","staticPath","onClick","a","rawType","type","isEach","COMPONENT","isIf","eachArgs","each","dynamicKeys","templateCache","stringTemplateCache","LRUCache","compileTemplate","template","hit","defineComponent","def","defineBonsaiRegistry","registry","A","React","props","ref","jsx","hVariants","cva","H","className","variant","as","cn","pVariants","P","size","Comp","accordionVariants","Accordion","raised","extrude","AccordionPrimitive","AccordionItem","AccordionTrigger","children","Icon","IconChevronDown","trigger","useHaptics","jsxs","event","HAPTIC_ACCORDION","AccordionContent","alertVariants","Alert","avatarVariants","Avatar","rounded","src","alt","fallback","badge","AvatarPrimitive","Fragment","badgeVariants","Badge","render","useRender","mergeProps","cardVariants","Card","CardHeader","CardTitle","CardDescription","CardAction","CardIcon","CardContent","CardFooter","checkboxVariants","Checkbox","onCheckedChange","CheckboxPrimitive","checked","HAPTIC_CHECKBOX","IconCheck","Collapsible","CollapsiblePrimitive","CollapsibleTrigger","CollapsibleContent","Input","InputPrimitive","InputOTP","containerClassName","OTPInput","Textarea","onInput","autosize","e","textarea","InputGroup","inputGroupAddonVariants","InputGroupAddon","align","inputGroupButtonVariants","InputGroupButton","Button","InputGroupText","InputGroupInput","InputGroupTextarea","labelVariants","Label","htmlFor","progressVariants","Progress","stacked","rest","indicators","b","ProgressPrimitive","ProgressTrack","item","ProgressIndicatorGroup","ProgressIndicator","index","separatorVariants","Separator","orientation","stroke","SeparatorPrimitive","skeletonVariants","Skeleton","animate","switchVariants","Switch","SwitchPrimitive","HAPTIC_SWITCH","tableVariants","Table","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","FORM_FIELD_CAPABILITIES","DEFAULT_CAPABILITIES","toControlledFieldSpec","entry","toControlled","subtype","spec","extendRegistry","base","components","controlledInputs","merged","prev","component","controlled","coreComponents","Loader","coreControlledInputs","coreRegistry","BonsaiRegistryContext","createContext","useBonsaiRegistry","useContext","BonsaiRenderModeContext","useBonsaiRenderMode","BonsaiRoot","inherited","VOID_ELEMENTS","getKey","leaf","getValue","data","acc","setValue","obj","current","pathRoot","rootMatch","isValueScoped","valueScope","resolveScopedPath","scope","root","prefix","evaluateDynamicValue","parseExpression","buildDataSlice","resolveValue","resolveElementType","prepareState","dataSlice","extra","baseProps","k","computeControlledOverrides","ctrlInput","keyPath","storeValue","rawArgs","updateData","eventOrValue","ignoreUpdate","clickHandler","ctx","set","to","cloneData","ControlledLeaf","elementKey","ElementType","actionProps","overrides","createElement","resolveCtrlInput","tree","byType","resolveWrapper","proto","out","renderCompiledNode","globalData","mode","child","keyExpr","rawItemsPath","itemsValue","items","realItemsPath","rowCtxValue","rowKey","rowPath","ci","binding","rawKeyPath","caps","childNodes","branch","safeChildNodes","error"],"mappings":"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"}
|