tailwind-styled-v4 5.1.25 → 5.1.27

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.
@@ -1 +1 @@
1
- {"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 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 config.defaultVariants as Record<string, string>,\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 }\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"]}
1
+ {"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"]}