@pebble-software/bonsai 0.2.1 → 0.4.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.
Files changed (34) hide show
  1. package/README.md +47 -5
  2. package/dist/ast.js +1 -1
  3. package/dist/chunks/{builder.meta-B7Y9M7Ab.js → builder.meta-DKq-ggkn.js} +3 -3
  4. package/dist/chunks/{builder.meta-B7Y9M7Ab.js.map → builder.meta-DKq-ggkn.js.map} +1 -1
  5. package/dist/chunks/class-names-CoKRVvWM.js +66 -0
  6. package/dist/chunks/class-names-CoKRVvWM.js.map +1 -0
  7. package/dist/chunks/{create-renderer-C4nV9RV6.js → create-renderer-CSFyNcqr.js} +55 -55
  8. package/dist/chunks/create-renderer-CSFyNcqr.js.map +1 -0
  9. package/dist/chunks/{index-CD5pykpk.js → index-df-PhUtD.js} +2 -2
  10. package/dist/chunks/{index-CD5pykpk.js.map → index-df-PhUtD.js.map} +1 -1
  11. package/dist/chunks/{render-shared-Cwb527d4.js → render-shared-DSYQFhTh.js} +3 -3
  12. package/dist/chunks/render-shared-DSYQFhTh.js.map +1 -0
  13. package/dist/classes.d.ts +51 -0
  14. package/dist/classes.js +27 -0
  15. package/dist/classes.js.map +1 -0
  16. package/dist/classes.json +1 -0
  17. package/dist/components/ui/signature-pad.d.ts +2 -2
  18. package/dist/constants.js +7 -2
  19. package/dist/constants.js.map +1 -1
  20. package/dist/core.js +3 -3
  21. package/dist/css.d.ts +42 -0
  22. package/dist/css.js +7483 -0
  23. package/dist/css.js.map +1 -0
  24. package/dist/index.js +120 -110
  25. package/dist/index.js.map +1 -1
  26. package/dist/lib/ast/class-names.d.ts +28 -0
  27. package/dist/library/constants/src/components.d.ts +1 -0
  28. package/dist/presets/signature.js +2 -2
  29. package/dist/presets/signature.js.map +1 -1
  30. package/dist/schemas.js +1 -1
  31. package/dist/styles/presets.json +2 -1
  32. package/package.json +13 -1
  33. package/dist/chunks/create-renderer-C4nV9RV6.js.map +0 -1
  34. package/dist/chunks/render-shared-Cwb527d4.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-shared-DSYQFhTh.js","sources":["../../src/lib/renderer/safe-props.ts","../../src/lib/renderer/compile-template.ts","../../src/lib/registry/types.ts","../../src/components/ui/a.tsx","../../src/components/ui/h.tsx","../../src/components/ui/p.tsx","../../src/components/ui/accordion.tsx","../../src/components/ui/alert.tsx","../../src/components/ui/avatar.tsx","../../src/components/ui/badge.tsx","../../src/components/ui/card.tsx","../../src/components/ui/checkbox.tsx","../../src/components/ui/collapsible.tsx","../../src/components/ui/input.tsx","../../src/components/ui/input-otp.tsx","../../src/components/ui/textarea.tsx","../../src/components/ui/input-group.tsx","../../src/components/ui/label.tsx","../../src/components/ui/progress.tsx","../../src/components/ui/separator.tsx","../../src/components/ui/skeleton.tsx","../../src/components/ui/switch.tsx","../../src/components/ui/table.tsx","../../src/renderer/core-registry.ts","../../src/components/core/render-shared.tsx"],"sourcesContent":["// Template `args` become element props, so this is the gate between untrusted template\n// JSON and the DOM. React already escapes text and attribute values; what it can't know\n// is that a prop *name* or a URL *scheme* came from a template. `compileNode` drops\n// blocked args and unsafe static URLs once per template; URLs that only exist after a\n// `{{binding}}` resolves are checked by `prepareState` at render time.\n\n// Raw-HTML sinks, plus overrides that would send the host form's submission elsewhere.\n// `on*` isn't listed: JSON can't carry a function, and React ignores string handlers.\n// `__proto__` is never a prop, and assigning it would swap the compiled args' prototype.\nexport const BLOCKED_ARGS: ReadonlySet<string> = new Set([\n \"__proto__\",\n \"dangerouslySetInnerHTML\",\n \"srcDoc\",\n \"formAction\",\n \"formMethod\",\n \"formTarget\",\n \"formEncType\",\n]);\n\n// Props a browser navigates to or loads from — the ones React 19 guards against `javascript:`.\nexport const URL_ARGS: ReadonlySet<string> = new Set([\"href\", \"src\", \"action\", \"xlinkHref\"]);\n\n// An allowed scheme, `data:` for images only (signatures render as `data:image/png`), or\n// no scheme at all: no `:` before the first `/`, `?` or `#` means a relative URL.\nconst SAFE_URL = /^(?:(?:https?|mailto|tel):|data:image\\/|[^:]*(?:[/?#]|$))/i;\n\n/** `value` when it's safe to put in a URL prop, otherwise `undefined` so the prop is omitted. */\nexport function safeUrl(value: unknown): unknown {\n // Tested as a string because that's what React writes to the attribute (e.g. an array joins).\n return value == null || SAFE_URL.test(String(value)) ? value : undefined;\n}\n","import { COMPONENT } from \"@bonsai/constants\";\nimport type { Config, ConfigNode } from \"../../types\";\nimport { LRUCache } from \"../ast/cache\";\nimport { compileExpression, type CompiledExpression } from \"../ast\";\nimport { staticPath } from \"../ast/utils\";\nimport { BLOCKED_ARGS, URL_ARGS, safeUrl } from \"./safe-props\";\n\n/**\n * Ahead-of-render metadata for one template node.\n *\n * Everything here is *scope-independent*: it is a pure function of the template\n * node itself, so it survives being reused by every `each` row, every renderer\n * instance and both render paths. Anything that depends on a row's `scope` /\n * `indexScope`, on the live store, or on the `BonsaiRegistry` read from React\n * context deliberately stays in the render path.\n */\nexport interface CompiledNode {\n /** The raw template node this was compiled from. */\n source: Config;\n /** The template's `args` minus blocked props and unsafe static URLs: what the renderer spreads as props. */\n args: Record<string, unknown>;\n /** True when the node is a bare string leaf. */\n isText: boolean;\n /** Element type *string* only — the registry lookup stays at render time. */\n type: string;\n isEach: boolean;\n isIf: boolean;\n isImage: boolean;\n /** Variables the node's own bindings read, pre-split into path segments. */\n dynamicKeys: CompiledKey[];\n /** Arg names whose value is a `{{...}}` expression, so static props skip evaluation. */\n dynamicArgs: Set<string>;\n /**\n * Arg name -> unresolved store path, only for args whose expression is a plain\n * path (`{{user.name}}`, `{{rows[0].x}}`). Formulas (`{{a + b}}`, `{{xs.filter(...)}}`)\n * have no path to write back to, so they're left out.\n */\n argPaths: Record<string, string>;\n /** Parsed expressions keyed by arg name; `text` for a string leaf. */\n expressions: Record<string, CompiledExpression>;\n text: CompiledExpression | null;\n /** True when the node has no bindings, actions or control flow, so it can render as a memoised static subtree. */\n isStatic: boolean;\n /** `args.onClick` store writes, or null when the node has none. `to` stays raw for render-time evaluation. */\n actions: ClickAction[] | null;\n each: CompiledEach | null;\n children: CompiledNode[];\n}\n\n/** A dynamic key with the path-splitting work already done. */\nexport interface CompiledKey {\n /** The key exactly as `extractVariables` produced it, e.g. `applicant.name`. */\n key: string;\n /** `key` split and unwrapped, e.g. `[\"rows\", \"0\", \"label\"]`. */\n segments: string[];\n /** `numericNext[i]` is true when `segments[i + 1]` is an array index. */\n numericNext: boolean[];\n}\n\nexport interface ClickAction {\n set: string;\n to: unknown;\n}\n\nexport interface CompiledEach {\n as: string;\n indexAlias: string | undefined;\n keyExpr: unknown;\n /**\n * The unresolved store path the array lives at (`\"\"` for a computed items\n * expression). Resolving it against a row's `scope` stays at render time.\n */\n rawItemsPath: string;\n}\n\nexport interface CompiledTemplate {\n root: CompiledNode;\n source: Config;\n}\n\nconst PATH_SEGMENTS_RE =\n /[^.[\\]]+|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/g;\n\nexport function splitPathSegments(path: string): string[] {\n return path.match(PATH_SEGMENTS_RE) || [];\n}\n\nexport function unwrapSegment(seg: string): string {\n return seg.startsWith(\"[\") && seg.endsWith(\"]\")\n ? seg.slice(1, -1).replace(/^[\"']|[\"']$/g, \"\")\n : seg;\n}\n\nfunction compileKey(key: string): CompiledKey {\n const segments = splitPathSegments(key).map(unwrapSegment);\n const numericNext = segments.map((_, i) => {\n const next = segments[i + 1];\n return next !== undefined && /^\\d+$/.test(next);\n });\n return { key, segments, numericNext };\n}\n\nfunction compileNode(source: Config): CompiledNode {\n const isText = typeof source === \"string\";\n const node: ConfigNode | undefined = isText ? undefined : source;\n\n // Null-prototype so a registry-supplied prop name like \"constructor\" can't\n // resolve to an inherited member (same hazard Task 1 closed for the registries).\n const expressions: Record<string, CompiledExpression> = Object.create(null);\n // A plain object, not null-prototype like the maps above: V8 keeps those in dictionary\n // mode, which makes the per-render `{ ...node.args }` spread several times slower.\n const args: Record<string, unknown> = {};\n const dynamicArgs = new Set<string>();\n const argPaths: Record<string, string> = Object.create(null);\n const keys = new Set<string>();\n\n let text: CompiledExpression | null = null;\n let actions: ClickAction[] | null = null;\n\n if (isText) {\n text = compileExpression(source);\n text?.variables.forEach((v) => keys.add(v));\n } else {\n // Mirrors `extractDynamicKeys`: args only, in declaration order, never children.\n for (const [name, value] of Object.entries(node?.args ?? {})) {\n if (BLOCKED_ARGS.has(name)) continue;\n const compiled = compileExpression(value);\n if (!compiled) {\n // A bound URL is only known once it resolves, so `prepareState` checks those.\n args[name] = URL_ARGS.has(name) ? safeUrl(value) : value;\n continue;\n }\n args[name] = value;\n expressions[name] = compiled;\n dynamicArgs.add(name);\n if (compiled.ast && staticPath(compiled.ast) != null) {\n argPaths[name] = compiled.content;\n }\n compiled.variables.forEach((v) => keys.add(v));\n }\n\n const onClick = node?.args?.onClick;\n if (Array.isArray(onClick)) {\n // Malformed entries are dropped here so the click handler never sees them.\n actions = onClick.filter(\n (a: { set?: unknown } | null): a is ClickAction => typeof a?.set === \"string\" && a.set !== \"\",\n );\n // `to` is only evaluated on click, but it reads from the same data slice as the node's args.\n actions.forEach((a) => compileExpression(a.to)?.variables.forEach((v) => keys.add(v)));\n }\n }\n\n const rawType = node?.type;\n // Text leaves report \"div\" so element keys keep matching the pre-compiler\n // `getKey(leaf, ...)`, which read `leaf.type` off a string and got undefined.\n const type = rawType || \"div\";\n const isEach = rawType === COMPONENT.EACH;\n const isIf = rawType === COMPONENT.IF;\n\n // The `each` args shape `validateTemplate` enforces; like every arg, read here unvalidated.\n const eachArgs = node?.args as { as: string; index?: string; key?: unknown } | undefined;\n const each: CompiledEach | null = isEach\n ? {\n as: eachArgs?.as as string,\n indexAlias: eachArgs?.index,\n keyExpr: eachArgs?.key,\n rawItemsPath: argPaths[\"items\"] ?? \"\",\n }\n : null;\n\n const dynamicKeys = Array.from(keys, compileKey);\n\n return {\n source,\n args,\n isText,\n type,\n isEach,\n isIf,\n isImage: rawType === COMPONENT.IMAGE,\n dynamicKeys,\n dynamicArgs,\n argPaths,\n expressions,\n text,\n // Matches `isStaticLeaf`: control nodes always re-render, otherwise \"no bindings of its own\".\n isStatic: !isEach && !isIf && dynamicKeys.length === 0 && !actions,\n actions,\n each,\n children: isText\n ? []\n : (node?.children ?? []).map(compileNode),\n };\n}\n\n// Object templates are keyed by identity and collected with the template itself.\nconst templateCache = new WeakMap<object, CompiledTemplate>();\n// String templates can't key a WeakMap, so they fall back to the same bounded LRU\n// strategy the expression cache uses.\nconst stringTemplateCache = new LRUCache<string, CompiledTemplate>(50);\n\n/**\n * Compiles a template once and caches it by object identity, so mounting the\n * same template in N renderer instances does the work once. Both `RenderTree`\n * (SSR) and `RenderTreeClient` (client) consume the result.\n */\nexport function compileTemplate(template: Config): CompiledTemplate {\n if (typeof template === \"string\") {\n const hit = stringTemplateCache.get(template);\n if (hit) return hit;\n const compiled: CompiledTemplate = {\n root: compileNode(template),\n source: template,\n };\n stringTemplateCache.set(template, compiled);\n return compiled;\n }\n\n if (template == null || typeof template !== \"object\") {\n return { root: compileNode(template), source: template };\n }\n\n const hit = templateCache.get(template);\n if (hit) return hit;\n\n const compiled: CompiledTemplate = {\n root: compileNode(template),\n source: template,\n };\n templateCache.set(template, compiled);\n return compiled;\n}\n","import type { ComponentType } from \"react\";\nimport type { ZodType } from \"zod\";\n\nexport type ComponentCapability =\n | \"children\"\n | \"bindings\"\n | \"events\"\n | \"formField\"\n | \"ssr\"\n | \"pdf\";\n\nexport interface ControlledFieldSpec {\n valueProp: string;\n changeProp: string;\n extract: (eventOrValue: unknown) => unknown;\n}\n\nexport interface ComponentDefinition {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- component props are arbitrary per registry entry\n component: ComponentType<any> | string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- schema shape is registry-specific\n propsSchema?: ZodType<any>;\n capabilities?: ComponentCapability[];\n // A component with subtype-dependent controlled behavior (e.g. <input type=\"number\">\n // vs type=\"text\") keys this by `args.type`, with a mandatory \"default\" entry.\n controlled?: ControlledFieldSpec | Record<string, ControlledFieldSpec>;\n assets?: {\n css?: string[];\n fonts?: string[];\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- fallback component props are arbitrary\nexport type RegistryFallback = \"error\" | \"div\" | ComponentType<any>;\n\nexport interface BonsaiRegistry {\n id: string;\n version: string;\n namespace?: string;\n // Set on registries resolved from a Case A manifest so `validateTemplate`'s pin\n // check can catch a manifest edited in place at a stable URL. Absent on\n // object-form (build-time) registries.\n manifestHash?: string;\n components: Record<string, ComponentDefinition>;\n fallback?: RegistryFallback;\n}\n\nexport function defineComponent(def: ComponentDefinition): ComponentDefinition {\n return def;\n}\n\nexport function defineBonsaiRegistry(registry: BonsaiRegistry): BonsaiRegistry {\n return registry;\n}\n","import * as React from \"react\";\n\nconst A = React.forwardRef<HTMLAnchorElement>(({ ...props }, ref) => {\n return <a ref={ref} {...props} />;\n});\nA.displayName = \"A\";\n\nexport { A };\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nconst hVariants = cva(\"font-heading font-semibold scroll-m-20\", {\n variants: {\n variant: {\n h1: \"text-6xl font-semibold tracking-tight\",\n h2: \"text-4xl font-semibold tracking-tight first:mt-0\",\n h3: \"text-2xl font-semibold tracking-tight\",\n h4: \"text-xl font-semibold tracking-tight\",\n h5: \"text-lg font-semibold tracking-tight\",\n h6: \"text-base font-semibold tracking-tight\",\n },\n },\n defaultVariants: {\n variant: \"h3\",\n },\n});\n\ninterface HeadingProps\n extends\n React.HTMLAttributes<HTMLHeadingElement>,\n VariantProps<typeof hVariants> {\n as?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n}\n\nconst H = React.forwardRef<HTMLHeadingElement, HeadingProps>(\n ({ className, variant, as, ...props }, ref) => {\n const Comp = as || variant || \"h3\";\n return (\n <Comp\n ref={ref}\n className={cn(hVariants({ variant }), className)}\n {...props}\n />\n );\n },\n);\n\nH.displayName = \"H\";\n\nexport { H, hVariants };\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nconst pVariants = cva(\"text-base\", {\n variants: {\n variant: {\n default: \"\",\n muted: \"text-muted\",\n },\n size: {\n xs: \"text-xs font-light leading-snug\",\n sm: \"text-sm font-light leading-snug\",\n md: \"text-base\",\n lg: \"text-lg font-semibold\",\n xl: \"text-xl font-bold\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n});\n\ninterface ParagraphProps\n extends\n React.HTMLAttributes<HTMLParagraphElement>,\n VariantProps<typeof pVariants> {\n as?: \"p\" | \"div\" | \"span\";\n}\n\nconst P = React.forwardRef<HTMLParagraphElement, ParagraphProps>(\n ({ className, variant, size, as: Comp = \"p\", ...props }, ref) => {\n return (\n <Comp\n ref={ref}\n className={cn(pVariants({ variant, size }), className)}\n {...props}\n />\n );\n },\n);\nP.displayName = \"P\";\n\nexport { P, pVariants };\n","\"use client\";\n\nimport { Accordion as AccordionPrimitive } from \"@base-ui/react/accordion\";\nimport { IconChevronDown, type IconProps } from \"@tabler/icons-react\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { useHaptics, HAPTIC_ACCORDION } from \"@/lib/haptics\";\n\nconst accordionVariants = cva(\"flex w-full flex-col\", {\n variants: {\n variant: {\n default: \"\",\n contained: \"\",\n separated: \"gap-4\",\n },\n raised: {\n xs: \"\",\n sm: \"\",\n md: \"\",\n lg: \"\",\n },\n extrude: {\n xs: \"\",\n sm: \"\",\n md: \"\",\n lg: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n});\n\ninterface AccordionProps\n extends\n AccordionPrimitive.Root.Props,\n VariantProps<typeof accordionVariants> {}\n\nfunction Accordion({\n className,\n variant = \"default\",\n raised,\n extrude,\n ...props\n}: AccordionProps) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n data-variant={variant}\n data-raised={raised ?? undefined}\n data-extrude={extrude ?? undefined}\n className={cn(\n accordionVariants({ variant, raised, extrude }),\n \"group/accordion\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AccordionItem({ className, ...props }: AccordionPrimitive.Item.Props) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\n \"group/accordion-item\",\n \"data-closed:z-1 data-open:z-2 transition-[box-shadow,translate] linear duration-200\",\n \"group-data-[variant=default]/accordion:bg-surface\",\n \"group-data-[variant=default]/accordion:first:rounded-t-base\",\n \"group-data-[variant=default]/accordion:last:rounded-b-base\",\n \"group-data-[variant=default]/accordion:border-b\",\n \"group-data-[variant=default]/accordion:last:border-b-transparent\",\n\n \"group-data-[variant=contained]/accordion:bg-surface\",\n \"group-data-[variant=contained]/accordion:first:rounded-t-base\",\n \"group-data-[variant=contained]/accordion:last:rounded-b-base\",\n \"group-data-[variant=contained]/accordion:border-2\",\n \"group-data-[variant=contained]/accordion:border-border\",\n \"group-data-[variant=contained]/accordion:not-last:data-closed:-mb-1\",\n\n \"group-data-[variant=separated]/accordion:bg-surface\",\n \"group-data-[variant=separated]/accordion:border-2\",\n \"group-data-[variant=separated]/accordion:border-border\",\n \"group-data-[variant=separated]/accordion:rounded-base\",\n \"group-data-[variant=separated]/accordion:data-closed:not-last:mb-0\",\n\n \"group-data-raised/accordion:data-open:z-1\",\n \"group-data-raised/accordion:border\",\n \"group-data-raised/accordion:border-border\",\n \"group-data-raised/accordion:not-last:data-closed:-mb-1\",\n\n \"group-data-[raised=xs]/accordion:shadow-xs group-data-[raised=xs]/accordion:-translate-0.5\",\n \"group-data-[raised=sm]/accordion:shadow-sm group-data-[raised=sm]/accordion:-translate-0.75\",\n \"group-data-[raised=md]/accordion:shadow-md group-data-[raised=md]/accordion:-translate-1\",\n \"group-data-[raised=lg]/accordion:shadow-lg group-data-[raised=lg]/accordion:-translate-1.25\",\n\n \"group-data-extrude/accordion:data-open:z-1\",\n \"group-data-extrude/accordion:border\",\n \"group-data-extrude/accordion:data-open:border-border\",\n \"group-data-extrude/accordion:not-last:data-open:-mb-1\",\n \"group-data-extrude/accordion:border-t-transparent\",\n \"group-data-extrude/accordion:border-l-transparent\",\n \"group-data-extrude/accordion:border-r-transparent\",\n\n \"group-data-[extrude=xs]/accordion:data-open:shadow-xs group-data-[extrude=xs]/accordion:data-open:-translate-0.5\",\n \"group-data-[extrude=sm]/accordion:data-open:shadow-sm group-data-[extrude=sm]/accordion:data-open:-translate-0.75\",\n \"group-data-[extrude=md]/accordion:data-open:shadow-md group-data-[extrude=md]/accordion:data-open:-translate-1\",\n \"group-data-[extrude=lg]/accordion:data-open:shadow-lg group-data-[extrude=lg]/accordion:data-open:-translate-1.25\",\n\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AccordionTrigger({\n className,\n children,\n icon: Icon = IconChevronDown,\n onClick,\n ...props\n}: AccordionPrimitive.Trigger.Props & {\n icon?: React.ElementType<IconProps>;\n}) {\n const { trigger } = useHaptics();\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"neo-base neo-accordion-focus pt-3 text-left text-base font-medium cursor-pointer shrink-0 group/accordion-trigger relative flex flex-1 items-center justify-between border border-transparent transition-[opacity,border] data-disabled:pointer-events-none data-disabled:opacity-50\",\n \"p-4\",\n \"hover:underline\",\n \"group-first/accordion-item:rounded-t-base\",\n \"group-last/accordion-item:group-data-closed/accordion-item:rounded-b-base\",\n \"group-data-open/accordion-item:group-has-data-[slot=accordion-content]/accordion-item:pb-2\",\n \"group-data-open/accordion-item:group-has-data-[slot=accordion-content]/accordion-item:mb-2\",\n \"group-data-[variant=separated]/accordion:pt-4\",\n className,\n )}\n onClick={(event) => {\n trigger(HAPTIC_ACCORDION);\n onClick?.(event);\n }}\n {...props}\n >\n {children}\n <Icon\n data-slot=\"accordion-trigger-icon\"\n className={cn(\n \"group-aria-expanded/accordion-trigger:-rotate-180 transition-[rotate] duration-300\",\n \"text-muted ml-auto size-4 pointer-events-none\",\n )}\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: AccordionPrimitive.Panel.Props) {\n return (\n <AccordionPrimitive.Panel\n data-slot=\"accordion-content\"\n keepMounted\n className=\"overflow-hidden text-sm transition-[height] duration-300 ease-out data-ending-style:h-0 data-starting-style:h-0 h-(--accordion-panel-height)\"\n {...props}\n >\n <div\n className={cn(\n \"pt-0 px-4 pb-4 data-ending-style:h-0 data-starting-style:h-0 [&_p:not(:last-child)]:mb-4\",\n className,\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Panel>\n );\n}\n\nexport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n accordionVariants,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst alertVariants = cva(\n \"relative grid px-4 py-3 gap-0.5 rounded-base border text-left text-sm *:[svg]:row-span-2 *:[svg]:translate-y-1 *:[svg]:text-current has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-24 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2.5\",\n {\n variants: {\n variant: {\n default: \"bg-surface text-card-foreground\",\n success: \"bg-main-secondary text-card-foreground\",\n warning: \"text-foreground bg-accent-yellow-secondary\",\n destructive:\n \"text-foreground bg-accent-red-secondary border-border *:[svg]:text-current\",\n },\n size: {\n default: \"w-full\",\n sm: \"w-sm\",\n lg: \"w-full\",\n },\n raised: {\n xs: \"shadow-xs -translate-0.5\",\n sm: \"shadow-sm -translate-0.75\",\n md: \"shadow-md -translate-1\",\n lg: \"shadow-lg -translate-1.25\",\n xl: \"shadow-xl -translate-1.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction Alert({\n className,\n variant = \"default\",\n size = \"default\",\n raised,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(\n alertVariants({ variant, raised, size }),\n \"group/alert\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"font-heading text-lg font-medium [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3\",\n \"group-has-[>svg]/alert:col-start-2\",\n \"group-has-[size=sm]:text-sm\",\n \"group-has-[size=lg]:text-2xl\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-muted text-sm text-balance md:text-pretty [&_p:not(:last-child)]:mb-4 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3\",\n \"group-has-[variant=destructive]:text-foreground\",\n \"group-has-[size=sm]:text-xs\",\n \"group-has-[size=lg]:text-lg\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-action\"\n className={cn(\n \"absolute top-2.5 right-3\",\n \"group-has-[variant=destructive]:text-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertTitle, AlertDescription, AlertAction, alertVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst avatarVariants = cva(\"relative flex shrink-0 select-none\", {\n variants: {\n size: {\n full: \"size-full\",\n sm: \"size-8\",\n md: \"size-10\",\n lg: \"size-12\",\n xl: \"size-14\",\n },\n raised: {\n xs: \"shadow-xs -translate-0.5 ring-0\",\n sm: \"shadow-sm -translate-0.75 ring-0\",\n md: \"shadow-md -translate-1 ring-0\",\n lg: \"shadow-lg -translate-1.25 ring-0\",\n },\n rounded: {\n none: \"\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n },\n },\n defaultVariants: {\n size: \"md\",\n rounded: \"full\",\n },\n});\n\ntype AvatarProps = Omit<AvatarPrimitive.Root.Props, \"children\"> &\n VariantProps<typeof avatarVariants> & {\n src?: string;\n alt?: string;\n fallback?: React.ReactNode;\n badge?: React.ReactNode;\n children?: React.ReactNode;\n };\n\nfunction Avatar({\n className,\n size = \"md\",\n rounded = \"full\",\n raised,\n src,\n alt,\n fallback,\n badge,\n children,\n ...props\n}: AvatarProps) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n data-raised={raised}\n data-rounded={rounded}\n className={cn(\n avatarVariants({ size, rounded, raised }),\n \"group/avatar\",\n className,\n )}\n {...props}\n >\n {children ?? (\n <>\n {src && (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"aspect-square size-full object-cover border\",\n \"group-data-[rounded=sm]/avatar:rounded-sm\",\n \"group-data-[rounded=md]/avatar:rounded-md\",\n \"group-data-[rounded=lg]/avatar:rounded-lg\",\n \"group-data-[rounded=full]/avatar:rounded-full\",\n )}\n src={src}\n alt={alt}\n />\n )}\n {fallback != null && (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"text-foreground bg-surface flex size-full items-center justify-center border text-sm \",\n \"group-data-[size=sm]/avatar:text-xs\",\n \"group-data-[rounded=sm]/avatar:rounded-sm\",\n \"group-data-[rounded=md]/avatar:rounded-md\",\n \"group-data-[rounded=lg]/avatar:rounded-lg\",\n \"group-data-[rounded=full]/avatar:rounded-full\",\n )}\n delay={150}\n >\n {fallback}\n </AvatarPrimitive.Fallback>\n )}\n {badge != null && (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"overflow-hidden text-primary-foreground ring-surface absolute right-1 bottom-1 z-10 inline-flex items-center justify-center bg-main select-none border-1\",\n \"group-data-[size=sm]/avatar:size-3\",\n \"group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=sm]/avatar:translate-0.75\",\n \"group-data-[size=md]/avatar:size-4\",\n \"group-data-[size=md]/avatar:[&>svg]:size-3\",\n \"group-data-[size=md]/avatar:translate-1.5\",\n \"group-data-[size=lg]/avatar:size-5\",\n \"group-data-[size=lg]/avatar:[&>svg]:size-4\",\n \"group-data-[size=lg]/avatar:translate-1.5\",\n \"group-data-[size=xl]/avatar:size-6\",\n \"group-data-[size=xl]/avatar:[&>svg]:size-5\",\n \"group-data-[size=xl]/avatar:translate-1.5\",\n \"group-data-[size=full]/avatar:size-4\",\n \"group-data-[size=full]/avatar:[&>svg]:size-3\",\n \"group-data-[size=full]/avatar:translate-1.5\",\n\n \"group-data-[raised=xs]/avatar:shadow-xs\",\n \"group-data-[raised=sm]/avatar:shadow-sm\",\n \"group-data-[raised=md]/avatar:shadow-md\",\n \"group-data-[raised=lg]/avatar:shadow-lg\",\n\n \"group-data-[rounded=sm]/avatar:rounded-sm\",\n \"group-data-[rounded=md]/avatar:rounded-md\",\n \"group-data-[rounded=lg]/avatar:rounded-lg\",\n \"group-data-[rounded=full]/avatar:rounded-full\",\n \"group-data-[rounded=full]/avatar:translate-0\",\n )}\n >\n {badge}\n </span>\n )}\n </>\n )}\n </AvatarPrimitive.Root>\n );\n}\n\ntype AvatarGroupProps = React.ComponentProps<\"div\"> & {\n max?: number;\n};\n\nfunction AvatarGroup({\n className,\n max = 3,\n children,\n ...props\n}: AvatarGroupProps) {\n const childArray = React.Children.toArray(children);\n const hasOverflow = max != null && childArray.length > max;\n const visibleChildren = hasOverflow ? childArray.slice(0, max) : childArray;\n const overflowCount = hasOverflow ? childArray.length - max : 0;\n\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\"group/avatar-group flex -space-x-2\", className)}\n {...props}\n >\n {visibleChildren}\n {overflowCount > 0 && (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n \"grid grid-cols-1 origin-bottom-left\",\n \"*:col-span-1 *:col-start-1 *:row-start-1 *:my-auto *:border-2 *:bg-main-secondary *:text-sm *:text-foreground *:relative *:flex *:shrink-0 *:items-center *:justify-center *:[&>svg]:size-4\",\n \"*:size-8 hover:*:size-10 hover:*:-mr-2 *:transition-[color,translate,opacity,border,width,height,margin] *:duration-300 *:linear\",\n\n \"*:group-has-data-[size=sm]/avatar-group:size-6 hover:*:group-has-data-[size=sm]/avatar-group:size-8\",\n \"*:group-has-data-[size=sm]/avatar-group:text-[0.7rem]\",\n \"*:group-has-data-[size=sm]/avatar-group:[&>svg]:size-3\",\n \"hover:*:group-has-data-[size=sm]/avatar-group:-mr-2\",\n\n \"*:group-has-data-[size=lg]/avatar-group:size-9 hover:*:group-has-data-[size=lg]/avatar-group:size-12\",\n \"*:group-has-data-[size=lg]/avatar-group:[&>svg]:size-5\",\n \"hover:*:group-has-data-[size=lg]/avatar-group:-mr-3\",\n\n \"*:group-has-data-[size=xl]/avatar-group:size-11 hover:*:group-has-data-[size=xl]/avatar-group:size-14\",\n \"*:group-has-data-[size=xl]/avatar-group:[&>svg]:size-6\",\n \"hover:*:group-has-data-[size=xl]/avatar-group:-mr-3\",\n\n \"*:group-has-data-[rounded=sm]/avatar-group:rounded-sm\",\n \"*:group-has-data-[rounded=md]/avatar-group:rounded-md\",\n \"*:group-has-data-[rounded=lg]/avatar-group:rounded-lg\",\n \"*:group-has-data-[rounded=full]/avatar-group:rounded-full\",\n\n \"*:group-has-data-[raised=xs]/avatar-group:shadow-xs *:group-has-data-[raised=xs]/avatar-group:-translate-0.5\",\n \"*:group-has-data-[raised=sm]/avatar-group:shadow-sm *:group-has-data-[raised=sm]/avatar-group:-translate-0.75\",\n \"*:group-has-data-[raised=md]/avatar-group:shadow-md *:group-has-data-[raised=md]/avatar-group:-translate-1\",\n \"*:group-has-data-[raised=lg]/avatar-group:shadow-lg *:group-has-data-[raised=lg]/avatar-group:-translate-1.25\",\n )}\n >\n <div className=\"z-[-1]\" />\n <div className=\"shadow-none\">+{overflowCount}</div>\n </div>\n )}\n </div>\n );\n}\n\nexport { Avatar, AvatarGroup };\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\n\nconst badgeVariants = cva(\n \"gap-1 px-2 py-0.5 [button]:cursor-pointer rounded-full border text-xs font-medium transition-[color,box-shadow,translate] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 inline-flex items-center justify-center w-fit whitespace-nowrap shrink-0 [&>svg]:pointer-events-none aria-invalid:border-accent-red duration-200 overflow-hidden\",\n {\n variants: {\n variant: {\n default: \"bg-main text-foreground\",\n secondary: \"bg-main-secondary text-foreground\",\n destructive: \"bg-accent-red text-foreground\",\n outline: \"border-border text-foreground\",\n ghost: \"text-muted hover:bg-foreground/20 border-transparent\",\n },\n size: {\n sm: \"h-5 text-xs [&>svg]:size-3\",\n md: \"text-sm [&>svg]:size-4\",\n lg: \"text-base [&>svg]:size-5\",\n },\n raised: {\n xs: \"shadow-xs -translate-px\",\n sm: \"shadow-sm -translate-0.5\",\n md: \"shadow-md -translate-0.75\",\n lg: \"shadow-lg -translate-1\",\n },\n extrude: {\n xs: \"hover:shadow-xs hover:-translate-px focus-visible:shadow-xs focus-visible:-translate-px active:shadow-none active:translate-0 disabled:shadow-none disabled:translate-0\",\n sm: \"hover:shadow-sm hover:-translate-0.5 focus-visible:shadow-sm focus-visible:-translate-0.5 active:shadow-none active:translate-0 disabled:shadow-none disabled:translate-0\",\n md: \"hover:shadow-md hover:-translate-0.75 focus-visible:shadow-md focus-visible:-translate-0.75 active:shadow-none active:translate-0 disabled:shadow-none disabled:translate-0\",\n lg: \"hover:shadow-lg hover:-translate-1 focus-visible:shadow-lg focus-visible:-translate-1 active:shadow-none active:translate-0 disabled:shadow-none disabled:translate-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n },\n);\n\nfunction Badge({\n className,\n variant = \"default\",\n size = \"md\",\n raised,\n extrude,\n render,\n ...props\n}: useRender.ComponentProps<\"span\"> & VariantProps<typeof badgeVariants>) {\n return useRender({\n defaultTagName: \"span\",\n props: mergeProps<\"span\">(\n {\n className: cn(\n badgeVariants({ size, variant, raised, extrude }),\n \"group/badge\",\n className,\n ),\n tabIndex: props.tabIndex,\n },\n props,\n ),\n render,\n state: {\n slot: \"badge\",\n variant,\n },\n });\n}\n\nexport { Badge, badgeVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst cardVariants = cva(\n \"bg-surface border text-foreground overflow-hidden rounded-base text-sm flex flex-col\",\n {\n variants: {\n size: {\n sm: \"gap-3 py-3 md:gap-4 md:py-4\",\n md: \"gap-4 py-4 md:gap-6 md:py-6\",\n },\n raised: {\n none: \"shadow-none\",\n xs: \"shadow-xs -translate-0.5\",\n sm: \"shadow-sm -translate-0.75\",\n md: \"shadow-md -translate-1\",\n lg: \"shadow-lg -translate-1.25\",\n xl: \"shadow-xl -translate-1.5\",\n },\n },\n defaultVariants: {\n size: \"md\",\n raised: \"md\",\n },\n },\n);\n\nfunction Card({\n className,\n size = \"md\",\n raised = \"md\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof cardVariants>) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(cardVariants({ raised, size }), \"group/card\", className)}\n {...props}\n />\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]\",\n \"gap-1 group/card-header @container/card-header grid auto-rows-min items-start\",\n \"group-data-[size=sm]/card:px-3 group-data-[size=sm]/card:[.border-b]:pb-3\",\n \"group-data-[size=md]/card:px-4 group-data-[size=md]/card:[.border-b]:pb-4\",\n \"md:group-data-[size=sm]/card:px-4 md:group-data-[size=sm]/card:[.border-b]:pb-4\",\n \"md:group-data-[size=md]/card:px-6 md:group-data-[size=md]/card:[.border-b]:pb-6\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n \"col-start-1 row-start-1 font-heading leading-normal font-medium mt-0.5 self-center\",\n \"group-has-data-[slot=card-description]/card-header:leading-tight\",\n \"group-has-data-[slot=card-description]/card-header:mt-0\",\n \"group-data-[size=sm]/card:text-base\",\n \"group-data-[size=md]/card:text-lg\",\n \"group-has-data-[slot=card-icon]/card-header:group-data-[size=sm]/card:pl-9\",\n \"group-has-data-[slot=card-icon]/card-header:group-data-[size=md]/card:pl-12\",\n \"group-has-data-[slot=card-icon]/card-header:group-has-data-[slot=card-description]/card-header:group-data-[size=sm]/card:pl-13\",\n \"group-has-data-[slot=card-icon]/card-header:group-has-data-[slot=card-description]/card-header:group-data-[size=md]/card:pl-14\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\n \"text-muted col-start-1 row-start-2\",\n \"group-data-[size=sm]/card:text-xs\",\n \"group-data-[size=md]/card:text-sm\",\n \"group-has-data-[slot=card-icon]/card-header:group-data-[size=sm]/card:pl-13\",\n \"group-has-data-[slot=card-icon]/card-header:group-data-[size=md]/card:pl-14\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardIcon({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-icon\"\n className={cn(\n \"bg-main col-span-1 row-span-2 col-start-1 row-start-1 rounded-sm border-2 flex items-center justify-center self-start\",\n \"group-data-[size=sm]/card:p-0.75\",\n \"group-data-[size=md]/card:p-1\",\n \"group-data-[size=sm]/card:size-7\",\n \"group-data-[size=md]/card:size-8\",\n \"group-has-data-[slot=card-description]/card-header:group-data-[size=sm]/card:size-10\",\n \"group-has-data-[slot=card-description]/card-header:group-data-[size=md]/card:size-11\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\n \"group-data-[size=sm]/card:px-3\",\n \"group-data-[size=md]/card:px-4\",\n \"md:group-data-[size=sm]/card:px-4\",\n \"md:group-data-[size=md]/card:px-6\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center justify-end\",\n \"group-data-[size=sm]/card:px-3 group-data-[size=sm]/card:[.border-t]:pt-3\",\n \"group-data-[size=md]/card:px-4 group-data-[size=md]/card:[.border-t]:pt-4\",\n \"md:group-data-[size=sm]/card:px-4 md:group-data-[size=sm]/card:[.border-t]:pt-4\",\n \"md:group-data-[size=md]/card:px-6 md:group-data-[size=md]/card:[.border-t]:pt-6\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardIcon,\n CardDescription,\n CardContent,\n cardVariants,\n};\n","\"use client\";\n\nimport { Checkbox as CheckboxPrimitive } from \"@base-ui/react/checkbox\";\nimport { IconCheck } from \"@tabler/icons-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\nimport { useHaptics, HAPTIC_CHECKBOX } from \"@/lib/haptics\";\n\nconst checkboxVariants = cva(\n \"neo-base neo-checkbox-focus flex size-5 cursor-pointer items-center justify-center rounded-md border relative shrink-0 transition-[color,opacity,box-shadow,translate] data-checked:bg-main aria-disabled:pointer-events-none aria-disabled:cursor-not-allowed aria-disabled:opacity-50 aria-invalid:bg-accent-red-secondary\",\n {\n variants: {\n size: {\n xs: \"size-4.5\",\n sm: \"size-5\",\n md: \"size-5.5\",\n lg: \"size-6\",\n xl: \"size-6.5\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n },\n);\n\nfunction Checkbox({\n className,\n size,\n onCheckedChange,\n ...props\n}: CheckboxPrimitive.Root.Props & VariantProps<typeof checkboxVariants>) {\n const { trigger } = useHaptics();\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n data-size={size}\n className={cn(\n checkboxVariants({ size }),\n \"peer group/checkbox\",\n className,\n )}\n aria-label={props[\"aria-label\"] ?? \"checkbox\"}\n onCheckedChange={(checked, event) => {\n trigger(HAPTIC_CHECKBOX);\n onCheckedChange?.(checked, event);\n }}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"grid place-content-center text-current\"\n >\n <IconCheck\n stroke={3.5}\n className={cn(\n \"size-4\",\n \"group-data-[size=xs]/checkbox:size-3\",\n \"group-data-[size=sm]/checkbox:size-3.5\",\n \"group-data-[size=md]/checkbox:size-4\",\n \"group-data-[size=lg]/checkbox:size-4.5\",\n \"group-data-[size=xl]/checkbox:size-5\",\n )}\n />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n\nexport { Checkbox, checkboxVariants };\n","\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Collapsible as CollapsiblePrimitive } from \"@base-ui/react/collapsible\";\n\nfunction Collapsible({ className, ...props }: CollapsiblePrimitive.Root.Props) {\n return (\n <CollapsiblePrimitive.Root\n className={cn(\"group/collapsible\", className)}\n data-slot=\"collapsible\"\n {...props}\n />\n );\n}\n\nfunction CollapsibleTrigger({\n className,\n ...props\n}: CollapsiblePrimitive.Trigger.Props) {\n return (\n <CollapsiblePrimitive.Trigger\n className={cn(\n \"group-data-open/collapsible:[&_svg]:-scale-y-100\",\n className,\n )}\n data-slot=\"collapsible-trigger\"\n {...props}\n />\n );\n}\n\nfunction CollapsibleContent({\n className,\n children,\n ...props\n}: CollapsiblePrimitive.Panel.Props) {\n return (\n <CollapsiblePrimitive.Panel\n className={cn(\"group overflow-hidden\", className)}\n data-slot=\"collapsible-content\"\n keepMounted\n {...props}\n >\n <div\n data-slot=\"collapsible-content-container\"\n className={cn(\n \"transition-[opacity,translate] duration-300\",\n \"group-data-starting-style:-translate-y-20 group-data-starting-style:opacity-0\",\n \"group-data-ending-style:-translate-y-20 group-data-ending-style:opacity-0\",\n )}\n >\n {children}\n </div>\n </CollapsiblePrimitive.Panel>\n );\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Input as InputPrimitive } from \"@base-ui/react/input\";\nimport { cn } from \"@/lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n \"neo-base neo-input-focus transition-[translate,box-shadow] h-10 w-full min-w-0 placeholder:text-subtle rounded-base border px-2.5 py-1 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 bg-surface\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { OTPInput, OTPInputContext } from \"input-otp\";\nimport { IconMinus } from \"@tabler/icons-react\";\nimport { cn } from \"@/lib/utils\";\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string;\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"cn-input-otp flex items-center has-disabled:opacity-50\",\n containerClassName,\n )}\n spellCheck={false}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n );\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\"rounded-base flex items-center gap-0\", className)}\n {...props}\n />\n );\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number;\n}) {\n const inputOTPContext = React.useContext(OTPInputContext);\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n data-has-value={char !== null}\n className={cn(\n \"bg-surface border-2 size-9 -mb-0.5 -mr-0.5 outline-none text-sm relative flex items-center justify-center\",\n \"transition-[translate,border,box-shadow] ease-in\",\n \"hover:shadow-md hover:-translate-1\",\n \"data-[has-value=true]:shadow-none data-[has-value=true]:translate-0\",\n \"data-[active=true]:ease-out data-[active=true]:z-10 data-[active=true]:shadow-md data-[active=true]:-translate-1 data-[active=true]:not-first:rounded-l-sm data-[active=true]:not-last:rounded-r-sm\",\n \"focus-visible:shadow-md focus-visible:-translate-1\",\n \"first:rounded-l-base last:rounded-r-base\",\n className,\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"animate-caret-blink duration-1000 bg-foreground h-4 w-0.5\" />\n </div>\n )}\n </div>\n );\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-separator\"\n className=\"[&_svg:not([class*='size-'])]:size-4 flex items-center mx-1 *:stroke-3\"\n role=\"separator\"\n {...props}\n >\n <IconMinus />\n </div>\n );\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nfunction Textarea({\n className,\n onInput,\n autosize = false,\n ...props\n}: React.ComponentProps<\"textarea\"> & { autosize?: boolean }) {\n const handleInput = (e: React.FormEvent<HTMLTextAreaElement>) => {\n if (autosize) {\n const textarea = e.currentTarget;\n textarea.style.height = \"auto\";\n textarea.style.height = textarea.scrollHeight + \"px\";\n }\n };\n\n return (\n <textarea\n data-slot=\"textarea\"\n onInput={onInput ? onInput : handleInput}\n className={cn(\n \"neo-base neo-input-focus\",\n \"flex field-sizing-content transition-all\",\n \"h-10 min-h-16 w-full min-w-0\",\n \"placeholder:text-subtle\",\n \"rounded-base border px-2.5 py-2\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group\",\n \"relative flex w-full min-w-0 items-center border-border h-10 rounded-base border shadow-none has-[>textarea]:h-auto\",\n \"has-[>[data-align=block-end]]:p-1 has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:h-auto\",\n \"has-[>[data-align=block-start]]:p-1 has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:h-auto\",\n className,\n )}\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted h-full gap-2 p-2 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 flex cursor-text items-center justify-center select-none\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"mr-0.5 has-[>button]:mr-0 has-[>kbd]:mr-0 has-[>button]:-ml-0.75 has-[>kbd]:-ml-0.75 order-first\",\n \"inline-end\":\n \"ml-0.5 has-[>button]:ml-0 has-[>kbd]:ml-0 has-[>button]:-mr-0.75 has-[>kbd]:-mr-0.75 order-last\",\n \"block-start\": \"mb-1 [.border-b]:pb-3 order-first w-full justify-start\",\n \"block-end\": \"mt-1 [.border-t]:pt-3 order-last w-full justify-start\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n },\n);\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return;\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus();\n }}\n {...props}\n />\n );\n}\n\nconst inputGroupButtonVariants = cva(\"gap-2 text-sm flex items-center\", {\n variants: {\n size: {\n xs: \"h-7 gap-1 rounded-sm px-1.5 py-0.5\",\n sm: \"\",\n \"icon-xs\": \"size-6 rounded-sm p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-10 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n});\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"outline\",\n extrude = \"xs\",\n size,\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\" | \"type\"> &\n VariantProps<typeof inputGroupButtonVariants> & {\n type?: \"button\" | \"submit\" | \"reset\";\n }) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n extrude={extrude ?? null}\n aria-label={props[\"aria-label\"] ?? \"input-button\"}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"text-subtle gap-2 font-base flex items-center [&_svg]:pointer-events-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"h-10 hover:border-border focus:border-border flex-1 bg-surface -m-0.5\",\n \"group-has-[>[data-align=block-start]]/input-group:m-0\",\n \"group-has-[>[data-align=block-end]]/input-group:m-0\",\n \"group-has-[>[data-align=inline-start]]/input-group:pl-1.5\",\n \"group-has-[>[data-align=inline-end]]/input-group:pr-1.5\",\n \"group-has-[>[data-align=block-start]]/input-group:rounded-base\",\n \"group-has-[>[data-align=block-end]]/input-group:rounded-base\",\n \"group-has-[>[data-align=inline-start]]/input-group:rounded-l-none\",\n \"group-has-[>[data-align=inline-start]]/input-group:hover:rounded-l-sm\",\n \"group-has-[>[data-align=inline-start]]/input-group:focus:rounded-l-sm\",\n \"group-has-[>[data-align=inline-end]]/input-group:rounded-r-none\",\n \"group-has-[>[data-align=inline-end]]/input-group:hover:rounded-r-sm\",\n \"group-has-[>[data-align=inline-end]]/input-group:focus:rounded-r-sm\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"h-auto hover:border-border focus:border-border flex-1 bg-surface\",\n \"group-has-[>[data-align=block-start]]/input-group:m-0\",\n \"group-has-[>[data-align=block-end]]/input-group:m-0\",\n \"group-has-[>[data-align=block-start]]/input-group:rounded-base\",\n \"group-has-[>[data-align=block-end]]/input-group:rounded-base\",\n \"group-has-[>[data-align=inline-start]]/input-group:rounded-l-none\",\n \"group-has-[>[data-align=inline-start]]/input-group:hover:rounded-l-base\",\n \"group-has-[>[data-align=inline-start]]/input-group:focus:rounded-l-base\",\n \"group-has-[>[data-align=inline-end]]/input-group:rounded-r-none\",\n \"group-has-[>[data-align=inline-end]]/input-group:hover:rounded-r-base\",\n \"group-has-[>[data-align=inline-end]]/input-group:focus:rounded-r-base\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n inputGroupAddonVariants,\n};\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst labelVariants = cva(\n \"gap-2 leading-none group-data-[disabled=true]:opacity-50 peer-disabled:opacity-50 flex items-center select-none group-data-[disabled=true]:pointer-events-none peer-disabled:cursor-not-allowed\",\n {\n variants: {\n variant: {\n default: \"\",\n underline:\n \"hover:underline hover:underline-offset-3 hover:decoration-2\",\n destructive: \"font-bold! text-accent-red\",\n },\n size: {\n xs: \"text-xs font-normal\",\n sm: \"text-sm font-medium\",\n md: \"text-base font-medium\",\n lg: \"text-lg font-semibold\",\n xl: \"text-xl font-semibold\",\n },\n },\n },\n);\n\nfunction Label({\n size = \"sm\",\n variant,\n className,\n htmlFor,\n ...props\n}: React.ComponentProps<\"label\"> & VariantProps<typeof labelVariants> & { htmlFor: string }) {\n return (\n <label\n data-slot=\"label\"\n htmlFor={htmlFor}\n className={cn(labelVariants({ size, variant }), className)}\n {...props}\n />\n );\n}\n\nexport { Label, labelVariants };\n","\"use client\";\n\nimport { Progress as ProgressPrimitive } from \"@base-ui/react/progress\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst progressVariants = cva(\"group/progress flex flex-wrap\", {\n variants: {\n size: {\n xs: \"gap-1\",\n sm: \"gap-1\",\n md: \"gap-1\",\n lg: \"gap-2\",\n xl: \"gap-2\",\n },\n raised: {\n default: \"\",\n xs: \"*:-translate-0.5\",\n sm: \"*:-translate-0.75\",\n md: \"*:-translate-1\",\n lg: \"*:-translate-[4.75px]\",\n xl: \"*:-translate-[5.5px]\",\n },\n stacked: {\n default: \"[--stack-translate:--spacing(0)]\",\n xs: \"[--stack-translate:--spacing(0.5)] **:data-[value=100]:rounded-xl **:data-[value=100]:scale-x-101\",\n sm: \"[--stack-translate:3px] **:data-[value=100]:rounded-xl **:data-[value=100]:scale-x-101\",\n md: \"[--stack-translate:--spacing(1)] **:data-[value=100]:rounded-xl **:data-[value=100]:scale-x-101\",\n lg: \"[--stack-translate:4.75px] **:data-[value=100]:rounded-xl **:data-[value=100]:scale-x-101\",\n xl: \"[--stack-translate:5.5px] **:data-[value=100]:rounded-xl **:data-[value=100]:scale-x-101\",\n },\n },\n});\n\ninterface ProgressValue extends ProgressPrimitive.Indicator.Props {\n name?: string;\n value: number;\n className?: string;\n}\ninterface ProgressBaseProps\n extends\n Omit<ProgressPrimitive.Root.Props, \"value\">,\n VariantProps<typeof progressVariants> {\n className?: string;\n children?: React.ReactNode;\n}\n\ntype ProgressSingleProps = ProgressBaseProps & {\n mode?: \"single\";\n value: number | null;\n};\n\ntype ProgressMultipleProps = ProgressBaseProps & {\n mode: \"multiple\";\n value: ProgressValue[];\n};\n\nexport type ProgressProps = ProgressSingleProps | ProgressMultipleProps;\n\nfunction Progress(props: ProgressProps) {\n const {\n size = \"md\",\n raised = \"default\",\n stacked = \"default\",\n className,\n children,\n ...rest\n } = props;\n\n if (props.mode === \"multiple\") {\n const indicators = [...props.value].sort((a, b) => b.value - a.value);\n\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n data-size={size}\n data-raised={raised}\n data-stacked={stacked}\n className={cn(progressVariants({ size, raised, stacked }), className)}\n {...(rest as ProgressPrimitive.Root.Props)}\n >\n {children}\n <ProgressTrack\n style={{\n marginTop: `calc(var(--stack-translate, 0px) * ${indicators.length - 1})`,\n transform: `translateX(calc(var(--stack-translate, 0px) * ${indicators.length - 1}))`,\n }}\n className=\"grid grid-cols-1 *:row-start-1 *:col-start-1 *:row-end-1 *:col-end-1 items-end *:self-start\"\n >\n {indicators.map((item, i) => (\n <ProgressIndicatorGroup\n key={i}\n index={i}\n data-value={item.value}\n {...item}\n >\n <ProgressPrimitive.Value\n className={cn(\n item.value < 5 ? \"pr-0.5\" : \"\",\n \"text-muted leading-none font-heading tabular-nums h-full flex flex-row items-end justify-end gap-1 ml-auto my-auto\",\n \"group-data-[size=xs]/progress:hidden\",\n \"group-data-[size=sm]/progress:hidden\",\n \"group-data-[size=md]/progress:text-[11px]\",\n \"group-data-[size=lg]/progress:text-xs\",\n \"group-data-[size=xl]/progress:text-xs\",\n\n \"group-data-[size=md]/progress:pb-px group-data-[size=md]/progress:pr-1.25\",\n \"group-data-[size=lg]/progress:pb-1 group-data-[size=lg]/progress:pr-1.5 group-data-[size=lg]/progress:translate-y-px\",\n \"group-data-[size=xl]/progress:pb-1.75 group-data-[size=xl]/progress:pr-1.75 group-data-[size=xl]/progress:translate-y-0.5\",\n\n \"group-data-[stacked=default]/progress:translate-y-0 group-data-[stacked=default]/progress:items-center\",\n )}\n data-slot=\"progress-indicator-group-value\"\n >\n {() => (\n <>\n {item.name && (\n <span\n className=\"font-semibold line-clamp-1 opacity-0 -translate-y-10 transition-[opacity,translate] duration-200 hover:ease-in ease-out\"\n data-slot=\"progress-name\"\n >\n {item.name}\n </span>\n )}\n {item.value.toLocaleString(\"default\", {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n })}\n {item.value < 5 ? \"\" : \"%\"}\n </>\n )}\n </ProgressPrimitive.Value>\n </ProgressIndicatorGroup>\n ))}\n </ProgressTrack>\n </ProgressPrimitive.Root>\n );\n }\n\n return (\n <ProgressPrimitive.Root\n {...rest}\n value={props.value}\n data-slot=\"progress\"\n data-size={size}\n data-raised={raised}\n data-stacked={stacked}\n className={cn(progressVariants({ size, raised, stacked }), className)}\n >\n {children}\n\n <ProgressTrack>\n <ProgressIndicator data-value={props.value} />\n </ProgressTrack>\n </ProgressPrimitive.Root>\n );\n}\n\nfunction ProgressTrack({ className, ...props }: ProgressPrimitive.Track.Props) {\n return (\n <ProgressPrimitive.Track\n className={cn(\n \"bg-surface border-2 rounded-full relative flex w-full items-center\",\n \"group-data-[raised=xs]/progress:shadow-xs\",\n \"group-data-[raised=sm]/progress:shadow-sm\",\n \"group-data-[raised=md]/progress:shadow-md\",\n \"group-data-[raised=lg]/progress:shadow-lg\",\n \"group-data-[raised=xl]/progress:shadow-xl\",\n \"group-data-[size=xs]/progress:h-3\",\n \"group-data-[size=sm]/progress:h-4\",\n \"group-data-[size=md]/progress:h-5\",\n \"group-data-[size=lg]/progress:h-6\",\n \"group-data-[size=xl]/progress:h-7\",\n \"group-data-[stacked=default]/progress:overflow-hidden\",\n \"overflow-visible\",\n className,\n )}\n data-slot=\"progress-track\"\n {...props}\n />\n );\n}\n\nfunction ProgressIndicator({\n className,\n ...props\n}: ProgressPrimitive.Indicator.Props) {\n return (\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className={cn(\n \"bg-main h-full transition-all overflow-hidden border-2 rounded-l-xl\",\n \"group-data-[stacked=default]/progress:rounded-l-none\",\n \"group-data-[stacked=default]/progress:border-0\",\n \"group-data-[stacked=xs]/progress:shadow-xs group-data-[stacked=xs]/progress:-translate-0.5\",\n \"group-data-[stacked=sm]/progress:shadow-sm group-data-[stacked=sm]/progress:-translate-0.75\",\n \"group-data-[stacked=md]/progress:shadow-md group-data-[stacked=md]/progress:-translate-1\",\n \"group-data-[stacked=lg]/progress:shadow-lg group-data-[stacked=lg]/progress:-translate-[4.75px]\",\n \"group-data-[stacked=xl]/progress:shadow-xl group-data-[stacked=xl]/progress:-translate-[5.5px]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ProgressIndicatorGroup({\n className,\n children,\n value,\n index,\n ...props\n}: ProgressPrimitive.Indicator.Props & {\n value: number;\n index: number;\n}) {\n return (\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator-group\"\n data-value={value}\n data-group={true}\n className={cn(\n \"group/progress-indicator-group bg-main overflow-hidden transition-height duration-200 ease-in hover:ease-out border-2 rounded-l-xl\",\n \"group-data-[size=xs]/progress:h-2.5 group-data-[size=xs]/progress:hover:h-2.5 group-data-[stacked=default]/progress:group-data-[size=xs]/progress:hover:h-2.5\",\n \"group-data-[size=sm]/progress:h-3.5 group-data-[size=sm]/progress:hover:h-3.5 group-data-[stacked=default]/progress:group-data-[size=sm]/progress:hover:h-3.5\",\n \"group-data-[size=md]/progress:h-4.5 group-data-[size=md]/progress:hover:h-7.75 group-data-[stacked=default]/progress:group-data-[size=md]/progress:hover:h-4.5\",\n \"group-data-[size=lg]/progress:h-5.5 group-data-[size=lg]/progress:hover:h-9.75 group-data-[stacked=default]/progress:group-data-[size=lg]/progress:hover:h-5.5\",\n \"group-data-[size=xl]/progress:h-6.5 group-data-[size=xl]/progress:hover:h-11.25 group-data-[stacked=default]/progress:group-data-[size=xl]/progress:hover:h-6.5\",\n\n \"group-data-[stacked=default]/progress:rounded-none group-data-[stacked=default]/progress:border-0 group-data-[stacked=default]/progress:rounded-l-none\",\n \"group-data-[stacked=xs]/progress:shadow-xs group-data-[stacked=xs]/progress:-translate-0.5\",\n \"group-data-[stacked=sm]/progress:shadow-sm group-data-[stacked=sm]/progress:-translate-0.75\",\n \"group-data-[stacked=md]/progress:shadow-md group-data-[stacked=md]/progress:-translate-1\",\n \"group-data-[stacked=lg]/progress:shadow-lg group-data-[stacked=lg]/progress:-translate-[4.75px]\",\n \"group-data-[stacked=xl]/progress:shadow-xl group-data-[stacked=xl]/progress:-translate-[5.5px]\",\n\n \"hover:**:data-[slot=progress-value]:flex-wrap hover:**:text-foreground hover:**:**:data-[slot=progress-name]:opacity-100 hover:**:data-[slot=progress-name]:translate-0\",\n className,\n )}\n {...props}\n style={{\n minWidth: `${value}%`,\n maxWidth: `${value}%`,\n transform: `translateX(calc(var(--stack-translate, 0px) * -${index})) translateY(calc(var(--stack-translate, 0px) * -${index}))`,\n }}\n >\n {children}\n </ProgressPrimitive.Indicator>\n );\n}\n\nfunction ProgressLabel({ className, ...props }: ProgressPrimitive.Label.Props) {\n return (\n <ProgressPrimitive.Label\n className={cn(\n \"font-heading font-medium\",\n \"group-data-[size=xs]/progress:text-sm\",\n \"group-data-[size=sm]/progress:text-sm\",\n \"group-data-[size=md]/progress:text-base\",\n \"group-data-[size=lg]/progress:text-lg\",\n \"group-data-[size=xl]/progress:text-xl\",\n className,\n )}\n data-slot=\"progress-label\"\n {...props}\n />\n );\n}\n\nfunction ProgressValue({ className, ...props }: ProgressPrimitive.Value.Props) {\n return (\n <ProgressPrimitive.Value\n className={cn(\n \"text-muted ml-auto my-auto font-heading tabular-nums\",\n \"group-data-[size=xs]/progress:text-xs\",\n \"group-data-[size=sm]/progress:text-xs\",\n \"group-data-[size=md]/progress:text-sm\",\n \"group-data-[size=lg]/progress:text-base\",\n \"group-data-[size=xl]/progress:text-base\",\n className,\n )}\n data-slot=\"progress-value\"\n {...props}\n />\n );\n}\n\nexport {\n type ProgressSingleProps,\n type ProgressMultipleProps,\n Progress,\n ProgressTrack,\n ProgressIndicator,\n ProgressLabel,\n ProgressValue,\n progressVariants,\n};\n","\"use client\";\n\nimport { Separator as SeparatorPrimitive } from \"@base-ui/react/separator\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst separatorVariants = cva(\"bg-border shrink-0\", {\n variants: {\n stroke: {\n thin: \"border-0.5\",\n regular: \"border-1\",\n thick: \"border-2\",\n },\n orientation: {\n horizontal: \"h-px w-full\",\n vertical: \"w-px self-stretch\",\n },\n },\n defaultVariants: {\n stroke: \"regular\",\n orientation: \"horizontal\",\n },\n});\n\nfunction Separator({\n className,\n orientation,\n stroke,\n ...props\n}: SeparatorPrimitive.Props & VariantProps<typeof separatorVariants>) {\n return (\n <SeparatorPrimitive\n data-slot=\"separator\"\n orientation={orientation}\n className={cn(separatorVariants({ orientation, stroke }), className)}\n {...props}\n />\n );\n}\n\nexport { Separator };\n","\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst skeletonVariants = cva(\"bg-foreground/30 rounded-base\", {\n variants: {\n variant: {\n circle: \"aspect-square w-auto rounded-full\",\n square: \"aspect-square w-auto\",\n default: \"grow\",\n text: \"aspect-[1/19] w-auto rounded-full max-h-10\",\n },\n animate: {\n true: \"animate-pulse\",\n false: \"\",\n },\n },\n});\n\nfunction Skeleton({\n variant = \"default\",\n animate = true,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof skeletonVariants>) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(skeletonVariants({ variant, animate }), className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton, skeletonVariants };\n","\"use client\";\n\nimport { Switch as SwitchPrimitive } from \"@base-ui/react/switch\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { useHaptics, HAPTIC_SWITCH } from \"@/lib/haptics\";\n\nconst switchVariants = cva(\n \"neo-base neo-switch-focus relative cursor-pointer inline-flex items-center data-checked:bg-main data-unchecked:bg-surface shrink-0 border-2 border-border transition-[translate,box-shadow,color] aria-disabled:cursor-not-allowed aria-disabled:opacity-50\",\n {\n variants: {\n size: {\n sm: \"h-5 w-10\",\n md: \"h-6 w-12\",\n lg: \"h-7 w-14\",\n },\n rounded: {\n none: \"rounded-none\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-[999px]\",\n },\n },\n defaultVariants: {\n size: \"md\",\n rounded: \"full\",\n },\n },\n);\n\nfunction Switch({\n className,\n size = \"md\",\n rounded = \"full\",\n onCheckedChange,\n ...props\n}: SwitchPrimitive.Root.Props & VariantProps<typeof switchVariants>) {\n const { trigger } = useHaptics();\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n data-rounded={rounded}\n className={cn(\n switchVariants({ size, rounded }),\n \"peer group/switch\",\n className,\n )}\n aria-label={props[\"aria-label\"] ?? \"switch\"}\n onCheckedChange={(checked, event) => {\n trigger(HAPTIC_SWITCH);\n onCheckedChange?.(checked, event);\n }}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"bg-surface border-2 border-border pointer-events-none block transition-[translate] duration-300\",\n \"group-data-checked/switch:ml-px group-data-unchecked/switch:-ml-px\",\n \"group-data-[rounded=full]/switch:group-data-checked/switch:ml-0 group-data-[rounded=full]/switch:group-data-unchecked/switch:ml-0\",\n\n \"group-data-unchecked/switch:translate-x-1\",\n\n \"group-data-[size=sm]/switch:size-3\",\n \"group-data-[size=md]/switch:size-4\",\n \"group-data-[size=lg]/switch:size-5\",\n \"group-data-[size=sm]/switch:group-data-checked/switch:translate-x-5\",\n \"group-data-[size=md]/switch:group-data-checked/switch:translate-x-6\",\n \"group-data-[size=lg]/switch:group-data-checked/switch:translate-x-7\",\n\n \"group-data-[rounded=none]/switch:rounded-none\",\n \"group-data-[rounded=sm]/switch:rounded-sm\",\n \"group-data-[rounded=md]/switch:rounded-md\",\n \"group-data-[rounded=lg]/switch:rounded-lg\",\n \"group-data-[rounded=full]/switch:rounded-full\",\n )}\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch, switchVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst tableVariants = cva(\"w-full caption-bottom text-sm\", {\n variants: {\n variant: {\n default: \"\",\n filled: \"\",\n lines: \"\",\n },\n },\n});\n\nfunction Table({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"table\"> & VariantProps<typeof tableVariants>) {\n return (\n <div\n data-slot=\"table-container\"\n className=\"relative w-full overflow-x-auto\"\n >\n <table\n data-slot=\"table\"\n data-variant={variant}\n className={cn(tableVariants({ variant }), \"group/table\", className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b font-heading\", className)}\n {...props}\n />\n );\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n );\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"*:bg-transparent border-t font-medium font-heading [&>tr]:last:border-b-0\",\n \"group-data-[variant=default]/table:bg-surface\",\n \"group-data-[variant=filled]/table:bg-main-secondary\",\n \"group-data-[variant=lines]/table:bg-surface\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b transition-colors duration-300 ease\",\n \"group-data-[variant=default]/table:bg-surface\",\n \"group-data-[variant=default]/table:hover:even:bg-main\",\n \"group-data-[variant=default]/table:hover:odd:bg-main-secondary\",\n \"group-data-[variant=default]/table:data-[state=selected]:bg-subtle\",\n\n \"group-data-[variant=filled]/table:bg-main\",\n \"group-data-[variant=filled]/table:hover:odd:bg-surface\",\n \"group-data-[variant=filled]/table:hover:even:bg-main-secondary\",\n \"group-data-[variant=filled]/table:data-[state=selected]:bg-foreground/25\",\n \"group-data-[variant=filled]/table:last:border-b-2\",\n\n \"group-data-[variant=lines]/table:bg-surface\",\n \"group-data-[variant=lines]/table:hover:even:bg-main\",\n \"group-data-[variant=lines]/table:hover:odd:bg-main-secondary\",\n \"group-data-[variant=lines]/table:data-[state=selected]:bg-main/50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0\",\n \"group-data-[variant=filled]/table:border-r-2 group-data-[variant=filled]/table:border-t-2 group-data-[variant=filled]/table:first:border-l-2\",\n \"group-data-[variant=lines]/table:not-last:border-r-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0\",\n \"group-data-[variant=filled]/table:first:border-l-2 group-data-[variant=filled]/table:border-r-2\",\n \"group-data-[variant=lines]/table:not-last:border-r-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\n \"text-muted hover:text-foreground mt-4 text-sm font-heading\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n tableVariants,\n};\n","import type { ChangeEvent, ElementType } from \"react\";\n\nimport { COMPONENT } from \"@bonsai/constants\";\n\nimport {\n defineBonsaiRegistry,\n defineComponent,\n type BonsaiRegistry,\n type ComponentCapability,\n type ControlledFieldSpec,\n} from \"../lib/registry/types\";\n\nimport { A } from \"../components/ui/a\";\nimport { H } from \"../components/ui/h\";\nimport { P } from \"../components/ui/p\";\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from \"../components/ui/accordion\";\nimport { Alert } from \"../components/ui/alert\";\nimport { Avatar } from \"../components/ui/avatar\";\nimport { Badge } from \"../components/ui/badge\";\nimport { Button } from \"../components/ui/button\";\nimport {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n CardAction,\n CardIcon,\n} from \"../components/ui/card\";\nimport { Checkbox } from \"../components/ui/checkbox\";\nimport {\n Collapsible,\n CollapsibleTrigger,\n CollapsibleContent,\n} from \"../components/ui/collapsible\";\nimport { Input } from \"../components/ui/input\";\nimport { InputOTP } from \"../components/ui/input-otp\";\nimport {\n InputGroup,\n InputGroupText,\n InputGroupAddon,\n InputGroupInput,\n InputGroupButton,\n InputGroupTextarea,\n} from \"../components/ui/input-group\";\nimport { Label } from \"../components/ui/label\";\nimport { Loader } from \"../components/ui/loader\";\nimport { Progress } from \"../components/ui/progress\";\nimport { Separator } from \"../components/ui/separator\";\nimport { Skeleton } from \"../components/ui/skeleton\";\nimport { Switch } from \"../components/ui/switch\";\nimport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} from \"../components/ui/table\";\nimport { Textarea } from \"../components/ui/textarea\";\n\n/**\n * Describes how the renderer two-way-binds a component to the store: which prop\n * carries the value, which prop reports a change, and how to pull the new value\n * out of whatever that prop is called with.\n */\nexport interface ControlledInput {\n valueProp: string;\n changeProp: string;\n // Method syntax keeps the parameter bivariant, so each extractor declares what its\n // component's change prop passes (an event, a string, a Date, ...).\n extractor(eventOrValue: unknown): unknown;\n}\n\n/**\n * A controlled-input entry is either a single binding or, for components whose\n * binding depends on `args.type` (e.g. `input`), a map of subtype -> binding\n * with a `default` fallback.\n */\nexport type ControlledInputEntry =\n | ControlledInput\n | Record<string, ControlledInput>;\n\nexport type ComponentRegistry = Record<string, ElementType>;\nexport type ControlledInputRegistry = Record<string, ControlledInputEntry>;\n\n/**\n * A bundle of components plus their controlled-input bindings. Both the\n * built-in heavy presets (`renderer/presets/*`) and consumer-supplied\n * extensions to `createBonsaiRenderer` use this shape; `extendRegistry`\n * layers it onto the `BonsaiRegistry` the renderer consumes.\n */\nexport interface BonsaiPreset {\n components?: ComponentRegistry;\n controlledInputs?: ControlledInputRegistry;\n}\n\nconst FORM_FIELD_CAPABILITIES: ComponentCapability[] = [\"bindings\", \"formField\", \"events\", \"ssr\", \"pdf\"];\nconst DEFAULT_CAPABILITIES: ComponentCapability[] = [\"children\", \"bindings\", \"events\", \"ssr\", \"pdf\"];\n\nfunction toControlledFieldSpec(entry: ControlledInput): ControlledFieldSpec {\n return {\n valueProp: entry.valueProp,\n changeProp: entry.changeProp,\n extract: entry.extractor,\n };\n}\n\nfunction toControlled(\n entry: ControlledInputEntry | undefined,\n): ControlledFieldSpec | Record<string, ControlledFieldSpec> | undefined {\n if (!entry) return undefined;\n if (typeof entry === \"object\" && \"default\" in entry) {\n return Object.fromEntries(\n Object.entries(entry as Record<string, ControlledInput>).map(([subtype, spec]) => [\n subtype,\n toControlledFieldSpec(spec),\n ]),\n );\n }\n return toControlledFieldSpec(entry as ControlledInput);\n}\n\n/**\n * Layers a preset over `base`, type by type: a supplied component replaces the\n * base's component but keeps its binding, and a supplied binding re-binds the\n * base's component — the same \"caller wins per key\" semantics as spreading the\n * two maps separately.\n */\nexport function extendRegistry(\n base: BonsaiRegistry,\n { components = {}, controlledInputs = {} }: BonsaiPreset,\n): BonsaiRegistry {\n const merged = { ...base.components };\n for (const type of new Set([...Object.keys(components), ...Object.keys(controlledInputs)])) {\n const prev = Object.hasOwn(merged, type) ? merged[type] : undefined;\n const component = Object.hasOwn(components, type) ? components[type] : prev?.component;\n if (component === undefined) continue;\n const controlled = Object.hasOwn(controlledInputs, type)\n ? toControlled(controlledInputs[type])\n : prev?.controlled;\n merged[type] = defineComponent({\n ...prev,\n component,\n controlled,\n capabilities: prev?.capabilities ?? (controlled ? FORM_FIELD_CAPABILITIES : DEFAULT_CAPABILITIES),\n });\n }\n return { ...base, components: merged };\n}\n\n/**\n * Every built-in component that carries no heavy third-party dependency.\n * Deliberately excludes `map`, `calendar` and `signature` — those live in\n * `renderer/presets/*` so a core consumer never bundles MapLibre,\n * react-day-picker or react-signature-canvas.\n */\nexport const coreComponents: ComponentRegistry = {\n [COMPONENT.A]: A,\n [COMPONENT.H]: H,\n [COMPONENT.P]: P,\n [COMPONENT.OL]: \"ol\",\n [COMPONENT.UL]: \"ul\",\n [COMPONENT.LI]: \"li\",\n [COMPONENT.DIV]: \"div\",\n [COMPONENT.SPAN]: \"span\",\n [COMPONENT.IMAGE]: \"img\",\n [COMPONENT.ACCORDION]: Accordion,\n [COMPONENT.ACCORDION_ITEM]: AccordionItem,\n [COMPONENT.ACCORDION_TRIGGER]: AccordionTrigger,\n [COMPONENT.ACCORDION_CONTENT]: AccordionContent,\n [COMPONENT.ALERT]: Alert,\n [COMPONENT.AVATAR]: Avatar,\n [COMPONENT.BADGE]: Badge,\n [COMPONENT.BUTTON]: Button,\n [COMPONENT.CARD]: Card,\n [COMPONENT.CARD_HEADER]: CardHeader,\n [COMPONENT.CARD_TITLE]: CardTitle,\n [COMPONENT.CARD_DESCRIPTION]: CardDescription,\n [COMPONENT.CARD_CONTENT]: CardContent,\n [COMPONENT.CARD_FOOTER]: CardFooter,\n [COMPONENT.CARD_ACTION]: CardAction,\n [COMPONENT.CARD_ICON]: CardIcon,\n [COMPONENT.CHECKBOX]: Checkbox,\n [COMPONENT.COLLAPSIBLE]: Collapsible,\n [COMPONENT.COLLAPSIBLE_TRIGGER]: CollapsibleTrigger,\n [COMPONENT.COLLAPSIBLE_CONTENT]: CollapsibleContent,\n [COMPONENT.OTP]: InputOTP,\n [COMPONENT.INPUT]: Input,\n [COMPONENT.INPUT_GROUP]: InputGroup,\n [COMPONENT.INPUT_GROUP_TEXT]: InputGroupText,\n [COMPONENT.INPUT_GROUP_ADDON]: InputGroupAddon,\n [COMPONENT.INPUT_GROUP_INPUT]: InputGroupInput,\n [COMPONENT.INPUT_GROUP_BUTTON]: InputGroupButton,\n [COMPONENT.INPUT_GROUP_TEXTAREA]: InputGroupTextarea,\n [COMPONENT.LABEL]: Label,\n [COMPONENT.LOADER]: Loader,\n [COMPONENT.PROGRESS]: Progress,\n [COMPONENT.SWITCH]: Switch,\n [COMPONENT.SEPARATOR]: Separator,\n [COMPONENT.SKELETON]: Skeleton,\n [COMPONENT.TABLE]: Table,\n [COMPONENT.TABLE_HEADER]: TableHeader,\n [COMPONENT.TABLE_BODY]: TableBody,\n [COMPONENT.TABLE_FOOTER]: TableFooter,\n [COMPONENT.TABLE_HEAD]: TableHead,\n [COMPONENT.TABLE_ROW]: TableRow,\n [COMPONENT.TABLE_CELL]: TableCell,\n [COMPONENT.TABLE_CAPTION]: TableCaption,\n [COMPONENT.TEXTAREA]: Textarea,\n};\n\n/** Controlled-input bindings for the components in `coreComponents`. */\nexport const coreControlledInputs: ControlledInputRegistry = {\n [COMPONENT.INPUT]: {\n text: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e: ChangeEvent<HTMLInputElement>) => e.target.value,\n },\n email: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e: ChangeEvent<HTMLInputElement>) => e.target.value,\n },\n password: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e: ChangeEvent<HTMLInputElement>) => e.target.value,\n },\n number: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n // valueAsNumber is NaN (never nullish) for an empty or partial entry; keep the raw string then.\n extractor: (e: ChangeEvent<HTMLInputElement>) =>\n Number.isNaN(e.target.valueAsNumber)\n ? e.target.value\n : e.target.valueAsNumber,\n },\n default: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e: ChangeEvent<HTMLInputElement>) => e.target.value,\n },\n },\n // input-otp calls onChange with the new string, not an event.\n [COMPONENT.OTP]: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (value: string) => value,\n },\n [COMPONENT.CHECKBOX]: {\n valueProp: \"checked\",\n changeProp: \"onCheckedChange\",\n extractor: (checked) => checked,\n },\n [COMPONENT.TEXTAREA]: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e: ChangeEvent<HTMLTextAreaElement>) => e.target.value,\n },\n [COMPONENT.INPUT_GROUP_INPUT]: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e: ChangeEvent<HTMLInputElement>) => e.target.value,\n },\n [COMPONENT.INPUT_GROUP_TEXTAREA]: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (e: ChangeEvent<HTMLTextAreaElement>) => e.target.value,\n },\n [COMPONENT.SWITCH]: {\n valueProp: \"checked\",\n changeProp: \"onCheckedChange\",\n extractor: (checked) => checked,\n },\n};\n\n/**\n * The registry used when no renderer-scoped registry is provided. Same library\n * identity as `pebbleRegistry` (it is a subset of it), but without per-component\n * `propsSchema`s so the core entry never bundles `@bonsai/schemas`.\n */\nexport const coreRegistry: BonsaiRegistry = extendRegistry(\n defineBonsaiRegistry({\n id: \"pebble-ui\",\n version: \"1.0.0\",\n namespace: \"pebble\",\n fallback: \"div\",\n components: {},\n }),\n { components: coreComponents, controlledInputs: coreControlledInputs },\n);\n","import { createContext, createElement, Fragment, useContext } from \"react\";\nimport type { Config, ConfigNode } from \"../../types\";\nimport { coreRegistry } from \"../../renderer/core-registry\";\nimport type { BonsaiRegistry, ControlledFieldSpec } from \"../../lib/registry/types\";\nimport { parseExpression } from \"../../lib/ast\";\nimport {\n splitPathSegments,\n unwrapSegment,\n type ClickAction,\n type CompiledEach,\n type CompiledKey,\n type CompiledNode,\n} from \"../../lib/renderer/compile-template\";\nimport { URL_ARGS, safeUrl } from \"../../lib/renderer/safe-props\";\n\n/**\n * Registry the renderer resolves component types against. Defaults to the\n * lightweight core registry; `createBonsaiRenderer` provides a scoped one, so\n * two renderers never share (or mutate) each other's components.\n */\nexport const BonsaiRegistryContext = createContext<BonsaiRegistry>(coreRegistry);\n\nexport function useBonsaiRegistry(): BonsaiRegistry {\n return useContext(BonsaiRegistryContext);\n}\n\n// The render mode (\"web\" | \"pdf\" | \"preview\") is declared at the root but must\n// reach leaf components — a `pdf` signature is a static <img>, not the\n// interactive pad. Prop-drilling it through every node would touch dozens of\n// call sites for one consumer, so it travels by context instead. Defaults to\n// \"web\" so any component rendered outside a <Bonsai> root keeps its\n// interactive behaviour.\nexport type RenderMode = \"web\" | \"pdf\" | \"preview\";\nconst BonsaiRenderModeContext = createContext<RenderMode>(\"web\");\n\n/** Read by leaf components that render differently in a non-interactive document. */\nexport function useBonsaiRenderMode(): RenderMode {\n return useContext(BonsaiRenderModeContext);\n}\n\n/**\n * Provides the per-instance render mode, plus the `registry` prop when given\n * (otherwise the inherited renderer-scoped registry stays in effect).\n */\nexport function BonsaiRoot({\n registry,\n render = \"web\",\n children,\n}: Pick<BonsaiProps, \"registry\" | \"render\"> & { children: React.ReactNode }) {\n const inherited = useBonsaiRegistry();\n return (\n <BonsaiRegistryContext.Provider value={registry ?? inherited}>\n <BonsaiRenderModeContext.Provider value={render}>{children}</BonsaiRenderModeContext.Provider>\n </BonsaiRegistryContext.Provider>\n );\n}\n\nexport const VOID_ELEMENTS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\nexport const getKey = (leaf: CompiledNode, index: number, path: string): string => {\n return `${leaf.type}-${path}-${index}`;\n};\n\nexport function getValue(data: unknown, path: string, def?: unknown): unknown {\n if (!path) return data;\n const segments = splitPathSegments(path);\n return (\n segments.reduce<unknown>((acc, seg) => {\n if (acc == null) return undefined;\n return (acc as Record<string, unknown>)[unwrapSegment(seg)];\n }, data) ?? def\n );\n}\n\nexport function setValue(obj: Record<string, unknown>, path: string, value: unknown) {\n if (!path) {\n Object.assign(obj, value);\n return;\n }\n const segments = splitPathSegments(path).map(unwrapSegment);\n // Paths come from templates: never write through `__proto__`, and only walk own\n // keys, so e.g. `constructor.prototype.x` can't reach a shared prototype.\n if (segments.includes(\"__proto__\")) return;\n let current = obj;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n if (!Object.hasOwn(current, seg) || current[seg] == null) {\n current[seg] = /^\\d+$/.test(segments[i + 1]) ? [] : {};\n }\n current = current[seg] as Record<string, unknown>;\n }\n current[segments[segments.length - 1]] = value;\n}\n\n// Leading identifier of a path, e.g. \"applicant\" for \"applicant.name\" or \"rows[0].x\" -> \"rows\".\nexport function pathRoot(path: string): string {\n const rootMatch = path.match(/^[^.[]+/);\n return rootMatch ? rootMatch[0] : path;\n}\n\n// True when a path starts at an alias bound to a row *value* (a computed `each` row) rather than a store path.\nexport function isValueScoped(\n path: string,\n valueScope?: Record<string, unknown>,\n): boolean {\n return !!valueScope && Object.hasOwn(valueScope, pathRoot(path));\n}\n\n// Resolves an `each`-scoped alias path to its real store path, e.g. \"applicant.name\" -> \"applicants.3.name\".\nexport function resolveScopedPath(\n path: string,\n scope?: Record<string, string>,\n): string {\n if (!scope) return path;\n const root = pathRoot(path);\n const prefix = scope[root];\n return prefix == null ? path : prefix + path.slice(root.length);\n}\n\nexport const evaluateDynamicValue = (value: unknown, data: Record<string, unknown>): unknown => {\n return parseExpression(value, data);\n};\n\n// Builds the nested data slice a node evaluates its bindings against, from its\n// precompiled keys. The splitting/unwrapping happened once at compile time; only\n// the value lookup (which depends on scope and the live store) happens here.\nexport function buildDataSlice(\n keys: CompiledKey[],\n resolveValue: (key: string) => unknown,\n): Record<string, unknown> {\n const acc: Record<string, unknown> = {};\n for (const { key, segments, numericNext } of keys) {\n const value = resolveValue(key);\n if (segments.length === 1) {\n acc[key] = value;\n continue;\n }\n let current = acc;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n if (\n !(seg in current) ||\n typeof current[seg] !== \"object\" ||\n current[seg] === null\n ) {\n current[seg] = numericNext[i] ? [] : {};\n }\n current = current[seg] as Record<string, unknown>;\n }\n current[segments[segments.length - 1]] = value;\n }\n return acc;\n}\n\n// Unknown types (including custom ones the active registry doesn't know about)\n// follow the registry's `fallback`: a plain <div> by default, a custom\n// component, or — with `\"error\"` — a throw (caught by the node's error guard).\n// `hasOwn` keeps prototype keys like \"constructor\" from resolving.\nexport const resolveElementType = (\n registry: BonsaiRegistry,\n type?: string,\n): React.ElementType => {\n if (!type) return \"div\";\n if (Object.hasOwn(registry.components, type)) {\n return registry.components[type].component as React.ElementType;\n }\n if (registry.fallback === \"error\") {\n throw new Error(\n `Bonsai: unknown component type \"${type}\" in registry \"${registry.id}\"@\"${registry.version}\"`,\n );\n }\n if (registry.fallback && registry.fallback !== \"div\") return registry.fallback;\n return \"div\";\n};\n\n// Only args the compiler classified as `{{...}}` expressions (plus caller-supplied\n// `extra`, whose values aren't known ahead of time) go through the evaluator;\n// static props are passed straight through, which is what they evaluated to anyway.\n// `node.args` is already sanitised, so only evaluated URLs still need checking.\nexport const prepareState = (\n node: CompiledNode,\n dataSlice: Record<string, unknown>,\n key: string,\n extra: Record<string, unknown> = {},\n): Record<string, unknown> => {\n const baseProps: Record<string, unknown> = {\n key,\n ...node.args,\n ...extra,\n };\n for (const k of Object.keys(baseProps)) {\n if (node.dynamicArgs.has(k) || Object.hasOwn(extra, k)) {\n const value = evaluateDynamicValue(baseProps[k], dataSlice);\n baseProps[k] = URL_ARGS.has(k) ? safeUrl(value) : value;\n }\n }\n return baseProps;\n};\n\n// Pure (no hooks) so it can be called unconditionally from either render path.\nexport function computeControlledOverrides(\n ctrlInput: ControlledFieldSpec,\n keyPath: string,\n storeValue: unknown,\n rawArgs: Record<string, unknown>,\n updateData: (path: string, value: unknown) => void,\n): Record<string, unknown> {\n if (rawArgs[ctrlInput.changeProp]) return {};\n return {\n [ctrlInput.changeProp]: (eventOrValue: unknown) =>\n updateData(keyPath, ctrlInput.extract(eventOrValue)),\n [ctrlInput.valueProp]: storeValue,\n };\n}\n\nconst ignoreUpdate = () => {};\n\n// `onClick` from a template: each action writes a value to a store path. Every `to`\n// reads the render-time slice, so later actions in one click see the pre-click state.\nfunction clickHandler(\n actions: ClickAction[],\n data: Record<string, unknown>,\n ctx: NodeCtx,\n updateData: (path: string, value: unknown) => void,\n) {\n return () => {\n for (const { set, to } of actions) {\n // A computed `each` row has no store path to write to, same as its controlled inputs.\n if (isValueScoped(set, ctx.valueScope)) continue;\n // Cloned so the store never aliases the template or a frozen snapshot.\n updateData(resolveScopedPath(set, ctx.scope), cloneData(evaluateDynamicValue(to, data)));\n }\n };\n}\n\n// Isolated so \"controlled or not\" is a conditional mount, not a conditional hook call within one component instance.\nexport function ControlledLeaf({\n node,\n dataSlice,\n elementKey,\n ElementType,\n ctrlInput,\n keyPath,\n storeValue,\n updateData,\n actionProps,\n children,\n}: {\n node: CompiledNode;\n dataSlice: Record<string, unknown>;\n elementKey: string;\n ElementType: React.ElementType;\n ctrlInput: ControlledFieldSpec;\n keyPath: string;\n storeValue: unknown;\n updateData: (path: string, value: unknown) => void;\n actionProps?: Record<string, unknown>;\n children?: React.ReactNode;\n}) {\n const overrides = computeControlledOverrides(\n ctrlInput,\n keyPath,\n storeValue,\n node.args,\n updateData,\n );\n const props = prepareState(node, dataSlice, elementKey, { ...actionProps, ...overrides });\n return children !== undefined\n ? createElement(ElementType, props, children)\n : createElement(ElementType, props);\n}\n\nexport function resolveCtrlInput(\n registry: BonsaiRegistry,\n type: string,\n tree: ConfigNode,\n): ControlledFieldSpec | undefined {\n if (!Object.hasOwn(registry.components, type)) return undefined;\n const entry = registry.components[type].controlled;\n if (!entry) return undefined;\n if (typeof entry === \"object\" && \"default\" in entry) {\n // `args.type` is the input's subtype (e.g. \"number\"), a string per the input schema.\n const subtype = (tree.args?.type as string | undefined) || \"default\";\n const byType = entry as Record<string, ControlledFieldSpec>;\n return (Object.hasOwn(byType, subtype) ? byType[subtype] : undefined) || byType.default;\n }\n return entry as ControlledFieldSpec;\n}\n\nexport interface BonsaiProps {\n /** Template to render. Compiled once per template identity. */\n template: Config;\n /**\n * Seed data for this instance. Read by reference: the store is (re)seeded\n * from it on mount and whenever a *different object* is passed. Mutating the\n * same object in place does nothing — pass a new object to force an update.\n */\n data?: Record<string, unknown>;\n /** Fired after every store-data change that came from inside the renderer (a user edit). */\n onDataChange?: (data: Record<string, unknown>) => void;\n /** When supplied, replaces the `captureUrl` fetch on submit. Throw to signal failure. */\n onSubmit?: (data: Record<string, unknown>) => void | Promise<void>;\n /** Receives anything `onSubmit`/the capture fetch throws. Without it, the error propagates. */\n onError?: (error: unknown) => void;\n /** Compatibility capture endpoint, used only when `onSubmit` is absent. */\n captureUrl?: string;\n expiry?: string;\n status?: \"pending\" | \"captured\" | \"completed\" | \"error\" | \"revoked\";\n /** Rendering mode, readable by leaves via `useBonsaiRenderMode`. `\"pdf\"` always renders a plain wrapper. */\n render?: RenderMode;\n /**\n * Registry to resolve component types against for this instance. Defaults to\n * the registry of the renderer it was created from (see `createBonsaiRenderer`).\n */\n registry?: BonsaiRegistry;\n /** Wrapper element. `\"div\"` lets instances embed inside a host form without nesting `<form>`s. */\n as?: \"form\" | \"div\";\n}\n\n/**\n * The wrapper element for an instance. `render: \"pdf\"` has always produced a\n * plain container, so it wins over `as`; otherwise `as` decides.\n */\nexport function resolveWrapper(\n render: BonsaiProps[\"render\"],\n as: BonsaiProps[\"as\"],\n): \"form\" | \"div\" {\n if (render === \"pdf\") return \"div\";\n return as === \"div\" ? \"div\" : \"form\";\n}\n\n/**\n * Deep-copies the plain objects/arrays in `value`, passing anything else\n * (Dates, class instances, functions, files) through by reference.\n *\n * Two reasons this is required rather than nice-to-have:\n * 1. valtio caches proxies by source object, so seeding two instances from the\n * same `data` object would hand both the *same* proxy — edits in one would\n * appear in the other.\n * 2. Writes through a valtio proxy reach the source object, so an uncloned seed\n * would let user edits mutate the caller's `data` prop.\n */\nexport function cloneData<T>(value: T): T {\n if (Array.isArray(value)) return value.map((item) => cloneData(item)) as T;\n if (value !== null && typeof value === \"object\") {\n const proto = Object.getPrototypeOf(value);\n if (proto === Object.prototype || proto === null) {\n const out: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n out[key] = cloneData(item);\n }\n return out as T;\n }\n }\n return value;\n}\n\n/**\n * What a node's bindings resolve against: the instance's store (`data` plus\n * top-level fields like `status`), or a bare data object, since lookups fall\n * back to it when there's no `data` key.\n */\nexport type GlobalData = { data?: Record<string, unknown>; [field: string]: unknown };\n\n// The one thing every `each` row hands its descendants, in whichever shape a\n// given mode threads through its tree — `scope` is the only thing both modes\n// share, since both resolve `each`-scoped alias paths against it.\nexport interface NodeCtx {\n scope?: Record<string, string>;\n /**\n * Alias -> row value, for rows of a computed `each` (e.g. `{{xs.filter(...)}}`),\n * which have no store path to resolve against. Only the client sets it; SSR\n * already prop-drills each row's value.\n */\n valueScope?: Record<string, unknown>;\n}\n\n/**\n * The seam between `RenderTreeServer` and `RenderTreeClient`: everything that\n * differs between prop-drilled SSR data and the client's per-node\n * `useSnapshot` subscription is captured here, verbatim from each original\n * implementation. `renderCompiledNode` below owns the control flow (isText /\n * isIf / isEach / element dispatch) that is identical in both; it never\n * merges the two lookup strategies a mode implements.\n */\nexport interface RenderStrategy<Ctx extends NodeCtx> {\n /** Builds the data slice a node evaluates its own bindings against. */\n dataSlice(node: CompiledNode, ctx: Ctx, globalData: GlobalData): Record<string, unknown>;\n /** Derives the child context an `each` row hands its descendants. */\n rowCtx(\n ctx: Ctx,\n globalData: GlobalData,\n item: unknown,\n i: number,\n each: CompiledEach,\n realItemsPath: string,\n ): Ctx;\n /** Renders one child node at `path`, keyed by the precomputed `key`. */\n renderChild(\n child: CompiledNode,\n i: number,\n path: string,\n ctx: Ctx,\n key: string,\n ): React.ReactNode;\n}\n\n/**\n * Hook-free control flow shared by `RenderTreeServer` and `RenderTreeClient`:\n * isText / isIf / isEach / ctrlInput-binding / image-guard / void-element /\n * error-boundary dispatch. Callers do their own hook work (registry,\n * snapshot, updateData) before calling in, then hand the mode-specific\n * lookup/recursion behaviour through `mode`.\n */\nexport function renderCompiledNode<Ctx extends NodeCtx>(\n node: CompiledNode,\n index: number,\n path: string,\n ctx: Ctx,\n globalData: GlobalData,\n registry: BonsaiRegistry,\n updateData: (path: string, value: unknown) => void,\n mode: RenderStrategy<Ctx>,\n): React.ReactNode {\n const tree = node.source;\n if (!tree) return null;\n\n const data = mode.dataSlice(node, ctx, globalData);\n\n // Same check as `node.isText`, written out so `tree` narrows to a component node below.\n if (typeof tree === \"string\") {\n return evaluateDynamicValue(tree, data) as React.ReactNode;\n }\n\n try {\n const type = node.type;\n\n if (node.isIf) {\n const conditionValue = evaluateDynamicValue(tree.args?.condition, data);\n if (!conditionValue) return null;\n return (\n <>\n {node.children.map((child, i) =>\n mode.renderChild(\n child,\n i,\n `${path}-${index}-if`,\n ctx,\n getKey(child, i, `${path}-${index}-if`),\n ),\n )}\n </>\n );\n }\n\n if (node.isEach) {\n const each = node.each!;\n const { as, keyExpr, rawItemsPath } = each;\n const itemsValue = evaluateDynamicValue(tree.args?.items, data);\n const items: unknown[] = Array.isArray(itemsValue) ? itemsValue : [];\n\n // Real store path the array lives at, so two-way binding in a row writes back to the right index;\n // only meaningful for a plain-path `items` binding — a computed/filtered array (or a path under a\n // computed row's alias) has no store path, so its rows render read-only.\n const realItemsPath =\n rawItemsPath && !isValueScoped(rawItemsPath, ctx.valueScope)\n ? resolveScopedPath(rawItemsPath, ctx.scope)\n : \"\";\n\n return (\n <>\n {items.map((item, i) => {\n const rowCtxValue = mode.rowCtx(ctx, globalData, item, i, each, realItemsPath);\n const rowKey = keyExpr\n ? evaluateDynamicValue(keyExpr, { ...data, [as]: item })\n : i;\n // Keyed on rowKey, not the volatile index `i`, so descendants' keys stay stable across reorders too.\n const rowPath = `${path}-${index}-each-${rowKey}`;\n\n return (\n <Fragment key={String(rowKey)}>\n {node.children.map((child, ci) =>\n mode.renderChild(\n child,\n ci,\n rowPath,\n rowCtxValue,\n getKey(child, ci, rowPath),\n ),\n )}\n </Fragment>\n );\n })}\n </>\n );\n }\n\n const ElementType = resolveElementType(registry, type);\n const key = getKey(node, index, path);\n const ctrlInput = resolveCtrlInput(registry, type, tree);\n\n let binding:\n | { keyPath: string; storeValue: unknown; readOnly?: boolean }\n | undefined;\n if (ctrlInput) {\n // The unresolved binding path was extracted at compile time; resolving it\n // against this row's scope stays here.\n const rawKeyPath = node.argPaths[ctrlInput.valueProp];\n if (rawKeyPath !== undefined && isValueScoped(rawKeyPath, ctx.valueScope)) {\n // Bound to a computed `each` row: show the value, but there's no store path to write edits to.\n binding = {\n keyPath: rawKeyPath,\n storeValue: getValue(ctx.valueScope, rawKeyPath),\n readOnly: true,\n };\n } else if (rawKeyPath !== undefined) {\n const keyPath = resolveScopedPath(rawKeyPath, ctx.scope);\n binding = {\n keyPath,\n storeValue: getValue(globalData.data ?? globalData, keyPath),\n };\n } else if (node.dynamicArgs.has(ctrlInput.valueProp)) {\n // A formula (`{{a + b}}`) has no store path: show its result, ignore edits.\n binding = {\n keyPath: \"\",\n storeValue: evaluateDynamicValue(tree.args?.[ctrlInput.valueProp], data),\n readOnly: true,\n };\n }\n }\n\n if (node.isImage) {\n // Same checked value `prepareState` renders, so SSR and the client's static path agree.\n const src = safeUrl(evaluateDynamicValue(node.args.src, data));\n if (src === \"\" || src == null) return null;\n }\n\n // A registry entry that lists capabilities must include \"events\" to get a handler;\n // either way the raw action list is replaced, so it never reaches the component.\n let actionProps: Record<string, unknown> | undefined;\n if (node.actions) {\n const caps = Object.hasOwn(registry.components, type)\n ? registry.components[type].capabilities\n : undefined;\n actionProps = {\n onClick: !caps || caps.includes(\"events\")\n ? clickHandler(node.actions, data, ctx, updateData)\n : undefined,\n };\n }\n\n const childNodes =\n node.children.length > 0\n ? node.children.map((branch: CompiledNode, i: number) =>\n mode.renderChild(\n branch,\n i,\n `${path}-${index}`,\n ctx,\n getKey(node, i, `${path}-${index}`),\n ),\n )\n : undefined;\n\n const safeChildNodes =\n typeof ElementType === \"string\" && VOID_ELEMENTS.has(ElementType)\n ? undefined\n : childNodes;\n\n if (binding && ctrlInput) {\n return (\n <ControlledLeaf\n node={node}\n dataSlice={data}\n elementKey={key}\n ElementType={ElementType}\n ctrlInput={ctrlInput}\n keyPath={binding.keyPath}\n storeValue={binding.storeValue}\n updateData={binding.readOnly ? ignoreUpdate : updateData}\n actionProps={actionProps}\n >\n {safeChildNodes}\n </ControlledLeaf>\n );\n }\n\n const props = prepareState(node, data, key, actionProps);\n if (safeChildNodes !== undefined) {\n return createElement(ElementType, props, safeChildNodes);\n }\n return createElement(ElementType, props);\n } catch (error) {\n console.error(`Error at ${path}-${index}:`, error);\n return null;\n }\n}\n"],"names":["BLOCKED_ARGS","URL_ARGS","SAFE_URL","safeUrl","value","PATH_SEGMENTS_RE","splitPathSegments","path","unwrapSegment","seg","compileKey","key","segments","numericNext","_","i","next","compileNode","source","isText","node","expressions","args","dynamicArgs","argPaths","keys","text","actions","compileExpression","v","name","compiled","staticPath","onClick","a","rawType","type","isEach","COMPONENT","isIf","eachArgs","each","dynamicKeys","templateCache","stringTemplateCache","LRUCache","compileTemplate","template","hit","defineComponent","def","defineBonsaiRegistry","registry","A","React","props","ref","jsx","hVariants","cva","H","className","variant","as","cn","pVariants","P","size","Comp","accordionVariants","Accordion","raised","extrude","AccordionPrimitive","AccordionItem","AccordionTrigger","children","Icon","IconChevronDown","trigger","useHaptics","jsxs","event","HAPTIC_ACCORDION","AccordionContent","alertVariants","Alert","avatarVariants","Avatar","rounded","src","alt","fallback","badge","AvatarPrimitive","Fragment","badgeVariants","Badge","render","useRender","mergeProps","cardVariants","Card","CardHeader","CardTitle","CardDescription","CardAction","CardIcon","CardContent","CardFooter","checkboxVariants","Checkbox","onCheckedChange","CheckboxPrimitive","checked","HAPTIC_CHECKBOX","IconCheck","Collapsible","CollapsiblePrimitive","CollapsibleTrigger","CollapsibleContent","Input","InputPrimitive","InputOTP","containerClassName","OTPInput","Textarea","onInput","autosize","e","textarea","InputGroup","inputGroupAddonVariants","InputGroupAddon","align","inputGroupButtonVariants","InputGroupButton","Button","InputGroupText","InputGroupInput","InputGroupTextarea","labelVariants","Label","htmlFor","progressVariants","Progress","stacked","rest","indicators","b","ProgressPrimitive","ProgressTrack","item","ProgressIndicatorGroup","ProgressIndicator","index","separatorVariants","Separator","orientation","stroke","SeparatorPrimitive","skeletonVariants","Skeleton","animate","switchVariants","Switch","SwitchPrimitive","HAPTIC_SWITCH","tableVariants","Table","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","FORM_FIELD_CAPABILITIES","DEFAULT_CAPABILITIES","toControlledFieldSpec","entry","toControlled","subtype","spec","extendRegistry","base","components","controlledInputs","merged","prev","component","controlled","coreComponents","Loader","coreControlledInputs","coreRegistry","BonsaiRegistryContext","createContext","useBonsaiRegistry","useContext","BonsaiRenderModeContext","useBonsaiRenderMode","BonsaiRoot","inherited","VOID_ELEMENTS","getKey","leaf","getValue","data","acc","setValue","obj","current","pathRoot","rootMatch","isValueScoped","valueScope","resolveScopedPath","scope","root","prefix","evaluateDynamicValue","parseExpression","buildDataSlice","resolveValue","resolveElementType","prepareState","dataSlice","extra","baseProps","k","computeControlledOverrides","ctrlInput","keyPath","storeValue","rawArgs","updateData","eventOrValue","ignoreUpdate","clickHandler","ctx","set","to","cloneData","ControlledLeaf","elementKey","ElementType","actionProps","overrides","createElement","resolveCtrlInput","tree","byType","resolveWrapper","proto","out","renderCompiledNode","globalData","mode","child","keyExpr","rawItemsPath","itemsValue","items","realItemsPath","rowCtxValue","rowKey","rowPath","ci","binding","rawKeyPath","caps","childNodes","branch","safeChildNodes","error"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { Config } from './types.js';
2
+ /** The contents of `@pebble-software/bonsai/classes.json`. */
3
+ export interface ClassManifest {
4
+ version: 1;
5
+ /**
6
+ * sha256 of everything bonsai contributes to a compiled stylesheet: the
7
+ * candidates below and the stylesheets the package publishes
8
+ * (`index.css`, `styles/*`). Put it in the cache key of any stylesheet you
9
+ * store and an upgrade that changes either one misses that cache.
10
+ */
11
+ hash: string;
12
+ /** Candidates the renderer emits around every template, whatever it contains. */
13
+ renderer: string[];
14
+ /**
15
+ * Registry type -> the source files (keys of `files`) it renders with,
16
+ * including the files those import. Native tags (`div`, `img`, ...) map to `[]`.
17
+ */
18
+ types: Record<string, string[]>;
19
+ /**
20
+ * Source file -> every candidate Tailwind's scanner finds in it. Deliberately
21
+ * unfiltered: the compiler ignores candidates that don't parse, so the junk
22
+ * costs nothing, while a missing candidate is a silently unstyled element.
23
+ */
24
+ files: Record<string, string[]>;
25
+ }
26
+ /** What `classesFor` finds a set of templates needs. */
27
+ export interface TemplateClasses {
28
+ /**
29
+ * Every candidate the templates can render: the renderer's own, every
30
+ * variant and state of each component type in the trees, and every class
31
+ * the templates write themselves in a class prop (`className`,
32
+ * `containerClassName`, ...).
33
+ */
34
+ classes: string[];
35
+ /**
36
+ * Types in the trees the manifest has no entry for, such as components a
37
+ * custom registry adds. Whatever classes they emit are missing from `classes`.
38
+ */
39
+ unknownTypes: string[];
40
+ }
41
+ /** One template as `classesFor` reads it; a missing header or footer can be passed as is. */
42
+ export type Template = Config | null | undefined;
43
+ /**
44
+ * Every candidate rendering `templates` can emit, whichever `if` branch,
45
+ * status, render mode or data state ends up rendered.
46
+ *
47
+ * A stylesheet compiled from `classes` is complete when `unknownTypes` is
48
+ * empty and the templates pass `validateTemplate`, which rejects class props
49
+ * whose classes would only exist once data arrives (`{{ 'bg-' + color }}`).
50
+ */
51
+ export declare function classesFor(manifest: ClassManifest, templates: Template | readonly Template[]): TemplateClasses;
@@ -0,0 +1,27 @@
1
+ import { STRUCTURAL_COMPONENTS as p } from "./constants.js";
2
+ import { i as u, a as w } from "./chunks/class-names-CoKRVvWM.js";
3
+ function O(o, r) {
4
+ const n = new Set(o.renderer), f = /* @__PURE__ */ new Set(), c = /* @__PURE__ */ new Set(), i = (e) => {
5
+ if (e == null || typeof e != "object") return;
6
+ const { type: s, args: t, children: l } = e;
7
+ if (typeof s == "string")
8
+ if (Object.hasOwn(o.types, s))
9
+ for (const a of o.types[s]) f.add(a);
10
+ else p.has(s) || c.add(s);
11
+ if (t != null && typeof t == "object") {
12
+ for (const [a, y] of Object.entries(t))
13
+ if (u(a))
14
+ for (const d of w(y).classes)
15
+ n.add(d);
16
+ }
17
+ Array.isArray(l) && l.forEach(i);
18
+ };
19
+ (Array.isArray(r) ? r : [r]).forEach(i);
20
+ for (const e of f)
21
+ for (const s of o.files[e] ?? []) n.add(s);
22
+ return { classes: [...n], unknownTypes: [...c] };
23
+ }
24
+ export {
25
+ O as classesFor
26
+ };
27
+ //# sourceMappingURL=classes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classes.js","sources":["../src/classes.ts"],"sourcesContent":["// Class manifest entrypoint (`@pebble-software/bonsai/classes`): the shape of\n// `@pebble-software/bonsai/classes.json` and the lookup over it.\n//\n// The manifest is for consumers that compile a minimal Tailwind stylesheet per\n// template themselves. Instead of rendering a template in every status, mode\n// and data state to find the utilities it emits, they hand the template to\n// `classesFor`. `scripts/class-manifest.ts` builds it.\n\nimport { STRUCTURAL_COMPONENTS } from \"@bonsai/constants\";\nimport { analyzeClassName, isClassNameProp } from \"./lib/ast/class-names\";\nimport type { Config, ConfigNode } from \"./types\";\n\n/** The contents of `@pebble-software/bonsai/classes.json`. */\nexport interface ClassManifest {\n version: 1;\n /**\n * sha256 of everything bonsai contributes to a compiled stylesheet: the\n * candidates below and the stylesheets the package publishes\n * (`index.css`, `styles/*`). Put it in the cache key of any stylesheet you\n * store and an upgrade that changes either one misses that cache.\n */\n hash: string;\n /** Candidates the renderer emits around every template, whatever it contains. */\n renderer: string[];\n /**\n * Registry type -> the source files (keys of `files`) it renders with,\n * including the files those import. Native tags (`div`, `img`, ...) map to `[]`.\n */\n types: Record<string, string[]>;\n /**\n * Source file -> every candidate Tailwind's scanner finds in it. Deliberately\n * unfiltered: the compiler ignores candidates that don't parse, so the junk\n * costs nothing, while a missing candidate is a silently unstyled element.\n */\n files: Record<string, string[]>;\n}\n\n/** What `classesFor` finds a set of templates needs. */\nexport interface TemplateClasses {\n /**\n * Every candidate the templates can render: the renderer's own, every\n * variant and state of each component type in the trees, and every class\n * the templates write themselves in a class prop (`className`,\n * `containerClassName`, ...).\n */\n classes: string[];\n /**\n * Types in the trees the manifest has no entry for, such as components a\n * custom registry adds. Whatever classes they emit are missing from `classes`.\n */\n unknownTypes: string[];\n}\n\n/** One template as `classesFor` reads it; a missing header or footer can be passed as is. */\nexport type Template = Config | null | undefined;\n\n/**\n * Every candidate rendering `templates` can emit, whichever `if` branch,\n * status, render mode or data state ends up rendered.\n *\n * A stylesheet compiled from `classes` is complete when `unknownTypes` is\n * empty and the templates pass `validateTemplate`, which rejects class props\n * whose classes would only exist once data arrives (`{{ 'bg-' + color }}`).\n */\nexport function classesFor(\n manifest: ClassManifest,\n templates: Template | readonly Template[],\n): TemplateClasses {\n const classes = new Set(manifest.renderer);\n const files = new Set<string>();\n const unknownTypes = new Set<string>();\n\n const visit = (node: unknown) => {\n // Template JSON is often stored or sent unvalidated, so anything that isn't\n // a component node (a text child, a malformed entry) is skipped, not trusted.\n if (node == null || typeof node !== \"object\") return;\n const { type, args, children } = node as Partial<ConfigNode>;\n\n if (typeof type === \"string\") {\n // `hasOwn`, since a node typed `constructor` must not match a prototype key.\n if (Object.hasOwn(manifest.types, type)) {\n for (const file of manifest.types[type]) files.add(file);\n } else if (!STRUCTURAL_COMPONENTS.has(type)) {\n unknownTypes.add(type);\n }\n }\n\n if (args != null && typeof args === \"object\") {\n for (const [name, value] of Object.entries(args)) {\n if (!isClassNameProp(name)) continue;\n for (const candidate of analyzeClassName(value).classes) {\n classes.add(candidate);\n }\n }\n }\n\n if (Array.isArray(children)) children.forEach(visit);\n };\n (Array.isArray(templates) ? templates : [templates]).forEach(visit);\n\n for (const file of files) {\n for (const candidate of manifest.files[file] ?? []) classes.add(candidate);\n }\n return { classes: [...classes], unknownTypes: [...unknownTypes] };\n}\n"],"names":["classesFor","manifest","templates","classes","files","unknownTypes","visit","node","type","args","children","file","STRUCTURAL_COMPONENTS","name","value","isClassNameProp","candidate","analyzeClassName"],"mappings":";;AAgEO,SAASA,EACdC,GACAC,GACiB;AACjB,QAAMC,IAAU,IAAI,IAAIF,EAAS,QAAQ,GACnCG,wBAAY,IAAA,GACZC,wBAAmB,IAAA,GAEnBC,IAAQ,CAACC,MAAkB;AAG/B,QAAIA,KAAQ,QAAQ,OAAOA,KAAS,SAAU;AAC9C,UAAM,EAAE,MAAAC,GAAM,MAAAC,GAAM,UAAAC,EAAA,IAAaH;AAEjC,QAAI,OAAOC,KAAS;AAElB,UAAI,OAAO,OAAOP,EAAS,OAAOO,CAAI;AACpC,mBAAWG,KAAQV,EAAS,MAAMO,CAAI,EAAG,CAAAJ,EAAM,IAAIO,CAAI;AAAA,UACzD,CAAYC,EAAsB,IAAIJ,CAAI,KACxCH,EAAa,IAAIG,CAAI;AAIzB,QAAIC,KAAQ,QAAQ,OAAOA,KAAS;AAClC,iBAAW,CAACI,GAAMC,CAAK,KAAK,OAAO,QAAQL,CAAI;AAC7C,YAAKM,EAAgBF,CAAI;AACzB,qBAAWG,KAAaC,EAAiBH,CAAK,EAAE;AAC9C,YAAAX,EAAQ,IAAIa,CAAS;AAAA;AAK3B,IAAI,MAAM,QAAQN,CAAQ,KAAGA,EAAS,QAAQJ,CAAK;AAAA,EACrD;AACA,GAAC,MAAM,QAAQJ,CAAS,IAAIA,IAAY,CAACA,CAAS,GAAG,QAAQI,CAAK;AAElE,aAAWK,KAAQP;AACjB,eAAWY,KAAaf,EAAS,MAAMU,CAAI,KAAK,GAAI,CAAAR,EAAQ,IAAIa,CAAS;AAE3E,SAAO,EAAE,SAAS,CAAC,GAAGb,CAAO,GAAG,cAAc,CAAC,GAAGE,CAAY,EAAA;AAChE;"}