tailwind-styled-v4 5.1.16 → 5.1.17

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 (59) hide show
  1. package/dist/atomic.js +16 -4
  2. package/dist/atomic.js.map +1 -1
  3. package/dist/atomic.mjs +13 -2
  4. package/dist/atomic.mjs.map +1 -1
  5. package/dist/cli.js +80 -68
  6. package/dist/cli.js.map +1 -1
  7. package/dist/cli.mjs +77 -66
  8. package/dist/cli.mjs.map +1 -1
  9. package/dist/compiler.d.mts +84 -4
  10. package/dist/compiler.d.ts +84 -4
  11. package/dist/compiler.js +245 -15
  12. package/dist/compiler.js.map +1 -1
  13. package/dist/compiler.mjs +240 -14
  14. package/dist/compiler.mjs.map +1 -1
  15. package/dist/engine.js +209 -167
  16. package/dist/engine.js.map +1 -1
  17. package/dist/engine.mjs +200 -159
  18. package/dist/engine.mjs.map +1 -1
  19. package/dist/index.browser.mjs +1 -1
  20. package/dist/index.browser.mjs.map +1 -1
  21. package/dist/index.js +1 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.mjs +1 -1
  24. package/dist/index.mjs.map +1 -1
  25. package/dist/next.d.mts +16 -0
  26. package/dist/next.d.ts +16 -0
  27. package/dist/next.js +458 -158
  28. package/dist/next.js.map +1 -1
  29. package/dist/next.mjs +454 -154
  30. package/dist/next.mjs.map +1 -1
  31. package/dist/runtime.js +1 -1
  32. package/dist/runtime.js.map +1 -1
  33. package/dist/runtime.mjs +1 -1
  34. package/dist/runtime.mjs.map +1 -1
  35. package/dist/shared.js +106 -64
  36. package/dist/shared.js.map +1 -1
  37. package/dist/shared.mjs +101 -60
  38. package/dist/shared.mjs.map +1 -1
  39. package/dist/theme.js +1 -1
  40. package/dist/theme.js.map +1 -1
  41. package/dist/theme.mjs +1 -1
  42. package/dist/theme.mjs.map +1 -1
  43. package/dist/turbopackLoader.js +94 -52
  44. package/dist/turbopackLoader.js.map +1 -1
  45. package/dist/turbopackLoader.mjs +92 -51
  46. package/dist/turbopackLoader.mjs.map +1 -1
  47. package/dist/tw.js +80 -68
  48. package/dist/tw.js.map +1 -1
  49. package/dist/tw.mjs +77 -66
  50. package/dist/tw.mjs.map +1 -1
  51. package/dist/vite.js +172 -130
  52. package/dist/vite.js.map +1 -1
  53. package/dist/vite.mjs +166 -125
  54. package/dist/vite.mjs.map +1 -1
  55. package/dist/webpackLoader.js +28 -10
  56. package/dist/webpackLoader.js.map +1 -1
  57. package/dist/webpackLoader.mjs +26 -9
  58. package/dist/webpackLoader.mjs.map +1 -1
  59. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../packages/domain/shared/src/index.ts","../src/umbrella/theme.ts","../packages/domain/theme/src/index.ts","../packages/domain/theme/src/liveTokenEngine.ts","../packages/domain/theme/src/native-bridge.ts","../packages/domain/theme/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","import { createHash } from \"node:crypto\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { createRequire } from \"node:module\"\n\n// Native-only: Node.js is always available. No browser fallback.\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type TokenMap = Record<string, string>\n\nexport type VariantValue = string | number | boolean | undefined\n\nexport type VariantProps = Record<string, VariantValue>\n\nexport type HtmlTagName = keyof HTMLElementTagNameMap\n\nexport type CompoundCondition = Record<string, string | number | boolean>\n\nexport type VariantMatrix = Record<string, Array<string | number | boolean>>\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Logging\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface Logger {\n warn(...args: unknown[]): void\n debug(...args: unknown[]): void\n error(...args: unknown[]): void\n log(...args: unknown[]): void\n}\n\nexport function createLogger(namespace: string): Logger {\n const prefix = `[${namespace}]`\n return {\n warn(...args: unknown[]) {\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\n },\n debug(...args: unknown[]) {\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\n },\n error(...args: unknown[]) {\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\n },\n log(...args: unknown[]) {\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\n },\n }\n}\n\nexport function createDebugLogger(namespace: string, label?: string): (msg: string) => void {\n const prefix = label ? `[${namespace}:${label}]` : `[${namespace}]`\n return (msg: string) => {\n if (process.env.DEBUG?.includes(namespace) || process.env.TW_DEBUG) {\n console.debug(prefix, msg)\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Error handling\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ErrorSource = \"rust\" | \"validation\" | \"compile\" | \"io\" | \"config\" | \"unknown\"\n\ntype ZodLikeIssue = {\n path?: readonly PropertyKey[]\n message?: string\n}\n\nfunction formatIssuePath(path?: readonly PropertyKey[]): string {\n if (!path || path.length === 0) return \"(root)\"\n return path\n .map((segment) =>\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\n )\n .join(\".\")\n}\n\nexport class TwError extends Error {\n /** @deprecated Gunakan source */\n public readonly domain: string\n public readonly source: ErrorSource\n public readonly code: string\n public readonly originalCause?: unknown\n\n constructor(domainOrSource: string, code: string, message: string, cause?: unknown) {\n super(message)\n this.name = \"TwError\"\n this.domain = domainOrSource\n this.source = domainOrSource as ErrorSource\n this.code = code\n this.originalCause = cause\n if (Error.captureStackTrace) Error.captureStackTrace(this, TwError)\n }\n\n static fromIo(code: string, message: string): TwError {\n return new TwError(\"io\", code, message)\n }\n\n static fromCompile(code: string, message: string): TwError {\n return new TwError(\"compile\", code, message)\n }\n\n static fromRust(err: { code?: string; message?: string } | Error | unknown): TwError {\n if (err instanceof TwError) return err\n if (err instanceof Error) return new TwError(\"rust\", \"RUST_ERROR\", err.message, err)\n if (err && typeof err === \"object\") {\n const e = err as { code?: string; message?: string }\n return new TwError(\"rust\", e.code ?? \"RUST_ERROR\", e.message ?? String(err), err)\n }\n return new TwError(\"rust\", \"RUST_ERROR\", String(err), err)\n }\n\n /** Buat TwError dari ZodError — dukung shape Zod v3 (`errors`) dan v4 (`issues`). */\n static fromZod(err: { issues?: ZodLikeIssue[]; errors?: ZodLikeIssue[] }): TwError {\n const first = err.issues?.[0] ?? err.errors?.[0]\n const path = formatIssuePath(first?.path)\n const message = first ? `${path}: ${first.message}` : \"Schema validation failed\"\n return new TwError(\"validation\", \"SCHEMA_VALIDATION_FAILED\", message, err)\n }\n\n static wrap(source: string, code: string, err: unknown): TwError {\n if (err instanceof TwError) return err\n if (err instanceof Error) return new TwError(source, code, err.message, err)\n return new TwError(source, code, String(err), err)\n }\n\n override toString(): string {\n return `TwError [${this.source}:${this.code}] ${this.message}`\n }\n\n toJSON(): { name: string; source: string; code: string; message: string } {\n return { name: this.name, source: this.source, code: this.code, message: this.message }\n }\n\n toCliMessage(): string {\n return `[${this.source.toUpperCase()}:${this.code}] ${this.message}`\n }\n}\n\nexport function wrapUnknownError(domain: string, code: string, error: unknown): TwError {\n return TwError.wrap(domain, code, error)\n}\n\nexport function isTwError(err: unknown): err is TwError {\n return err instanceof TwError\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Native binding resolution\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface LoadNativeBindingOptions<T> {\n runtimeDir: string\n candidates: string[]\n isValid: (module: unknown) => module is T\n invalidExportMessage: string\n}\n\nexport interface LoadNativeBindingResult<T> {\n binding: T | null\n loadErrors: Array<{ path: string; message: string }>\n loadedPath?: string\n}\n\nexport function loadNativeBinding<T>(options: LoadNativeBindingOptions<T>): LoadNativeBindingResult<T> {\n const { runtimeDir, candidates, isValid } = options\n const loadErrors: Array<{ path: string; message: string }> = []\n\n for (const candidate of candidates) {\n const candidatePath = path.resolve(runtimeDir, candidate)\n try {\n if (!fs.existsSync(candidatePath) && !fs.existsSync(candidatePath + \".node\")) {\n continue\n }\n const mod = requireNativeModule(candidatePath)\n if (mod && isValid(mod)) {\n return { binding: mod, loadErrors, loadedPath: candidatePath }\n }\n loadErrors.push({ path: candidatePath, message: options.invalidExportMessage })\n } catch (e) {\n loadErrors.push({ path: candidatePath, message: e instanceof Error ? e.message : String(e) })\n }\n }\n\n return { binding: null, loadErrors }\n}\n\nconst _require = createRequire(\n typeof __filename !== \"undefined\"\n ? `file://${__filename}`\n : (import.meta.url ?? \"file://unknown\")\n)\n\nfunction requireNativeModule(p: string): unknown {\n return _require(p)\n}\n\nexport interface ResolveCandidatesOptions {\n runtimeDir?: string\n envVarNames?: string[]\n includeDefaultCandidates?: boolean\n enforceNodeExtensionForEnvPath?: boolean\n /** @deprecated — ignored, kept for backward compat */\n packageName?: string\n}\n\nexport function resolveNativeBindingCandidates(options: ResolveCandidatesOptions): string[] {\n const {\n envVarNames = [\"TW_NATIVE_PATH\", \"TWS_NATIVE_PATH\"],\n includeDefaultCandidates = true,\n enforceNodeExtensionForEnvPath = false,\n } = options\n // Default ke cwd kalau runtimeDir tidak disediakan\n const runtimeDir = options.runtimeDir || process.cwd()\n const candidates: string[] = []\n\n for (const envVar of envVarNames) {\n const envPath = process.env[envVar]\n if (envPath) {\n candidates.push(enforceNodeExtensionForEnvPath && !envPath.endsWith(\".node\") ? envPath + \".node\" : envPath)\n }\n }\n\n if (!includeDefaultCandidates) return candidates\n\n if (fs.existsSync(runtimeDir)) {\n try {\n for (const entry of fs.readdirSync(runtimeDir)) {\n if (entry.endsWith(\".node\")) candidates.push(entry)\n }\n } catch { /* ignore read errors */ }\n }\n\n const BINARY_NAMES = [\"tailwind-styled-native\", \"tailwind_styled_parser\"]\n const napiPlatform = process.platform === \"linux\" && process.arch === \"x64\" ? \"linux-x64-gnu\"\n : process.platform === \"linux\" && process.arch === \"arm64\" ? \"linux-arm64-gnu\"\n : `${process.platform}-${process.arch}`\n\n for (const bin of BINARY_NAMES) {\n candidates.push(path.resolve(runtimeDir, `${bin}.node`))\n candidates.push(path.resolve(runtimeDir, `${bin}.${napiPlatform}.node`))\n // 1 level: dist/ → package-root/native/ (published npm package)\n candidates.push(path.resolve(runtimeDir, \"..\", \"native\", `${bin}.node`))\n candidates.push(path.resolve(runtimeDir, \"..\", \"native\", `${bin}.${napiPlatform}.node`))\n // cwd fallback (user project root)\n candidates.push(path.resolve(process.cwd(), \"native\", `${bin}.node`))\n candidates.push(path.resolve(process.cwd(), \"native\", `${bin}.${napiPlatform}.node`))\n // 4 level: dist/ → package/ → domain/ → packages/ → repo-root/ (monorepo dev)\n candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `${bin}.node`))\n candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `${bin}.${napiPlatform}.node`))\n // 3 level fallback\n candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", `${bin}.node`))\n }\n\n return Array.from(new Set(candidates))\n}\n\nexport function resolveRuntimeDir(dir: string | undefined, importMetaUrl: string): string {\n if (dir) return path.resolve(dir)\n try {\n return path.dirname(fileURLToPath(importMetaUrl))\n } catch {\n return process.cwd()\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hashing\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function hashContent(content: string, algorithm: string = \"md5\", length?: number): string {\n const hash = createHash(algorithm).update(content).digest(\"hex\")\n return length ? hash.slice(0, length) : hash\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Error formatting\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof TwError) return error.toString()\n if (error instanceof Error) return error.message\n return String(error)\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// LRU Cache\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class LRUCache<K, V> {\n private capacity: number\n private cache: Map<K, V>\n\n constructor(capacity: number) {\n this.capacity = capacity\n this.cache = new Map()\n }\n\n get(key: K): V | undefined {\n if (!this.cache.has(key)) return undefined\n const value = this.cache.get(key)!\n this.cache.delete(key)\n this.cache.set(key, value)\n return value\n }\n\n set(key: K, value: V): void {\n if (this.cache.has(key)) {\n this.cache.delete(key)\n } else if (this.cache.size >= this.capacity) {\n const firstKey = this.cache.keys().next().value\n if (firstKey !== undefined) {\n this.cache.delete(firstKey)\n }\n }\n this.cache.set(key, value)\n }\n\n delete(key: K): boolean {\n return this.cache.delete(key)\n }\n\n has(key: K): boolean {\n return this.cache.has(key)\n }\n\n clear(): void {\n this.cache.clear()\n }\n\n entries(): IterableIterator<[K, V]> {\n return this.cache.entries()\n }\n\n get size(): number {\n return this.cache.size\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Trace Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type { TraceSnapshot, TraceSummary } from \"./trace\"\nexport {\n getHealthColor,\n getModeColor,\n formatMemory,\n formatDuration,\n calculateHealth,\n getBuildTimeColor,\n getMemoryColor,\n createTraceSnapshot,\n getPipelinePercentages,\n} from \"./trace\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Performance Telemetry\n// ─────────────────────────────────────────────────────────────────────────────\n\n\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Error Codes\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type { ErrorCode } from \"./error-codes\"\nexport { ERROR_CODES, getSuggestion, formatErrorCode } from \"./error-codes\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Tailwind Compatibility\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type { TailwindInfo } from \"./compatibility\"\nexport { detectTailwind, assertTailwindV4, getTailwindVersion, isTailwindV4 } from \"./compatibility\"\n\n// ── Native binding schemas (Zod boundary validation)\nexport {\n NativeScanFileSchema, NativeScanResultSchema,\n NativeAnalyzerReportSchema, NativeTransformResultSchema,\n NativeCssCompileResultSchema, NativeWatchResultSchema,\n NativeCacheEntrySchema, NativeCacheReadResultSchema,\n safeParseNative, parseNative,\n} from './native-schemas'\n\n// ── ESM-safe runtime helpers ──────────────────────────────────────────────\nexport {\n createEsmRequire,\n getDirname,\n getFilename,\n resolveFromRoot,\n tryRequire,\n resolveNativeNodePath,\n} from \"./esmHelpers\"\n\n// ── Performance telemetry ────────────────────────────────────────────────────\nexport {\n TelemetryCollector,\n getGlobalTelemetry,\n resetGlobalTelemetry,\n createBuildTimer,\n type BuildTelemetry,\n type TelemetrySummary,\n type BuildPhases,\n} from \"./telemetry\"\n\n// ── Config/JSON schema validation ─────────────────────────────────────────────\nexport {\n ScanCacheSchema,\n ScanCacheClassEntrySchema,\n TailwindConfigSchema,\n RegistryPluginEntrySchema,\n RegistryFileSchema,\n PackageJsonSchema,\n parseJsonWithSchema,\n parseJsonFileWithSchema,\n type ScanCache,\n type ScanCacheClassEntry,\n type TailwindConfig,\n type RegistryPluginEntry,\n type RegistryFile,\n type PackageJson,\n} from \"./configSchemas\"\n\n// ── Worker/bootstrap path resolution ─────────────────────────────────────────\nexport {\n resolveWorkerPath,\n resolveLoaderPath,\n type WorkerPathOptions,\n type WorkerPathResult,\n} from \"./workerResolver\"\n\n// ── Codegen helpers ───────────────────────────────────────────────────────────\nexport {\n generateComponentCode,\n generateStorybookStory,\n generateClassRenameCodemod,\n generateBarrelFile,\n type ComponentCodegenOptions,\n} from \"./codegen\"\n\n// ── Native binary resolution (QA #1) ─────────────────────────────────────────\nexport {\n resolveNativeBinary,\n formatNativeNotFoundError,\n type NativeResolutionResult,\n} from \"./native-resolution\"\n\n// ── Shared observability contract ────────────────────────────────────────────\nexport {\n createObservabilityClient,\n type ClassInspection,\n type ClassProperty,\n type ClassUsageLocation,\n type BuildTrace,\n type BuildPhaseTrace,\n type DashboardMetrics,\n type DashboardSummary,\n type ObservabilityClient,\n} from \"./observability\"\n\nexport {\n TW_STATE_STATIC_FILENAME,\n extractStaticStateCss,\n appendStaticStateCssToSafelist,\n type TwStateConfigEntry,\n type StaticStateCssInput,\n type GeneratedStateRule,\n type StaticStateExtractionResult,\n} from \"./staticStateExtractor\"\nexport { setGlobalLogFile } from \"./logger\"","export * from \"@tailwind-styled/theme\"\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// 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 (lewat useTokens()'s useEffect, atau\n // fallback rAF di bawah buat consumer yang pakai API imperative tanpa hook).\n // Setelah ini true, semua write di atas balik sinkron langsung seperti semula.\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 if (typeof window !== \"undefined\") {\n // Fallback buat consumer yang gak pakai useTokens() hook (cuma pakai\n // liveToken().set() imperatif): tetap flush setelah paint pertama,\n // jauh lebih aman daripada langsung saat module di-evaluasi.\n requestAnimationFrame(markHydrated)\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}\n","/**\n * Theme — Rust native bridge\n *\n * Uses @tailwind-styled/shared for native binding resolution.\n */\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport {\n createDebugLogger,\n loadNativeBinding,\n resolveNativeBindingCandidates,\n} from \"@tailwind-styled/shared\"\n\nconst log = createDebugLogger(\"theme:native\")\n\nfunction getDirname(): string {\n if (typeof __dirname !== \"undefined\") return __dirname\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\n return path.dirname(fileURLToPath(import.meta.url))\n }\n return process.cwd()\n}\n\ninterface NativeThemeBinding {\n compileTheme?: (\n tokensJson: string,\n themeName: string,\n prefix: string\n ) => {\n name: string\n selector: string\n css: string\n tokens: Array<{ key: string; cssVar: string; value: string }>\n } | null\n extractCssVars?: (source: string) => string[] | null\n}\n\nconst isValidThemeBinding = (module: unknown): module is NativeThemeBinding => {\n const candidate = module as Partial<NativeThemeBinding> | null | undefined\n return !!(candidate && typeof candidate.compileTheme === \"function\")\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Native Theme Binding - Factory Pattern\n// ─────────────────────────────────────────────────────────────────────────\n\nconst createThemeBindingLoader = () => {\n const _state = { binding: undefined as NativeThemeBinding | null | undefined }\n\n const getBinding = (): NativeThemeBinding | null => {\n if (_state.binding !== undefined) return _state.binding\n\n const runtimeDir = getDirname()\n const candidates = resolveNativeBindingCandidates({\n runtimeDir,\n includeDefaultCandidates: true,\n })\n\n const { binding } = loadNativeBinding<NativeThemeBinding>({\n runtimeDir,\n candidates,\n isValid: isValidThemeBinding,\n invalidExportMessage: \"Module loaded but missing expected theme binding functions\",\n })\n\n if (binding) {\n log(`theme native binding loaded successfully`)\n return (_state.binding = binding)\n }\n\n return (_state.binding = null)\n }\n\n return {\n get: getBinding,\n reset: (): void => {\n _state.binding = undefined\n },\n }\n}\n\nconst themeBindingLoader = createThemeBindingLoader()\n\nexport function getNativeThemeBinding(): NativeThemeBinding | null {\n return themeBindingLoader.get()\n}\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 TokenConfigSchema = z.object({\n name: z.string().min(1),\n values: z.record(z.string(), z.record(z.string(), z.string())),\n asRoot: z.boolean().optional(),\n})\n\nexport type TokenConfigInput = z.infer<typeof TokenConfigSchema>\n\nexport const LiveTokenUpdateSchema = z.object({\n tokens: z.record(z.string(), z.string()),\n source: z.string().optional(),\n})\n\nexport type LiveTokenUpdateInput = z.infer<typeof LiveTokenUpdateSchema>\n\nexport const ThemeRegistrationSchema = z.object({\n name: z.string().min(1),\n tokens: z.record(z.string(), z.record(z.string(), z.string())),\n isDefault: z.boolean().optional(),\n})\n\nexport type ThemeRegistrationInput = z.infer<typeof ThemeRegistrationSchema>\n\nexport const parseTokenConfig = (data: unknown) =>\n parseWithSchema(TokenConfigSchema, data, \"token config is invalid\")\n\nexport const parseLiveTokenUpdate = (data: unknown) =>\n parseWithSchema(LiveTokenUpdateSchema, data, \"live token update is invalid\")\n"],"mappings":"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","names":["path","fileURLToPath","setToken","setTokens","applyTokenSet","path","fileURLToPath","getDirname"]}
1
+ {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../packages/domain/shared/src/index.ts","../src/umbrella/theme.ts","../packages/domain/theme/src/index.ts","../packages/domain/theme/src/liveTokenEngine.ts","../packages/domain/theme/src/native-bridge.ts","../packages/domain/theme/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","import { createHash } from \"node:crypto\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { createRequire } from \"node:module\"\n\n// Native-only: Node.js is always available. No browser fallback.\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type TokenMap = Record<string, string>\n\nexport type VariantValue = string | number | boolean | undefined\n\nexport type VariantProps = Record<string, VariantValue>\n\nexport type HtmlTagName = keyof HTMLElementTagNameMap\n\nexport type CompoundCondition = Record<string, string | number | boolean>\n\nexport type VariantMatrix = Record<string, Array<string | number | boolean>>\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Logging\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface Logger {\n warn(...args: unknown[]): void\n debug(...args: unknown[]): void\n error(...args: unknown[]): void\n log(...args: unknown[]): void\n}\n\nexport function createLogger(namespace: string): Logger {\n const prefix = `[${namespace}]`\n return {\n warn(...args: unknown[]) {\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\n },\n debug(...args: unknown[]) {\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\n },\n error(...args: unknown[]) {\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\n },\n log(...args: unknown[]) {\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\n },\n }\n}\n\nexport function createDebugLogger(namespace: string, label?: string): (msg: string) => void {\n const prefix = label ? `[${namespace}:${label}]` : `[${namespace}]`\n return (msg: string) => {\n if (process.env.DEBUG?.includes(namespace) || process.env.TW_DEBUG) {\n console.debug(prefix, msg)\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Error handling\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ErrorSource = \"rust\" | \"validation\" | \"compile\" | \"io\" | \"config\" | \"unknown\"\n\ntype ZodLikeIssue = {\n path?: readonly PropertyKey[]\n message?: string\n}\n\nfunction formatIssuePath(path?: readonly PropertyKey[]): string {\n if (!path || path.length === 0) return \"(root)\"\n return path\n .map((segment) =>\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\n )\n .join(\".\")\n}\n\nexport class TwError extends Error {\n /** @deprecated Gunakan source */\n public readonly domain: string\n public readonly source: ErrorSource\n public readonly code: string\n public readonly originalCause?: unknown\n\n constructor(domainOrSource: string, code: string, message: string, cause?: unknown) {\n super(message)\n this.name = \"TwError\"\n this.domain = domainOrSource\n this.source = domainOrSource as ErrorSource\n this.code = code\n this.originalCause = cause\n if (Error.captureStackTrace) Error.captureStackTrace(this, TwError)\n }\n\n static fromIo(code: string, message: string): TwError {\n return new TwError(\"io\", code, message)\n }\n\n static fromCompile(code: string, message: string): TwError {\n return new TwError(\"compile\", code, message)\n }\n\n static fromRust(err: { code?: string; message?: string } | Error | unknown): TwError {\n if (err instanceof TwError) return err\n if (err instanceof Error) return new TwError(\"rust\", \"RUST_ERROR\", err.message, err)\n if (err && typeof err === \"object\") {\n const e = err as { code?: string; message?: string }\n return new TwError(\"rust\", e.code ?? \"RUST_ERROR\", e.message ?? String(err), err)\n }\n return new TwError(\"rust\", \"RUST_ERROR\", String(err), err)\n }\n\n /** Buat TwError dari ZodError — dukung shape Zod v3 (`errors`) dan v4 (`issues`). */\n static fromZod(err: { issues?: ZodLikeIssue[]; errors?: ZodLikeIssue[] }): TwError {\n const first = err.issues?.[0] ?? err.errors?.[0]\n const path = formatIssuePath(first?.path)\n const message = first ? `${path}: ${first.message}` : \"Schema validation failed\"\n return new TwError(\"validation\", \"SCHEMA_VALIDATION_FAILED\", message, err)\n }\n\n static wrap(source: string, code: string, err: unknown): TwError {\n if (err instanceof TwError) return err\n if (err instanceof Error) return new TwError(source, code, err.message, err)\n return new TwError(source, code, String(err), err)\n }\n\n override toString(): string {\n return `TwError [${this.source}:${this.code}] ${this.message}`\n }\n\n toJSON(): { name: string; source: string; code: string; message: string } {\n return { name: this.name, source: this.source, code: this.code, message: this.message }\n }\n\n toCliMessage(): string {\n return `[${this.source.toUpperCase()}:${this.code}] ${this.message}`\n }\n}\n\nexport function wrapUnknownError(domain: string, code: string, error: unknown): TwError {\n return TwError.wrap(domain, code, error)\n}\n\nexport function isTwError(err: unknown): err is TwError {\n return err instanceof TwError\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Native binding resolution\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface LoadNativeBindingOptions<T> {\n runtimeDir: string\n candidates: string[]\n isValid: (module: unknown) => module is T\n invalidExportMessage: string\n}\n\nexport interface LoadNativeBindingResult<T> {\n binding: T | null\n loadErrors: Array<{ path: string; message: string }>\n loadedPath?: string\n}\n\nexport function loadNativeBinding<T>(options: LoadNativeBindingOptions<T>): LoadNativeBindingResult<T> {\n const { runtimeDir, candidates, isValid } = options\n const loadErrors: Array<{ path: string; message: string }> = []\n\n for (const candidate of candidates) {\n const candidatePath = path.resolve(runtimeDir, candidate)\n try {\n if (!fs.existsSync(candidatePath) && !fs.existsSync(candidatePath + \".node\")) {\n continue\n }\n const mod = requireNativeModule(candidatePath)\n if (mod && isValid(mod)) {\n return { binding: mod, loadErrors, loadedPath: candidatePath }\n }\n loadErrors.push({ path: candidatePath, message: options.invalidExportMessage })\n } catch (e) {\n loadErrors.push({ path: candidatePath, message: e instanceof Error ? e.message : String(e) })\n }\n }\n\n return { binding: null, loadErrors }\n}\n\nconst _require = createRequire(\n typeof __filename !== \"undefined\"\n ? `file://${__filename}`\n : (import.meta.url ?? \"file://unknown\")\n)\n\nfunction requireNativeModule(p: string): unknown {\n return _require(p)\n}\n\nexport interface ResolveCandidatesOptions {\n runtimeDir?: string\n envVarNames?: string[]\n includeDefaultCandidates?: boolean\n enforceNodeExtensionForEnvPath?: boolean\n /** @deprecated — ignored, kept for backward compat */\n packageName?: string\n}\n\nexport function resolveNativeBindingCandidates(options: ResolveCandidatesOptions): string[] {\n const {\n envVarNames = [\"TW_NATIVE_PATH\", \"TWS_NATIVE_PATH\"],\n includeDefaultCandidates = true,\n enforceNodeExtensionForEnvPath = false,\n } = options\n // Default ke cwd kalau runtimeDir tidak disediakan\n const runtimeDir = options.runtimeDir || process.cwd()\n const candidates: string[] = []\n\n for (const envVar of envVarNames) {\n const envPath = process.env[envVar]\n if (envPath) {\n candidates.push(enforceNodeExtensionForEnvPath && !envPath.endsWith(\".node\") ? envPath + \".node\" : envPath)\n }\n }\n\n if (!includeDefaultCandidates) return candidates\n\n if (fs.existsSync(runtimeDir)) {\n try {\n for (const entry of fs.readdirSync(runtimeDir)) {\n if (entry.endsWith(\".node\")) candidates.push(entry)\n }\n } catch { /* ignore read errors */ }\n }\n\n const BINARY_NAMES = [\"tailwind-styled-native\", \"tailwind_styled_parser\"]\n const napiPlatform = process.platform === \"linux\" && process.arch === \"x64\" ? \"linux-x64-gnu\"\n : process.platform === \"linux\" && process.arch === \"arm64\" ? \"linux-arm64-gnu\"\n : `${process.platform}-${process.arch}`\n\n for (const bin of BINARY_NAMES) {\n candidates.push(path.resolve(runtimeDir, `${bin}.node`))\n candidates.push(path.resolve(runtimeDir, `${bin}.${napiPlatform}.node`))\n // 1 level: dist/ → package-root/native/ (published npm package)\n candidates.push(path.resolve(runtimeDir, \"..\", \"native\", `${bin}.node`))\n candidates.push(path.resolve(runtimeDir, \"..\", \"native\", `${bin}.${napiPlatform}.node`))\n // cwd fallback (user project root)\n candidates.push(path.resolve(process.cwd(), \"native\", `${bin}.node`))\n candidates.push(path.resolve(process.cwd(), \"native\", `${bin}.${napiPlatform}.node`))\n // 4 level: dist/ → package/ → domain/ → packages/ → repo-root/ (monorepo dev)\n candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `${bin}.node`))\n candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `${bin}.${napiPlatform}.node`))\n // 3 level fallback\n candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", `${bin}.node`))\n }\n\n return Array.from(new Set(candidates))\n}\n\nexport function resolveRuntimeDir(dir: string | undefined, importMetaUrl: string): string {\n if (dir) return path.resolve(dir)\n try {\n return path.dirname(fileURLToPath(importMetaUrl))\n } catch {\n return process.cwd()\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hashing\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function hashContent(content: string, algorithm: string = \"md5\", length?: number): string {\n const hash = createHash(algorithm).update(content).digest(\"hex\")\n return length ? hash.slice(0, length) : hash\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Error formatting\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof TwError) return error.toString()\n if (error instanceof Error) return error.message\n return String(error)\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// LRU Cache\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class LRUCache<K, V> {\n private capacity: number\n private cache: Map<K, V>\n\n constructor(capacity: number) {\n this.capacity = capacity\n this.cache = new Map()\n }\n\n get(key: K): V | undefined {\n if (!this.cache.has(key)) return undefined\n const value = this.cache.get(key)!\n this.cache.delete(key)\n this.cache.set(key, value)\n return value\n }\n\n set(key: K, value: V): void {\n if (this.cache.has(key)) {\n this.cache.delete(key)\n } else if (this.cache.size >= this.capacity) {\n const firstKey = this.cache.keys().next().value\n if (firstKey !== undefined) {\n this.cache.delete(firstKey)\n }\n }\n this.cache.set(key, value)\n }\n\n delete(key: K): boolean {\n return this.cache.delete(key)\n }\n\n has(key: K): boolean {\n return this.cache.has(key)\n }\n\n clear(): void {\n this.cache.clear()\n }\n\n entries(): IterableIterator<[K, V]> {\n return this.cache.entries()\n }\n\n get size(): number {\n return this.cache.size\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Trace Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type { TraceSnapshot, TraceSummary } from \"./trace\"\nexport {\n getHealthColor,\n getModeColor,\n formatMemory,\n formatDuration,\n calculateHealth,\n getBuildTimeColor,\n getMemoryColor,\n createTraceSnapshot,\n getPipelinePercentages,\n} from \"./trace\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Performance Telemetry\n// ─────────────────────────────────────────────────────────────────────────────\n\n\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Error Codes\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type { ErrorCode } from \"./error-codes\"\nexport { ERROR_CODES, getSuggestion, formatErrorCode } from \"./error-codes\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Tailwind Compatibility\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type { TailwindInfo } from \"./compatibility\"\nexport { detectTailwind, assertTailwindV4, getTailwindVersion, isTailwindV4 } from \"./compatibility\"\n\n// ── Native binding schemas (Zod boundary validation)\nexport {\n NativeScanFileSchema, NativeScanResultSchema,\n NativeAnalyzerReportSchema, NativeTransformResultSchema,\n NativeCssCompileResultSchema, NativeWatchResultSchema,\n NativeCacheEntrySchema, NativeCacheReadResultSchema,\n safeParseNative, parseNative,\n} from './native-schemas'\n\n// ── ESM-safe runtime helpers ──────────────────────────────────────────────\nexport {\n createEsmRequire,\n getDirname,\n getFilename,\n resolveFromRoot,\n tryRequire,\n resolveNativeNodePath,\n} from \"./esmHelpers\"\n\n// ── Performance telemetry ────────────────────────────────────────────────────\nexport {\n TelemetryCollector,\n getGlobalTelemetry,\n resetGlobalTelemetry,\n createBuildTimer,\n type BuildTelemetry,\n type TelemetrySummary,\n type BuildPhases,\n} from \"./telemetry\"\n\n// ── Config/JSON schema validation ─────────────────────────────────────────────\nexport {\n ScanCacheSchema,\n ScanCacheClassEntrySchema,\n TailwindConfigSchema,\n RegistryPluginEntrySchema,\n RegistryFileSchema,\n PackageJsonSchema,\n parseJsonWithSchema,\n parseJsonFileWithSchema,\n type ScanCache,\n type ScanCacheClassEntry,\n type TailwindConfig,\n type RegistryPluginEntry,\n type RegistryFile,\n type PackageJson,\n} from \"./configSchemas\"\n\n// ── Worker/bootstrap path resolution ─────────────────────────────────────────\nexport {\n resolveWorkerPath,\n resolveLoaderPath,\n type WorkerPathOptions,\n type WorkerPathResult,\n} from \"./workerResolver\"\n\n// ── Codegen helpers ───────────────────────────────────────────────────────────\nexport {\n generateComponentCode,\n generateStorybookStory,\n generateClassRenameCodemod,\n generateBarrelFile,\n type ComponentCodegenOptions,\n} from \"./codegen\"\n\n// ── Native binary resolution (QA #1) ─────────────────────────────────────────\nexport {\n resolveNativeBinary,\n formatNativeNotFoundError,\n type NativeResolutionResult,\n} from \"./native-resolution\"\n\n// ── Shared observability contract ────────────────────────────────────────────\nexport {\n createObservabilityClient,\n type ClassInspection,\n type ClassProperty,\n type ClassUsageLocation,\n type BuildTrace,\n type BuildPhaseTrace,\n type DashboardMetrics,\n type DashboardSummary,\n type ObservabilityClient,\n} from \"./observability\"\n\nexport {\n TW_STATE_STATIC_FILENAME,\n extractStaticStateCss,\n appendStaticStateCssToSafelist,\n type TwStateConfigEntry,\n type StaticStateCssInput,\n type GeneratedStateRule,\n type StaticStateExtractionResult,\n} from \"./staticStateExtractor\"\nexport { setGlobalLogFile } from \"./logger\"","export * from \"@tailwind-styled/theme\"\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// 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 (lewat useTokens()'s useEffect, atau\n // fallback rAF di bawah buat consumer yang pakai API imperative tanpa hook).\n // Setelah ini true, semua write di atas balik sinkron langsung seperti semula.\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 if (typeof window !== \"undefined\") {\n // Fallback buat consumer yang gak pakai useTokens() hook (cuma pakai\n // liveToken().set() imperatif): tetap flush setelah paint pertama,\n // jauh lebih aman daripada langsung saat module di-evaluasi.\n //\n // PENTING — kenapa DOUBLE rAF, bukan satu (FIX):\n // Satu rAF cuma menjamin \"sebelum repaint berikutnya\", BUKAN \"setelah\n // React selesai hydrate\". Module top-level (lihat LiveTokenDemo.tsx —\n // `liveToken({...})` dipanggil di luar komponen) di-evaluasi sebagai\n // bagian dari client bundle eval, yang notabene bisa kelar SEBELUM\n // React selesai memproses hydrateRoot() untuk seluruh tree — apalagi\n // di dev mode (React Compiler, Fast Refresh instrumentation, banyak\n // component) yang hydration-nya lebih lambat dari production build.\n // Kalau rAF pertama kebetulan menembak document.documentElement.style\n // (root <html>!) DI TENGAH proses hydrate, React lapor hydration\n // mismatch — persis kasus yang dilaporkan: `<html style={{--tw-token-\n // primary:...}}>` muncul di warning padahal layout.tsx gak pernah\n // nulis style itu di JSX-nya.\n // Dua rAF berturut-turut menjamin minimal satu frame penuh sudah lewat\n // SETELAH frame pertama (rAF kedua baru di-schedule SETELAH rAF\n // pertama selesai jalan) — kasih React jauh lebih banyak waktu utk\n // menyelesaikan commit + passive effects sebelum kita nyentuh\n // dokumen. Ini bukan garansi matematis 100% (gak ada API publik utk\n // \"tunggu sampai hydration React kelar\" di luar useEffect), tapi\n // margin amannya jauh lebih lebar daripada satu rAF — tervalidasi via\n // simulasi frame-by-frame: mutasi DOM mundur dari frame 1 ke frame 2.\n requestAnimationFrame(() => requestAnimationFrame(markHydrated))\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}\n","/**\n * Theme — Rust native bridge\n *\n * Uses @tailwind-styled/shared for native binding resolution.\n */\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport {\n createDebugLogger,\n loadNativeBinding,\n resolveNativeBindingCandidates,\n} from \"@tailwind-styled/shared\"\n\nconst log = createDebugLogger(\"theme:native\")\n\nfunction getDirname(): string {\n if (typeof __dirname !== \"undefined\") return __dirname\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\n return path.dirname(fileURLToPath(import.meta.url))\n }\n return process.cwd()\n}\n\ninterface NativeThemeBinding {\n compileTheme?: (\n tokensJson: string,\n themeName: string,\n prefix: string\n ) => {\n name: string\n selector: string\n css: string\n tokens: Array<{ key: string; cssVar: string; value: string }>\n } | null\n extractCssVars?: (source: string) => string[] | null\n}\n\nconst isValidThemeBinding = (module: unknown): module is NativeThemeBinding => {\n const candidate = module as Partial<NativeThemeBinding> | null | undefined\n return !!(candidate && typeof candidate.compileTheme === \"function\")\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Native Theme Binding - Factory Pattern\n// ─────────────────────────────────────────────────────────────────────────\n\nconst createThemeBindingLoader = () => {\n const _state = { binding: undefined as NativeThemeBinding | null | undefined }\n\n const getBinding = (): NativeThemeBinding | null => {\n if (_state.binding !== undefined) return _state.binding\n\n const runtimeDir = getDirname()\n const candidates = resolveNativeBindingCandidates({\n runtimeDir,\n includeDefaultCandidates: true,\n })\n\n const { binding } = loadNativeBinding<NativeThemeBinding>({\n runtimeDir,\n candidates,\n isValid: isValidThemeBinding,\n invalidExportMessage: \"Module loaded but missing expected theme binding functions\",\n })\n\n if (binding) {\n log(`theme native binding loaded successfully`)\n return (_state.binding = binding)\n }\n\n return (_state.binding = null)\n }\n\n return {\n get: getBinding,\n reset: (): void => {\n _state.binding = undefined\n },\n }\n}\n\nconst themeBindingLoader = createThemeBindingLoader()\n\nexport function getNativeThemeBinding(): NativeThemeBinding | null {\n return themeBindingLoader.get()\n}\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 TokenConfigSchema = z.object({\n name: z.string().min(1),\n values: z.record(z.string(), z.record(z.string(), z.string())),\n asRoot: z.boolean().optional(),\n})\n\nexport type TokenConfigInput = z.infer<typeof TokenConfigSchema>\n\nexport const LiveTokenUpdateSchema = z.object({\n tokens: z.record(z.string(), z.string()),\n source: z.string().optional(),\n})\n\nexport type LiveTokenUpdateInput = z.infer<typeof LiveTokenUpdateSchema>\n\nexport const ThemeRegistrationSchema = z.object({\n name: z.string().min(1),\n tokens: z.record(z.string(), z.record(z.string(), z.string())),\n isDefault: z.boolean().optional(),\n})\n\nexport type ThemeRegistrationInput = z.infer<typeof ThemeRegistrationSchema>\n\nexport const parseTokenConfig = (data: unknown) =>\n parseWithSchema(TokenConfigSchema, data, \"token config is invalid\")\n\nexport const parseLiveTokenUpdate = (data: unknown) =>\n parseWithSchema(LiveTokenUpdateSchema, data, \"live token update is invalid\")\n"],"mappings":"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","names":["path","fileURLToPath","setToken","setTokens","applyTokenSet","path","fileURLToPath","getDirname"]}
@@ -186,7 +186,7 @@ var init_nativeBridge = __esm({
186
186
  "use strict";
187
187
  init_cjs_shims();
188
188
  init_src();
189
- _loadNative = (path5) => require(path5);
189
+ _loadNative = (path6) => require(path6);
190
190
  log = (...args) => {
191
191
  if (process.env.DEBUG?.includes("compiler:native")) {
192
192
  console.log("[compiler:native]", ...args);
@@ -2012,6 +2012,17 @@ var init_watch = __esm({
2012
2012
  }
2013
2013
  });
2014
2014
 
2015
+ // packages/domain/compiler/src/routeGraph.ts
2016
+ var import_node_fs2, import_node_path2;
2017
+ var init_routeGraph = __esm({
2018
+ "packages/domain/compiler/src/routeGraph.ts"() {
2019
+ "use strict";
2020
+ init_cjs_shims();
2021
+ import_node_fs2 = __toESM(require("fs"), 1);
2022
+ import_node_path2 = __toESM(require("path"), 1);
2023
+ }
2024
+ });
2025
+
2015
2026
  // packages/domain/compiler/src/index.ts
2016
2027
  function _layoutClassesToCss(classes) {
2017
2028
  const native = getNativeBridge();
@@ -2047,13 +2058,13 @@ function extractContainerCssFromSource(source) {
2047
2058
  }
2048
2059
  return rules.join("\n");
2049
2060
  }
2050
- var import_node_fs2, import_node_path2, import_node_module5, _require3, transformSource, hasTwUsage, isAlreadyTransformed, shouldProcess, compileCssFromClasses, buildStyleTag, generateCssForClasses, eliminateDeadCss, findDeadVariants, runElimination, scanProjectUsage, generateSafelist, loadSafelist, loadTailwindConfig, getContentPaths, _CONTAINER_BREAKPOINTS, runLoaderTransform, shouldSkipFile, fileToRoute, getAllRoutes, getRouteClasses, registerFileClasses, registerGlobalClasses, _incrementalEngineInstance, getIncrementalEngine, resetIncrementalEngine, IncrementalEngine, getBucketEngine, resetBucketEngine, classifyNode, detectConflicts, bucketSort, analyzeFile, analyzeVariantUsage, injectClientDirective, injectServerOnlyComment, analyzeClasses, extractTwStateConfigs, generateStaticStateCss, extractAndGenerateStateCss;
2061
+ var import_node_fs3, import_node_path3, import_node_module5, _require3, transformSource, hasTwUsage, isAlreadyTransformed, shouldProcess, compileCssFromClasses, buildStyleTag, generateCssForClasses, eliminateDeadCss, findDeadVariants, runElimination, scanProjectUsage, generateSafelist, loadSafelist, loadTailwindConfig, getContentPaths, _CONTAINER_BREAKPOINTS, runLoaderTransform, shouldSkipFile, fileToRoute, getAllRoutes, _fileClassesMap, _globalClasses, getRouteClasses, getAllRegisteredClasses, registerFileClasses, registerGlobalClasses, resetRouteClassRegistry, _incrementalEngineInstance, getIncrementalEngine, resetIncrementalEngine, IncrementalEngine, getBucketEngine, resetBucketEngine, classifyNode, detectConflicts, bucketSort, analyzeFile, analyzeVariantUsage, injectClientDirective, injectServerOnlyComment, analyzeClasses, extractTwStateConfigs, generateStaticStateCss, extractAndGenerateStateCss;
2051
2062
  var init_src2 = __esm({
2052
2063
  "packages/domain/compiler/src/index.ts"() {
2053
2064
  "use strict";
2054
2065
  init_cjs_shims();
2055
- import_node_fs2 = __toESM(require("fs"), 1);
2056
- import_node_path2 = __toESM(require("path"), 1);
2066
+ import_node_fs3 = __toESM(require("fs"), 1);
2067
+ import_node_path3 = __toESM(require("path"), 1);
2057
2068
  import_node_module5 = require("module");
2058
2069
  init_nativeBridge();
2059
2070
  init_compiler();
@@ -2062,6 +2073,7 @@ var init_src2 = __esm({
2062
2073
  init_cache();
2063
2074
  init_redis();
2064
2075
  init_watch();
2076
+ init_routeGraph();
2065
2077
  _require3 = (0, import_node_module5.createRequire)(
2066
2078
  typeof require !== "undefined" ? typeof __filename !== "undefined" ? `file://${__filename}` : "file://unknown" : importMetaUrl
2067
2079
  );
@@ -2156,7 +2168,7 @@ var init_src2 = __esm({
2156
2168
  };
2157
2169
  scanProjectUsage = (dirs, cwd) => {
2158
2170
  const { batchExtractClasses: batchExtractClasses2 } = _require3("./parser");
2159
- const files = dirs.map((dir) => import_node_path2.default.resolve(cwd, dir));
2171
+ const files = dirs.map((dir) => import_node_path3.default.resolve(cwd, dir));
2160
2172
  const results = batchExtractClasses2(files) || [];
2161
2173
  const combined = {};
2162
2174
  for (const result of results) {
@@ -2173,13 +2185,13 @@ var init_src2 = __esm({
2173
2185
  const classes = scanProjectUsage(scanDirs, cwd || process.cwd());
2174
2186
  const allClasses = Object.keys(classes).sort();
2175
2187
  if (outputPath) {
2176
- import_node_fs2.default.writeFileSync(outputPath, JSON.stringify(allClasses, null, 2));
2188
+ import_node_fs3.default.writeFileSync(outputPath, JSON.stringify(allClasses, null, 2));
2177
2189
  }
2178
2190
  return allClasses;
2179
2191
  };
2180
2192
  loadSafelist = (safelistPath) => {
2181
2193
  try {
2182
- const content = import_node_fs2.default.readFileSync(safelistPath, "utf-8");
2194
+ const content = import_node_fs3.default.readFileSync(safelistPath, "utf-8");
2183
2195
  return JSON.parse(content);
2184
2196
  } catch {
2185
2197
  return [];
@@ -2193,8 +2205,8 @@ var init_src2 = __esm({
2193
2205
  "tailwind.config.cjs"
2194
2206
  ];
2195
2207
  for (const file of configFiles) {
2196
- const fullPath = import_node_path2.default.join(cwd, file);
2197
- if (import_node_fs2.default.existsSync(fullPath)) {
2208
+ const fullPath = import_node_path3.default.join(cwd, file);
2209
+ if (import_node_fs3.default.existsSync(fullPath)) {
2198
2210
  const mod = require(fullPath);
2199
2211
  return mod.default || mod;
2200
2212
  }
@@ -2204,9 +2216,9 @@ var init_src2 = __esm({
2204
2216
  getContentPaths = (cwd = process.cwd()) => {
2205
2217
  return {
2206
2218
  content: [
2207
- import_node_path2.default.join(cwd, "src/**/*.{js,ts,jsx,tsx}"),
2208
- import_node_path2.default.join(cwd, "app/**/*.{js,ts,jsx,tsx}"),
2209
- import_node_path2.default.join(cwd, "pages/**/*.{js,ts,jsx,tsx}")
2219
+ import_node_path3.default.join(cwd, "src/**/*.{js,ts,jsx,tsx}"),
2220
+ import_node_path3.default.join(cwd, "app/**/*.{js,ts,jsx,tsx}"),
2221
+ import_node_path3.default.join(cwd, "pages/**/*.{js,ts,jsx,tsx}")
2210
2222
  ]
2211
2223
  };
2212
2224
  };
@@ -2277,10 +2289,38 @@ var init_src2 = __esm({
2277
2289
  }
2278
2290
  return ["/", "__global"];
2279
2291
  };
2280
- getRouteClasses = (_route) => /* @__PURE__ */ new Set();
2281
- registerFileClasses = (_filepath, _classes) => {
2292
+ _fileClassesMap = /* @__PURE__ */ new Map();
2293
+ _globalClasses = /* @__PURE__ */ new Set();
2294
+ getRouteClasses = (route) => {
2295
+ const result = /* @__PURE__ */ new Set();
2296
+ for (const [filepath, classes] of _fileClassesMap) {
2297
+ const fileRoute = fileToRoute(filepath) ?? "__global";
2298
+ if (fileRoute === route) {
2299
+ for (const cls of classes) result.add(cls);
2300
+ }
2301
+ }
2302
+ return result;
2303
+ };
2304
+ getAllRegisteredClasses = () => {
2305
+ const result = new Set(_globalClasses);
2306
+ for (const classes of _fileClassesMap.values()) {
2307
+ for (const cls of classes) result.add(cls);
2308
+ }
2309
+ return result;
2310
+ };
2311
+ registerFileClasses = (filepath, classes) => {
2312
+ if (!classes || classes.length === 0) {
2313
+ _fileClassesMap.delete(filepath);
2314
+ return;
2315
+ }
2316
+ _fileClassesMap.set(filepath, new Set(classes));
2317
+ };
2318
+ registerGlobalClasses = (classes) => {
2319
+ for (const cls of classes) _globalClasses.add(cls);
2282
2320
  };
2283
- registerGlobalClasses = (_classes) => {
2321
+ resetRouteClassRegistry = () => {
2322
+ _fileClassesMap.clear();
2323
+ _globalClasses.clear();
2284
2324
  };
2285
2325
  _incrementalEngineInstance = null;
2286
2326
  getIncrementalEngine = () => {
@@ -2471,6 +2511,7 @@ __export(internal_exports, {
2471
2511
  generateStaticStateCss: () => generateStaticStateCss,
2472
2512
  generateStaticStateCssNative: () => generateStaticStateCssNative,
2473
2513
  generateSubComponentTypes: () => generateSubComponentTypes,
2514
+ getAllRegisteredClasses: () => getAllRegisteredClasses,
2474
2515
  getAllRoutes: () => getAllRoutes,
2475
2516
  getBucketEngine: () => getBucketEngine,
2476
2517
  getCacheOptimizationHints: () => getCacheOptimizationHints,
@@ -2573,6 +2614,7 @@ __export(internal_exports, {
2573
2614
  resetIncrementalEngine: () => resetIncrementalEngine,
2574
2615
  resetMemoryStats: () => resetMemoryStats,
2575
2616
  resetResolverPoolStats: () => resetResolverPoolStats,
2617
+ resetRouteClassRegistry: () => resetRouteClassRegistry,
2576
2618
  resolveCascade: () => resolveCascade,
2577
2619
  resolveClassNames: () => resolveClassNames,
2578
2620
  resolveColorCached: () => resolveColorCached,
@@ -2641,12 +2683,12 @@ __export(turbopackLoader_exports, {
2641
2683
  module.exports = __toCommonJS(turbopackLoader_exports);
2642
2684
  init_cjs_shims();
2643
2685
  init_internal();
2644
- var import_node_fs3 = __toESM(require("fs"), 1);
2645
- var import_node_path3 = __toESM(require("path"), 1);
2686
+ var import_node_fs4 = __toESM(require("fs"), 1);
2687
+ var import_node_path4 = __toESM(require("path"), 1);
2646
2688
  var _writtenRules = /* @__PURE__ */ new Set();
2647
2689
  function appendStaticCssToFile(staticCss, safelistPath) {
2648
2690
  if (!staticCss.trim() || !safelistPath) return;
2649
- const stateFilePath = import_node_path3.default.join(import_node_path3.default.dirname(safelistPath), "_tw-state-static.css");
2691
+ const stateFilePath = import_node_path4.default.join(import_node_path4.default.dirname(safelistPath), "_tw-state-static.css");
2650
2692
  const newRules = [];
2651
2693
  for (const chunk of staticCss.split(/(?<=\})\s*/)) {
2652
2694
  const rule = chunk.trim();
@@ -2657,9 +2699,9 @@ function appendStaticCssToFile(staticCss, safelistPath) {
2657
2699
  }
2658
2700
  if (newRules.length === 0) return;
2659
2701
  try {
2660
- import_node_fs3.default.mkdirSync(import_node_path3.default.dirname(stateFilePath), { recursive: true });
2661
- if (!import_node_fs3.default.existsSync(stateFilePath)) {
2662
- import_node_fs3.default.writeFileSync(
2702
+ import_node_fs4.default.mkdirSync(import_node_path4.default.dirname(stateFilePath), { recursive: true });
2703
+ if (!import_node_fs4.default.existsSync(stateFilePath)) {
2704
+ import_node_fs4.default.writeFileSync(
2663
2705
  stateFilePath,
2664
2706
  `/* _tw-state-static.css \u2014 Auto-generated by tailwind-styled-v4. DO NOT EDIT.
2665
2707
  * Import di globals.css: @import "./_tw-state-static.css";
@@ -2670,7 +2712,7 @@ function appendStaticCssToFile(staticCss, safelistPath) {
2670
2712
  "utf-8"
2671
2713
  );
2672
2714
  }
2673
- import_node_fs3.default.appendFileSync(stateFilePath, newRules.join("\n") + "\n", "utf-8");
2715
+ import_node_fs4.default.appendFileSync(stateFilePath, newRules.join("\n") + "\n", "utf-8");
2674
2716
  } catch {
2675
2717
  }
2676
2718
  }
@@ -2709,11 +2751,11 @@ var CYCLE_SENTINEL = "_cycle.txt";
2709
2751
  var START_SENTINEL = "_start.txt";
2710
2752
  var _workerCache = /* @__PURE__ */ new Map();
2711
2753
  function getTwClassesDir(safelistPath) {
2712
- return import_node_path3.default.join(import_node_path3.default.dirname(safelistPath), "tw-classes");
2754
+ return import_node_path4.default.join(import_node_path4.default.dirname(safelistPath), "tw-classes");
2713
2755
  }
2714
2756
  function readSentinel(filePath) {
2715
2757
  try {
2716
- return import_node_fs3.default.readFileSync(filePath, "utf-8").trim();
2758
+ return import_node_fs4.default.readFileSync(filePath, "utf-8").trim();
2717
2759
  } catch {
2718
2760
  return "";
2719
2761
  }
@@ -2723,36 +2765,36 @@ function clearAndMarkCycle(twClassesDir, startId) {
2723
2765
  if (_clearLock) return;
2724
2766
  _clearLock = true;
2725
2767
  try {
2726
- if (import_node_fs3.default.existsSync(twClassesDir)) {
2768
+ if (import_node_fs4.default.existsSync(twClassesDir)) {
2727
2769
  const tempDir = `${twClassesDir}_clearing_${Date.now()}`;
2728
2770
  try {
2729
- import_node_fs3.default.renameSync(twClassesDir, tempDir);
2730
- import_node_fs3.default.mkdirSync(twClassesDir, { recursive: true });
2731
- const startFile = import_node_path3.default.join(tempDir, START_SENTINEL);
2732
- if (import_node_fs3.default.existsSync(startFile)) {
2733
- import_node_fs3.default.copyFileSync(startFile, import_node_path3.default.join(twClassesDir, START_SENTINEL));
2771
+ import_node_fs4.default.renameSync(twClassesDir, tempDir);
2772
+ import_node_fs4.default.mkdirSync(twClassesDir, { recursive: true });
2773
+ const startFile = import_node_path4.default.join(tempDir, START_SENTINEL);
2774
+ if (import_node_fs4.default.existsSync(startFile)) {
2775
+ import_node_fs4.default.copyFileSync(startFile, import_node_path4.default.join(twClassesDir, START_SENTINEL));
2734
2776
  }
2735
- const mergedFile = import_node_path3.default.join(tempDir, "_webpack-merged.css");
2736
- if (import_node_fs3.default.existsSync(mergedFile)) {
2737
- import_node_fs3.default.copyFileSync(mergedFile, import_node_path3.default.join(twClassesDir, "_webpack-merged.css"));
2777
+ const mergedFile = import_node_path4.default.join(tempDir, "_webpack-merged.css");
2778
+ if (import_node_fs4.default.existsSync(mergedFile)) {
2779
+ import_node_fs4.default.copyFileSync(mergedFile, import_node_path4.default.join(twClassesDir, "_webpack-merged.css"));
2738
2780
  }
2739
- import_node_fs3.default.writeFileSync(import_node_path3.default.join(twClassesDir, CYCLE_SENTINEL), startId, "utf-8");
2781
+ import_node_fs4.default.writeFileSync(import_node_path4.default.join(twClassesDir, CYCLE_SENTINEL), startId, "utf-8");
2740
2782
  _workerCache.set(twClassesDir, startId);
2741
- import_node_fs3.default.rmSync(tempDir, { recursive: true, force: true });
2783
+ import_node_fs4.default.rmSync(tempDir, { recursive: true, force: true });
2742
2784
  } catch {
2743
- for (const file of import_node_fs3.default.readdirSync(twClassesDir)) {
2785
+ for (const file of import_node_fs4.default.readdirSync(twClassesDir)) {
2744
2786
  if (file === START_SENTINEL || file === "_webpack-merged.css") continue;
2745
2787
  try {
2746
- import_node_fs3.default.unlinkSync(import_node_path3.default.join(twClassesDir, file));
2788
+ import_node_fs4.default.unlinkSync(import_node_path4.default.join(twClassesDir, file));
2747
2789
  } catch {
2748
2790
  }
2749
2791
  }
2750
- import_node_fs3.default.writeFileSync(import_node_path3.default.join(twClassesDir, CYCLE_SENTINEL), startId, "utf-8");
2792
+ import_node_fs4.default.writeFileSync(import_node_path4.default.join(twClassesDir, CYCLE_SENTINEL), startId, "utf-8");
2751
2793
  _workerCache.set(twClassesDir, startId);
2752
2794
  }
2753
2795
  } else {
2754
- import_node_fs3.default.mkdirSync(twClassesDir, { recursive: true });
2755
- import_node_fs3.default.writeFileSync(import_node_path3.default.join(twClassesDir, CYCLE_SENTINEL), startId, "utf-8");
2796
+ import_node_fs4.default.mkdirSync(twClassesDir, { recursive: true });
2797
+ import_node_fs4.default.writeFileSync(import_node_path4.default.join(twClassesDir, CYCLE_SENTINEL), startId, "utf-8");
2756
2798
  _workerCache.set(twClassesDir, startId);
2757
2799
  }
2758
2800
  } catch {
@@ -2763,41 +2805,41 @@ function clearAndMarkCycle(twClassesDir, startId) {
2763
2805
  function getPerFileSafelistPath(safelistDir, resourcePath) {
2764
2806
  const normalized = resourcePath.replace(/\\/g, "/");
2765
2807
  const slug = normalized.replace(/^.*\/src\//, "").replace(/\.[tj]sx?$/, "").replace(/[^a-zA-Z0-9]/g, "_").slice(0, 80);
2766
- return import_node_path3.default.join(safelistDir, `${slug}.css`);
2808
+ return import_node_path4.default.join(safelistDir, `${slug}.css`);
2767
2809
  }
2768
2810
  function writePerFileSafelist(safelistPath, resourcePath, classes) {
2769
2811
  if (!safelistPath || classes.length === 0) return;
2770
2812
  try {
2771
2813
  const twClassesDir = getTwClassesDir(safelistPath);
2772
- const startId = readSentinel(import_node_path3.default.join(twClassesDir, START_SENTINEL));
2773
- const cachedCycle = _workerCache.get(twClassesDir) ?? readSentinel(import_node_path3.default.join(twClassesDir, CYCLE_SENTINEL));
2814
+ const startId = readSentinel(import_node_path4.default.join(twClassesDir, START_SENTINEL));
2815
+ const cachedCycle = _workerCache.get(twClassesDir) ?? readSentinel(import_node_path4.default.join(twClassesDir, CYCLE_SENTINEL));
2774
2816
  if (startId && cachedCycle !== startId) {
2775
2817
  clearAndMarkCycle(twClassesDir, startId);
2776
- } else if (!import_node_fs3.default.existsSync(twClassesDir)) {
2777
- import_node_fs3.default.mkdirSync(twClassesDir, { recursive: true });
2818
+ } else if (!import_node_fs4.default.existsSync(twClassesDir)) {
2819
+ import_node_fs4.default.mkdirSync(twClassesDir, { recursive: true });
2778
2820
  }
2779
2821
  const outPath = getPerFileSafelistPath(twClassesDir, resourcePath);
2780
2822
  const sorted = [...new Set(classes)].sort();
2781
2823
  const css = [
2782
- `/* tw-safelist: ${import_node_path3.default.basename(resourcePath)} \u2014 auto-generated */`,
2824
+ `/* tw-safelist: ${import_node_path4.default.basename(resourcePath)} \u2014 auto-generated */`,
2783
2825
  "@layer utilities {",
2784
2826
  sorted.map((cls) => `.${cls.replace(/([^a-zA-Z0-9_-])/g, "\\$1")} {}`).join("\n"),
2785
2827
  "}"
2786
2828
  ].join("\n");
2787
2829
  try {
2788
- if (import_node_fs3.default.readFileSync(outPath, "utf-8") === css) return;
2830
+ if (import_node_fs4.default.readFileSync(outPath, "utf-8") === css) return;
2789
2831
  } catch {
2790
2832
  }
2791
2833
  const tmpPath = `${outPath}.tmp`;
2792
2834
  try {
2793
- import_node_fs3.default.writeFileSync(tmpPath, css, "utf-8");
2794
- import_node_fs3.default.renameSync(tmpPath, outPath);
2835
+ import_node_fs4.default.writeFileSync(tmpPath, css, "utf-8");
2836
+ import_node_fs4.default.renameSync(tmpPath, outPath);
2795
2837
  } catch {
2796
2838
  try {
2797
- import_node_fs3.default.unlinkSync(tmpPath);
2839
+ import_node_fs4.default.unlinkSync(tmpPath);
2798
2840
  } catch {
2799
2841
  }
2800
- import_node_fs3.default.writeFileSync(outPath, css, "utf-8");
2842
+ import_node_fs4.default.writeFileSync(outPath, css, "utf-8");
2801
2843
  }
2802
2844
  } catch {
2803
2845
  }
@@ -2811,7 +2853,7 @@ function turbopackLoader(source, options = {}) {
2811
2853
  const router = detectRouter(this.resourcePath);
2812
2854
  const nextMajor = parseNum(options.nextMajor);
2813
2855
  const debug = parseBool(options.debug);
2814
- const filename = import_node_path3.default.basename(this.resourcePath);
2856
+ const filename = import_node_path4.default.basename(this.resourcePath);
2815
2857
  const effective = {
2816
2858
  addDataAttr: parseBool(options.addDataAttr),
2817
2859
  // App Router: selalu auto-detect client boundary