semajsx 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/{client-CButR91p.mjs → client-BrupjhG0.mjs} +4 -4
  2. package/dist/{client-CButR91p.mjs.map → client-BrupjhG0.mjs.map} +1 -1
  3. package/dist/{computed-BidG06Lt.mjs → computed-BpjqvQu1.mjs} +2 -2
  4. package/dist/{computed-BidG06Lt.mjs.map → computed-BpjqvQu1.mjs.map} +1 -1
  5. package/dist/document-DsiJO2jG.mjs +5 -0
  6. package/dist/{document-BOJDaiBc.mjs → document-XKyAs62C.mjs} +2 -2
  7. package/dist/{document-BOJDaiBc.mjs.map → document-XKyAs62C.mjs.map} +1 -1
  8. package/dist/dom/index.mjs +3 -3
  9. package/dist/dom/jsx-dev-runtime.d.mts +1 -1
  10. package/dist/dom/jsx-dev-runtime.mjs +2 -2
  11. package/dist/dom/jsx-runtime.d.mts +1 -1
  12. package/dist/dom/jsx-runtime.mjs +2 -2
  13. package/dist/{index-D_FIlSk3.d.mts → index-CmxkYOtR.d.mts} +2 -2
  14. package/dist/{index-D_FIlSk3.d.mts.map → index-CmxkYOtR.d.mts.map} +1 -1
  15. package/dist/index.mjs +4 -4
  16. package/dist/{jsx-runtime-D9ZNjMJ2.mjs → jsx-runtime-BFs1c0xz.mjs} +1 -1
  17. package/dist/jsx-runtime-BFs1c0xz.mjs.map +1 -0
  18. package/dist/{jsx-runtime-tIuFmhTh.d.mts → jsx-runtime-C-TtSL51.d.mts} +9 -4
  19. package/dist/jsx-runtime-C-TtSL51.d.mts.map +1 -0
  20. package/dist/{jsx-runtime-BjCGsceN.mjs → jsx-runtime-kv_6vBiR.mjs} +1 -1
  21. package/dist/{jsx-runtime-BjCGsceN.mjs.map → jsx-runtime-kv_6vBiR.mjs.map} +1 -1
  22. package/dist/{lucide-C5BghhSl.mjs → lucide-Ddt_N9dJ.mjs} +3 -3
  23. package/dist/{lucide-C5BghhSl.mjs.map → lucide-Ddt_N9dJ.mjs.map} +1 -1
  24. package/dist/{resource-CNwiNxJX.d.mts → resource-CX-sVeS_.d.mts} +5 -2
  25. package/dist/resource-CX-sVeS_.d.mts.map +1 -0
  26. package/dist/{resource-DSlXDZZi.mjs → resource-pm7qP-jV.mjs} +2 -2
  27. package/dist/{resource-DSlXDZZi.mjs.map → resource-pm7qP-jV.mjs.map} +1 -1
  28. package/dist/signal/index.mjs +3 -3
  29. package/dist/{signal-BN8vHXDb.mjs → signal-4PgGfydw.mjs} +1 -1
  30. package/dist/{signal-BN8vHXDb.mjs.map → signal-4PgGfydw.mjs.map} +1 -1
  31. package/dist/{src-B4VBiHa8.mjs → src-CAyv9Uf9.mjs} +24 -17
  32. package/dist/src-CAyv9Uf9.mjs.map +1 -0
  33. package/dist/{src-DUpFNNM_.mjs → src-CXY-7FC3.mjs} +4 -4
  34. package/dist/{src-DUpFNNM_.mjs.map → src-CXY-7FC3.mjs.map} +1 -1
  35. package/dist/{src-BqX3sryB.mjs → src-C_aFsFJ3.mjs} +4 -4
  36. package/dist/{src-BqX3sryB.mjs.map → src-C_aFsFJ3.mjs.map} +1 -1
  37. package/dist/{src-DW3tIczg.mjs → src-Cv4rRVzv.mjs} +4 -4
  38. package/dist/{src-DW3tIczg.mjs.map → src-Cv4rRVzv.mjs.map} +1 -1
  39. package/dist/{src-Ds9vl42d.mjs → src-DV9uwtE5.mjs} +2 -2
  40. package/dist/{src-Ds9vl42d.mjs.map → src-DV9uwtE5.mjs.map} +1 -1
  41. package/dist/{src-75qcxwT_.mjs → src-SqJ6k7Xv.mjs} +13 -29
  42. package/dist/src-SqJ6k7Xv.mjs.map +1 -0
  43. package/dist/ssg/index.d.mts +1 -1
  44. package/dist/ssg/index.d.mts.map +1 -1
  45. package/dist/ssg/index.mjs +14 -9
  46. package/dist/ssg/index.mjs.map +1 -1
  47. package/dist/ssg/plugins/docs-theme.d.mts +68 -29
  48. package/dist/ssg/plugins/docs-theme.d.mts.map +1 -1
  49. package/dist/ssg/plugins/docs-theme.mjs +2747 -380
  50. package/dist/ssg/plugins/docs-theme.mjs.map +1 -1
  51. package/dist/ssg/plugins/fonts/MAPLE_MONO_LICENSE.txt +93 -0
  52. package/dist/ssg/plugins/fonts/MapleMono-NF-CN-Regular.woff2 +0 -0
  53. package/dist/ssg/plugins/lucide.d.mts +2 -2
  54. package/dist/ssg/plugins/lucide.mjs +5 -5
  55. package/dist/ssr/client.d.mts +1 -1
  56. package/dist/ssr/client.mjs +5 -5
  57. package/dist/ssr/index.d.mts +1 -1
  58. package/dist/ssr/index.d.mts.map +1 -1
  59. package/dist/ssr/index.mjs +8 -8
  60. package/dist/style/index.mjs +1 -1
  61. package/dist/style/react.mjs +2 -2
  62. package/dist/style/vue.mjs +2 -2
  63. package/dist/terminal/index.mjs +3 -3
  64. package/dist/terminal/jsx-dev-runtime.mjs +2 -2
  65. package/dist/terminal/jsx-runtime.mjs +2 -2
  66. package/dist/{types-BmDIxXiP.d.mts → types-BaS-zTDX.d.mts} +3 -1
  67. package/dist/{types-BmDIxXiP.d.mts.map → types-BaS-zTDX.d.mts.map} +1 -1
  68. package/dist/{utils-DbTAs943.mjs → utils-BrGmTgfG.mjs} +1 -1
  69. package/dist/{utils-DbTAs943.mjs.map → utils-BrGmTgfG.mjs.map} +1 -1
  70. package/package.json +2 -2
  71. package/dist/document-CwHVG_PJ.mjs +0 -5
  72. package/dist/jsx-runtime-D9ZNjMJ2.mjs.map +0 -1
  73. package/dist/jsx-runtime-tIuFmhTh.d.mts.map +0 -1
  74. package/dist/resource-CNwiNxJX.d.mts.map +0 -1
  75. package/dist/src-75qcxwT_.mjs.map +0 -1
  76. package/dist/src-B4VBiHa8.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"src-Ds9vl42d.mjs","names":["STYLE_TOKEN_BRAND","STYLE_TOKEN_BRAND","STYLE_TOKEN_BRAND"],"sources":["../../style/src/classes.ts","../../style/src/rule.ts","../../style/src/inject.ts","../../style/src/hash.ts","../../style/src/registry.ts","../../style/src/theme.ts","../../style/src/keyframes.ts","../../style/src/animate.ts","../../style/src/responsive.ts"],"sourcesContent":["/**\n * Class name generation for @semajsx/style\n */\n\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 * Monotonic counter to ensure unique class names even when classes() is called\n * multiple times in the same millisecond (e.g., multiple component modules).\n */\nlet classCounter = 0;\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 id = (++classCounter).toString(36);\n const className = `${name}-${id}`;\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 * 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 * 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":"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"}
1
+ {"version":3,"file":"src-DV9uwtE5.mjs","names":["STYLE_TOKEN_BRAND","STYLE_TOKEN_BRAND","STYLE_TOKEN_BRAND"],"sources":["../../style/src/classes.ts","../../style/src/rule.ts","../../style/src/inject.ts","../../style/src/hash.ts","../../style/src/registry.ts","../../style/src/theme.ts","../../style/src/keyframes.ts","../../style/src/animate.ts","../../style/src/responsive.ts"],"sourcesContent":["/**\n * Class name generation for @semajsx/style\n */\n\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 * Monotonic counter to ensure unique class names even when classes() is called\n * multiple times in the same millisecond (e.g., multiple component modules).\n */\nlet classCounter = 0;\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 id = (++classCounter).toString(36);\n const className = `${name}-${id}`;\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 * 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 * 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":"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"}
@@ -1,7 +1,6 @@
1
- import { a as jsxs, i as jsx } from "./src-DW3tIczg.mjs";
2
- import { s as createApp } from "./src-B4VBiHa8.mjs";
3
- import { n as renderDocument } from "./document-BOJDaiBc.mjs";
4
- import { createRequire } from "node:module";
1
+ import { a as jsxs, i as jsx } from "./src-Cv4rRVzv.mjs";
2
+ import { s as createApp } from "./src-CAyv9Uf9.mjs";
3
+ import { n as renderDocument } from "./document-XKyAs62C.mjs";
5
4
  import { dirname, join, relative, resolve } from "path";
6
5
  import { mkdir, readFile, rm, watch, writeFile } from "fs/promises";
7
6
  import { compile } from "@mdx-js/mdx";
@@ -11,29 +10,11 @@ import { exec } from "child_process";
11
10
  import { promisify } from "util";
12
11
  import { z as z$1 } from "zod";
13
12
 
14
- //#region rolldown:runtime
15
- var __defProp = Object.defineProperty;
16
- var __exportAll = (all, symbols) => {
17
- let target = {};
18
- for (var name in all) {
19
- __defProp(target, name, {
20
- get: all[name],
21
- enumerable: true
22
- });
23
- }
24
- if (symbols) {
25
- __defProp(target, Symbol.toStringTag, { value: "Module" });
26
- }
27
- return target;
28
- };
29
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
30
-
31
- //#endregion
32
13
  //#region ../ssg/src/document.tsx
33
14
  /**
34
15
  * Default HTML document template for SSG
35
16
  */
36
- const DefaultDocument = ({ children, title = "SSG Page", scripts, css }) => /* @__PURE__ */ jsxs("html", {
17
+ const DefaultDocument = ({ children, title = "SSG Page", scripts, css, styles }) => /* @__PURE__ */ jsxs("html", {
37
18
  lang: "en",
38
19
  children: [/* @__PURE__ */ jsxs("head", { children: [
39
20
  /* @__PURE__ */ jsx("meta", { charSet: "UTF-8" }),
@@ -45,7 +26,8 @@ const DefaultDocument = ({ children, title = "SSG Page", scripts, css }) => /* @
45
26
  css?.map((href) => /* @__PURE__ */ jsx("link", {
46
27
  rel: "stylesheet",
47
28
  href
48
- }))
29
+ })),
30
+ styles && styles.length > 0 && /* @__PURE__ */ jsx("style", { children: styles.join("\n") })
49
31
  ] }), /* @__PURE__ */ jsxs("body", { children: [children, scripts] })]
50
32
  });
51
33
 
@@ -345,7 +327,7 @@ var SSG = class {
345
327
  outDir,
346
328
  mode: "full",
347
329
  minify: true,
348
- renderHtml: ({ html, css, scripts, title, path: routePath }) => {
330
+ renderHtml: ({ html, css, styles, scripts, title, path: routePath }) => {
349
331
  const scriptsHtml = scripts.map((s) => `<script type="module" src="${s.src}"><\/script>`).join("\n");
350
332
  return renderDocument(documentTemplate({
351
333
  children: new RawHTML(html),
@@ -354,7 +336,8 @@ var SSG = class {
354
336
  path: routePath,
355
337
  props: {},
356
338
  scripts: scriptsHtml ? new RawHTML(scriptsHtml) : void 0,
357
- css: css ?? []
339
+ css: css ?? [],
340
+ styles: styles ?? []
358
341
  }));
359
342
  },
360
343
  vite: { build: { rollupOptions: { external: [] } } }
@@ -448,7 +431,8 @@ var SSG = class {
448
431
  path,
449
432
  props,
450
433
  scripts: result.scripts ? new RawHTML(result.scripts) : void 0,
451
- css: result.css ?? []
434
+ css: result.css ?? [],
435
+ styles: result.styles ?? []
452
436
  };
453
437
  return renderDocument((this.config.document ?? DefaultDocument)(documentProps));
454
438
  }
@@ -864,5 +848,5 @@ function createSource(options) {
864
848
  }
865
849
 
866
850
  //#endregion
867
- export { DefaultDocument as _, remoteSource as a, FileSource as c, defineCollection as d, SSG as f, RawHTML as g, createMDXProcessor as h, RemoteSource as i, fileSource as l, MDXProcessor as m, CustomSource as n, GitSource as o, createSSG as p, createSource as r, gitSource as s, z$1 as t, BaseSource as u, __exportAll as v, __require as y };
868
- //# sourceMappingURL=src-75qcxwT_.mjs.map
851
+ export { DefaultDocument as _, remoteSource as a, FileSource as c, defineCollection as d, SSG as f, RawHTML as g, createMDXProcessor as h, RemoteSource as i, fileSource as l, MDXProcessor as m, CustomSource as n, GitSource as o, createSSG as p, createSource as r, gitSource as s, z$1 as t, BaseSource as u };
852
+ //# sourceMappingURL=src-SqJ6k7Xv.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-SqJ6k7Xv.mjs","names":["fsWatch"],"sources":["../../ssg/src/document.tsx","../../ssg/src/types.ts","../../ssg/src/mdx/processor.ts","../../ssg/src/mdx/vite-plugin.ts","../../ssg/src/ssg.ts","../../ssg/src/collection/index.ts","../../ssg/src/sources/base.ts","../../ssg/src/sources/file.ts","../../ssg/src/sources/git.ts","../../ssg/src/sources/remote.ts","../../ssg/src/sources/custom.ts"],"sourcesContent":["/** @jsxImportSource @semajsx/dom */\n\nimport type { DocumentTemplate } from \"./types\";\n\n/**\n * Default HTML document template for SSG\n */\nexport const DefaultDocument: DocumentTemplate = ({\n children,\n title = \"SSG Page\",\n scripts,\n css,\n styles,\n}) => (\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>{title}</title>\n {css?.map((href) => (\n <link rel=\"stylesheet\" href={href} />\n ))}\n {styles && styles.length > 0 && <style>{styles.join(\"\\n\")}</style>}\n </head>\n <body>\n {children}\n {scripts}\n </body>\n </html>\n);\n","import type { Component, VNode } from \"@semajsx/core\";\nimport type { z } from \"zod\";\n\n// =============================================================================\n// Collection Registry (for type inference)\n// =============================================================================\n\n/**\n * Infer a registry type from an array of collections\n * Maps collection names to their data types\n */\nexport type InferCollections<T extends readonly Collection[]> = {\n [K in T[number] as K[\"name\"]]: K extends Collection<infer D> ? D : unknown;\n};\n\n// =============================================================================\n// Collection Entry\n// =============================================================================\n\nexport interface CollectionEntry<T = unknown> {\n /** Unique identifier within the collection */\n id: string;\n /** URL-friendly slug */\n slug: string;\n /** Validated frontmatter data */\n data: T;\n /** Raw content body (markdown/mdx) */\n body: string;\n /** Render the content to JSX */\n render: () => Promise<{ Content: () => VNode }>;\n}\n\n// =============================================================================\n// Collection Source\n// =============================================================================\n\nexport interface ChangeSet<T = unknown> {\n /** Cursor for next incremental fetch */\n cursor: string;\n /** Newly added entries */\n added: CollectionEntry<T>[];\n /** Updated entries */\n updated: CollectionEntry<T>[];\n /** Deleted entry IDs */\n deleted: string[];\n}\n\nexport type WatchCallback<T = unknown> = (changes: ChangeSet<T>) => void;\n\nexport interface CollectionSource<T = unknown> {\n /** Unique identifier for this source */\n id: string;\n\n /** Get all entries from this source */\n getEntries(): Promise<CollectionEntry<T>[]>;\n\n /** Get a single entry by ID */\n getEntry(id: string): Promise<CollectionEntry<T> | null>;\n\n /** Watch for changes (optional) */\n watch?(callback: WatchCallback<T>): () => void;\n\n /** Get incremental changes since cursor (optional) */\n getChanges?(since: string): Promise<ChangeSet<T>>;\n}\n\n// =============================================================================\n// Collection Definition\n// =============================================================================\n\nexport interface CollectionConfig<T extends z.ZodType = z.ZodType> {\n /** Collection name */\n name: string;\n /** Data source (returns raw entries, validated against schema later) */\n source: CollectionSource<unknown>;\n /** Zod schema for validation */\n schema: T;\n}\n\nexport interface Collection<T = unknown> {\n name: string;\n source: CollectionSource<unknown>;\n schema: z.ZodType;\n /** Type-only field for inference */\n _outputType?: T;\n}\n\n// =============================================================================\n// Route Configuration\n// =============================================================================\n\nexport interface StaticPath<P = Record<string, string>> {\n params: P;\n props?: Record<string, unknown>;\n}\n\nexport interface RouteConfig<TRegistry extends Record<string, unknown> = Record<string, unknown>> {\n /** Route path pattern (e.g., '/blog/:slug') */\n path: string;\n /** Component to render. Props are provided dynamically by the route config. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Route props are dynamic, typed via `props`/`getStaticPaths`\n component: (props: any) => VNode;\n /** Static props for the route */\n props?:\n | Record<string, unknown>\n | ((ssg: SSGInstance<TRegistry>) => Promise<Record<string, unknown>>);\n /** Generate static paths for dynamic routes */\n getStaticPaths?: (ssg: SSGInstance<TRegistry>) => Promise<StaticPath[]>;\n}\n\n// =============================================================================\n// MDX Configuration\n// =============================================================================\n\nexport interface MDXConfig {\n /** Remark plugins */\n remarkPlugins?: unknown[];\n /** Rehype plugins */\n rehypePlugins?: unknown[];\n /** Component mapping for MDX */\n components?: Record<string, Component>;\n}\n\n// =============================================================================\n// Document Template\n// =============================================================================\n\n/**\n * Raw HTML VNode that can be used directly in JSX or converted to string\n */\nexport class RawHTML {\n public readonly type = \"div\";\n public readonly props: { dangerouslySetInnerHTML: { __html: string } };\n public readonly children: never[] = [];\n\n constructor(public readonly html: string) {\n this.props = { dangerouslySetInnerHTML: { __html: html } };\n }\n\n toString(): string {\n return this.html;\n }\n}\n\nexport interface DocumentProps {\n /** Rendered page content (VNode with toString) */\n children: RawHTML;\n /** Page title */\n title?: string;\n /** Base URL path */\n base: string;\n /** Route path */\n path: string;\n /** Route props */\n props: Record<string, unknown>;\n /** Script tags for islands (as RawHTML) */\n scripts?: RawHTML;\n /** CSS stylesheet paths */\n css?: string[];\n /** Inline CSS collected from StyleTokens */\n styles?: string[];\n}\n\nexport type DocumentTemplate = (props: DocumentProps) => VNode;\n\n// =============================================================================\n// Plugin System\n// =============================================================================\n\n/**\n * Partial SSG config that a plugin's config() hook can return.\n * Each field has a defined merge strategy:\n * - mdx: merge (concat arrays, merge component objects)\n * - document: override (last writer wins)\n * - routes: concat\n * - collections: concat\n */\nexport interface SSGPluginConfig {\n mdx?: Partial<MDXConfig>;\n document?: DocumentTemplate;\n routes?: RouteConfig[];\n collections?: readonly Collection[];\n}\n\nexport interface SSGPlugin {\n /** Plugin name for identification and debugging */\n name: string;\n\n /** Plugin ordering: 'pre' runs before normal plugins, 'post' runs after */\n enforce?: \"pre\" | \"post\";\n\n /**\n * Modify SSG config before it is resolved.\n * Return partial config to merge.\n * Called in plugin order: enforce:'pre' → normal → enforce:'post' → user config.\n */\n config?(config: SSGConfig): SSGPluginConfig | void;\n\n /** Called after config is fully resolved. Read-only inspection. */\n configResolved?(config: SSGConfig): void;\n\n /** Called before build starts */\n buildStart?(): void | Promise<void>;\n\n /** Called after build completes. Receives the SSG instance for post-build operations. */\n buildEnd?(result: BuildResult, ssg: SSGInstance): void | Promise<void>;\n}\n\n// =============================================================================\n// SSG Configuration\n// =============================================================================\n\nexport interface SSGConfig<\n TCollections extends readonly Collection[] = Collection[],\n TRegistry extends Record<string, unknown> = InferCollections<TCollections>,\n> {\n /** Output directory for built files */\n outDir: string;\n /** Root directory for resolving relative paths (defaults to script location) */\n rootDir?: string;\n /** Base URL path */\n base?: string;\n /** Collections to include */\n collections?: TCollections;\n /** Route definitions */\n routes?: RouteConfig<TRegistry>[];\n /** Plugins that contribute remark/rehype plugins and components.\n * Plugin factories may return arrays (Vite-style); nested arrays are flattened. */\n plugins?: (SSGPlugin | SSGPlugin[])[];\n /** MDX configuration (merged after plugins, takes precedence) */\n mdx?: MDXConfig;\n /** Custom document template */\n document?: DocumentTemplate;\n}\n\n// =============================================================================\n// Build State & Result\n// =============================================================================\n\nexport interface BuildState {\n /** Cursor for each collection */\n cursors: Record<string, string>;\n /** Content hash for each page */\n pageHashes: Record<string, string>;\n /** Last build timestamp */\n timestamp: number;\n}\n\nexport interface BuildResult {\n /** New build state for incremental builds */\n state: BuildState;\n /** Paths that were built */\n paths: string[];\n /** Build statistics */\n stats: {\n added: number;\n updated: number;\n deleted: number;\n unchanged: number;\n };\n}\n\nexport interface BuildOptions {\n /** Enable incremental build */\n incremental?: boolean;\n /** Previous build state */\n state?: BuildState;\n /** Only build specific collections */\n collections?: string[];\n}\n\n// =============================================================================\n// Watcher\n// =============================================================================\n\nexport interface WatchOptions {\n /** Callback when rebuild completes */\n onRebuild?: (result: BuildResult) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\nexport interface Watcher {\n /** Stop watching */\n close(): void;\n}\n\n// =============================================================================\n// SSG Instance\n// =============================================================================\n\nexport interface SSGInstance<TRegistry extends Record<string, unknown> = Record<string, unknown>> {\n /** Get the root directory for resolving paths */\n getRootDir(): string;\n\n /** Get all entries from a collection */\n getCollection<K extends keyof TRegistry & string>(\n name: K,\n ): Promise<CollectionEntry<TRegistry[K]>[]>;\n\n /** Get a single entry from a collection */\n getEntry<K extends keyof TRegistry & string>(\n name: K,\n id: string,\n ): Promise<CollectionEntry<TRegistry[K]> | null>;\n\n /** Build the static site */\n build(options?: BuildOptions): Promise<BuildResult>;\n\n /** Watch for changes and rebuild */\n watch(options?: WatchOptions): Watcher;\n}\n","import { compile } from \"@mdx-js/mdx\";\nimport type { Pluggable } from \"unified\";\nimport type { VNode } from \"@semajsx/core\";\nimport type { MDXConfig, MDXCompileResult, Heading } from \"./types\";\n\n/**\n * MDX Processor for compiling MDX content to JSX components\n */\nexport class MDXProcessor {\n private config: MDXConfig;\n\n constructor(config: MDXConfig = {}) {\n this.config = config;\n }\n\n /**\n * Compile MDX content to a JSX component\n */\n async compile(\n content: string,\n frontmatter: Record<string, unknown> = {},\n ): Promise<MDXCompileResult> {\n // Extract headings for table of contents\n const headings = this.extractHeadings(content);\n\n // Compile MDX to JavaScript\n const compiled = await compile(content, {\n outputFormat: \"function-body\",\n development: false,\n remarkPlugins: (this.config.remarkPlugins ?? []) as Pluggable[],\n rehypePlugins: (this.config.rehypePlugins ?? []) as Pluggable[],\n // Use SemaJSX runtime\n jsxImportSource: \"semajsx/dom\",\n });\n\n // Dynamic import of JSX runtime\n const jsxRuntime = await import(\"semajsx/dom/jsx-runtime\");\n\n // Create the Content component\n const Content = this.createComponent(\n String(compiled),\n this.config.components ?? {},\n jsxRuntime,\n );\n\n return {\n Content,\n frontmatter,\n headings,\n };\n }\n\n /**\n * Create a component from compiled MDX code\n */\n private createComponent(\n code: string,\n components: Record<string, (props: Record<string, unknown>) => VNode>,\n jsxRuntime: unknown,\n ): (props?: Record<string, unknown>) => VNode {\n // Import JSX runtime\n // This will be resolved at runtime\n return (props: Record<string, unknown> = {}) => {\n try {\n // Create a function from the MDX compiled code\n // MDX compiled code expects jsx runtime in arguments[0]\n // By using new Function() with no parameters, we can pass\n // the runtime via call() and it becomes arguments[0]\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const fn = new Function(code + \"\\nreturn MDXContent;\");\n\n // Call with jsxRuntime as arguments[0]\n // MDX returns an object with default export\n const result = fn.call(null, jsxRuntime) as {\n default: (props: Record<string, unknown>) => VNode;\n };\n return result.default({ ...props, components });\n } catch (e) {\n // Fallback for when runtime is not available\n throw new Error(`MDX rendering failed: ${(e as Error).message}`);\n }\n };\n }\n\n /**\n * Extract headings from markdown content\n */\n private extractHeadings(content: string): Heading[] {\n const headings: Heading[] = [];\n const headingRegex = /^(#{1,6})\\s+(.+)$/gm;\n\n let match;\n while ((match = headingRegex.exec(content)) !== null) {\n const hashes = match[1];\n const rawText = match[2];\n if (!hashes || !rawText) continue;\n\n const depth = hashes.length;\n const text = rawText.trim();\n const slug = this.slugify(text);\n\n headings.push({ depth, text, slug });\n }\n\n return headings;\n }\n\n /**\n * Convert text to URL-friendly slug\n */\n private slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .trim();\n }\n}\n\n/**\n * Create an MDX processor instance\n */\nexport function createMDXProcessor(config?: MDXConfig): MDXProcessor {\n return new MDXProcessor(config);\n}\n","import { compile } from \"@mdx-js/mdx\";\nimport type { Plugin, PluginOption } from \"vite\";\nimport type { Pluggable } from \"unified\";\n\n/**\n * MDX plugin options\n */\nexport interface MDXPluginOptions {\n /** Remark plugins */\n remarkPlugins?: unknown[];\n /** Rehype plugins */\n rehypePlugins?: unknown[];\n}\n\n/**\n * Vite plugin for MDX support\n * Transforms .mdx files to JSX modules\n */\nexport function viteMDXPlugin(options: MDXPluginOptions = {}): PluginOption {\n const plugin: Plugin = {\n name: \"semajsx-mdx\",\n\n async transform(code: string, id: string) {\n // Only transform .mdx files\n if (!id.endsWith(\".mdx\")) {\n return null;\n }\n\n try {\n // Compile MDX to JavaScript (not JSX)\n const compiled = await compile(code, {\n jsxImportSource: \"semajsx/dom\",\n outputFormat: \"program\",\n development: false,\n remarkPlugins: (options.remarkPlugins ?? []) as Pluggable[],\n rehypePlugins: (options.rehypePlugins ?? []) as Pluggable[],\n });\n\n return {\n code: String(compiled),\n map: null,\n };\n } catch (error) {\n const err = error as Error;\n throw new Error(`MDX compilation failed for ${id}: ${err.message}`);\n }\n },\n };\n\n return plugin;\n}\n","import { mkdir, writeFile, rm } from \"fs/promises\";\nimport { join, dirname, resolve } from \"path\";\nimport { createApp, renderDocument } from \"@semajsx/ssr\";\nimport type { App, RouteContext } from \"@semajsx/ssr\";\nimport { DefaultDocument } from \"./document\";\nimport type { VNode } from \"@semajsx/core\";\nimport {\n RawHTML,\n type SSGConfig,\n type SSGPlugin,\n type SSGInstance,\n type MDXConfig,\n type RouteConfig,\n type DocumentTemplate,\n type Collection,\n type CollectionEntry,\n type BuildOptions,\n type BuildResult,\n type BuildState,\n type WatchOptions,\n type Watcher,\n type DocumentProps,\n type InferCollections,\n} from \"./types\";\nimport { viteMDXPlugin } from \"./mdx\";\n\n/**\n * Sort plugins by enforce order: 'pre' → normal → 'post'\n */\nfunction sortPlugins(plugins: SSGPlugin[]): SSGPlugin[] {\n const pre: SSGPlugin[] = [];\n const normal: SSGPlugin[] = [];\n const post: SSGPlugin[] = [];\n\n for (const plugin of plugins) {\n if (plugin.enforce === \"pre\") pre.push(plugin);\n else if (plugin.enforce === \"post\") post.push(plugin);\n else normal.push(plugin);\n }\n\n return [...pre, ...normal, ...post];\n}\n\n/**\n * Merge a partial MDX config into an existing one.\n */\nfunction mergeMdxConfig(base: MDXConfig, partial: Partial<MDXConfig>): MDXConfig {\n return {\n remarkPlugins: [...(base.remarkPlugins ?? []), ...(partial.remarkPlugins ?? [])],\n rehypePlugins: [...(base.rehypePlugins ?? []), ...(partial.rehypePlugins ?? [])],\n components: { ...base.components, ...partial.components },\n };\n}\n\n/**\n * Resolved config produced by running all plugin config hooks.\n */\ninterface ResolvedPluginConfig {\n mdx: MDXConfig;\n document?: DocumentTemplate;\n routes: RouteConfig[];\n collections: Collection[];\n}\n\n/**\n * Result of plugin resolution: merged config + flat list of all plugins.\n */\ninterface PluginResolutionResult {\n config: ResolvedPluginConfig;\n allPlugins: SSGPlugin[];\n}\n\n/**\n * Run config hooks on all plugins, then merge with user config.\n *\n * Plugin arrays are flattened Vite-style: plugin factories may return\n * `SSGPlugin | SSGPlugin[]`, and the top-level array is `.flat()`-ed\n * before sorting and processing.\n *\n * Merge strategies:\n * - mdx: merge (concat arrays, merge component objects)\n * - document: override (last writer wins, user config last)\n * - routes: concat (plugin routes first, then user routes)\n * - collections: concat (plugin collections first, then user collections)\n */\nfunction resolvePlugins(\n plugins: (SSGPlugin | SSGPlugin[])[],\n config: SSGConfig,\n): PluginResolutionResult {\n // Vite-style: flatten nested arrays from plugin factories\n const flat = plugins.flat();\n const sorted = sortPlugins(flat);\n\n let mdx: MDXConfig = { remarkPlugins: [], rehypePlugins: [], components: {} };\n let document: DocumentTemplate | undefined;\n const routes: RouteConfig[] = [];\n const collections: Collection[] = [];\n\n // Call config hooks in order\n for (const plugin of sorted) {\n if (!plugin.config) continue;\n const partial = plugin.config(config);\n if (!partial) continue;\n\n if (partial.mdx) mdx = mergeMdxConfig(mdx, partial.mdx);\n if (partial.document) document = partial.document;\n if (partial.routes) routes.push(...partial.routes);\n if (partial.collections) collections.push(...partial.collections);\n }\n\n // User config takes precedence (applied last)\n if (config.mdx) mdx = mergeMdxConfig(mdx, config.mdx);\n if (config.document) document = config.document;\n if (config.routes) routes.push(...config.routes);\n if (config.collections) collections.push(...config.collections);\n\n return { config: { mdx, document, routes, collections }, allPlugins: sorted };\n}\n\n/**\n * SSG (Static Site Generator) core class\n * Built on top of server's createApp\n */\nexport class SSG<\n TRegistry extends Record<string, unknown> = Record<string, unknown>,\n> implements SSGInstance<TRegistry> {\n private config: SSGConfig;\n private plugins: SSGPlugin[];\n private rootDir: string;\n private collections: Map<string, Collection>;\n private entriesCache: Map<string, CollectionEntry[]>;\n private app: App;\n private mdxModules: Map<string, string> = new Map();\n\n constructor(config: SSGConfig) {\n // Resolve rootDir\n this.rootDir = config.rootDir ?? process.cwd();\n\n // Run config hooks — merges plugins + user config, collects all plugins (including nested)\n const { config: resolved, allPlugins } = resolvePlugins(config.plugins ?? [], config);\n\n // Store all plugins (including sub-plugins) for lifecycle hooks\n this.plugins = allPlugins;\n\n this.config = {\n base: \"/\",\n ...config,\n mdx: resolved.mdx,\n document: resolved.document,\n routes: resolved.routes,\n collections: resolved.collections,\n outDir: resolve(this.rootDir, config.outDir),\n };\n\n // Call configResolved on all plugins\n for (const plugin of this.plugins) {\n plugin.configResolved?.(this.config);\n }\n this.collections = new Map();\n this.entriesCache = new Map();\n\n // Create App with MDX plugins\n this.app = createApp({\n root: this.rootDir,\n vite: {\n plugins: [\n // Virtual MDX content modules\n {\n name: \"ssg-virtual-mdx\",\n resolveId: (id: string) => {\n if (id.startsWith(\"virtual:mdx:\")) {\n return \"\\0\" + id;\n }\n },\n load: (id: string) => {\n if (id.startsWith(\"\\0virtual:mdx:\")) {\n const mdxId = id.replace(\"\\0virtual:mdx:\", \"\");\n return this.mdxModules.get(mdxId);\n }\n },\n },\n // MDX compiler plugin\n viteMDXPlugin(resolved.mdx),\n ],\n },\n });\n\n // Register collections (from resolved config — plugins + user)\n for (const collection of this.config.collections ?? []) {\n this.collections.set(collection.name, collection);\n }\n }\n\n getRootDir(): string {\n return this.rootDir;\n }\n\n async getCollection<K extends keyof TRegistry & string>(\n name: K,\n ): Promise<CollectionEntry<TRegistry[K]>[]> {\n const collection = this.collections.get(name);\n if (!collection) {\n throw new Error(`Collection \"${name}\" not found`);\n }\n\n if (this.entriesCache.has(name)) {\n return this.entriesCache.get(name) as CollectionEntry<TRegistry[K]>[];\n }\n\n const entries = await collection.source.getEntries();\n\n const validatedEntries = entries.map((entry) => {\n const result = collection.schema.safeParse(entry.data);\n if (!result.success) {\n throw new Error(`Validation error in ${name}/${entry.id}: ${result.error.message}`);\n }\n\n return {\n ...entry,\n data: result.data,\n render: async () => {\n // Get Vite server from app\n const vite = this.app.getViteServer();\n if (!vite) {\n throw new Error(\"Vite server not initialized\");\n }\n\n // Store MDX content as virtual module\n const mdxId = `${name}/${entry.id}.mdx`;\n this.mdxModules.set(mdxId, entry.body);\n\n try {\n // Load module through Vite SSR\n const moduleExports = (await vite.ssrLoadModule(`virtual:mdx:${mdxId}`)) as {\n default: (props: Record<string, unknown>) => unknown;\n };\n\n const Content = (props: Record<string, unknown> = {}): VNode =>\n moduleExports.default({\n ...props,\n components: this.config.mdx?.components ?? {},\n }) as VNode;\n\n return {\n Content,\n headings: this.extractHeadings(entry.body),\n };\n } finally {\n this.mdxModules.delete(mdxId);\n }\n },\n };\n });\n\n this.entriesCache.set(name, validatedEntries);\n return validatedEntries as CollectionEntry<TRegistry[K]>[];\n }\n\n async getEntry<K extends keyof TRegistry & string>(\n name: K,\n id: string,\n ): Promise<CollectionEntry<TRegistry[K]> | null> {\n const entries = await this.getCollection(name);\n return entries.find((e) => e.id === id || e.slug === id) ?? null;\n }\n\n async build(options: BuildOptions = {}): Promise<BuildResult> {\n const { incremental = false, state: prevState } = options;\n const outDir = this.config.outDir;\n\n // Plugin hook: buildStart\n for (const plugin of this.plugins) {\n await plugin.buildStart?.();\n }\n\n // Initialize App (starts Vite)\n await this.app.prepare();\n\n try {\n // Register routes with App\n await this.registerRoutes();\n\n // Build all pages\n const result = await this.buildPages(incremental, prevState, outDir);\n\n // Build islands for client-side hydration\n // Pass renderHtml so the Vite build uses the SSG's Document template\n // instead of a hardcoded minimal HTML template\n const documentTemplate = this.config.document ?? DefaultDocument;\n await this.app.build({\n outDir,\n mode: \"full\",\n minify: true,\n renderHtml: ({ html, css, styles, scripts, title, path: routePath }) => {\n const scriptsHtml = scripts\n .map((s) => `<script type=\"module\" src=\"${s.src}\"></script>`)\n .join(\"\\n\");\n const documentProps: DocumentProps = {\n children: new RawHTML(html),\n title,\n base: this.config.base ?? \"/\",\n path: routePath,\n props: {},\n scripts: scriptsHtml ? new RawHTML(scriptsHtml) : undefined,\n css: css ?? [],\n styles: styles ?? [],\n };\n const documentVNode = documentTemplate(documentProps);\n return renderDocument(documentVNode);\n },\n vite: {\n build: {\n rollupOptions: {\n // Don't externalize for SSG - bundle everything\n external: [],\n },\n },\n },\n });\n\n // Plugin hook: buildEnd\n for (const plugin of this.plugins) {\n await plugin.buildEnd?.(result, this);\n }\n\n return result;\n } finally {\n await this.app.close();\n }\n }\n\n private async registerRoutes(): Promise<void> {\n const routes = this.config.routes ?? [];\n\n for (const route of routes) {\n if (route.getStaticPaths) {\n // Dynamic route - register each path\n const staticPaths = await route.getStaticPaths(this);\n for (const sp of staticPaths) {\n const path = this.applyParams(route.path, sp.params);\n const props: Record<string, unknown> = { ...sp.props, params: sp.params };\n\n this.app.route(\n path,\n (_context: RouteContext) => {\n return route.component(props);\n },\n { title: props.title as string | undefined },\n );\n }\n } else {\n // Static route\n let props: Record<string, unknown> = {};\n if (typeof route.props === \"function\") {\n props = await route.props(this);\n } else if (route.props) {\n props = route.props;\n }\n\n this.app.route(\n route.path,\n (_context: RouteContext) => {\n return route.component(props);\n },\n { title: props.title as string | undefined },\n );\n }\n }\n }\n\n private async buildPages(\n incremental: boolean,\n prevState: BuildState | undefined,\n outDir: string,\n ): Promise<BuildResult> {\n const state: BuildState = {\n cursors: {},\n pageHashes: {},\n timestamp: Date.now(),\n };\n\n const stats = { added: 0, updated: 0, deleted: 0, unchanged: 0 };\n const builtPaths: string[] = [];\n\n if (!incremental) {\n await rm(outDir, { recursive: true, force: true });\n }\n await mkdir(outDir, { recursive: true });\n\n this.entriesCache.clear();\n\n // Get all paths to build\n const allPaths = await this.generateAllPaths();\n const currentPaths = new Set(allPaths.map((p) => p.path));\n\n // Delete removed pages\n if (incremental && prevState) {\n for (const oldPath of Object.keys(prevState.pageHashes)) {\n if (!currentPaths.has(oldPath)) {\n const filePath = this.pathToFilePath(oldPath);\n try {\n await rm(join(outDir, filePath));\n stats.deleted++;\n } catch {\n // ignore\n }\n }\n }\n }\n\n // Build each page\n for (const { path, props } of allPaths) {\n const html = await this.renderPage(path, props);\n const hash = this.hashContent(html);\n\n const prevHash = prevState?.pageHashes[path];\n const needsWrite = !incremental || !prevHash || prevHash !== hash;\n\n if (needsWrite) {\n const filePath = this.pathToFilePath(path);\n const fullPath = join(outDir, filePath);\n\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, html);\n\n builtPaths.push(path);\n if (!prevHash) {\n stats.added++;\n } else {\n stats.updated++;\n }\n } else {\n stats.unchanged++;\n }\n\n state.pageHashes[path] = hash;\n }\n\n for (const [name, collection] of this.collections) {\n if (collection.source.getChanges) {\n state.cursors[name] = Date.now().toString();\n }\n }\n\n return { state, paths: builtPaths, stats };\n }\n\n private async renderPage(path: string, props: Record<string, unknown>): Promise<string> {\n // Use App to render the page\n const result = await this.app.render(path);\n\n // Wrap with document template\n const documentProps: DocumentProps = {\n children: new RawHTML(result.html),\n title: props.title as string | undefined,\n base: this.config.base ?? \"/\",\n path,\n props,\n scripts: result.scripts ? new RawHTML(result.scripts) : undefined,\n css: result.css ?? [],\n styles: result.styles ?? [],\n };\n\n const template = this.config.document ?? DefaultDocument;\n const documentVNode = template(documentProps);\n\n return renderDocument(documentVNode);\n }\n\n private async generateAllPaths(): Promise<\n Array<{ path: string; props: Record<string, unknown> }>\n > {\n const paths: Array<{ path: string; props: Record<string, unknown> }> = [];\n const routes = this.config.routes ?? [];\n\n for (const route of routes) {\n if (route.getStaticPaths) {\n const staticPaths = await route.getStaticPaths(this);\n for (const sp of staticPaths) {\n const path = this.applyParams(route.path, sp.params);\n paths.push({ path, props: { ...sp.props, params: sp.params } });\n }\n } else {\n let props: Record<string, unknown> = {};\n if (typeof route.props === \"function\") {\n props = await route.props(this);\n } else if (route.props) {\n props = route.props;\n }\n paths.push({ path: route.path, props });\n }\n }\n\n return paths;\n }\n\n watch(options: WatchOptions = {}): Watcher {\n const unsubscribers: (() => void)[] = [];\n\n for (const [name, collection] of this.collections) {\n if (collection.source.watch) {\n const unsubscribe = collection.source.watch(async () => {\n try {\n this.entriesCache.delete(name);\n const result = await this.build({ incremental: true });\n options.onRebuild?.(result);\n } catch (error) {\n options.onError?.(error as Error);\n }\n });\n unsubscribers.push(unsubscribe);\n }\n }\n\n return {\n close: () => unsubscribers.forEach((fn) => fn()),\n };\n }\n\n private pathToFilePath(urlPath: string): string {\n if (urlPath === \"/\") return \"index.html\";\n return `${urlPath.slice(1)}/index.html`;\n }\n\n private applyParams(pattern: string, params: Record<string, string>): string {\n let path = pattern;\n for (const [key, value] of Object.entries(params)) {\n path = path.replace(`:${key}`, value);\n }\n return path;\n }\n\n private hashContent(content: string): string {\n let hash = 0;\n for (let i = 0; i < content.length; i++) {\n const char = content.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return hash.toString(16);\n }\n\n private extractHeadings(content: string): Array<{ depth: number; text: string; slug: string }> {\n const headings: Array<{ depth: number; text: string; slug: string }> = [];\n const regex = /^(#{1,6})\\s+(.+)$/gm;\n\n let match;\n while ((match = regex.exec(content)) !== null) {\n if (!match[1] || !match[2]) continue;\n const depth = match[1].length;\n const text = match[2].trim();\n const slug = text\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\");\n headings.push({ depth, text, slug });\n }\n\n return headings;\n }\n}\n\nexport function createSSG<\n const TCollections extends readonly Collection[],\n TRegistry extends Record<string, unknown> = InferCollections<TCollections>,\n>(config: SSGConfig<TCollections, TRegistry>): SSGInstance<TRegistry> {\n return new SSG<TRegistry>(config as unknown as SSGConfig);\n}\n","import type { z } from \"zod\";\nimport type { Collection, CollectionConfig } from \"../types\";\n\n/**\n * Define a collection with schema validation\n */\nexport function defineCollection<T extends z.ZodType>(\n config: CollectionConfig<T>,\n): Collection<z.infer<T>> {\n return {\n name: config.name,\n source: config.source,\n schema: config.schema,\n };\n}\n\nexport type { Collection, CollectionConfig, CollectionEntry } from \"../types\";\n","import type { CollectionSource, CollectionEntry, ChangeSet, WatchCallback } from \"../types\";\n\n/**\n * Base class for collection sources\n */\nexport abstract class BaseSource<T = unknown> implements CollectionSource<T> {\n abstract id: string;\n\n abstract getEntries(): Promise<CollectionEntry<T>[]>;\n\n async getEntry(id: string): Promise<CollectionEntry<T> | null> {\n const entries = await this.getEntries();\n return entries.find((e) => e.id === id) ?? null;\n }\n\n watch?(callback: WatchCallback<T>): () => void;\n\n getChanges?(since: string): Promise<ChangeSet<T>>;\n}\n","import { glob } from \"glob\";\nimport matter from \"gray-matter\";\nimport { readFile, watch as fsWatch } from \"fs/promises\";\nimport { join, relative } from \"path\";\nimport type { CollectionEntry, ChangeSet, WatchCallback } from \"../types\";\nimport type { FileSourceOptions } from \"./types\";\nimport { BaseSource } from \"./base\";\n\n/**\n * File system source for collections\n */\nexport class FileSource<T = unknown> extends BaseSource<T> {\n id: string;\n private directory: string;\n private include: string;\n private shouldWatch: boolean;\n private contentRoot: string;\n\n constructor(options: FileSourceOptions, contentRoot: string = process.cwd()) {\n super();\n this.directory = options.directory;\n this.include = options.include ?? \"**/*.{md,mdx}\";\n this.shouldWatch = options.watch ?? false;\n this.contentRoot = contentRoot;\n this.id = `file:${this.directory}`;\n }\n\n async getEntries(): Promise<CollectionEntry<T>[]> {\n const dir = join(this.contentRoot, this.directory);\n const pattern = join(dir, this.include);\n const files = await glob(pattern);\n\n const entries = await Promise.all(\n files.map(async (filePath) => {\n const content = await readFile(filePath, \"utf-8\");\n const { data, content: body } = matter(content);\n\n const relativePath = relative(dir, filePath);\n const id = relativePath.replace(/\\.(md|mdx)$/, \"\");\n const slug = id.replace(/\\\\/g, \"/\");\n\n return {\n id,\n slug,\n data: data as T,\n body,\n render: async () => {\n // MDX compilation will be handled by the MDX processor\n return {\n Content: () => {\n throw new Error(\"MDX rendering not yet implemented\");\n },\n };\n },\n };\n }),\n );\n\n return entries;\n }\n\n override watch(callback: WatchCallback<T>): () => void {\n if (!this.shouldWatch) {\n return () => {};\n }\n\n const dir = join(this.contentRoot, this.directory);\n const abortController = new AbortController();\n\n const startWatching = async () => {\n try {\n const watcher = fsWatch(dir, {\n recursive: true,\n signal: abortController.signal,\n });\n\n for await (const _event of watcher) {\n // Debounce and collect changes\n const entries = await this.getEntries();\n callback({\n cursor: Date.now().toString(),\n added: [],\n updated: entries,\n deleted: [],\n });\n }\n } catch (err) {\n if ((err as Error).name !== \"AbortError\") {\n throw err;\n }\n }\n };\n\n startWatching();\n\n return () => {\n abortController.abort();\n };\n }\n\n override async getChanges(_since: string): Promise<ChangeSet<T>> {\n // For file source, we do a full reload\n // A more sophisticated implementation could track file mtimes\n const entries = await this.getEntries();\n return {\n cursor: Date.now().toString(),\n added: [],\n updated: entries,\n deleted: [],\n };\n }\n}\n\n/**\n * Create a file system source\n */\nexport function fileSource<T = unknown>(\n options: FileSourceOptions,\n contentRoot?: string,\n): FileSource<T> {\n return new FileSource<T>(options, contentRoot);\n}\n","import { exec } from \"child_process\";\nimport { promisify } from \"util\";\nimport type { CollectionEntry } from \"../types\";\nimport type { GitSourceOptions, GitCommitSourceOptions, GitTagSourceOptions } from \"./types\";\nimport { BaseSource } from \"./base\";\n\nconst execAsync = promisify(exec);\n\n/**\n * Git source for collections\n */\nexport class GitSource<T = unknown> extends BaseSource<T> {\n id: string;\n private options: GitSourceOptions;\n private cwd: string;\n\n constructor(options: GitSourceOptions, cwd: string = process.cwd()) {\n super();\n this.options = options;\n this.cwd = cwd;\n this.id = `git:${options.type}`;\n }\n\n async getEntries(): Promise<CollectionEntry<T>[]> {\n if (this.options.type === \"commits\") {\n return this.getCommits(this.options);\n } else {\n return this.getTags(this.options);\n }\n }\n\n private async getCommits(options: GitCommitSourceOptions): Promise<CollectionEntry<T>[]> {\n const args = [\"log\", \"--format=%H|%s|%an|%ae|%aI\"];\n\n if (options.filter?.since) {\n args.push(`--since=${options.filter.since}`);\n }\n if (options.filter?.until) {\n args.push(`--until=${options.filter.until}`);\n }\n if (options.filter?.author) {\n args.push(`--author=${options.filter.author}`);\n }\n if (options.limit) {\n args.push(`-n`, options.limit.toString());\n }\n if (options.filter?.paths?.length) {\n args.push(\"--\", ...options.filter.paths);\n }\n\n const { stdout } = await execAsync(`git ${args.join(\" \")}`, {\n cwd: this.cwd,\n });\n const lines = stdout.trim().split(\"\\n\").filter(Boolean);\n\n return lines.map((line) => {\n const parts = line.split(\"|\");\n const hash = parts[0] ?? \"\";\n const message = parts[1] ?? \"\";\n const author = parts[2] ?? \"\";\n const email = parts[3] ?? \"\";\n const dateStr = parts[4] ?? \"\";\n\n const data = {\n hash,\n message,\n author,\n email,\n date: new Date(dateStr),\n } as unknown as T;\n\n return {\n id: hash,\n slug: hash.slice(0, 7),\n data,\n body: message,\n render: async () => ({\n Content: () => {\n throw new Error(\"Git commits cannot be rendered as content\");\n },\n }),\n };\n });\n }\n\n private async getTags(options: GitTagSourceOptions): Promise<CollectionEntry<T>[]> {\n const pattern = options.pattern ?? \"*\";\n\n // Get tags with date and message\n const { stdout } = await execAsync(\n `git tag -l \"${pattern}\" --format=\"%(refname:short)|%(objectname:short)|%(creatordate:iso)|%(contents:subject)\"`,\n { cwd: this.cwd },\n );\n\n const lines = stdout.trim().split(\"\\n\").filter(Boolean);\n\n return lines.map((line) => {\n const parts = line.split(\"|\");\n const tag = parts[0] ?? \"\";\n const hash = parts[1] ?? \"\";\n const dateStr = parts[2] ?? \"\";\n const message = parts[3] ?? \"\";\n\n const data = {\n tag,\n hash,\n date: new Date(dateStr),\n message: message || undefined,\n } as unknown as T;\n\n return {\n id: tag,\n slug: tag,\n data,\n body: message,\n render: async () => ({\n Content: () => {\n throw new Error(\"Git tags cannot be rendered as content\");\n },\n }),\n };\n });\n }\n}\n\n/**\n * Create a Git source\n */\nexport function gitSource<T = unknown>(options: GitSourceOptions, cwd?: string): GitSource<T> {\n return new GitSource<T>(options, cwd);\n}\n","import type { CollectionEntry, ChangeSet, WatchCallback } from \"../types\";\nimport type { RemoteSourceOptions, WebhookConfig } from \"./types\";\nimport { BaseSource } from \"./base\";\n\n/**\n * Remote API source for collections\n */\nexport class RemoteSource<T = unknown> extends BaseSource<T> {\n id: string;\n private options: RemoteSourceOptions<T>;\n private pollTimer?: ReturnType<typeof setInterval>;\n\n constructor(options: RemoteSourceOptions<T>, id: string = \"remote\") {\n super();\n this.options = options;\n this.id = `remote:${id}`;\n }\n\n async getEntries(): Promise<CollectionEntry<T>[]> {\n const items = await this.options.fetch();\n\n return items.map((item, index) => {\n const id = (item as Record<string, unknown>).id?.toString() ?? index.toString();\n const slug = (item as Record<string, unknown>).slug?.toString() ?? id;\n\n return {\n id,\n slug,\n data: item,\n body: (item as Record<string, unknown>).content?.toString() ?? \"\",\n render: async () => ({\n Content: () => {\n throw new Error(\"Remote content rendering not yet implemented\");\n },\n }),\n };\n });\n }\n\n override async getEntry(id: string): Promise<CollectionEntry<T> | null> {\n if (this.options.fetchOne) {\n const item = await this.options.fetchOne(id);\n if (!item) return null;\n\n const slug = (item as Record<string, unknown>).slug?.toString() ?? id;\n\n return {\n id,\n slug,\n data: item,\n body: (item as Record<string, unknown>).content?.toString() ?? \"\",\n render: async () => ({\n Content: () => {\n throw new Error(\"Remote content rendering not yet implemented\");\n },\n }),\n };\n }\n\n return super.getEntry(id);\n }\n\n override watch(callback: WatchCallback<T>): () => void {\n if (this.options.pollInterval) {\n this.pollTimer = setInterval(async () => {\n const entries = await this.getEntries();\n callback({\n cursor: Date.now().toString(),\n added: [],\n updated: entries,\n deleted: [],\n });\n }, this.options.pollInterval);\n\n return () => {\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n }\n };\n }\n\n return () => {};\n }\n\n override async getChanges(since: string): Promise<ChangeSet<T>> {\n if (this.options.fetchChanges) {\n return this.options.fetchChanges(since);\n }\n\n // Fallback to full reload\n const entries = await this.getEntries();\n return {\n cursor: Date.now().toString(),\n added: [],\n updated: entries,\n deleted: [],\n };\n }\n\n /**\n * Get webhook configuration for external integration\n */\n getWebhookConfig(): WebhookConfig | undefined {\n return this.options.webhook;\n }\n}\n\n/**\n * Create a remote API source\n */\nexport function remoteSource<T = unknown>(\n options: RemoteSourceOptions<T>,\n id?: string,\n): RemoteSource<T> {\n return new RemoteSource<T>(options, id);\n}\n","import type { CollectionEntry, ChangeSet, WatchCallback } from \"../types\";\nimport type { CustomSourceOptions } from \"./types\";\nimport { BaseSource } from \"./base\";\n\n/**\n * Custom source for collections\n */\nexport class CustomSource<T = unknown> extends BaseSource<T> {\n id: string;\n private options: CustomSourceOptions<T>;\n\n constructor(options: CustomSourceOptions<T>) {\n super();\n this.options = options;\n this.id = options.id;\n }\n\n async getEntries(): Promise<CollectionEntry<T>[]> {\n const items = await this.options.getEntries();\n\n return items.map((item, index) => {\n const id = (item as Record<string, unknown>).id?.toString() ?? index.toString();\n const slug = (item as Record<string, unknown>).slug?.toString() ?? id;\n\n return {\n id,\n slug,\n data: item,\n body: (item as Record<string, unknown>).body?.toString() ?? \"\",\n render: async () => ({\n Content: () => {\n throw new Error(\"Custom content rendering not yet implemented\");\n },\n }),\n };\n });\n }\n\n override async getEntry(id: string): Promise<CollectionEntry<T> | null> {\n if (this.options.getEntry) {\n const item = await this.options.getEntry(id);\n if (!item) return null;\n\n const slug = (item as Record<string, unknown>).slug?.toString() ?? id;\n\n return {\n id,\n slug,\n data: item,\n body: (item as Record<string, unknown>).body?.toString() ?? \"\",\n render: async () => ({\n Content: () => {\n throw new Error(\"Custom content rendering not yet implemented\");\n },\n }),\n };\n }\n\n return super.getEntry(id);\n }\n\n override watch(callback: WatchCallback<T>): () => void {\n if (this.options.watch) {\n return this.options.watch(callback);\n }\n return () => {};\n }\n\n override async getChanges(since: string): Promise<ChangeSet<T>> {\n if (this.options.getChanges) {\n return this.options.getChanges(since);\n }\n\n const entries = await this.getEntries();\n return {\n cursor: Date.now().toString(),\n added: [],\n updated: entries,\n deleted: [],\n };\n }\n}\n\n/**\n * Create a custom source\n */\nexport function createSource<T = unknown>(options: CustomSourceOptions<T>): CustomSource<T> {\n return new CustomSource<T>(options);\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { d as VNode } from "../types-C83YtOen.mjs";
2
- import { S as Watcher, _ as SSGPlugin, a as Collection, b as WatchCallback, c as CollectionSource, d as InferCollections, f as MDXConfig, g as SSGInstance, h as SSGConfig, i as ChangeSet, l as DocumentProps, m as RouteConfig, n as BuildResult, o as CollectionConfig, p as RawHTML, r as BuildState, s as CollectionEntry, t as BuildOptions, u as DocumentTemplate, v as SSGPluginConfig, x as WatchOptions, y as StaticPath } from "../types-BmDIxXiP.mjs";
2
+ import { S as Watcher, _ as SSGPlugin, a as Collection, b as WatchCallback, c as CollectionSource, d as InferCollections, f as MDXConfig, g as SSGInstance, h as SSGConfig, i as ChangeSet, l as DocumentProps, m as RouteConfig, n as BuildResult, o as CollectionConfig, p as RawHTML, r as BuildState, s as CollectionEntry, t as BuildOptions, u as DocumentTemplate, v as SSGPluginConfig, x as WatchOptions, y as StaticPath } from "../types-BaS-zTDX.mjs";
3
3
  import { PluginOption } from "vite";
4
4
  import { z, z as z$1 } from "zod";
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../ssg/src/ssg.ts","../../../ssg/src/document.tsx","../../../ssg/src/collection/index.ts","../../../ssg/src/sources/base.ts","../../../ssg/src/sources/types.ts","../../../ssg/src/sources/file.ts","../../../ssg/src/sources/git.ts","../../../ssg/src/sources/remote.ts","../../../ssg/src/sources/custom.ts","../../../ssg/src/mdx/types.ts","../../../ssg/src/mdx/processor.ts","../../../ssg/src/watcher/webhook.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../ssg/src/ssg.ts","../../../ssg/src/document.tsx","../../../ssg/src/collection/index.ts","../../../ssg/src/sources/base.ts","../../../ssg/src/sources/types.ts","../../../ssg/src/sources/file.ts","../../../ssg/src/sources/git.ts","../../../ssg/src/sources/remote.ts","../../../ssg/src/sources/custom.ts","../../../ssg/src/mdx/types.ts","../../../ssg/src/mdx/processor.ts","../../../ssg/src/watcher/webhook.ts"],"mappings":"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"}
@@ -1,13 +1,18 @@
1
- import { _ as DefaultDocument, a as remoteSource, c as FileSource, d as defineCollection, f as SSG, g as RawHTML, h as createMDXProcessor, i as RemoteSource, l as fileSource, m as MDXProcessor, n as CustomSource, o as GitSource, p as createSSG, r as createSource, s as gitSource, t as z, u as BaseSource, y as __require } from "../src-75qcxwT_.mjs";
2
- import "../src-DW3tIczg.mjs";
3
- import "../src-Ds9vl42d.mjs";
4
- import "../jsx-runtime-D9ZNjMJ2.mjs";
5
- import "../src-DUpFNNM_.mjs";
6
- import "../jsx-runtime-BjCGsceN.mjs";
7
- import "../resource-DSlXDZZi.mjs";
8
- import "../src-B4VBiHa8.mjs";
9
- import "../document-BOJDaiBc.mjs";
1
+ import "../src-Cv4rRVzv.mjs";
2
+ import "../src-DV9uwtE5.mjs";
3
+ import "../jsx-runtime-BFs1c0xz.mjs";
4
+ import "../src-CXY-7FC3.mjs";
5
+ import "../jsx-runtime-kv_6vBiR.mjs";
6
+ import "../resource-pm7qP-jV.mjs";
7
+ import "../src-CAyv9Uf9.mjs";
8
+ import "../document-XKyAs62C.mjs";
9
+ import { _ as DefaultDocument, a as remoteSource, c as FileSource, d as defineCollection, f as SSG, g as RawHTML, h as createMDXProcessor, i as RemoteSource, l as fileSource, m as MDXProcessor, n as CustomSource, o as GitSource, p as createSSG, r as createSource, s as gitSource, t as z, u as BaseSource } from "../src-SqJ6k7Xv.mjs";
10
+ import { createRequire } from "node:module";
10
11
 
12
+ //#region rolldown:runtime
13
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
14
+
15
+ //#endregion
11
16
  //#region ../ssg/src/watcher/webhook.ts
12
17
  /**
13
18
  * Create a webhook handler for triggering SSG builds
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../ssg/src/watcher/webhook.ts"],"sourcesContent":["import type { SSGInstance, BuildResult } from \"../types\";\n\nexport interface WebhookHandlerOptions {\n /** SSG instance to trigger builds */\n ssg: SSGInstance;\n /** Callback when build is triggered */\n onTrigger?: (collection: string, result: BuildResult) => void | Promise<void>;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\nexport interface WebhookRequest {\n /** Collection name from URL path */\n collection: string;\n /** Request body */\n body: unknown;\n /** Request headers */\n headers: Record<string, string>;\n}\n\nexport interface WebhookResponse {\n status: number;\n body: string;\n}\n\n/**\n * Create a webhook handler for triggering SSG builds\n */\nexport function createWebhookHandler(\n options: WebhookHandlerOptions,\n): (req: WebhookRequest) => Promise<WebhookResponse> {\n const { ssg, onTrigger, onError } = options;\n\n return async (req: WebhookRequest): Promise<WebhookResponse> => {\n try {\n const { collection } = req;\n\n // Trigger incremental build for the collection\n const result = await ssg.build({\n incremental: true,\n collections: [collection],\n });\n\n // Call trigger callback\n if (onTrigger) {\n await onTrigger(collection, result);\n }\n\n return {\n status: 200,\n body: JSON.stringify({\n success: true,\n paths: result.paths,\n stats: result.stats,\n }),\n };\n } catch (error) {\n if (onError) {\n onError(error as Error);\n }\n\n return {\n status: 500,\n body: JSON.stringify({\n success: false,\n error: (error as Error).message,\n }),\n };\n }\n };\n}\n\n/**\n * Verify webhook signature (for secure webhooks)\n */\nexport function verifyWebhookSignature(\n payload: string,\n signature: string,\n secret: string,\n): boolean {\n // Simple HMAC verification\n // In production, use crypto.timingSafeEqual\n const crypto = require(\"crypto\");\n const expectedSignature = crypto.createHmac(\"sha256\", secret).update(payload).digest(\"hex\");\n\n return signature === `sha256=${expectedSignature}`;\n}\n"],"mappings":";;;;;;;;;;;;;;AA4BA,SAAgB,qBACd,SACmD;CACnD,MAAM,EAAE,KAAK,WAAW,YAAY;AAEpC,QAAO,OAAO,QAAkD;AAC9D,MAAI;GACF,MAAM,EAAE,eAAe;GAGvB,MAAM,SAAS,MAAM,IAAI,MAAM;IAC7B,aAAa;IACb,aAAa,CAAC,WAAW;IAC1B,CAAC;AAGF,OAAI,UACF,OAAM,UAAU,YAAY,OAAO;AAGrC,UAAO;IACL,QAAQ;IACR,MAAM,KAAK,UAAU;KACnB,SAAS;KACT,OAAO,OAAO;KACd,OAAO,OAAO;KACf,CAAC;IACH;WACM,OAAO;AACd,OAAI,QACF,SAAQ,MAAe;AAGzB,UAAO;IACL,QAAQ;IACR,MAAM,KAAK,UAAU;KACnB,SAAS;KACT,OAAQ,MAAgB;KACzB,CAAC;IACH;;;;;;;AAQP,SAAgB,uBACd,SACA,WACA,QACS;AAMT,QAAO,cAAc,oBAHE,SAAS,CACC,WAAW,UAAU,OAAO,CAAC,OAAO,QAAQ,CAAC,OAAO,MAAM"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../ssg/src/watcher/webhook.ts"],"sourcesContent":["import type { SSGInstance, BuildResult } from \"../types\";\n\nexport interface WebhookHandlerOptions {\n /** SSG instance to trigger builds */\n ssg: SSGInstance;\n /** Callback when build is triggered */\n onTrigger?: (collection: string, result: BuildResult) => void | Promise<void>;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\nexport interface WebhookRequest {\n /** Collection name from URL path */\n collection: string;\n /** Request body */\n body: unknown;\n /** Request headers */\n headers: Record<string, string>;\n}\n\nexport interface WebhookResponse {\n status: number;\n body: string;\n}\n\n/**\n * Create a webhook handler for triggering SSG builds\n */\nexport function createWebhookHandler(\n options: WebhookHandlerOptions,\n): (req: WebhookRequest) => Promise<WebhookResponse> {\n const { ssg, onTrigger, onError } = options;\n\n return async (req: WebhookRequest): Promise<WebhookResponse> => {\n try {\n const { collection } = req;\n\n // Trigger incremental build for the collection\n const result = await ssg.build({\n incremental: true,\n collections: [collection],\n });\n\n // Call trigger callback\n if (onTrigger) {\n await onTrigger(collection, result);\n }\n\n return {\n status: 200,\n body: JSON.stringify({\n success: true,\n paths: result.paths,\n stats: result.stats,\n }),\n };\n } catch (error) {\n if (onError) {\n onError(error as Error);\n }\n\n return {\n status: 500,\n body: JSON.stringify({\n success: false,\n error: (error as Error).message,\n }),\n };\n }\n };\n}\n\n/**\n * Verify webhook signature (for secure webhooks)\n */\nexport function verifyWebhookSignature(\n payload: string,\n signature: string,\n secret: string,\n): boolean {\n // Simple HMAC verification\n // In production, use crypto.timingSafeEqual\n const crypto = require(\"crypto\");\n const expectedSignature = crypto.createHmac(\"sha256\", secret).update(payload).digest(\"hex\");\n\n return signature === `sha256=${expectedSignature}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA4BA,SAAgB,qBACd,SACmD;CACnD,MAAM,EAAE,KAAK,WAAW,YAAY;AAEpC,QAAO,OAAO,QAAkD;AAC9D,MAAI;GACF,MAAM,EAAE,eAAe;GAGvB,MAAM,SAAS,MAAM,IAAI,MAAM;IAC7B,aAAa;IACb,aAAa,CAAC,WAAW;IAC1B,CAAC;AAGF,OAAI,UACF,OAAM,UAAU,YAAY,OAAO;AAGrC,UAAO;IACL,QAAQ;IACR,MAAM,KAAK,UAAU;KACnB,SAAS;KACT,OAAO,OAAO;KACd,OAAO,OAAO;KACf,CAAC;IACH;WACM,OAAO;AACd,OAAI,QACF,SAAQ,MAAe;AAGzB,UAAO;IACL,QAAQ;IACR,MAAM,KAAK,UAAU;KACnB,SAAS;KACT,OAAQ,MAAgB;KACzB,CAAC;IACH;;;;;;;AAQP,SAAgB,uBACd,SACA,WACA,QACS;AAMT,QAAO,cAAc,oBAHE,SAAS,CACC,WAAW,UAAU,OAAO,CAAC,OAAO,QAAQ,CAAC,OAAO,MAAM"}