semajsx 0.1.1 → 0.1.2

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 (103) hide show
  1. package/dist/{computed-BpjqvQu1.mjs → computed-BidG06Lt.mjs} +2 -2
  2. package/dist/{computed-BpjqvQu1.mjs.map → computed-BidG06Lt.mjs.map} +1 -1
  3. package/dist/{document-OGuk9jhK.mjs → document-BOJDaiBc.mjs} +19 -4
  4. package/dist/document-BOJDaiBc.mjs.map +1 -0
  5. package/dist/{document-DFsOtfef.mjs → document-CwHVG_PJ.mjs} +2 -2
  6. package/dist/dom/index.d.mts +68 -3
  7. package/dist/dom/index.d.mts.map +1 -1
  8. package/dist/dom/index.mjs +4 -4
  9. package/dist/dom/jsx-dev-runtime.d.mts +4 -4
  10. package/dist/dom/jsx-dev-runtime.mjs +1 -1
  11. package/dist/dom/jsx-runtime.d.mts +4 -4
  12. package/dist/dom/jsx-runtime.mjs +2 -2
  13. package/dist/{helpers-DrifjCXb.d.mts → helpers-CfRDJgcP.d.mts} +3 -3
  14. package/dist/{helpers-DrifjCXb.d.mts.map → helpers-CfRDJgcP.d.mts.map} +1 -1
  15. package/dist/{index-DS5X3Pvb.d.mts → index-B1pjI-Su.d.mts} +2 -2
  16. package/dist/{index-DS5X3Pvb.d.mts.map → index-B1pjI-Su.d.mts.map} +1 -1
  17. package/dist/index-DC3tthWf.d.mts +81 -0
  18. package/dist/index-DC3tthWf.d.mts.map +1 -0
  19. package/dist/index.d.mts +7 -7
  20. package/dist/index.mjs +5 -5
  21. package/dist/{island-marker-hZdmHMvx.d.mts → island-marker-BJIO07Vj.d.mts} +1 -1
  22. package/dist/island-marker-BJIO07Vj.d.mts.map +1 -0
  23. package/dist/{jsx-CGW4OyqA.d.mts → jsx-fNlLjLou.d.mts} +2 -2
  24. package/dist/{jsx-CGW4OyqA.d.mts.map → jsx-fNlLjLou.d.mts.map} +1 -1
  25. package/dist/{jsx-runtime-DU8DRISG.d.mts → jsx-runtime-BFuFPDzn.d.mts} +3 -3
  26. package/dist/{jsx-runtime-DU8DRISG.d.mts.map → jsx-runtime-BFuFPDzn.d.mts.map} +1 -1
  27. package/dist/jsx-runtime-D9ZNjMJ2.mjs.map +1 -1
  28. package/dist/{jsx-runtime-mBpL8czJ.d.mts → jsx-runtime-DZx2Yv-t.d.mts} +28 -6
  29. package/dist/{jsx-runtime-mBpL8czJ.d.mts.map → jsx-runtime-DZx2Yv-t.d.mts.map} +1 -1
  30. package/dist/lucide-CVtHepGM.mjs +126 -0
  31. package/dist/lucide-CVtHepGM.mjs.map +1 -0
  32. package/dist/{resource-B1IudM8_.d.mts → resource-BQI6AeJ0.d.mts} +23 -3
  33. package/dist/resource-BQI6AeJ0.d.mts.map +1 -0
  34. package/dist/{resource-BjsDAkbG.mjs → resource-DSlXDZZi.mjs} +2 -2
  35. package/dist/{resource-BjsDAkbG.mjs.map → resource-DSlXDZZi.mjs.map} +1 -1
  36. package/dist/signal/index.d.mts +2 -2
  37. package/dist/signal/index.mjs +3 -3
  38. package/dist/{signal-4PgGfydw.mjs → signal-BN8vHXDb.mjs} +1 -1
  39. package/dist/{signal-4PgGfydw.mjs.map → signal-BN8vHXDb.mjs.map} +1 -1
  40. package/dist/{signal-CLsaPA7c.d.mts → signal-BwxUlXKs.d.mts} +1 -1
  41. package/dist/{signal-CLsaPA7c.d.mts.map → signal-BwxUlXKs.d.mts.map} +1 -1
  42. package/dist/{src-CRi0xsNK.mjs → src-BqX3sryB.mjs} +68 -5
  43. package/dist/src-BqX3sryB.mjs.map +1 -0
  44. package/dist/src-DR-EWgVP.mjs +868 -0
  45. package/dist/src-DR-EWgVP.mjs.map +1 -0
  46. package/dist/{src-DEoBG1zB.mjs → src-DUpFNNM_.mjs} +4 -4
  47. package/dist/{src-DEoBG1zB.mjs.map → src-DUpFNNM_.mjs.map} +1 -1
  48. package/dist/{src-BlS3Hc-L.mjs → src-DW3tIczg.mjs} +75 -5
  49. package/dist/src-DW3tIczg.mjs.map +1 -0
  50. package/dist/{src-Jbt_w0hc.mjs → src-Ds9vl42d.mjs} +37 -35
  51. package/dist/src-Ds9vl42d.mjs.map +1 -0
  52. package/dist/{src-iC-NFwTy.mjs → src-DuSN6go_.mjs} +79 -22
  53. package/dist/src-DuSN6go_.mjs.map +1 -0
  54. package/dist/ssg/index.d.mts +4 -182
  55. package/dist/ssg/index.d.mts.map +1 -1
  56. package/dist/ssg/index.mjs +7 -756
  57. package/dist/ssg/index.mjs.map +1 -1
  58. package/dist/ssg/plugins/docs-theme.d.mts +180 -0
  59. package/dist/ssg/plugins/docs-theme.d.mts.map +1 -0
  60. package/dist/ssg/plugins/docs-theme.mjs +2042 -0
  61. package/dist/ssg/plugins/docs-theme.mjs.map +1 -0
  62. package/dist/ssg/plugins/lucide.d.mts +3 -0
  63. package/dist/ssg/plugins/lucide.mjs +7 -0
  64. package/dist/ssr/client.d.mts +3 -3
  65. package/dist/ssr/client.mjs +5 -5
  66. package/dist/ssr/index.d.mts +3 -3
  67. package/dist/ssr/index.d.mts.map +1 -1
  68. package/dist/ssr/index.mjs +6 -5
  69. package/dist/style/index.d.mts +2 -2
  70. package/dist/style/index.d.mts.map +1 -1
  71. package/dist/style/index.mjs +1 -1
  72. package/dist/style/react.d.mts +2 -2
  73. package/dist/style/react.mjs +2 -2
  74. package/dist/style/vue.d.mts +2 -2
  75. package/dist/style/vue.mjs +2 -2
  76. package/dist/terminal/index.d.mts +4 -4
  77. package/dist/terminal/index.mjs +2 -2
  78. package/dist/terminal/jsx-dev-runtime.d.mts +4 -4
  79. package/dist/terminal/jsx-dev-runtime.mjs +1 -1
  80. package/dist/terminal/jsx-runtime.d.mts +4 -4
  81. package/dist/terminal/jsx-runtime.mjs +1 -1
  82. package/dist/{types-DlNR9ZaJ.d.mts → types-BlaUrkq0.d.mts} +2 -2
  83. package/dist/{types-DlNR9ZaJ.d.mts.map → types-BlaUrkq0.d.mts.map} +1 -1
  84. package/dist/types-CGkRxnQB.d.mts +220 -0
  85. package/dist/types-CGkRxnQB.d.mts.map +1 -0
  86. package/dist/{types-Dgj6n-EE.d.mts → types-CZMcXQTW.d.mts} +9 -4
  87. package/dist/types-CZMcXQTW.d.mts.map +1 -0
  88. package/dist/{types-Bjx1Pp14.d.mts → types-D0jRO840.d.mts} +1 -1
  89. package/dist/{types-Bjx1Pp14.d.mts.map → types-D0jRO840.d.mts.map} +1 -1
  90. package/dist/{types-DEi0apQO.d.mts → types-DucvOZQ2.d.mts} +2 -2
  91. package/dist/{types-DEi0apQO.d.mts.map → types-DucvOZQ2.d.mts.map} +1 -1
  92. package/dist/{utils-BrGmTgfG.mjs → utils-DbTAs943.mjs} +1 -1
  93. package/dist/{utils-BrGmTgfG.mjs.map → utils-DbTAs943.mjs.map} +1 -1
  94. package/package.json +30 -2
  95. package/dist/document-OGuk9jhK.mjs.map +0 -1
  96. package/dist/island-marker-hZdmHMvx.d.mts.map +0 -1
  97. package/dist/jsx-runtime-D2B2BK8X.mjs +0 -4
  98. package/dist/resource-B1IudM8_.d.mts.map +0 -1
  99. package/dist/src-BlS3Hc-L.mjs.map +0 -1
  100. package/dist/src-CRi0xsNK.mjs.map +0 -1
  101. package/dist/src-Jbt_w0hc.mjs.map +0 -1
  102. package/dist/src-iC-NFwTy.mjs.map +0 -1
  103. package/dist/types-Dgj6n-EE.d.mts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"src-Jbt_w0hc.mjs","names":["STYLE_TOKEN_BRAND","STYLE_TOKEN_BRAND","STYLE_TOKEN_BRAND"],"sources":["../../style/src/hash.ts","../../style/src/classes.ts","../../style/src/rule.ts","../../style/src/inject.ts","../../style/src/registry.ts","../../style/src/theme.ts","../../style/src/keyframes.ts","../../style/src/animate.ts","../../style/src/responsive.ts"],"sourcesContent":["/**\n * Hash utilities for generating unique class names\n *\n * Uses a simple but effective hash algorithm that produces short,\n * deterministic strings suitable for class names.\n */\n\n/**\n * Generate a short hash from a string\n *\n * Uses djb2 algorithm for fast, deterministic hashing\n */\nexport function hashString(str: string): string {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash) ^ str.charCodeAt(i);\n }\n // Convert to base36 for compact representation, take last 5 chars\n return Math.abs(hash).toString(36).slice(-5);\n}\n\n/**\n * Generate a unique ID using a counter + random suffix\n *\n * Used for runtime-generated class names where determinism isn't required\n */\nlet counter = 0;\nexport function uniqueId(): string {\n return (++counter).toString(36) + Math.random().toString(36).slice(2, 5);\n}\n","/**\n * Class name generation for @semajsx/style\n */\n\nimport { hashString } from \"./hash\";\nimport type { ClassRef, ClassRefs } from \"./types\";\n\n/**\n * Symbol used to identify ClassRef objects\n */\nconst CLASS_REF_BRAND = Symbol.for(\"@semajsx/style/classRef\");\n\n/**\n * Create class name references with hashed values\n *\n * @example\n * ```ts\n * const c = classes([\"root\", \"icon\", \"label\"]);\n *\n * c.root.toString(); // \"root-x7f3a\"\n * `${c.root}`; // \"root-x7f3a\"\n * ```\n */\nexport function classes<T extends readonly string[]>(names: T): ClassRefs<T> {\n const result = {} as Record<string, ClassRef>;\n\n for (const name of names) {\n const hash = hashString(name + Date.now().toString(36));\n const className = `${name}-${hash}`;\n\n const ref: ClassRef = {\n id: Symbol(className),\n toString() {\n return className;\n },\n };\n\n // Add brand for type checking\n Object.defineProperty(ref, CLASS_REF_BRAND, { value: true });\n\n result[name] = ref;\n }\n\n return result as ClassRefs<T>;\n}\n\n/**\n * Check if a value is a ClassRef\n */\nexport function isClassRef(value: unknown): value is ClassRef {\n return (\n value != null &&\n typeof value === \"object\" &&\n CLASS_REF_BRAND in value &&\n (value as Record<symbol, unknown>)[CLASS_REF_BRAND] === true\n );\n}\n","/**\n * Rule creation for @semajsx/style\n *\n * The rule() function is a tagged template that creates StyleToken objects\n * from CSS selector + block syntax.\n */\n\nimport { isSignal } from \"@semajsx/signal\";\nimport type { ReadableSignal } from \"@semajsx/signal\";\nimport { isClassRef } from \"./classes\";\nimport type { ClassRef, SignalBindingDef, StyleToken } from \"./types\";\n\n/**\n * Symbol used to identify StyleToken objects\n */\nconst STYLE_TOKEN_BRAND = Symbol.for(\"@semajsx/style/token\");\n\n/**\n * Extract the class name from a CSS rule if it starts with a simple class selector\n *\n * @example\n * \".root-x7f3a { padding: 8px; }\" -> \"root-x7f3a\"\n * \".root-x7f3a:hover { ... }\" -> undefined (pseudo-class)\n * \".root-x7f3a > .icon { ... }\" -> undefined (combinator)\n */\nfunction extractClassName(css: string): string | undefined {\n // Match simple class selector at the start: .className { ... }\n const match = css.match(/^\\s*\\.([a-zA-Z0-9_-]+)\\s*\\{/);\n return match ? match[1] : undefined;\n}\n\n/**\n * Create a StyleToken from a tagged template containing selector + CSS block\n *\n * @example\n * ```ts\n * const c = classes([\"root\", \"icon\"]);\n *\n * // Simple class selector\n * const root = rule`${c.root} { padding: 8px 16px; }`;\n *\n * // Pseudo-class selector\n * const rootHover = rule`${c.root}:hover { background: blue; }`;\n *\n * // Descendant combinator\n * const rootIcon = rule`${c.root} > ${c.icon} { margin-right: 8px; }`;\n *\n * // With signal interpolation\n * const height = signal(100);\n * const box = rule`${c.box} { height: ${height}px; }`;\n * ```\n */\nexport function rule(\n strings: TemplateStringsArray,\n ...values: (ClassRef | ReadableSignal<unknown> | string | number | { toString(): string })[]\n): StyleToken {\n const bindingDefs: SignalBindingDef[] = [];\n\n // Build CSS template with placeholders for signals\n // strings[0] is always defined for template literals\n let cssTemplate = strings[0] ?? \"\";\n\n for (let i = 0; i < values.length; i++) {\n const value = values[i];\n const nextString = strings[i + 1] ?? \"\";\n\n if (isClassRef(value)) {\n // ClassRef: interpolate the hashed class name with dot prefix\n cssTemplate += \".\" + value.toString() + nextString;\n } else if (isSignal(value)) {\n // Signal: use placeholder {{index}}, variable name assigned by anchor later\n // No unit extraction - signal value should include unit if needed (e.g., \"100px\")\n const index = bindingDefs.length;\n bindingDefs.push({ signal: value, index });\n cssTemplate += `{{${index}}}` + nextString;\n } else {\n // Static value: interpolate directly\n cssTemplate += String(value) + nextString;\n }\n }\n\n const className = extractClassName(cssTemplate);\n\n const token: StyleToken = {\n __kind: \"style\",\n _: className,\n __cssTemplate: cssTemplate,\n __bindingDefs: bindingDefs.length > 0 ? bindingDefs : undefined,\n toString() {\n return this._ ?? \"\";\n },\n };\n\n // Add brand for type checking\n Object.defineProperty(token, STYLE_TOKEN_BRAND, { value: true });\n\n return token;\n}\n\n/**\n * Combine multiple StyleTokens into a single token for grouped injection\n *\n * @example\n * ```ts\n * const buttonStates = rules(\n * rule`${c.root}:hover { background: blue; }`,\n * rule`${c.root}:active { transform: scale(0.98); }`,\n * rule`${c.root}:disabled { opacity: 0.5; }`,\n * );\n * ```\n *\n * Note: The combined token has no className (_: undefined) since it may\n * contain multiple selectors. Use it for injection only, not as a className.\n */\nexport function rules(...tokens: StyleToken[]): StyleToken {\n const allBindingDefs: SignalBindingDef[] = [];\n\n // Build combined CSS with adjusted placeholder indices\n const combinedCSS = tokens\n .map((t, tokenIndex) => {\n let css = t.__cssTemplate;\n const bindings = t.__bindingDefs ?? [];\n\n // Adjust indices in both the CSS template and binding definitions\n for (const def of bindings) {\n const newIndex = def.index + tokenIndex * 100;\n // Replace placeholder with adjusted index\n css = css.replaceAll(`{{${def.index}}}`, `{{${newIndex}}}`);\n allBindingDefs.push({ ...def, index: newIndex });\n }\n\n return css;\n })\n .join(\"\\n\");\n\n const token: StyleToken = {\n __kind: \"style\",\n _: undefined, // Combined rules have no single class name\n __cssTemplate: combinedCSS,\n __bindingDefs: allBindingDefs.length > 0 ? allBindingDefs : undefined,\n toString() {\n return \"\";\n },\n };\n\n // Add brand for type checking\n Object.defineProperty(token, STYLE_TOKEN_BRAND, { value: true });\n\n return token;\n}\n\n/**\n * Check if a value is a StyleToken\n */\nexport function isStyleToken(value: unknown): value is StyleToken {\n return (\n value != null &&\n typeof value === \"object\" &&\n \"__kind\" in value &&\n (value as StyleToken).__kind === \"style\"\n );\n}\n","/**\n * CSS injection utilities for @semajsx/style\n */\n\nimport { isStyleToken } from \"./rule\";\nimport type { InjectOptions, StyleToken } from \"./types\";\n\n/**\n * Track injected styles per target to prevent duplicates\n */\nconst injectedStyles = new WeakMap<Element | ShadowRoot | Document, Set<string>>();\n\n/**\n * Get or create the set of injected class names for a target\n */\nfunction getInjectedSet(target: Element | ShadowRoot | Document): Set<string> {\n let set = injectedStyles.get(target);\n if (!set) {\n set = new Set();\n injectedStyles.set(target, set);\n }\n return set;\n}\n\n/**\n * Inject CSS into a target element\n *\n * @param css - The CSS string to inject\n * @param target - The target element (defaults to document.head)\n * @returns The created style element\n */\nexport function injectStyles(css: string, target?: Element | ShadowRoot): HTMLStyleElement {\n const styleElement = document.createElement(\"style\");\n styleElement.textContent = css;\n\n const actualTarget = target ?? document.head;\n actualTarget.appendChild(styleElement);\n\n return styleElement;\n}\n\n/**\n * Inject a StyleToken into the DOM\n *\n * Handles deduplication - if the same className has been injected to the\n * same target, it won't be injected again.\n *\n * Note: This function only handles CSS injection. Signal bindings must be\n * set up separately by StyleAnchor or similar.\n *\n * @param token - StyleToken to inject\n * @param options - Injection options (target)\n */\nfunction injectToken(token: StyleToken, target: Element | ShadowRoot | Document): void {\n const injected = getInjectedSet(target);\n\n // Deduplicate by className if available, otherwise by CSS content hash\n const key = token._ ?? token.__cssTemplate;\n\n if (!injected.has(key)) {\n // Replace signal placeholders with var() references for static injection\n let css = token.__cssTemplate;\n if (token.__bindingDefs) {\n for (const def of token.__bindingDefs) {\n // Use a default variable name for static injection\n css = css.replaceAll(`{{${def.index}}}`, `var(--style-${def.index})`);\n }\n }\n\n injectStyles(css, target === document ? document.head : (target as Element | ShadowRoot));\n injected.add(key);\n }\n}\n\n/**\n * Manually inject CSS into the DOM\n *\n * Supports single token, array of tokens, or object containing tokens.\n * Returns a cleanup function to remove the injected styles.\n *\n * @example\n * ```ts\n * // Single token\n * inject(button.root);\n *\n * // Array of tokens\n * inject([button.root, button.icon, button.rootIcon]);\n *\n * // Object - extracts all StyleTokens\n * inject(button);\n *\n * // With target\n * inject(button, { target: shadowRoot });\n *\n * // Cleanup\n * const cleanup = inject(button);\n * cleanup();\n * ```\n */\nexport function inject(\n tokens: StyleToken | StyleToken[] | Record<string, StyleToken>,\n options?: InjectOptions,\n): () => void {\n const target = options?.target ?? document.head;\n const styleElements: HTMLStyleElement[] = [];\n\n // Normalize input to array of tokens\n let tokenArray: StyleToken[];\n\n if (isStyleToken(tokens)) {\n tokenArray = [tokens];\n } else if (Array.isArray(tokens)) {\n tokenArray = tokens;\n } else {\n // Object: extract all StyleToken values\n tokenArray = Object.values(tokens).filter(isStyleToken);\n }\n\n // Inject each token\n for (const token of tokenArray) {\n injectToken(token, target);\n }\n\n // Return cleanup function\n return () => {\n for (const el of styleElements) {\n el.remove();\n }\n };\n}\n\n/**\n * Preload styles for better performance\n *\n * Use this at app startup or route entry to batch inject all styles\n * that will be needed, avoiding multiple DOM writes during rendering.\n *\n * @example\n * ```ts\n * // At app startup\n * preload(button, card, input);\n *\n * // At route entry\n * function ProductPage() {\n * preload(productCard, pricing, gallery);\n * return <div>...</div>;\n * }\n * ```\n */\nexport function preload(\n ...styles: (StyleToken | StyleToken[] | Record<string, StyleToken>)[]\n): void {\n for (const style of styles) {\n inject(style);\n }\n}\n","/**\n * StyleRegistry - Core class that manages all style state\n *\n * Can be used directly in vanilla JS or wrapped by framework integrations\n */\n\nimport type { ReadableSignal } from \"@semajsx/signal\";\nimport { injectStyles } from \"./inject\";\nimport { isStyleToken } from \"./rule\";\nimport { uniqueId } from \"./hash\";\nimport type { RegistryOptions, StyleToken } from \"./types\";\n\n/**\n * StyleRegistry - Manages all style-related state and side effects\n *\n * Responsibilities:\n * 1. Signal → CSS variable name mapping (scoped to this registry)\n * 2. CSS injection deduplication\n * 3. Signal subscriptions and cleanup\n */\nexport class StyleRegistry {\n /** Signal → CSS variable name mapping */\n private signalVars = new WeakMap<ReadableSignal<unknown>, string>();\n\n /** Already injected classNames (for deduplication) */\n private injectedClasses = new Set<string>();\n\n /** Active subscriptions (for cleanup) */\n private subscriptions = new Set<() => void>();\n\n /** Track which signals have been subscribed to prevent duplicates */\n private subscribedSignals = new WeakSet<ReadableSignal<unknown>>();\n\n /** Injection target */\n private target: Element | ShadowRoot;\n\n /** Element for CSS variable values (optional, for reactive styles) */\n private anchorElement: HTMLElement | null = null;\n\n constructor(options: RegistryOptions = {}) {\n this.target = options.target ?? document.head;\n }\n\n /**\n * Set anchor element for CSS variable values\n *\n * The anchor element is where CSS variables are set when signals change.\n * CSS variables cascade to descendants via CSS inheritance.\n */\n setAnchorElement(element: HTMLElement): void {\n this.anchorElement = element;\n }\n\n /**\n * Get or create a CSS variable name for a signal\n */\n private getSignalVarName(signal: ReadableSignal<unknown>): string {\n let varName = this.signalVars.get(signal);\n if (!varName) {\n varName = `--sig-${uniqueId()}`;\n this.signalVars.set(signal, varName);\n }\n return varName;\n }\n\n /**\n * Process a token: generate CSS, inject, set up signal bindings\n *\n * @returns The className for the token (or empty string if none)\n */\n processToken(token: StyleToken): string {\n // 1. Generate final CSS with var() references\n let css = token.__cssTemplate;\n const bindings: Array<{ signal: ReadableSignal<unknown>; varName: string }> = [];\n\n if (token.__bindingDefs) {\n for (const def of token.__bindingDefs) {\n const varName = this.getSignalVarName(def.signal);\n css = css.replaceAll(`{{${def.index}}}`, `var(${varName})`);\n bindings.push({ signal: def.signal, varName });\n }\n }\n\n // 2. Inject CSS if className not already injected\n const className = token._;\n if (className && !this.injectedClasses.has(className)) {\n injectStyles(css, this.target);\n this.injectedClasses.add(className);\n } else if (!className) {\n // For rules without className (combined rules, pseudo-selectors)\n // Use CSS content as dedup key\n const cssKey = css;\n if (!this.injectedClasses.has(cssKey)) {\n injectStyles(css, this.target);\n this.injectedClasses.add(cssKey);\n }\n }\n\n // 3. Set up signal subscriptions on the anchor element\n if (this.anchorElement && bindings.length > 0) {\n for (const { signal, varName } of bindings) {\n // Always update the current value\n this.anchorElement.style.setProperty(varName, String(signal.value));\n\n // Only subscribe if not already subscribed (prevents duplicates)\n if (!this.subscribedSignals.has(signal)) {\n this.subscribedSignals.add(signal);\n const unsub = signal.subscribe((newValue: unknown) => {\n this.anchorElement?.style.setProperty(varName, String(newValue));\n });\n this.subscriptions.add(unsub);\n }\n }\n }\n\n return token._ ?? \"\";\n }\n\n /**\n * Inject styles (without processing signal bindings)\n */\n inject(token: StyleToken | StyleToken[] | Record<string, StyleToken>): void {\n let tokenArray: StyleToken[];\n\n if (isStyleToken(token)) {\n tokenArray = [token];\n } else if (Array.isArray(token)) {\n tokenArray = token;\n } else {\n tokenArray = Object.values(token).filter(isStyleToken);\n }\n\n for (const t of tokenArray) {\n this.processToken(t);\n }\n }\n\n /**\n * Clear all injected styles and subscriptions\n */\n clear(): void {\n this.subscriptions.forEach((unsub) => unsub());\n this.subscriptions.clear();\n this.injectedClasses.clear();\n }\n\n /**\n * Dispose the registry (cleanup all subscriptions)\n */\n dispose(): void {\n this.clear();\n }\n}\n\n/**\n * Create a style registry\n *\n * @example\n * ```ts\n * const registry = createRegistry({\n * target: document.head,\n * dedupe: true,\n * });\n *\n * registry.inject(button);\n * registry.inject(card);\n * registry.clear();\n * ```\n */\nexport function createRegistry(options?: RegistryOptions): StyleRegistry {\n return new StyleRegistry(options);\n}\n\n/**\n * Create a cx() function bound to a registry\n *\n * The cx() function accepts StyleTokens, strings, and falsy values,\n * processes them, and returns a combined className string.\n *\n * @example\n * ```ts\n * const registry = createRegistry();\n * const cx = createCx(registry);\n *\n * const className = cx(button.root, isLarge && button.large, \"custom-class\");\n * ```\n */\nexport function createCx(\n registry: StyleRegistry,\n): (...args: (StyleToken | string | false | null | undefined)[]) => string {\n return (...args) => {\n const classes: string[] = [];\n\n for (const arg of args) {\n if (!arg) continue;\n\n if (isStyleToken(arg)) {\n const className = registry.processToken(arg);\n if (className) classes.push(className);\n } else {\n classes.push(arg);\n }\n }\n\n return classes.join(\" \");\n };\n}\n","/**\n * Theme system for @semajsx/style\n *\n * Provides a CSS custom properties-based theme system with type-safe\n * design tokens. Themes can be switched at runtime by toggling classes.\n *\n * @example\n * ```ts\n * import { defineTokens, createTheme } from \"@semajsx/style\";\n *\n * const tokens = defineTokens({\n * colors: {\n * primary: \"#3b82f6\",\n * background: \"#ffffff\",\n * text: \"#1f2937\",\n * },\n * space: {\n * sm: \"0.5rem\",\n * md: \"1rem\",\n * },\n * });\n *\n * // tokens.colors.primary.toString() === \"var(--colors-primary)\"\n *\n * const light = createTheme(tokens);\n * const dark = createTheme(tokens, {\n * colors: { primary: \"#60a5fa\", background: \"#1a1a2e\", text: \"#f0f0f0\" },\n * });\n *\n * // Use tokens in rules\n * const root = rule`${c.root} {\n * color: ${tokens.colors.text};\n * background: ${tokens.colors.background};\n * }`;\n * ```\n */\n\nimport { hashString } from \"./hash\";\n\n/**\n * A token reference that stringifies to a CSS var() expression\n */\nexport interface TokenRef {\n /** The CSS custom property name (e.g., \"--colors-primary\") */\n readonly varName: string;\n /** The default value for this token */\n readonly defaultValue: string;\n /** Returns var(--token-name) for use in CSS */\n toString(): string;\n}\n\n/**\n * Recursive type for token definitions\n * Supports nested objects of string values\n */\nexport type TokenDefinition = {\n [key: string]: string | TokenDefinition;\n};\n\n/**\n * Maps a TokenDefinition to TokenRef objects at leaves\n */\nexport type TokenRefs<T> = {\n readonly [K in keyof T]: T[K] extends string\n ? TokenRef\n : T[K] extends TokenDefinition\n ? TokenRefs<T[K]>\n : never;\n};\n\n/**\n * Partial override values matching token structure\n */\nexport type TokenOverrides<T> = {\n [K in keyof T]?: T[K] extends string\n ? string\n : T[K] extends TokenDefinition\n ? TokenOverrides<T[K]>\n : never;\n};\n\n/**\n * Internal flat map of varName -> defaultValue\n */\ninterface FlatTokenMap {\n varName: string;\n defaultValue: string;\n}\n\n/**\n * Symbol to identify TokenRef objects\n */\nconst TOKEN_REF_BRAND = Symbol.for(\"@semajsx/style/tokenRef\");\n\n/**\n * Check if a value is a TokenRef\n */\nexport function isTokenRef(value: unknown): value is TokenRef {\n return (\n value != null &&\n typeof value === \"object\" &&\n TOKEN_REF_BRAND in value &&\n (value as Record<symbol, unknown>)[TOKEN_REF_BRAND] === true\n );\n}\n\n/**\n * Define design tokens as CSS custom properties\n *\n * Creates a typed token object where each leaf value becomes a CSS custom property.\n * Token refs stringify to `var(--path-to-token)` for use in CSS rules.\n *\n * @example\n * ```ts\n * const tokens = defineTokens({\n * colors: {\n * primary: \"#3b82f6\",\n * secondary: \"#6b7280\",\n * },\n * space: {\n * sm: \"0.5rem\",\n * md: \"1rem\",\n * lg: \"1.5rem\",\n * },\n * radii: {\n * sm: \"4px\",\n * md: \"8px\",\n * },\n * });\n *\n * // tokens.colors.primary.toString() === \"var(--colors-primary)\"\n * // tokens.space.md.varName === \"--space-md\"\n * ```\n */\nexport function defineTokens<T extends TokenDefinition>(definition: T): TokenRefs<T> {\n return buildTokenRefs(definition, []) as TokenRefs<T>;\n}\n\n/**\n * Recursively build TokenRef objects from a definition\n */\nfunction buildTokenRefs(obj: TokenDefinition, path: string[]): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n const currentPath = [...path, key];\n\n if (typeof value === \"string\") {\n const varName = \"--\" + currentPath.join(\"-\");\n const ref: TokenRef = {\n varName,\n defaultValue: value,\n toString() {\n return `var(${varName})`;\n },\n };\n Object.defineProperty(ref, TOKEN_REF_BRAND, { value: true });\n result[key] = ref;\n } else if (typeof value === \"object\" && value !== null) {\n result[key] = buildTokenRefs(value as TokenDefinition, currentPath);\n }\n }\n\n return result;\n}\n\n/**\n * Collect all TokenRef leaf nodes from a token tree\n */\nfunction collectTokenRefs(obj: unknown): FlatTokenMap[] {\n const refs: FlatTokenMap[] = [];\n\n if (isTokenRef(obj)) {\n refs.push({ varName: obj.varName, defaultValue: obj.defaultValue });\n return refs;\n }\n\n if (typeof obj === \"object\" && obj !== null) {\n for (const value of Object.values(obj)) {\n refs.push(...collectTokenRefs(value));\n }\n }\n\n return refs;\n}\n\n/**\n * Collect override values matching the token structure\n */\nfunction collectOverrides(\n tokens: unknown,\n overrides: Record<string, unknown>,\n): { varName: string; value: string }[] {\n const result: { varName: string; value: string }[] = [];\n\n for (const key of Object.keys(overrides)) {\n const overrideValue = overrides[key];\n const tokenValue = (tokens as Record<string, unknown>)[key];\n\n if (typeof overrideValue === \"string\" && isTokenRef(tokenValue)) {\n result.push({ varName: tokenValue.varName, value: overrideValue });\n } else if (\n typeof overrideValue === \"object\" &&\n overrideValue !== null &&\n typeof tokenValue === \"object\" &&\n tokenValue !== null\n ) {\n result.push(...collectOverrides(tokenValue, overrideValue as Record<string, unknown>));\n }\n }\n\n return result;\n}\n\n/**\n * Symbol used to identify theme StyleTokens\n */\nconst STYLE_TOKEN_BRAND = Symbol.for(\"@semajsx/style/token\");\n\n/**\n * Create a theme from token definitions\n *\n * Returns a StyleToken that sets all CSS custom properties. The default theme\n * uses `:root` selector, while overridden themes get a scoped class.\n *\n * @param tokens - Token refs from defineTokens()\n * @param overrides - Optional partial overrides for token values\n * @returns A StyleToken that can be injected or used as a class\n *\n * @example\n * ```ts\n * // Default theme (applies to :root)\n * const light = createTheme(tokens);\n * inject(light);\n *\n * // Override theme (scoped to a class)\n * const dark = createTheme(tokens, {\n * colors: { primary: \"#60a5fa\", background: \"#1a1a2e\" },\n * });\n * inject(dark);\n *\n * // Apply dark theme to an element\n * <div class={dark}>...</div>\n * ```\n */\nexport function createTheme<T extends TokenDefinition>(\n tokens: TokenRefs<T>,\n overrides?: TokenOverrides<T>,\n): import(\"./types\").StyleToken {\n if (!overrides) {\n // Default theme: set all token values on :root\n const allTokens = collectTokenRefs(tokens);\n const vars = allTokens.map((t) => ` ${t.varName}: ${t.defaultValue};`).join(\"\\n\");\n const css = `:root {\\n${vars}\\n}`;\n\n const token = {\n __kind: \"style\" as const,\n _: undefined,\n __cssTemplate: css,\n __bindingDefs: undefined,\n toString() {\n return \"\";\n },\n };\n Object.defineProperty(token, STYLE_TOKEN_BRAND, { value: true });\n return token;\n }\n\n // Override theme: scoped to a generated class\n const overrideList = collectOverrides(tokens, overrides as Record<string, unknown>);\n const hash = hashString(overrideList.map((o) => o.varName + o.value).join(\"\"));\n const className = `theme-${hash}`;\n const vars = overrideList.map((o) => ` ${o.varName}: ${o.value};`).join(\"\\n\");\n const css = `.${className} {\\n${vars}\\n}`;\n\n const token = {\n __kind: \"style\" as const,\n _: className,\n __cssTemplate: css,\n __bindingDefs: undefined,\n toString() {\n return this._ ?? \"\";\n },\n };\n Object.defineProperty(token, STYLE_TOKEN_BRAND, { value: true });\n return token;\n}\n","/**\n * Keyframes support for @semajsx/style\n *\n * Provides a tagged template for defining CSS @keyframes animations\n * that integrate with the rule() system.\n *\n * @example\n * ```ts\n * import { keyframes } from \"@semajsx/style\";\n * import { classes, rule } from \"@semajsx/style\";\n *\n * const fadeIn = keyframes`\n * from { opacity: 0; }\n * to { opacity: 1; }\n * `;\n *\n * const c = classes([\"root\"]);\n * const animated = rule`${c.root} {\n * animation: ${fadeIn} 0.3s ease-in;\n * }`;\n * ```\n */\n\nimport { hashString } from \"./hash\";\nimport type { StyleToken } from \"./types\";\n\n/**\n * Symbol to identify KeyframeRef objects\n */\nconst KEYFRAME_REF_BRAND = Symbol.for(\"@semajsx/style/keyframeRef\");\n\n/**\n * Symbol to identify StyleToken objects\n */\nconst STYLE_TOKEN_BRAND = Symbol.for(\"@semajsx/style/token\");\n\n/**\n * A reference to a @keyframes animation that can be used in rule() templates\n *\n * Stringifies to the animation name for use in CSS properties.\n * Also carries the @keyframes CSS for injection.\n */\nexport interface KeyframeRef {\n /** The generated animation name */\n readonly name: string;\n /** The full @keyframes CSS */\n readonly css: string;\n /** Returns the animation name */\n toString(): string;\n}\n\n/**\n * Check if a value is a KeyframeRef\n */\nexport function isKeyframeRef(value: unknown): value is KeyframeRef {\n return (\n value != null &&\n typeof value === \"object\" &&\n KEYFRAME_REF_BRAND in value &&\n (value as Record<symbol, unknown>)[KEYFRAME_REF_BRAND] === true\n );\n}\n\n/**\n * Define CSS @keyframes animation\n *\n * Returns a KeyframeRef that can be interpolated in rule() templates.\n * The keyframes CSS is automatically injected when used.\n *\n * @example\n * ```ts\n * const spin = keyframes`\n * from { transform: rotate(0deg); }\n * to { transform: rotate(360deg); }\n * `;\n *\n * const spinner = rule`${c.spinner} {\n * animation: ${spin} 1s linear infinite;\n * }`;\n * ```\n */\nexport function keyframes(\n strings: TemplateStringsArray,\n ...values: (string | number)[]\n): KeyframeRef {\n // Build the keyframes body\n let body = strings[0] ?? \"\";\n for (let i = 0; i < values.length; i++) {\n body += String(values[i]) + (strings[i + 1] ?? \"\");\n }\n\n body = body.trim();\n\n // Generate a deterministic name from the content\n const hash = hashString(body);\n const name = `kf-${hash}`;\n\n const css = `@keyframes ${name} {\\n ${body}\\n}`;\n\n const ref: KeyframeRef = {\n name,\n css,\n toString() {\n return name;\n },\n };\n\n Object.defineProperty(ref, KEYFRAME_REF_BRAND, { value: true });\n\n return ref;\n}\n\n/**\n * Create a StyleToken that injects keyframes CSS\n *\n * Use this when you need to inject keyframes without using them in a rule().\n * Normally, keyframes are auto-injected when used in rule() templates.\n *\n * @example\n * ```ts\n * const fadeIn = keyframes`\n * from { opacity: 0; }\n * to { opacity: 1; }\n * `;\n *\n * // Inject keyframes CSS\n * inject(keyframesToken(fadeIn));\n * ```\n */\nexport function keyframesToken(ref: KeyframeRef): StyleToken {\n const token: StyleToken = {\n __kind: \"style\",\n _: undefined,\n __cssTemplate: ref.css,\n __bindingDefs: undefined,\n toString() {\n return \"\";\n },\n };\n Object.defineProperty(token, STYLE_TOKEN_BRAND, { value: true });\n return token;\n}\n","/**\n * Pre-built animation utilities for @semajsx/style\n *\n * Provides ready-to-use keyframes and animation StyleTokens for common\n * animations like fade, slide, scale, spin, and bounce.\n *\n * @example\n * ```ts\n * import { fadeInKf, fadeIn, slideUpKf, slideUp } from \"@semajsx/style\";\n *\n * // Use keyframes in custom rules\n * const custom = rule`${c.root} {\n * animation: ${fadeInKf} 0.5s ease-out;\n * }`;\n *\n * // Or use pre-built animation classes\n * <div class={[myStyle, fadeIn]}>Fading in!</div>\n * ```\n */\n\nimport { keyframes, keyframesToken } from \"./keyframes\";\nimport type { KeyframeRef } from \"./keyframes\";\nimport { classes } from \"./classes\";\nimport { rule, rules } from \"./rule\";\nimport type { StyleToken } from \"./types\";\n\n// ──── Keyframe Definitions ──────────────────────────────────────────\n\n/** Fade in from transparent */\nexport const fadeInKf: KeyframeRef = keyframes`\n from { opacity: 0; }\n to { opacity: 1; }\n`;\n\n/** Fade out to transparent */\nexport const fadeOutKf: KeyframeRef = keyframes`\n from { opacity: 1; }\n to { opacity: 0; }\n`;\n\n/** Slide up from below */\nexport const slideUpKf: KeyframeRef = keyframes`\n from { transform: translateY(10px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n`;\n\n/** Slide down from above */\nexport const slideDownKf: KeyframeRef = keyframes`\n from { transform: translateY(-10px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n`;\n\n/** Slide in from left */\nexport const slideLeftKf: KeyframeRef = keyframes`\n from { transform: translateX(-10px); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n`;\n\n/** Slide in from right */\nexport const slideRightKf: KeyframeRef = keyframes`\n from { transform: translateX(10px); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n`;\n\n/** Scale in from smaller */\nexport const scaleInKf: KeyframeRef = keyframes`\n from { transform: scale(0.95); opacity: 0; }\n to { transform: scale(1); opacity: 1; }\n`;\n\n/** Scale out to smaller */\nexport const scaleOutKf: KeyframeRef = keyframes`\n from { transform: scale(1); opacity: 1; }\n to { transform: scale(0.95); opacity: 0; }\n`;\n\n/** Spin 360 degrees */\nexport const spinKf: KeyframeRef = keyframes`\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n`;\n\n/** Ping effect (for notifications) */\nexport const pingKf: KeyframeRef = keyframes`\n 75%, 100% { transform: scale(2); opacity: 0; }\n`;\n\n/** Pulse effect */\nexport const pulseKf: KeyframeRef = keyframes`\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n`;\n\n/** Bounce effect */\nexport const bounceKf: KeyframeRef = keyframes`\n 0%, 100% { transform: translateY(-25%); animation-timing-function: cubic-bezier(0.8, 0, 1, 1); }\n 50% { transform: translateY(0); animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }\n`;\n\n// ──── Animation Class Tokens ────────────────────────────────────────\n\nconst c = classes([\n \"fadeIn\",\n \"fadeOut\",\n \"slideUp\",\n \"slideDown\",\n \"slideLeft\",\n \"slideRight\",\n \"scaleIn\",\n \"scaleOut\",\n \"spin\",\n \"ping\",\n \"pulse\",\n \"bounce\",\n] as const);\n\n/** Fade in animation (0.3s ease-out) */\nexport const fadeIn: StyleToken = rules(\n keyframesToken(fadeInKf),\n rule`${c.fadeIn} { animation: ${fadeInKf} 0.3s ease-out; }`,\n);\n\n/** Fade out animation (0.3s ease-in) */\nexport const fadeOut: StyleToken = rules(\n keyframesToken(fadeOutKf),\n rule`${c.fadeOut} { animation: ${fadeOutKf} 0.3s ease-in; }`,\n);\n\n/** Slide up animation (0.3s ease-out) */\nexport const slideUp: StyleToken = rules(\n keyframesToken(slideUpKf),\n rule`${c.slideUp} { animation: ${slideUpKf} 0.3s ease-out; }`,\n);\n\n/** Slide down animation (0.3s ease-out) */\nexport const slideDown: StyleToken = rules(\n keyframesToken(slideDownKf),\n rule`${c.slideDown} { animation: ${slideDownKf} 0.3s ease-out; }`,\n);\n\n/** Slide in from left animation (0.3s ease-out) */\nexport const slideLeft: StyleToken = rules(\n keyframesToken(slideLeftKf),\n rule`${c.slideLeft} { animation: ${slideLeftKf} 0.3s ease-out; }`,\n);\n\n/** Slide in from right animation (0.3s ease-out) */\nexport const slideRight: StyleToken = rules(\n keyframesToken(slideRightKf),\n rule`${c.slideRight} { animation: ${slideRightKf} 0.3s ease-out; }`,\n);\n\n/** Scale in animation (0.2s ease-out) */\nexport const scaleIn: StyleToken = rules(\n keyframesToken(scaleInKf),\n rule`${c.scaleIn} { animation: ${scaleInKf} 0.2s ease-out; }`,\n);\n\n/** Scale out animation (0.2s ease-in) */\nexport const scaleOut: StyleToken = rules(\n keyframesToken(scaleOutKf),\n rule`${c.scaleOut} { animation: ${scaleOutKf} 0.2s ease-in; }`,\n);\n\n/** Spin animation (1s linear infinite) */\nexport const spin: StyleToken = rules(\n keyframesToken(spinKf),\n rule`${c.spin} { animation: ${spinKf} 1s linear infinite; }`,\n);\n\n/** Ping animation (1s cubic-bezier infinite) */\nexport const ping: StyleToken = rules(\n keyframesToken(pingKf),\n rule`${c.ping} { animation: ${pingKf} 1s cubic-bezier(0, 0, 0.2, 1) infinite; }`,\n);\n\n/** Pulse animation (2s ease-in-out infinite) */\nexport const pulse: StyleToken = rules(\n keyframesToken(pulseKf),\n rule`${c.pulse} { animation: ${pulseKf} 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; }`,\n);\n\n/** Bounce animation (1s infinite) */\nexport const bounce: StyleToken = rules(\n keyframesToken(bounceKf),\n rule`${c.bounce} { animation: ${bounceKf} 1s infinite; }`,\n);\n","/**\n * Responsive design utilities for @semajsx/style\n *\n * Provides breakpoint definitions and media query helpers for creating\n * responsive styles that integrate with the rule() system.\n *\n * @example\n * ```ts\n * import { breakpoints, media } from \"@semajsx/style\";\n *\n * const bp = breakpoints;\n *\n * // Use breakpoint values in media queries\n * const responsive = rules(\n * rule`${c.root} { padding: 8px; }`,\n * rule`@media ${bp.md} { .${c.root} { padding: 16px; } }`,\n * );\n *\n * // Or use the media() helper\n * const responsivePadding = media(bp.md,\n * rule`${c.root} { padding: 16px; }`,\n * );\n * ```\n */\n\nimport type { StyleToken } from \"./types\";\n\n/**\n * Symbol to identify StyleToken objects\n */\nconst STYLE_TOKEN_BRAND = Symbol.for(\"@semajsx/style/token\");\n\n/**\n * A breakpoint reference with min/max media query helpers\n */\nexport interface BreakpointRef {\n /** The breakpoint value (e.g., \"768px\") */\n readonly value: string;\n /** min-width media query: \"(min-width: 768px)\" */\n readonly min: string;\n /** max-width media query: \"(max-width: 767.98px)\" */\n readonly max: string;\n /** Returns the min-width media query by default */\n toString(): string;\n}\n\n/**\n * Collection of breakpoint refs\n */\nexport type BreakpointRefs<T extends Record<string, string>> = {\n readonly [K in keyof T]: BreakpointRef;\n};\n\n/**\n * Parse a CSS value to subtract 0.02px for max-width queries\n * This prevents overlap between min and max breakpoints\n */\nfunction subtractPixel(value: string): string {\n const match = value.match(/^(\\d+(?:\\.\\d+)?)(px|em|rem)$/);\n if (!match || !match[1] || !match[2]) return value;\n\n const num = parseFloat(match[1]);\n const unit = match[2];\n\n // Subtract 0.02 to avoid overlap\n return `${(num - 0.02).toFixed(2)}${unit}`;\n}\n\n/**\n * Define custom breakpoints\n *\n * Creates a typed breakpoint object where each entry becomes a BreakpointRef\n * with min/max media query helpers.\n *\n * @example\n * ```ts\n * const bp = defineBreakpoints({\n * sm: \"640px\",\n * md: \"768px\",\n * lg: \"1024px\",\n * xl: \"1280px\",\n * });\n *\n * // bp.md.toString() === \"(min-width: 768px)\"\n * // bp.md.min === \"(min-width: 768px)\"\n * // bp.md.max === \"(max-width: 767.98px)\"\n * ```\n */\nexport function defineBreakpoints<T extends Record<string, string>>(\n definition: T,\n): BreakpointRefs<T> {\n const result: Record<string, BreakpointRef> = {};\n\n for (const key of Object.keys(definition)) {\n const value = definition[key] as string;\n const maxValue = subtractPixel(value);\n\n result[key] = {\n value,\n min: `(min-width: ${value})`,\n max: `(max-width: ${maxValue})`,\n toString() {\n return this.min;\n },\n };\n }\n\n return result as BreakpointRefs<T>;\n}\n\n/**\n * Default breakpoints matching Tailwind CSS defaults\n */\nexport const breakpoints: BreakpointRefs<{\n sm: string;\n md: string;\n lg: string;\n xl: string;\n \"2xl\": string;\n}> = defineBreakpoints({\n sm: \"640px\",\n md: \"768px\",\n lg: \"1024px\",\n xl: \"1280px\",\n \"2xl\": \"1536px\",\n});\n\n/**\n * Wrap style tokens in a media query\n *\n * Takes a media query string and one or more StyleTokens,\n * wrapping their CSS in a @media block.\n *\n * @example\n * ```ts\n * import { breakpoints, media } from \"@semajsx/style\";\n *\n * const bp = breakpoints;\n *\n * // Single rule\n * const mdPadding = media(bp.md,\n * rule`${c.root} { padding: 16px; }`,\n * );\n *\n * // Multiple rules\n * const lgLayout = media(bp.lg,\n * rule`${c.root} { display: grid; }`,\n * rule`${c.sidebar} { width: 300px; }`,\n * );\n *\n * // Max-width (mobile-first breakpoint)\n * const mobileOnly = media(bp.md.max,\n * rule`${c.root} { flex-direction: column; }`,\n * );\n *\n * // Custom media query\n * const darkMode = media(\"(prefers-color-scheme: dark)\",\n * rule`${c.root} { background: #1a1a2e; color: #f0f0f0; }`,\n * );\n * ```\n */\nexport function media(query: string | BreakpointRef, ...tokens: StyleToken[]): StyleToken {\n const queryStr = typeof query === \"string\" ? query : query.toString();\n\n // Extract CSS from each token and wrap in @media block\n const innerCSS = tokens.map((t) => ` ${t.__cssTemplate}`).join(\"\\n\");\n const css = `@media ${queryStr} {\\n${innerCSS}\\n}`;\n\n const token: StyleToken = {\n __kind: \"style\",\n _: undefined,\n __cssTemplate: css,\n __bindingDefs: undefined,\n toString() {\n return \"\";\n },\n };\n Object.defineProperty(token, STYLE_TOKEN_BRAND, { value: true });\n return token;\n}\n\n/**\n * Create a container query\n *\n * @example\n * ```ts\n * const wide = container(\"(min-width: 600px)\",\n * rule`${c.root} { display: grid; grid-template-columns: 1fr 1fr; }`,\n * );\n * ```\n */\nexport function container(query: string, ...tokens: StyleToken[]): StyleToken {\n const innerCSS = tokens.map((t) => ` ${t.__cssTemplate}`).join(\"\\n\");\n const css = `@container ${query} {\\n${innerCSS}\\n}`;\n\n const token: StyleToken = {\n __kind: \"style\",\n _: undefined,\n __cssTemplate: css,\n __bindingDefs: undefined,\n toString() {\n return \"\";\n },\n };\n Object.defineProperty(token, STYLE_TOKEN_BRAND, { value: true });\n return token;\n}\n"],"mappings":";;;;;;;;;;;;;;AAYA,SAAgB,WAAW,KAAqB;CAC9C,IAAI,OAAO;AACX,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,IAC9B,SAAS,QAAQ,KAAK,OAAQ,IAAI,WAAW,EAAE;AAGjD,QAAO,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,MAAM,GAAG;;;;;;;AAQ9C,IAAI,UAAU;AACd,SAAgB,WAAmB;AACjC,SAAQ,EAAE,SAAS,SAAS,GAAG,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE;;;;;;;;;;;AClB1E,MAAM,kBAAkB,OAAO,IAAI,0BAA0B;;;;;;;;;;;;AAa7D,SAAgB,QAAqC,OAAwB;CAC3E,MAAM,SAAS,EAAE;AAEjB,MAAK,MAAM,QAAQ,OAAO;EAExB,MAAM,YAAY,GAAG,KAAK,GADb,WAAW,OAAO,KAAK,KAAK,CAAC,SAAS,GAAG,CAAC;EAGvD,MAAM,MAAgB;GACpB,IAAI,OAAO,UAAU;GACrB,WAAW;AACT,WAAO;;GAEV;AAGD,SAAO,eAAe,KAAK,iBAAiB,EAAE,OAAO,MAAM,CAAC;AAE5D,SAAO,QAAQ;;AAGjB,QAAO;;;;;AAMT,SAAgB,WAAW,OAAmC;AAC5D,QACE,SAAS,QACT,OAAO,UAAU,YACjB,mBAAmB,SAClB,MAAkC,qBAAqB;;;;;;;;;;;;;;ACvC5D,MAAMA,sBAAoB,OAAO,IAAI,uBAAuB;;;;;;;;;AAU5D,SAAS,iBAAiB,KAAiC;CAEzD,MAAM,QAAQ,IAAI,MAAM,8BAA8B;AACtD,QAAO,QAAQ,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;AAwB5B,SAAgB,KACd,SACA,GAAG,QACS;CACZ,MAAM,cAAkC,EAAE;CAI1C,IAAI,cAAc,QAAQ,MAAM;AAEhC,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;EACtC,MAAM,QAAQ,OAAO;EACrB,MAAM,aAAa,QAAQ,IAAI,MAAM;AAErC,MAAI,WAAW,MAAM,CAEnB,gBAAe,MAAM,MAAM,UAAU,GAAG;WAC/B,SAAS,MAAM,EAAE;GAG1B,MAAM,QAAQ,YAAY;AAC1B,eAAY,KAAK;IAAE,QAAQ;IAAO;IAAO,CAAC;AAC1C,kBAAe,KAAK,MAAM,MAAM;QAGhC,gBAAe,OAAO,MAAM,GAAG;;CAMnC,MAAM,QAAoB;EACxB,QAAQ;EACR,GAJgB,iBAAiB,YAAY;EAK7C,eAAe;EACf,eAAe,YAAY,SAAS,IAAI,cAAc;EACtD,WAAW;AACT,UAAO,KAAK,KAAK;;EAEpB;AAGD,QAAO,eAAe,OAAOA,qBAAmB,EAAE,OAAO,MAAM,CAAC;AAEhE,QAAO;;;;;;;;;;;;;;;;;AAkBT,SAAgB,MAAM,GAAG,QAAkC;CACzD,MAAM,iBAAqC,EAAE;CAoB7C,MAAM,QAAoB;EACxB,QAAQ;EACR,GAAG;EACH,eApBkB,OACjB,KAAK,GAAG,eAAe;GACtB,IAAI,MAAM,EAAE;GACZ,MAAM,WAAW,EAAE,iBAAiB,EAAE;AAGtC,QAAK,MAAM,OAAO,UAAU;IAC1B,MAAM,WAAW,IAAI,QAAQ,aAAa;AAE1C,UAAM,IAAI,WAAW,KAAK,IAAI,MAAM,KAAK,KAAK,SAAS,IAAI;AAC3D,mBAAe,KAAK;KAAE,GAAG;KAAK,OAAO;KAAU,CAAC;;AAGlD,UAAO;IACP,CACD,KAAK,KAAK;EAMX,eAAe,eAAe,SAAS,IAAI,iBAAiB;EAC5D,WAAW;AACT,UAAO;;EAEV;AAGD,QAAO,eAAe,OAAOA,qBAAmB,EAAE,OAAO,MAAM,CAAC;AAEhE,QAAO;;;;;AAMT,SAAgB,aAAa,OAAqC;AAChE,QACE,SAAS,QACT,OAAO,UAAU,YACjB,YAAY,SACX,MAAqB,WAAW;;;;;;;;;;;ACrJrC,MAAM,iCAAiB,IAAI,SAAuD;;;;AAKlF,SAAS,eAAe,QAAsD;CAC5E,IAAI,MAAM,eAAe,IAAI,OAAO;AACpC,KAAI,CAAC,KAAK;AACR,wBAAM,IAAI,KAAK;AACf,iBAAe,IAAI,QAAQ,IAAI;;AAEjC,QAAO;;;;;;;;;AAUT,SAAgB,aAAa,KAAa,QAAiD;CACzF,MAAM,eAAe,SAAS,cAAc,QAAQ;AACpD,cAAa,cAAc;AAG3B,EADqB,UAAU,SAAS,MAC3B,YAAY,aAAa;AAEtC,QAAO;;;;;;;;;;;;;;AAeT,SAAS,YAAY,OAAmB,QAA+C;CACrF,MAAM,WAAW,eAAe,OAAO;CAGvC,MAAM,MAAM,MAAM,KAAK,MAAM;AAE7B,KAAI,CAAC,SAAS,IAAI,IAAI,EAAE;EAEtB,IAAI,MAAM,MAAM;AAChB,MAAI,MAAM,cACR,MAAK,MAAM,OAAO,MAAM,cAEtB,OAAM,IAAI,WAAW,KAAK,IAAI,MAAM,KAAK,eAAe,IAAI,MAAM,GAAG;AAIzE,eAAa,KAAK,WAAW,WAAW,SAAS,OAAQ,OAAgC;AACzF,WAAS,IAAI,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BrB,SAAgB,OACd,QACA,SACY;CACZ,MAAM,SAAS,SAAS,UAAU,SAAS;CAC3C,MAAM,gBAAoC,EAAE;CAG5C,IAAI;AAEJ,KAAI,aAAa,OAAO,CACtB,cAAa,CAAC,OAAO;UACZ,MAAM,QAAQ,OAAO,CAC9B,cAAa;KAGb,cAAa,OAAO,OAAO,OAAO,CAAC,OAAO,aAAa;AAIzD,MAAK,MAAM,SAAS,WAClB,aAAY,OAAO,OAAO;AAI5B,cAAa;AACX,OAAK,MAAM,MAAM,cACf,IAAG,QAAQ;;;;;;;;;;;;;;;;;;;;;AAuBjB,SAAgB,QACd,GAAG,QACG;AACN,MAAK,MAAM,SAAS,OAClB,QAAO,MAAM;;;;;;;;;;;;;ACrIjB,IAAa,gBAAb,MAA2B;CAmBzB,YAAY,UAA2B,EAAE,EAAE;oCAjBtB,IAAI,SAA0C;yCAGzC,IAAI,KAAa;uCAGnB,IAAI,KAAiB;2CAGjB,IAAI,SAAkC;uBAMtB;AAG1C,OAAK,SAAS,QAAQ,UAAU,SAAS;;;;;;;;CAS3C,iBAAiB,SAA4B;AAC3C,OAAK,gBAAgB;;;;;CAMvB,AAAQ,iBAAiB,QAAyC;EAChE,IAAI,UAAU,KAAK,WAAW,IAAI,OAAO;AACzC,MAAI,CAAC,SAAS;AACZ,aAAU,SAAS,UAAU;AAC7B,QAAK,WAAW,IAAI,QAAQ,QAAQ;;AAEtC,SAAO;;;;;;;CAQT,aAAa,OAA2B;EAEtC,IAAI,MAAM,MAAM;EAChB,MAAM,WAAwE,EAAE;AAEhF,MAAI,MAAM,cACR,MAAK,MAAM,OAAO,MAAM,eAAe;GACrC,MAAM,UAAU,KAAK,iBAAiB,IAAI,OAAO;AACjD,SAAM,IAAI,WAAW,KAAK,IAAI,MAAM,KAAK,OAAO,QAAQ,GAAG;AAC3D,YAAS,KAAK;IAAE,QAAQ,IAAI;IAAQ;IAAS,CAAC;;EAKlD,MAAM,YAAY,MAAM;AACxB,MAAI,aAAa,CAAC,KAAK,gBAAgB,IAAI,UAAU,EAAE;AACrD,gBAAa,KAAK,KAAK,OAAO;AAC9B,QAAK,gBAAgB,IAAI,UAAU;aAC1B,CAAC,WAAW;GAGrB,MAAM,SAAS;AACf,OAAI,CAAC,KAAK,gBAAgB,IAAI,OAAO,EAAE;AACrC,iBAAa,KAAK,KAAK,OAAO;AAC9B,SAAK,gBAAgB,IAAI,OAAO;;;AAKpC,MAAI,KAAK,iBAAiB,SAAS,SAAS,EAC1C,MAAK,MAAM,EAAE,QAAQ,aAAa,UAAU;AAE1C,QAAK,cAAc,MAAM,YAAY,SAAS,OAAO,OAAO,MAAM,CAAC;AAGnE,OAAI,CAAC,KAAK,kBAAkB,IAAI,OAAO,EAAE;AACvC,SAAK,kBAAkB,IAAI,OAAO;IAClC,MAAM,QAAQ,OAAO,WAAW,aAAsB;AACpD,UAAK,eAAe,MAAM,YAAY,SAAS,OAAO,SAAS,CAAC;MAChE;AACF,SAAK,cAAc,IAAI,MAAM;;;AAKnC,SAAO,MAAM,KAAK;;;;;CAMpB,OAAO,OAAqE;EAC1E,IAAI;AAEJ,MAAI,aAAa,MAAM,CACrB,cAAa,CAAC,MAAM;WACX,MAAM,QAAQ,MAAM,CAC7B,cAAa;MAEb,cAAa,OAAO,OAAO,MAAM,CAAC,OAAO,aAAa;AAGxD,OAAK,MAAM,KAAK,WACd,MAAK,aAAa,EAAE;;;;;CAOxB,QAAc;AACZ,OAAK,cAAc,SAAS,UAAU,OAAO,CAAC;AAC9C,OAAK,cAAc,OAAO;AAC1B,OAAK,gBAAgB,OAAO;;;;;CAM9B,UAAgB;AACd,OAAK,OAAO;;;;;;;;;;;;;;;;;;AAmBhB,SAAgB,eAAe,SAA0C;AACvE,QAAO,IAAI,cAAc,QAAQ;;;;;;;;;;;;;;;;AAiBnC,SAAgB,SACd,UACyE;AACzE,SAAQ,GAAG,SAAS;EAClB,MAAM,UAAoB,EAAE;AAE5B,OAAK,MAAM,OAAO,MAAM;AACtB,OAAI,CAAC,IAAK;AAEV,OAAI,aAAa,IAAI,EAAE;IACrB,MAAM,YAAY,SAAS,aAAa,IAAI;AAC5C,QAAI,UAAW,SAAQ,KAAK,UAAU;SAEtC,SAAQ,KAAK,IAAI;;AAIrB,SAAO,QAAQ,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChH5B,MAAM,kBAAkB,OAAO,IAAI,0BAA0B;;;;AAK7D,SAAgB,WAAW,OAAmC;AAC5D,QACE,SAAS,QACT,OAAO,UAAU,YACjB,mBAAmB,SAClB,MAAkC,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgC5D,SAAgB,aAAwC,YAA6B;AACnF,QAAO,eAAe,YAAY,EAAE,CAAC;;;;;AAMvC,SAAS,eAAe,KAAsB,MAAyC;CACrF,MAAM,SAAkC,EAAE;AAE1C,MAAK,MAAM,OAAO,OAAO,KAAK,IAAI,EAAE;EAClC,MAAM,QAAQ,IAAI;EAClB,MAAM,cAAc,CAAC,GAAG,MAAM,IAAI;AAElC,MAAI,OAAO,UAAU,UAAU;GAC7B,MAAM,UAAU,OAAO,YAAY,KAAK,IAAI;GAC5C,MAAM,MAAgB;IACpB;IACA,cAAc;IACd,WAAW;AACT,YAAO,OAAO,QAAQ;;IAEzB;AACD,UAAO,eAAe,KAAK,iBAAiB,EAAE,OAAO,MAAM,CAAC;AAC5D,UAAO,OAAO;aACL,OAAO,UAAU,YAAY,UAAU,KAChD,QAAO,OAAO,eAAe,OAA0B,YAAY;;AAIvE,QAAO;;;;;AAMT,SAAS,iBAAiB,KAA8B;CACtD,MAAM,OAAuB,EAAE;AAE/B,KAAI,WAAW,IAAI,EAAE;AACnB,OAAK,KAAK;GAAE,SAAS,IAAI;GAAS,cAAc,IAAI;GAAc,CAAC;AACnE,SAAO;;AAGT,KAAI,OAAO,QAAQ,YAAY,QAAQ,KACrC,MAAK,MAAM,SAAS,OAAO,OAAO,IAAI,CACpC,MAAK,KAAK,GAAG,iBAAiB,MAAM,CAAC;AAIzC,QAAO;;;;;AAMT,SAAS,iBACP,QACA,WACsC;CACtC,MAAM,SAA+C,EAAE;AAEvD,MAAK,MAAM,OAAO,OAAO,KAAK,UAAU,EAAE;EACxC,MAAM,gBAAgB,UAAU;EAChC,MAAM,aAAc,OAAmC;AAEvD,MAAI,OAAO,kBAAkB,YAAY,WAAW,WAAW,CAC7D,QAAO,KAAK;GAAE,SAAS,WAAW;GAAS,OAAO;GAAe,CAAC;WAElE,OAAO,kBAAkB,YACzB,kBAAkB,QAClB,OAAO,eAAe,YACtB,eAAe,KAEf,QAAO,KAAK,GAAG,iBAAiB,YAAY,cAAyC,CAAC;;AAI1F,QAAO;;;;;AAMT,MAAMC,sBAAoB,OAAO,IAAI,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4B5D,SAAgB,YACd,QACA,WAC8B;AAC9B,KAAI,CAAC,WAAW;EAMd,MAAM,QAAQ;GACZ,QAAQ;GACR,GAAG;GACH,eALU,YAFM,iBAAiB,OAAO,CACnB,KAAK,MAAM,KAAK,EAAE,QAAQ,IAAI,EAAE,aAAa,GAAG,CAAC,KAAK,KAAK,CACrD;GAM3B,eAAe;GACf,WAAW;AACT,WAAO;;GAEV;AACD,SAAO,eAAe,OAAOA,qBAAmB,EAAE,OAAO,MAAM,CAAC;AAChE,SAAO;;CAIT,MAAM,eAAe,iBAAiB,QAAQ,UAAqC;CAEnF,MAAM,YAAY,SADL,WAAW,aAAa,KAAK,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC;CAK9E,MAAM,QAAQ;EACZ,QAAQ;EACR,GAAG;EACH,eALU,IAAI,UAAU,MADb,aAAa,KAAK,MAAM,KAAK,EAAE,QAAQ,IAAI,EAAE,MAAM,GAAG,CAAC,KAAK,KAAK,CACzC;EAMnC,eAAe;EACf,WAAW;AACT,UAAO,KAAK,KAAK;;EAEpB;AACD,QAAO,eAAe,OAAOA,qBAAmB,EAAE,OAAO,MAAM,CAAC;AAChE,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjQT,MAAM,qBAAqB,OAAO,IAAI,6BAA6B;;;;AAKnE,MAAMC,sBAAoB,OAAO,IAAI,uBAAuB;;;;AAoB5D,SAAgB,cAAc,OAAsC;AAClE,QACE,SAAS,QACT,OAAO,UAAU,YACjB,sBAAsB,SACrB,MAAkC,wBAAwB;;;;;;;;;;;;;;;;;;;;AAsB/D,SAAgB,UACd,SACA,GAAG,QACU;CAEb,IAAI,OAAO,QAAQ,MAAM;AACzB,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,IACjC,SAAQ,OAAO,OAAO,GAAG,IAAI,QAAQ,IAAI,MAAM;AAGjD,QAAO,KAAK,MAAM;CAIlB,MAAM,OAAO,MADA,WAAW,KAAK;CAK7B,MAAM,MAAmB;EACvB;EACA,KAJU,cAAc,KAAK,QAAQ,KAAK;EAK1C,WAAW;AACT,UAAO;;EAEV;AAED,QAAO,eAAe,KAAK,oBAAoB,EAAE,OAAO,MAAM,CAAC;AAE/D,QAAO;;;;;;;;;;;;;;;;;;;AAoBT,SAAgB,eAAe,KAA8B;CAC3D,MAAM,QAAoB;EACxB,QAAQ;EACR,GAAG;EACH,eAAe,IAAI;EACnB,eAAe;EACf,WAAW;AACT,UAAO;;EAEV;AACD,QAAO,eAAe,OAAOA,qBAAmB,EAAE,OAAO,MAAM,CAAC;AAChE,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;AC/GT,MAAa,WAAwB,SAAS;;;;;AAM9C,MAAa,YAAyB,SAAS;;;;;AAM/C,MAAa,YAAyB,SAAS;;;;;AAM/C,MAAa,cAA2B,SAAS;;;;;AAMjD,MAAa,cAA2B,SAAS;;;;;AAMjD,MAAa,eAA4B,SAAS;;;;;AAMlD,MAAa,YAAyB,SAAS;;;;;AAM/C,MAAa,aAA0B,SAAS;;;;;AAMhD,MAAa,SAAsB,SAAS;;;;;AAM5C,MAAa,SAAsB,SAAS;;;;AAK5C,MAAa,UAAuB,SAAS;;;;;AAM7C,MAAa,WAAwB,SAAS;;;;AAO9C,MAAM,IAAI,QAAQ;CAChB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAU;;AAGX,MAAa,SAAqB,MAChC,eAAe,SAAS,EACxB,IAAI,GAAG,EAAE,OAAO,gBAAgB,SAAS,mBAC1C;;AAGD,MAAa,UAAsB,MACjC,eAAe,UAAU,EACzB,IAAI,GAAG,EAAE,QAAQ,gBAAgB,UAAU,kBAC5C;;AAGD,MAAa,UAAsB,MACjC,eAAe,UAAU,EACzB,IAAI,GAAG,EAAE,QAAQ,gBAAgB,UAAU,mBAC5C;;AAGD,MAAa,YAAwB,MACnC,eAAe,YAAY,EAC3B,IAAI,GAAG,EAAE,UAAU,gBAAgB,YAAY,mBAChD;;AAGD,MAAa,YAAwB,MACnC,eAAe,YAAY,EAC3B,IAAI,GAAG,EAAE,UAAU,gBAAgB,YAAY,mBAChD;;AAGD,MAAa,aAAyB,MACpC,eAAe,aAAa,EAC5B,IAAI,GAAG,EAAE,WAAW,gBAAgB,aAAa,mBAClD;;AAGD,MAAa,UAAsB,MACjC,eAAe,UAAU,EACzB,IAAI,GAAG,EAAE,QAAQ,gBAAgB,UAAU,mBAC5C;;AAGD,MAAa,WAAuB,MAClC,eAAe,WAAW,EAC1B,IAAI,GAAG,EAAE,SAAS,gBAAgB,WAAW,kBAC9C;;AAGD,MAAa,OAAmB,MAC9B,eAAe,OAAO,EACtB,IAAI,GAAG,EAAE,KAAK,gBAAgB,OAAO,wBACtC;;AAGD,MAAa,OAAmB,MAC9B,eAAe,OAAO,EACtB,IAAI,GAAG,EAAE,KAAK,gBAAgB,OAAO,4CACtC;;AAGD,MAAa,QAAoB,MAC/B,eAAe,QAAQ,EACvB,IAAI,GAAG,EAAE,MAAM,gBAAgB,QAAQ,8CACxC;;AAGD,MAAa,SAAqB,MAChC,eAAe,SAAS,EACxB,IAAI,GAAG,EAAE,OAAO,gBAAgB,SAAS,iBAC1C;;;;;;;AC5JD,MAAM,oBAAoB,OAAO,IAAI,uBAAuB;;;;;AA2B5D,SAAS,cAAc,OAAuB;CAC5C,MAAM,QAAQ,MAAM,MAAM,+BAA+B;AACzD,KAAI,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,MAAM,GAAI,QAAO;CAE7C,MAAM,MAAM,WAAW,MAAM,GAAG;CAChC,MAAM,OAAO,MAAM;AAGnB,QAAO,IAAI,MAAM,KAAM,QAAQ,EAAE,GAAG;;;;;;;;;;;;;;;;;;;;;;AAuBtC,SAAgB,kBACd,YACmB;CACnB,MAAM,SAAwC,EAAE;AAEhD,MAAK,MAAM,OAAO,OAAO,KAAK,WAAW,EAAE;EACzC,MAAM,QAAQ,WAAW;EACzB,MAAM,WAAW,cAAc,MAAM;AAErC,SAAO,OAAO;GACZ;GACA,KAAK,eAAe,MAAM;GAC1B,KAAK,eAAe,SAAS;GAC7B,WAAW;AACT,WAAO,KAAK;;GAEf;;AAGH,QAAO;;;;;AAMT,MAAa,cAMR,kBAAkB;CACrB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;CACR,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCF,SAAgB,MAAM,OAA+B,GAAG,QAAkC;CAOxF,MAAM,QAAoB;EACxB,QAAQ;EACR,GAAG;EACH,eALU,UAJK,OAAO,UAAU,WAAW,QAAQ,MAAM,UAAU,CAItC,MADd,OAAO,KAAK,MAAM,KAAK,EAAE,gBAAgB,CAAC,KAAK,KAAK,CACvB;EAM5C,eAAe;EACf,WAAW;AACT,UAAO;;EAEV;AACD,QAAO,eAAe,OAAO,mBAAmB,EAAE,OAAO,MAAM,CAAC;AAChE,QAAO;;;;;;;;;;;;AAaT,SAAgB,UAAU,OAAe,GAAG,QAAkC;CAI5E,MAAM,QAAoB;EACxB,QAAQ;EACR,GAAG;EACH,eALU,cAAc,MAAM,MADf,OAAO,KAAK,MAAM,KAAK,EAAE,gBAAgB,CAAC,KAAK,KAAK,CACtB;EAM7C,eAAe;EACf,WAAW;AACT,UAAO;;EAEV;AACD,QAAO,eAAe,OAAO,mBAAmB,EAAE,OAAO,MAAM,CAAC;AAChE,QAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"src-iC-NFwTy.mjs","names":["isPlainObject","logger","viteBuild"],"sources":["../../ssr/src/render.ts","../../ssr/src/lru-cache.ts","../../logger/src/logger.tsx","../../ssr/src/virtual-modules.ts","../../ssr/src/app.ts","../../ssr/src/vite-builder.ts","../../ssr/src/vite-router.ts","../../ssr/src/collector.ts"],"sourcesContent":["import type { JSXNode, VNode } from \"@semajsx/core\";\nimport type {\n IslandMetadata,\n IslandScriptTransformer,\n RenderToStringOptions,\n SSRResult,\n} from \"./shared/types\";\nimport { Fragment } from \"@semajsx/core\";\nimport { getIslandMetadata, isIslandVNode } from \"./client/island\";\nimport { STYLE_MARKER, LINK_MARKER, ASSET_MARKER } from \"./client/resource\";\nimport { isSignal, unwrap } from \"@semajsx/signal\";\n\n/**\n * Render context for collecting islands during traversal\n */\ninterface RenderContext {\n islands: IslandMetadata[];\n islandCounter: number;\n islandBasePath: string;\n // Whether to generate hydration markers (only when transformer is provided)\n enableHydration: boolean;\n // Cache for component render results to avoid duplicate rendering\n renderCache: WeakMap<VNode, string>;\n // Collected CSS file paths\n css: Set<string>;\n // Collected asset file paths\n assets: Set<string>;\n // Root directory for computing component keys\n rootDir: string;\n}\n\n/**\n * Render a VNode tree to an HTML string with island support\n *\n * @param vnode - The VNode tree to render\n * @param options - Rendering options\n * @returns SSR result with HTML and island metadata\n *\n * @example\n * ```tsx\n * // Static HTML only (no client-side scripts)\n * const result = renderToString(<App />)\n * console.log(result.html) // HTML string\n * console.log(result.islands) // Island metadata\n * console.log(result.scripts) // Empty string\n *\n * // With custom hydration scripts\n * const result = renderToString(<App />, {\n * transformIslandScript: (island) => {\n * return `<script type=\"module\" src=\"${island.basePath}/${island.id}.js\"></script>`\n * }\n * })\n * ```\n */\nexport async function renderToString(\n vnode: VNode,\n options: RenderToStringOptions = {},\n): Promise<SSRResult> {\n const { transformIslandScript, rootDir = process.cwd() } = options;\n\n // Fixed path for all static assets under /_semajsx/ namespace\n const islandBasePath = \"/_semajsx/islands\";\n\n // Create render context to collect islands during single traversal\n const context: RenderContext = {\n islands: [],\n islandCounter: 0,\n islandBasePath,\n // Only enable hydration markers when transformer is provided\n enableHydration: !!transformIslandScript,\n renderCache: new WeakMap(),\n css: new Set(),\n assets: new Set(),\n rootDir,\n };\n\n // Render HTML and collect islands in one pass (fixes duplicate rendering)\n const html = await renderVNodeToHTML(vnode, context);\n\n // Generate script tags for islands (only if transformer is provided)\n const scripts = generateIslandScripts(context.islands, islandBasePath, transformIslandScript);\n\n return {\n html,\n islands: context.islands,\n scripts,\n css: Array.from(context.css),\n assets: Array.from(context.assets),\n };\n}\n\n/**\n * Serialize props for island hydration\n */\nfunction serializeProps(props: any): Record<string, any> {\n if (!props || typeof props !== \"object\") {\n return {};\n }\n\n const serialized: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(props)) {\n // Skip children - they will be rendered separately\n if (key === \"children\" || key === \"key\" || key === \"ref\") {\n continue;\n }\n\n // Skip functions (event handlers, callbacks)\n if (typeof value === \"function\") {\n continue;\n }\n\n // Skip symbols\n if (typeof value === \"symbol\") {\n continue;\n }\n\n // Skip undefined\n if (value === undefined) {\n continue;\n }\n\n // Handle signals - serialize their current value\n if (isSignal(value)) {\n serialized[key] = unwrap(value);\n continue;\n }\n\n // Handle null, boolean, number, string\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"number\" ||\n typeof value === \"string\"\n ) {\n serialized[key] = value;\n continue;\n }\n\n // Handle arrays and plain objects\n if (Array.isArray(value) || isPlainObject(value)) {\n try {\n // Test if it's JSON-serializable\n JSON.stringify(value);\n serialized[key] = value;\n } catch (error) {\n console.warn(`Cannot serialize prop \"${key}\":`, error);\n }\n continue;\n }\n\n console.warn(`Skipping non-serializable prop \"${key}\" of type ${typeof value}`);\n }\n\n return serialized;\n}\n\n/**\n * Check if a value is an async iterator\n */\nfunction isAsyncIterator(value: any): value is AsyncIterableIterator<any> {\n return (\n value &&\n typeof value === \"object\" &&\n (typeof value[Symbol.asyncIterator] === \"function\" ||\n (typeof value.next === \"function\" && typeof value.return === \"function\"))\n );\n}\n\n/**\n * Render VNode to HTML string\n */\nasync function renderVNodeToHTML(vnode: VNode | JSXNode, context: RenderContext): Promise<string> {\n // Handle null/undefined\n if (vnode == null) {\n return \"\";\n }\n\n // Handle signals\n if (isSignal(vnode)) {\n return renderVNodeToHTML(unwrap(vnode), context);\n }\n\n // Handle primitives\n if (typeof vnode === \"string\" || typeof vnode === \"number\") {\n return escapeHTML(String(vnode));\n }\n\n if (typeof vnode === \"boolean\") {\n return \"\";\n }\n\n // Handle arrays\n if (Array.isArray(vnode)) {\n const results = await Promise.all(vnode.map((child) => renderVNodeToHTML(child, context)));\n return results.join(\"\");\n }\n\n // Must be a VNode at this point\n if (typeof vnode !== \"object\" || !(\"type\" in vnode)) {\n return \"\";\n }\n\n const vnodeTyped = vnode as VNode;\n\n // Handle text nodes\n if (vnodeTyped.type === \"#text\") {\n return escapeHTML(String(vnodeTyped.props?.nodeValue || \"\"));\n }\n\n // Handle signal nodes - unwrap and render the signal's value\n if (vnodeTyped.type === \"#signal\") {\n const signal = vnodeTyped.props?.signal;\n if (signal && isSignal<VNode>(signal)) {\n const unwrapped = unwrap(signal);\n const rendered = await renderVNodeToHTML(unwrapped, context);\n // If signal renders to empty content, use a comment marker for hydration\n // This ensures the client can find a DOM node to attach the signal subscription to\n return rendered || \"<!--signal-empty-->\";\n }\n return \"<!--signal-empty-->\";\n }\n\n // Handle islands - render content AND mark for hydration\n if (isIslandVNode(vnodeTyped)) {\n return renderIsland(vnodeTyped, context);\n }\n\n // Handle Style resource - collect CSS path, render nothing\n if (vnodeTyped.type === STYLE_MARKER) {\n const href = vnodeTyped.props?.href;\n if (href && typeof href === \"string\") {\n context.css.add(href);\n }\n return \"\";\n }\n\n // Handle Link resource - collect CSS path for stylesheets\n if (vnodeTyped.type === LINK_MARKER) {\n const href = vnodeTyped.props?.href;\n const rel = vnodeTyped.props?.rel;\n if (href && typeof href === \"string\" && rel === \"stylesheet\") {\n context.css.add(href);\n }\n return \"\";\n }\n\n // Handle Asset resource - collect asset path\n if (vnodeTyped.type === ASSET_MARKER) {\n const src = vnodeTyped.props?.src;\n if (src && typeof src === \"string\") {\n context.assets.add(src);\n }\n return \"\";\n }\n\n // Handle fragments\n if (vnodeTyped.type === Fragment) {\n const results = await Promise.all(\n vnodeTyped.children.map((child: JSXNode) => renderVNodeToHTML(child, context)),\n );\n return results.join(\"\");\n }\n\n // Handle function components\n if (typeof vnodeTyped.type === \"function\") {\n try {\n // Pass children to component as part of props\n const props =\n vnodeTyped.children && vnodeTyped.children.length > 0\n ? { ...vnodeTyped.props, children: vnodeTyped.children }\n : vnodeTyped.props || {};\n\n let result: any = vnodeTyped.type(props);\n\n // Handle async component - await the Promise\n if (result instanceof Promise) {\n result = await result;\n }\n\n // Handle async iterator - take only the first yield\n if (isAsyncIterator(result)) {\n const { value } = await result.next();\n result = value;\n }\n\n // Handle signal return - unwrap the value\n if (isSignal(result)) {\n result = unwrap(result);\n }\n\n return renderVNodeToHTML(result, context);\n } catch (error) {\n console.error(\"Error rendering component:\", error);\n // Return error fallback\n return renderErrorFallback(error, vnodeTyped);\n }\n }\n\n // Handle DOM elements\n if (typeof vnodeTyped.type === \"string\") {\n return renderElement(vnodeTyped, context);\n }\n\n return \"\";\n}\n\n/**\n * Check if a VNode result is a single DOM element (not Fragment, array, or primitive)\n */\nfunction isSingleElement(result: VNode | JSXNode): result is VNode {\n if (result == null || typeof result !== \"object\") {\n return false;\n }\n if (Array.isArray(result)) {\n return false;\n }\n if (!(\"type\" in result)) {\n return false;\n }\n const vnode = result as VNode;\n // Must be a string type (DOM element), not Fragment or function component\n return typeof vnode.type === \"string\";\n}\n\n/**\n * Generate a component key from path for use as identifier\n * Example: \"/home/user/project/src/components/Counter.tsx\" -> \"components/Counter\"\n */\nfunction getComponentKey(componentPath: string, rootDir: string): string {\n // Convert file:// URL to path\n let path = componentPath;\n if (path.startsWith(\"file://\")) {\n path = new URL(path).pathname;\n }\n\n // Make relative to root and remove src/ prefix\n if (path.startsWith(rootDir)) {\n path = path.slice(rootDir.length);\n }\n path = path.replace(/^\\/?(src\\/)?/, \"\");\n\n // Remove extension\n path = path.replace(/\\.\\w+$/, \"\");\n\n // Sanitize for use as attribute value\n path = path.replace(/[^a-zA-Z0-9/_-]/g, \"_\");\n\n return path;\n}\n\n/**\n * Inject island attributes into the first tag of rendered HTML\n */\nfunction injectIslandAttrs(\n html: string,\n islandId: string,\n componentKey: string,\n propsJson: string,\n): string {\n // Find the first > of the opening tag\n const firstTagEnd = html.indexOf(\">\");\n if (firstTagEnd === -1) {\n return html;\n }\n\n const escapedProps = escapeHTML(propsJson);\n const attrs = ` data-island-id=\"${islandId}\" data-island-src=\"${componentKey}\" data-island-props=\"${escapedProps}\"`;\n\n // Handle self-closing tags\n if (html[firstTagEnd - 1] === \"/\") {\n return html.slice(0, firstTagEnd - 1) + attrs + \" />\" + html.slice(firstTagEnd + 1);\n }\n\n return html.slice(0, firstTagEnd) + attrs + html.slice(firstTagEnd);\n}\n\n/**\n * Render an island component\n * - Renders the full HTML content on server (for SEO and no-JS users)\n * - If hydration disabled: renders as plain HTML (no markers)\n * - If hydration enabled: adds markers for client-side hydration\n */\nasync function renderIsland(vnode: VNode, context: RenderContext): Promise<string> {\n const metadata = getIslandMetadata(vnode);\n if (!metadata) {\n return \"\";\n }\n\n // Extract component name for better debugging\n const componentName =\n typeof metadata.component === \"function\" ? metadata.component.name || \"Anonymous\" : \"Unknown\";\n\n // Render the island's content on the server\n let content = \"\";\n let result: any;\n try {\n result = metadata.component(metadata.props || {});\n\n // Handle async component - await the Promise\n if (result instanceof Promise) {\n result = await result;\n }\n\n // Handle async iterator - take only the first yield\n if (isAsyncIterator(result)) {\n const { value } = await result.next();\n result = value;\n }\n\n // Handle signal return - unwrap the value\n if (isSignal(result)) {\n result = unwrap(result);\n }\n\n content = await renderVNodeToHTML(result, context);\n } catch (error) {\n console.error(`[SSR] Error rendering island (${componentName}):`, error);\n return renderErrorFallback(error, vnode);\n }\n\n // If hydration is disabled, just return the plain HTML\n if (!context.enableHydration) {\n return content;\n }\n\n // Generate unique island ID using component name\n const islandId = generateIslandId(componentName, context.islandCounter++);\n\n // Generate component key for grouping islands by component\n const componentKey = getComponentKey(metadata.modulePath, context.rootDir);\n\n // Serialize props for hydration\n const serializedProps = serializeProps(metadata.props);\n\n // Store island metadata\n const islandMetadata: IslandMetadata = {\n id: islandId,\n path: metadata.modulePath,\n props: serializedProps,\n componentName,\n };\n context.islands.push(islandMetadata);\n\n const propsJson = JSON.stringify(serializedProps);\n\n // Single DOM element: inject attrs directly (no wrapper div)\n if (isSingleElement(result)) {\n return injectIslandAttrs(content, islandId, componentKey, propsJson);\n }\n\n // Fragment or other: use comment markers + script tag\n // Use unique end marker to support nested islands\n return `<!--island:${islandId}-->${content}<!--/island:${islandId}--><script type=\"application/json\" data-island=\"${islandId}\" data-island-src=\"${componentKey}\">${propsJson}</script>`;\n}\n\n/**\n * Render a DOM element to HTML\n */\nasync function renderElement(vnode: VNode, context: RenderContext): Promise<string> {\n const tag = vnode.type as string;\n const props = vnode.props || {};\n\n // Handle dangerouslySetInnerHTML\n if (props.dangerouslySetInnerHTML?.__html != null) {\n const attrs = renderAttributes(props);\n return `<${tag}${attrs}>${props.dangerouslySetInnerHTML.__html}</${tag}>`;\n }\n\n // Self-closing tags\n const selfClosing = [\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\n // Build attributes\n const attrs = renderAttributes(props);\n\n // Self-closing tag\n if (selfClosing.includes(tag)) {\n return `<${tag}${attrs} />`;\n }\n\n // Regular tag with children\n const childResults = await Promise.all(\n (vnode.children || []).map((child: JSXNode) => renderVNodeToHTML(child, context)),\n );\n const children = childResults.join(\"\");\n\n return `<${tag}${attrs}>${children}</${tag}>`;\n}\n\n/**\n * Render element attributes\n */\nfunction renderAttributes(props: Record<string, any>): string {\n const attrs: string[] = [];\n\n for (const [key, value] of Object.entries(props)) {\n // Skip special props\n if (key === \"children\" || key === \"key\" || key === \"ref\" || key === \"dangerouslySetInnerHTML\") {\n continue;\n }\n\n // Skip event handlers\n if (key.startsWith(\"on\")) {\n continue;\n }\n\n // Skip functions\n if (typeof value === \"function\") {\n continue;\n }\n\n // Skip null/undefined\n if (value == null) {\n continue;\n }\n\n // Handle signals\n let attrValue = value;\n if (isSignal(value)) {\n attrValue = unwrap(value);\n }\n\n // Boolean attributes\n if (typeof attrValue === \"boolean\") {\n if (attrValue) {\n attrs.push(key);\n }\n continue;\n }\n\n // Handle className -> class\n const attrName = key === \"className\" ? \"class\" : key;\n\n // Handle style object\n if (attrName === \"style\" && typeof attrValue === \"object\") {\n const styleStr = Object.entries(attrValue)\n .map(([k, v]) => `${camelToKebab(k)}: ${v}`)\n .join(\"; \");\n attrs.push(`style=\"${escapeHTML(styleStr)}\"`);\n continue;\n }\n\n // Regular attributes\n attrs.push(`${attrName}=\"${escapeHTML(String(attrValue))}\"`);\n }\n\n return attrs.length > 0 ? \" \" + attrs.join(\" \") : \"\";\n}\n\n/**\n * Generate script tags for loading islands\n *\n * If no transformer is provided, returns empty string (static HTML only).\n * If transformer is provided, calls it for each island to generate custom scripts.\n */\nfunction generateIslandScripts(\n islands: IslandMetadata[],\n basePath: string,\n transformer?: IslandScriptTransformer,\n): string {\n // No islands or no transformer = no scripts (static HTML only)\n if (islands.length === 0 || !transformer) {\n return \"\";\n }\n\n const scripts: string[] = [];\n\n for (const island of islands) {\n const script = transformer({\n id: island.id,\n path: island.path,\n props: island.props,\n componentName: island.componentName || \"Unknown\",\n basePath,\n });\n\n if (script) {\n scripts.push(script);\n }\n }\n\n return scripts.join(\"\\n\");\n}\n\n/**\n * Render error fallback\n */\nfunction renderErrorFallback(error: any, vnode?: VNode): string {\n const message = error?.message || String(error);\n const componentName = vnode && typeof vnode.type === \"function\" ? vnode.type.name : \"Unknown\";\n\n return `<div style=\"border: 2px solid red; padding: 10px; margin: 10px; background: #fee;\">\n <strong>Error rendering component: ${escapeHTML(componentName)}</strong>\n <pre>${escapeHTML(message)}</pre>\n </div>`;\n}\n\n/**\n * Generate a unique island ID from component name and counter\n * Examples: \"Counter-0\", \"todo-list-1\", \"my-component-2\"\n */\nfunction generateIslandId(componentName: string, counter: number): string {\n // Convert to kebab-case and sanitize for use as HTML attribute\n const kebabName = camelToKebab(componentName)\n .toLowerCase()\n // Remove leading dash if component name started with uppercase\n .replace(/^-/, \"\")\n // Replace any non-alphanumeric characters (except dash) with dash\n .replace(/[^a-z0-9-]/g, \"-\")\n // Remove consecutive dashes\n .replace(/-+/g, \"-\")\n // Remove trailing dashes\n .replace(/-$/, \"\");\n\n return `${kebabName}-${counter}`;\n}\n\n/**\n * Escape HTML special characters\n */\nfunction escapeHTML(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\n/**\n * Convert camelCase to kebab-case\n */\nfunction camelToKebab(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n\n/**\n * Check if a value is a plain object\n */\nfunction isPlainObject(value: any): boolean {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n","/**\n * Simple LRU (Least Recently Used) Cache\n * Prevents memory leaks by limiting cache size and evicting old entries\n */\n\nexport class LRUCache<K, V> {\n private cache = new Map<K, V>();\n private maxSize: number;\n\n constructor(maxSize: number = 1000) {\n this.maxSize = maxSize;\n }\n\n /**\n * Get a value from the cache\n * Moves the key to the end (marks as recently used)\n */\n get(key: K): V | undefined {\n const value = this.cache.get(key);\n\n if (value !== undefined) {\n // Move to end (most recently used)\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n\n return value;\n }\n\n /**\n * Set a value in the cache\n * Evicts oldest entry if cache is full\n */\n set(key: K, value: V): void {\n // If key exists, delete it first so we can re-add at the end\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n // Add to end (most recently used)\n this.cache.set(key, value);\n\n // Evict oldest if over capacity\n if (this.cache.size > this.maxSize) {\n // First key is the oldest (least recently used)\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.cache.delete(oldestKey);\n }\n }\n }\n\n /**\n * Check if key exists in cache\n */\n has(key: K): boolean {\n return this.cache.has(key);\n }\n\n /**\n * Delete a key from cache\n */\n delete(key: K): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get current cache size\n */\n get size(): number {\n return this.cache.size;\n }\n\n /**\n * Get all keys (for debugging)\n */\n keys(): IterableIterator<K> {\n return this.cache.keys();\n }\n\n /**\n * Get all values (for debugging)\n */\n values(): IterableIterator<V> {\n return this.cache.values();\n }\n}\n","/** @jsxImportSource @semajsx/terminal */\n\n/**\n * Logger - A rich terminal logging utility built on SemaJSX terminal\n *\n * Features:\n * - Beautiful visual styling with colors and icons\n * - Structured logging with tables and progress bars\n * - Grouping and indentation\n * - Performance timing\n * - Tag/label support\n * - JSX content support\n */\n\nimport type { VNode } from \"@semajsx/core\";\nimport { print } from \"@semajsx/terminal\";\nimport type {\n GroupOptions,\n LogData,\n LoggerOptions,\n LogLevel,\n LogLevelConfig,\n ProgressOptions,\n TableOptions,\n TimerResult,\n} from \"./types\";\n\n/**\n * Default log level configurations\n */\nconst DEFAULT_LEVEL_CONFIG: Record<LogLevel, LogLevelConfig> = {\n debug: { icon: \"?\", color: \"gray\", bold: false },\n info: { icon: \"i\", color: \"cyan\", bold: false },\n success: { icon: \"+\", color: \"green\", bold: true },\n warn: { icon: \"!\", color: \"yellow\", bold: true },\n error: { icon: \"x\", color: \"red\", bold: true, borderColor: \"red\" },\n};\n\n/**\n * Log level priorities (for filtering)\n */\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n success: 2,\n warn: 3,\n error: 4,\n};\n\n/**\n * Logger class\n */\nexport class Logger {\n private options: Required<Omit<LoggerOptions, \"levelConfig\" | \"timestampFormat\">> & {\n timestampFormat: () => string;\n levelConfig: Record<LogLevel, LogLevelConfig>;\n };\n private groupDepth = 0;\n private tags: string[] = [];\n private groupStack: Array<{\n title: string;\n color: string;\n bordered: boolean;\n }> = [];\n\n constructor(options: LoggerOptions = {}) {\n this.options = {\n timestamp: options.timestamp ?? true,\n timestampFormat: options.timestampFormat || (() => new Date().toLocaleTimeString()),\n showLevel: options.showLevel ?? true,\n minLevel: options.minLevel || \"debug\",\n prefix: options.prefix || \"\",\n stream: options.stream || process.stdout,\n bordered: options.bordered || false,\n levelConfig: this.mergeLevelConfig(options.levelConfig),\n };\n }\n\n /**\n * Merge custom level config with defaults\n */\n private mergeLevelConfig(\n custom?: Partial<Record<LogLevel, Partial<LogLevelConfig>>>,\n ): Record<LogLevel, LogLevelConfig> {\n if (!custom) return DEFAULT_LEVEL_CONFIG;\n\n const merged = { ...DEFAULT_LEVEL_CONFIG };\n for (const [level, config] of Object.entries(custom)) {\n merged[level as LogLevel] = {\n ...DEFAULT_LEVEL_CONFIG[level as LogLevel],\n ...config,\n };\n }\n return merged;\n }\n\n /**\n * Check if log level should be displayed\n */\n private shouldLog(level: LogLevel): boolean {\n return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[this.options.minLevel];\n }\n\n /**\n * Format log data to string\n */\n private formatData(data: LogData): string {\n if (typeof data === \"string\") {\n return data;\n }\n if (typeof data === \"object\" && \"type\" in data) {\n // It's a VNode, can't stringify\n return \"[JSX Content]\";\n }\n // Format JSON with newline before opening brace\n const json = JSON.stringify(data, null, 2);\n return \"\\n\" + json;\n }\n\n /**\n * Core log method\n */\n private log(level: LogLevel, data: LogData, ...args: LogData[]): void {\n if (!this.shouldLog(level)) return;\n\n const config = this.options.levelConfig[level];\n\n // Build log parts\n const parts: VNode[] = [];\n\n // Timestamp\n if (this.options.timestamp) {\n parts.push(\n <text dim marginRight={1}>\n [{this.options.timestampFormat()}]\n </text>,\n );\n }\n\n // Level with icon\n if (this.options.showLevel) {\n parts.push(\n <text color={config.color} bold={config.bold} marginRight={1}>\n {config.icon} {level.toUpperCase()}\n </text>,\n );\n }\n\n // Prefix\n if (this.options.prefix) {\n parts.push(\n <text marginRight={1} color=\"magenta\" bold>\n [{this.options.prefix}]\n </text>,\n );\n }\n\n // Tags\n if (this.tags.length > 0) {\n parts.push(\n <text marginRight={1} color=\"blue\">\n {this.tags.map((tag) => `#${tag}`).join(\" \")}\n </text>,\n );\n }\n\n // Main content\n if (typeof data === \"object\" && \"type\" in data) {\n // It's JSX - render it directly\n parts.push(data as VNode);\n } else {\n const content = this.formatData(data);\n parts.push(<text>{content}</text>);\n }\n\n // Additional arguments\n if (args.length > 0) {\n for (const arg of args) {\n const formatted = this.formatData(arg);\n parts.push(\n <text marginLeft={1} dim>\n {formatted}\n </text>,\n );\n }\n }\n\n // Render the log\n const logContent = <box flexDirection=\"row\">{parts}</box>;\n\n if (this.options.bordered && config.borderColor) {\n print(\n <box border=\"round\" borderColor={config.borderColor} paddingInline={1}>\n {logContent}\n </box>,\n { stream: this.options.stream },\n );\n } else {\n print(logContent, { stream: this.options.stream });\n }\n }\n\n /**\n * Debug log\n */\n debug(data: LogData, ...args: LogData[]): this {\n this.log(\"debug\", data, ...args);\n return this;\n }\n\n /**\n * Info log\n */\n info(data: LogData, ...args: LogData[]): this {\n this.log(\"info\", data, ...args);\n return this;\n }\n\n /**\n * Success log\n */\n success(data: LogData, ...args: LogData[]): this {\n this.log(\"success\", data, ...args);\n return this;\n }\n\n /**\n * Warning log\n */\n warn(data: LogData, ...args: LogData[]): this {\n this.log(\"warn\", data, ...args);\n return this;\n }\n\n /**\n * Error log\n */\n error(data: LogData, ...args: LogData[]): this {\n this.log(\"error\", data, ...args);\n return this;\n }\n\n /**\n * Start a log group\n */\n group(title: string, options: GroupOptions = {}): this {\n const { bordered = false, borderColor = \"cyan\" } = options;\n\n // Store group info for groupEnd\n this.groupStack.push({ title, color: borderColor, bordered });\n\n if (bordered) {\n // Bordered style - box with title\n print(\n <box border=\"round\" borderColor={borderColor} paddingInline={1}>\n <text bold color={borderColor}>\n {title}\n </text>\n </box>,\n { stream: this.options.stream },\n );\n } else {\n // Default style - title with underline\n print(\n <box flexDirection=\"column\">\n <text bold color={borderColor}>\n {title}\n </text>\n <text color={borderColor} dim>\n {\"─\".repeat(Math.min(title.length, 50))}\n </text>\n </box>,\n { stream: this.options.stream },\n );\n }\n\n this.groupDepth++;\n return this;\n }\n\n /**\n * End a log group\n */\n groupEnd(): this {\n if (this.groupDepth > 0) {\n this.groupDepth--;\n\n // Pop group info and draw closing line (only for non-bordered groups)\n const groupInfo = this.groupStack.pop();\n if (groupInfo && !groupInfo.bordered) {\n print(\n <text color={groupInfo.color} dim>\n {\"─\".repeat(Math.min(groupInfo.title.length, 50))}\n </text>,\n { stream: this.options.stream },\n );\n }\n }\n return this;\n }\n\n /**\n * Add tags to subsequent logs\n */\n withTags(...tags: string[]): Logger {\n const newLogger = new Logger(this.options);\n newLogger.groupDepth = this.groupDepth;\n newLogger.tags = [...this.tags, ...tags];\n newLogger.groupStack = [...this.groupStack];\n return newLogger;\n }\n\n /**\n * Create a child logger with a prefix\n */\n child(prefix: string): Logger {\n return new Logger({\n ...this.options,\n prefix: this.options.prefix ? `${this.options.prefix}:${prefix}` : prefix,\n });\n }\n\n /**\n * Log a table\n */\n table(data: Record<string, unknown>[], options: TableOptions = {}): this {\n const { headers, border = \"single\", borderColor = \"cyan\", headerSeparator = true } = options;\n\n if (data.length === 0) {\n this.info(\"Empty table\");\n return this;\n }\n\n // Get headers from first row if not provided\n const cols = headers || Object.keys(data[0] || {});\n\n const rows: VNode[] = [];\n\n // Header row\n if (headerSeparator) {\n const headerRow = (\n <box flexDirection=\"row\">\n {cols.map((col) => (\n <text bold color={borderColor} width={20}>\n {col}\n </text>\n ))}\n </box>\n );\n rows.push(headerRow);\n\n // Separator\n rows.push(<text dim>{\"-\".repeat(cols.length * 20)}</text>);\n }\n\n // Data rows\n for (const row of data) {\n const dataRow = (\n <box flexDirection=\"row\">\n {cols.map((col) => (\n <text width={20}>{String(row[col] ?? \"\")}</text>\n ))}\n </box>\n );\n rows.push(dataRow);\n }\n\n print(\n <box flexDirection=\"column\" border={border} borderColor={borderColor} paddingInline={1}>\n {rows}\n </box>,\n { stream: this.options.stream },\n );\n\n return this;\n }\n\n /**\n * Show a progress bar\n */\n progress(current: number, total: number, label?: string, options: ProgressOptions = {}): this {\n const {\n width = 40,\n char = \"█\",\n emptyChar = \"░\",\n showPercentage = true,\n color = \"green\",\n } = options;\n\n const percentage = Math.min(100, Math.max(0, (current / total) * 100));\n const filled = Math.floor((percentage / 100) * width);\n const empty = width - filled;\n\n const bar = char.repeat(filled) + emptyChar.repeat(empty);\n\n const content = (\n <box flexDirection=\"row\" alignItems=\"center\">\n {label && (\n <text marginRight={2} bold>\n {label}\n </text>\n )}\n <text color={color}>{bar}</text>\n {showPercentage && (\n <text marginLeft={2} bold color={color}>\n {percentage.toFixed(1)}%\n </text>\n )}\n <text marginLeft={2} dim>\n ({current}/{total})\n </text>\n </box>\n );\n\n print(content, { stream: this.options.stream });\n\n return this;\n }\n\n /**\n * Start a timer\n */\n time(label: string): TimerResult {\n const startTime = Date.now();\n\n return {\n end: (message?: string) => {\n const duration = Date.now() - startTime;\n this.info(\n <box flexDirection=\"row\">\n <text bold color=\"magenta\">\n ⏱ {label}\n </text>\n <text marginLeft={1}>took</text>\n <text marginLeft={1} bold color=\"cyan\">\n {duration}ms\n </text>\n {message && <text marginLeft={1}>- {message}</text>}\n </box>,\n );\n },\n elapsed: () => Date.now() - startTime,\n };\n }\n\n /**\n * Measure execution time of a function\n */\n async measure<T>(label: string, fn: () => T | Promise<T>): Promise<T> {\n const timer = this.time(label);\n try {\n const result = await fn();\n timer.end(\"✓ completed\");\n return result;\n } catch (error) {\n timer.end(\"✗ failed\");\n throw error;\n }\n }\n\n /**\n * Log a separator line\n */\n separator(char = \"─\", color = \"gray\"): this {\n print(<text color={color}>{char.repeat(80)}</text>, {\n stream: this.options.stream,\n });\n return this;\n }\n\n /**\n * Log a blank line\n */\n blank(): this {\n print(<text></text>, { stream: this.options.stream });\n return this;\n }\n\n /**\n * Raw JSX log (for custom content)\n */\n jsx(content: VNode): this {\n print(content, { stream: this.options.stream });\n return this;\n }\n}\n\n/**\n * Create a new logger instance\n */\nexport function createLogger(options: LoggerOptions = {}): Logger {\n return new Logger(options);\n}\n\n/**\n * Default logger instance\n */\nexport const logger: Logger = createLogger();\n","/**\n * Virtual modules plugin for Vite\n *\n * Allows build entries to be virtual (in-memory) instead of on disk.\n */\n\nimport { resolve, dirname } from \"path\";\nimport type { Plugin } from \"vite\";\n\nexport interface VirtualModulesOptions {\n [id: string]: string;\n}\n\n/**\n * Create a Vite plugin for virtual modules\n */\nexport function virtualModules(modules: VirtualModulesOptions): Plugin {\n // Map to store resolved paths (will be built in configResolved)\n const resolvedIds = new Map<string, string>();\n\n // Find module content by trying multiple id variations\n function find(id: string): string | undefined {\n return (\n modules[id] || modules[id.replace(/^\\//, \"\")] || modules[`/${id}`] || resolvedIds.get(id)\n );\n }\n\n let viteRoot = process.cwd();\n\n return {\n name: \"semajsx-virtual-modules\",\n enforce: \"pre\",\n\n configResolved(config) {\n viteRoot = config.root;\n\n // Build resolvedIds with the correct root\n Object.keys(modules).forEach((id) => {\n const resolved = resolve(viteRoot, id);\n resolvedIds.set(resolved, modules[id]!);\n });\n },\n\n resolveId(id, importer) {\n // Direct match or variations\n const content = find(id);\n if (content) {\n // Return resolved absolute path relative to Vite root\n return resolve(viteRoot, id);\n }\n\n // Try resolving relative imports from importer first\n if (importer) {\n const abs = resolve(dirname(importer), id);\n if (resolvedIds.has(abs)) {\n return abs;\n }\n }\n\n // For bare specifiers (not starting with /, ./, or ../),\n // try resolving against viteRoot\n if (!id.startsWith(\"/\") && !id.startsWith(\"./\") && !id.startsWith(\"../\")) {\n const absoluteId = resolve(viteRoot, id);\n if (modules[absoluteId] || resolvedIds.has(absoluteId)) {\n return absoluteId;\n }\n }\n\n return null;\n },\n\n load(id) {\n // First try direct find\n let content = find(id);\n if (content) {\n return content;\n }\n\n // Try finding by the resolved path\n if (resolvedIds.has(id)) {\n return resolvedIds.get(id);\n }\n\n return null;\n },\n };\n}\n","/**\n * App - Main entry point for SemaJSX server applications\n *\n * Provides a unified API for:\n * - Route management\n * - SSR rendering with islands\n * - Development server with Vite\n * - Production builds\n */\n\nimport { createServer, build as viteBuild, mergeConfig } from \"vite\";\nimport type { ViteDevServer, UserConfig as ViteUserConfig } from \"vite\";\nimport { resolve } from \"path\";\nimport { renderToString } from \"./render\";\nimport { renderDocument } from \"./document\";\nimport { LRUCache } from \"./lru-cache\";\nimport { createLogger } from \"@semajsx/logger\";\nimport { virtualModules } from \"./virtual-modules\";\nimport type {\n App,\n AppConfig,\n BuildOptions,\n BuildResult,\n DevOptions,\n IslandMetadata,\n RenderResult,\n RouteContext,\n RouteHandler,\n RouteMeta,\n} from \"./shared/types\";\n\nconst logger = createLogger({ prefix: \"App\" });\n\n/**\n * Internal App implementation\n */\nclass AppImpl implements App {\n readonly config: AppConfig;\n\n private _routes: Map<string, RouteHandler> = new Map();\n private _routeMeta: Map<string, RouteMeta> = new Map();\n private _viteServer: ViteDevServer | null = null;\n private _islandCache: LRUCache<string, IslandMetadata>;\n private _initialized = false;\n\n constructor(config: AppConfig = {}) {\n this.config = {\n root: process.cwd(),\n ...config,\n islands: {\n cache: true,\n cacheSize: 1000,\n ...config.islands,\n },\n };\n\n this._islandCache = new LRUCache(this.config.islands?.cacheSize ?? 1000);\n\n // Register initial routes\n if (config.routes) {\n this.routes(config.routes);\n }\n }\n\n route(path: string, handler: RouteHandler, meta?: RouteMeta): this {\n this._routes.set(path, handler);\n if (meta) {\n this._routeMeta.set(path, meta);\n }\n return this;\n }\n\n routes(routes: Record<string, RouteHandler>): this {\n for (const [path, handler] of Object.entries(routes)) {\n this._routes.set(path, handler);\n }\n return this;\n }\n\n async prepare(): Promise<void> {\n if (this._initialized) return;\n\n logger.info(\"Initializing app with Vite dev server...\");\n\n const baseViteConfig: ViteUserConfig = {\n root: this.config.root,\n server: {\n middlewareMode: true,\n },\n appType: \"custom\",\n optimizeDeps: {\n // Disable optimization for semajsx to use source directly in development\n exclude: [\"semajsx\", \"@semajsx/core\", \"@semajsx/dom\", \"@semajsx/signal\", \"@semajsx/ssr\"],\n },\n resolve: {\n // Ensure Vite respects package.json \"exports\" field with conditions\n conditions: [\"browser\", \"development\", \"module\", \"import\", \"default\"],\n // Add @ alias for project root\n alias: {\n \"@\": this.config.root || process.cwd(),\n },\n },\n plugins: [this._createVirtualIslandsPlugin()],\n // Exclude problematic native modules from SSR bundling\n ssr: {\n noExternal: [\"@semajsx/core\", \"@semajsx/dom\", \"@semajsx/signal\"],\n external: [\"lightningcss\", \"fsevents\"],\n },\n };\n\n // Merge user Vite config\n const finalConfig = this.config.vite\n ? mergeConfig(baseViteConfig, this.config.vite)\n : baseViteConfig;\n\n this._viteServer = await createServer(finalConfig);\n this._initialized = true;\n\n logger.info(\"App initialized successfully\");\n }\n\n async close(): Promise<void> {\n if (this._viteServer) {\n await this._viteServer.close();\n this._viteServer = null;\n }\n this._initialized = false;\n logger.info(\"App closed\");\n }\n\n async render(path: string): Promise<RenderResult> {\n // Parse path and query string\n const [pathname, queryString] = path.split(\"?\");\n const query: Record<string, string> = {};\n if (queryString) {\n const searchParams = new URLSearchParams(queryString);\n for (const [key, value] of searchParams) {\n query[key] = value;\n }\n }\n\n // Match route\n const { handler, params } = this._matchRoute(pathname || \"/\");\n if (!handler) {\n throw new Error(`No route found for path: ${path}`);\n }\n\n // Execute handler to get VNode\n const context: RouteContext = { params, query };\n const vnode = handler(context);\n\n // Render to string with island detection\n const result = await renderToString(vnode, {\n // Default transformer generates standard script tags\n transformIslandScript: (island) =>\n `<script type=\"module\" src=\"${island.basePath}/${island.id}.js\" async></script>`,\n rootDir: this.config.root,\n });\n\n // Cache islands\n if (this.config.islands?.cache) {\n for (const island of result.islands) {\n this._islandCache.set(island.id, island);\n }\n }\n\n // Render with document template if provided\n if (this.config.document) {\n const documentVNode = this.config.document({\n children: result.html,\n scripts: result.scripts,\n islands: result.islands,\n css: result.css,\n path,\n title: this.config.title,\n meta: this.config.meta,\n });\n\n return {\n ...result,\n document: renderDocument(documentVNode),\n };\n }\n\n return result;\n }\n\n async dev(options: DevOptions = {}): Promise<{ port: number; close: () => Promise<void> }> {\n const { port = 3000, host = \"localhost\", open = false } = options;\n\n await this.prepare();\n\n // Create HTTP server\n const server = Bun.serve({\n port,\n hostname: host,\n fetch: async (req) => this.handleRequest(req),\n });\n\n logger.info(`Development server running at http://${host}:${port}`);\n\n if (open) {\n // Open browser (platform-specific)\n const openCmd =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"start\"\n : \"xdg-open\";\n Bun.spawn([openCmd, `http://${host}:${port}`]);\n }\n\n return {\n port,\n close: async () => {\n server.stop();\n await this.close();\n },\n };\n }\n\n async build(options: BuildOptions = {}): Promise<BuildResult> {\n const {\n outDir = \"dist\",\n mode = \"full\",\n minify = true,\n sourcemap = false,\n onIslandBuilt,\n } = options;\n\n logger.info(`Building for production (mode: ${mode})...`);\n\n const { mkdir } = await import(\"fs/promises\");\n // Ensure rootDir is always absolute\n const rootDir = this.config.root ? resolve(this.config.root) : process.cwd();\n\n // Ensure output directory exists\n await mkdir(outDir, { recursive: true });\n\n const builtIslands: BuildResult[\"islands\"] = [];\n const routes = Array.from(this._routes.keys());\n\n if (mode === \"full\") {\n // Phase 1: Pre-render all routes and collect resources\n const allIslands = new Map<string, IslandMetadata>();\n\n // Virtual modules (use simple file names as keys)\n const modules: Record<string, string> = {};\n const htmlInputs: Record<string, string> = {};\n\n // Render all routes\n for (const [path] of this._routes) {\n try {\n const result = await this.render(path);\n\n // Collect islands by component path (not by instance id)\n for (const island of result.islands) {\n const componentKey = this._getComponentKey(island.path, rootDir);\n if (!allIslands.has(componentKey)) {\n allIslands.set(componentKey, island);\n }\n }\n\n // Generate HTML with resource references\n const htmlFileName = path === \"/\" ? \"index.html\" : `${path.replace(/^\\//, \"\")}.html`;\n\n // CSS paths - use absolute paths that Vite can resolve\n const cssRefs = result.css;\n\n // Island script references - deduplicate by component path\n const seenComponents = new Set<string>();\n const islandScripts: string[] = [];\n for (const island of result.islands) {\n const componentKey = this._getComponentKey(island.path, rootDir);\n if (!seenComponents.has(componentKey)) {\n seenComponents.add(componentKey);\n islandScripts.push(\n `<script type=\"module\" src=\"/_semajsx/islands/${componentKey}.ts\"></script>`,\n );\n }\n }\n\n // Generate HTML\n const routeMeta = this._routeMeta.get(path);\n const pageTitle = routeMeta?.title ?? this.config.title ?? \"Page\";\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${pageTitle}</title>\n ${cssRefs.map((href) => `<link rel=\"stylesheet\" href=\"${href}\">`).join(\"\\n \")}\n</head>\n<body>\n ${result.html}\n ${islandScripts.join(\"\\n \")}\n</body>\n</html>`;\n\n // Store virtual HTML with simple file name as key\n modules[htmlFileName] = html;\n htmlInputs[htmlFileName.replace(\".html\", \"\")] = htmlFileName;\n\n logger.debug(`Rendered ${path} -> ${htmlFileName} (virtual)`);\n } catch (error) {\n logger.warn(`Failed to pre-render route ${path}: ${String(error)}`);\n }\n }\n\n // Generate virtual island entry modules (one per component)\n for (const [componentKey, island] of allIslands) {\n let componentPath = island.path;\n if (componentPath.startsWith(\"file://\")) {\n componentPath = new URL(componentPath).pathname;\n }\n const componentName = island.componentName;\n\n const entryCode = `\nimport { hydrateAllIslands } from '@semajsx/ssr/client';\nimport * as ComponentModule from '${componentPath}';\n\nconst Component = ${componentName ? `ComponentModule['${componentName}'] || ComponentModule.${componentName}` : \"ComponentModule.default\"} ||\n Object.values(ComponentModule).find(exp => typeof exp === 'function');\n\nif (Component) {\n hydrateAllIslands('${componentKey}', Component);\n}\n`;\n\n // Store virtual island entry with component key\n modules[`_semajsx/islands/${componentKey}.ts`] = entryCode;\n }\n\n logger.info(\n `Phase 1 complete: ${Object.keys(htmlInputs).length} pages, ${allIslands.size} islands`,\n );\n\n // Phase 2: Vite build with virtual modules\n const userViteConfig = this.config.vite || {};\n const viteConfig: ViteUserConfig = {\n ...userViteConfig,\n root: rootDir,\n base: \"/\",\n // Merge plugins - our virtual modules plugin must be included\n plugins: [virtualModules(modules), ...(userViteConfig.plugins || [])],\n build: {\n ...userViteConfig.build,\n outDir: resolve(outDir),\n emptyOutDir: true,\n minify,\n sourcemap,\n rollupOptions: {\n ...userViteConfig.build?.rollupOptions,\n input: htmlInputs,\n },\n },\n };\n\n // Apply options.vite if provided\n const finalConfig = options.vite ? mergeConfig(viteConfig, options.vite) : viteConfig;\n\n await viteBuild(finalConfig);\n\n logger.info(\"Phase 2 complete: Vite build finished\");\n\n // Record built islands\n for (const [componentKey, island] of allIslands) {\n const webPath = `/_semajsx/islands/${componentKey}.js`;\n\n builtIslands.push({\n id: componentKey,\n path: island.path,\n outputPath: webPath,\n });\n\n if (onIslandBuilt) {\n onIslandBuilt(island);\n }\n }\n }\n\n logger.info(`Build complete. Output: ${outDir}`);\n\n return {\n outDir,\n islands: builtIslands,\n routes,\n };\n }\n\n async handleRequest(request: Request): Promise<Response> {\n const url = new URL(request.url);\n const pathname = url.pathname;\n\n // Handle Vite module requests (/@fs/, /@vite/, /node_modules/, etc.)\n // This includes CSS files which Vite will process\n if (\n pathname.startsWith(\"/@\") ||\n pathname.startsWith(\"/node_modules/\") ||\n pathname.includes(\"@vite\") ||\n pathname.endsWith(\".css\")\n ) {\n const result = await this._handleModuleRequest(pathname);\n if (result) {\n const contentType = pathname.endsWith(\".css\") ? \"text/css\" : \"application/javascript\";\n return new Response(result.code, {\n headers: { \"Content-Type\": contentType },\n });\n }\n }\n\n // Handle island entry points (must be before source file handler)\n if (pathname.startsWith(\"/_semajsx/islands/\")) {\n const match = pathname.match(/\\/_semajsx\\/islands\\/(.+)\\.js/);\n if (match && match[1]) {\n const islandId = match[1];\n try {\n const code = await this.getIslandEntryPoint(islandId);\n return new Response(code, {\n headers: { \"Content-Type\": \"application/javascript\" },\n });\n } catch {\n return new Response(\"Island not found\", { status: 404 });\n }\n }\n }\n\n // Handle source file requests (.ts, .tsx, .js, .jsx)\n if (/\\.(tsx?|jsx?)$/.test(pathname)) {\n const result = await this._handleModuleRequest(pathname);\n if (result) {\n return new Response(result.code, {\n headers: { \"Content-Type\": \"application/javascript\" },\n });\n }\n return new Response(\"Not Found\", { status: 404 });\n }\n\n // Handle page requests\n try {\n const result = await this.render(pathname);\n return new Response(result.document || result.html, {\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" },\n });\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"No route found\")) {\n return new Response(\"Not Found\", { status: 404 });\n }\n logger.error(`Request error: ${String(error)}`);\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n }\n\n getViteServer(): ViteDevServer | null {\n return this._viteServer;\n }\n\n async getIslandEntryPoint(islandId: string): Promise<string> {\n const island = this._islandCache.get(islandId);\n if (!island) {\n throw new Error(`Island not found: ${islandId}`);\n }\n\n // Normalize the component path for Vite\n const componentPath = this._normalizeModulePath(island.path);\n\n // Get component name for import\n const componentName = island.componentName;\n\n // Generate entry point code\n const entryCode = `\nimport { hydrateIsland } from '@semajsx/ssr/client';\nimport { markIslandHydrated } from '@semajsx/ssr/client';\nimport * as ComponentModule from '${componentPath}';\n\n// Get the component (try named export first, then default, then first function)\nconst Component = ${componentName ? `ComponentModule['${componentName}'] || ComponentModule.${componentName} || ` : \"\"}ComponentModule.default ||\n Object.values(ComponentModule).find(exp => typeof exp === 'function');\n\nif (Component) {\n hydrateIsland('${islandId}', Component, markIslandHydrated);\n}\n`;\n\n // Transform through Vite if available\n if (this._viteServer) {\n const result = await this._viteServer.transformRequest(`virtual:island-entry:${islandId}`);\n if (result) {\n return result.code;\n }\n }\n\n return entryCode;\n }\n\n getIsland(islandId: string): IslandMetadata | undefined {\n return this._islandCache.get(islandId);\n }\n\n // Private methods\n\n private _matchRoute(path: string): {\n handler: RouteHandler | undefined;\n params: Record<string, string>;\n } {\n // Exact match first\n const exactHandler = this._routes.get(path);\n if (exactHandler) {\n return { handler: exactHandler, params: {} };\n }\n\n // Dynamic route matching\n for (const [pattern, handler] of this._routes) {\n const params = this._matchDynamicRoute(pattern, path);\n if (params) {\n return { handler, params };\n }\n }\n\n return { handler: undefined, params: {} };\n }\n\n private _matchDynamicRoute(pattern: string, path: string): Record<string, string> | null {\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n if (patternParts.length !== pathParts.length) {\n return null;\n }\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i]!;\n const pathPart = pathParts[i]!;\n\n if (patternPart.startsWith(\":\")) {\n params[patternPart.slice(1)] = pathPart;\n } else if (patternPart !== pathPart) {\n return null;\n }\n }\n\n return params;\n }\n\n /**\n * Normalize module path (convert file:// URLs to paths Vite can resolve)\n */\n private _normalizeModulePath(path: string): string {\n if (path.startsWith(\"file://\")) {\n // Convert file:// URL to filesystem path\n const fsPath = new URL(path).pathname;\n\n // Make path relative to app root\n const root = this.config.root || process.cwd();\n if (root && fsPath.startsWith(root)) {\n // Path is within root, make it relative\n const relativePath = fsPath.slice(root.length);\n // Ensure it starts with / for Vite to resolve from root\n return relativePath.startsWith(\"/\") ? relativePath : `/${relativePath}`;\n }\n\n // Path is outside root, use @fs protocol\n return `/@fs${fsPath}`;\n }\n return path;\n }\n\n private async _handleModuleRequest(url: string): Promise<{ code: string } | null> {\n if (!this._viteServer) return null;\n\n try {\n const result = await this._viteServer.transformRequest(url);\n if (result) {\n return { code: result.code };\n }\n } catch (error) {\n logger.error(`Failed to transform module ${url}: ${String(error)}`);\n }\n\n return null;\n }\n\n /**\n * Generate a component key from path for use as file name\n * Example: \"/home/user/project/src/components/Counter.tsx\" -> \"components/Counter\"\n */\n private _getComponentKey(componentPath: string, rootDir: string): string {\n // Convert file:// URL to path\n let path = componentPath;\n if (path.startsWith(\"file://\")) {\n path = new URL(path).pathname;\n }\n\n // Make relative to root and remove src/ prefix\n if (path.startsWith(rootDir)) {\n path = path.slice(rootDir.length);\n }\n path = path.replace(/^\\/?(src\\/)?/, \"\");\n\n // Remove extension\n path = path.replace(/\\.\\w+$/, \"\");\n\n // Sanitize for use as file name (replace problematic chars)\n path = path.replace(/[^a-zA-Z0-9/_-]/g, \"_\");\n\n return path;\n }\n\n private _createVirtualIslandsPlugin() {\n const islandCache = this._islandCache;\n const normalizeModulePath = this._normalizeModulePath.bind(this);\n\n return {\n name: \"semajsx-virtual-islands\",\n resolveId(id: string) {\n if (id.startsWith(\"virtual:island-entry:\")) {\n return id;\n }\n return null;\n },\n load(id: string) {\n if (id.startsWith(\"virtual:island-entry:\")) {\n const islandId = id.replace(\"virtual:island-entry:\", \"\");\n const island = islandCache.get(islandId);\n\n if (!island) {\n return null;\n }\n\n const componentPath = normalizeModulePath(island.path);\n const componentName = island.componentName;\n\n return `\nimport { hydrateIsland } from '@semajsx/ssr/client';\nimport { markIslandHydrated } from '@semajsx/ssr/client';\nimport * as ComponentModule from '${componentPath}';\n\n// Get the component (try named export first, then default, then first function)\nconst Component = ${componentName ? `ComponentModule['${componentName}'] || ComponentModule.${componentName}` : \"ComponentModule.default\"} ||\n Object.values(ComponentModule).find(exp => typeof exp === 'function');\n\nif (Component) {\n hydrateIsland('${islandId}', Component, markIslandHydrated);\n}\n`;\n }\n return null;\n },\n };\n }\n}\n\n/**\n * Create a new SemaJSX app\n */\nexport function createApp(config?: AppConfig): App {\n return new AppImpl(config);\n}\n","import type { IslandMetadata } from \"./shared/types\";\nimport { createServer, type ViteDevServer, type PluginOption } from \"vite\";\nimport { logger } from \"@semajsx/logger\";\n\n/**\n * Vite-based island builder\n * Uses Vite dev server for module transformation instead of bundling\n */\nexport class ViteIslandBuilder {\n private vite: ViteDevServer | null = null;\n private entryPoints = new Map<string, string>();\n private options: ViteBuilderOptions;\n\n constructor(options: ViteBuilderOptions = {}) {\n this.options = {\n dev: options.dev ?? true,\n root: options.root ?? process.cwd(),\n };\n }\n\n /**\n * Initialize Vite dev server\n */\n async initialize(): Promise<void> {\n if (this.vite || !this.options.dev) {\n return;\n }\n\n // Build plugins array\n const plugins: PluginOption[] = [\n // Virtual islands plugin\n {\n name: \"semajsx-virtual-islands\",\n resolveId(id: string) {\n if (id.startsWith(\"virtual:island-\")) {\n return \"\\0\" + id;\n }\n },\n load: (id: string) => {\n if (id.startsWith(\"\\0virtual:island-\")) {\n const islandId = id.replace(\"\\0virtual:island-\", \"\").replace(\".js\", \"\");\n return this.entryPoints.get(islandId);\n }\n },\n },\n ];\n\n // Add custom plugins\n if (this.options.plugins) {\n plugins.push(...this.options.plugins);\n }\n\n this.vite = await createServer({\n root: this.options.root,\n server: {\n middlewareMode: true,\n hmr: false, // Disable HMR for simplicity\n },\n appType: \"custom\",\n resolve: {\n // Ensure Vite respects package.json \"exports\" field with conditions\n // \"browser\" condition provides noop island() to avoid loading server code in browser\n // \"development\" condition will resolve to source files (.ts)\n // \"import\" condition will resolve to dist files (.js) when installed as npm package\n conditions: [\"browser\", \"development\", \"module\", \"import\", \"default\"],\n },\n optimizeDeps: {\n // Disable optimization for semajsx to use source directly in development\n exclude: [\"semajsx\", \"@semajsx/dom\", \"@semajsx/signal\"],\n },\n plugins,\n });\n\n logger.success(\"Vite dev server initialized\");\n }\n\n /**\n * Get or generate island entry point code (transformed by Vite)\n */\n async getEntryPoint(island: IslandMetadata): Promise<string> {\n // Generate raw entry point code\n const rawCode = this.generateEntryPoint(island);\n\n // Store raw code for the plugin to access\n this.entryPoints.set(island.id, rawCode);\n\n // If Vite is available, transform the code to resolve bare imports\n if (this.vite) {\n try {\n // Use virtual module ID\n const virtualId = `virtual:island-${island.id}.js`;\n\n // Transform through Vite (which will use our plugin)\n const result = await this.vite.transformRequest(virtualId);\n if (result) {\n return result.code;\n }\n } catch (error) {\n logger.warn(\n `Could not transform entry for ${island.id}:`,\n error as Record<string, unknown>,\n );\n }\n }\n\n // Fallback: return raw code\n return rawCode;\n }\n\n /**\n * Transform a module URL using Vite\n */\n async transformModule(url: string): Promise<{ code: string } | null> {\n if (!this.vite) {\n throw new Error(\"Vite server not initialized\");\n }\n\n try {\n const result = await this.vite.transformRequest(url);\n return result\n ? {\n code: result.code,\n }\n : null;\n } catch (error) {\n logger.error(`Error transforming ${url}:`, error as Record<string, unknown>);\n return null;\n }\n }\n\n /**\n * Generate entry point for island (with imports, no bundling)\n * Uses hydration instead of rendering to preserve server-rendered HTML\n */\n private generateEntryPoint(island: IslandMetadata): string {\n const propsJson = JSON.stringify(island.props);\n const componentName = island.componentName;\n\n // Normalize component path\n const componentPath = this.normalizeModulePath(island.path);\n\n // Generate code that imports dependencies (Vite will resolve them)\n // Use hydrate() instead of render() to preserve server-rendered content\n const displayName = componentName || island.id;\n return `\n// Island hydration entry point: ${displayName}\nimport { hydrate, markIslandHydrated } from '@semajsx/ssr/client';\nimport * as ComponentModule from '${componentPath}';\n\n// Get the component\n// Try to find by name first (most reliable), then fall back to default or first function\nconst Component = ${componentName ? `ComponentModule['${componentName}'] || ComponentModule.${componentName}` : \"ComponentModule.default\"} ||\n Object.values(ComponentModule).find(exp => typeof exp === 'function');\n\nif (!Component) {\n console.error('[${displayName}] No component found in module ${componentPath}');\n} else {\n // Props from server\n const props = ${propsJson};\n\n // Find the placeholder element\n const placeholder = document.querySelector('[data-island-id=\"${island.id}\"]');\n\n if (!placeholder) {\n console.error('[${displayName}] Placeholder not found');\n } else {\n try {\n // Create VNode\n const vnode = Component(props);\n\n // Hydrate (attach interactivity to server-rendered content)\n hydrate(vnode, placeholder);\n\n // Mark island as hydrated for progressive enhancement\n markIslandHydrated('${island.id}');\n\n console.log('[${displayName}] Hydrated successfully');\n } catch (error) {\n console.error('[${displayName}] Hydration error:', error);\n }\n }\n}\n`.trim();\n }\n\n /**\n * Normalize module path (convert file:// URLs to paths relative to Vite root)\n */\n private normalizeModulePath(path: string): string {\n if (path.startsWith(\"file://\")) {\n // Convert file:// URL to filesystem path\n const fsPath = new URL(path).pathname;\n\n // Make path relative to Vite root\n const root = this.options.root || process.cwd();\n if (root && fsPath.startsWith(root)) {\n // Path is within root, make it relative\n const relativePath = fsPath.slice(root.length);\n // Ensure it starts with / for Vite to resolve from root\n return relativePath.startsWith(\"/\") ? relativePath : `/${relativePath}`;\n }\n\n // Path is outside root, use @fs protocol\n return `/@fs${fsPath}`;\n }\n return path;\n }\n\n /**\n * Close Vite server\n */\n async close(): Promise<void> {\n if (this.vite) {\n await this.vite.close();\n this.vite = null;\n }\n }\n\n /**\n * Get Vite dev server instance (for middleware integration)\n */\n getViteServer(): ViteDevServer | null {\n return this.vite;\n }\n}\n\n/**\n * Vite builder options\n */\nexport interface ViteBuilderOptions {\n /** Enable dev mode (uses Vite dev server) */\n dev?: boolean;\n /** Project root directory */\n root?: string;\n /** Additional Vite plugins */\n plugins?: PluginOption[];\n}\n\n/**\n * Create a new Vite island builder\n */\nexport async function createViteIslandBuilder(\n options?: ViteBuilderOptions,\n): Promise<ViteIslandBuilder> {\n const builder = new ViteIslandBuilder(options);\n await builder.initialize();\n return builder;\n}\n","import type {\n RouteContext,\n RouteHandler,\n RouterConfig,\n SSRResult,\n IslandMetadata,\n DocumentTemplate,\n} from \"./shared/types\";\nimport { renderToString } from \"./render\";\nimport { createViteIslandBuilder, type ViteIslandBuilder } from \"./vite-builder\";\nimport type { ViteDevServer } from \"vite\";\nimport { LRUCache } from \"./lru-cache\";\n\n/**\n * Route matcher result\n */\ninterface RouteMatch {\n handler: RouteHandler;\n params: Record<string, string>;\n}\n\n/**\n * Internal router configuration with required base fields\n */\ninterface InternalRouterConfig {\n enableCache: boolean;\n dev: boolean;\n root: string;\n buildOptions: { minify: boolean; sourcemap: boolean };\n document?: DocumentTemplate;\n title?: string;\n meta?: Record<string, any>;\n}\n\n/**\n * Vite-powered SSR Router with island support\n * Uses Vite dev server for module transformation in dev mode\n */\nexport class ViteRouter {\n private routeMap: Map<string, RouteHandler> = new Map();\n private dynamicRoutes: Array<{ pattern: RegExp; handler: RouteHandler }> = [];\n private builder: ViteIslandBuilder | null = null;\n private config: InternalRouterConfig;\n // Use LRU cache to prevent memory leaks from unbounded island storage\n private islandsCache: LRUCache<string, IslandMetadata>;\n private initialized = false;\n\n constructor(config: RouterConfig = {}) {\n this.config = {\n enableCache: config.enableCache ?? true,\n dev: config.dev ?? true,\n root: config.root ?? process.cwd(),\n buildOptions: {\n minify: config.buildOptions?.minify ?? true,\n sourcemap: config.buildOptions?.sourcemap ?? false,\n },\n document: config.document,\n title: config.title,\n meta: config.meta,\n };\n\n // Initialize LRU cache with configurable max size\n // Default: 1000 islands (should be enough for most apps)\n const cacheSize = (config as any).islandCacheSize ?? 1000;\n this.islandsCache = new LRUCache<string, IslandMetadata>(cacheSize);\n }\n\n /**\n * Initialize the router (async because Vite setup is async)\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n if (this.config.dev) {\n this.builder = await createViteIslandBuilder({\n dev: true,\n root: this.config.root,\n });\n }\n\n this.initialized = true;\n }\n\n /**\n * Register a static route\n */\n route(path: string, handler: RouteHandler): this {\n if (path.includes(\":\")) {\n // Dynamic route\n const pattern = this.pathToRegex(path);\n this.dynamicRoutes.push({ pattern, handler });\n } else {\n // Static route\n this.routeMap.set(path, handler);\n }\n return this;\n }\n\n /**\n * Register multiple routes at once\n */\n routes(routes: Record<string, RouteHandler>): this {\n for (const [path, handler] of Object.entries(routes)) {\n this.route(path, handler);\n }\n return this;\n }\n\n /**\n * Get page content for a given path (lazy rendering)\n */\n async get(path: string): Promise<SSRResult> {\n await this.initialize();\n\n // Parse path and query string\n const [pathname, queryString] = path.split(\"?\");\n const query: Record<string, string> = {};\n if (queryString) {\n const searchParams = new URLSearchParams(queryString);\n for (const [key, value] of searchParams) {\n query[key] = value;\n }\n }\n\n // Find matching route\n const match = this.matchRoute(pathname || \"/\");\n if (!match) {\n throw new Error(`Route not found: ${path}`);\n }\n\n // Call the route handler to get VNode\n const context: RouteContext = { params: match.params, query };\n const vnode = match.handler(context);\n\n // Render to HTML with islands\n const result = await renderToString(vnode, {\n // Default transformer generates standard script tags\n transformIslandScript: (island) =>\n `<script type=\"module\" src=\"${island.basePath}/${island.id}.js\" async></script>`,\n });\n\n // Store islands in LRU cache for later code retrieval\n // Old islands will be automatically evicted when cache is full\n for (const island of result.islands) {\n this.islandsCache.set(island.id, island);\n }\n\n // If document template is provided, render complete HTML document\n if (this.config.document) {\n const { renderDocument } = await import(\"./document\");\n\n const documentVNode = this.config.document({\n // Wrap HTML strings in VNodes with dangerouslySetInnerHTML for raw HTML injection\n children: {\n type: \"template\",\n props: { dangerouslySetInnerHTML: { __html: result.html } },\n children: [],\n },\n scripts: {\n type: \"template\",\n props: { dangerouslySetInnerHTML: { __html: result.scripts } },\n children: [],\n },\n islands: result.islands,\n css: result.css,\n path,\n title: this.config.title,\n meta: this.config.meta,\n });\n\n result.document = renderDocument(documentVNode);\n }\n\n return result;\n }\n\n /**\n * Get island client code\n * In dev mode, returns the entry point (Vite will transform it)\n * In prod mode, would return pre-built bundle\n */\n async getIslandEntryPoint(islandId: string): Promise<string> {\n await this.initialize();\n\n const island = this.islandsCache.get(islandId);\n if (!island) {\n throw new Error(`Island not found: ${islandId}`);\n }\n\n if (!this.builder) {\n throw new Error(\"Vite builder not initialized\");\n }\n\n return this.builder.getEntryPoint(island);\n }\n\n /**\n * Handle module transformation request\n * This is called when browser requests /@fs/... or /node_modules/...\n */\n async handleModuleRequest(url: string): Promise<{ code: string } | null> {\n await this.initialize();\n\n if (!this.builder) {\n throw new Error(\"Vite builder not initialized\");\n }\n\n return this.builder.transformModule(url);\n }\n\n /**\n * Get island metadata by ID\n */\n getIsland(islandId: string): IslandMetadata | undefined {\n return this.islandsCache.get(islandId);\n }\n\n /**\n * Get Vite dev server instance (for middleware integration)\n */\n getViteServer(): ViteDevServer | null {\n return this.builder?.getViteServer() ?? null;\n }\n\n /**\n * Close the router and cleanup resources\n */\n async close(): Promise<void> {\n if (this.builder) {\n await this.builder.close();\n }\n }\n\n /**\n * Match a path to a route handler\n */\n private matchRoute(path: string): RouteMatch | null {\n // Try static routes first\n const staticHandler = this.routeMap.get(path);\n if (staticHandler) {\n return { handler: staticHandler, params: {} };\n }\n\n // Try dynamic routes\n for (const { pattern, handler } of this.dynamicRoutes) {\n const match = path.match(pattern);\n if (match) {\n const params = this.extractParams(pattern, match);\n return { handler, params };\n }\n }\n\n return null;\n }\n\n /**\n * Convert path pattern to regex\n * Example: /blog/:id -> /^\\/blog\\/([^\\/]+)$/\n */\n private pathToRegex(path: string): RegExp {\n const pattern = path.replace(/\\//g, \"\\\\/\").replace(/:([^/]+)/g, \"(?<$1>[^\\\\/]+)\");\n return new RegExp(`^${pattern}$`);\n }\n\n /**\n * Extract params from regex match\n */\n private extractParams(_pattern: RegExp, match: RegExpMatchArray): Record<string, string> {\n return match.groups || {};\n }\n}\n\n/**\n * Create a new Vite-powered router\n */\nexport async function createViteRouter(\n routes?: Record<string, RouteHandler>,\n config?: RouterConfig,\n): Promise<ViteRouter> {\n const router = new ViteRouter(config);\n\n if (routes) {\n router.routes(routes);\n }\n\n // Initialize immediately\n await router.initialize();\n\n return router;\n}\n","import type { VNode } from \"@semajsx/core\";\nimport type { IslandMetadata } from \"./shared/types\";\nimport { isIslandVNode, getIslandMetadata } from \"./client/island\";\nimport { Fragment } from \"@semajsx/core\";\n\n/**\n * Island collector - traverses VNode tree and collects island metadata\n */\nexport class IslandCollector {\n private islands: IslandMetadata[] = [];\n private counter = 0;\n\n /**\n * Collect all islands from a VNode tree\n */\n collect(vnode: VNode): IslandMetadata[] {\n this.islands = [];\n this.counter = 0;\n this.traverse(vnode);\n return this.islands;\n }\n\n /**\n * Traverse VNode tree and collect islands\n */\n private traverse(vnode: VNode | null | undefined): void {\n if (!vnode) return;\n\n // Check if this VNode is an island\n if (isIslandVNode(vnode)) {\n const metadata = getIslandMetadata(vnode);\n if (metadata) {\n this.islands.push({\n id: `island-${this.counter++}`,\n path: metadata.modulePath,\n props: this.serializeProps(metadata.props),\n componentName: typeof vnode.type === \"function\" ? vnode.type.name : undefined,\n });\n }\n // Don't traverse into island children - they will be rendered on client\n return;\n }\n\n // Handle fragments\n if (vnode.type === Fragment) {\n for (const child of vnode.children) {\n this.traverse(child);\n }\n return;\n }\n\n // Handle function components - need to render them first\n if (typeof vnode.type === \"function\") {\n try {\n const result = vnode.type(vnode.props || {});\n // If result is a VNode, traverse it\n if (result && typeof result === \"object\" && \"type\" in result) {\n this.traverse(result as VNode);\n }\n } catch (error) {\n console.warn(\"Error rendering component during collection:\", error);\n }\n return;\n }\n\n // Traverse children\n if (vnode.children && Array.isArray(vnode.children)) {\n for (const child of vnode.children) {\n this.traverse(child);\n }\n }\n }\n\n /**\n * Serialize props for client-side hydration\n * Handles common types and warns about non-serializable values\n */\n private serializeProps(props: any): Record<string, any> {\n if (!props || typeof props !== \"object\") {\n return {};\n }\n\n const serialized: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(props)) {\n // Skip functions (event handlers, callbacks)\n if (typeof value === \"function\") {\n continue;\n }\n\n // Skip symbols\n if (typeof value === \"symbol\") {\n continue;\n }\n\n // Skip undefined\n if (value === undefined) {\n continue;\n }\n\n // Handle null, boolean, number, string\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"number\" ||\n typeof value === \"string\"\n ) {\n serialized[key] = value;\n continue;\n }\n\n // Handle arrays and plain objects\n if (Array.isArray(value) || isPlainObject(value)) {\n try {\n // Test if it's JSON-serializable\n JSON.stringify(value);\n serialized[key] = value;\n } catch (error) {\n console.warn(`Cannot serialize prop \"${key}\":`, error);\n }\n continue;\n }\n\n console.warn(`Skipping non-serializable prop \"${key}\" of type ${typeof value}`);\n }\n\n return serialized;\n }\n}\n\n/**\n * Check if a value is a plain object\n */\nfunction isPlainObject(value: any): boolean {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Create a new island collector\n */\nexport function createIslandCollector(): IslandCollector {\n return new IslandCollector();\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-Dgj6n-EE.d.mts","names":[],"sources":["../../core/src/types.ts"],"mappings":";;;;;AAKA;cAAa,QAAA;;;;cAKA,MAAA;;;;;KAMD,SAAA,YAAqB,SAAA,eAAwB,QAAA,UAAkB,MAAA;;;;;;;UAQ1D,KAAA;EACf,IAAA,EAAM,SAAA;EACN,KAAA,EAAO,MAAA;EACP,QAAA,EAAU,KAAA;EACV,GAAA;AAAA;AAJF;;;;AAAA,KAWY,YAAA;;;;;KAMA,OAAA,GACR,KAAA,GACA,YAAA,GACA,QAAA,CAAS,OAAA,IACT,cAAA,CAAe,OAAA,IACf,OAAA,CAAQ,OAAA,IACR,qBAAA,CAAsB,OAAA;;;;;KAMd,SAAA,aAAsB,KAAA,EAAO,CAAA,EAAG,GAAA,GAAM,YAAA,KAAiB,OAAA;;;AAlBnE;UAuBiB,YAAA;;;;AAjBjB;;EAuBE,MAAA,IAAU,OAAA,EAAS,OAAA,CAAQ,CAAA,IAAK,CAAA;AAAA;;;;;;;;KAWtB,GAAA,MAAS,cAAA,CAAe,CAAA,aAAc,QAAA,EAAU,CAAA;;;;;;;KAShD,OAAA;EAAwB,MAAA,GAAS,CAAA;AAAA;;;;KAKjC,cAAA,aAA2B,OAAA,CAAQ,CAAA,GAAI,CAAA;;;AApCnD;UAyCiB,YAAA;EAGf,OAAA,EAAS,cAAA,GAAiB,cAAA;EAC1B,QAAA,GAAW,OAAA;AAAA;;;;KAMD,QAAA,MAAc,CAAA,GAAI,cAAA,CAAe,CAAA;;;;;KAMjC,WAAA,oBACE,CAAA,GAAI,CAAA,yBACZ,CAAA,CAAE,CAAA,IACF,CAAA,sBACE,CAAA,CAAE,CAAA,IACF,CAAA,CAAE,CAAA,eAAe,IAAA,mBACf,CAAA,CAAE,CAAA,IACF,QAAA,CAAS,CAAA,CAAE,CAAA;;;AA3DrB;KAiEY,OAAA,MAAa,CAAA;EACvB,GAAA;AAAA"}