{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/umbrella/runtime.ts","../packages/domain/runtime/src/index.ts","../packages/domain/theme/src/index.ts","../packages/domain/theme/src/liveTokenEngine.ts","../packages/domain/runtime/src/schemas.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","export * from \"@tailwind-styled/runtime\"\n","/**\n * @tailwind-styled/runtime v5\n *\n * Lightweight runtime helpers for compiled tailwind-styled-v5 components.\n * Live token engine has been moved to @tailwind-styled/theme package.\n */\n\nimport React from \"react\"\n\n// Re-export live token engine from @tailwind-styled/theme\n// Note: Importing from main export, then re-exporting specific items\n// This ensures proper TypeScript resolution in DTS generation\nexport type {\n  LiveTokenEngineBridge,\n  LiveTokenSet,\n  TokenMap,\n  TokenSubscriber,\n} from \"@tailwind-styled/theme\"\n\n// Import from main theme export which includes live-tokens exports\nimport {\n  applyTokenSet,\n  createUseTokens,\n  generateTokenCssString,\n  getToken,\n  getTokens,\n  liveToken,\n  liveTokenEngine,\n  setToken,\n  setTokens,\n  subscribeTokens,\n  tokenRef,\n  tokenVar,\n} from \"@tailwind-styled/theme\"\n\n// Re-export with proper types\nexport {\n  applyTokenSet,\n  createUseTokens,\n  generateTokenCssString,\n  getToken,\n  getTokens,\n  liveToken,\n  liveTokenEngine,\n  setToken,\n  setTokens,\n  subscribeTokens,\n  tokenRef,\n  tokenRef as containerRef,\n  tokenVar,\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface SubComponentDef {\n  /** HTML tag to render (default: \"span\") */\n  tag?: string\n  /** Scoped CSS class generated by Rust, e.g. \"Button_icon_abc123\" */\n  class: string\n}\n\nexport type SubComponentMap = Record<string, SubComponentDef>\n\n/**\n * Map of prop name → CSS class appended when the prop is truthy.\n * e.g. { fullWidth: \"w-full\", large: \"text-lg px-6 py-3\" }\n */\nexport type ConditionalProps = Record<string, string>\n\n/**\n * A compound styled component: base ForwardRef + attached .SubName properties.\n * The generic params are intentionally loose so callers don't need to repeat them.\n */\nexport type StyledComponent<S extends SubComponentMap = SubComponentMap> =\n  React.ForwardRefExoticComponent<\n    React.HTMLAttributes<HTMLElement> & React.RefAttributes<HTMLElement>\n  > & {\n    [K in keyof S]: React.ForwardRefExoticComponent<\n      React.HTMLAttributes<HTMLElement> & React.RefAttributes<HTMLElement>\n    >\n  }\n\n/** Metadata for one compound component produced by Rust. */\nexport interface ComponentMetadata {\n  component: string\n  tag: string\n  baseClass: string\n  subComponents: SubComponentMap\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// cx — tiny className utility (no external dependency)\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype ClassInput = string | number | false | null | undefined | ClassInput[]\n\nexport function cx(...inputs: ClassInput[]): string {\n  const out: string[] = []\n  for (const input of inputs) {\n    if (!input) continue // filters 0, false, null, undefined, \"\"\n    if (typeof input === \"string\") {\n      out.push(input)\n    } else if (typeof input === \"number\") {\n      out.push(String(input))\n    } else if (Array.isArray(input)) {\n      const nested = cx(...input)\n      if (nested) out.push(nested)\n    }\n  }\n  return out.join(\" \")\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// createComponent\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Build a compound styled React component from Rust-generated metadata.\n *\n * @param tag           HTML element tag, e.g. \"button\" | \"div\"\n * @param baseClass     Scoped base class from Rust, e.g. \"Button_abc123\"\n * @param subComponents Map of subcomponent definitions (optional)\n * @param conditionals  Map of prop name → CSS class (optional)\n *\n * @example\n * // Injected automatically by the compiler — do not call manually\n * const Button = createComponent(\"button\", \"Button_abc123\", {\n *   icon: { tag: \"span\", class: \"Button_icon_abc123\" },\n *   text: { tag: \"span\", class: \"Button_text_abc123\" },\n * }, { fullWidth: \"w-full\" })\n *\n * // Usage in JSX:\n * <Button fullWidth>\n *   <Button.icon>🔍</Button.icon>\n *   <Button.text>Search</Button.text>\n * </Button>\n */\nexport function createComponent<S extends SubComponentMap = SubComponentMap>(\n  tag: string,\n  baseClass: string,\n  subComponents?: S,\n  conditionals?: ConditionalProps\n): StyledComponent<S> {\n  type Props = React.HTMLAttributes<HTMLElement> &\n    React.RefAttributes<HTMLElement> &\n    Record<string, unknown>\n\n  // ── Base component ─────────────────────────────────────────────────────────\n  const Base = React.forwardRef<HTMLElement, Props>(function TwBase(props, ref) {\n    const extra: string[] = []\n\n    // Collect conditional classes\n    if (conditionals) {\n      for (const [prop, cls] of Object.entries(conditionals)) {\n        if (props[prop]) extra.push(cls)\n      }\n    }\n\n    // Build clean props — strip conditional + subcomponent boolean props\n    const clean: Record<string, unknown> = {}\n    const stripKeys = new Set([\n      \"className\",\n      ...(conditionals ? Object.keys(conditionals) : []),\n      ...(subComponents ? Object.keys(subComponents) : []),\n    ])\n    for (const [k, v] of Object.entries(props)) {\n      if (!stripKeys.has(k)) clean[k] = v\n    }\n\n    const className = cx(baseClass, ...extra, (props.className as string) ?? \"\")\n\n    return React.createElement(tag, { ...clean, ref, className: className || undefined })\n  })\n\n    ; (Base as { displayName?: string }).displayName = `tw.${String(tag)}`\n\n  // ── Attach subcomponent properties ────────────────────────────────────────\n  if (subComponents) {\n    for (const [subName, def] of Object.entries(subComponents)) {\n      const subTag = def.tag ?? \"span\"\n      const subClass = def.class\n\n      const SubComp = React.forwardRef<HTMLElement, Props>(function TwSub(props, ref) {\n        const className = cx(subClass, (props.className as string) ?? \"\")\n        const clean: Record<string, unknown> = { ...props }\n        delete clean.className\n        return React.createElement(subTag, { ...clean, ref, className: className || undefined })\n      })\n\n        ; (SubComp as { displayName?: string }).displayName = `tw.${String(tag)}.${String(subName)}`\n\n        ; (Base as unknown as Record<string, unknown>)[subName] = SubComp\n    }\n  }\n\n  return Base as StyledComponent<S>\n}\n\n// Re-export schemas\nexport {\n  type ComponentMetadataInput,\n  ComponentMetadataSchema,\n  type ConditionalPropsInput,\n  ConditionalPropsSchema,\n  parseComponentMetadata,\n  parseSubComponentDef,\n  type SubComponentDefInput,\n  SubComponentDefSchema,\n} from \"./schemas\"\n","/**\n * tailwind-styled-v5 — Multi-Theme Engine + Live Token Engine\n *\n * Enterprise-grade theming. Support light/dark/brand themes dengan\n * CSS variables. Zero runtime overhead — themes di-resolve via CSS.\n *\n * Live token engine provides runtime token state management with\n * CSS variable sync to document root.\n *\n * Fitur:\n *  - Multiple named themes (light, dark, brand, high-contrast)\n *  - CSS variable output (Tailwind v4 compatible)\n *  - Theme contract (TypeScript-safe — missing tokens = TS error)\n *  - Per-component theme override\n *  - White-label ready\n *  - Live token engine (runtime token state + CSS sync)\n *\n * @example\n *   // 1. Define contract\n *   const contract = defineThemeContract({\n *     colors: { bg: \"\", fg: \"\", primary: \"\", muted: \"\" },\n *     font:   { sans: \"\", mono: \"\" },\n *   })\n *\n *   // 2. Create themes\n *   const lightTheme = createTheme(contract, \"light\", {\n *     colors: { bg: \"#ffffff\", fg: \"#09090b\", primary: \"#3b82f6\", muted: \"#71717a\" },\n *     font:   { sans: \"InterVariable, sans-serif\", mono: \"JetBrains Mono, monospace\" },\n *   })\n *\n *   const darkTheme = createTheme(contract, \"dark\", {\n *     colors: { bg: \"#09090b\", fg: \"#fafafa\", primary: \"#60a5fa\", muted: \"#a1a1aa\" },\n *     font:   { sans: \"InterVariable, sans-serif\", mono: \"JetBrains Mono, monospace\" },\n *   })\n *\n *   // 3. Use tokens in components\n *   const Card = tw.div`bg-[var(--colors-bg)] text-[var(--colors-fg)] p-6`\n *\n *   // 4. Apply in layout\n *   // <html data-theme=\"dark\"> or inject CSS\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Live Token Engine exports\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type {\n  LiveTokenEngineBridge,\n  LiveTokenSet,\n  TokenMap,\n  TokenSubscriber,\n} from \"./liveTokenEngine\"\nexport {\n  applyTokenSet,\n  createUseTokens,\n  generateTokenCssString,\n  getToken,\n  getTokens,\n  liveToken,\n  liveTokenEngine,\n  setToken,\n  setTokens,\n  subscribeTokens,\n  tokenRef,\n  tokenVar,\n} from \"./liveTokenEngine\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Theme types\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport { getNativeThemeBinding } from \"./native-bridge\"\n\n// ThemeTokenMap untuk theming (grouped tokens seperti { colors: { bg: \"#fff\" } })\nexport type ThemeTokenMap = Record<string, Record<string, string>>\n\nexport interface ThemeContract<T extends ThemeTokenMap> {\n  _contract: T\n  _vars: ThemeVars<T>\n}\n\nexport type ThemeVars<T extends ThemeTokenMap> = {\n  [Group in keyof T]: {\n    [Token in keyof T[Group]]: string // \"var(--group-token)\"\n  }\n}\n\nexport interface Theme<T extends ThemeTokenMap> {\n  name: string\n  contract: ThemeContract<T>\n  values: T\n  /** CSS string to inject (`:root` or `[data-theme=\"name\"]`) */\n  css: string\n  /** CSS variables as a flat record */\n  vars: Record<string, string>\n  /** Apply this theme to an element via data attribute */\n  selector: string\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// defineThemeContract\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Define the shape of your theme. All themes must satisfy this contract.\n * Returns typed CSS variable references for use in tw components.\n *\n * @example\n * const contract = defineThemeContract({\n *   colors: { bg: \"\", fg: \"\", primary: \"\" },\n *   font: { sans: \"\" },\n * })\n *\n * // Use in components:\n * const Card = tw.div`bg-[${contract._vars.colors.bg}]`\n * // → tw.div`bg-[var(--colors-bg)]`\n */\nexport function defineThemeContract<T extends ThemeTokenMap>(shape: T): ThemeContract<T> {\n  const buildVars = (): ThemeVars<T> => {\n    const result: Record<string, Record<string, string>> = {}\n    for (const group in shape) {\n      result[group] = {}\n      for (const token in shape[group]) {\n        result[group][token] = `var(--${group}-${token})`\n      }\n    }\n    return result as ThemeVars<T>\n  }\n\n  return { _contract: shape, _vars: buildVars() }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// createTheme\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a typed theme that satisfies a contract.\n *\n * @param contract - Theme contract from defineThemeContract()\n * @param name - Theme name (\"light\", \"dark\", \"brand\", etc.)\n * @param values - Token values (TypeScript enforces completeness)\n * @param asRoot - If true, use :root selector. Default: false (uses [data-theme])\n */\nexport function createTheme<T extends ThemeTokenMap>(\n  contract: ThemeContract<T>,\n  name: string,\n  values: T,\n  asRoot = false\n): Theme<T> {\n  // ── Rust fast-path ─────────────────────────────────────────────────────────\n  const native = getNativeThemeBinding()\n  if (native?.compileTheme) {\n    const result = native.compileTheme(JSON.stringify(values), asRoot ? \"light\" : name, \"\")\n    if (result) {\n      const flatVars: Record<string, string> = {}\n      for (const token of result.tokens) {\n        flatVars[token.cssVar] = token.value\n      }\n      return { name, contract, values, css: result.css, vars: flatVars, selector: result.selector }\n    }\n  }\n\n  // Native binding is required — no JS fallback\n  throw new Error(\n    \"FATAL: Native binding 'compileTheme' is required but not available. \" +\n    \"Run 'npm run build:rust' to build the native module.\"\n  )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ThemeRegistry — manage multiple themes\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class ThemeRegistry {\n  private themes = new Map<string, Theme<ThemeTokenMap>>()\n  private defaultTheme: string | null = null\n\n  /** Register a theme */\n  register<T extends ThemeTokenMap>(theme: Theme<T>, isDefault = false): this {\n    this.themes.set(theme.name, theme)\n    if (isDefault || !this.defaultTheme) {\n      this.defaultTheme = theme.name\n    }\n    return this\n  }\n\n  /** Get a theme by name */\n  get(name: string): Theme<ThemeTokenMap> | undefined {\n    return this.themes.get(name)\n  }\n\n  /** Get all theme names */\n  names(): string[] {\n    return Array.from(this.themes.keys())\n  }\n\n  /**\n   * Generate combined CSS for all themes.\n   * Inject into <head> or a .css file.\n   *\n   * @example\n   * // In globals.css or layout.tsx\n   * const css = registry.generateCss()\n   */\n  generateCss(): string {\n    return Array.from(this.themes.values())\n      .map((t) => t.css)\n      .join(\"\\n\\n\")\n  }\n\n  /**\n   * Get the CSS for a specific theme only.\n   */\n  getThemeCss(name: string): string | null {\n    return this.themes.get(name)?.css ?? null\n  }\n\n  /**\n   * Inject all theme CSS into document <head> (browser only).\n   * Call once on app init.\n   */\n  inject(styleId = \"__tw_themes\"): void {\n    if (typeof document === \"undefined\") return\n\n    const style =\n      (document.getElementById(styleId) as HTMLStyleElement | null) ??\n      (() => {\n        const el = document.createElement(\"style\")\n        el.id = styleId\n        document.head.appendChild(el)\n        return el\n      })()\n    style.textContent = this.generateCss()\n  }\n\n  /**\n   * Switch active theme by setting data-theme on <html>.\n   */\n  apply(name: string, target: HTMLElement = document.documentElement): void {\n    if (typeof document === \"undefined\") return\n    if (!this.themes.has(name)) {\n      console.warn(`[tailwind-styled-v4] Theme \"${name}\" not registered.`)\n      return\n    }\n    target.dataset.theme = name\n  }\n\n  /**\n   * Get current active theme name from data-theme attribute.\n   */\n  current(target: HTMLElement = document.documentElement): string | null {\n    if (typeof document === \"undefined\") return this.defaultTheme\n    return target.dataset.theme ?? this.defaultTheme\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Convenience: createMultiTheme — shorthand for common light/dark setup\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface MultiThemeConfig<T extends ThemeTokenMap> {\n  contract: ThemeContract<T>\n  light: T\n  dark: T\n  /** Additional named themes (brand, high-contrast, etc.) */\n  extras?: Record<string, T>\n}\n\n/**\n * Create a ThemeRegistry with light/dark + optional extras in one call.\n *\n * @example\n * const { registry, vars } = createMultiTheme({\n *   contract: defineThemeContract({\n *     colors: { bg: \"\", fg: \"\", primary: \"\", border: \"\" }\n *   }),\n *   light: {\n *     colors: { bg: \"#fff\", fg: \"#09090b\", primary: \"#3b82f6\", border: \"#e5e7eb\" }\n *   },\n *   dark: {\n *     colors: { bg: \"#09090b\", fg: \"#fafafa\", primary: \"#60a5fa\", border: \"#27272a\" }\n *   },\n * })\n *\n * // Inject CSS:\n * registry.inject()\n *\n * // Use tokens in components:\n * const Card = tw.div`bg-[${vars.colors.bg}] text-[${vars.colors.fg}]`\n */\nexport function createMultiTheme<T extends ThemeTokenMap>(\n  config: MultiThemeConfig<T>\n): {\n  registry: ThemeRegistry\n  vars: ThemeVars<T>\n  light: Theme<T>\n  dark: Theme<T>\n} {\n  const registry = new ThemeRegistry()\n\n  const light = createTheme(config.contract, \"light\", config.light, true) // :root\n  const dark = createTheme(config.contract, \"dark\", config.dark, false)\n\n  registry.register(light, true)\n  registry.register(dark)\n\n  for (const [name, values] of Object.entries(config.extras ?? {})) {\n    registry.register(createTheme(config.contract, name, values as T))\n  }\n\n  return {\n    registry,\n    vars: config.contract._vars,\n    light,\n    dark,\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Design Token Compiler — generate CSS vars from token object\n// (Enterprise feature: sync with Figma variables)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DesignTokens {\n  [path: string]: string | DesignTokens\n}\n\n/**\n * Flatten nested design token object into CSS variables.\n * Supports Figma-style nested tokens.\n *\n * @example\n * compileDesignTokens({\n *   color: {\n *     brand: { primary: \"#3b82f6\", secondary: \"#6366f1\" },\n *     neutral: { 50: \"#fafafa\", 900: \"#09090b\" }\n *   },\n *   spacing: { base: \"4px\", lg: \"16px\" }\n * })\n * →\n * :root {\n *   --color-brand-primary: #3b82f6;\n *   --color-brand-secondary: #6366f1;\n *   --color-neutral-50: #fafafa;\n *   --color-neutral-900: #09090b;\n *   --spacing-base: 4px;\n *   --spacing-lg: 16px;\n * }\n */\nexport function compileDesignTokens(tokens: DesignTokens, prefix = \"\"): string {\n  // ── Rust fast-path ─────────────────────────────────────────────────────────\n  const native = getNativeThemeBinding()\n  if (native?.compileTheme) {\n    const result = native.compileTheme(JSON.stringify(tokens), \"default\", prefix)\n    if (result) return result.css\n  }\n\n  // Native binding is required — no JS fallback\n  throw new Error(\n    \"FATAL: Native binding 'compileTheme' is required but not available. \" +\n    \"Run 'npm run build:rust' to build the native module.\"\n  )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Theme Persistence (localStorage + system preference)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type { ThemeValue, UseThemeReturn, ThemeInitScriptProps } from './types.persistence'\nexport { useTheme } from './useTheme'\nexport { ThemeInitScript } from './ThemeInitScript'\nexport {\n  getSystemPreference,\n  getEffectiveTheme,\n  getStoredTheme,\n  saveTheme,\n  applyThemeToElement,\n  getInitializationScript,\n  subscribeToSystemPreferenceChanges,\n} from './persistence'\n\n// Re-export schemas\nexport {\n  type LiveTokenUpdateInput,\n  LiveTokenUpdateSchema,\n  parseLiveTokenUpdate,\n  parseTokenConfig,\n  type ThemeRegistrationInput,\n  ThemeRegistrationSchema,\n  type TokenConfigInput,\n  TokenConfigSchema,\n} from \"./schemas\"","\"use client\"\n\nimport React from \"react\"\n\nimport type { TokenMap } from '@tailwind-styled/shared'\nexport type { TokenMap }\n\nexport type TokenSubscriber = (tokens: TokenMap) => void\n\nexport interface LiveTokenSet {\n  vars: Record<string, string>\n  get(name: string): string | undefined\n  set(name: string, value: string): void\n  setAll(tokens: TokenMap): void\n  snapshot(): TokenMap\n}\n\nexport interface LiveTokenEngineBridge {\n  getToken(name: string): string | undefined\n  getTokens(): TokenMap\n  setToken(name: string, value: string): void\n  setTokens(tokens: TokenMap): void\n  applyTokenSet(tokens: TokenMap): void\n  subscribeTokens(fn: TokenSubscriber): () => void\n  subscribe?(fn: TokenSubscriber): () => void\n}\n\ninterface LiveTokenEngineRuntime {\n  liveToken(tokens: TokenMap): LiveTokenSet\n  getToken(name: string): string | undefined\n  getTokens(): TokenMap\n  setToken(name: string, value: string): void\n  setTokens(tokens: TokenMap): void\n  applyTokenSet(tokens: TokenMap): void\n  generateTokenCssString(): string\n  subscribe(fn: TokenSubscriber): () => void\n  markHydrated(): void\n}\n\nconst TOKEN_ENGINE_KEY = \"__TW_TOKEN_ENGINE__\"\n\nexport function tokenVar(name: string): string {\n  const normalized = name.replace(/[^a-zA-Z0-9-]/g, \"-\").toLowerCase()\n  return `--tw-token-${normalized}`\n}\n\nexport function tokenRef(name: string): string {\n  return `var(${tokenVar(name)})`\n}\n\nconst buildRootCss = (tokens: TokenMap): string => {\n  const vars = Object.entries(tokens)\n    .map(([name, value]) => `  ${tokenVar(name)}: ${value};`)\n    .join(\"\\n\")\n  return `:root {\\n${vars}\\n}`\n}\n\nconst createLiveTokenEngine = (): LiveTokenEngineRuntime => {\n  const state = {\n    currentTokens: {} as TokenMap,\n    styleEl: null as HTMLStyleElement | null,\n    // Belum boleh nyentuh live DOM sampai komponen pertama selesai mount.\n    // Ini yang nyegah hydration mismatch: tanpa flag ini, liveToken() yang\n    // dipanggil di module top-level akan langsung document.documentElement\n    // .style.setProperty(...) saat bundle client di-evaluasi — JAUH sebelum\n    // React selesai hydrate — sehingga <html> versi live DOM beda dengan\n    // <html> yang di-render server (yang gak pernah nyentuh `document`).\n    hydrated: false,\n  }\n  const subscribers = new Set<TokenSubscriber>()\n\n  const syncStyleEl = (): void => {\n    if (!state.hydrated || typeof document === \"undefined\") return\n\n    if (!state.styleEl) {\n      const styleEl = document.createElement(\"style\")\n      styleEl.id = \"tw-live-tokens\"\n      styleEl.setAttribute(\"data-tw-tokens\", \"true\")\n      document.head.appendChild(styleEl)\n      state.styleEl = styleEl\n    }\n\n    state.styleEl.textContent = buildRootCss(state.currentTokens)\n  }\n\n  const notifySubscribers = (): void => {\n    const snapshot = { ...state.currentTokens }\n    for (const subscriber of subscribers) {\n      try {\n        subscriber(snapshot)\n      } catch {\n        // Intentionally ignore subscriber errors.\n      }\n    }\n  }\n\n  const setToken = (name: string, value: string): void => {\n    state.currentTokens = { ...state.currentTokens, [name]: value }\n    if (state.hydrated && typeof document !== \"undefined\") {\n      document.documentElement.style.setProperty(tokenVar(name), value)\n    }\n    syncStyleEl()\n    notifySubscribers()\n  }\n\n  const setTokens = (tokens: TokenMap): void => {\n    state.currentTokens = { ...state.currentTokens, ...tokens }\n    if (state.hydrated && typeof document !== \"undefined\") {\n      const root = document.documentElement\n      for (const [name, value] of Object.entries(tokens)) {\n        root.style.setProperty(tokenVar(name), value)\n      }\n    }\n    syncStyleEl()\n    notifySubscribers()\n  }\n\n  const applyTokenSet = (tokens: TokenMap): void => {\n    if (state.hydrated && typeof document !== \"undefined\") {\n      const root = document.documentElement\n      for (const name of Object.keys(state.currentTokens)) {\n        if (!(name in tokens)) {\n          root.style.removeProperty(tokenVar(name))\n        }\n      }\n      for (const [name, value] of Object.entries(tokens)) {\n        root.style.setProperty(tokenVar(name), value)\n      }\n    }\n\n    state.currentTokens = { ...tokens }\n    syncStyleEl()\n    notifySubscribers()\n  }\n\n  // Dipanggil sekali setelah mount pertama, EKSKLUSIF lewat useTokens()'s\n  // useEffect. Setelah ini true, semua write di atas balik sinkron langsung\n  // seperti semula.\n  //\n  // KENAPA TIDAK ADA FALLBACK rAF/timer DI SINI (root cause bug sebelumnya):\n  // Versi lama nyoba nge-flush via `requestAnimationFrame(() =>\n  // requestAnimationFrame(markHydrated))` sebagai fallback buat consumer\n  // imperative-only. Itu SALAH karena rAF terikat ke jadwal repaint browser,\n  // BUKAN ke commit React. Untuk tree client component yang besar/berat\n  // (banyak demo widget sekaligus) atau saat dev server lagi lambat\n  // (Turbopack first compile, Fast Refresh instrumentation), React bisa\n  // belum kelar nge-hydrate <html> di titik rAF itu nembak — begitu rAF\n  // nulis ke document.documentElement.style DI TENGAH proses hydrate, React\n  // lapor mismatch tepat di <html> (root element-nya), persis seperti yang\n  // dilaporkan: `<html style={{--tw-token-primary:...}}>` padahal\n  // layout.tsx gak pernah nulis style itu di JSX-nya.\n  // Dikonfirmasi via repro React + jsdom: nulis ke documentElement.style\n  // SEBELUM hydrateRoot() menghasilkan warning yang identik byte-per-byte\n  // dengan yang dilaporkan; begitu write yang sama dipindah ke dalam\n  // useEffect (jalan persis setelah commit), warning-nya hilang total.\n  // useEffect dijamin React baru jalan SETELAH seluruh tree (termasuk\n  // <html>) selesai di-commit/di-hydrate — gak ada race seperti rAF.\n  // Konsekuensinya: consumer yang cuma pakai liveToken().set() imperatif\n  // tanpa pernah render komponen yang panggil useTokens() (hook dari\n  // createUseTokens()) gak akan ke-flush ke DOM. Itu trade-off yang\n  // disengaja — render satu komponen yang pakai useTokens() di mana aja\n  // dalam tree buat \"bootstrap\" hydration-nya.\n  const markHydrated = (): void => {\n    if (state.hydrated || typeof document === \"undefined\") return\n    state.hydrated = true\n    const root = document.documentElement\n    for (const [name, value] of Object.entries(state.currentTokens)) {\n      root.style.setProperty(tokenVar(name), value)\n    }\n    syncStyleEl()\n  }\n\n  return {\n    markHydrated,\n    liveToken(tokens: TokenMap): LiveTokenSet {\n      setTokens(tokens)\n\n      const vars: Record<string, string> = {}\n      for (const name of Object.keys(tokens)) {\n        vars[name] = tokenRef(name)\n      }\n\n      return {\n        vars,\n        get(name: string) {\n          return state.currentTokens[name]\n        },\n        set(name: string, value: string) {\n          setToken(name, value)\n        },\n        setAll(nextTokens: TokenMap) {\n          setTokens(nextTokens)\n        },\n        snapshot() {\n          return { ...state.currentTokens }\n        },\n      }\n    },\n    getToken(name: string): string | undefined {\n      return state.currentTokens[name]\n    },\n    getTokens(): TokenMap {\n      return { ...state.currentTokens }\n    },\n    setToken,\n    setTokens,\n    applyTokenSet,\n    generateTokenCssString(): string {\n      return buildRootCss(state.currentTokens)\n    },\n    subscribe(fn: TokenSubscriber): () => void {\n      subscribers.add(fn)\n      return () => {\n        subscribers.delete(fn)\n      }\n    },\n  }\n}\n\nconst engine = createLiveTokenEngine()\n\nexport function liveToken(tokens: TokenMap): LiveTokenSet {\n  return engine.liveToken(tokens)\n}\n\nexport function setToken(name: string, value: string): void {\n  engine.setToken(name, value)\n}\n\nexport function setTokens(tokens: TokenMap): void {\n  engine.setTokens(tokens)\n}\n\nexport function applyTokenSet(tokens: TokenMap): void {\n  engine.applyTokenSet(tokens)\n}\n\nexport function getToken(name: string): string | undefined {\n  return engine.getToken(name)\n}\n\nexport function getTokens(): TokenMap {\n  return engine.getTokens()\n}\n\nexport function subscribeTokens(fn: TokenSubscriber): () => void {\n  return engine.subscribe(fn)\n}\n\nexport function generateTokenCssString(): string {\n  return engine.generateTokenCssString()\n}\n\nexport function createUseTokens() {\n  return function useTokens(): TokenMap {\n    // useSyncExternalStore untuk konsistensi SSR/client:\n    // - getServerSnapshot() return empty object → SSR render tanpa tokens\n    // - getSnapshot() return live tokens di client setelah hydration\n    // Ini menghilangkan hydration mismatch karena server dan client\n    // initial render keduanya return {} (empty), lalu useEffect update\n    // ke nilai aktual via subscriber.\n    const [tokens, setTokensState] = React.useState<TokenMap>({})\n\n    React.useEffect(() => {\n      // Baru sekarang aman nyentuh document.documentElement — hydration\n      // udah pasti selesai di titik ini. markHydrated() flush token yang\n      // sempat ditunda dari liveToken() init call (lihat createLiveTokenEngine).\n      engine.markHydrated()\n      // Set ke nilai aktual setelah mount (client-only)\n      setTokensState(engine.getTokens())\n      return engine.subscribe((nextTokens) => setTokensState(nextTokens))\n    }, [])\n\n    return tokens\n  }\n}\n\nexport const liveTokenEngine: LiveTokenEngineBridge = {\n  getToken: engine.getToken,\n  getTokens: engine.getTokens,\n  setToken: engine.setToken,\n  setTokens: engine.setTokens,\n  applyTokenSet: engine.applyTokenSet,\n  subscribeTokens: engine.subscribe,\n  subscribe: engine.subscribe,\n}\n\ndeclare global {\n  interface Window {\n    __TW_TOKEN_ENGINE__?: LiveTokenEngineBridge\n  }\n}\n\nconst globalTokenEngine = globalThis as typeof globalThis & {\n  [TOKEN_ENGINE_KEY]?: LiveTokenEngineBridge\n}\n\nglobalTokenEngine[TOKEN_ENGINE_KEY] = liveTokenEngine\nif (typeof window !== \"undefined\") {\n  window.__TW_TOKEN_ENGINE__ = liveTokenEngine\n}","import { z } from \"zod\"\n\nconst formatIssues = (error: z.ZodError): string =>\n  error.issues\n    .map((issue) => {\n      const p = issue.path.length > 0 ? issue.path.join(\".\") : \"<root>\"\n      return `${p}: ${issue.message}`\n    })\n    .join(\"; \")\n\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\n  const parsed = schema.safeParse(data)\n  if (parsed.success) return parsed.data\n  throw new TypeError(`${label}: ${formatIssues(parsed.error)}`)\n}\n\nexport const SubComponentDefSchema = z.object({\n  tag: z.string().optional(),\n  class: z.string(),\n})\n\nexport type SubComponentDefInput = z.infer<typeof SubComponentDefSchema>\n\nexport const ComponentMetadataSchema = z.object({\n  component: z.string(),\n  tag: z.string(),\n  baseClass: z.string(),\n  subComponents: z.record(z.string(), SubComponentDefSchema),\n})\n\nexport type ComponentMetadataInput = z.infer<typeof ComponentMetadataSchema>\n\nexport const ConditionalPropsSchema = z.record(z.string(), z.string())\n\nexport type ConditionalPropsInput = z.infer<typeof ConditionalPropsSchema>\n\nexport const parseSubComponentDef = (data: unknown) =>\n  parseWithSchema(SubComponentDefSchema, data, \"sub-component definition is invalid\")\n\nexport const parseComponentMetadata = (data: unknown) =>\n  parseWithSchema(ComponentMetadataSchema, data, \"component metadata is invalid\")\n"],"mappings":"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","names":["React","setToken","setTokens","applyTokenSet","React"]}