@pebble-software/bonsai 0.0.8 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +367 -88
- package/dist/chunks/button-CSLrIvsS.js +166 -0
- package/dist/chunks/button-CSLrIvsS.js.map +1 -0
- package/dist/chunks/create-renderer-1cky1uN9.js +280 -0
- package/dist/chunks/create-renderer-1cky1uN9.js.map +1 -0
- package/dist/chunks/render-shared-CIUUkLDn.js +2319 -0
- package/dist/chunks/render-shared-CIUUkLDn.js.map +1 -0
- package/dist/components/core/bonsai.d.ts +5 -0
- package/dist/components/core/render-shared.d.ts +123 -0
- package/dist/components/core/render-tree-client.d.ts +4 -0
- package/dist/components/core/render-tree-server.d.ts +2 -0
- package/dist/components/ui/a.d.ts +3 -0
- package/dist/components/ui/accordion.d.ts +17 -0
- package/dist/components/ui/alert-dialog.d.ts +23 -0
- package/dist/components/ui/alert.d.ts +12 -0
- package/dist/components/ui/avatar.d.ts +21 -0
- package/dist/components/ui/badge.d.ts +10 -0
- package/dist/components/ui/breadcrumb.d.ts +10 -0
- package/dist/components/ui/button.d.ts +14 -0
- package/dist/components/ui/calendar.d.ts +9 -0
- package/dist/components/ui/card.d.ts +15 -0
- package/dist/components/ui/checkbox.d.ts +7 -0
- package/dist/components/ui/collapsible.d.ts +5 -0
- package/dist/components/ui/combobox.d.ts +31 -0
- package/dist/components/ui/command.d.ts +23 -0
- package/dist/components/ui/dialog.d.ts +23 -0
- package/dist/components/ui/drawer.d.ts +22 -0
- package/dist/components/ui/dropdown-menu.d.ts +29 -0
- package/dist/components/ui/form.d.ts +24 -0
- package/dist/components/ui/h.d.ts +10 -0
- package/dist/components/ui/input-group.d.ts +18 -0
- package/dist/components/ui/input-otp.d.ts +11 -0
- package/dist/components/ui/input.d.ts +3 -0
- package/dist/components/ui/label.d.ts +10 -0
- package/dist/components/ui/loader.d.ts +14 -0
- package/dist/components/ui/p.d.ts +11 -0
- package/dist/components/ui/popover.d.ts +9 -0
- package/dist/components/ui/progress.d.ts +31 -0
- package/dist/components/ui/scroll-area.d.ts +13 -0
- package/dist/components/ui/select.d.ts +17 -0
- package/dist/components/ui/separator.d.ts +8 -0
- package/dist/components/ui/sidebar.d.ts +70 -0
- package/dist/components/ui/signature-pad.d.ts +7 -0
- package/dist/components/ui/skeleton.d.ts +7 -0
- package/dist/components/ui/switch.d.ts +8 -0
- package/dist/components/ui/table.d.ts +14 -0
- package/dist/components/ui/tabs.d.ts +15 -0
- package/dist/components/ui/textarea.d.ts +5 -0
- package/dist/components/ui/toast.d.ts +46 -0
- package/dist/components/ui/tooltip.d.ts +15 -0
- package/dist/core.d.ts +12 -0
- package/dist/core.js +17 -0
- package/dist/core.js.map +1 -0
- package/dist/hooks/haptics.d.ts +8 -0
- package/dist/hooks/use-mobile.d.ts +1 -0
- package/dist/index.css +7 -0
- package/dist/index.d.ts +27 -339
- package/dist/index.js +1076 -4194
- package/dist/index.js.map +1 -0
- package/dist/lib/ast/cache.d.ts +8 -0
- package/dist/lib/ast/evaluator.d.ts +2 -0
- package/dist/lib/ast/helpers.d.ts +2 -0
- package/dist/lib/ast/index.d.ts +29 -0
- package/dist/lib/ast/setup.d.ts +2 -0
- package/dist/lib/ast/types.d.ts +1 -0
- package/dist/lib/ast/utils.d.ts +4 -0
- package/dist/lib/haptics.d.ts +8 -0
- package/dist/lib/registry/drift.d.ts +17 -0
- package/dist/lib/registry/identity.d.ts +24 -0
- package/dist/lib/registry/json-schema-to-zod.d.ts +32 -0
- package/dist/lib/registry/manifest-schema.d.ts +62 -0
- package/dist/lib/registry/manifest.d.ts +26 -0
- package/dist/lib/registry/merge-generated.d.ts +7 -0
- package/dist/lib/registry/pebble-registry.d.ts +1 -0
- package/dist/lib/registry/types.d.ts +29 -0
- package/dist/lib/registry/validate.d.ts +18 -0
- package/dist/lib/renderer/compile-template.d.ts +70 -0
- package/dist/lib/ui/registry.d.ts +19 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/presets/calendar.js +373 -0
- package/dist/presets/calendar.js.map +1 -0
- package/dist/presets/signature.js +404 -0
- package/dist/presets/signature.js.map +1 -0
- package/dist/renderer/core-registry.d.ts +52 -0
- package/dist/renderer/create-renderer.d.ts +38 -0
- package/dist/renderer/presets/calendar.d.ts +5 -0
- package/dist/renderer/presets/signature.d.ts +6 -0
- package/dist/types.d.ts +1 -0
- package/package.json +47 -18
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-shared-CIUUkLDn.js","sources":["../../src/lib/ast/cache.ts","../../src/lib/ast/setup.ts","../../src/lib/ast/utils.ts","../../src/lib/ast/helpers.ts","../../src/lib/ast/evaluator.ts","../../src/lib/ast/index.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":["export class LRUCache<K, V> {\n private cache = new Map<K, V>();\n private maxSize: number;\n\n constructor(maxSize: number) {\n this.maxSize = maxSize;\n }\n\n get(key: K): V | undefined {\n const value = this.cache.get(key);\n if (value !== undefined) {\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n return value;\n }\n\n set(key: K, value: V): void {\n this.cache.delete(key);\n this.cache.set(key, value);\n\n if (this.cache.size > this.maxSize) {\n const { value: firstKey, done } = this.cache.keys().next();\n if (!done) this.cache.delete(firstKey);\n }\n }\n\n clear(): void {\n this.cache.clear();\n }\n}\n","import jsep from \"jsep\";\nimport arrow from \"@jsep-plugin/arrow\";\n\n// Teaches jsep arrow syntax (`a => a.age >= 18`) — the body is still walked by our own evaluate(), never eval'd.\njsep.plugins.register(arrow);\n\nexport default jsep;\n","import type { ASTNode } from \"./types\";\n\n// Blocked even as a literal own-key, since a JSON.parse'd payload can carry one.\nconst FORBIDDEN_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\n// Null-safe, own-property-only read — blocks prototype-chain escapes from template expressions.\nexport function getOwn(obj: any, key: string | number): any {\n if (obj == null) return undefined;\n if (typeof key === \"string\" && FORBIDDEN_KEYS.has(key)) return undefined;\n if (!Object.prototype.hasOwnProperty.call(obj, key)) return undefined;\n return (obj as any)[key];\n}\n\n// Rebuilds a static dot/bracket path string; returns null for a non-literal computed key (e.g. `items[i].label`).\nexport function staticPath(node: ASTNode): string | null {\n if (node.type === \"Identifier\") return (node as any).name;\n\n if (node.type === \"MemberExpression\") {\n const objectPath = staticPath((node as any).object);\n if (objectPath == null) return null;\n\n const property = (node as any).property;\n if ((node as any).computed) {\n if (property.type !== \"Literal\") return null;\n return `${objectPath}[${JSON.stringify(property.value)}]`;\n }\n if (property.type !== \"Identifier\") return null;\n return `${objectPath}.${property.name}`;\n }\n\n return null;\n}\n\n// Extracts the leading identifier from a static path (\"a.age\" -> \"a\").\nfunction rootOf(path: string): string {\n const match = path.match(/^[^.[]+/);\n return match ? match[0] : path;\n}\n\n// Collects the data paths an expression reads (root identifiers + static member paths); arrow params are\n// tracked in `bound` so they're excluded as locally-scoped, while free variables inside the body still surface.\nexport function extractIdentifiers(node: ASTNode): string[] {\n const identifiers = new Set<string>();\n\n function traverse(n: ASTNode | null | undefined, bound: ReadonlySet<string>) {\n if (!n) return;\n\n switch (n.type) {\n case \"Identifier\": {\n const name = (n as any).name;\n if (!bound.has(name)) identifiers.add(name);\n return;\n }\n\n case \"MemberExpression\": {\n const path = staticPath(n);\n if (path != null) {\n if (!bound.has(rootOf(path))) identifiers.add(path);\n return;\n }\n traverse((n as any).object, bound);\n traverse((n as any).property, bound);\n return;\n }\n\n case \"UnaryExpression\":\n traverse((n as any).argument, bound);\n return;\n\n case \"BinaryExpression\":\n traverse((n as any).left, bound);\n traverse((n as any).right, bound);\n return;\n\n case \"ConditionalExpression\":\n traverse((n as any).test, bound);\n traverse((n as any).consequent, bound);\n traverse((n as any).alternate, bound);\n return;\n\n case \"ArrayExpression\":\n ((n as any).elements as ASTNode[]).forEach((el) => traverse(el, bound));\n return;\n\n case \"CallExpression\": {\n // The callee itself is never a data read; only a MemberExpression callee's object is.\n const callee = (n as any).callee;\n if (callee.type === \"MemberExpression\") {\n traverse(callee.object, bound);\n }\n ((n as any).arguments as ASTNode[]).forEach((arg) => {\n if (arg.type === \"ArrowFunctionExpression\") {\n const withParams = new Set(bound);\n ((arg as any).params as ASTNode[] | null)?.forEach((p) => {\n if (p.type === \"Identifier\") withParams.add((p as any).name);\n });\n traverse((arg as any).body, withParams);\n } else {\n traverse(arg, bound);\n }\n });\n return;\n }\n\n case \"Compound\":\n ((n as any).body as ASTNode[]).forEach((stmt) => traverse(stmt, bound));\n return;\n\n default:\n return;\n }\n }\n\n traverse(node, new Set());\n return Array.from(identifiers);\n}\n","// Formula-language helper registry. Helpers run in SSR/PDF too, so they must be pure and synchronous — no\n// fetch, no clock reads, no randomness — or SSR output stops being a pure function of (template, data).\n\nexport type Helper = (...args: any[]) => any;\n\nconst pad = (n: number, len = 2): string => String(n).padStart(len, \"0\");\n\nfunction toDate(value: any): Date | null {\n const date = value instanceof Date ? value : new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction toNumber(value: any): number {\n const n = typeof value === \"number\" ? value : parseFloat(value);\n return Number.isNaN(n) ? 0 : n;\n}\n\nfunction flattenNumbers(args: any[]): number[] {\n return args.flat(Infinity).map(toNumber);\n}\n\nexport const helpers: Record<string, Helper> = {\n // Uses UTC getters so SSR and client render the same calendar date regardless of local timezone.\n formatDate(value: any, format: string = \"YYYY-MM-DD\"): string {\n const date = toDate(value);\n if (!date) return \"\";\n\n if (format === \"short\" || format === \"medium\" || format === \"long\" || format === \"full\") {\n return new Intl.DateTimeFormat(\"en-US\", { dateStyle: format, timeZone: \"UTC\" }).format(date);\n }\n\n const tokens: Record<string, string> = {\n YYYY: String(date.getUTCFullYear()),\n MM: pad(date.getUTCMonth() + 1),\n DD: pad(date.getUTCDate()),\n HH: pad(date.getUTCHours()),\n mm: pad(date.getUTCMinutes()),\n ss: pad(date.getUTCSeconds()),\n };\n return format.replace(/YYYY|MM|DD|HH|mm|ss/g, (token) => tokens[token]);\n },\n\n formatCurrency(value: any, currency: string = \"USD\", locale: string = \"en-US\"): string {\n const amount = toNumber(value);\n return new Intl.NumberFormat(locale, { style: \"currency\", currency }).format(amount);\n },\n\n upper(value: any): string {\n return String(value ?? \"\").toUpperCase();\n },\n\n lower(value: any): string {\n return String(value ?? \"\").toLowerCase();\n },\n\n trim(value: any): string {\n return String(value ?? \"\").trim();\n },\n\n concat(...args: any[]): string {\n return args.map((a) => (a ?? \"\")).join(\"\");\n },\n\n join(value: any, separator: string = \", \"): string {\n return Array.isArray(value) ? value.join(separator) : \"\";\n },\n\n default(value: any, fallback: any): any {\n return value == null || value === \"\" ? fallback : value;\n },\n\n length(value: any): number {\n if (typeof value === \"string\" || Array.isArray(value)) return value.length;\n return 0;\n },\n\n count(value: any): number {\n return Array.isArray(value) ? value.length : 0;\n },\n\n sum(value: any): number {\n return Array.isArray(value) ? value.reduce((acc: number, v: any) => acc + toNumber(v), 0) : 0;\n },\n\n min(...args: any[]): number | undefined {\n const nums = flattenNumbers(args);\n return nums.length ? Math.min(...nums) : undefined;\n },\n\n max(...args: any[]): number | undefined {\n const nums = flattenNumbers(args);\n return nums.length ? Math.max(...nums) : undefined;\n },\n\n round(value: any, digits: number = 0): number {\n const factor = 10 ** digits;\n return Math.round(toNumber(value) * factor) / factor;\n },\n};\n","import type { ASTNode } from \"./types\";\nimport { getOwn } from \"./utils\";\nimport { helpers } from \"./helpers\";\n\n// Only these array methods are callable via `.method(lambda)`; anything else is always an error.\nconst ALLOWED_ARRAY_METHODS = new Set([\"map\", \"filter\", \"some\", \"every\", \"find\"]);\n\n// Walks the arrow body with `evaluate()` itself — no real JS function is ever compiled from the lambda.\nfunction callArrow(\n arrow: any,\n args: any[],\n outerData: Record<string, any>,\n): any {\n const scope: Record<string, any> = { ...outerData };\n ((arrow.params as ASTNode[] | null) ?? []).forEach((param, i) => {\n if (param.type === \"Identifier\") scope[(param as any).name] = args[i];\n });\n return evaluate(arrow.body, scope);\n}\n\nexport function evaluate(node: ASTNode, data: Record<string, any>): any {\n switch (node.type) {\n case \"Literal\":\n return (node as any).value;\n\n case \"Identifier\":\n return getOwn(data, (node as any).name);\n\n case \"MemberExpression\": {\n const objectValue = evaluate((node as any).object, data);\n const property = (node as any).property;\n const key = (node as any).computed\n ? evaluate(property, data)\n : (property as any).name;\n return getOwn(objectValue, key);\n }\n\n case \"UnaryExpression\": {\n const argument = evaluate((node as any).argument, data);\n switch ((node as any).operator) {\n case \"!\":\n return !argument;\n case \"-\":\n return -argument;\n case \"+\":\n return +argument;\n case \"~\":\n return ~argument;\n default:\n throw new Error(`Unknown unary operator: ${(node as any).operator}`);\n }\n }\n\n case \"BinaryExpression\": {\n const operator = (node as any).operator as string;\n\n // Short-circuit: right side only evaluated when needed; returns the operand, not a boolean (JS semantics).\n if (operator === \"&&\" || operator === \"||\" || operator === \"??\") {\n const left = evaluate((node as any).left, data);\n const shortCircuits =\n operator === \"&&\"\n ? !left\n : operator === \"||\"\n ? !!left\n : left != null;\n return shortCircuits ? left : evaluate((node as any).right, data);\n }\n\n const left = evaluate((node as any).left, data);\n const right = evaluate((node as any).right, data);\n\n switch (operator) {\n case \"===\":\n return left === right;\n case \"!==\":\n return left !== right;\n case \"==\":\n return left == right;\n case \"!=\":\n return left != right;\n case \"<\":\n return left < right;\n case \">\":\n return left > right;\n case \"<=\":\n return left <= right;\n case \">=\":\n return left >= right;\n case \"+\":\n return left + right;\n case \"-\":\n return left - right;\n case \"*\":\n return left * right;\n case \"/\":\n return left / right;\n case \"%\":\n return left % right;\n case \"**\":\n return left ** right;\n case \"&\":\n return left & right;\n case \"|\":\n return left | right;\n case \"^\":\n return left ^ right;\n case \"<<\":\n return left << right;\n case \">>\":\n return left >> right;\n case \">>>\":\n return left >>> right;\n default:\n throw new Error(`Unknown binary operator: ${operator}`);\n }\n }\n\n case \"ConditionalExpression\": {\n const test = evaluate((node as any).test, data);\n return test\n ? evaluate((node as any).consequent, data)\n : evaluate((node as any).alternate, data);\n }\n\n case \"ArrayExpression\":\n return ((node as any).elements as (ASTNode | null)[]).map((el) =>\n el ? evaluate(el, data) : undefined,\n );\n\n case \"CallExpression\": {\n const callee = (node as any).callee;\n const argNodes = (node as any).arguments as ASTNode[];\n\n // Allowlisted array method + lambda; any other member-access call is rejected before the receiver is touched.\n if (callee.type === \"MemberExpression\") {\n if (callee.computed || callee.property.type !== \"Identifier\") {\n throw new Error(\n \"Method calls must use a fixed dot-notation method name\",\n );\n }\n const methodName = callee.property.name as string;\n if (!ALLOWED_ARRAY_METHODS.has(methodName)) {\n throw new Error(`Unknown array method: ${methodName}`);\n }\n\n const receiver = evaluate(callee.object, data);\n if (!Array.isArray(receiver)) {\n throw new Error(`.${methodName}() can only be called on an array`);\n }\n\n const [arg] = argNodes;\n if (argNodes.length !== 1 || arg.type !== \"ArrowFunctionExpression\") {\n throw new Error(\n `.${methodName}() requires a single arrow-function argument`,\n );\n }\n\n return (receiver as any[])[methodName]((item: any, index: number) =>\n callArrow(arg, [item, index], data),\n );\n }\n\n if (callee.type !== \"Identifier\") {\n throw new Error(\n \"Function calls are only allowed via a bare helper name\",\n );\n }\n\n const helper = helpers[(callee as any).name];\n if (typeof helper !== \"function\") {\n throw new Error(`Unknown helper: ${(callee as any).name}`);\n }\n\n return helper(...argNodes.map((a) => evaluate(a, data)));\n }\n\n default:\n throw new Error(`Unsupported expression type: ${node.type}`);\n }\n}\n","import jsep from \"./setup\";\nimport type { ASTNode } from \"./types\";\nimport { LRUCache } from \"./cache\";\nimport { evaluate } from \"./evaluator\";\nimport { extractIdentifiers } from \"./utils\";\n\nexport type { ASTNode } from \"./types\";\n\nconst astCache = new LRUCache<string, ASTNode>(250);\n\nfunction parseToAST(content: string): ASTNode {\n let ast = astCache.get(content);\n if (ast) {\n return ast;\n }\n\n ast = jsep(content) as ASTNode;\n astCache.set(content, ast);\n return ast;\n}\n\nexport function extractVariables(expr: string): string[] {\n if (!expr || typeof expr !== \"string\") {\n return [];\n }\n\n if (!expr.startsWith(\"{{\") || !expr.endsWith(\"}}\")) {\n return [];\n }\n\n const content = expr.slice(2, -2).trim();\n if (!content) {\n return [];\n }\n\n try {\n return extractIdentifiers(parseToAST(content));\n } catch (error) {\n console.error(`Error extracting variables from \"${expr}\":`, error);\n return [];\n }\n}\n\nexport function parseExpression(expr: string, data: Record<string, any>): any {\n if (!expr || typeof expr !== \"string\") {\n return expr;\n }\n\n if (!expr.startsWith(\"{{\") || !expr.endsWith(\"}}\")) {\n return expr;\n }\n\n const content = expr.slice(2, -2).trim();\n if (!content) {\n return undefined;\n }\n\n try {\n return evaluate(parseToAST(content), data);\n } catch (error) {\n console.error(`Error parsing expression \"${expr}\":`, error);\n return undefined;\n }\n}\n\nexport function clearExpressionCache(): void {\n astCache.clear();\n}\n\n/**\n * The single predicate that decides whether a value is a template expression.\n * `parseExpression` / `extractVariables` / the template compiler must all agree\n * on it — a divergence would silently stop evaluating a prop.\n */\nexport function isExpression(value: unknown): value is string {\n return (\n typeof value === \"string\" && value.startsWith(\"{{\") && value.endsWith(\"}}\")\n );\n}\n\nexport interface CompiledExpression {\n /** The original `{{...}}` source, i.e. what gets handed to `parseExpression`. */\n source: string;\n /** The trimmed inner content, i.e. the raw binding path for a plain path binding. */\n content: string;\n /** Parsed AST, or null for an empty expression or a parse failure. */\n ast: ASTNode | null;\n /** Parse failure, if any. Deferred to evaluation time so logging stays per-render. */\n error: unknown;\n /** Data paths the expression reads. Empty for literal-only expressions. */\n variables: string[];\n}\n\n/**\n * Parses an expression ahead of render. Returns null for anything that isn't a\n * `{{...}}` expression. Never throws: a malformed expression is captured in\n * `error` so the caller can keep `parseExpression`'s per-render error reporting.\n */\nexport function compileExpression(value: unknown): CompiledExpression | null {\n if (!isExpression(value)) return null;\n\n const content = value.slice(2, -2).trim();\n if (!content) {\n return { source: value, content, ast: null, error: null, variables: [] };\n }\n\n try {\n const ast = parseToAST(content);\n return {\n source: value,\n content,\n ast,\n error: null,\n variables: extractIdentifiers(ast),\n };\n } catch (error) {\n return { source: value, content, ast: null, error, variables: [] };\n }\n}\n","import { COMPONENT } from \"@bonsai/constants\";\nimport type { Config } from \"../../types\";\nimport { LRUCache } from \"../ast/cache\";\nimport { compileExpression, type CompiledExpression } from \"../ast\";\nimport { staticPath } from \"../ast/utils\";\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 /** 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 and is not a control node, so it can render as a memoised static subtree. */\n isStatic: boolean;\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 CompiledEach {\n as: string;\n indexAlias: string | undefined;\n keyExpr: any;\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 = source as any;\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 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\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 const compiled = compileExpression(value);\n if (!compiled) continue;\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\n const rawType = isText ? undefined : 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 const each: CompiledEach | null = isEach\n ? {\n as: node.args?.as,\n indexAlias: node.args?.index,\n keyExpr: node.args?.key,\n rawItemsPath: argPaths[\"items\"] ?? \"\",\n }\n : null;\n\n const dynamicKeys = Array.from(keys, compileKey);\n\n return {\n source,\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,\n each,\n children: isText\n ? []\n : ((node?.children ?? []) as Config[]).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 as object);\n if (hit) return hit;\n\n const compiled: CompiledTemplate = {\n root: compileNode(template),\n source: template,\n };\n templateCache.set(template as object, 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 (REGISTRY_SPIKE.md,\n // \"Resolution and caching rules\"). Absent on 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 disabled,\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 { 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 extractor: (eventOrValue: any) => any;\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\", \"ssr\", \"pdf\"];\nconst DEFAULT_CAPABILITIES: ComponentCapability[] = [\"children\", \"bindings\", \"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) => e.target.value,\n },\n email: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e) => e.target.value,\n },\n password: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e) => 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) =>\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) => 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) => e.target.value,\n },\n [COMPONENT.INPUT_GROUP_INPUT]: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e) => e.target.value,\n },\n [COMPONENT.INPUT_GROUP_TEXTAREA]: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e) => 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 } 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 CompiledEach,\n type CompiledKey,\n type CompiledNode,\n} from \"../../lib/renderer/compile-template\";\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: any, path: string, def = undefined) {\n if (!path) return data;\n const segments = splitPathSegments(path);\n return (\n segments.reduce((acc: any, seg: string) => {\n if (acc == null) return undefined;\n return acc[unwrapSegment(seg)];\n }, data) ?? def\n );\n}\n\nexport function setValue(obj: any, path: string, value: any) {\n if (!path) {\n Object.assign(obj, value);\n return;\n }\n const segments = splitPathSegments(path);\n let current = obj;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = unwrapSegment(segments[i]);\n const nextSeg = unwrapSegment(segments[i + 1]);\n current[seg] ??= /^\\d+$/.test(nextSeg) ? [] : {};\n current = current[seg];\n }\n current[unwrapSegment(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: any, data: Record<string, any>): any => {\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) => any,\n): Record<string, any> {\n const acc: Record<string, any> = {};\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];\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.\nexport const prepareState = (\n node: CompiledNode,\n dataSlice: Record<string, any>,\n key: string,\n extra: Record<string, any> = {},\n): Record<string, any> => {\n const baseProps: Record<string, any> = {\n key,\n ...(node.source as any)?.args,\n ...extra,\n };\n for (const k of Object.keys(baseProps)) {\n if (node.dynamicArgs.has(k) || Object.hasOwn(extra, k)) {\n baseProps[k] = evaluateDynamicValue(baseProps[k], dataSlice);\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: any,\n rawArgs: Record<string, any>,\n updateData: (path: string, value: any) => void,\n): Record<string, any> {\n if (rawArgs[ctrlInput.changeProp]) return {};\n return {\n [ctrlInput.changeProp]: (eventOrValue: any) =>\n updateData(keyPath, ctrlInput.extract(eventOrValue)),\n [ctrlInput.valueProp]: storeValue,\n };\n}\n\nconst ignoreUpdate = () => {};\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 children,\n}: {\n node: CompiledNode;\n dataSlice: Record<string, any>;\n elementKey: string;\n ElementType: React.ElementType;\n ctrlInput: ControlledFieldSpec;\n keyPath: string;\n storeValue: any;\n updateData: (path: string, value: any) => void;\n children?: React.ReactNode;\n}) {\n const overrides = computeControlledOverrides(\n ctrlInput,\n keyPath,\n storeValue,\n (node.source as any)?.args ?? {},\n updateData,\n );\n const props = prepareState(node, dataSlice, elementKey, 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: Config,\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 const subtype = tree?.args?.type || \"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// 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: any): Record<string, any>;\n /** Derives the child context an `each` row hands its descendants. */\n rowCtx(\n ctx: Ctx,\n globalData: any,\n item: any,\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: any,\n registry: BonsaiRegistry,\n updateData: (path: string, value: any) => void,\n mode: RenderStrategy<Ctx>,\n): React.ReactNode {\n const tree = node.source as any;\n if (!tree) return null;\n\n const data = mode.dataSlice(node, ctx, globalData);\n\n if (node.isText) {\n return evaluateDynamicValue(tree, data);\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 = 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: any; 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 const src = evaluateDynamicValue(tree.args?.src, data);\n if (src === \"\" || src == null) return null;\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 >\n {safeChildNodes}\n </ControlledLeaf>\n );\n }\n\n const props = prepareState(node, data, key);\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":["LRUCache","maxSize","key","value","firstKey","done","jsep","arrow","FORBIDDEN_KEYS","getOwn","obj","staticPath","node","objectPath","property","rootOf","path","match","extractIdentifiers","identifiers","traverse","n","bound","name","el","callee","arg","withParams","p","stmt","pad","len","toDate","date","toNumber","flattenNumbers","args","helpers","format","tokens","token","currency","locale","amount","a","separator","fallback","acc","v","nums","digits","factor","ALLOWED_ARRAY_METHODS","callArrow","outerData","scope","param","i","evaluate","data","objectValue","argument","operator","left","right","test","argNodes","methodName","receiver","item","index","helper","astCache","parseToAST","content","ast","parseExpression","expr","error","isExpression","compileExpression","PATH_SEGMENTS_RE","splitPathSegments","unwrapSegment","seg","compileKey","segments","numericNext","_","next","compileNode","source","isText","expressions","dynamicArgs","argPaths","keys","text","compiled","rawType","type","isEach","COMPONENT","isIf","each","dynamicKeys","templateCache","stringTemplateCache","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","disabled","Icon","IconChevronDown","onClick","trigger","useHaptics","jsxs","event","HAPTIC_ACCORDION","AccordionContent","alertVariants","Alert","avatarVariants","Avatar","rounded","src","alt","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","ProgressIndicatorGroup","ProgressIndicator","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","setValue","current","nextSeg","pathRoot","rootMatch","isValueScoped","valueScope","resolveScopedPath","root","prefix","evaluateDynamicValue","buildDataSlice","resolveValue","resolveElementType","prepareState","dataSlice","extra","baseProps","k","computeControlledOverrides","ctrlInput","keyPath","storeValue","rawArgs","updateData","eventOrValue","ignoreUpdate","ControlledLeaf","elementKey","ElementType","overrides","createElement","resolveCtrlInput","tree","byType","resolveWrapper","cloneData","proto","out","renderCompiledNode","ctx","globalData","mode","child","keyExpr","rawItemsPath","itemsValue","items","realItemsPath","rowCtxValue","rowKey","rowPath","ci","binding","rawKeyPath","childNodes","branch","safeChildNodes"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { BonsaiProps } from './render-shared.js';
|
|
2
|
+
export { BonsaiRegistryContext, getValue, setValue, useBonsaiRenderMode, type BonsaiProps, type RenderMode, } from './render-shared.js';
|
|
3
|
+
export { useUpdateData, BonsaiClient, BonsaiProvider } from './render-tree-client.js';
|
|
4
|
+
export { BonsaiServer } from './render-tree-server.js';
|
|
5
|
+
export declare function Bonsai(props: BonsaiProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { Config } from '../../types.js';
|
|
2
|
+
import { BonsaiRegistry, ControlledFieldSpec } from '../../lib/registry/types.js';
|
|
3
|
+
import { CompiledEach, CompiledKey, CompiledNode } from '../../lib/renderer/compile-template.js';
|
|
4
|
+
/**
|
|
5
|
+
* Registry the renderer resolves component types against. Defaults to the
|
|
6
|
+
* lightweight core registry; `createBonsaiRenderer` provides a scoped one, so
|
|
7
|
+
* two renderers never share (or mutate) each other's components.
|
|
8
|
+
*/
|
|
9
|
+
export declare const BonsaiRegistryContext: import('react').Context<BonsaiRegistry>;
|
|
10
|
+
export declare function useBonsaiRegistry(): BonsaiRegistry;
|
|
11
|
+
export type RenderMode = "web" | "pdf" | "preview";
|
|
12
|
+
/** Read by leaf components that render differently in a non-interactive document. */
|
|
13
|
+
export declare function useBonsaiRenderMode(): RenderMode;
|
|
14
|
+
/**
|
|
15
|
+
* Provides the per-instance render mode, plus the `registry` prop when given
|
|
16
|
+
* (otherwise the inherited renderer-scoped registry stays in effect).
|
|
17
|
+
*/
|
|
18
|
+
export declare function BonsaiRoot({ registry, render, children, }: Pick<BonsaiProps, "registry" | "render"> & {
|
|
19
|
+
children: React.ReactNode;
|
|
20
|
+
}): import("react").JSX.Element;
|
|
21
|
+
export declare const VOID_ELEMENTS: Set<string>;
|
|
22
|
+
export declare const getKey: (leaf: CompiledNode, index: number, path: string) => string;
|
|
23
|
+
export declare function getValue(data: any, path: string, def?: undefined): any;
|
|
24
|
+
export declare function setValue(obj: any, path: string, value: any): void;
|
|
25
|
+
export declare function pathRoot(path: string): string;
|
|
26
|
+
export declare function isValueScoped(path: string, valueScope?: Record<string, unknown>): boolean;
|
|
27
|
+
export declare function resolveScopedPath(path: string, scope?: Record<string, string>): string;
|
|
28
|
+
export declare const evaluateDynamicValue: (value: any, data: Record<string, any>) => any;
|
|
29
|
+
export declare function buildDataSlice(keys: CompiledKey[], resolveValue: (key: string) => any): Record<string, any>;
|
|
30
|
+
export declare const resolveElementType: (registry: BonsaiRegistry, type?: string) => React.ElementType;
|
|
31
|
+
export declare const prepareState: (node: CompiledNode, dataSlice: Record<string, any>, key: string, extra?: Record<string, any>) => Record<string, any>;
|
|
32
|
+
export declare function computeControlledOverrides(ctrlInput: ControlledFieldSpec, keyPath: string, storeValue: any, rawArgs: Record<string, any>, updateData: (path: string, value: any) => void): Record<string, any>;
|
|
33
|
+
export declare function ControlledLeaf({ node, dataSlice, elementKey, ElementType, ctrlInput, keyPath, storeValue, updateData, children, }: {
|
|
34
|
+
node: CompiledNode;
|
|
35
|
+
dataSlice: Record<string, any>;
|
|
36
|
+
elementKey: string;
|
|
37
|
+
ElementType: React.ElementType;
|
|
38
|
+
ctrlInput: ControlledFieldSpec;
|
|
39
|
+
keyPath: string;
|
|
40
|
+
storeValue: any;
|
|
41
|
+
updateData: (path: string, value: any) => void;
|
|
42
|
+
children?: React.ReactNode;
|
|
43
|
+
}): import('react').ReactElement<any, string | import('react').JSXElementConstructor<any>>;
|
|
44
|
+
export declare function resolveCtrlInput(registry: BonsaiRegistry, type: string, tree: Config): ControlledFieldSpec | undefined;
|
|
45
|
+
export interface BonsaiProps {
|
|
46
|
+
/** Template to render. Compiled once per template identity. */
|
|
47
|
+
template: Config;
|
|
48
|
+
/**
|
|
49
|
+
* Seed data for this instance. Read by reference: the store is (re)seeded
|
|
50
|
+
* from it on mount and whenever a *different object* is passed. Mutating the
|
|
51
|
+
* same object in place does nothing — pass a new object to force an update.
|
|
52
|
+
*/
|
|
53
|
+
data?: Record<string, unknown>;
|
|
54
|
+
/** Fired after every store-data change that came from inside the renderer (a user edit). */
|
|
55
|
+
onDataChange?: (data: Record<string, unknown>) => void;
|
|
56
|
+
/** When supplied, replaces the `captureUrl` fetch on submit. Throw to signal failure. */
|
|
57
|
+
onSubmit?: (data: Record<string, unknown>) => void | Promise<void>;
|
|
58
|
+
/** Receives anything `onSubmit`/the capture fetch throws. Without it, the error propagates. */
|
|
59
|
+
onError?: (error: unknown) => void;
|
|
60
|
+
/** Compatibility capture endpoint, used only when `onSubmit` is absent. */
|
|
61
|
+
captureUrl?: string;
|
|
62
|
+
expiry?: string;
|
|
63
|
+
status?: "pending" | "captured" | "completed" | "error" | "revoked";
|
|
64
|
+
/** Rendering mode, readable by leaves via `useBonsaiRenderMode`. `"pdf"` always renders a plain wrapper. */
|
|
65
|
+
render?: RenderMode;
|
|
66
|
+
/**
|
|
67
|
+
* Registry to resolve component types against for this instance. Defaults to
|
|
68
|
+
* the registry of the renderer it was created from (see `createBonsaiRenderer`).
|
|
69
|
+
*/
|
|
70
|
+
registry?: BonsaiRegistry;
|
|
71
|
+
/** Wrapper element. `"div"` lets instances embed inside a host form without nesting `<form>`s. */
|
|
72
|
+
as?: "form" | "div";
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The wrapper element for an instance. `render: "pdf"` has always produced a
|
|
76
|
+
* plain container, so it wins over `as`; otherwise `as` decides.
|
|
77
|
+
*/
|
|
78
|
+
export declare function resolveWrapper(render: BonsaiProps["render"], as: BonsaiProps["as"]): "form" | "div";
|
|
79
|
+
/**
|
|
80
|
+
* Deep-copies the plain objects/arrays in `value`, passing anything else
|
|
81
|
+
* (Dates, class instances, functions, files) through by reference.
|
|
82
|
+
*
|
|
83
|
+
* Two reasons this is required rather than nice-to-have:
|
|
84
|
+
* 1. valtio caches proxies by source object, so seeding two instances from the
|
|
85
|
+
* same `data` object would hand both the *same* proxy — edits in one would
|
|
86
|
+
* appear in the other.
|
|
87
|
+
* 2. Writes through a valtio proxy reach the source object, so an uncloned seed
|
|
88
|
+
* would let user edits mutate the caller's `data` prop.
|
|
89
|
+
*/
|
|
90
|
+
export declare function cloneData<T>(value: T): T;
|
|
91
|
+
export interface NodeCtx {
|
|
92
|
+
scope?: Record<string, string>;
|
|
93
|
+
/**
|
|
94
|
+
* Alias -> row value, for rows of a computed `each` (e.g. `{{xs.filter(...)}}`),
|
|
95
|
+
* which have no store path to resolve against. Only the client sets it; SSR
|
|
96
|
+
* already prop-drills each row's value.
|
|
97
|
+
*/
|
|
98
|
+
valueScope?: Record<string, unknown>;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The seam between `RenderTreeServer` and `RenderTreeClient`: everything that
|
|
102
|
+
* differs between prop-drilled SSR data and the client's per-node
|
|
103
|
+
* `useSnapshot` subscription is captured here, verbatim from each original
|
|
104
|
+
* implementation. `renderCompiledNode` below owns the control flow (isText /
|
|
105
|
+
* isIf / isEach / element dispatch) that is identical in both; it never
|
|
106
|
+
* merges the two lookup strategies a mode implements.
|
|
107
|
+
*/
|
|
108
|
+
export interface RenderStrategy<Ctx extends NodeCtx> {
|
|
109
|
+
/** Builds the data slice a node evaluates its own bindings against. */
|
|
110
|
+
dataSlice(node: CompiledNode, ctx: Ctx, globalData: any): Record<string, any>;
|
|
111
|
+
/** Derives the child context an `each` row hands its descendants. */
|
|
112
|
+
rowCtx(ctx: Ctx, globalData: any, item: any, i: number, each: CompiledEach, realItemsPath: string): Ctx;
|
|
113
|
+
/** Renders one child node at `path`, keyed by the precomputed `key`. */
|
|
114
|
+
renderChild(child: CompiledNode, i: number, path: string, ctx: Ctx, key: string): React.ReactNode;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Hook-free control flow shared by `RenderTreeServer` and `RenderTreeClient`:
|
|
118
|
+
* isText / isIf / isEach / ctrlInput-binding / image-guard / void-element /
|
|
119
|
+
* error-boundary dispatch. Callers do their own hook work (registry,
|
|
120
|
+
* snapshot, updateData) before calling in, then hand the mode-specific
|
|
121
|
+
* lookup/recursion behaviour through `mode`.
|
|
122
|
+
*/
|
|
123
|
+
export declare function renderCompiledNode<Ctx extends NodeCtx>(node: CompiledNode, index: number, path: string, ctx: Ctx, globalData: any, registry: BonsaiRegistry, updateData: (path: string, value: any) => void, mode: RenderStrategy<Ctx>): React.ReactNode;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { BonsaiProps } from './render-shared.js';
|
|
2
|
+
export declare function useUpdateData(): (path: string, value: any) => void;
|
|
3
|
+
export declare function BonsaiClient({ captureUrl, template, render, as, onSubmit, onError, registry, }: BonsaiProps): import("react").JSX.Element;
|
|
4
|
+
export declare function BonsaiProvider(props: BonsaiProps): import("react").JSX.Element;
|