{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../packages/domain/shared/src/native-resolution.ts","../packages/domain/shared/src/index.ts","../src/umbrella/svelte.ts","../packages/presentation/svelte/src/index.ts","../packages/domain/core/src/index.ts","../packages/domain/core/src/native.ts","../packages/domain/core/src/merge.ts","../packages/domain/core/src/mergeFallback.ts","../packages/domain/core/src/cv.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","/**\n * Prebuilt binary resolution untuk native NAPI bindings.\n * QA #1: Resolve native binary dari prebuilt packages atau local build.\n *\n * Prioritas:\n * 1. TW_NATIVE_PATH env var (explicit override)\n * 2. Prebuilt binary dari platform-specific npm package\n * 3. Local build dari source (developer mode)\n */\n\nimport { createRequire } from \"node:module\"\nimport * as fs from \"node:fs\"\nimport * as path from \"node:path\"\n\nconst isBrowser = typeof window !== \"undefined\" || typeof document !== \"undefined\"\n\n// ESM-safe require — works in both ESM and CJS contexts.\n// Ref: Node.js docs — module.createRequire(filename) hanya terima:\n//   - file URL object, file URL string, atau absolute path string.\n// \"file://unknown\" crash karena bukan URL valid — gunakan process.cwd() sebagai fallback.\n// Ref: https://nodejs.org/api/module.html#modulecreaterequirefilename\nfunction _safeCreateRequire(): NodeRequire {\n  // ESM context: import.meta.url selalu absolute file URL yang valid\n  if (typeof import.meta !== \"undefined\" && import.meta.url && !import.meta.url.includes(\"unknown\")) {\n    return createRequire(import.meta.url)\n  }\n  // CJS context: __filename adalah absolute path yang valid\n  if (typeof __filename !== \"undefined\") {\n    return createRequire(__filename)\n  }\n  // Fallback: process.cwd() mengembalikan absolute path (Node.js docs — process.cwd())\n  return createRequire(new URL(`file://${process.cwd()}/`).href)\n}\n\nconst _require = _safeCreateRequire()\n\nexport interface NativeResolutionResult {\n  path: string | null\n  source: \"env\" | \"prebuilt\" | \"local\" | \"not-found\"\n  platform: string\n  tried: string[]\n}\n\n/** Platform key → prebuilt npm package name */\nconst PLATFORM_MAP: Record<string, string[]> = {\n  \"linux-x64\":    [\"@tailwind-styled/native-linux-x64-gnu\", \"@tailwind-styled/native-linux-x64\"],\n  \"linux-arm64\":  [\"@tailwind-styled/native-linux-arm64-gnu\", \"@tailwind-styled/native-linux-arm64\"],\n  \"darwin-x64\":   [\"@tailwind-styled/native-darwin-x64\"],\n  \"darwin-arm64\": [\"@tailwind-styled/native-darwin-arm64\"],\n  \"win32-x64\":    [\"@tailwind-styled/native-win32-x64-msvc\", \"@tailwind-styled/native-win32-x64\"],\n  \"win32-arm64\":  [\"@tailwind-styled/native-win32-arm64-msvc\", \"@tailwind-styled/native-win32-arm64\"],\n}\n\nfunction platformKey(): string {\n  if (isBrowser) return \"browser\"\n  return `${process.platform}-${process.arch}`\n}\n\n/**\n * Resolve native binary path dari semua sumber yang tersedia.\n *\n * @example\n * const result = resolveNativeBinary()\n * if (result.path) {\n *   const binding = require(result.path)\n * } else {\n *   throw new Error(\"Native binding not found — run npm run build:rust\")\n * }\n */\nexport function resolveNativeBinary(runtimeDir?: string): NativeResolutionResult {\n  const platform = platformKey()\n  const tried: string[] = []\n\n  if (isBrowser) {\n    return { path: null, source: \"not-found\", platform, tried: [\"not available in browser\"] }\n  }\n\n  // 0. Disabled flag — always short-circuit before any I/O\n  // TWS_NO_NATIVE adalah nama canonical; TWS_DISABLE_NATIVE diterima untuk backward compat\n  if (process.env.TWS_NO_NATIVE === \"1\" || process.env.TWS_DISABLE_NATIVE === \"1\") {\n    return { path: null, source: \"not-found\", platform, tried: [] }\n  }\n\n  // 1. Env var override\n  const envPath = process.env.TW_NATIVE_PATH?.trim()\n  if (envPath) {\n    if (fs.existsSync(envPath)) {\n      return { path: envPath, source: \"env\", platform, tried }\n    }\n    tried.push(`env:${envPath} (not found)`)\n  }\n\n  // 2. Prebuilt binary dari platform-specific npm package\n  const prebuiltPkgs = PLATFORM_MAP[platform] ?? []\n  for (const pkg of prebuiltPkgs) {\n    try {\n      const candidate = _require.resolve(`${pkg}/tailwind_styled_parser.node`)\n      if (fs.existsSync(candidate)) {\n        return { path: candidate, source: \"prebuilt\", platform, tried }\n      }\n      tried.push(`prebuilt:${pkg} (resolved but missing)`)\n    } catch {\n      tried.push(`prebuilt:${pkg} (not installed)`)\n    }\n  }\n\n  // 2b. .node file bundled inside this package itself (via \"files\": [\"native/*.node\"])\n  //     Covers the case where user installs tailwind-styled-v4 directly from npm\n  //     and the .node file lands at node_modules/tailwind-styled-v4/native/*.node\n  const napiPlatform = platform === \"linux-x64\" ? \"linux-x64-gnu\"\n    : platform === \"linux-arm64\" ? \"linux-arm64-gnu\"\n    : platform\n  const BINARY_NAMES_SELF = [\"tailwind-styled-native\", \"tailwind_styled_parser\"]\n  if (runtimeDir) {\n    // runtimeDir is typically dist/ — go up to package root, then into native/\n    for (const depth of [\"..\", path.join(\"..\", \"..\"), path.join(\"..\", \"..\", \"..\")]) {\n      const pkgRoot = path.resolve(runtimeDir, depth)\n      for (const bin of BINARY_NAMES_SELF) {\n        for (const suffix of [\"\", `.${platform}`, `.${napiPlatform}`]) {\n          const candidate = path.resolve(pkgRoot, \"native\", `${bin}${suffix}.node`)\n          tried.push(`self-bundled:${candidate}`)\n          if (fs.existsSync(candidate)) {\n            return { path: candidate, source: \"prebuilt\", platform, tried }\n          }\n        }\n      }\n    }\n  }\n\n  // 3. Local build candidates\n  const cwd = process.cwd()\n  const base = runtimeDir ?? cwd\n  // napi-rs naming: platform key may have -gnu suffix on Linux (already computed above)\n\n  // Both possible binary names:\n  // - \"tailwind_styled_parser\" (old hardcoded name in resolvers)\n  // - \"tailwind-styled-native\" (actual binaryName in native/package.json)\n  const BINARY_NAMES = [\"tailwind-styled-native\", \"tailwind_styled_parser\"]\n\n  const localCandidates: string[] = []\n\n  for (const bin of BINARY_NAMES) {\n    localCandidates.push(path.resolve(base, `${bin}.node`))\n    localCandidates.push(path.resolve(base, \"..\", `${bin}.node`))\n    localCandidates.push(path.resolve(base, `${bin}.${platform}.node`))\n    localCandidates.push(path.resolve(base, `${bin}.${napiPlatform}.node`))\n  }\n\n  // Walk up from cwd AND base to find repo root native/ dir\n  // Needed when npm workspaces sets cwd to the package subdir\n  for (const startDir of [cwd, base]) {\n    let dir = startDir\n    for (let i = 0; i < 6; i++) {\n      const nativeDir = path.resolve(dir, \"native\")\n      for (const bin of BINARY_NAMES) {\n        localCandidates.push(path.resolve(nativeDir, `${bin}.node`))\n        localCandidates.push(path.resolve(nativeDir, `${bin}.${platform}.node`))\n        localCandidates.push(path.resolve(nativeDir, `${bin}.${napiPlatform}.node`))\n        localCandidates.push(path.resolve(nativeDir, \"target\", \"release\", `${bin}.node`))\n      }\n      const parent = path.resolve(dir, \"..\")\n      if (parent === dir) break\n      dir = parent\n    }\n  }\n\n  for (const candidate of localCandidates) {\n    tried.push(`local:${candidate}`)\n    if (fs.existsSync(candidate)) {\n      return { path: candidate, source: \"local\", platform, tried }\n    }\n  }\n\n  return { path: null, source: \"not-found\", platform, tried }\n}\n\n/**\n * Format human-readable error untuk \"binary not found\".\n */\nexport function formatNativeNotFoundError(result: NativeResolutionResult): string {\n  const lines = [\n    `[tailwind-styled] Native binding not found for ${result.platform}`,\n    ``,\n    `Tried:`,\n    ...result.tried.map(t => `  - ${t}`),\n    ``,\n    `Solutions:`,\n    `  1. Build locally:     npm run build:rust`,\n    `  2. Install prebuilt:  npm install @tailwind-styled/native-${result.platform}`,\n    `  3. Override path:     TW_NATIVE_PATH=/path/to/parser.node`,\n  ]\n  return lines.join(\"\\n\")\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/svelte\"\n","/**\n * tailwind-styled-v4 — Svelte Adapter\n *\n * Svelte 4+ adapter menggunakan action dan store pattern.\n * Kompatibel dengan Svelte 5 runes mode.\n *\n * Dua pola yang didukung:\n * 1. `tw()` — buat class string resolver untuk dipakai di template\n * 2. `createSvelteComponent()` — buat Svelte component via Svelte API\n *\n * @example\n * <!-- Pola 1: tw() sebagai class resolver -->\n * <script>\n *   import { cv } from '@tailwind-styled/svelte'\n *\n *   const buttonClass = cv({\n *     base: 'px-4 py-2 rounded font-medium',\n *     variants: {\n *       intent: { primary: 'bg-blue-500 text-white', danger: 'bg-red-500 text-white' },\n *       size: { sm: 'h-8 text-sm', lg: 'h-12 text-lg' },\n *     },\n *     defaultVariants: { intent: 'primary', size: 'sm' },\n *   })\n *\n *   export let intent = 'primary'\n *   export let size = 'sm'\n * </script>\n *\n * <button class={buttonClass({ intent, size })}>\n *   <slot />\n * </button>\n */\n\nimport { twMerge } from \"@tailwind-styled/core\"\n\nimport type { VariantValue, VariantProps as Props } from '@tailwind-styled/shared'\n\n\nconst toClassName = (value: VariantValue): string | undefined => {\n  if (typeof value === \"string\") return value\n  if (typeof value === \"number\") return String(value)\n  return undefined\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface SvelteComponentConfig {\n  base?: string\n  variants?: Record<string, Record<string, string>>\n  compoundVariants?: Array<{ class: string; [key: string]: VariantValue }>\n  defaultVariants?: Record<string, string>\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Variant resolvers (framework-agnostic core)\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction resolveVariants(\n  variants: Record<string, Record<string, string>>,\n  props: Props,\n  defaults: Record<string, string> = {}\n): string {\n  const classes: string[] = []\n  for (const key in variants) {\n    const val = props[key] ?? defaults[key]\n    if (val !== undefined && variants[key]?.[String(val)]) {\n      classes.push(variants[key][String(val)])\n    }\n  }\n  return classes.join(\" \")\n}\n\nfunction resolveCompound(\n  compounds: Array<{ class: string; [key: string]: VariantValue }>,\n  props: Props\n): string {\n  return compounds\n    .filter((c) => {\n      const { class: _cls, ...conditions } = c\n      return Object.entries(conditions).every(([k, v]) => props[k] === v)\n    })\n    .map((c) => c.class)\n    .join(\" \")\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// cv() — Class Variant (utama untuk Svelte)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Class variant resolver — pola utama untuk Svelte.\n * Returns fungsi yang menerima props dan mengembalikan class string.\n *\n * Gunakan ini di `<script>` block, lalu panggil di template.\n *\n * @example\n * const button = cv({\n *   base: 'px-4 py-2 rounded',\n *   variants: { size: { sm: 'h-8', lg: 'h-12' } },\n * })\n *\n * // Di template: class={button({ size: 'lg' })}\n */\nexport function cv(config: SvelteComponentConfig) {\n  return (props: Props = {}) => {\n    const { base = \"\", variants = {}, compoundVariants = [], defaultVariants = {} } = config\n\n    const merged = { ...defaultVariants, ...props }\n    const variantClasses = resolveVariants(variants, merged, defaultVariants)\n    const compoundClasses = resolveCompound(compoundVariants, merged)\n\n    return twMerge(base, variantClasses, compoundClasses, toClassName(props.class))\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// tw() — Simple class merger dengan template literal support\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Simple class merger — berguna untuk merge class dinamis.\n *\n * @example\n * import { tw } from '@tailwind-styled/svelte'\n *\n * // Merge class string\n * const cls = tw('px-4 py-2', isActive && 'bg-blue-500', className)\n */\nexport function tw(...classes: Array<string | boolean | null | undefined>): string {\n  return twMerge(...(classes.filter(Boolean) as string[]))\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Svelte action — use:styled\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Svelte action untuk menerapkan class dinamis.\n *\n * @example\n * <script>\n *   import { styled } from '@tailwind-styled/svelte'\n *   const buttonConfig = { base: 'px-4 py-2', variants: { size: { sm: 'h-8', lg: 'h-12' } } }\n * </script>\n *\n * <button use:styled={{ config: buttonConfig, props: { size: 'lg' } }}>\n *   Click me\n * </button>\n */\nexport function styled(\n  node: HTMLElement,\n  { config, props = {} }: { config: SvelteComponentConfig; props?: Props }\n) {\n  const _resolver = cv(config)\n\n  function update({\n    config: cfg,\n    props: p = {},\n  }: {\n    config: SvelteComponentConfig\n    props?: Props\n  }) {\n    const classes = cv(cfg)(p)\n    // Hapus class lama yang dikelola action, tambah yang baru\n    node.className = classes\n  }\n\n  // Apply initial classes\n  update({ config, props })\n\n  return {\n    update,\n    destroy() {\n      // Cleanup tidak diperlukan\n    },\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// createVariants() — Svelte 5 runes compatible\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Svelte 5 runes-compatible variant factory.\n * Mengembalikan reactive class string menggunakan $derived pattern.\n *\n * @example\n * // Dalam Svelte 5 component:\n * const { className, variantProps } = createVariants({\n *   base: 'px-4 py-2',\n *   variants: { size: { sm: 'h-8', lg: 'h-12' } },\n * }, () => ({ size: currentSize }))\n *\n * // className adalah fungsi yang return class string terkini\n */\nexport function createVariants(config: SvelteComponentConfig, getProps: () => Props) {\n  const resolver = cv(config)\n\n  return {\n    className: () => resolver(getProps()),\n    config,\n  }\n}\n","/**\n * tailwind-styled-v4 v3 — Public API\n *\n * New in v3:\n *   - Reactive State Engine: tw.button({ state: { active: \"...\" } })\n *   - Container Query Engine: tw.div({ container: { md: \"flex-row\" } })\n *   - Live Token Engine: liveToken({ primary: \"#3b82f6\" })\n */\n\nexport type { ContainerEntry } from \"./containerQuery\"\n// ── Container Query Engine ────────────────────────────────────────────────────\nexport {\n  generateContainerCss,\n  getContainerRegistry,\n  processContainer,\n} from \"./containerQuery\"\nexport { createComponent } from \"./createComponent\"\nexport { cv } from \"./cv\"\nexport { cn, cx, cxm } from \"./cx\"\nexport type { LiveTokenSet, TokenMap, TokenSubscriber } from \"./liveTokenEngine\"\n// ── Live Token Engine ─────────────────────────────────────────────────────────\nexport {\n  applyTokenSet,\n  createUseTokens,\n  generateTokenCssString,\n  getToken,\n  getTokens,\n  liveToken,\n  setToken,\n  setTokens,\n  subscribeTokens,\n  tokenRef,\n  tokenRef as containerRef,\n  tokenVar,\n} from \"./liveTokenEngine\"\n// NOTE: Live Token Engine has been moved to @tailwind-styled/runtime\n// to prevent \"use client\" directive from affecting the main bundle.\n// Import live token functions from \"tailwind-styled-v4/runtime\" or\n// \"@tailwind-styled/runtime\" instead.\n// Previous exports: applyTokenSet, createUseTokens, generateTokenCssString,\n// getToken, getTokens, liveToken, setToken, setTokens, subscribeTokens,\n// tokenRef, tokenVar, LiveTokenSet, TokenMap, TokenSubscriber\nexport type { MergeOptions } from \"./merge\"\nexport { createTwMerge, mergeWithRules, twMerge } from \"./merge\"\n// ── Native Rust Bindings ─────────────────────────────────────────────────────\n// NOTE: Native functions are Node.js-only (require Rust .node binding).\n// Import from \"tailwind-styled-v4/native\" instead of the main bundle.\n// This prevents fs/node built-ins from leaking into browser bundles.\nexport type { ParsedClass, ParsedClassModifier, ThemeConfig } from \"./native\"\nexport type { SubComponentEntry, SubComponentProps } from \"./registry\"\n// ── Sub-Component Registry ───────────────────────────────────────────────────\nexport {\n  getAllSubComponents,\n  getSubComponent,\n  registerSubComponent,\n  withSubComponents,\n} from \"./registry\"\nexport type { StateComponentEntry } from \"./stateEngine\"\n// ── Reactive State Engine ─────────────────────────────────────────────────────\nexport {\n  generateStateCss,\n  getStateRegistry,\n  processState,\n} from \"./stateEngine\"\nexport type { StyledOptions, StyledProps } from \"./styled\"\nexport { resolveStyledClassName, styled } from \"./styled\"\nexport type {\n  StyledSystemConfig,\n  StyledSystemInstance,\n  SystemComponentConfig,\n  SystemComponentFactory,\n  SystemTokenMap,\n} from \"./styledSystem\"\n// ── Design System Factory ─────────────────────────────────────────────────────\nexport { createStyledSystem } from \"./styledSystem\"\n// ── Core ──────────────────────────────────────────────────────────────────────\nexport { server, tw } from \"./twProxy\"\nexport type { ResolvedThemeTokens, ThemeTokenMap } from \"./twTheme\"\n// ── Tailwind v4 CSS Variables ─────────────────────────────────────────────────\nexport { createTheme, cssVar, t, twVar, v4Tokens } from \"./twTheme\"\n// ── Types ─────────────────────────────────────────────────────────────────────\nexport type {\n  ComponentConfig,\n  ContainerConfig,\n  CvFn,\n  HtmlTagName,\n  InferVariantProps,\n  StateConfig,\n  StyledComponentProps,\n  SubComponentMap,\n  TwComponentFactory,\n  TwObject,\n  TwStyledComponent,\n  TwSubComponent,\n  TwTagFactory,\n  TwTagFactoryAny,\n  VariantLiterals,\n} from \"./types\"","/**\n * tailwind-styled-v5 — Native Rust Bindings\n *\n * All functions require native Rust bindings.\n * Uses @tailwind-styled/shared for native resolution.\n */\n\nimport { createRequire } from \"node:module\"\nimport { dirname } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { resolveNativeBinary } from \"@tailwind-styled/shared\"\n\nconst isBrowser = typeof window !== \"undefined\" || typeof document !== \"undefined\"\nconst NATIVE_UNAVAILABLE_MESSAGE =\n  \"[tailwind-styled/core] Native binding is required but not available.\\n\" +\n  \"Please ensure you have run: npm run build:rust\"\n\nconst _nodeRequire = createRequire(\n  typeof __filename !== \"undefined\"\n    ? `file://${__filename}`\n    : (typeof import.meta !== \"undefined\" && import.meta.url ? import.meta.url : \"file://unknown\")\n)\nconst _loadNative = (path: string): unknown => _nodeRequire(path)\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Type Definitions\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ParsedClassModifier {\n  type: \"opacity\" | \"arbitrary\"\n  value: string\n}\n\nexport interface ParsedClass {\n  raw: string\n  base: string\n  variants: string[]\n  modifier?: ParsedClassModifier\n}\n\nexport interface ThemeConfig {\n  colors: Record<string, string>\n  spacing: Record<string, string>\n  fonts: Record<string, string>\n  breakpoints: Record<string, string>\n  animations: Record<string, string>\n  raw: Record<string, string>\n}\n\ninterface NativeBinding {\n  batchSplitClasses?: (input: string[]) => Array<{\n    variantKey: string\n    base: string\n    variants: string[]\n    isArbitrary: boolean\n    hasModifier: boolean\n  }>\n\n  twMergeRaw?: (classLists: string[]) => string\n  /** tw_merge_raw dengan support custom Tailwind prefix dan output separator */\n  twMergeRawWithOptions?: (classLists: string[], opts: { prefix?: string; separator?: string }) => string\n  flattenAndResolve?: (nestedJson: string) => string\n  resolveConflictGroup?: (base: string) => string\n\n  compileTheme?: (themeConfig: string) => { css: string; variables: Record<string, string> }\n  extractCssVars?: (css: string) => Record<string, string>\n  extractThemeFromCss?: (css: string) => Array<{ key: string; value: string }>\n  parseCssRules?: (css: string) => Array<{\n    className: string\n    property: string\n    value: string\n    isImportant: boolean\n    variants: string[]\n    specificity: number\n  }>\n  parseCssToRules?: (css: string) => string\n  detectDeadCode?: (css: string, usedClasses: string[]) => string[]\n  classifyKnownClasses?: (classes: string[]) => Array<{ className: string; category: string }>\n  detectClassConflicts?: (classes: string) => { conflicts: Array<{ class1: string; class2: string; reason: string }>; conflictedClassNames: string[] }\n  resolveVariants?: (configJson: string, propsJson: string) => { classes: string; resolvedCount: number }\n  resolveSimpleVariants?: (base: string | null, variants: Record<string, Record<string, string>>, defaults: Record<string, string>, props: Record<string, string>) => string\n  /** Parse template literal yang sudah di-join. Menggantikan parseTemplate() di twProxy.ts */\n  parseTemplate?: (raw: string) => {\n    base: string\n    subsJson: string\n    hasSubs: boolean\n  }\n  /** Validate ComponentConfig — menggantikan validateVariantConfig() di cv.ts */\n  validateVariantConfig?: (configJson: string) => {\n    valid: boolean\n    errors: Array<{ errorType: string; key: string; value?: string; message: string }>\n    warnings: string[]\n  }\n  /** Build lookup key untuk generated registry — menggantikan key builder di lookupGenerated() */\n  buildVariantLookupKey?: (defaultVariantsJson: string, propsJson: string) => string\n  /** Menggantikan cn() — filter+join class names dalam satu Rust pass. (class_utils.rs) */\n  resolveClassNames?: (inputs: string[]) => string\n  /** tw_merge dengan custom separator dan optional debug */\n  twMergeWithSeparator?: (classString: string, opts: { separator?: string; debug?: boolean }) => string\n  /** tw_merge_many dengan custom separator */\n  twMergeManyWithSeparator?: (classStrings: string[], opts: { separator?: string; debug?: boolean }) => string\n  /** conflict-aware Tailwind class merger — port of tailwind-merge. (tw_merge.rs) */\n  twMerge?: (classString: string) => string\n  /** variadic convenience wrapper untuk twMerge. (tw_merge.rs) */\n  twMergeMany?: (classStrings: string[]) => string\n  /** Tailwind classes → semicolon-separated inline CSS declarations. (state_css.rs) */\n  twClassesToCss?: (classes: string) => string\n  /**\n   * Generate semua CSS rules untuk satu component dari state config — satu Rust call.\n   *\n   * Menggantikan JS loop di `injectStateStyles()` dan `generateStateCss()` yang\n   * memanggil `twClassesToCss()` per state entry (N × NAPI calls → 1 call).\n   *\n   * @param id           Component state class, e.g. `\"tw-s-abc123\"`\n   * @param stateMapJson JSON object `{\"loading\":\"opacity-60 cursor-wait\",\"selected\":\"ring-2\"}`\n   * @param resolvedCss  Opsional Tailwind pipeline CSS untuk resolve named classes\n   * @returns            Array of `{ cssRule, stateName, declarations }` — satu per state entry\n   */\n  generateRuntimeStateCss?: (\n    id: string,\n    stateMapJson: string,\n    resolvedCss: string | null\n  ) => Array<{ cssRule: string; stateName: string; declarations: string }>\n  /**\n   * Hash a content string — menggantikan JS djb2 loop di hashState() dan hashContainer().\n   * algorithm: \"md5\" | \"sha256\" | \"fnv\" | \"ahash\" (default: \"md5\")\n   * length: potong output hex ke N karakter (mis. 6 untuk short ID)\n   */\n  hashContent?: (content: string, algorithm?: \"md5\" | \"sha256\" | \"fnv\" | \"ahash\", length?: number) => string\n  /** Iterative CSS var() chain resolver. (theme.rs) */\n  resolveThemeValue?: (key: string, rawMapJson: string) => string\n  /**\n   * Parse @theme CSS blocks, classify tokens ke buckets, resolve semua var() —\n   * satu Rust call menggantikan extractThemeFromCss() + N × resolveThemeValue().\n   * Return ClassifiedThemeConfig: { colors, spacing, fonts, breakpoints, animations, raw }\n   */\n  extractThemeFromCssClassified?: (css: string) => {\n    colors: Record<string, string>\n    spacing: Record<string, string>\n    fonts: Record<string, string>\n    breakpoints: Record<string, string>\n    animations: Record<string, string>\n    raw: Record<string, string>\n  }\n  /**\n   * Generate TypeScript interface TailwindStyledThemeTokens dari theme JSON.\n   * Build-time CLI only (tw generate-types). Menggantikan generateTypeDefinitions() JS.\n   */\n  generateTypeDefinitions?: (themeJson: string) => string\n  /**\n   * Generate `:root { --prefix-group-name: value; ... }` CSS block dari SystemTokenMap.\n   *\n   * Menggantikan nested JS loop di `injectTokensToRoot()` dan `setTokens()` di `styledSystem.ts`.\n   *\n   * `tokensJson`: JSON dari `SystemTokenMap` — `{\"colors\":{\"primary\":\"#6366f1\"},\"radius\":{\"base\":\"0.5rem\"}}`\n   * `prefix`: CSS variable prefix, e.g. `\"sys\"` → `--sys-colors-primary`\n   */\n  generateSystemTokenCss?: (tokensJson: string, prefix: string) => string\n  /** Parse sub-component block syntax from tw`` template. (tw_merge.rs) */\n  parseSubcomponentBlocksNapi?: (template: string, componentName: string) => {\n    baseClasses: string\n    subMapJson: string\n  }\n  /** Menggantikan layoutClassesToCss() — static lookup + split dalam satu Rust pass. (container_query.rs) */\n  layoutClassesToCss?: (classes: string) => string\n  /** Menggantikan buildContainerRules() — generate @container CSS rules. (container_query.rs) */\n  buildContainerRules?: (\n    id: string,\n    breakpoints: Array<{ key: string; classes: string }>,\n    containerName: string | null\n  ) => string\n  /** Pre-generate semua kombinasi boolean states via bitmask (tw_merge.rs) */\n  pregenerateStatesNapi?: (states: Record<string, string>) => {\n    lookupJson: string\n    stateKeys: string[]\n    combinations: number\n  }\n\n  // ── Theme Parsing (napi_bridge_theme_parsing.rs) ───────────────────────────\n  parseColorsNapi?: (colorsJson: string) => string | Record<string, string>\n  parseSpacingNapi?: (spacingJson: string) => string | Record<string, string>\n  parseTransformNapi?: (transformJson: string) => string | Record<string, string>\n  normalizeColorNapi?: (color: string, opacity: string) => string\n  sanitizeColorNapi?: (color: string) => string\n  splitRgbaNapi?: (color: string) => string | { r: number; g: number; b: number; a: number }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Binding Loader\n// ─────────────────────────────────────────────────────────────────────────────\n\nlet nativeBinding: NativeBinding | null = null\nlet bindingLoadAttempted = false\n\n/**\n * Returns the loaded native binding, or `null` when none is available.\n *\n * In the browser this is the EXPECTED case, not an error: a `.node` N-API\n * addon is platform-specific Node.js machine code and can never be loaded\n * by a browser JS engine — no amount of fixing the Rust side changes that.\n * Callers (e.g. merge.ts's twMerge()) are expected to handle `null` and\n * fall back to a pure-TS implementation for the handful of functions that\n * genuinely need to run client-side.\n *\n * Outside the browser (Node.js / build time / SSR), native IS expected to\n * be available — if it still fails to load there, that's a real\n * misconfiguration, so this keeps throwing in that case (callers already\n * rely on this: every call site does `binding?.xxx` + its own descriptive\n * \"Native binding 'xxx' is required but not available\" error).\n */\nconst getBinding = (): NativeBinding | null => {\n  if (isBrowser) {\n    return null\n  }\n\n  if (nativeBinding) return nativeBinding\n\n  if (bindingLoadAttempted) {\n    throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n  }\n\n  bindingLoadAttempted = true\n\n  try {\n    const runtimeDir = dirname(\n      typeof __filename !== \"undefined\"\n        ? __filename\n        : (typeof import.meta !== \"undefined\" && import.meta.url ? fileURLToPath(import.meta.url) : process.cwd())\n    )\n    const result = resolveNativeBinary(runtimeDir)\n\n    if (result.path && result.path.endsWith(\".node\")) {\n      const mod = _loadNative(result.path) as NativeBinding\n      if (mod?.batchSplitClasses) {\n        nativeBinding = mod\n        return nativeBinding\n      }\n    }\n\n    throw new Error(`${NATIVE_UNAVAILABLE_MESSAGE}\\n\\nTried: ${result.tried.join(\"\\n\")}`)\n  } catch (err) {\n    throw err instanceof Error ? err : new Error(String(err))\n  }\n}\n\nexport const resetNativeBinding = (): void => {\n  nativeBinding = null\n  bindingLoadAttempted = false\n}\n\nexport const getNativeBinding = getBinding\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Parser Functions\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction splitClassListNative(input: string): string[] {\n  const binding = getBinding()\n  if (!binding?.batchSplitClasses) {\n    throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n  }\n  const result = binding.batchSplitClasses([input])\n  if (result.length === 0) return []\n  return result[0].base.split(\" \").filter(Boolean)\n}\n\nfunction parseClassTokenNative(rawToken: string): ParsedClass {\n  const binding = getBinding()\n  if (!binding?.batchSplitClasses) {\n    throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n  }\n  const result = binding.batchSplitClasses([rawToken])\n  if (result.length === 0) {\n    return { raw: rawToken, base: rawToken, variants: [] }\n  }\n  const r = result[0]\n  const parsed: ParsedClass = {\n    raw: r.base,\n    base: r.base,\n    variants: r.variants,\n  }\n  if (r.hasModifier) {\n    const opacityMatch = r.base.match(/^(.*)\\/(\\d{1,3})$/)\n    if (opacityMatch && opacityMatch[1].length > 0) {\n      parsed.base = opacityMatch[1]\n      parsed.modifier = { type: \"opacity\", value: opacityMatch[2] }\n    } else {\n      const arbitraryMatch = r.base.match(/\\((--[a-zA-Z0-9_-]+)\\)/)\n      if (arbitraryMatch) {\n        parsed.modifier = { type: \"arbitrary\", value: arbitraryMatch[1] }\n      }\n    }\n  }\n  return parsed\n}\n\nexport function splitClassList(input: string): string[] {\n  return splitClassListNative(input)\n}\n\nexport function parseClassToken(rawToken: string): ParsedClass {\n  return parseClassTokenNative(rawToken)\n}\n\nexport function parseTailwindClasses(input: string): ParsedClass[] {\n  const classes = splitClassListNative(input)\n  return classes.map((c) => parseClassTokenNative(c))\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CSS/Theme Functions\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function compileTheme(themeConfig: Record<string, unknown>) {\n  const binding = getBinding()\n  if (!binding?.compileTheme) {\n    throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n  }\n  return binding.compileTheme(JSON.stringify(themeConfig))\n}\n\nexport function extractCssVars(css: string): Record<string, string> {\n  const binding = getBinding()\n  if (!binding?.extractCssVars) {\n    throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n  }\n  return binding.extractCssVars(css)\n}\n\nexport function parseCssRules(css: string) {\n  const binding = getBinding()\n  if (!binding?.parseCssRules) {\n    throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n  }\n  return binding.parseCssRules(css)\n}\n\nexport function parseCssToRules(css: string): string {\n  const binding = getBinding()\n  if (!binding?.parseCssToRules) {\n    throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n  }\n  return binding.parseCssToRules(css)\n}\n\nexport function detectDeadCode(css: string, usedClasses: string[]): string[] {\n  const binding = getBinding()\n  if (!binding?.detectDeadCode) {\n    throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n  }\n  return binding.detectDeadCode(css, usedClasses)\n}\n\nexport function classifyKnownClasses(classes: string[]) {\n  const binding = getBinding()\n  if (!binding?.classifyKnownClasses) {\n    throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n  }\n  return binding.classifyKnownClasses(classes)\n}\n\nexport function detectClassConflicts(classes: string[]) {\n  const binding = getBinding()\n  if (!binding?.detectClassConflicts) {\n    throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n  }\n  return binding.detectClassConflicts(classes.join(\" \"))\n}\n\nexport function extractThemeFromCSS(cssContent: string): ThemeConfig {\n  const binding = getBinding()\n  if (!binding?.parseCssRules) {\n    throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n  }\n\n  const properties = binding.parseCssRules(cssContent)\n  const theme: ThemeConfig = {\n    colors: {},\n    spacing: {},\n    fonts: {},\n    breakpoints: {},\n    animations: {},\n    raw: {},\n  }\n\n  const prefixMap: Record<string, keyof ThemeConfig> = {\n    \"color-\": \"colors\",\n    \"spacing-\": \"spacing\",\n    \"font-\": \"fonts\",\n    \"breakpoint-\": \"breakpoints\",\n    \"animate-\": \"animations\",\n  }\n\n  for (const prop of properties) {\n    const cssVar = prop.property.replace(/^--/, \"\")\n    theme.raw[cssVar] = prop.value\n\n    for (const [prefix, category] of Object.entries(prefixMap)) {\n      if (cssVar.startsWith(prefix)) {\n        const name = cssVar.slice(prefix.length)\n        if (name) theme[category][name] = prop.value\n        break\n      }\n    }\n  }\n\n  return theme\n}","/**\n * tailwind-styled-v4 — createTwMerge()\n *\n * Native Rust binding (twMergeRaw) is used when available (Node.js, build\n * time, SSR) for maximum performance/parity with the rest of the pipeline.\n *\n * Browser fallback (Bug C — \"Uncaught Error: Native binding 'twMergeRaw' is\n * required but not available.\" crashing in the browser):\n *\n * createComponent.ts calls twMerge() unconditionally inside the React render\n * function for EVERY tw.* component, on EVERY render — including the very\n * first client-side render of any component that runs/re-renders in the\n * browser. A `.node` native addon can never load inside a browser JS engine,\n * so this isn't a rare edge case, it's unconditional: any tw.* component\n * rendering client-side needs a working fallback path.\n *\n * getNativeBinding() returns `null` (not a throw) when running in the\n * browser — see native.ts. When that happens we use mergeFallback.ts, a\n * hand-written pure-TS port of the SAME algorithm as `tw_merge_raw` in\n * tw_merge.rs (conflict_group / split_variants / merge_class_string),\n * instead of the third-party `tailwind-merge` package. This keeps merge\n * behavior defined by one algorithm — ours — rather than risking the\n * browser and the server silently disagreeing on merged className output\n * because two different implementations drifted apart. The cost: when\n * tw_merge.rs's conflict_group() changes, mergeFallback.ts must be updated\n * by hand to match (see comments there).\n */\n\nimport { getNativeBinding } from \"./native\"\nimport { twMergeRawJs } from \"./mergeFallback\"\nimport type { ThemeConfig } from \"./themeReader\"\n\nexport interface MergeOptions {\n  /**\n   * NOTE: not currently applied — matches the native path, which calls\n   * `native.twMergeRaw(inputs)` without ever forwarding a prefix either.\n   * Kept on the type for API stability; wire it through conflictGroup()\n   * in mergeFallback.ts (and tw_merge_raw on the Rust side) together if a\n   * custom Tailwind prefix needs to be supported correctly end-to-end.\n   */\n  prefix?: string\n  separator?: string\n  theme?: ThemeConfig\n}\n\nlet warnedFallback = false\nfunction warnFallbackOnce(): void {\n  if (warnedFallback) return\n  warnedFallback = true\n  if (typeof console !== \"undefined\") {\n    console.warn(\n      \"[tailwind-styled-v4] Native binding 'twMergeRaw' tidak tersedia \" +\n      \"(normal di browser) — pakai pure-TS port dari algoritma Rust-nya. \" +\n      \"Hasil className tetap benar; ini cuma informasi, bukan error.\"\n    )\n  }\n}\n\nexport function createTwMerge(options: MergeOptions = {}) {\n  const prefix = options.prefix ?? \"\"\n  return function twMerge(...classLists: Array<string | undefined | null | false>): string {\n    const inputs: string[] = []\n    for (let i = 0; i < classLists.length; i++) {\n      const v = classLists[i]\n      if (v) inputs.push(String(v))\n    }\n    if (inputs.length === 0) return \"\"\n\n    const native = getNativeBinding()\n    if (native) {\n      // Gunakan twMergeRawWithOptions jika prefix tersedia, twMergeRaw jika tidak\n      if (prefix && native.twMergeRawWithOptions) {\n        return native.twMergeRawWithOptions(inputs, { prefix })\n      }\n      if (native.twMergeRaw) {\n        return native.twMergeRaw(inputs)\n      }\n    }\n\n    warnFallbackOnce()\n    return twMergeRawJs(inputs, prefix)\n  }\n}\n\nexport const twMerge = createTwMerge()\n\nexport function mergeWithRules(\n  rules: Record<string, (classes: string[]) => string>,\n  ...classLists: string[]\n): string {\n  const base = twMerge(...classLists)\n  const classes = Object.values(rules).reduce(\n    (acc, rule) => twMerge(rule(acc)).split(/\\s+/).filter(Boolean),\n    base.split(/\\s+/).filter(Boolean)\n  )\n  return classes.join(\" \")\n}","/**\n * tailwind-styled-v4 — pure-TS port of the native merge algorithm\n *\n * This is a MANUAL, line-for-line port of `conflict_group()` / `split_variants()`\n * / `merge_class_string()` in `native/src/application/tw_merge.rs`. It exists\n * ONLY as the browser-side fallback for `twMerge()` — a `.node` N-API addon can\n * never load inside a browser JS engine, so when `createComponent.ts` calls\n * `twMerge()` during a client-side render, there is no native binding to call.\n *\n * Deliberately NOT using the `tailwind-merge` npm package: that would mean two\n * different conflict-resolution algorithms (theirs in the browser, ours on the\n * server) that can silently drift apart and produce different className output\n * for the same input depending on where the component happens to render. This\n * file defines merge semantics with ONE algorithm — ours — at the cost of having\n * to keep it in sync BY HAND with tw_merge.rs. If you change `conflict_group()`\n * in Rust, mirror the change here too.\n *\n * Quirks preserved ON PURPOSE for parity with the compiled Rust (not \"fixed\"\n * here, since fixing only one side would make them disagree):\n * - `rounded-sm` and `rounded-s-*` collide on the same prefix check (both start\n *   with \"rounded-s\") — same ambiguity exists in tw_merge.rs.\n * - `rounded-tl-*` / `rounded-tr-*` both reduce to group \"rounded-t\" (the Rust\n *   code only looks at the first character after \"rounded-\").\n * - `ring-offset-*` always resolves to ONE group (\"ring-offset\"); a width/color\n *   split exists further down in tw_merge.rs but is unreachable dead code there\n *   (an earlier identical `if` already returns) — so it's omitted here too.\n */\n\nconst TEXT_SIZE_SUFFIXES = new Set([\n  \"xs\", \"sm\", \"base\", \"lg\", \"xl\", \"2xl\", \"3xl\", \"4xl\", \"5xl\", \"6xl\", \"7xl\", \"8xl\", \"9xl\",\n])\n\nfunction isTextSize(suffix: string): boolean {\n  if (TEXT_SIZE_SUFFIXES.has(suffix)) return true\n  if (suffix.startsWith(\"[\")) return true\n  return false\n}\n\n// Mirrors Rust's `suffix.chars().all(|c| c.is_ascii_digit())`, which is\n// vacuously `true` for an empty string — preserved for exact parity.\nfunction isAsciiDigits(s: string): boolean {\n  if (s.length === 0) return true\n  for (let i = 0; i < s.length; i++) {\n    const code = s.charCodeAt(i)\n    if (code < 48 || code > 57) return false\n  }\n  return true\n}\n\n// Mirrors `s.parse::<u32>().is_ok()` for the plain non-negative integer\n// suffixes this algorithm actually sees (border/ring widths etc.).\nfunction isU32(s: string): boolean {\n  return s.length > 0 && /^[0-9]+$/.test(s)\n}\n\nconst DISPLAY_VALUES = new Set([\n  \"block\", \"inline-block\", \"inline\", \"flex\", \"inline-flex\", \"grid\", \"inline-grid\",\n  \"table\", \"inline-table\", \"table-row\", \"table-cell\", \"table-column\", \"table-caption\",\n  \"contents\", \"list-item\", \"hidden\", \"flow-root\",\n])\nconst POSITION_VALUES = new Set([\"static\", \"relative\", \"absolute\", \"fixed\", \"sticky\"])\nconst FONT_WEIGHT_NAMES = new Set([\n  \"thin\", \"extralight\", \"light\", \"normal\", \"medium\", \"semibold\", \"bold\", \"extrabold\", \"black\",\n])\nconst TEXT_ALIGN_VALUES = new Set([\"left\", \"center\", \"right\", \"justify\", \"start\", \"end\"])\nconst BORDER_SIDE_PREFIXES = [\"t-\", \"r-\", \"b-\", \"l-\", \"x-\", \"y-\", \"s-\", \"e-\"]\nconst BORDER_STYLE_VALUES = new Set([\"solid\", \"dashed\", \"dotted\", \"double\", \"hidden\", \"none\"])\n\n/**\n * Conflict group untuk base Tailwind class (variant prefix sudah di-strip).\n * Jika `prefix` diberikan (e.g. \"tw-\"), strip dari `base` sebelum lookup.\n * `null` = class tidak pernah konflik (e.g. `sr-only`).\n *\n * Mirrors `conflict_group_with_prefix()` in tw_merge.rs — keep both in sync.\n */\nexport function conflictGroup(base: string, prefix = \"\"): string | null {\n  // Strip custom Tailwind prefix sebelum matching conflict groups.\n  // \"tw-bg-red-500\" dengan prefix \"tw-\" → base menjadi \"bg-red-500\"\n  const b = prefix && base.startsWith(prefix) ? base.slice(prefix.length) : base\n  // Arbitrary value — everything before the first `[` is the group.\n  const bracket = b.indexOf(\"[\")\n  if (bracket !== -1) {\n    const grp = b.slice(0, bracket).replace(/-+$/, \"\")\n    return grp.length > 0 ? grp : \"arbitrary\"\n  }\n\n  if (DISPLAY_VALUES.has(b)) return \"display\"\n  if (POSITION_VALUES.has(b)) return \"position\"\n\n  if (b.startsWith(\"overflow-x-\")) return \"overflow-x\"\n  if (b.startsWith(\"overflow-y-\")) return \"overflow-y\"\n  if (b.startsWith(\"overflow-\")) return \"overflow\"\n\n  if (b.startsWith(\"flex-\")) return \"flex\"\n  if (b.startsWith(\"grid-cols-\")) return \"grid-cols\"\n  if (b.startsWith(\"grid-rows-\")) return \"grid-rows\"\n  if (b.startsWith(\"grid-flow-\")) return \"grid-flow\"\n  if (b.startsWith(\"col-\")) return \"col\"\n  if (b.startsWith(\"row-\")) return \"row\"\n  if (b === \"grow\" || b.startsWith(\"grow-\")) return \"grow\"\n  if (b === \"shrink\" || b.startsWith(\"shrink-\")) return \"shrink\"\n\n  if (b.startsWith(\"gap-x-\")) return \"gap-x\"\n  if (b.startsWith(\"gap-y-\")) return \"gap-y\"\n  if (b.startsWith(\"gap-\")) return \"gap\"\n\n  if (b.startsWith(\"justify-items-\")) return \"justify-items\"\n  if (b.startsWith(\"justify-self-\")) return \"justify-self\"\n  if (b.startsWith(\"justify-\")) return \"justify\"\n  if (b.startsWith(\"items-\")) return \"items\"\n  if (b.startsWith(\"self-\")) return \"self\"\n  if (b.startsWith(\"place-content-\")) return \"place-content\"\n  if (b.startsWith(\"place-items-\")) return \"place-items\"\n  if (b.startsWith(\"place-self-\")) return \"place-self\"\n  if (b.startsWith(\"content-\")) return \"content\"\n\n  if (b.startsWith(\"px-\")) return \"px\"\n  if (b.startsWith(\"py-\")) return \"py\"\n  if (b.startsWith(\"pt-\")) return \"pt\"\n  if (b.startsWith(\"pr-\")) return \"pr\"\n  if (b.startsWith(\"pb-\")) return \"pb\"\n  if (b.startsWith(\"pl-\")) return \"pl\"\n  if (b.startsWith(\"ps-\")) return \"ps\"\n  if (b.startsWith(\"pe-\")) return \"pe\"\n  if (b.startsWith(\"p-\")) return \"p\"\n\n  if (b.startsWith(\"mx-\")) return \"mx\"\n  if (b.startsWith(\"my-\")) return \"my\"\n  if (b.startsWith(\"mt-\")) return \"mt\"\n  if (b.startsWith(\"mr-\")) return \"mr\"\n  if (b.startsWith(\"mb-\")) return \"mb\"\n  if (b.startsWith(\"ml-\")) return \"ml\"\n  if (b.startsWith(\"ms-\")) return \"ms\"\n  if (b.startsWith(\"me-\")) return \"me\"\n  if (b === \"-m\" || b.startsWith(\"m-\") || b.startsWith(\"-m-\")) return \"m\"\n\n  if (b.startsWith(\"space-x-\")) return \"space-x\"\n  if (b.startsWith(\"space-y-\")) return \"space-y\"\n\n  if (b.startsWith(\"size-\")) return \"size\"\n  if (b.startsWith(\"min-w-\")) return \"min-w\"\n  if (b.startsWith(\"max-w-\")) return \"max-w\"\n  if (b.startsWith(\"w-\")) return \"w\"\n  if (b.startsWith(\"min-h-\")) return \"min-h\"\n  if (b.startsWith(\"max-h-\")) return \"max-h\"\n  if (b.startsWith(\"h-\")) return \"h\"\n\n  if (b.startsWith(\"inset-x-\")) return \"inset-x\"\n  if (b.startsWith(\"inset-y-\")) return \"inset-y\"\n  if (b.startsWith(\"inset-\")) return \"inset\"\n  if (b.startsWith(\"top-\")) return \"top\"\n  if (b.startsWith(\"right-\") || b.startsWith(\"end-\")) return \"right\"\n  if (b.startsWith(\"bottom-\")) return \"bottom\"\n  if (b.startsWith(\"left-\") || b.startsWith(\"start-\")) return \"left\"\n\n  if (b.startsWith(\"z-\")) return \"z\"\n  if (b.startsWith(\"opacity-\")) return \"opacity\"\n\n  if (b.startsWith(\"bg-\")) {\n    if (b.startsWith(\"bg-opacity-\")) return \"bg-opacity\"\n    return \"bg\"\n  }\n  if (b.startsWith(\"from-\")) return \"from\"\n  if (b.startsWith(\"via-\")) return \"via\"\n  if (b.startsWith(\"to-\")) return \"to\"\n\n  if (b.startsWith(\"text-\")) {\n    const suffix = b.slice(\"text-\".length)\n    if (isTextSize(suffix)) return \"text-size\"\n    if (suffix.startsWith(\"opacity-\")) return \"text-opacity\"\n    if (TEXT_ALIGN_VALUES.has(suffix)) return \"text-align\"\n    return \"text-color\"\n  }\n\n  if (b.startsWith(\"font-\")) {\n    const suffix = b.slice(\"font-\".length)\n    if (FONT_WEIGHT_NAMES.has(suffix) || isAsciiDigits(suffix)) return \"font-weight\"\n    return \"font-family\"\n  }\n\n  if (b.startsWith(\"leading-\")) return \"leading\"\n  if (b.startsWith(\"tracking-\")) return \"tracking\"\n\n  if (b.startsWith(\"border-\")) {\n    const suffix = b.slice(\"border-\".length)\n    const sidePrefix = BORDER_SIDE_PREFIXES.find((p) => suffix.startsWith(p))\n    if (sidePrefix) {\n      const side = suffix.slice(0, 1)\n      const rest = suffix.slice(2)\n      if (isU32(rest) || rest.length === 0) return `border-${side}-width`\n      return `border-${side}-color`\n    }\n    if (isU32(suffix) || suffix.length === 0) return \"border-width\"\n    if (suffix.startsWith(\"opacity-\")) return \"border-opacity\"\n    if (suffix === \"collapse\" || suffix === \"separate\") return \"border-collapse\"\n    if (BORDER_STYLE_VALUES.has(suffix)) return \"border-style\"\n    return \"border-color\"\n  }\n  if (b === \"border\") return \"border-width\"\n\n  if (b.startsWith(\"outline-\")) return \"outline\"\n  if (b === \"outline\") return \"outline\"\n\n  if (\n    b.startsWith(\"rounded-t\") ||\n    b.startsWith(\"rounded-r\") ||\n    b.startsWith(\"rounded-b\") ||\n    b.startsWith(\"rounded-l\") ||\n    b.startsWith(\"rounded-s\") ||\n    b.startsWith(\"rounded-e\")\n  ) {\n    const firstChar = b.slice(\"rounded-\".length).charAt(0) || \"x\"\n    return `rounded-${firstChar}`\n  }\n  if (b === \"rounded\" || b.startsWith(\"rounded-\")) return \"rounded\"\n\n  if (b === \"shadow\" || b.startsWith(\"shadow-\")) return \"shadow\"\n\n  // See file header re: `ring-offset-*` — only one group is reachable.\n  if (b.startsWith(\"ring-offset-\")) return \"ring-offset\"\n  if (b === \"ring\") return \"ring-width\"\n  if (b.startsWith(\"ring-\")) {\n    const rest = b.slice(\"ring-\".length)\n    const isWidth =\n      rest === \"0\" || rest === \"1\" || rest === \"2\" || rest === \"4\" || rest === \"8\" ||\n      /^-?\\d+(\\.\\d+)?$/.test(rest) ||\n      (rest.startsWith(\"[\") && rest.endsWith(\"]\"))\n    if (isWidth) return \"ring-width\"\n    if (rest === \"inset\") return \"ring-inset\"\n    return \"ring-color\"\n  }\n\n  if (b.startsWith(\"rotate-\")) return \"rotate\"\n  if (b.startsWith(\"scale-x-\")) return \"scale-x\"\n  if (b.startsWith(\"scale-y-\")) return \"scale-y\"\n  if (b.startsWith(\"scale-\")) return \"scale\"\n  if (b.startsWith(\"translate-x-\")) return \"translate-x\"\n  if (b.startsWith(\"translate-y-\")) return \"translate-y\"\n  if (b.startsWith(\"skew-x-\")) return \"skew-x\"\n  if (b.startsWith(\"skew-y-\")) return \"skew-y\"\n\n  if (b === \"transition\" || b.startsWith(\"transition-\")) return \"transition\"\n  if (b.startsWith(\"duration-\")) return \"duration\"\n  if (b.startsWith(\"ease-\")) return \"ease\"\n  if (b.startsWith(\"delay-\")) return \"delay\"\n\n  if (b === \"animate\" || b.startsWith(\"animate-\")) return \"animate\"\n  if (b.startsWith(\"cursor-\")) return \"cursor\"\n  if (b.startsWith(\"pointer-events-\")) return \"pointer-events\"\n  if (b.startsWith(\"select-\")) return \"select\"\n\n  if (b === \"visible\" || b === \"invisible\" || b === \"collapse\") return \"visibility\"\n\n  if (b.startsWith(\"object-\")) return \"object\"\n  if (b.startsWith(\"aspect-\")) return \"aspect\"\n  if (b.startsWith(\"order-\")) return \"order\"\n  if (b.startsWith(\"whitespace-\")) return \"whitespace\"\n  if (b.startsWith(\"list-\")) return \"list\"\n  if (b.startsWith(\"fill-\")) return \"fill\"\n  if (b.startsWith(\"stroke-\")) return \"stroke\"\n\n  if (b.startsWith(\"backdrop-\")) {\n    const rest = b.slice(\"backdrop-\".length)\n    const seg = rest.split(\"-\")[0] || \"x\"\n    return `backdrop-${seg}`\n  }\n\n  if (b.startsWith(\"scroll-\")) return \"scroll\"\n  if (b.startsWith(\"snap-\")) return \"snap\"\n  if (b.startsWith(\"touch-\")) return \"touch\"\n  if (b.startsWith(\"decoration-\")) return \"text-decoration\"\n  if (b.startsWith(\"caret-\")) return \"caret\"\n  if (b.startsWith(\"accent-\")) return \"accent\"\n  if (b.startsWith(\"appearance-\")) return \"appearance\"\n\n  if (b === \"isolate\" || b === \"isolation-auto\") return \"isolation\"\n\n  if (b.startsWith(\"mix-blend-\")) return \"mix-blend\"\n  if (b.startsWith(\"bg-blend-\")) return \"bg-blend\"\n\n  if (b.startsWith(\"float-\")) return \"float\"\n  if (b.startsWith(\"clear-\")) return \"clear\"\n  if (b.startsWith(\"break-\")) return \"break\"\n  if (b.startsWith(\"columns-\")) return \"columns\"\n\n  // No known conflict group → class is always kept as-is.\n  return null\n}\n\n/**\n * Splits `hover:dark:bg-red-500` into `[\"hover:dark:\", \"bg-red-500\"]`.\n * Tracks `[...]` bracket depth so a `:` inside an arbitrary value (e.g.\n * `[mask-type:luminance]`) isn't mistaken for a variant separator.\n *\n * Mirrors `split_variants()` in tw_merge.rs — keep both in sync.\n */\nexport function splitVariants(klass: string): [variants: string, base: string] {\n  let depth = 0\n  let lastColon = 0 // index AFTER the last top-level ':'; 0 = none found\n  for (let i = 0; i < klass.length; i++) {\n    const ch = klass.charCodeAt(i)\n    if (ch === 91 /* [ */) depth++\n    else if (ch === 93 /* ] */) depth = depth > 0 ? depth - 1 : 0\n    else if (ch === 58 /* : */ && depth === 0) lastColon = i + 1\n  }\n  if (lastColon === 0) return [\"\", klass]\n  return [klass.slice(0, lastColon), klass.slice(lastColon)]\n}\n\n/**\n * Conflict-aware merge of a single space-separated class string — last class\n * wins per `{variants}::{conflictGroup}` key, original order otherwise kept.\n *\n * Mirrors `merge_class_string_with_prefix()` in tw_merge.rs — keep both in sync.\n */\nexport function mergeClassStringJs(input: string, prefix = \"\"): string {\n  const tokens = input.split(/\\s+/).filter(Boolean)\n  if (tokens.length === 0) return \"\"\n  if (tokens.length === 1) return tokens[0]\n\n  const groupOwner = new Map<string, number>()\n  const slots: Array<string | null> = []\n\n  for (const token of tokens) {\n    const [variants, base] = splitVariants(token)\n    const group = conflictGroup(base, prefix)\n    if (group !== null) {\n      const key = `${variants}::${group}`\n      const prevIdx = groupOwner.get(key)\n      if (prevIdx !== undefined) slots[prevIdx] = null\n      groupOwner.set(key, slots.length)\n      slots.push(token)\n    } else {\n      slots.push(token)\n    }\n  }\n\n  return slots.filter((s): s is string => s !== null).join(\" \")\n}\n\n/**\n * Browser-side equivalent of the native `twMergeRaw` / `twMergeRawWithOptions` NAPI export.\n * Mirrors `tw_merge_raw_with_options()` in tw_merge.rs — keep both in sync.\n */\nexport function twMergeRawJs(classLists: string[], prefix = \"\"): string {\n  const joined = classLists\n    .map((s) => s.trim())\n    .filter((s) => s.length > 0)\n    .join(\" \")\n  if (joined.length === 0) return \"\"\n  return mergeClassStringJs(joined, prefix)\n}","/**\n * tailwind-styled-v4 — cv()\n *\n * Runtime: native-first with fallback to generated variant tables.\n *\n * Dua mode:\n * 1. GENERATED (optimal) — import dari variants.generated.ts hasil `npx tw compile-variants`\n *    → O(1) lookup, static, zero runtime computation\n * 2. RUNTIME (fallback) — compute on-the-fly via native binding\n *    → Requires native Rust binding for variant resolution\n */\n\nimport { twMerge } from \"./merge\"\nimport type { ComponentConfig, CvFn, InferVariantProps } from \"./types\"\nimport { getNativeBinding } from \"./native\"\n\n// Registry untuk generated lookup tables\n// Diisi oleh cv.register() dari generated file\nconst __generatedRegistry: Record<string, Record<string, string>> = {}\n\n/**\n * Register pre-computed variant table dari generated file.\n * Dipanggil otomatis saat import variants.generated.ts\n */\nexport function registerVariantTable(\n  componentId: string,\n  table: Record<string, string>\n): void {\n  __generatedRegistry[componentId] = table\n}\n\n// Cache untuk sorted variant keys per componentId — sort() hanya dilakukan sekali\n// per componentId karena variantKeys tidak berubah selama runtime\nconst _sortedVariantKeysCache = new Map<string, string[]>()\n\nfunction lookupGenerated(\n  componentId: string,\n  props: Record<string, unknown>,\n  defaultVariants?: Record<string, string>,\n  variantKeys?: string[]\n): string | undefined {\n  const table = __generatedRegistry[componentId]\n  if (!table) return undefined\n\n  const merged = { ...defaultVariants, ...props }\n\n  // Cached sorted keys — sort() hanya dilakukan sekali per componentId\n  let sortedKeys = _sortedVariantKeysCache.get(componentId)\n  if (!sortedKeys) {\n    const keysToUse = variantKeys\n      ? variantKeys\n      : Object.keys(merged).filter((k) => k !== \"className\")\n    sortedKeys = [...keysToUse].sort()\n    _sortedVariantKeysCache.set(componentId, sortedKeys)\n  }\n\n  // buildVariantLookupKey di Rust — satu NAPI call, eliminasi JS string concat loop\n  const binding = getNativeBinding()\n  if (!binding?.buildVariantLookupKey) {\n    // JS fallback: build lookup key secara manual (format identik dengan Rust output)\n    const parts: string[] = []\n    for (const k of sortedKeys) {\n      const v =\n        (props as Record<string, unknown>)[k] ??\n        defaultVariants?.[k]\n      if (v != null) parts.push(`${k}:${String(v)}`)\n    }\n    const key = parts.join(\"|\")\n    return table[key]\n  }\n  const relevantDefaults: Record<string, string> = {}\n  const relevantProps: Record<string, string> = {}\n  for (const k of sortedKeys) {\n    const dv = defaultVariants?.[k]\n    if (dv !== undefined) relevantDefaults[k] = String(dv)\n    const pv = (props as Record<string, unknown>)[k]\n    if (pv !== undefined && pv !== null) relevantProps[k] = String(pv)\n  }\n  const key = binding.buildVariantLookupKey(\n    JSON.stringify(relevantDefaults),\n    JSON.stringify(relevantProps)\n  )\n  return table[key]\n}\n\n// Cache config JSON per config object reference — menghindari JSON.stringify ulang\n// untuk config yang sama. WeakMap dipakai agar GC bisa collect config jika\n// komponen di-unmount (tidak ada strong reference leak).\nconst _configJsonCache = new WeakMap<object, string>()\n\nfunction _getConfigJson(config: object): string {\n  let json = _configJsonCache.get(config)\n  if (!json) {\n    // Convert TypeScript camelCase field names to Rust snake_case\n    const cfgObj = (config as unknown as Record<string, unknown>)\n    const cfgStr = JSON.stringify(cfgObj)\n    const parsed = JSON.parse(cfgStr) as Record<string, unknown>\n\n    // Rename defaultVariants to default_variants for Rust compatibility\n    if ('defaultVariants' in parsed && !('default_variants' in parsed)) {\n      parsed.default_variants = parsed.defaultVariants\n      delete parsed.defaultVariants\n    }\n\n    // Rename compoundVariants to compound_variants. The Rust VariantConfig has\n    // no serde alias for this field (unlike default_variants), so without the\n    // rename Rust silently falls back to an empty vec and drops every compound.\n    if ('compoundVariants' in parsed && !('compound_variants' in parsed)) {\n      parsed.compound_variants = parsed.compoundVariants\n      delete parsed.compoundVariants\n    }\n\n    // Rust requires a `variants` field (it is not #[serde(default)]); a base-only\n    // or compound-only config omits it, which makes deserialization fail.\n    if (!('variants' in parsed) || parsed.variants == null) {\n      parsed.variants = {}\n    }\n\n    json = JSON.stringify(parsed)\n    _configJsonCache.set(config, json)\n  }\n  return json\n}\n\n// Native Rust variant resolution — dengan JS fallback untuk browser\nfunction resolveVariantsNative<C extends ComponentConfig>(\n  config: C,\n  props: InferVariantProps<C> & { className?: string } & Readonly<Record<string, unknown>>\n): string {\n  const { variants = {}, defaultVariants = {} } = config\n\n  const binding = getNativeBinding()\n\n  // Browser / no-native fallback: resolve variants secara JS murni\n  // Ini dipakai saat native binding tidak tersedia (browser bundle, test env, dll).\n  // Output identik dengan Rust resolver — defaults di-override oleh props.\n  if (!binding?.resolveVariants) {\n    const variantKeys = Object.keys(variants as Record<string, Record<string, string>>)\n    const classes: string[] = []\n\n    // Base classes sudah di-handle di createComponent — tidak diulang di sini\n\n    // Resolve setiap variant: pakai props kalau ada, fallback ke defaultVariants\n    for (const key of variantKeys) {\n      const value =\n        (props as Record<string, unknown>)[key] ??\n        (defaultVariants as Record<string, string>)[key]\n      if (value != null) {\n        const variantClass = (variants as Record<string, Record<string, string>>)[key]?.[String(value)]\n        if (variantClass) classes.push(variantClass)\n      }\n    }\n\n    // Compound variants\n    if (config.compoundVariants) {\n      for (const compound of config.compoundVariants) {\n        const { class: compoundClass, ...conditions } = compound as { class: string;[key: string]: string }\n        const resolved: Record<string, string> = {}\n        for (const key of variantKeys) {\n          resolved[key] = String(\n            (props as Record<string, unknown>)[key] ??\n            (defaultVariants as Record<string, string>)[key] ?? \"\"\n          )\n        }\n        const matches = Object.entries(conditions).every(\n          ([k, v]) => resolved[k] === v\n        )\n        if (matches) classes.push(compoundClass)\n      }\n    }\n\n    return classes.join(\" \")\n  }\n\n  const variantKeys = Object.keys(variants as Record<string, Record<string, string>>)\n  const configJson = _getConfigJson(config as object)\n  const cleanProps: Record<string, string> = {}\n  for (const k of variantKeys) {\n    const dv = (defaultVariants as Record<string, string>)[k]\n    if (dv !== undefined && dv !== null) cleanProps[k] = String(dv)\n  }\n  for (const k of variantKeys) {\n    const v = (props as Record<string, unknown>)[k]\n    if (v !== undefined && v !== null) cleanProps[k] = String(v)\n  }\n  const propsJson = JSON.stringify(cleanProps)\n  const result = binding.resolveVariants(configJson, propsJson)\n  // NAPI returns VariantResult object with .classes property\n  return (result as unknown as { classes: string }).classes\n}\n\nexport function cv<C extends ComponentConfig>(config: C, componentId?: string): CvFn<C> {\n  if (process.env.NODE_ENV !== \"production\") {\n    const { variants = {}, defaultVariants = {} } = config\n    for (const dk of Object.keys(defaultVariants)) {\n      if (!(dk in variants)) {\n        console.warn(`[tailwind-styled] defaultVariants[\"${dk}\"] not in variants`)\n      }\n    }\n  }\n\n  // Convert boolean values to strings for internal use\n  const stringifiedDefaults: Record<string, string> = {}\n  if (config.defaultVariants) {\n    for (const [k, v] of Object.entries(config.defaultVariants)) {\n      stringifiedDefaults[k] = String(v)\n    }\n  }\n\n  return ((\n    props: InferVariantProps<C> & { className?: string } & Readonly<Record<string, unknown>> = {} as never\n  ): string => {\n    let result: string\n    const variantKeys = Object.keys(config.variants ?? {})\n\n    // Mode 1: generated lookup table (O(1), hasil compile-variants)\n    if (componentId) {\n      const generated = lookupGenerated(\n        componentId,\n        props as Record<string, unknown>,\n        stringifiedDefaults,\n        variantKeys\n      )\n      result = generated ?? resolveVariantsNative(config, props)\n    } else {\n      // Mode 2: runtime resolution via native binding\n      result = resolveVariantsNative(config, props)\n    }\n\n    return props.className ? twMerge(result, props.className) : result\n  }) as CvFn<C>\n}\n\nexport interface VariantValidationError {\n  type: \"unknown_key\" | \"unknown_value\" | \"missing_default\" | \"compound_condition_missing\"\n  key: string\n  value?: string\n  message: string\n}\n\nexport interface VariantValidationResult {\n  valid: boolean\n  errors: VariantValidationError[]\n  warnings: string[]\n}\n\nexport function validateVariantConfig(config: ComponentConfig): VariantValidationResult {\n  const native = getNativeBinding()\n  if (!native?.validateVariantConfig) {\n    throw new Error(\"FATAL: Native binding 'validateVariantConfig' is required but not available.\")\n  }\n\n  const result = native.validateVariantConfig(JSON.stringify(config))\n\n  // Native mengembalikan `errorType` (snake_case asal Rust di-camelCase oleh napi-rs).\n  // Public API cv.ts pakai `type` — di-map di sini agar contract lama tidak berubah\n  // untuk consumer yang sudah destructure `.errors[i].type`.\n  return {\n    valid: result.valid,\n    errors: result.errors.map((e) => ({\n      type: e.errorType as VariantValidationError[\"type\"],\n      key: e.key,\n      value: e.value,\n      message: e.message,\n    })),\n    warnings: result.warnings,\n  }\n}"],"mappings":"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","names":["path","fs","path","fileURLToPath","createRequire","_require","createRequire","fileURLToPath","isBrowser","path","twMerge","cv"]}