rnwind 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/lib/cjs/core/parser/color.cjs +53 -24
  2. package/lib/cjs/core/parser/color.cjs.map +1 -1
  3. package/lib/cjs/core/parser/layout-dispatcher.cjs +20 -0
  4. package/lib/cjs/core/parser/layout-dispatcher.cjs.map +1 -1
  5. package/lib/cjs/core/parser/length.cjs +20 -6
  6. package/lib/cjs/core/parser/length.cjs.map +1 -1
  7. package/lib/cjs/core/parser/length.d.ts +6 -3
  8. package/lib/cjs/core/parser/shorthand.cjs +37 -5
  9. package/lib/cjs/core/parser/shorthand.cjs.map +1 -1
  10. package/lib/cjs/core/parser/shorthand.d.ts +11 -5
  11. package/lib/cjs/core/parser/theme-vars.cjs +53 -0
  12. package/lib/cjs/core/parser/theme-vars.cjs.map +1 -1
  13. package/lib/cjs/core/parser/theme-vars.d.ts +21 -0
  14. package/lib/cjs/core/parser/tokens.cjs +183 -1
  15. package/lib/cjs/core/parser/tokens.cjs.map +1 -1
  16. package/lib/cjs/core/parser/tw-parser.cjs +140 -27
  17. package/lib/cjs/core/parser/tw-parser.cjs.map +1 -1
  18. package/lib/cjs/core/parser/tw-parser.d.ts +21 -5
  19. package/lib/cjs/core/parser/typography-dispatcher.cjs +16 -1
  20. package/lib/cjs/core/parser/typography-dispatcher.cjs.map +1 -1
  21. package/lib/cjs/core/style-builder/build-style.cjs +73 -26
  22. package/lib/cjs/core/style-builder/build-style.cjs.map +1 -1
  23. package/lib/cjs/metro/css-imports.cjs +81 -0
  24. package/lib/cjs/metro/css-imports.cjs.map +1 -0
  25. package/lib/cjs/metro/css-imports.d.ts +8 -0
  26. package/lib/cjs/metro/state.cjs +60 -10
  27. package/lib/cjs/metro/state.cjs.map +1 -1
  28. package/lib/cjs/metro/state.d.ts +17 -1
  29. package/lib/cjs/metro/transform-ast.cjs +238 -21
  30. package/lib/cjs/metro/transform-ast.cjs.map +1 -1
  31. package/lib/cjs/metro/transform-ast.d.ts +15 -0
  32. package/lib/cjs/metro/transformer.cjs +29 -2
  33. package/lib/cjs/metro/transformer.cjs.map +1 -1
  34. package/lib/cjs/metro/with-config.cjs +1 -1
  35. package/lib/cjs/metro/with-config.cjs.map +1 -1
  36. package/lib/cjs/metro/with-config.d.ts +22 -0
  37. package/lib/esm/core/parser/color.mjs +53 -24
  38. package/lib/esm/core/parser/color.mjs.map +1 -1
  39. package/lib/esm/core/parser/layout-dispatcher.mjs +20 -0
  40. package/lib/esm/core/parser/layout-dispatcher.mjs.map +1 -1
  41. package/lib/esm/core/parser/length.d.ts +6 -3
  42. package/lib/esm/core/parser/length.mjs +20 -6
  43. package/lib/esm/core/parser/length.mjs.map +1 -1
  44. package/lib/esm/core/parser/shorthand.d.ts +11 -5
  45. package/lib/esm/core/parser/shorthand.mjs +37 -5
  46. package/lib/esm/core/parser/shorthand.mjs.map +1 -1
  47. package/lib/esm/core/parser/theme-vars.d.ts +21 -0
  48. package/lib/esm/core/parser/theme-vars.mjs +53 -1
  49. package/lib/esm/core/parser/theme-vars.mjs.map +1 -1
  50. package/lib/esm/core/parser/tokens.mjs +183 -1
  51. package/lib/esm/core/parser/tokens.mjs.map +1 -1
  52. package/lib/esm/core/parser/tw-parser.d.ts +21 -5
  53. package/lib/esm/core/parser/tw-parser.mjs +141 -28
  54. package/lib/esm/core/parser/tw-parser.mjs.map +1 -1
  55. package/lib/esm/core/parser/typography-dispatcher.mjs +16 -1
  56. package/lib/esm/core/parser/typography-dispatcher.mjs.map +1 -1
  57. package/lib/esm/core/style-builder/build-style.mjs +73 -26
  58. package/lib/esm/core/style-builder/build-style.mjs.map +1 -1
  59. package/lib/esm/metro/css-imports.d.ts +8 -0
  60. package/lib/esm/metro/css-imports.mjs +79 -0
  61. package/lib/esm/metro/css-imports.mjs.map +1 -0
  62. package/lib/esm/metro/state.d.ts +17 -1
  63. package/lib/esm/metro/state.mjs +60 -12
  64. package/lib/esm/metro/state.mjs.map +1 -1
  65. package/lib/esm/metro/transform-ast.d.ts +15 -0
  66. package/lib/esm/metro/transform-ast.mjs +238 -21
  67. package/lib/esm/metro/transform-ast.mjs.map +1 -1
  68. package/lib/esm/metro/transformer.mjs +30 -3
  69. package/lib/esm/metro/transformer.mjs.map +1 -1
  70. package/lib/esm/metro/with-config.d.ts +22 -0
  71. package/lib/esm/metro/with-config.mjs +1 -1
  72. package/lib/esm/metro/with-config.mjs.map +1 -1
  73. package/package.json +2 -1
  74. package/src/core/parser/color.ts +52 -18
  75. package/src/core/parser/layout-dispatcher.ts +19 -0
  76. package/src/core/parser/length.ts +20 -6
  77. package/src/core/parser/shorthand.ts +35 -5
  78. package/src/core/parser/theme-vars.ts +53 -0
  79. package/src/core/parser/tokens.ts +171 -1
  80. package/src/core/parser/tw-parser.ts +147 -28
  81. package/src/core/parser/typography-dispatcher.ts +15 -1
  82. package/src/core/style-builder/build-style.ts +84 -26
  83. package/src/metro/css-imports.ts +75 -0
  84. package/src/metro/state.ts +58 -10
  85. package/src/metro/transform-ast.ts +249 -18
  86. package/src/metro/transformer.ts +28 -3
  87. package/src/metro/with-config.ts +23 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tw-parser.mjs","sources":["../../../../../src/core/parser/tw-parser.ts"],"sourcesContent":["import { compile } from '@tailwindcss/node'\nimport { Scanner, type SourceEntry } from '@tailwindcss/oxide'\nimport { formatHex as culoriFormatHex } from 'culori'\nimport { Features, transform, type TransformOptions } from 'lightningcss'\nimport { declarationToRnEntries } from './declaration'\nimport { detectGradientAtom, type GradientAtomInfo } from './gradient'\nimport { detectHapticAtom, type HapticRequest } from './haptics'\nimport { keyframeSelectorOffset, keyframesName, pickAnimationName } from './keyframes'\nimport { serializeInitialValue } from './property'\nimport { classNameFromSelector } from './selector'\nimport { BASE_SCHEME, compileReadyTheme, extractSchemeAliases, extractThemeVars, type ThemeSchemeTable } from './theme-vars'\nimport { serializeTokens } from './tokens'\nimport type { RNStyle } from './types'\nimport type { Declaration as LcDeclaration, TokenOrValue } from 'lightningcss'\n\n/**\n * Inferred compiler type. `@tailwindcss/node` doesn't export its\n * compiler shape as a named type, so we pull it off the `compile()`\n * return to stay resilient to minor upstream shape shifts.\n */\ntype TailwindCompiler = Awaited<ReturnType<typeof compile>>\n\n/**\n * Default LightningCSS transform options for TailwindParser's visitor.\n * Its taken from official Tailwind source:\n * https://github.com/tailwindlabs/tailwindcss/blob/main/packages/%40tailwindcss-node/src/optimize.ts\n */\nconst DEFAULT_TRANSFORM_OPTIONS: Partial<TransformOptions<never>> = {\n drafts: {\n customMedia: true,\n },\n nonStandard: {\n deepSelectorCombinator: true,\n },\n include: Features.Nesting | Features.MediaQueries,\n exclude: Features.LogicalProperties | Features.DirSelector | Features.LightDark,\n targets: {\n // eslint-disable-next-line sonarjs/no-identical-expressions\n safari: (16 << 16) | (4 << 8),\n // eslint-disable-next-line camelcase, sonarjs/no-identical-expressions\n ios_saf: (16 << 16) | (4 << 8),\n firefox: 128 << 16,\n chrome: 111 << 16,\n },\n}\n/** Parser configuration — one instance per Metro session, theme CSS fixed. */\nexport interface TailwindParserConfig {\n /**\n * Theme CSS passed to `@tailwindcss/node`'s compiler. Typically the\n * user's `global.css`. We append `theme(inline)` to the tailwindcss\n * import so Tailwind resolves every `var(--theme-token)` at compile\n * time — that gives lightningcss fully-typed values (integers / rems /\n * colors) instead of unresolved `var()` references.\n */\n themeCss: string\n /**\n * Glob sources the oxide Scanner walks at project-scan time\n * (`parseProject()`). Typically\n * `[{ base: projectRoot, pattern: '**\\/*.{ts,tsx,js,jsx}', negated: false }]`\n * plus negated globs for `node_modules` and the rnwind cache dir.\n *\n * When omitted, the scanner has no sources and `parseProject()`\n * returns an empty result — `parseAtoms()` (per-file, content-driven)\n * still works without sources.\n */\n sources?: readonly SourceEntry[]\n}\n\n/** Per-call inputs — Metro hands us file content + filename; we derive the extension. */\nexport interface ParseOptions {\n content: string\n extension: string\n}\n\n/** One parsed keyframe step — offset plus the RN style at that offset. */\nexport interface KeyframeStep {\n offset: string\n style: RNStyle\n}\n\n/** One parsed `@keyframes` animation block. */\nexport interface KeyframeBlock {\n name: string\n steps: KeyframeStep[]\n}\n\n/** Interactive variant ('active' / 'focus') an `active:`/`focus:` atom carries. */\nexport type InteractiveStateTag = 'active' | 'focus'\n\n/**\n * Per-scheme resolved style for a single utility class. Keys are scheme\n * names declared via `@variant <name>` in the theme CSS (or the synthetic\n * `'base'` scheme for themes without variants). Values are the RN style\n * object under that scheme.\n *\n * The reserved `__state` key is set on `active:` / `focus:` atoms so\n * the build-side style-builder can tag the atom for `precomputeHoist`\n * — which routes interactive atoms into the stated-hoist's 4-state\n * precompute. Standard atoms have no `__state`.\n */\nexport type SchemedStyle = Readonly<Record<string, RNStyle>> & {\n /** Interactive-state gate set by `active:` / `focus:` variants. */\n readonly __state?: InteractiveStateTag\n}\n\n/** Full result of one `parseAtoms` call. */\nexport interface ParsedOutput {\n /** Resolved RN style per utility class, per declared scheme. */\n atoms: Map<string, SchemedStyle>\n /** `@keyframes <name> { ... }` blocks the candidates pulled in. */\n keyframes: Map<string, KeyframeBlock>\n /** `@property --x { initial-value: y }` declared custom-property defaults. */\n propertyDefaults: Map<string, string>\n /**\n * Gradient metadata per atom, for atoms that play a role in a\n * Tailwind v4 gradient (`from-*`, `via-*`, `to-*`, `bg-gradient-to-*`,\n * `bg-linear-to-*`). The transformer reads this map to extract\n * `colors / start / end` props at JSX-rewrite time. Regular non-\n * gradient atoms don't appear here.\n */\n gradientAtoms: Map<string, GradientAtomInfo>\n /**\n * Haptic metadata per atom for classes that emit a\n * `--rnwind-haptic` marker. The transformer reads this map to\n * strip the atom from the className and wire a mount-time or\n * press-time call into the `onHaptics` callback registered on\n * `<SchemeProvider>`.\n */\n hapticAtoms: Map<string, HapticRequest>\n /** Candidates oxide surfaced, in document order. */\n candidates: readonly string[]\n /** Every scheme the theme declares (or `['base']` when there are no `@variant` blocks). */\n schemes: readonly string[]\n /**\n * Responsive breakpoint name → minimum-width threshold (px). Pulled from\n * `--breakpoint-*` tokens in the compiled `:root` block, so both\n * Tailwind defaults (`sm`, `md`, `lg`, `xl`, `2xl`) and any user\n * override (e.g. `--breakpoint-3xl: 120rem`) land here. Used by the\n * style-builder to emit `registerBreakpoints({...})` in the manifest\n * so the runtime can filter `md:*` / `lg:*` atoms based on the\n * provider's `windowWidth`.\n */\n breakpoints: ReadonlyMap<string, number>\n}\n\n/**\n * Parses one source file's Tailwind usage into RN-ready style objects.\n *\n * Pipeline:\n * 1. `@tailwindcss/oxide` Scanner finds every Tailwind candidate.\n * 2. `@tailwindcss/node` compiler emits CSS for those candidates with\n * theme tokens inlined.\n * 3. lightningcss `transform` + typed visitor walks the emitted CSS:\n * - `style` rules → per-class RN-style object.\n * - `@keyframes` rules → per-name step map (Reanimated-ready).\n * - `@property` rules → custom-property initial values.\n *\n * One instance holds one Scanner + one lazily-built compiler so repeated\n * calls share upstream state. Theme CSS is fixed at construction — theme\n * edits require a new parser.\n */\nexport class TailwindParser {\n private readonly scanner: Scanner\n private compiler: TailwindCompiler | undefined\n private readonly themeSchemes: ThemeSchemeTable\n private readonly schemeAliases: ReadonlyMap<string, string>\n /**\n * Memoise `resolveCandidates` results by candidate-list fingerprint.\n * Fast Refresh hits this on every save: oxide's scan is cheap, but\n * the LightningCSS visitor walk over the compiled CSS is ~2ms per\n * file. A file whose `className` literals didn't change returns the\n * SAME candidate set, so the second `parseAtoms` call returns the\n * cached `ParsedOutput` — zero compile, zero visitor walk.\n *\n * Theme CSS changes build a new `TailwindParser` (from\n * `getRnwindState` detecting the hash shift), so this cache is\n * naturally invalidated — no stale-theme values leak through.\n */\n private readonly parseCache = new Map<string, ParsedOutput>()\n\n /**\n * Build a parser bound to a theme CSS source. `@theme` and\n * `@variant` blocks are extracted eagerly into a scheme table the\n * visitor consults when resolving `var(--x)` references.\n * @param config Parser configuration.\n */\n constructor(private readonly config: TailwindParserConfig) {\n this.themeSchemes = extractThemeVars(config.themeCss)\n this.schemeAliases = extractSchemeAliases(config.themeCss)\n this.scanner = new Scanner({ sources: config.sources ? [...config.sources] : [] })\n }\n\n /**\n * Schemes declared by the user — either every `@variant <name>` block\n * found (in declaration order) or just `['base']` for themes without\n * any variants. Used to decide how many per-scheme buckets the\n * per-atom resolver fills. Exposed publicly so Metro integration can\n * hand the names to the `.d.ts` generator without a full parse.\n * @returns Scheme names.\n */\n public get declaredSchemes(): readonly string[] {\n const variants = [...this.themeSchemes.keys()].filter((name) => name !== BASE_SCHEME)\n return variants.length > 0 ? variants : [BASE_SCHEME]\n }\n\n /**\n * Build an effective var table for one scheme — base vars overridden by\n * variant vars. When the scheme IS `'base'` (no variants declared), the\n * base table is returned unchanged.\n * @param scheme Scheme name.\n * @returns Effective var name → value lookup for the scheme.\n */\n private effectiveVars(scheme: string): ReadonlyMap<string, string> {\n const base = this.themeSchemes.get(BASE_SCHEME)\n const variant = scheme === BASE_SCHEME ? undefined : this.themeSchemes.get(scheme)\n if (!variant) return base ?? new Map()\n // eslint-disable-next-line unicorn/no-useless-collection-argument\n const merged = new Map(base ?? [])\n for (const [k, v] of variant) merged.set(k, v)\n return merged\n }\n\n /**\n * Build the Tailwind compiler on first use and cache it. The theme CSS\n * gets a `theme(inline)` modifier on its `@import 'tailwindcss'` so\n * lightningcss sees resolved colors/lengths instead of `var()` refs.\n * @returns Cached compiler instance.\n */\n private async ensureCompiler(): Promise<TailwindCompiler> {\n if (this.compiler) return this.compiler\n const ready = compileReadyTheme(this.config.themeCss, this.themeSchemes)\n try {\n this.compiler = await compile(withInlineTheme(ready), {\n base: process.cwd(),\n onDependency: () => {},\n })\n } catch (error) {\n throw wrapThemeError(error)\n }\n return this.compiler\n }\n\n /**\n * Parse one file's Tailwind usage into the full typed result.\n * @param options Source content + extension.\n * @param options.content Raw source text to scan for Tailwind candidates.\n * @param options.extension File extension (`tsx`, `ts`, `jsx`, `js`) — feeds oxide's tokenizer.\n * @returns RN atoms, keyframes, property defaults, candidates list.\n */\n public async parseAtoms({ content, extension }: ParseOptions): Promise<ParsedOutput> {\n const candidates = this.scanner.getCandidatesWithPositions({ content, extension }).map((c) => c.candidate)\n const fingerprint = fingerprintCandidates(candidates)\n const cached = this.parseCache.get(fingerprint)\n if (cached) return cached\n const result = await this.resolveCandidates(candidates)\n this.parseCache.set(fingerprint, result)\n return result\n }\n\n /**\n * Scan every source file the Scanner was configured to watch via\n * `sources` and resolve the union of candidates in one pass. Used by\n * `UnionBuilder` at Metro startup (and on first worker access) to\n * populate the complete atom registry before ANY per-file transform\n * has run — so scheme files never ship a partial view of the theme.\n *\n * Hot-reload path uses `parseAtoms` for the per-file delta; this one\n * only runs once per parser instance (and whenever the parser is\n * rebuilt due to a theme CSS change).\n * @returns Full RN atoms, keyframes, property defaults for every\n * candidate discovered across the configured sources.\n */\n public async parseProject(): Promise<ParsedOutput> {\n const candidates = this.scanner.scan()\n return this.resolveCandidates(candidates)\n }\n\n /**\n * Compile + typed-visit the given candidate class names. Shared\n * implementation for both `parseAtoms` (single file) and\n * `parseProject` (whole project).\n * @param candidates Class-name candidates the oxide Scanner produced.\n * @returns Fully-typed parser result.\n */\n private async resolveCandidates(candidates: readonly string[]): Promise<ParsedOutput> {\n if (candidates.length === 0) return emptyOutput()\n const compiler = await this.ensureCompiler()\n let css: string\n try {\n css = compiler.build([...candidates])\n } catch (error) {\n throw wrapThemeError(error)\n }\n // `compiler.build(candidates)` memoizes across calls — it returns CSS for\n // every candidate the compiler has EVER seen in this process. To keep\n // parser output pure per-call we restrict outputs to this call's\n // candidates:\n // - atoms: match class selectors against `wanted`.\n // - keyframes: collect `animation-name` references during the style\n // walk, then filter the visited keyframes to referenced names.\n const wanted = new Set(candidates)\n const schemes = this.declaredSchemes\n // Tailwind's compiled CSS contains every theme token — including\n // ones imported from secondary CSS files (e.g. `@import\n // 'rnwind/css'`). Pull them out of the `:root` block so\n // `var(--duration-normal)` style references in unparsed declarations\n // resolve to literal values (`220ms`) instead of being passed through\n // to RN, which can't read CSS custom properties.\n const compiledTheme = extractRootCustomProperties(css)\n const schemeTables = new Map<string, ReadonlyMap<string, string>>()\n for (const scheme of schemes) {\n const merged = new Map(compiledTheme)\n for (const [k, v] of this.effectiveVars(scheme)) merged.set(k, v)\n schemeTables.set(scheme, merged)\n }\n\n const atoms = new Map<string, Record<string, RNStyle>>()\n const keyframes: ParsedOutput['keyframes'] = new Map()\n const referencedKeyframes = new Set<string>()\n const propertyDefaults: ParsedOutput['propertyDefaults'] = new Map()\n const gradientAtoms: ParsedOutput['gradientAtoms'] = new Map()\n const hapticAtoms: ParsedOutput['hapticAtoms'] = new Map()\n const breakpoints = new Map<string, number>()\n const { schemeAliases } = this\n\n try {\n transform({\n ...DEFAULT_TRANSFORM_OPTIONS,\n filename: 'rnwind-virtual.css',\n code: Buffer.from(css),\n visitor: {\n Rule: {\n style(rule) {\n for (const selector of rule.value.selectors) {\n const className = classNameFromSelector(selector)\n if (!className || !wanted.has(className)) continue\n processStyleRule(\n rule.value.declarations.declarations,\n className,\n { schemes, schemeTables, atoms, referencedKeyframes, schemeAliases, breakpoints },\n rule.value.rules ?? [],\n )\n // Gradient atoms are detected per rule: the parser's main\n // RN-style path drops the `--tw-gradient-*` customs as\n // unsupported, but for gradient utilities we want to\n // surface their role + resolved colour so the transformer\n // can rewrite `<LinearGradient className=\"...\">` into\n // `colors={...}` / `start={...}` / `end={...}` props.\n const gradient = detectGradientAtom(rule.value.declarations.declarations)\n if (gradient) gradientAtoms.set(className, gradient)\n // Haptics may live on the rule directly OR inside a\n // nested pseudo (e.g. `&:active` for `active:haptic-*`).\n // Inspect both so `active:haptic-medium` registers.\n const hapticDecls: LcDeclaration[] = [...rule.value.declarations.declarations]\n for (const nested of rule.value.rules ?? []) hapticDecls.push(...collectNestedDecls(nested))\n const haptic = detectHapticAtom(hapticDecls)\n if (haptic) hapticAtoms.set(className, haptic)\n }\n },\n keyframes(rule) {\n const name = keyframesName(rule.value.name)\n if (!name) return\n const steps: KeyframeStep[] = []\n const baseTable = schemeTables.get(BASE_SCHEME) ?? schemeTables.get(schemes[0] ?? BASE_SCHEME)\n for (const frame of rule.value.keyframes) {\n const offset = keyframeSelectorOffset(frame.selectors)\n if (!offset) continue\n const style: RNStyle = {}\n const frameDecls = frame.declarations.declarations ?? []\n for (const decl of frameDecls) {\n for (const [key, value] of declarationToRnEntries(decl, baseTable)) style[key] = value\n }\n steps.push({ offset, style })\n }\n keyframes.set(name, { name, steps })\n },\n property(rule) {\n const initial = serializeInitialValue(rule.value.initialValue)\n if (initial !== null) propertyDefaults.set(rule.value.name, initial)\n },\n },\n },\n })\n } catch (error) {\n throw wrapThemeError(error)\n }\n\n // Prune keyframes to those actually referenced by this call's atoms.\n for (const name of keyframes.keys()) {\n if (!referencedKeyframes.has(name)) keyframes.delete(name)\n }\n\n return { atoms, keyframes, propertyDefaults, gradientAtoms, hapticAtoms, candidates: [...candidates], schemes, breakpoints }\n }\n}\n\n/**\n * Wrap an error from `@tailwindcss/node`'s compiler or `lightningcss`'s\n * transform with a `rnwind:` prefix so the user sees a clear \"this came\n * from your theme CSS\" signal in Metro's stack trace. Preserves the\n * original error as `cause` so downstream tooling (Sentry, Metro\n * symbolication) can still inspect it.\n * @param error Underlying error from the compiler or transform.\n * @returns Prefixed Error with the original attached as `cause`.\n */\nfunction wrapThemeError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error)\n const wrapped = new Error(\n `rnwind: failed to compile theme CSS — ${message}\\n` +\n `Check your global.css for unbalanced braces, unknown @utility / @variant declarations, ` +\n `or unsupported color functions. Run \\`bun run --cwd packages/rnwind code-check\\` if this is the rnwind repo itself.`,\n )\n if (error instanceof Error) (wrapped as { cause?: unknown }).cause = error\n return wrapped\n}\n\n/**\n * Fingerprint a candidate list for `parseCache` lookup. Sorting gives\n * the same key regardless of source order (the set of candidates is\n * what drives `resolveCandidates`'s output, not their order).\n * @param candidates Raw oxide-scanner output for one file.\n * @returns Canonical string key.\n */\nfunction fingerprintCandidates(candidates: readonly string[]): string {\n if (candidates.length === 0) return ''\n if (candidates.length === 1) return candidates[0]!\n return [...candidates].toSorted((a, b) => a.localeCompare(b)).join('\\0')\n}\n\n/**\n * Empty sentinel returned when oxide finds no candidates in the file.\n * @returns Zero-atom result with only the `base` scheme declared.\n */\nfunction emptyOutput(): ParsedOutput {\n return {\n atoms: new Map(),\n keyframes: new Map(),\n propertyDefaults: new Map(),\n gradientAtoms: new Map(),\n hapticAtoms: new Map(),\n candidates: [],\n schemes: [BASE_SCHEME],\n breakpoints: new Map(),\n }\n}\n\n/**\n * Upgrade `@import 'tailwindcss'` (single- or double-quoted, with or\n * without an existing `theme(...)` clause) to `@import 'tailwindcss'\n * theme(inline)`. User-authored `theme(...)` clauses are preserved so\n * overrides win.\n * @param css Theme CSS source.\n * @returns CSS with the Tailwind import upgraded.\n */\nfunction withInlineTheme(css: string): string {\n return css.replaceAll(/(@import\\s+['\"]tailwindcss['\"])(?!\\s*theme\\()/g, '$1 theme(inline)')\n}\n\n/**\n * Collect rule-local custom-property writes (`--tw-translate-x`,\n * `--tw-scale-x`, `--tw-skew-y`, …). Tailwind v4 uses these as\n * composable transform tokens that `translate: var(--tw-translate-x)\n * var(--tw-translate-y)` then references. Surfacing them as theme vars\n * lets the declaration converter resolve the references as if they\n * were declared in `@theme`.\n * @param decls All declarations from one lightningcss style rule.\n * @returns Map from custom-property name (with leading `--`) to its raw value.\n */\nfunction collectRuleLocalVars(decls: readonly { property: string; value: unknown }[]): ReadonlyMap<string, string> {\n const out = new Map<string, string>()\n for (const decl of decls) {\n if (decl.property !== 'custom') continue\n const custom = decl.value as { name: { name: string } | string; value?: readonly TokenOrValue[] }\n const rawName = typeof custom.name === 'string' ? custom.name : custom.name.name\n if (!rawName.startsWith('--tw-')) continue\n if (!custom.value) continue\n const text = serializeTokens(custom.value).trim()\n if (text.length > 0) out.set(rawName, text)\n }\n return out\n}\n\ninterface StyleRuleContext {\n schemes: readonly string[]\n schemeTables: ReadonlyMap<string, ReadonlyMap<string, string>>\n atoms: Map<string, Record<string, RNStyle>>\n referencedKeyframes: Set<string>\n schemeAliases: ReadonlyMap<string, string>\n /**\n * Mutable breakpoint registry — `applyMediaRule` populates this as it\n * walks responsive variant atoms. The driving signal is the `@media\n * (width >= Xrem)` condition on the nested rule. Result lives on\n * {@link ParsedOutput.breakpoints}.\n */\n breakpoints: Map<string, number>\n}\n\n/**\n * Process one matched style rule for a given class name: fold its\n * declarations into the per-scheme buckets, detect referenced keyframes,\n * then apply Tailwind's composable transform post-pass.\n * @param declarations Declarations from one lightningcss style rule.\n * @param className Class name this rule's selectors matched.\n * @param ctx Parser-call-wide context (schemes, tables, output maps).\n * @param nestedRules Nested style rules (Tailwind variant prefixes like `dark:`\n * wrap their decls in `&:where(.<scheme>, .<scheme> *)` nested rules).\n */\nfunction processStyleRule(\n declarations: readonly LcDeclaration[],\n className: string,\n ctx: StyleRuleContext,\n nestedRules: readonly unknown[] = [],\n): void {\n const bucket = ctx.atoms.get(className) ?? {}\n const ruleLocalVars = collectRuleLocalVars(declarations)\n const ruleSchemeTables = mergeRuleVars(ctx.schemeTables, ruleLocalVars)\n // Detect active:/focus: prefix on the class name. Tailwind emits the\n // actual decls inside `&:active { … }` / `&:focus { … }`, and the\n // OUTER rule has zero direct decls — so the existing per-scheme phase\n // below produces an empty bucket. We collect the inner decls into the\n // base scheme and tag the bucket with `__state` so the style-builder\n // can route the atom into `precomputeHoist`'s state buckets when the\n // interactive state.\n const interactiveState = classNameStateOf(className)\n // Phase 1: outer declarations apply to EVERY scheme (unconditional\n // utilities like `opacity-50`).\n for (const decl of declarations) {\n applyDeclarationToBucket(decl, bucket, ctx.schemes, ruleSchemeTables)\n const animationRef = pickAnimationName(decl)\n if (animationRef) ctx.referencedKeyframes.add(animationRef)\n }\n applyComposedTransform(bucket, ctx.schemes, ruleLocalVars)\n applyComposedShadow(bucket, ctx.schemes, ruleLocalVars)\n applyComposedRing(bucket, ctx.schemes, ruleLocalVars)\n // Phase 2: nested rules — three orthogonal flavours, dispatched on\n // the lightningcss node `type`:\n // - `media`: Tailwind v4 responsive variants (`sm:`, `md:`, …) wrap\n // declarations in `@media (width >= Xrem)`. Decls fold into every\n // scheme; the atom's name carries the breakpoint association so\n // the runtime can gate it on `windowWidth`.\n // - `style` + `interactiveState`: `&:active` / `&:focus` pseudo\n // decls (every scheme — interaction is theme-orthogonal).\n // - `style` (default): Tailwind v4 scheme variants\n // (`&:where(.<scheme>, .<scheme> *)`).\n for (const scheme of ctx.schemes) bucket[scheme] = bucket[scheme] ?? {}\n for (const nested of nestedRules) {\n const node = nested as { type?: string }\n if (node?.type === 'media') {\n applyMediaRule(nested, className, bucket, ctx, ruleSchemeTables, ruleLocalVars)\n continue\n }\n if (interactiveState) {\n applyInteractiveNestedRule(nested, bucket, ctx, ruleSchemeTables, ruleLocalVars)\n } else {\n applyNestedSchemeRule(nested, bucket, ctx, ruleSchemeTables, ruleLocalVars)\n }\n }\n normalizeLineHeightToPx(bucket, ctx.schemes)\n if (interactiveState) (bucket as Record<string, unknown>).__state = interactiveState\n ctx.atoms.set(className, bucket)\n}\n\n/** Recognised interactive variant prefixes. RN can drive both at runtime. */\nconst INTERACTIVE_PREFIXES = new Set(['active', 'focus'])\n\n/**\n * Inspect a class name for a leading interactive variant prefix. The\n * Tailwind compiler emits `active:bg-sky-700` literally (backslash-\n * escaped for CSS), and that name is the same string the parser sees.\n * So a cheap `split(':')` on the head is enough — no need to parse the\n * pseudo-class out of the selector itself.\n * @param className Tailwind utility class (e.g. `active:bg-sky-700`).\n * @returns The interactive state prefix (`'active'` / `'focus'`), or null when none.\n */\nfunction classNameStateOf(className: string): 'active' | 'focus' | null {\n const colon = className.indexOf(':')\n if (colon === -1) return null\n const prefix = className.slice(0, colon)\n if (!INTERACTIVE_PREFIXES.has(prefix)) return null\n return prefix as 'active' | 'focus'\n}\n\n/**\n * Pull the `min-width` threshold (px) out of a `@media (width >= Xrem)`\n * lightningcss node. Tailwind v4 emits exactly this shape for every\n * responsive variant — `>= 40rem` for `sm`, `>= 48rem` for `md`, etc.\n * Returns null for any other media condition (`hover`, `prefers-*`,\n * range bounds we don't model) so the caller can skip non-responsive\n * media wrappers without breaking.\n * @param nested A lightningcss `media` rule node.\n * @returns Threshold in px, or null when the condition isn't a simple\n * width-min check.\n */\nfunction readMediaMinWidthPx(nested: unknown): number | null {\n if (typeof nested !== 'object' || nested === null) return null\n const node = nested as { type?: string; value?: { query?: { mediaQueries?: readonly unknown[] } } }\n if (node.type !== 'media') return null\n const queries = node.value?.query?.mediaQueries\n if (queries?.length !== 1) return null\n const query = queries[0] as {\n condition?: {\n type?: string\n value?: {\n type?: string\n name?: string\n operator?: string\n value?: { type?: string; value?: { type?: string; value?: { unit?: string; value?: number } } }\n }\n }\n }\n const {condition} = query\n if (condition?.type !== 'feature') return null\n const feature = condition.value\n if (feature?.type !== 'range' || feature.name !== 'width') return null\n if (feature.operator !== 'greater-than-equal') return null\n const length = feature.value\n if (length?.type !== 'length') return null\n const inner = length.value?.value\n if (!inner || typeof inner.value !== 'number') return null\n if (inner.unit === 'rem') return inner.value * 16\n if (inner.unit === 'px') return inner.value\n return null\n}\n\n/**\n * Pull the leading `prefix:` segment off a className. `md:bg-red-500`\n * → `'md'`. Returns null for atoms without a colon (the common case)\n * or for empty prefixes.\n * @param className Atom name.\n * @returns Prefix or null.\n */\nfunction leadingPrefix(className: string): string | null {\n const colon = className.indexOf(':')\n if (colon <= 0) return null\n return className.slice(0, colon)\n}\n\n/**\n * Fold a Tailwind v4 responsive `@media (width >= Xrem)` nested rule\n * into every scheme's bucket and record the breakpoint threshold\n * (`md` → 768) on the parser-call context. The runtime later gates the\n * atom on `windowWidth` against this threshold via the prefix on the\n * atom's class name.\n *\n * Read directly from the media condition rather than from compiled\n * `--breakpoint-*` `:root` tokens because Tailwind's `theme(inline)`\n * mode strips those — the only authoritative source for the actual\n * thresholds Tailwind generated is the `@media` query itself.\n * @param nested One nested `media` node from `rule.value.rules`.\n * @param className Outer rule's class name (carries the breakpoint prefix).\n * @param bucket Per-scheme style map for the atom.\n * @param ctx Parser-call-wide context.\n * @param ruleSchemeTables Per-scheme var tables (outer rule's merged table).\n * @param ruleLocalVars Outer rule's `--tw-*` vars (inherited for inner decls).\n */\nfunction applyMediaRule(\n nested: unknown,\n className: string,\n bucket: Record<string, RNStyle>,\n ctx: StyleRuleContext,\n ruleSchemeTables: ReadonlyMap<string, ReadonlyMap<string, string>>,\n ruleLocalVars: ReadonlyMap<string, string>,\n): void {\n const decls = collectNestedDecls(nested)\n if (decls.length === 0) return\n const minWidth = readMediaMinWidthPx(nested)\n const prefix = leadingPrefix(className)\n if (minWidth !== null && prefix !== null) ctx.breakpoints.set(prefix, minWidth)\n for (const scheme of ctx.schemes) {\n const table = ruleSchemeTables.get(scheme)\n const schemeBucket = bucket[scheme] ?? {}\n for (const decl of decls) {\n for (const [key, value] of declarationToRnEntries(decl, table)) schemeBucket[key] = value\n const animationRef = pickAnimationName(decl)\n if (animationRef) ctx.referencedKeyframes.add(animationRef)\n }\n const nestedLocalVars = new Map(ruleLocalVars)\n for (const [k, v] of collectRuleLocalVars(decls)) nestedLocalVars.set(k, v)\n applyComposedTransformToScheme(schemeBucket, nestedLocalVars)\n applyComposedShadowToScheme(schemeBucket, nestedLocalVars)\n bucket[scheme] = schemeBucket\n }\n}\n\n/**\n * Fold one nested rule from an interactive (`active:` / `focus:`) atom\n * into every scheme's bucket. The Tailwind output for `active:bg-sky-700`\n * is `.active\\:bg-sky-700 { &:active { background-color: oklch(...) } }`\n * — the outer rule has zero\n * decls; the leaf lives three levels deep through pseudo + media. We\n * unwrap the pseudo and the media shell, take the inner decls, and\n * apply them across every scheme — interactivity is orthogonal to\n * theme. The bucket gets `__state: 'active' | 'focus'` set elsewhere.\n * @param nested One nested-rule node from `rule.value.rules`.\n * @param bucket Per-scheme style map for the atom.\n * @param ctx Parser-call-wide context.\n * @param ruleSchemeTables Per-scheme var tables (outer rule's merged table).\n * @param ruleLocalVars Outer rule's `--tw-*` vars (inherited for inner decls).\n */\nfunction applyInteractiveNestedRule(\n nested: unknown,\n bucket: Record<string, RNStyle>,\n ctx: StyleRuleContext,\n ruleSchemeTables: ReadonlyMap<string, ReadonlyMap<string, string>>,\n ruleLocalVars: ReadonlyMap<string, string>,\n): void {\n const decls = collectNestedDecls(nested)\n if (decls.length === 0) return\n for (const scheme of ctx.schemes) {\n const table = ruleSchemeTables.get(scheme)\n const schemeBucket = bucket[scheme] ?? {}\n for (const decl of decls) {\n for (const [key, value] of declarationToRnEntries(decl, table)) schemeBucket[key] = value\n const animationRef = pickAnimationName(decl)\n if (animationRef) ctx.referencedKeyframes.add(animationRef)\n }\n const nestedLocalVars = new Map(ruleLocalVars)\n for (const [k, v] of collectRuleLocalVars(decls)) nestedLocalVars.set(k, v)\n applyComposedTransformToScheme(schemeBucket, nestedLocalVars)\n applyComposedShadowToScheme(schemeBucket, nestedLocalVars)\n bucket[scheme] = schemeBucket\n }\n}\n\n/**\n * Recursively flatten a nested style/media rule into its leaf\n * declarations. Tailwind wraps interactive pseudo decls in `style`\n * nodes (`&:active`, `&:focus`); the walk unwraps them and any\n * `@media` shell around them.\n * @param nested A nested rule node.\n * @returns Every declaration found in the nested subtree.\n */\nfunction collectNestedDecls(nested: unknown): readonly LcDeclaration[] {\n if (typeof nested !== 'object' || nested === null) return []\n const node = nested as { type?: string; value?: NestedStyleRule & { rules?: readonly unknown[] } }\n if (!node.value) return []\n // `style` (with `&:active`) and `media` wrappers both surface the\n // actual decls. lightningcss surfaces inner-only declarations as a\n // `nested-declarations` node — flatten that too.\n if (node.type === 'nested-declarations') return [...(node.value.declarations?.declarations ?? [])]\n if (node.type !== 'style' && node.type !== 'media') return []\n const out: LcDeclaration[] = [...(node.value.declarations?.declarations ?? [])]\n for (const child of node.value.rules ?? []) out.push(...collectNestedDecls(child))\n return out\n}\n\n/**\n * Fold one nested style rule (Tailwind's `&:where(.<scheme>, .<scheme> *)`\n * pattern) into the scheme bucket its selector targets. Rules we can't\n * attribute to a single scheme are skipped — they'd only ever reach the\n * bucket via CSS cascading in a browser, which doesn't translate to RN.\n * @param nested One nested-rule node from `rule.value.rules`.\n * @param bucket Per-scheme style map for the atom.\n * @param ctx Parser-call-wide context.\n * @param ruleSchemeTables Per-scheme var tables (outer rule's merged table).\n * @param ruleLocalVars Outer rule's `--tw-*` vars (inherited for inner decls).\n */\nfunction applyNestedSchemeRule(\n nested: unknown,\n bucket: Record<string, RNStyle>,\n ctx: StyleRuleContext,\n ruleSchemeTables: ReadonlyMap<string, ReadonlyMap<string, string>>,\n ruleLocalVars: ReadonlyMap<string, string>,\n): void {\n if (typeof nested !== 'object' || nested === null) return\n const node = nested as { type?: string; value?: NestedStyleRule }\n if (node.type !== 'style' || !node.value) return\n const targetScheme = detectNestedScheme(node.value.selectors, ctx.schemes, ctx.schemeAliases)\n if (!targetScheme) return\n const innerDecls = node.value.declarations?.declarations ?? []\n const table = ruleSchemeTables.get(targetScheme)\n const schemeBucket = bucket[targetScheme] ?? {}\n for (const decl of innerDecls) {\n for (const [key, value] of declarationToRnEntries(decl, table)) schemeBucket[key] = value\n const animationRef = pickAnimationName(decl)\n if (animationRef) ctx.referencedKeyframes.add(animationRef)\n }\n // Apply the composed-transform + shadow post-passes to just this one\n // scheme, so nested `--tw-*` custom prop writes compose correctly.\n const nestedLocalVars = new Map(ruleLocalVars)\n for (const [k, v] of collectRuleLocalVars(innerDecls)) nestedLocalVars.set(k, v)\n applyComposedTransformToScheme(schemeBucket, nestedLocalVars)\n applyComposedShadowToScheme(schemeBucket, nestedLocalVars)\n bucket[targetScheme] = schemeBucket\n}\n\n/**\n * Shape of a lightningcss style rule as it appears inside `rule.value.rules`.\n * Loose typing because the full type is a sprawling discriminated union\n * we only need one shape from.\n */\ninterface NestedStyleRule {\n selectors: readonly (readonly unknown[])[]\n declarations?: { declarations: readonly LcDeclaration[] }\n}\n\n/**\n * Detect which scheme a nested `&:where(.<scheme>, .<scheme> *)`\n * selector targets. Recognises both the rnwind-default literal class\n * (`.dark`) and any user-declared `@custom-variant` selector class\n * (`.scheme-dark`), via the `aliases` map built from the theme CSS.\n * @param selectors Nested rule's selector lists.\n * @param schemes Declared scheme names.\n * @param aliases Class-name → scheme-name map from `@custom-variant` decls.\n * @returns Matching scheme name, or null when the selector isn't scheme-scoped.\n */\nfunction detectNestedScheme(\n selectors: readonly (readonly unknown[])[],\n schemes: readonly string[],\n aliases: ReadonlyMap<string, string>,\n): string | null {\n const known = new Set(schemes)\n for (const selector of selectors) {\n const found = findSchemeInSelector(selector, schemes, known, aliases)\n if (found) return found\n }\n return null\n}\n\n/**\n * Inner half of {@link detectNestedScheme} — extracted so each function\n * stays under the cognitive-complexity cap.\n * @param selector One compound selector (sequence of simple parts).\n * @param schemes Declared scheme names (for recursion).\n * @param known Set form of `schemes` for O(1) lookups.\n * @param aliases Class-name → scheme-name map from `@custom-variant` decls.\n * @returns Matching scheme name, or null.\n */\nfunction findSchemeInSelector(\n selector: readonly unknown[],\n schemes: readonly string[],\n known: ReadonlySet<string>,\n aliases: ReadonlyMap<string, string>,\n): string | null {\n for (const part of selector) {\n const direct = matchSchemeClass(part, known, aliases)\n if (direct) return direct\n const nested = matchSchemeInWhere(part, schemes, aliases)\n if (nested) return nested\n }\n return null\n}\n\n/**\n * Match a `.scheme` class part against the declared schemes (literal\n * match) or against the `@custom-variant` alias map (e.g. `.scheme-dark`\n * → `dark`).\n * @param part One simple selector part.\n * @param known Declared scheme names.\n * @param aliases Class-name → scheme-name map from `@custom-variant` decls.\n * @returns Matching scheme name, or null.\n */\nfunction matchSchemeClass(part: unknown, known: ReadonlySet<string>, aliases: ReadonlyMap<string, string>): string | null {\n if (typeof part !== 'object' || part === null) return null\n const node = part as { type?: string; name?: string }\n if (node.type !== 'class') return null\n if (typeof node.name !== 'string') return null\n if (known.has(node.name)) return node.name\n return aliases.get(node.name) ?? null\n}\n\n/**\n * Match a `:where(.scheme, …)` pseudo-class wrapper and recurse into\n * its inner selectors.\n * @param part One simple selector part.\n * @param schemes Declared scheme names.\n * @param aliases Class-name → scheme-name map from `@custom-variant` decls.\n * @returns Matching scheme name from inside the `where`, or null.\n */\nfunction matchSchemeInWhere(part: unknown, schemes: readonly string[], aliases: ReadonlyMap<string, string>): string | null {\n if (typeof part !== 'object' || part === null) return null\n const node = part as { type?: string; kind?: string; selectors?: readonly (readonly unknown[])[] }\n if (node.type !== 'pseudo-class' || node.kind !== 'where' || !node.selectors) return null\n return detectNestedScheme(node.selectors, schemes, aliases)\n}\n\n/**\n * Per-scheme version of `applyComposedTransform` — synthesize a\n * `transform` array into a SINGLE scheme's style from its rule-local\n * `--tw-*` vars.\n * @param style Scheme-specific style map.\n * @param ruleLocalVars Combined outer+nested `--tw-*` vars.\n */\nfunction applyComposedTransformToScheme(style: RNStyle, ruleLocalVars: ReadonlyMap<string, string>): void {\n const composed = composeTransformFromVars(ruleLocalVars)\n if (composed.length === 0) return\n delete style.translate\n delete style.scale\n delete style.rotate\n style.transform = composed\n}\n\n/**\n * Per-scheme version of `applyComposedShadow` — synthesize RN shadow\n * longhands into a SINGLE scheme's style from its `--tw-shadow` custom\n * prop.\n * @param style Scheme-specific style map.\n * @param ruleLocalVars Combined outer+nested `--tw-*` vars.\n */\nfunction applyComposedShadowToScheme(style: RNStyle, ruleLocalVars: ReadonlyMap<string, string>): void {\n const rawShadow = ruleLocalVars.get('--tw-shadow')\n const rawShadowColor = ruleLocalVars.get('--tw-shadow-color')\n if (!rawShadow && rawShadowColor) {\n const color = resolveCustomColorString(rawShadowColor)\n if (!color) return\n delete style.boxShadow\n style.shadowColor = color\n return\n }\n if (!rawShadow) return\n const shadow = parseFirstShadow(rawShadow)\n if (!shadow) return\n delete style.boxShadow\n style.shadowColor = shadow.color\n style.shadowOffset = { width: shadow.x, height: shadow.y }\n style.shadowOpacity = shadow.opacity\n style.shadowRadius = shadow.blur\n style.elevation = Math.max(1, Math.min(24, Math.round(Math.max(shadow.y, shadow.blur / 2))))\n}\n\n/**\n * Tailwind v4's `shadow-*` utilities write a `--tw-shadow` custom prop\n * holding the actual `<x> <y> <blur> <spread> <color>` shadow values,\n * then a `box-shadow: var(--tw-shadow)` declaration RN can't use. This\n * post-pass parses `--tw-shadow` and emits the RN shadow longhands —\n * `shadowColor` / `shadowOffset` / `shadowOpacity` / `shadowRadius` /\n * `elevation` — so iOS and Android both render the shadow.\n * @param bucket Per-scheme style map for the atom.\n * @param schemes Scheme names active for this parse.\n * @param ruleLocalVars Rule-local `--tw-*` vars.\n */\nfunction applyComposedShadow(\n bucket: Record<string, RNStyle>,\n schemes: readonly string[],\n ruleLocalVars: ReadonlyMap<string, string>,\n): void {\n const rawShadow = ruleLocalVars.get('--tw-shadow')\n const rawShadowColor = ruleLocalVars.get('--tw-shadow-color')\n // Color-only utility (`shadow-red-50`, `shadow-gray-200`, …): emit\n // `shadowColor` + `shadowOpacity: 1` so the explicit color overrides\n // the size utility's 0.1 alpha fallback (matches Tailwind v4 web,\n // where setting `--tw-shadow-color` swaps in a solid color). Offset /\n // blur / elevation come from the partner size utility's atom.\n if (!rawShadow && rawShadowColor) {\n const color = resolveCustomColorString(rawShadowColor)\n if (!color) return\n for (const scheme of schemes) {\n const style = bucket[scheme] ?? {}\n delete style.boxShadow\n style.shadowColor = color\n bucket[scheme] = style\n }\n return\n }\n if (!rawShadow) return\n const shadow = parseFirstShadow(rawShadow)\n if (!shadow) return\n for (const scheme of schemes) {\n const style = bucket[scheme] ?? {}\n delete style.boxShadow\n style.shadowColor = shadow.color\n style.shadowOffset = { width: shadow.x, height: shadow.y }\n style.shadowOpacity = shadow.opacity\n style.shadowRadius = shadow.blur\n style.elevation = Math.max(1, Math.min(24, Math.round(Math.max(shadow.y, shadow.blur / 2))))\n bucket[scheme] = style\n }\n}\n\n/**\n * Synthesize RN ring styles from Tailwind's `--tw-ring-color` /\n * `--tw-ring-shadow` composable custom props. RN has no native ring;\n * we approximate by writing `borderColor` + `borderWidth` so the\n * outline is visible. Atoms that ALREADY set borderColor (e.g. paired\n * with `border-2`) keep their value — the ring just won't override.\n * @param bucket Per-scheme style map for the atom.\n * @param schemes Scheme names active for this parse.\n * @param ruleLocalVars Rule-local `--tw-*` vars.\n */\nfunction applyComposedRing(\n bucket: Record<string, RNStyle>,\n schemes: readonly string[],\n ruleLocalVars: ReadonlyMap<string, string>,\n): void {\n const ringColor = ruleLocalVars.get('--tw-ring-color')\n if (!ringColor) return\n const color = resolveCustomColorString(ringColor)\n if (!color) return\n for (const scheme of schemes) {\n const style = bucket[scheme] ?? {}\n if (!('borderColor' in style)) style.borderColor = color\n bucket[scheme] = style\n }\n}\n\n/**\n * Resolve a CSS color string (`oklch(0.971 0.013 17.38)`, `#ff0000`,\n * `rgb(0 0 0 / 0.1)`) to the hex string RN's `shadowColor` accepts.\n * Wraps culori's parser via {@link parseCssColorToHex}.\n * @param raw Raw color text from a `--tw-shadow-color` custom prop.\n * @returns `#rrggbb` string, or null when culori can't parse it.\n */\nfunction resolveCustomColorString(raw: string): string | null {\n const text = unwrapVariableFallback(raw).trim()\n if (text.length === 0) return null\n if (text.startsWith('#')) return text\n return parseCssColorToHex(text)\n}\n\n/**\n * Parse any CSS color expression into an `#rrggbb` string via culori.\n * Falls back to null when culori doesn't recognize the format.\n * @param text CSS color value.\n * @returns Hex string, or null.\n */\nfunction parseCssColorToHex(text: string): string | null {\n return formatHexSafe(text)\n}\n\n/**\n * Format a CSS color via culori.\n * @param text CSS color value.\n * @returns `#rrggbb` string when culori succeeds, else null.\n */\nfunction formatHexSafe(text: string): string | null {\n try {\n const hex = culoriFormatHex(text)\n return typeof hex === 'string' ? hex : null\n } catch {\n return null\n }\n}\n\ninterface ParsedShadow {\n x: number\n y: number\n blur: number\n spread: number\n color: string\n opacity: number\n}\n\n/**\n * Parse the first shadow from a `--tw-shadow` custom-property value.\n * The value is a comma-separated list of shadows; each shadow is\n * `<x> <y> <blur> <spread> <color>`. RN renders only one shadow per\n * view, so we keep the first.\n * @param raw Raw `--tw-shadow` text (post-substitution).\n * @returns Parsed shadow, or null when the shape is unrecognized.\n */\nfunction parseFirstShadow(raw: string): ParsedShadow | null {\n // Split on top-level commas (parens-aware) so colors like `rgba(0,0,0,0.5)`\n // don't fragment the list.\n const head = topLevelSplit(raw, ',')[0]?.trim()\n if (!head) return null\n const { lengths, remainder } = extractShadowLengths(head)\n const [x = 0, y = 0, blur = 0, spread = 0] = lengths\n const { color, opacity } = parseShadowColor(remainder.trim())\n return { x, y, blur, spread, color, opacity }\n}\n\n/**\n * Pull the first 4 numeric tokens out of a shadow expression and return\n * them alongside the remaining text (which is the color expression).\n * Shadow shape: `<x> <y> <blur> <spread> <color>` — tokens may be bare\n * (`0`), px-dimensioned (`1px`), or rem/em/%.\n * @param head Single shadow expression (one comma-separated entry).\n * @returns Pixel lengths + the remainder text (color expression).\n */\nfunction extractShadowLengths(head: string): { lengths: number[]; remainder: string } {\n const lengthRegex = /(?<![A-Za-z(])-?\\d*\\.?\\d+(?:px|rem|em|%)?/g\n const lengths: number[] = []\n const matches: { text: string; index: number }[] = []\n let next: RegExpExecArray | null = lengthRegex.exec(head)\n while (next !== null && lengths.length < 4) {\n matches.push({ text: next[0], index: next.index })\n lengths.push(parseLengthToken(next[0]))\n next = lengthRegex.exec(head)\n }\n let remainder = head\n for (const { text, index } of matches.toReversed()) {\n remainder = `${remainder.slice(0, index)}${remainder.slice(index + text.length)}`\n }\n return { lengths, remainder }\n}\n\n/**\n * Coerce one shadow length token into a pixel number. Accepts bare\n * integers (`0`), `Npx`, and `Nrem` — every shape Tailwind's\n * `--tw-shadow` value uses.\n * @param token Token text.\n * @returns Pixel number.\n */\nfunction parseLengthToken(token: string): number {\n if (token.endsWith('rem')) return Number(token.slice(0, -3)) * 16\n if (token.endsWith('em')) return Number(token.slice(0, -2)) * 16\n if (token.endsWith('px')) return Number(token.slice(0, -2))\n if (token.endsWith('%')) return Number(token.slice(0, -1))\n return Number(token)\n}\n\n/**\n * Extract a color string + extracted alpha from a shadow's color\n * expression. Supports `rgb(...)` / `rgba(...)` / `#rrggbb` / hex with\n * alpha / theme-resolved CSS color strings.\n * @param expr Color expression text.\n * @returns Color string for `shadowColor` + alpha for `shadowOpacity`.\n */\nfunction parseShadowColor(expr: string): { color: string; opacity: number } {\n const working = unwrapVariableFallback(expr).trim()\n if (working.length === 0) return { color: '#000', opacity: 0.1 }\n const rgba = parseRgbaExpression(working)\n if (rgba) return rgba\n if (working.startsWith('#')) return { color: working, opacity: 1 }\n return { color: '#000', opacity: 0.1 }\n}\n\n/**\n * Strip the `var(--name, fallback)` wrapper from a CSS value. Tailwind\n * wraps shadow colors as `var(--tw-shadow-color, rgb(0 0 0 / 0.1))`,\n * and when the var is unresolved we want the fallback.\n * @param expr Raw CSS value.\n * @returns Inner fallback when wrapped, otherwise the input unchanged.\n */\nfunction unwrapVariableFallback(expr: string): string {\n const trimmed = expr.trim()\n if (!trimmed.startsWith('var(') || !trimmed.endsWith(')')) return trimmed\n const inner = trimmed.slice(4, -1)\n let depth = 0\n for (let index = 0; index < inner.length; index += 1) {\n const ch = inner[index]\n if (ch === '(') depth += 1\n else if (ch === ')') depth -= 1\n else if (ch === ',' && depth === 0) return inner.slice(index + 1)\n }\n return trimmed\n}\n\n/**\n * Parse an `rgb(r g b)` / `rgba(r,g,b,a)` / `rgb(r g b / a)` color\n * expression into a hex + alpha pair. Returns `null` when the shape\n * doesn't match.\n * @param text Expression text (already trimmed and unwrapped).\n * @returns Hex color + alpha, or null.\n */\nfunction parseRgbaExpression(text: string): { color: string; opacity: number } | null {\n const head = /^rgba?\\(([^)]+)\\)$/i.exec(text)\n if (!head) return null\n const inner = head[1]!.replaceAll(',', ' ').replaceAll('/', ' ')\n const tokens = inner.split(/\\s+/).filter((part) => part.length > 0)\n if (tokens.length < 3) return null\n const [r, g, b, alphaText] = tokens\n let opacity = 1\n if (typeof alphaText === 'string') {\n opacity = alphaText.endsWith('%') ? Number(alphaText.slice(0, -1)) / 100 : Number(alphaText)\n }\n const hex = `#${[r!, g!, b!]\n .map((n) =>\n Math.max(0, Math.min(255, Math.round(Number(n))))\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')}`\n return { color: hex, opacity }\n}\n\n/**\n * Split `text` at top-level occurrences of `delimiter`, treating\n * parentheses as nesting. Used to safely split shadow lists without\n * fragmenting `rgb(0, 0, 0, 0.5)` on its commas.\n * @param text Source text.\n * @param delimiter Single-character delimiter to split on.\n * @returns Parts of the text between top-level delimiters.\n */\nfunction topLevelSplit(text: string, delimiter: string): string[] {\n const parts: string[] = []\n let depth = 0\n let start = 0\n for (let index = 0; index < text.length; index += 1) {\n const ch = text[index]\n if (ch === '(') depth += 1\n else if (ch === ')') depth -= 1\n else if (ch === delimiter && depth === 0) {\n parts.push(text.slice(start, index))\n start = index + 1\n }\n }\n parts.push(text.slice(start))\n return parts\n}\n\n/**\n * Tailwind v4's `text-*` utilities emit `line-height` as a unitless\n * multiplier (`calc(2.5 / 2.25)` for `text-4xl`) that the browser\n * resolves against the element's `font-size`. RN's `lineHeight` is\n * always pixels — so when both `fontSize` and a multiplier-shaped\n * `lineHeight` (less than 10) land on the same atom, multiply through\n * to a pixel value. Atoms with only one of the two are left alone.\n * @param bucket Per-scheme style map for the atom.\n * @param schemes Scheme names active for this parse.\n */\nfunction normalizeLineHeightToPx(bucket: Record<string, RNStyle>, schemes: readonly string[]): void {\n for (const scheme of schemes) {\n const style = bucket[scheme]\n if (!style) continue\n const { fontSize } = style\n const { lineHeight } = style\n if (typeof fontSize !== 'number' || typeof lineHeight !== 'number') continue\n if (lineHeight >= 10) continue\n style.lineHeight = Math.round(fontSize * lineHeight * 10_000) / 10_000\n }\n}\n\n/**\n * Fold one declaration's resolved entries into every scheme's bucket on\n * the target atom.\n * @param decl Lightningcss declaration to convert.\n * @param bucket Per-scheme style map for the atom.\n * @param schemes Scheme names active for this parse.\n * @param ruleSchemeTables Per-scheme var tables (with rule-local overrides folded in).\n */\nfunction applyDeclarationToBucket(\n decl: LcDeclaration,\n bucket: Record<string, RNStyle>,\n schemes: readonly string[],\n ruleSchemeTables: ReadonlyMap<string, ReadonlyMap<string, string>>,\n): void {\n for (const scheme of schemes) {\n const schemeBucket = bucket[scheme] ?? {}\n for (const [key, value] of declarationToRnEntries(decl, ruleSchemeTables.get(scheme))) {\n schemeBucket[key] = value\n }\n bucket[scheme] = schemeBucket\n }\n}\n\n/**\n * Apply the composed-transform post-pass for a single atom: if any of\n * Tailwind's `--tw-translate-*` / `--tw-scale-*` / `--tw-skew-*` vars\n * were written, synthesize a single `transform` array and drop the\n * intermediate `translate`/`scale`/`rotate` shorthand entries.\n * @param bucket Per-scheme style map for the atom.\n * @param schemes Scheme names active for this parse.\n * @param ruleLocalVars Rule-local `--tw-*` vars.\n */\nfunction applyComposedTransform(\n bucket: Record<string, RNStyle>,\n schemes: readonly string[],\n ruleLocalVars: ReadonlyMap<string, string>,\n): void {\n const composed = composeTransformFromVars(ruleLocalVars)\n if (composed.length === 0) return\n for (const scheme of schemes) {\n const schemeBucket = bucket[scheme] ?? {}\n delete schemeBucket.translate\n delete schemeBucket.scale\n delete schemeBucket.rotate\n schemeBucket.transform = composed\n bucket[scheme] = schemeBucket\n }\n}\n\n/**\n * Synthesize an RN `transform` array from Tailwind v4's composable\n * `--tw-translate-x/y`, `--tw-scale-x/y`, `--tw-skew-x/y`, and\n * `--tw-rotate-x/y/z` custom properties. Returns an empty array when\n * none of those props were written, letting the caller skip the\n * post-pass.\n * @param ruleVars Rule-local `--tw-*` vars collected from the style rule.\n * @returns RN transform operations (possibly empty).\n */\nfunction composeTransformFromVars(ruleVars: ReadonlyMap<string, string>): readonly Record<string, string | number>[] {\n const ops: Record<string, string | number>[] = []\n addAxisOp(ops, 'translateX', ruleVars.get('--tw-translate-x'), resolveLengthExpression)\n addAxisOp(ops, 'translateY', ruleVars.get('--tw-translate-y'), resolveLengthExpression)\n addAxisOp(ops, 'scaleX', ruleVars.get('--tw-scale-x'), resolveNumberOrPercent)\n addAxisOp(ops, 'scaleY', ruleVars.get('--tw-scale-y'), resolveNumberOrPercent)\n addAxisOp(ops, 'skewX', ruleVars.get('--tw-skew-x'), extractAngleFromSkewFunction)\n addAxisOp(ops, 'skewY', ruleVars.get('--tw-skew-y'), extractAngleFromSkewFunction)\n return ops\n}\n\n/**\n * Push `{<key>: resolved(raw)}` into `ops` when `raw` is present and the\n * resolver returns non-null. Keeps {@link composeTransformFromVars}\n * below the cognitive complexity threshold.\n * @param ops Target array to mutate.\n * @param key RN transform op key (e.g. `'translateX'`).\n * @param raw Rule-local var value (possibly undefined).\n * @param resolve Value-resolver for this axis type.\n */\nfunction addAxisOp<T extends string | number>(\n ops: Record<string, string | number>[],\n key: string,\n raw: string | undefined,\n resolve: (text: string) => T | null,\n): void {\n if (!raw) return\n const value = resolve(raw)\n if (value !== null) ops.push({ [key]: value })\n}\n\n/**\n * Resolve a CSS length expression into the value a RN transform op\n * accepts — pixels as a number, or a percentage string preserved\n * verbatim. Supports the shapes Tailwind v4 emits into `--tw-translate-*`:\n *\n * - Direct lengths: `16px`, `1rem`, bare `42`.\n * - Percentages: `100%`, `-100%`.\n * - Flat calc: `calc(0.25rem * 52)`.\n * - Fractional calc: `calc(1 / 2 * 100%)` (→ `translate-x-1/2`).\n * - Nested calc with sign flip: `calc(calc(1 / 3 * 100%) * -1)` (→ `-translate-x-1/3`).\n *\n * Returns null when the expression mixes units (`calc(100% - 10px)` —\n * RN can't express those) or contains a token the evaluator can't\n * interpret; the transform op is simply skipped in that case.\n * @param text Length expression text.\n * @returns Pixel number, percentage string, or null when unrepresentable.\n */\nfunction resolveLengthExpression(text: string): number | string | null {\n const trimmed = text.trim()\n if (trimmed.length === 0) return null\n const evaluated = evaluateLengthExpr(trimmed)\n if (!evaluated) return null\n if (evaluated.unit === '%') return `${stripTrailingZeros(evaluated.value)}%`\n if (evaluated.unit === 'rem') return evaluated.value * 16\n return evaluated.value\n}\n\n/** Evaluated length + its unit. `''` means px or bare number. */\ninterface EvaluatedLength {\n value: number\n unit: '%' | 'rem' | ''\n}\n\n/**\n * Evaluate a CSS length expression to a `{value, unit}` pair.\n *\n * Strategy: detect the (at most one) unit suffix present in the text,\n * strip every `calc(` to `(`, strip the unit suffix from numeric tokens,\n * and run a small arithmetic evaluator. Mixed-unit expressions are\n * rejected because RN has no way to express `calc(100% - 10px)` in a\n * flat transform op.\n * @param text Raw CSS length expression (already trimmed).\n * @returns Evaluated length with its unit, or `null` when invalid.\n */\nfunction evaluateLengthExpr(text: string): EvaluatedLength | null {\n const units = detectUnits(text)\n if (units.length > 1) return null\n const unit = (units[0] ?? '') as EvaluatedLength['unit']\n const arithmetic = stripCalcAndUnits(text)\n const value = evaluateArithmetic(arithmetic)\n if (value === null || !Number.isFinite(value)) return null\n return { value, unit }\n}\n\n/**\n * Detect which length units appear in the expression. Multi-unit\n * expressions (e.g. `calc(100% - 1rem)`) aren't representable in one RN\n * transform op, so we reject them.\n * @param text Length expression.\n * @returns Sorted, deduped unit list found in the text.\n */\nfunction detectUnits(text: string): readonly string[] {\n const found = new Set<string>()\n if (/\\d%/.test(text)) found.add('%')\n if (/[\\d.]rem\\b/.test(text)) found.add('rem')\n if (/[\\d.]px\\b/.test(text)) found.add('px')\n return [...found]\n}\n\n/**\n * Strip every `calc(` wrapper to a plain `(`, and strip `%` / `rem` /\n * `px` unit suffixes from numeric tokens. Result is a plain arithmetic\n * expression the evaluator can consume.\n * @param text Length expression.\n * @returns Arithmetic text suitable for {@link evaluateArithmetic}.\n */\nfunction stripCalcAndUnits(text: string): string {\n // Input is Tailwind's compiled CSS, not user-controlled — no ReDoS risk.\n // eslint-disable-next-line sonarjs/slow-regex\n return text.replaceAll(/\\bcalc\\s*\\(/g, '(').replaceAll(/([\\d.]+)(?:rem|px|%)/g, '$1')\n}\n\n/**\n * Format a percentage number so `50` stays `\"50%\"` (not `\"50.00000001%\"`)\n * when float drift is in the low bits. Strips trailing-zero decimals.\n * @param value Percentage magnitude.\n * @returns Integer-ish string.\n */\nfunction stripTrailingZeros(value: number): string {\n const rounded = Math.round(value * 1_000_000) / 1_000_000\n return String(rounded)\n}\n\n/**\n * Tiny recursive-descent evaluator for CSS arithmetic. Accepts `+`, `-`,\n * `*`, `/`, parens, and decimal numbers. Returns `null` on malformed\n * input — rejects anything the tokenizer can't classify.\n * @param text Arithmetic text (post {@link stripCalcAndUnits}).\n * @returns Evaluated number, or `null`.\n */\nfunction evaluateArithmetic(text: string): number | null {\n const tokens = tokenizeArithmetic(text)\n if (!tokens) return null\n const cursor = { index: 0 }\n const result = parseArithmeticExpr(tokens, cursor)\n if (cursor.index !== tokens.length) return null\n return result\n}\n\n/**\n * Split arithmetic text into numeric and operator tokens. Returns null\n * when the text contains any character outside the allowed set.\n * @param text Arithmetic text.\n * @returns Token list, or null on unexpected character.\n */\nfunction tokenizeArithmetic(text: string): readonly string[] | null {\n const tokens: string[] = []\n let index = 0\n while (index < text.length) {\n const ch = text[index]!\n if (isArithmeticWhitespace(ch)) {\n index += 1\n } else if (isArithmeticOperator(ch)) {\n tokens.push(ch)\n index += 1\n } else if (isDigitOrDot(ch)) {\n const next = consumeNumber(text, index)\n tokens.push(text.slice(index, next))\n index = next\n } else {\n return null\n }\n }\n return tokens\n}\n\n/**\n * Check whether `ch` is a whitespace character the arithmetic tokenizer\n * may skip.\n * @param ch Single-character string.\n * @returns True for space / tab / newline.\n */\nfunction isArithmeticWhitespace(ch: string): boolean {\n return ch === ' ' || ch === '\\t' || ch === '\\n'\n}\n\n/**\n * Check whether `ch` is one of the arithmetic operator tokens.\n * @param ch Single-character string.\n * @returns True for `(`, `)`, `+`, `-`, `*`, `/`.\n */\nfunction isArithmeticOperator(ch: string): boolean {\n return ch === '(' || ch === ')' || ch === '+' || ch === '-' || ch === '*' || ch === '/'\n}\n\n/**\n * Check whether `ch` belongs to a numeric token.\n * @param ch Single-character string.\n * @returns True for a digit `0`–`9` or `.`.\n */\nfunction isDigitOrDot(ch: string): boolean {\n return (ch >= '0' && ch <= '9') || ch === '.'\n}\n\n/**\n * Advance past a numeric token starting at `start`.\n * @param text Source text.\n * @param start Index of the first digit or dot.\n * @returns Index just past the last digit-or-dot.\n */\nfunction consumeNumber(text: string, start: number): number {\n let index = start\n while (index < text.length && isDigitOrDot(text[index]!)) index += 1\n return index\n}\n\n/**\n * Parse an additive expression: `term (('+'|'-') term)*`.\n * @param tokens Token list.\n * @param cursor Mutable cursor.\n * @param cursor.index Current token index; advanced past consumed tokens.\n * @returns Evaluated number, or `null` on parse failure.\n */\nfunction parseArithmeticExpr(tokens: readonly string[], cursor: { index: number }): number | null {\n let left = parseArithmeticTerm(tokens, cursor)\n if (left === null) return null\n while (cursor.index < tokens.length) {\n const op = tokens[cursor.index]\n if (op !== '+' && op !== '-') break\n cursor.index += 1\n const right = parseArithmeticTerm(tokens, cursor)\n if (right === null) return null\n left = op === '+' ? left + right : left - right\n }\n return left\n}\n\n/**\n * Parse a multiplicative expression: `factor (('*'|'/') factor)*`.\n * @param tokens Token list.\n * @param cursor Mutable cursor.\n * @param cursor.index Current token index; advanced past consumed tokens.\n * @returns Evaluated number, or `null`.\n */\nfunction parseArithmeticTerm(tokens: readonly string[], cursor: { index: number }): number | null {\n let left = parseArithmeticFactor(tokens, cursor)\n if (left === null) return null\n while (cursor.index < tokens.length) {\n const op = tokens[cursor.index]\n if (op !== '*' && op !== '/') break\n cursor.index += 1\n const right = parseArithmeticFactor(tokens, cursor)\n if (right === null) return null\n left = op === '*' ? left * right : left / right\n }\n return left\n}\n\n/**\n * Parse a factor: unary minus, parenthesised expression, or number.\n * @param tokens Token list.\n * @param cursor Mutable cursor.\n * @param cursor.index Current token index; advanced past consumed tokens.\n * @returns Evaluated number, or `null`.\n */\nfunction parseArithmeticFactor(tokens: readonly string[], cursor: { index: number }): number | null {\n if (cursor.index >= tokens.length) return null\n const tok = tokens[cursor.index]!\n if (tok === '-') {\n cursor.index += 1\n const right = parseArithmeticFactor(tokens, cursor)\n return right === null ? null : -right\n }\n if (tok === '+') {\n cursor.index += 1\n return parseArithmeticFactor(tokens, cursor)\n }\n if (tok === '(') {\n cursor.index += 1\n const inner = parseArithmeticExpr(tokens, cursor)\n if (cursor.index >= tokens.length || tokens[cursor.index] !== ')') return null\n cursor.index += 1\n return inner\n }\n const number_ = Number(tok)\n if (!Number.isFinite(number_)) return null\n cursor.index += 1\n return number_\n}\n\n/**\n * Resolve a scale factor expressed as a percentage (`150%`) or number (`1.5`).\n * @param text Raw value.\n * @returns Scale number (e.g. 1.5 for 150%), or null.\n */\nfunction resolveNumberOrPercent(text: string): number | null {\n const trimmed = text.trim()\n const percent = /^(-?\\d+(?:\\.\\d+)?)%$/.exec(trimmed)\n if (percent) return Number(percent[1]) / 100\n const bare = /^-?\\d+(?:\\.\\d+)?$/.exec(trimmed)\n if (bare) return Number(trimmed)\n return null\n}\n\n/**\n * Extract the angle from Tailwind's `skewX(12deg)` / `skewY(-5deg)` /\n * `skewX(calc(6deg * -1))` custom-property value shape. Returns null\n * when the inner expression doesn't reduce to a degree value.\n *\n * Tailwind v4 emits negative skew utilities as a nested `calc()`\n * (`-skew-x-6` → `skewX(calc(6deg * -1))`), so the inner body has to be\n * evaluated as arithmetic — a bare-angle regex silently drops those.\n * @param text Raw value.\n * @returns `<N>deg` string, or null.\n */\nfunction extractAngleFromSkewFunction(text: string): string | null {\n const trimmed = text.trim()\n if (!trimmed.endsWith(')')) return null\n const openIdx = trimmed.indexOf('(')\n if (openIdx < 5) return null\n const head = trimmed.slice(0, openIdx)\n if (head !== 'skewX' && head !== 'skewY') return null\n const inner = trimmed.slice(openIdx + 1, -1).trim()\n return resolveAngleExpression(inner)\n}\n\n/**\n * Evaluate an expression whose single unit is `deg`. Strips `calc(`\n * wrappers and `deg` suffixes, runs the arithmetic evaluator, reapplies\n * `deg`. Returns null for unit mismatches or unparseable text.\n * @param text Angle expression (e.g. `6deg`, `calc(6deg * -1)`).\n * @returns `<N>deg`, or null when not representable.\n */\nfunction resolveAngleExpression(text: string): string | null {\n if (!/[\\d.]deg\\b/.test(text)) return null\n // Input is Tailwind's compiled CSS, not user-controlled — no ReDoS risk.\n // eslint-disable-next-line sonarjs/slow-regex\n const arithmetic = text.replaceAll(/\\bcalc\\s*\\(/g, '(').replaceAll(/([\\d.]+)deg/g, '$1')\n const value = evaluateArithmetic(arithmetic)\n if (value === null || !Number.isFinite(value)) return null\n return `${stripTrailingZeros(value)}deg`\n}\n\n/**\n * Scan Tailwind's compiled CSS for `:root, :host { --x: y; … }` blocks\n * and pull the custom-property declarations out. This captures every\n * theme token Tailwind resolved — including tokens imported from the\n * user's secondary `@import` files (e.g. `rnwind/css`'s\n * `--duration-normal: 220ms`) — without rnwind having to re-implement\n * `@import` resolution.\n *\n * Regex-free scanner: finds `:root` prefixes, walks forward with\n * brace-depth tracking to find the matching block close, then extracts\n * every `--name: value;` pair with a paren-balanced walker so commas\n * inside `rgb(0, 0, 0)` don't confuse the split.\n * @param css Tailwind's compiled CSS.\n * @returns Map of custom-property name → resolved value.\n */\nfunction extractRootCustomProperties(css: string): Map<string, string> {\n const out = new Map<string, string>()\n let cursor = 0\n while (cursor < css.length) {\n const blockEnd = consumeNextRootBlock(css, cursor, out)\n if (blockEnd === -1) break\n cursor = blockEnd + 1\n }\n return out\n}\n\n/**\n * Locate the next `:root` block from `cursor`, extract its custom\n * properties into `out`, and return the index of its closing brace.\n * Split out from {@link extractRootCustomProperties} to keep complexity\n * below the cap.\n * @param css Source CSS.\n * @param cursor Start index for the search.\n * @param out Destination map, mutated.\n * @returns Index of the closing brace, or -1 when no block remains.\n */\nfunction consumeNextRootBlock(css: string, cursor: number, out: Map<string, string>): number {\n const head = css.indexOf(':root', cursor)\n if (head === -1) return -1\n const brace = css.indexOf('{', head)\n if (brace === -1) return -1\n const blockEnd = findMatchingClose(css, brace + 1)\n if (blockEnd === -1) return -1\n collectCustomDeclarations(css.slice(brace + 1, blockEnd), out)\n return blockEnd\n}\n\n/**\n * Parse the body of a `:root` block — a `;`-separated list of `--name:\n * value` declarations — into the output map. Top-level `;` split is\n * paren-aware so `rgb(0, 0, 0)` doesn't fragment the list.\n * @param body Block body text (between braces).\n * @param out Destination map, mutated.\n */\nfunction collectCustomDeclarations(body: string, out: Map<string, string>): void {\n for (const declaration of topLevelSplit(body, ';')) {\n const colon = declaration.indexOf(':')\n if (colon === -1) continue\n const name = declaration.slice(0, colon).trim()\n const value = declaration.slice(colon + 1).trim()\n if (name.startsWith('--') && value.length > 0) out.set(name, value)\n }\n}\n\n/**\n * Walk forward from `start` tracking brace depth; return the index of\n * the matching `}` for the opener just before `start`.\n * @param source Source text.\n * @param start Index just past the opening `{`.\n * @returns Index of matching `}`, or `-1` on imbalance.\n */\nfunction findMatchingClose(source: string, start: number): number {\n let depth = 1\n for (let index = start; index < source.length; index += 1) {\n const ch = source[index]\n if (ch === '{') depth += 1\n else if (ch === '}') {\n depth -= 1\n if (depth === 0) return index\n }\n }\n return -1\n}\n\n/**\n * Merge rule-local custom vars into every scheme's var table. Creates\n * fresh maps so the rule pass doesn't mutate the shared parser state.\n * @param schemeTables Base per-scheme var tables.\n * @param ruleVars Rule-local `--tw-*` overrides.\n * @returns Merged per-scheme tables.\n */\nfunction mergeRuleVars(\n schemeTables: ReadonlyMap<string, ReadonlyMap<string, string>>,\n ruleVars: ReadonlyMap<string, string>,\n): Map<string, ReadonlyMap<string, string>> {\n if (ruleVars.size === 0) return new Map(schemeTables)\n const out = new Map<string, ReadonlyMap<string, string>>()\n for (const [scheme, table] of schemeTables) {\n const merged = new Map(table)\n for (const [k, v] of ruleVars) merged.set(k, v)\n out.set(scheme, merged)\n }\n return out\n}\n"],"names":["culoriFormatHex"],"mappings":"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"}
1
+ {"version":3,"file":"tw-parser.mjs","sources":["../../../../../src/core/parser/tw-parser.ts"],"sourcesContent":["import { compile } from '@tailwindcss/node'\nimport { Scanner, type SourceEntry } from '@tailwindcss/oxide'\nimport { formatHex as culoriFormatHex } from 'culori'\nimport { Features, transform, type TransformOptions } from 'lightningcss'\nimport { declarationToRnEntries } from './declaration'\nimport { detectGradientAtom, type GradientAtomInfo } from './gradient'\nimport { detectHapticAtom, type HapticRequest } from './haptics'\nimport { keyframeSelectorOffset, keyframesName, pickAnimationName } from './keyframes'\nimport { serializeInitialValue } from './property'\nimport { classNameFromSelector } from './selector'\nimport {\n BASE_SCHEME,\n compileReadyTheme,\n extractCustomVariantSchemes,\n extractSchemeAliases,\n extractThemeVars,\n type ThemeSchemeTable,\n} from './theme-vars'\nimport { serializeTokens } from './tokens'\nimport type { RNStyle } from './types'\nimport type { Declaration as LcDeclaration, TokenOrValue } from 'lightningcss'\n\n/**\n * Inferred compiler type. `@tailwindcss/node` doesn't export its\n * compiler shape as a named type, so we pull it off the `compile()`\n * return to stay resilient to minor upstream shape shifts.\n */\ntype TailwindCompiler = Awaited<ReturnType<typeof compile>>\n\n/**\n * Default LightningCSS transform options for TailwindParser's visitor.\n * Its taken from official Tailwind source:\n * https://github.com/tailwindlabs/tailwindcss/blob/main/packages/%40tailwindcss-node/src/optimize.ts\n */\nconst DEFAULT_TRANSFORM_OPTIONS: Partial<TransformOptions<never>> = {\n drafts: {\n customMedia: true,\n },\n nonStandard: {\n deepSelectorCombinator: true,\n },\n include: Features.Nesting | Features.MediaQueries,\n exclude: Features.LogicalProperties | Features.DirSelector | Features.LightDark,\n // NOTE: deliberately no `targets`. With targets that include\n // color-mix-supporting browsers (Safari 16.4+, Chrome 111+, …),\n // lightningcss EVALUATES `color-mix(in oklab, var(--theme-color)\n // <pct>%, transparent)` at parse time using whichever value of\n // `--theme-color` it sees first in the cascade. Tailwind v4 emits\n // exactly this shape for `<prop>-<themed>/<N>` utilities (e.g.\n // `border-text/20`), so the resulting RGB color is locked to ONE\n // scheme — every variant gets the same value. By dropping targets,\n // lightningcss leaves color-mix as an unparsed function and our\n // per-scheme `unparsedToEntries` substitution path runs instead,\n // producing the right rgba(...) for each scheme. Targets in this\n // pipeline are otherwise unused — we never re-emit CSS from the AST.\n}\n/** Parser configuration — one instance per Metro session, theme CSS fixed. */\nexport interface TailwindParserConfig {\n /**\n * Theme CSS passed to `@tailwindcss/node`'s compiler. Typically the\n * user's `global.css`. We append `theme(inline)` to the tailwindcss\n * import so Tailwind resolves every `var(--theme-token)` at compile\n * time — that gives lightningcss fully-typed values (integers / rems /\n * colors) instead of unresolved `var()` references.\n */\n themeCss: string\n /**\n * Glob sources the oxide Scanner walks at project-scan time\n * (`parseProject()`). Typically\n * `[{ base: projectRoot, pattern: '**\\/*.{ts,tsx,js,jsx}', negated: false }]`\n * plus negated globs for `node_modules` and the rnwind cache dir.\n *\n * When omitted, the scanner has no sources and `parseProject()`\n * returns an empty result — `parseAtoms()` (per-file, content-driven)\n * still works without sources.\n */\n sources?: readonly SourceEntry[]\n}\n\n/** Per-call inputs — Metro hands us file content + filename; we derive the extension. */\nexport interface ParseOptions {\n content: string\n extension: string\n}\n\n/** One parsed keyframe step — offset plus the RN style at that offset. */\nexport interface KeyframeStep {\n offset: string\n style: RNStyle\n}\n\n/** One parsed `@keyframes` animation block. */\nexport interface KeyframeBlock {\n name: string\n steps: KeyframeStep[]\n}\n\n/** Interactive variant ('active' / 'focus') an `active:`/`focus:` atom carries. */\nexport type InteractiveStateTag = 'active' | 'focus'\n\n/**\n * Per-scheme resolved style for a single utility class. Keys are scheme\n * names declared via `@variant <name>` in the theme CSS (or the synthetic\n * `'base'` scheme for themes without variants). Values are the RN style\n * object under that scheme.\n *\n * The reserved `__state` key is set on `active:` / `focus:` atoms so\n * the build-side style-builder can tag the atom for `precomputeHoist`\n * — which routes interactive atoms into the stated-hoist's 4-state\n * precompute. Standard atoms have no `__state`.\n */\nexport type SchemedStyle = Readonly<Record<string, RNStyle>> & {\n /** Interactive-state gate set by `active:` / `focus:` variants. */\n readonly __state?: InteractiveStateTag\n}\n\n/** Full result of one `parseAtoms` call. */\nexport interface ParsedOutput {\n /** Resolved RN style per utility class, per declared scheme. */\n atoms: Map<string, SchemedStyle>\n /** `@keyframes <name> { ... }` blocks the candidates pulled in. */\n keyframes: Map<string, KeyframeBlock>\n /** `@property --x { initial-value: y }` declared custom-property defaults. */\n propertyDefaults: Map<string, string>\n /**\n * Gradient metadata per atom, for atoms that play a role in a\n * Tailwind v4 gradient (`from-*`, `via-*`, `to-*`, `bg-gradient-to-*`,\n * `bg-linear-to-*`). The transformer reads this map to extract\n * `colors / start / end` props at JSX-rewrite time. Regular non-\n * gradient atoms don't appear here.\n */\n gradientAtoms: Map<string, GradientAtomInfo>\n /**\n * Haptic metadata per atom for classes that emit a\n * `--rnwind-haptic` marker. The transformer reads this map to\n * strip the atom from the className and wire a mount-time or\n * press-time call into the `onHaptics` callback registered on\n * `<SchemeProvider>`.\n */\n hapticAtoms: Map<string, HapticRequest>\n /** Candidates oxide surfaced, in document order. */\n candidates: readonly string[]\n /** Every scheme the theme declares (or `['base']` when there are no `@variant` blocks). */\n schemes: readonly string[]\n /**\n * Responsive breakpoint name → minimum-width threshold (px). Pulled from\n * `--breakpoint-*` tokens in the compiled `:root` block, so both\n * Tailwind defaults (`sm`, `md`, `lg`, `xl`, `2xl`) and any user\n * override (e.g. `--breakpoint-3xl: 120rem`) land here. Used by the\n * style-builder to emit `registerBreakpoints({...})` in the manifest\n * so the runtime can filter `md:*` / `lg:*` atoms based on the\n * provider's `windowWidth`.\n */\n breakpoints: ReadonlyMap<string, number>\n}\n\n/**\n * Parses one source file's Tailwind usage into RN-ready style objects.\n *\n * Pipeline:\n * 1. `@tailwindcss/oxide` Scanner finds every Tailwind candidate.\n * 2. `@tailwindcss/node` compiler emits CSS for those candidates with\n * theme tokens inlined.\n * 3. lightningcss `transform` + typed visitor walks the emitted CSS:\n * - `style` rules → per-class RN-style object.\n * - `@keyframes` rules → per-name step map (Reanimated-ready).\n * - `@property` rules → custom-property initial values.\n *\n * One instance holds one Scanner + one lazily-built compiler so repeated\n * calls share upstream state. Theme CSS is fixed at construction — theme\n * edits require a new parser.\n */\nexport class TailwindParser {\n private readonly scanner: Scanner\n private compiler: TailwindCompiler | undefined\n private readonly themeSchemes: ThemeSchemeTable\n private readonly schemeAliases: ReadonlyMap<string, string>\n /**\n * Scheme names declared via `@custom-variant <name> …;`. A scheme\n * listed here but absent from {@link themeSchemes} (no `@variant`\n * override block) draws its values from the base `@theme` — the\n * standard Tailwind v4 \"light defaults + dark override\" shape.\n */\n private readonly customVariantSchemes: readonly string[]\n /**\n * Memoise `resolveCandidates` results by candidate-list fingerprint.\n * Fast Refresh hits this on every save: oxide's scan is cheap, but\n * the LightningCSS visitor walk over the compiled CSS is ~2ms per\n * file. A file whose `className` literals didn't change returns the\n * SAME candidate set, so the second `parseAtoms` call returns the\n * cached `ParsedOutput` — zero compile, zero visitor walk.\n *\n * Theme CSS changes build a new `TailwindParser` (from\n * `getRnwindState` detecting the hash shift), so this cache is\n * naturally invalidated — no stale-theme values leak through.\n */\n private readonly parseCache = new Map<string, ParsedOutput>()\n\n /**\n * Build a parser bound to a theme CSS source. `@theme` and\n * `@variant` blocks are extracted eagerly into a scheme table the\n * visitor consults when resolving `var(--x)` references.\n * @param config Parser configuration.\n */\n constructor(private readonly config: TailwindParserConfig) {\n this.themeSchemes = extractThemeVars(config.themeCss)\n this.schemeAliases = extractSchemeAliases(config.themeCss)\n this.customVariantSchemes = extractCustomVariantSchemes(config.themeCss)\n this.scanner = new Scanner({ sources: config.sources ? [...config.sources] : [] })\n }\n\n /**\n * Schemes declared by the user — the union of every `@custom-variant\n * <name>` declaration and every `@variant <name>` block, or just\n * `['base']` for themes without any. Used to decide how many\n * per-scheme buckets the per-atom resolver fills. Exposed publicly so\n * Metro integration can hand the names to the `.d.ts` generator\n * without a full parse.\n *\n * Both sources matter. `@variant` blocks alone miss the common\n * Tailwind v4 shape where the light palette sits in the base `@theme`\n * and only `@variant dark` overrides it: there `light` exists solely\n * as a `@custom-variant` and would otherwise be dropped, collapsing\n * every themed atom to a single bucket that can't switch.\n * `@custom-variant` order wins (it's where users enumerate their\n * schemes); any `@variant`-only scheme is appended after.\n * @returns Scheme names.\n */\n public get declaredSchemes(): readonly string[] {\n const ordered: string[] = []\n const seen = new Set<string>()\n for (const name of this.customVariantSchemes) {\n if (seen.has(name)) continue\n seen.add(name)\n ordered.push(name)\n }\n for (const name of this.themeSchemes.keys()) {\n if (name === BASE_SCHEME || seen.has(name)) continue\n seen.add(name)\n ordered.push(name)\n }\n return ordered.length > 0 ? ordered : [BASE_SCHEME]\n }\n\n /**\n * Build an effective var table for one scheme — base vars overridden by\n * variant vars. When the scheme IS `'base'` (no variants declared), the\n * base table is returned unchanged.\n * @param scheme Scheme name.\n * @returns Effective var name → value lookup for the scheme.\n */\n private effectiveVars(scheme: string): ReadonlyMap<string, string> {\n const base = this.themeSchemes.get(BASE_SCHEME)\n const variant = scheme === BASE_SCHEME ? undefined : this.themeSchemes.get(scheme)\n if (!variant) return base ?? new Map()\n // eslint-disable-next-line unicorn/no-useless-collection-argument\n const merged = new Map(base ?? [])\n for (const [k, v] of variant) merged.set(k, v)\n return merged\n }\n\n /**\n * Build the Tailwind compiler on first use and cache it. The theme CSS\n * gets a `theme(inline)` modifier on its `@import 'tailwindcss'` so\n * lightningcss sees resolved colors/lengths instead of `var()` refs.\n * @returns Cached compiler instance.\n */\n private async ensureCompiler(): Promise<TailwindCompiler> {\n if (this.compiler) return this.compiler\n const ready = compileReadyTheme(this.config.themeCss, this.themeSchemes)\n try {\n this.compiler = await compile(withInlineTheme(ready), {\n base: process.cwd(),\n onDependency: () => {},\n })\n } catch (error) {\n throw wrapThemeError(error)\n }\n return this.compiler\n }\n\n /**\n * Parse one file's Tailwind usage into the full typed result.\n * @param options Source content + extension.\n * @param options.content Raw source text to scan for Tailwind candidates.\n * @param options.extension File extension (`tsx`, `ts`, `jsx`, `js`) — feeds oxide's tokenizer.\n * @returns RN atoms, keyframes, property defaults, candidates list.\n */\n public async parseAtoms({ content, extension }: ParseOptions): Promise<ParsedOutput> {\n const candidates = this.scanner.getCandidatesWithPositions({ content, extension }).map((c) => c.candidate)\n const fingerprint = fingerprintCandidates(candidates)\n const cached = this.parseCache.get(fingerprint)\n if (cached) return cached\n const result = await this.resolveCandidates(candidates)\n this.parseCache.set(fingerprint, result)\n return result\n }\n\n /**\n * Scan every source file the Scanner was configured to watch via\n * `sources` and resolve the union of candidates in one pass. Used by\n * `UnionBuilder` at Metro startup (and on first worker access) to\n * populate the complete atom registry before ANY per-file transform\n * has run — so scheme files never ship a partial view of the theme.\n *\n * Hot-reload path uses `parseAtoms` for the per-file delta; this one\n * only runs once per parser instance (and whenever the parser is\n * rebuilt due to a theme CSS change).\n * @returns Full RN atoms, keyframes, property defaults for every\n * candidate discovered across the configured sources.\n */\n public async parseProject(): Promise<ParsedOutput> {\n const candidates = this.scanner.scan()\n return this.resolveCandidates(candidates)\n }\n\n /**\n * Compile + typed-visit the given candidate class names. Shared\n * implementation for both `parseAtoms` (single file) and\n * `parseProject` (whole project).\n * @param candidates Class-name candidates the oxide Scanner produced.\n * @returns Fully-typed parser result.\n */\n private async resolveCandidates(candidates: readonly string[]): Promise<ParsedOutput> {\n if (candidates.length === 0) return emptyOutput()\n const compiler = await this.ensureCompiler()\n let css: string\n try {\n css = compiler.build([...candidates])\n } catch (error) {\n throw wrapThemeError(error)\n }\n // Tailwind v4 emits opacity-suffixed themed colors as a pre-resolved\n // sRGB fallback PLUS a `@supports`-gated var()-based override:\n // border-color: color-mix(in srgb, #0A0A0A 20%, transparent);\n // @supports (color: color-mix(in lab, red, red)) {\n // border-color: color-mix(in oklab, var(--color-text) 20%, transparent);\n // }\n // Lightningcss takes the OUTER fallback (locked to whichever scheme\n // the compiler resolved first), and our per-scheme substitution\n // never gets a chance. Unwrap the @supports so the var()-based\n // declaration overrides the fallback in the same rule — lightningcss\n // emits the override as `unparsed` and the parser's themeVars-aware\n // path produces correct rgba per scheme.\n css = unwrapColorMixSupports(css)\n // `compiler.build(candidates)` memoizes across calls — it returns CSS for\n // every candidate the compiler has EVER seen in this process. To keep\n // parser output pure per-call we restrict outputs to this call's\n // candidates:\n // - atoms: match class selectors against `wanted`.\n // - keyframes: collect `animation-name` references during the style\n // walk, then filter the visited keyframes to referenced names.\n const wanted = new Set(candidates)\n const schemes = this.declaredSchemes\n // Tailwind's compiled CSS contains every theme token — including\n // ones imported from secondary CSS files (e.g. `@import\n // 'rnwind/css'`). Pull them out of the `:root` block so\n // `var(--duration-normal)` style references in unparsed declarations\n // resolve to literal values (`220ms`) instead of being passed through\n // to RN, which can't read CSS custom properties.\n const compiledTheme = extractRootCustomProperties(css)\n const schemeTables = new Map<string, ReadonlyMap<string, string>>()\n for (const scheme of schemes) {\n const merged = new Map(compiledTheme)\n for (const [k, v] of this.effectiveVars(scheme)) merged.set(k, v)\n schemeTables.set(scheme, merged)\n }\n\n const atoms = new Map<string, Record<string, RNStyle>>()\n const keyframes: ParsedOutput['keyframes'] = new Map()\n const referencedKeyframes = new Set<string>()\n const propertyDefaults: ParsedOutput['propertyDefaults'] = new Map()\n const gradientAtoms: ParsedOutput['gradientAtoms'] = new Map()\n const hapticAtoms: ParsedOutput['hapticAtoms'] = new Map()\n const breakpoints = new Map<string, number>()\n const { schemeAliases } = this\n\n try {\n transform({\n ...DEFAULT_TRANSFORM_OPTIONS,\n filename: 'rnwind-virtual.css',\n code: Buffer.from(css),\n visitor: {\n Rule: {\n style(rule) {\n for (const selector of rule.value.selectors) {\n const className = classNameFromSelector(selector)\n if (!className || !wanted.has(className)) continue\n processStyleRule(\n rule.value.declarations.declarations,\n className,\n { schemes, schemeTables, atoms, referencedKeyframes, schemeAliases, breakpoints },\n rule.value.rules ?? [],\n )\n // Gradient atoms are detected per rule: the parser's main\n // RN-style path drops the `--tw-gradient-*` customs as\n // unsupported, but for gradient utilities we want to\n // surface their role + resolved colour so the transformer\n // can rewrite `<LinearGradient className=\"...\">` into\n // `colors={...}` / `start={...}` / `end={...}` props.\n const gradient = detectGradientAtom(rule.value.declarations.declarations)\n if (gradient) gradientAtoms.set(className, gradient)\n // Haptics may live on the rule directly OR inside a\n // nested pseudo (e.g. `&:active` for `active:haptic-*`).\n // Inspect both so `active:haptic-medium` registers.\n const hapticDecls: LcDeclaration[] = [...rule.value.declarations.declarations]\n for (const nested of rule.value.rules ?? []) hapticDecls.push(...collectNestedDecls(nested))\n const haptic = detectHapticAtom(hapticDecls)\n if (haptic) hapticAtoms.set(className, haptic)\n }\n },\n keyframes(rule) {\n const name = keyframesName(rule.value.name)\n if (!name) return\n const steps: KeyframeStep[] = []\n const baseTable = schemeTables.get(BASE_SCHEME) ?? schemeTables.get(schemes[0] ?? BASE_SCHEME)\n for (const frame of rule.value.keyframes) {\n const offset = keyframeSelectorOffset(frame.selectors)\n if (!offset) continue\n const style: RNStyle = {}\n const frameDecls = frame.declarations.declarations ?? []\n for (const decl of frameDecls) {\n for (const [key, value] of declarationToRnEntries(decl, baseTable)) style[key] = value\n }\n steps.push({ offset, style })\n }\n keyframes.set(name, { name, steps })\n },\n property(rule) {\n const initial = serializeInitialValue(rule.value.initialValue)\n if (initial !== null) propertyDefaults.set(rule.value.name, initial)\n },\n },\n },\n })\n } catch (error) {\n throw wrapThemeError(error)\n }\n\n // Prune keyframes to those actually referenced by this call's atoms.\n for (const name of keyframes.keys()) {\n if (!referencedKeyframes.has(name)) keyframes.delete(name)\n }\n\n return { atoms, keyframes, propertyDefaults, gradientAtoms, hapticAtoms, candidates: [...candidates], schemes, breakpoints }\n }\n}\n\n/**\n * Wrap an error from `@tailwindcss/node`'s compiler or `lightningcss`'s\n * transform with a `rnwind:` prefix so the user sees a clear \"this came\n * from your theme CSS\" signal in Metro's stack trace. Preserves the\n * original error as `cause` so downstream tooling (Sentry, Metro\n * symbolication) can still inspect it.\n * @param error Underlying error from the compiler or transform.\n * @returns Prefixed Error with the original attached as `cause`.\n */\nfunction wrapThemeError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error)\n const wrapped = new Error(\n `rnwind: failed to compile theme CSS — ${message}\\n` +\n `Check your global.css for unbalanced braces, unknown @utility / @variant declarations, ` +\n `or unsupported color functions. Run \\`bun run --cwd packages/rnwind code-check\\` if this is the rnwind repo itself.`,\n )\n if (error instanceof Error) (wrapped as { cause?: unknown }).cause = error\n return wrapped\n}\n\n/**\n * Fingerprint a candidate list for `parseCache` lookup. Sorting gives\n * the same key regardless of source order (the set of candidates is\n * what drives `resolveCandidates`'s output, not their order).\n * @param candidates Raw oxide-scanner output for one file.\n * @returns Canonical string key.\n */\nfunction fingerprintCandidates(candidates: readonly string[]): string {\n if (candidates.length === 0) return ''\n if (candidates.length === 1) return candidates[0]!\n return [...candidates].toSorted((a, b) => a.localeCompare(b)).join('\\0')\n}\n\n/**\n * Empty sentinel returned when oxide finds no candidates in the file.\n * @returns Zero-atom result with only the `base` scheme declared.\n */\nfunction emptyOutput(): ParsedOutput {\n return {\n atoms: new Map(),\n keyframes: new Map(),\n propertyDefaults: new Map(),\n gradientAtoms: new Map(),\n hapticAtoms: new Map(),\n candidates: [],\n schemes: [BASE_SCHEME],\n breakpoints: new Map(),\n }\n}\n\n/**\n * Upgrade `@import 'tailwindcss'` (single- or double-quoted, with or\n * without an existing `theme(...)` clause) to `@import 'tailwindcss'\n * theme(inline)`. User-authored `theme(...)` clauses are preserved so\n * overrides win.\n * @param css Theme CSS source.\n * @returns CSS with the Tailwind import upgraded.\n */\nfunction withInlineTheme(css: string): string {\n return css.replaceAll(/(@import\\s+['\"]tailwindcss['\"])(?!\\s*theme\\()/g, '$1 theme(inline)')\n}\n\n/**\n * Collect rule-local custom-property writes (`--tw-translate-x`,\n * `--tw-scale-x`, `--tw-skew-y`, …). Tailwind v4 uses these as\n * composable transform tokens that `translate: var(--tw-translate-x)\n * var(--tw-translate-y)` then references. Surfacing them as theme vars\n * lets the declaration converter resolve the references as if they\n * were declared in `@theme`.\n * @param decls All declarations from one lightningcss style rule.\n * @returns Map from custom-property name (with leading `--`) to its raw value.\n */\nfunction collectRuleLocalVars(decls: readonly { property: string; value: unknown }[]): ReadonlyMap<string, string> {\n const out = new Map<string, string>()\n for (const decl of decls) {\n if (decl.property !== 'custom') continue\n const custom = decl.value as { name: { name: string } | string; value?: readonly TokenOrValue[] }\n const rawName = typeof custom.name === 'string' ? custom.name : custom.name.name\n if (!rawName.startsWith('--tw-')) continue\n if (!custom.value) continue\n const text = serializeTokens(custom.value).trim()\n if (text.length > 0) out.set(rawName, text)\n }\n return out\n}\n\ninterface StyleRuleContext {\n schemes: readonly string[]\n schemeTables: ReadonlyMap<string, ReadonlyMap<string, string>>\n atoms: Map<string, Record<string, RNStyle>>\n referencedKeyframes: Set<string>\n schemeAliases: ReadonlyMap<string, string>\n /**\n * Mutable breakpoint registry — `applyMediaRule` populates this as it\n * walks responsive variant atoms. The driving signal is the `@media\n * (width >= Xrem)` condition on the nested rule. Result lives on\n * {@link ParsedOutput.breakpoints}.\n */\n breakpoints: Map<string, number>\n}\n\n/**\n * Process one matched style rule for a given class name: fold its\n * declarations into the per-scheme buckets, detect referenced keyframes,\n * then apply Tailwind's composable transform post-pass.\n * @param declarations Declarations from one lightningcss style rule.\n * @param className Class name this rule's selectors matched.\n * @param ctx Parser-call-wide context (schemes, tables, output maps).\n * @param nestedRules Nested style rules (Tailwind variant prefixes like `dark:`\n * wrap their decls in `&:where(.<scheme>, .<scheme> *)` nested rules).\n */\nfunction processStyleRule(\n declarations: readonly LcDeclaration[],\n className: string,\n ctx: StyleRuleContext,\n nestedRules: readonly unknown[] = [],\n): void {\n const bucket = ctx.atoms.get(className) ?? {}\n const ruleLocalVars = collectRuleLocalVars(declarations)\n const ruleSchemeTables = mergeRuleVars(ctx.schemeTables, ruleLocalVars)\n // Detect active:/focus: prefix on the class name. Tailwind emits the\n // actual decls inside `&:active { … }` / `&:focus { … }`, and the\n // OUTER rule has zero direct decls — so the existing per-scheme phase\n // below produces an empty bucket. We collect the inner decls into the\n // base scheme and tag the bucket with `__state` so the style-builder\n // can route the atom into `precomputeHoist`'s state buckets when the\n // interactive state.\n const interactiveState = classNameStateOf(className)\n // Phase 1: outer declarations apply to EVERY scheme (unconditional\n // utilities like `opacity-50`).\n for (const decl of declarations) {\n applyDeclarationToBucket(decl, bucket, ctx.schemes, ruleSchemeTables)\n const animationRef = pickAnimationName(decl)\n if (animationRef) ctx.referencedKeyframes.add(animationRef)\n }\n applyComposedTransform(bucket, ctx.schemes, ruleLocalVars)\n applyComposedShadow(bucket, ctx.schemes, ruleLocalVars)\n applyComposedRing(bucket, ctx.schemes, ruleLocalVars)\n // Phase 2: nested rules — three orthogonal flavours, dispatched on\n // the lightningcss node `type`:\n // - `media`: Tailwind v4 responsive variants (`sm:`, `md:`, …) wrap\n // declarations in `@media (width >= Xrem)`. Decls fold into every\n // scheme; the atom's name carries the breakpoint association so\n // the runtime can gate it on `windowWidth`.\n // - `style` + `interactiveState`: `&:active` / `&:focus` pseudo\n // decls (every scheme — interaction is theme-orthogonal).\n // - `style` (default): Tailwind v4 scheme variants\n // (`&:where(.<scheme>, .<scheme> *)`).\n for (const scheme of ctx.schemes) bucket[scheme] = bucket[scheme] ?? {}\n for (const nested of nestedRules) {\n const node = nested as { type?: string }\n if (node?.type === 'media') {\n applyMediaRule(nested, className, bucket, ctx, ruleSchemeTables, ruleLocalVars)\n continue\n }\n if (interactiveState) {\n applyInteractiveNestedRule(nested, bucket, ctx, ruleSchemeTables, ruleLocalVars)\n } else {\n applyNestedSchemeRule(nested, bucket, ctx, ruleSchemeTables, ruleLocalVars)\n }\n }\n normalizeLineHeightToPx(bucket, ctx.schemes)\n if (interactiveState) (bucket as Record<string, unknown>).__state = interactiveState\n ctx.atoms.set(className, bucket)\n}\n\n/** Recognised interactive variant prefixes. RN can drive both at runtime. */\nconst INTERACTIVE_PREFIXES = new Set(['active', 'focus'])\n\n/**\n * Inspect a class name for a leading interactive variant prefix. The\n * Tailwind compiler emits `active:bg-sky-700` literally (backslash-\n * escaped for CSS), and that name is the same string the parser sees.\n * So a cheap `split(':')` on the head is enough — no need to parse the\n * pseudo-class out of the selector itself.\n * @param className Tailwind utility class (e.g. `active:bg-sky-700`).\n * @returns The interactive state prefix (`'active'` / `'focus'`), or null when none.\n */\nfunction classNameStateOf(className: string): 'active' | 'focus' | null {\n const colon = className.indexOf(':')\n if (colon === -1) return null\n const prefix = className.slice(0, colon)\n if (!INTERACTIVE_PREFIXES.has(prefix)) return null\n return prefix as 'active' | 'focus'\n}\n\n/**\n * Pull the `min-width` threshold (px) out of a `@media (width >= Xrem)`\n * lightningcss node. Tailwind v4 emits exactly this shape for every\n * responsive variant — `>= 40rem` for `sm`, `>= 48rem` for `md`, etc.\n * Returns null for any other media condition (`hover`, `prefers-*`,\n * range bounds we don't model) so the caller can skip non-responsive\n * media wrappers without breaking.\n * @param nested A lightningcss `media` rule node.\n * @returns Threshold in px, or null when the condition isn't a simple\n * width-min check.\n */\nfunction readMediaMinWidthPx(nested: unknown): number | null {\n if (typeof nested !== 'object' || nested === null) return null\n const node = nested as { type?: string; value?: { query?: { mediaQueries?: readonly unknown[] } } }\n if (node.type !== 'media') return null\n const queries = node.value?.query?.mediaQueries\n if (queries?.length !== 1) return null\n const query = queries[0] as {\n condition?: {\n type?: string\n value?: {\n type?: string\n name?: string\n operator?: string\n value?: { type?: string; value?: { type?: string; value?: { unit?: string; value?: number } } }\n }\n }\n }\n const {condition} = query\n if (condition?.type !== 'feature') return null\n const feature = condition.value\n if (feature?.type !== 'range' || feature.name !== 'width') return null\n if (feature.operator !== 'greater-than-equal') return null\n const length = feature.value\n if (length?.type !== 'length') return null\n const inner = length.value?.value\n if (!inner || typeof inner.value !== 'number') return null\n if (inner.unit === 'rem') return inner.value * 16\n if (inner.unit === 'px') return inner.value\n return null\n}\n\n/**\n * Pull the leading `prefix:` segment off a className. `md:bg-red-500`\n * → `'md'`. Returns null for atoms without a colon (the common case)\n * or for empty prefixes.\n * @param className Atom name.\n * @returns Prefix or null.\n */\nfunction leadingPrefix(className: string): string | null {\n const colon = className.indexOf(':')\n if (colon <= 0) return null\n return className.slice(0, colon)\n}\n\n/**\n * Fold a Tailwind v4 responsive `@media (width >= Xrem)` nested rule\n * into every scheme's bucket and record the breakpoint threshold\n * (`md` → 768) on the parser-call context. The runtime later gates the\n * atom on `windowWidth` against this threshold via the prefix on the\n * atom's class name.\n *\n * Read directly from the media condition rather than from compiled\n * `--breakpoint-*` `:root` tokens because Tailwind's `theme(inline)`\n * mode strips those — the only authoritative source for the actual\n * thresholds Tailwind generated is the `@media` query itself.\n * @param nested One nested `media` node from `rule.value.rules`.\n * @param className Outer rule's class name (carries the breakpoint prefix).\n * @param bucket Per-scheme style map for the atom.\n * @param ctx Parser-call-wide context.\n * @param ruleSchemeTables Per-scheme var tables (outer rule's merged table).\n * @param ruleLocalVars Outer rule's `--tw-*` vars (inherited for inner decls).\n */\nfunction applyMediaRule(\n nested: unknown,\n className: string,\n bucket: Record<string, RNStyle>,\n ctx: StyleRuleContext,\n ruleSchemeTables: ReadonlyMap<string, ReadonlyMap<string, string>>,\n ruleLocalVars: ReadonlyMap<string, string>,\n): void {\n const decls = collectNestedDecls(nested)\n if (decls.length === 0) return\n const minWidth = readMediaMinWidthPx(nested)\n const prefix = leadingPrefix(className)\n if (minWidth !== null && prefix !== null) ctx.breakpoints.set(prefix, minWidth)\n for (const scheme of ctx.schemes) {\n const table = ruleSchemeTables.get(scheme)\n const schemeBucket = bucket[scheme] ?? {}\n for (const decl of decls) {\n for (const [key, value] of declarationToRnEntries(decl, table)) schemeBucket[key] = value\n const animationRef = pickAnimationName(decl)\n if (animationRef) ctx.referencedKeyframes.add(animationRef)\n }\n const nestedLocalVars = new Map(ruleLocalVars)\n for (const [k, v] of collectRuleLocalVars(decls)) nestedLocalVars.set(k, v)\n applyComposedTransformToScheme(schemeBucket, nestedLocalVars)\n applyComposedShadowToScheme(schemeBucket, nestedLocalVars)\n bucket[scheme] = schemeBucket\n }\n}\n\n/**\n * Fold one nested rule from an interactive (`active:` / `focus:`) atom\n * into every scheme's bucket. The Tailwind output for `active:bg-sky-700`\n * is `.active\\:bg-sky-700 { &:active { background-color: oklch(...) } }`\n * — the outer rule has zero\n * decls; the leaf lives three levels deep through pseudo + media. We\n * unwrap the pseudo and the media shell, take the inner decls, and\n * apply them across every scheme — interactivity is orthogonal to\n * theme. The bucket gets `__state: 'active' | 'focus'` set elsewhere.\n * @param nested One nested-rule node from `rule.value.rules`.\n * @param bucket Per-scheme style map for the atom.\n * @param ctx Parser-call-wide context.\n * @param ruleSchemeTables Per-scheme var tables (outer rule's merged table).\n * @param ruleLocalVars Outer rule's `--tw-*` vars (inherited for inner decls).\n */\nfunction applyInteractiveNestedRule(\n nested: unknown,\n bucket: Record<string, RNStyle>,\n ctx: StyleRuleContext,\n ruleSchemeTables: ReadonlyMap<string, ReadonlyMap<string, string>>,\n ruleLocalVars: ReadonlyMap<string, string>,\n): void {\n const decls = collectNestedDecls(nested)\n if (decls.length === 0) return\n for (const scheme of ctx.schemes) {\n const table = ruleSchemeTables.get(scheme)\n const schemeBucket = bucket[scheme] ?? {}\n for (const decl of decls) {\n for (const [key, value] of declarationToRnEntries(decl, table)) schemeBucket[key] = value\n const animationRef = pickAnimationName(decl)\n if (animationRef) ctx.referencedKeyframes.add(animationRef)\n }\n const nestedLocalVars = new Map(ruleLocalVars)\n for (const [k, v] of collectRuleLocalVars(decls)) nestedLocalVars.set(k, v)\n applyComposedTransformToScheme(schemeBucket, nestedLocalVars)\n applyComposedShadowToScheme(schemeBucket, nestedLocalVars)\n bucket[scheme] = schemeBucket\n }\n}\n\n/**\n * Recursively flatten a nested style/media rule into its leaf\n * declarations. Tailwind wraps interactive pseudo decls in `style`\n * nodes (`&:active`, `&:focus`); the walk unwraps them and any\n * `@media` shell around them.\n * @param nested A nested rule node.\n * @returns Every declaration found in the nested subtree.\n */\nfunction collectNestedDecls(nested: unknown): readonly LcDeclaration[] {\n if (typeof nested !== 'object' || nested === null) return []\n const node = nested as { type?: string; value?: NestedStyleRule & { rules?: readonly unknown[] } }\n if (!node.value) return []\n // `style` (with `&:active`) and `media` wrappers both surface the\n // actual decls. lightningcss surfaces inner-only declarations as a\n // `nested-declarations` node — flatten that too.\n if (node.type === 'nested-declarations') return [...(node.value.declarations?.declarations ?? [])]\n if (node.type !== 'style' && node.type !== 'media') return []\n const out: LcDeclaration[] = [...(node.value.declarations?.declarations ?? [])]\n for (const child of node.value.rules ?? []) out.push(...collectNestedDecls(child))\n return out\n}\n\n/**\n * Fold one nested style rule (Tailwind's `&:where(.<scheme>, .<scheme> *)`\n * pattern) into the scheme bucket its selector targets. Rules we can't\n * attribute to a single scheme are skipped — they'd only ever reach the\n * bucket via CSS cascading in a browser, which doesn't translate to RN.\n * @param nested One nested-rule node from `rule.value.rules`.\n * @param bucket Per-scheme style map for the atom.\n * @param ctx Parser-call-wide context.\n * @param ruleSchemeTables Per-scheme var tables (outer rule's merged table).\n * @param ruleLocalVars Outer rule's `--tw-*` vars (inherited for inner decls).\n */\nfunction applyNestedSchemeRule(\n nested: unknown,\n bucket: Record<string, RNStyle>,\n ctx: StyleRuleContext,\n ruleSchemeTables: ReadonlyMap<string, ReadonlyMap<string, string>>,\n ruleLocalVars: ReadonlyMap<string, string>,\n): void {\n if (typeof nested !== 'object' || nested === null) return\n const node = nested as { type?: string; value?: NestedStyleRule }\n if (node.type !== 'style' || !node.value) return\n const targetScheme = detectNestedScheme(node.value.selectors, ctx.schemes, ctx.schemeAliases)\n if (!targetScheme) return\n const innerDecls = node.value.declarations?.declarations ?? []\n const table = ruleSchemeTables.get(targetScheme)\n const schemeBucket = bucket[targetScheme] ?? {}\n for (const decl of innerDecls) {\n for (const [key, value] of declarationToRnEntries(decl, table)) schemeBucket[key] = value\n const animationRef = pickAnimationName(decl)\n if (animationRef) ctx.referencedKeyframes.add(animationRef)\n }\n // Apply the composed-transform + shadow post-passes to just this one\n // scheme, so nested `--tw-*` custom prop writes compose correctly.\n const nestedLocalVars = new Map(ruleLocalVars)\n for (const [k, v] of collectRuleLocalVars(innerDecls)) nestedLocalVars.set(k, v)\n applyComposedTransformToScheme(schemeBucket, nestedLocalVars)\n applyComposedShadowToScheme(schemeBucket, nestedLocalVars)\n bucket[targetScheme] = schemeBucket\n}\n\n/**\n * Shape of a lightningcss style rule as it appears inside `rule.value.rules`.\n * Loose typing because the full type is a sprawling discriminated union\n * we only need one shape from.\n */\ninterface NestedStyleRule {\n selectors: readonly (readonly unknown[])[]\n declarations?: { declarations: readonly LcDeclaration[] }\n}\n\n/**\n * Detect which scheme a nested `&:where(.<scheme>, .<scheme> *)`\n * selector targets. Recognises both the rnwind-default literal class\n * (`.dark`) and any user-declared `@custom-variant` selector class\n * (`.scheme-dark`), via the `aliases` map built from the theme CSS.\n * @param selectors Nested rule's selector lists.\n * @param schemes Declared scheme names.\n * @param aliases Class-name → scheme-name map from `@custom-variant` decls.\n * @returns Matching scheme name, or null when the selector isn't scheme-scoped.\n */\nfunction detectNestedScheme(\n selectors: readonly (readonly unknown[])[],\n schemes: readonly string[],\n aliases: ReadonlyMap<string, string>,\n): string | null {\n const known = new Set(schemes)\n for (const selector of selectors) {\n const found = findSchemeInSelector(selector, schemes, known, aliases)\n if (found) return found\n }\n return null\n}\n\n/**\n * Inner half of {@link detectNestedScheme} — extracted so each function\n * stays under the cognitive-complexity cap.\n * @param selector One compound selector (sequence of simple parts).\n * @param schemes Declared scheme names (for recursion).\n * @param known Set form of `schemes` for O(1) lookups.\n * @param aliases Class-name → scheme-name map from `@custom-variant` decls.\n * @returns Matching scheme name, or null.\n */\nfunction findSchemeInSelector(\n selector: readonly unknown[],\n schemes: readonly string[],\n known: ReadonlySet<string>,\n aliases: ReadonlyMap<string, string>,\n): string | null {\n for (const part of selector) {\n const direct = matchSchemeClass(part, known, aliases)\n if (direct) return direct\n const nested = matchSchemeInWhere(part, schemes, aliases)\n if (nested) return nested\n }\n return null\n}\n\n/**\n * Match a `.scheme` class part against the declared schemes (literal\n * match) or against the `@custom-variant` alias map (e.g. `.scheme-dark`\n * → `dark`).\n * @param part One simple selector part.\n * @param known Declared scheme names.\n * @param aliases Class-name → scheme-name map from `@custom-variant` decls.\n * @returns Matching scheme name, or null.\n */\nfunction matchSchemeClass(part: unknown, known: ReadonlySet<string>, aliases: ReadonlyMap<string, string>): string | null {\n if (typeof part !== 'object' || part === null) return null\n const node = part as { type?: string; name?: string }\n if (node.type !== 'class') return null\n if (typeof node.name !== 'string') return null\n if (known.has(node.name)) return node.name\n return aliases.get(node.name) ?? null\n}\n\n/**\n * Match a `:where(.scheme, …)` pseudo-class wrapper and recurse into\n * its inner selectors.\n * @param part One simple selector part.\n * @param schemes Declared scheme names.\n * @param aliases Class-name → scheme-name map from `@custom-variant` decls.\n * @returns Matching scheme name from inside the `where`, or null.\n */\nfunction matchSchemeInWhere(part: unknown, schemes: readonly string[], aliases: ReadonlyMap<string, string>): string | null {\n if (typeof part !== 'object' || part === null) return null\n const node = part as { type?: string; kind?: string; selectors?: readonly (readonly unknown[])[] }\n if (node.type !== 'pseudo-class' || node.kind !== 'where' || !node.selectors) return null\n return detectNestedScheme(node.selectors, schemes, aliases)\n}\n\n/**\n * Per-scheme version of `applyComposedTransform` — synthesize a\n * `transform` array into a SINGLE scheme's style from its rule-local\n * `--tw-*` vars.\n * @param style Scheme-specific style map.\n * @param ruleLocalVars Combined outer+nested `--tw-*` vars.\n */\nfunction applyComposedTransformToScheme(style: RNStyle, ruleLocalVars: ReadonlyMap<string, string>): void {\n const composed = composeTransformFromVars(ruleLocalVars)\n if (composed.length === 0) return\n delete style.translate\n delete style.scale\n delete style.rotate\n style.transform = composed\n}\n\n/**\n * Per-scheme version of `applyComposedShadow` — synthesize RN shadow\n * longhands into a SINGLE scheme's style from its `--tw-shadow` custom\n * prop.\n * @param style Scheme-specific style map.\n * @param ruleLocalVars Combined outer+nested `--tw-*` vars.\n */\nfunction applyComposedShadowToScheme(style: RNStyle, ruleLocalVars: ReadonlyMap<string, string>): void {\n const rawShadow = ruleLocalVars.get('--tw-shadow')\n const rawShadowColor = ruleLocalVars.get('--tw-shadow-color')\n if (!rawShadow && rawShadowColor) {\n const color = resolveCustomColorString(rawShadowColor)\n if (!color) return\n delete style.boxShadow\n style.shadowColor = color\n return\n }\n if (!rawShadow) return\n const shadow = parseFirstShadow(rawShadow)\n if (!shadow) return\n delete style.boxShadow\n style.shadowColor = shadow.color\n style.shadowOffset = { width: shadow.x, height: shadow.y }\n style.shadowOpacity = shadow.opacity\n style.shadowRadius = shadow.blur\n style.elevation = Math.max(1, Math.min(24, Math.round(Math.max(shadow.y, shadow.blur / 2))))\n}\n\n/**\n * Tailwind v4's `shadow-*` utilities write a `--tw-shadow` custom prop\n * holding the actual `<x> <y> <blur> <spread> <color>` shadow values,\n * then a `box-shadow: var(--tw-shadow)` declaration RN can't use. This\n * post-pass parses `--tw-shadow` and emits the RN shadow longhands —\n * `shadowColor` / `shadowOffset` / `shadowOpacity` / `shadowRadius` /\n * `elevation` — so iOS and Android both render the shadow.\n * @param bucket Per-scheme style map for the atom.\n * @param schemes Scheme names active for this parse.\n * @param ruleLocalVars Rule-local `--tw-*` vars.\n */\nfunction applyComposedShadow(\n bucket: Record<string, RNStyle>,\n schemes: readonly string[],\n ruleLocalVars: ReadonlyMap<string, string>,\n): void {\n const rawShadow = ruleLocalVars.get('--tw-shadow')\n const rawShadowColor = ruleLocalVars.get('--tw-shadow-color')\n // Color-only utility (`shadow-red-50`, `shadow-gray-200`, …): emit\n // `shadowColor` + `shadowOpacity: 1` so the explicit color overrides\n // the size utility's 0.1 alpha fallback (matches Tailwind v4 web,\n // where setting `--tw-shadow-color` swaps in a solid color). Offset /\n // blur / elevation come from the partner size utility's atom.\n if (!rawShadow && rawShadowColor) {\n const color = resolveCustomColorString(rawShadowColor)\n if (!color) return\n for (const scheme of schemes) {\n const style = bucket[scheme] ?? {}\n delete style.boxShadow\n style.shadowColor = color\n bucket[scheme] = style\n }\n return\n }\n if (!rawShadow) return\n const shadow = parseFirstShadow(rawShadow)\n if (!shadow) return\n for (const scheme of schemes) {\n const style = bucket[scheme] ?? {}\n delete style.boxShadow\n style.shadowColor = shadow.color\n style.shadowOffset = { width: shadow.x, height: shadow.y }\n style.shadowOpacity = shadow.opacity\n style.shadowRadius = shadow.blur\n style.elevation = Math.max(1, Math.min(24, Math.round(Math.max(shadow.y, shadow.blur / 2))))\n bucket[scheme] = style\n }\n}\n\n/**\n * Synthesize RN ring styles from Tailwind's `--tw-ring-color` /\n * `--tw-ring-shadow` composable custom props. RN has no native ring;\n * we approximate by writing `borderColor` + `borderWidth` so the\n * outline is visible. Atoms that ALREADY set borderColor (e.g. paired\n * with `border-2`) keep their value — the ring just won't override.\n * @param bucket Per-scheme style map for the atom.\n * @param schemes Scheme names active for this parse.\n * @param ruleLocalVars Rule-local `--tw-*` vars.\n */\nfunction applyComposedRing(\n bucket: Record<string, RNStyle>,\n schemes: readonly string[],\n ruleLocalVars: ReadonlyMap<string, string>,\n): void {\n const ringColor = ruleLocalVars.get('--tw-ring-color')\n if (!ringColor) return\n const color = resolveCustomColorString(ringColor)\n if (!color) return\n for (const scheme of schemes) {\n const style = bucket[scheme] ?? {}\n if (!('borderColor' in style)) style.borderColor = color\n bucket[scheme] = style\n }\n}\n\n/**\n * Resolve a CSS color string (`oklch(0.971 0.013 17.38)`, `#ff0000`,\n * `rgb(0 0 0 / 0.1)`) to the hex string RN's `shadowColor` accepts.\n * Wraps culori's parser via {@link parseCssColorToHex}.\n * @param raw Raw color text from a `--tw-shadow-color` custom prop.\n * @returns `#rrggbb` string, or null when culori can't parse it.\n */\nfunction resolveCustomColorString(raw: string): string | null {\n const text = unwrapVariableFallback(raw).trim()\n if (text.length === 0) return null\n if (text.startsWith('#')) return text\n return parseCssColorToHex(text)\n}\n\n/**\n * Parse any CSS color expression into an `#rrggbb` string via culori.\n * Falls back to null when culori doesn't recognize the format.\n * @param text CSS color value.\n * @returns Hex string, or null.\n */\nfunction parseCssColorToHex(text: string): string | null {\n return formatHexSafe(text)\n}\n\n/**\n * Format a CSS color via culori.\n * @param text CSS color value.\n * @returns `#rrggbb` string when culori succeeds, else null.\n */\nfunction formatHexSafe(text: string): string | null {\n try {\n const hex = culoriFormatHex(text)\n return typeof hex === 'string' ? hex : null\n } catch {\n return null\n }\n}\n\ninterface ParsedShadow {\n x: number\n y: number\n blur: number\n spread: number\n color: string\n opacity: number\n}\n\n/**\n * Parse the first shadow from a `--tw-shadow` custom-property value.\n * The value is a comma-separated list of shadows; each shadow is\n * `<x> <y> <blur> <spread> <color>`. RN renders only one shadow per\n * view, so we keep the first.\n * @param raw Raw `--tw-shadow` text (post-substitution).\n * @returns Parsed shadow, or null when the shape is unrecognized.\n */\nfunction parseFirstShadow(raw: string): ParsedShadow | null {\n // Split on top-level commas (parens-aware) so colors like `rgba(0,0,0,0.5)`\n // don't fragment the list.\n const head = topLevelSplit(raw, ',')[0]?.trim()\n if (!head) return null\n const { lengths, remainder } = extractShadowLengths(head)\n const [x = 0, y = 0, blur = 0, spread = 0] = lengths\n const { color, opacity } = parseShadowColor(remainder.trim())\n return { x, y, blur, spread, color, opacity }\n}\n\n/**\n * Pull the first 4 numeric tokens out of a shadow expression and return\n * them alongside the remaining text (which is the color expression).\n * Shadow shape: `<x> <y> <blur> <spread> <color>` — tokens may be bare\n * (`0`), px-dimensioned (`1px`), or rem/em/%.\n * @param head Single shadow expression (one comma-separated entry).\n * @returns Pixel lengths + the remainder text (color expression).\n */\nfunction extractShadowLengths(head: string): { lengths: number[]; remainder: string } {\n // Take ONLY the leading run of length tokens, stopping at the first\n // non-length token (the color). A previous global digit-regex scanned\n // the whole string, so a <4-length shadow like `0 1px 1px rgb(0 0 0 /\n // 0.05)` stole a digit out of the color expression — corrupting the\n // alpha (opacity) or a digit-leading hex. Whitespace-splitting can't\n // reach inside the color because we break as soon as a token isn't a\n // bare/`px`/`rem`/`em`/`%` length.\n // Unambiguous integer-or-decimal (no `\\d*\\.?\\d+` overlap) so there's no\n // super-linear backtracking on long digit runs.\n const isLength = /^-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|%)?$/\n const parts = head.split(/\\s+/)\n const lengths: number[] = []\n let index = 0\n while (index < parts.length && lengths.length < 4 && isLength.test(parts[index]!)) {\n lengths.push(parseLengthToken(parts[index]!))\n index += 1\n }\n return { lengths, remainder: parts.slice(index).join(' ') }\n}\n\n/**\n * Coerce one shadow length token into a pixel number. Accepts bare\n * integers (`0`), `Npx`, and `Nrem` — every shape Tailwind's\n * `--tw-shadow` value uses.\n * @param token Token text.\n * @returns Pixel number.\n */\nfunction parseLengthToken(token: string): number {\n if (token.endsWith('rem')) return Number(token.slice(0, -3)) * 16\n if (token.endsWith('em')) return Number(token.slice(0, -2)) * 16\n if (token.endsWith('px')) return Number(token.slice(0, -2))\n if (token.endsWith('%')) return Number(token.slice(0, -1))\n return Number(token)\n}\n\n/**\n * Extract a color string + extracted alpha from a shadow's color\n * expression. Supports `rgb(...)` / `rgba(...)` / `#rrggbb` / hex with\n * alpha / theme-resolved CSS color strings.\n * @param expr Color expression text.\n * @returns Color string for `shadowColor` + alpha for `shadowOpacity`.\n */\nfunction parseShadowColor(expr: string): { color: string; opacity: number } {\n const working = unwrapVariableFallback(expr).trim()\n if (working.length === 0) return { color: '#000', opacity: 0.1 }\n const rgba = parseRgbaExpression(working)\n if (rgba) return rgba\n if (working.startsWith('#')) return { color: working, opacity: 1 }\n return { color: '#000', opacity: 0.1 }\n}\n\n/**\n * Strip the `var(--name, fallback)` wrapper from a CSS value. Tailwind\n * wraps shadow colors as `var(--tw-shadow-color, rgb(0 0 0 / 0.1))`,\n * and when the var is unresolved we want the fallback.\n * @param expr Raw CSS value.\n * @returns Inner fallback when wrapped, otherwise the input unchanged.\n */\nfunction unwrapVariableFallback(expr: string): string {\n const trimmed = expr.trim()\n if (!trimmed.startsWith('var(') || !trimmed.endsWith(')')) return trimmed\n const inner = trimmed.slice(4, -1)\n let depth = 0\n for (let index = 0; index < inner.length; index += 1) {\n const ch = inner[index]\n if (ch === '(') depth += 1\n else if (ch === ')') depth -= 1\n else if (ch === ',' && depth === 0) return inner.slice(index + 1)\n }\n return trimmed\n}\n\n/**\n * Parse an `rgb(r g b)` / `rgba(r,g,b,a)` / `rgb(r g b / a)` color\n * expression into a hex + alpha pair. Returns `null` when the shape\n * doesn't match.\n * @param text Expression text (already trimmed and unwrapped).\n * @returns Hex color + alpha, or null.\n */\nfunction parseRgbaExpression(text: string): { color: string; opacity: number } | null {\n const head = /^rgba?\\(([^)]+)\\)$/i.exec(text)\n if (!head) return null\n const inner = head[1]!.replaceAll(',', ' ').replaceAll('/', ' ')\n const tokens = inner.split(/\\s+/).filter((part) => part.length > 0)\n if (tokens.length < 3) return null\n const [r, g, b, alphaText] = tokens\n let opacity = 1\n if (typeof alphaText === 'string') {\n opacity = alphaText.endsWith('%') ? Number(alphaText.slice(0, -1)) / 100 : Number(alphaText)\n }\n const hex = `#${[r!, g!, b!]\n .map((n) =>\n Math.max(0, Math.min(255, Math.round(Number(n))))\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')}`\n return { color: hex, opacity }\n}\n\n/**\n * Split `text` at top-level occurrences of `delimiter`, treating\n * parentheses as nesting. Used to safely split shadow lists without\n * fragmenting `rgb(0, 0, 0, 0.5)` on its commas.\n * @param text Source text.\n * @param delimiter Single-character delimiter to split on.\n * @returns Parts of the text between top-level delimiters.\n */\nfunction topLevelSplit(text: string, delimiter: string): string[] {\n const parts: string[] = []\n let depth = 0\n let start = 0\n for (let index = 0; index < text.length; index += 1) {\n const ch = text[index]\n if (ch === '(') depth += 1\n else if (ch === ')') depth -= 1\n else if (ch === delimiter && depth === 0) {\n parts.push(text.slice(start, index))\n start = index + 1\n }\n }\n parts.push(text.slice(start))\n return parts\n}\n\n/**\n * Tailwind v4's `text-*` utilities emit `line-height` as a unitless\n * multiplier (`calc(2.5 / 2.25)` for `text-4xl`) that the browser\n * resolves against the element's `font-size`. RN's `lineHeight` is\n * always pixels — so when both `fontSize` and a multiplier-shaped\n * `lineHeight` (less than 10) land on the same atom, multiply through\n * to a pixel value. Atoms with only one of the two are left alone.\n * @param bucket Per-scheme style map for the atom.\n * @param schemes Scheme names active for this parse.\n */\nfunction normalizeLineHeightToPx(bucket: Record<string, RNStyle>, schemes: readonly string[]): void {\n for (const scheme of schemes) {\n const style = bucket[scheme]\n if (!style) continue\n const { fontSize } = style\n const { lineHeight } = style\n if (typeof fontSize !== 'number' || typeof lineHeight !== 'number') continue\n if (lineHeight >= 10) continue\n style.lineHeight = Math.round(fontSize * lineHeight * 10_000) / 10_000\n }\n}\n\n/**\n * Fold one declaration's resolved entries into every scheme's bucket on\n * the target atom.\n * @param decl Lightningcss declaration to convert.\n * @param bucket Per-scheme style map for the atom.\n * @param schemes Scheme names active for this parse.\n * @param ruleSchemeTables Per-scheme var tables (with rule-local overrides folded in).\n */\nfunction applyDeclarationToBucket(\n decl: LcDeclaration,\n bucket: Record<string, RNStyle>,\n schemes: readonly string[],\n ruleSchemeTables: ReadonlyMap<string, ReadonlyMap<string, string>>,\n): void {\n for (const scheme of schemes) {\n const schemeBucket = bucket[scheme] ?? {}\n for (const [key, value] of declarationToRnEntries(decl, ruleSchemeTables.get(scheme))) {\n schemeBucket[key] = value\n }\n bucket[scheme] = schemeBucket\n }\n}\n\n/**\n * Apply the composed-transform post-pass for a single atom: if any of\n * Tailwind's `--tw-translate-*` / `--tw-scale-*` / `--tw-skew-*` vars\n * were written, synthesize a single `transform` array and drop the\n * intermediate `translate`/`scale`/`rotate` shorthand entries.\n * @param bucket Per-scheme style map for the atom.\n * @param schemes Scheme names active for this parse.\n * @param ruleLocalVars Rule-local `--tw-*` vars.\n */\nfunction applyComposedTransform(\n bucket: Record<string, RNStyle>,\n schemes: readonly string[],\n ruleLocalVars: ReadonlyMap<string, string>,\n): void {\n const composed = composeTransformFromVars(ruleLocalVars)\n if (composed.length === 0) return\n for (const scheme of schemes) {\n const schemeBucket = bucket[scheme] ?? {}\n delete schemeBucket.translate\n delete schemeBucket.scale\n delete schemeBucket.rotate\n schemeBucket.transform = composed\n bucket[scheme] = schemeBucket\n }\n}\n\n/**\n * Synthesize an RN `transform` array from Tailwind v4's composable\n * `--tw-translate-x/y`, `--tw-scale-x/y`, `--tw-skew-x/y`, and\n * `--tw-rotate-x/y/z` custom properties. Returns an empty array when\n * none of those props were written, letting the caller skip the\n * post-pass.\n * @param ruleVars Rule-local `--tw-*` vars collected from the style rule.\n * @returns RN transform operations (possibly empty).\n */\nfunction composeTransformFromVars(ruleVars: ReadonlyMap<string, string>): readonly Record<string, string | number>[] {\n const ops: Record<string, string | number>[] = []\n addAxisOp(ops, 'translateX', ruleVars.get('--tw-translate-x'), resolveLengthExpression)\n addAxisOp(ops, 'translateY', ruleVars.get('--tw-translate-y'), resolveLengthExpression)\n addAxisOp(ops, 'scaleX', ruleVars.get('--tw-scale-x'), resolveNumberOrPercent)\n addAxisOp(ops, 'scaleY', ruleVars.get('--tw-scale-y'), resolveNumberOrPercent)\n addAxisOp(ops, 'skewX', ruleVars.get('--tw-skew-x'), extractAngleFromSkewFunction)\n addAxisOp(ops, 'skewY', ruleVars.get('--tw-skew-y'), extractAngleFromSkewFunction)\n return ops\n}\n\n/**\n * Push `{<key>: resolved(raw)}` into `ops` when `raw` is present and the\n * resolver returns non-null. Keeps {@link composeTransformFromVars}\n * below the cognitive complexity threshold.\n * @param ops Target array to mutate.\n * @param key RN transform op key (e.g. `'translateX'`).\n * @param raw Rule-local var value (possibly undefined).\n * @param resolve Value-resolver for this axis type.\n */\nfunction addAxisOp<T extends string | number>(\n ops: Record<string, string | number>[],\n key: string,\n raw: string | undefined,\n resolve: (text: string) => T | null,\n): void {\n if (!raw) return\n const value = resolve(raw)\n if (value !== null) ops.push({ [key]: value })\n}\n\n/**\n * Resolve a CSS length expression into the value a RN transform op\n * accepts — pixels as a number, or a percentage string preserved\n * verbatim. Supports the shapes Tailwind v4 emits into `--tw-translate-*`:\n *\n * - Direct lengths: `16px`, `1rem`, bare `42`.\n * - Percentages: `100%`, `-100%`.\n * - Flat calc: `calc(0.25rem * 52)`.\n * - Fractional calc: `calc(1 / 2 * 100%)` (→ `translate-x-1/2`).\n * - Nested calc with sign flip: `calc(calc(1 / 3 * 100%) * -1)` (→ `-translate-x-1/3`).\n *\n * Returns null when the expression mixes units (`calc(100% - 10px)` —\n * RN can't express those) or contains a token the evaluator can't\n * interpret; the transform op is simply skipped in that case.\n * @param text Length expression text.\n * @returns Pixel number, percentage string, or null when unrepresentable.\n */\nfunction resolveLengthExpression(text: string): number | string | null {\n const trimmed = text.trim()\n if (trimmed.length === 0) return null\n const evaluated = evaluateLengthExpr(trimmed)\n if (!evaluated) return null\n if (evaluated.unit === '%') return `${stripTrailingZeros(evaluated.value)}%`\n if (evaluated.unit === 'rem') return evaluated.value * 16\n return evaluated.value\n}\n\n/** Evaluated length + its unit. `''` means px or bare number. */\ninterface EvaluatedLength {\n value: number\n unit: '%' | 'rem' | ''\n}\n\n/**\n * Evaluate a CSS length expression to a `{value, unit}` pair.\n *\n * Strategy: detect the (at most one) unit suffix present in the text,\n * strip every `calc(` to `(`, strip the unit suffix from numeric tokens,\n * and run a small arithmetic evaluator. Mixed-unit expressions are\n * rejected because RN has no way to express `calc(100% - 10px)` in a\n * flat transform op.\n * @param text Raw CSS length expression (already trimmed).\n * @returns Evaluated length with its unit, or `null` when invalid.\n */\nfunction evaluateLengthExpr(text: string): EvaluatedLength | null {\n const units = detectUnits(text)\n if (units.length > 1) return null\n const unit = (units[0] ?? '') as EvaluatedLength['unit']\n const arithmetic = stripCalcAndUnits(text)\n const value = evaluateArithmetic(arithmetic)\n if (value === null || !Number.isFinite(value)) return null\n return { value, unit }\n}\n\n/**\n * Detect which length units appear in the expression. Multi-unit\n * expressions (e.g. `calc(100% - 1rem)`) aren't representable in one RN\n * transform op, so we reject them.\n * @param text Length expression.\n * @returns Sorted, deduped unit list found in the text.\n */\nfunction detectUnits(text: string): readonly string[] {\n const found = new Set<string>()\n if (/\\d%/.test(text)) found.add('%')\n if (/[\\d.]rem\\b/.test(text)) found.add('rem')\n if (/[\\d.]px\\b/.test(text)) found.add('px')\n return [...found]\n}\n\n/**\n * Strip every `calc(` wrapper to a plain `(`, and strip `%` / `rem` /\n * `px` unit suffixes from numeric tokens. Result is a plain arithmetic\n * expression the evaluator can consume.\n * @param text Length expression.\n * @returns Arithmetic text suitable for {@link evaluateArithmetic}.\n */\nfunction stripCalcAndUnits(text: string): string {\n // Input is Tailwind's compiled CSS, not user-controlled — no ReDoS risk.\n // eslint-disable-next-line sonarjs/slow-regex\n return text.replaceAll(/\\bcalc\\s*\\(/g, '(').replaceAll(/([\\d.]+)(?:rem|px|%)/g, '$1')\n}\n\n/**\n * Format a percentage number so `50` stays `\"50%\"` (not `\"50.00000001%\"`)\n * when float drift is in the low bits. Strips trailing-zero decimals.\n * @param value Percentage magnitude.\n * @returns Integer-ish string.\n */\nfunction stripTrailingZeros(value: number): string {\n const rounded = Math.round(value * 1_000_000) / 1_000_000\n return String(rounded)\n}\n\n/**\n * Tiny recursive-descent evaluator for CSS arithmetic. Accepts `+`, `-`,\n * `*`, `/`, parens, and decimal numbers. Returns `null` on malformed\n * input — rejects anything the tokenizer can't classify.\n * @param text Arithmetic text (post {@link stripCalcAndUnits}).\n * @returns Evaluated number, or `null`.\n */\nfunction evaluateArithmetic(text: string): number | null {\n const tokens = tokenizeArithmetic(text)\n if (!tokens) return null\n const cursor = { index: 0 }\n const result = parseArithmeticExpr(tokens, cursor)\n if (cursor.index !== tokens.length) return null\n return result\n}\n\n/**\n * Split arithmetic text into numeric and operator tokens. Returns null\n * when the text contains any character outside the allowed set.\n * @param text Arithmetic text.\n * @returns Token list, or null on unexpected character.\n */\nfunction tokenizeArithmetic(text: string): readonly string[] | null {\n const tokens: string[] = []\n let index = 0\n while (index < text.length) {\n const ch = text[index]!\n if (isArithmeticWhitespace(ch)) {\n index += 1\n } else if (isArithmeticOperator(ch)) {\n tokens.push(ch)\n index += 1\n } else if (isDigitOrDot(ch)) {\n const next = consumeNumber(text, index)\n tokens.push(text.slice(index, next))\n index = next\n } else {\n return null\n }\n }\n return tokens\n}\n\n/**\n * Check whether `ch` is a whitespace character the arithmetic tokenizer\n * may skip.\n * @param ch Single-character string.\n * @returns True for space / tab / newline.\n */\nfunction isArithmeticWhitespace(ch: string): boolean {\n return ch === ' ' || ch === '\\t' || ch === '\\n'\n}\n\n/**\n * Check whether `ch` is one of the arithmetic operator tokens.\n * @param ch Single-character string.\n * @returns True for `(`, `)`, `+`, `-`, `*`, `/`.\n */\nfunction isArithmeticOperator(ch: string): boolean {\n return ch === '(' || ch === ')' || ch === '+' || ch === '-' || ch === '*' || ch === '/'\n}\n\n/**\n * Check whether `ch` belongs to a numeric token.\n * @param ch Single-character string.\n * @returns True for a digit `0`–`9` or `.`.\n */\nfunction isDigitOrDot(ch: string): boolean {\n return (ch >= '0' && ch <= '9') || ch === '.'\n}\n\n/**\n * Advance past a numeric token starting at `start`.\n * @param text Source text.\n * @param start Index of the first digit or dot.\n * @returns Index just past the last digit-or-dot.\n */\nfunction consumeNumber(text: string, start: number): number {\n let index = start\n while (index < text.length && isDigitOrDot(text[index]!)) index += 1\n return index\n}\n\n/**\n * Parse an additive expression: `term (('+'|'-') term)*`.\n * @param tokens Token list.\n * @param cursor Mutable cursor.\n * @param cursor.index Current token index; advanced past consumed tokens.\n * @returns Evaluated number, or `null` on parse failure.\n */\nfunction parseArithmeticExpr(tokens: readonly string[], cursor: { index: number }): number | null {\n let left = parseArithmeticTerm(tokens, cursor)\n if (left === null) return null\n while (cursor.index < tokens.length) {\n const op = tokens[cursor.index]\n if (op !== '+' && op !== '-') break\n cursor.index += 1\n const right = parseArithmeticTerm(tokens, cursor)\n if (right === null) return null\n left = op === '+' ? left + right : left - right\n }\n return left\n}\n\n/**\n * Parse a multiplicative expression: `factor (('*'|'/') factor)*`.\n * @param tokens Token list.\n * @param cursor Mutable cursor.\n * @param cursor.index Current token index; advanced past consumed tokens.\n * @returns Evaluated number, or `null`.\n */\nfunction parseArithmeticTerm(tokens: readonly string[], cursor: { index: number }): number | null {\n let left = parseArithmeticFactor(tokens, cursor)\n if (left === null) return null\n while (cursor.index < tokens.length) {\n const op = tokens[cursor.index]\n if (op !== '*' && op !== '/') break\n cursor.index += 1\n const right = parseArithmeticFactor(tokens, cursor)\n if (right === null) return null\n left = op === '*' ? left * right : left / right\n }\n return left\n}\n\n/**\n * Parse a factor: unary minus, parenthesised expression, or number.\n * @param tokens Token list.\n * @param cursor Mutable cursor.\n * @param cursor.index Current token index; advanced past consumed tokens.\n * @returns Evaluated number, or `null`.\n */\nfunction parseArithmeticFactor(tokens: readonly string[], cursor: { index: number }): number | null {\n if (cursor.index >= tokens.length) return null\n const tok = tokens[cursor.index]!\n if (tok === '-') {\n cursor.index += 1\n const right = parseArithmeticFactor(tokens, cursor)\n return right === null ? null : -right\n }\n if (tok === '+') {\n cursor.index += 1\n return parseArithmeticFactor(tokens, cursor)\n }\n if (tok === '(') {\n cursor.index += 1\n const inner = parseArithmeticExpr(tokens, cursor)\n if (cursor.index >= tokens.length || tokens[cursor.index] !== ')') return null\n cursor.index += 1\n return inner\n }\n const number_ = Number(tok)\n if (!Number.isFinite(number_)) return null\n cursor.index += 1\n return number_\n}\n\n/**\n * Resolve a scale factor expressed as a percentage (`150%`) or number (`1.5`).\n * @param text Raw value.\n * @returns Scale number (e.g. 1.5 for 150%), or null.\n */\nfunction resolveNumberOrPercent(text: string): number | null {\n const trimmed = text.trim()\n const percent = /^(-?\\d+(?:\\.\\d+)?)%$/.exec(trimmed)\n if (percent) return Number(percent[1]) / 100\n const bare = /^-?\\d+(?:\\.\\d+)?$/.exec(trimmed)\n if (bare) return Number(trimmed)\n return null\n}\n\n/**\n * Extract the angle from Tailwind's `skewX(12deg)` / `skewY(-5deg)` /\n * `skewX(calc(6deg * -1))` custom-property value shape. Returns null\n * when the inner expression doesn't reduce to a degree value.\n *\n * Tailwind v4 emits negative skew utilities as a nested `calc()`\n * (`-skew-x-6` → `skewX(calc(6deg * -1))`), so the inner body has to be\n * evaluated as arithmetic — a bare-angle regex silently drops those.\n * @param text Raw value.\n * @returns `<N>deg` string, or null.\n */\nfunction extractAngleFromSkewFunction(text: string): string | null {\n const trimmed = text.trim()\n if (!trimmed.endsWith(')')) return null\n const openIdx = trimmed.indexOf('(')\n if (openIdx < 5) return null\n const head = trimmed.slice(0, openIdx)\n if (head !== 'skewX' && head !== 'skewY') return null\n const inner = trimmed.slice(openIdx + 1, -1).trim()\n return resolveAngleExpression(inner)\n}\n\n/**\n * Evaluate an expression whose single unit is `deg`. Strips `calc(`\n * wrappers and `deg` suffixes, runs the arithmetic evaluator, reapplies\n * `deg`. Returns null for unit mismatches or unparseable text.\n * @param text Angle expression (e.g. `6deg`, `calc(6deg * -1)`).\n * @returns `<N>deg`, or null when not representable.\n */\nfunction resolveAngleExpression(text: string): string | null {\n if (!/[\\d.]deg\\b/.test(text)) return null\n // Input is Tailwind's compiled CSS, not user-controlled — no ReDoS risk.\n // eslint-disable-next-line sonarjs/slow-regex\n const arithmetic = text.replaceAll(/\\bcalc\\s*\\(/g, '(').replaceAll(/([\\d.]+)deg/g, '$1')\n const value = evaluateArithmetic(arithmetic)\n if (value === null || !Number.isFinite(value)) return null\n return `${stripTrailingZeros(value)}deg`\n}\n\n/**\n * Scan Tailwind's compiled CSS for `:root, :host { --x: y; … }` blocks\n * and pull the custom-property declarations out. This captures every\n * theme token Tailwind resolved — including tokens imported from the\n * user's secondary `@import` files (e.g. `rnwind/css`'s\n * `--duration-normal: 220ms`) — without rnwind having to re-implement\n * `@import` resolution.\n *\n * Regex-free scanner: finds `:root` prefixes, walks forward with\n * brace-depth tracking to find the matching block close, then extracts\n * every `--name: value;` pair with a paren-balanced walker so commas\n * inside `rgb(0, 0, 0)` don't confuse the split.\n * @param css Tailwind's compiled CSS.\n * @returns Map of custom-property name → resolved value.\n */\n/**\n * Strip `\\@supports (color: color-mix(in lab, red, red)) { … }` wrappers\n * from Tailwind v4's compiled CSS, hoisting their inner declarations up\n * to the parent rule.\n *\n * Tailwind emits opacity-suffixed themed colors with both a pre-resolved\n * sRGB fallback AND a var()-based override gated behind the color-mix\n * `\\@supports` clause. The OUTER fallback hard-codes a single scheme's\n * value of the theme token; the inner override is var()-based and\n * substitutes correctly per scheme. By unwrapping the gate, the inner\n * declaration becomes a sibling of the fallback in the same rule body —\n * lightningcss takes the LATER one (the var()-based unparsed form), and\n * the parser's themeVars-aware path produces correct rgba per scheme.\n * Modern RN-targeted browsers all support color-mix anyway, so dropping\n * the gating is safe.\n * @param css Tailwind-compiled CSS.\n * @returns CSS with the color-mix support gates unwrapped.\n */\nfunction unwrapColorMixSupports(css: string): string {\n const guard = '@supports (color: color-mix(in lab, red, red))'\n let out = ''\n let cursor = 0\n while (cursor < css.length) {\n const head = css.indexOf(guard, cursor)\n if (head === -1) {\n out += css.slice(cursor)\n break\n }\n out += css.slice(cursor, head)\n const brace = css.indexOf('{', head)\n if (brace === -1) {\n out += css.slice(head)\n break\n }\n const blockEnd = findMatchingClose(css, brace + 1)\n if (blockEnd === -1) {\n out += css.slice(head)\n break\n }\n const inner = css.slice(brace + 1, blockEnd)\n // Only unwrap when the gated declaration substitutes a USER theme\n // token (`var(--color-…)`). Tailwind also gates `--tw-*` internal\n // composers (shadow color, ring color, …) on the same supports\n // clause; their outer fallback is the optimized hex/oklch value\n // the parser's own composed-prop pass needs (`applyComposedShadow`\n // reads `--tw-shadow-color` from the rule's local vars). Unwrapping\n // them would replace the resolvable color with an unresolvable\n // `color-mix(... var(--tw-shadow-alpha), transparent)` text and\n // break the composed-shadow path.\n // Keep the gate intact for non-themed colors — the outer fallback\n // wins, which is what Tailwind intended.\n out += inner.includes('var(--color-') ? inner : css.slice(head, blockEnd + 1)\n cursor = blockEnd + 1\n }\n return out\n}\n\n/**\n * Extract every `--name: value` declaration from the `:root` blocks in\n * Tailwind's compiled CSS into a flat map.\n * @param css Tailwind-compiled CSS.\n * @returns Map of custom-property name → resolved value.\n */\nfunction extractRootCustomProperties(css: string): Map<string, string> {\n const out = new Map<string, string>()\n let cursor = 0\n while (cursor < css.length) {\n const blockEnd = consumeNextRootBlock(css, cursor, out)\n if (blockEnd === -1) break\n cursor = blockEnd + 1\n }\n return out\n}\n\n/**\n * Locate the next `:root` block from `cursor`, extract its custom\n * properties into `out`, and return the index of its closing brace.\n * Split out from {@link extractRootCustomProperties} to keep complexity\n * below the cap.\n * @param css Source CSS.\n * @param cursor Start index for the search.\n * @param out Destination map, mutated.\n * @returns Index of the closing brace, or -1 when no block remains.\n */\nfunction consumeNextRootBlock(css: string, cursor: number, out: Map<string, string>): number {\n const head = css.indexOf(':root', cursor)\n if (head === -1) return -1\n const brace = css.indexOf('{', head)\n if (brace === -1) return -1\n const blockEnd = findMatchingClose(css, brace + 1)\n if (blockEnd === -1) return -1\n collectCustomDeclarations(css.slice(brace + 1, blockEnd), out)\n return blockEnd\n}\n\n/**\n * Parse the body of a `:root` block — a `;`-separated list of `--name:\n * value` declarations — into the output map. Top-level `;` split is\n * paren-aware so `rgb(0, 0, 0)` doesn't fragment the list.\n * @param body Block body text (between braces).\n * @param out Destination map, mutated.\n */\nfunction collectCustomDeclarations(body: string, out: Map<string, string>): void {\n for (const declaration of topLevelSplit(body, ';')) {\n const colon = declaration.indexOf(':')\n if (colon === -1) continue\n const name = declaration.slice(0, colon).trim()\n const value = declaration.slice(colon + 1).trim()\n if (name.startsWith('--') && value.length > 0) out.set(name, value)\n }\n}\n\n/**\n * Walk forward from `start` tracking brace depth; return the index of\n * the matching `}` for the opener just before `start`.\n * @param source Source text.\n * @param start Index just past the opening `{`.\n * @returns Index of matching `}`, or `-1` on imbalance.\n */\nfunction findMatchingClose(source: string, start: number): number {\n let depth = 1\n for (let index = start; index < source.length; index += 1) {\n const ch = source[index]\n if (ch === '{') depth += 1\n else if (ch === '}') {\n depth -= 1\n if (depth === 0) return index\n }\n }\n return -1\n}\n\n/**\n * Merge rule-local custom vars into every scheme's var table. Creates\n * fresh maps so the rule pass doesn't mutate the shared parser state.\n * @param schemeTables Base per-scheme var tables.\n * @param ruleVars Rule-local `--tw-*` overrides.\n * @returns Merged per-scheme tables.\n */\nfunction mergeRuleVars(\n schemeTables: ReadonlyMap<string, ReadonlyMap<string, string>>,\n ruleVars: ReadonlyMap<string, string>,\n): Map<string, ReadonlyMap<string, string>> {\n if (ruleVars.size === 0) return new Map(schemeTables)\n const out = new Map<string, ReadonlyMap<string, string>>()\n for (const [scheme, table] of schemeTables) {\n const merged = new Map(table)\n for (const [k, v] of ruleVars) merged.set(k, v)\n out.set(scheme, merged)\n }\n return out\n}\n"],"names":["culoriFormatHex"],"mappings":"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"}
@@ -53,6 +53,21 @@ function letterSpacingToEntries(value) {
53
53
  return [];
54
54
  return [['letterSpacing', unit === 'px' ? px : px * 16]];
55
55
  }
56
+ /**
57
+ * Lower a CSS `text-align` keyword to one RN's `textAlign` accepts. RN
58
+ * has no logical `start`/`end`, so map them to physical sides (LTR
59
+ * default); every other keyword (left/right/center/justify/auto) is
60
+ * already valid and passes through.
61
+ * @param align CSS text-align keyword.
62
+ * @returns RN-valid textAlign keyword.
63
+ */
64
+ function physicalTextAlign(align) {
65
+ if (align === 'start')
66
+ return 'left';
67
+ if (align === 'end')
68
+ return 'right';
69
+ return align;
70
+ }
56
71
  /**
57
72
  * Dispatch typography declarations rnwind cares about (text-align,
58
73
  * text-transform, text-decoration-line, line-height, letter-spacing,
@@ -64,7 +79,7 @@ function letterSpacingToEntries(value) {
64
79
  function dispatchTypographyDeclaration(decl) {
65
80
  switch (decl.property) {
66
81
  case 'text-align': {
67
- return [['textAlign', decl.value]];
82
+ return [['textAlign', physicalTextAlign(String(decl.value))]];
68
83
  }
69
84
  case 'text-transform': {
70
85
  return [['textTransform', decl.value.case ?? 'none']];
@@ -1 +1 @@
1
- {"version":3,"file":"typography-dispatcher.mjs","sources":["../../../../../src/core/parser/typography-dispatcher.ts"],"sourcesContent":["import type { Declaration as LcDeclaration } from 'lightningcss'\nimport { lineHeightToEntries } from './typography'\nimport type { RNEntry } from './types'\n\n/**\n * Build the RN `textDecorationLine` entry — string identity for the\n * single-line cases, joined-string for the array shape.\n * @param value Typed text-decoration-line.\n * @returns Single-entry list with `textDecorationLine`.\n */\nfunction textDecorationLineToEntries(value: LcDeclaration['value']): readonly RNEntry[] {\n if (value === 'none') return [['textDecorationLine', 'none']]\n if (typeof value === 'string') return [['textDecorationLine', value]]\n if (Array.isArray(value)) return [['textDecorationLine', value.join(' ')]]\n return []\n}\n\n/**\n * Build the RN `aspectRatio` entry from lightningcss's typed value.\n * Drops `auto` (no RN equivalent).\n * @param value Typed aspect-ratio value.\n * @param value.auto Whether the value resolved to `auto`.\n * @param value.ratio Numeric `[width, height]` ratio (or null/undefined).\n * @returns Single-entry list or empty.\n */\nfunction aspectRatioToEntries(value: { auto?: boolean; ratio?: readonly [number, number] | null }): readonly RNEntry[] {\n if (value.auto) return []\n if (!value.ratio) return []\n const [w, h] = value.ratio\n if (h === 0) return []\n return [['aspectRatio', w / h]]\n}\n\n/**\n * Build the RN `letterSpacing` entry. RN expects pixel numbers; rem\n * lengths are scaled to px (16-px base).\n * @param value Typed letter-spacing value.\n * @returns Single-entry list or empty.\n */\nfunction letterSpacingToEntries(value: LcDeclaration['value']): readonly RNEntry[] {\n if (typeof value !== 'object') return []\n const tagged = value as { type?: string; value?: { type?: string; value?: { unit?: string; value?: number } } }\n if (tagged.type === 'normal') return [['letterSpacing', 0]]\n const inner = tagged.value\n if (inner?.type !== 'value' || !inner.value) return []\n const { unit, value: px } = inner.value\n if (typeof px !== 'number') return []\n return [['letterSpacing', unit === 'px' ? px : px * 16]]\n}\n\n/**\n * Dispatch typography declarations rnwind cares about (text-align,\n * text-transform, text-decoration-line, line-height, letter-spacing,\n * aspect-ratio). Returns null when the property isn't one of these so\n * the caller can fall through to its main switch.\n * @param decl One lightningcss declaration.\n * @returns RN entries when the property matched, else `null`.\n */\nexport function dispatchTypographyDeclaration(decl: LcDeclaration): readonly RNEntry[] | null {\n switch (decl.property) {\n case 'text-align': {\n return [['textAlign', decl.value]]\n }\n case 'text-transform': {\n return [['textTransform', decl.value.case ?? 'none']]\n }\n case 'text-decoration-line': {\n return textDecorationLineToEntries(decl.value)\n }\n case 'aspect-ratio': {\n return aspectRatioToEntries(decl.value)\n }\n case 'line-height': {\n return lineHeightToEntries(decl.value)\n }\n case 'letter-spacing': {\n return letterSpacingToEntries(decl.value)\n }\n default: {\n return null\n }\n }\n}\n"],"names":[],"mappings":";;AAIA;;;;;AAKG;AACH,SAAS,2BAA2B,CAAC,KAA6B,EAAA;IAChE,IAAI,KAAK,KAAK,MAAM;AAAE,QAAA,OAAO,CAAC,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,CAAC,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;AACrE,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,CAAC,CAAC,oBAAoB,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1E,IAAA,OAAO,EAAE;AACX;AAEA;;;;;;;AAOG;AACH,SAAS,oBAAoB,CAAC,KAAmE,EAAA;IAC/F,IAAI,KAAK,CAAC,IAAI;AAAE,QAAA,OAAO,EAAE;IACzB,IAAI,CAAC,KAAK,CAAC,KAAK;AAAE,QAAA,OAAO,EAAE;IAC3B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK;IAC1B,IAAI,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,EAAE;IACtB,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC;AAEA;;;;;AAKG;AACH,SAAS,sBAAsB,CAAC,KAA6B,EAAA;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,EAAE;IACxC,MAAM,MAAM,GAAG,KAAgG;AAC/G,IAAA,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;AAC3D,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK;IAC1B,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK;AAAE,QAAA,OAAO,EAAE;IACtD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK;IACvC,IAAI,OAAO,EAAE,KAAK,QAAQ;AAAE,QAAA,OAAO,EAAE;AACrC,IAAA,OAAO,CAAC,CAAC,eAAe,EAAE,IAAI,KAAK,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AAC1D;AAEA;;;;;;;AAOG;AACG,SAAU,6BAA6B,CAAC,IAAmB,EAAA;AAC/D,IAAA,QAAQ,IAAI,CAAC,QAAQ;QACnB,KAAK,YAAY,EAAE;YACjB,OAAO,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC;QACA,KAAK,gBAAgB,EAAE;AACrB,YAAA,OAAO,CAAC,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;QACvD;QACA,KAAK,sBAAsB,EAAE;AAC3B,YAAA,OAAO,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC;QAChD;QACA,KAAK,cAAc,EAAE;AACnB,YAAA,OAAO,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;QACzC;QACA,KAAK,aAAa,EAAE;AAClB,YAAA,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;QACxC;QACA,KAAK,gBAAgB,EAAE;AACrB,YAAA,OAAO,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC3C;QACA,SAAS;AACP,YAAA,OAAO,IAAI;QACb;;AAEJ;;;;"}
1
+ {"version":3,"file":"typography-dispatcher.mjs","sources":["../../../../../src/core/parser/typography-dispatcher.ts"],"sourcesContent":["import type { Declaration as LcDeclaration } from 'lightningcss'\nimport { lineHeightToEntries } from './typography'\nimport type { RNEntry } from './types'\n\n/**\n * Build the RN `textDecorationLine` entry — string identity for the\n * single-line cases, joined-string for the array shape.\n * @param value Typed text-decoration-line.\n * @returns Single-entry list with `textDecorationLine`.\n */\nfunction textDecorationLineToEntries(value: LcDeclaration['value']): readonly RNEntry[] {\n if (value === 'none') return [['textDecorationLine', 'none']]\n if (typeof value === 'string') return [['textDecorationLine', value]]\n if (Array.isArray(value)) return [['textDecorationLine', value.join(' ')]]\n return []\n}\n\n/**\n * Build the RN `aspectRatio` entry from lightningcss's typed value.\n * Drops `auto` (no RN equivalent).\n * @param value Typed aspect-ratio value.\n * @param value.auto Whether the value resolved to `auto`.\n * @param value.ratio Numeric `[width, height]` ratio (or null/undefined).\n * @returns Single-entry list or empty.\n */\nfunction aspectRatioToEntries(value: { auto?: boolean; ratio?: readonly [number, number] | null }): readonly RNEntry[] {\n if (value.auto) return []\n if (!value.ratio) return []\n const [w, h] = value.ratio\n if (h === 0) return []\n return [['aspectRatio', w / h]]\n}\n\n/**\n * Build the RN `letterSpacing` entry. RN expects pixel numbers; rem\n * lengths are scaled to px (16-px base).\n * @param value Typed letter-spacing value.\n * @returns Single-entry list or empty.\n */\nfunction letterSpacingToEntries(value: LcDeclaration['value']): readonly RNEntry[] {\n if (typeof value !== 'object') return []\n const tagged = value as { type?: string; value?: { type?: string; value?: { unit?: string; value?: number } } }\n if (tagged.type === 'normal') return [['letterSpacing', 0]]\n const inner = tagged.value\n if (inner?.type !== 'value' || !inner.value) return []\n const { unit, value: px } = inner.value\n if (typeof px !== 'number') return []\n return [['letterSpacing', unit === 'px' ? px : px * 16]]\n}\n\n/**\n * Lower a CSS `text-align` keyword to one RN's `textAlign` accepts. RN\n * has no logical `start`/`end`, so map them to physical sides (LTR\n * default); every other keyword (left/right/center/justify/auto) is\n * already valid and passes through.\n * @param align CSS text-align keyword.\n * @returns RN-valid textAlign keyword.\n */\nfunction physicalTextAlign(align: string): string {\n if (align === 'start') return 'left'\n if (align === 'end') return 'right'\n return align\n}\n\n/**\n * Dispatch typography declarations rnwind cares about (text-align,\n * text-transform, text-decoration-line, line-height, letter-spacing,\n * aspect-ratio). Returns null when the property isn't one of these so\n * the caller can fall through to its main switch.\n * @param decl One lightningcss declaration.\n * @returns RN entries when the property matched, else `null`.\n */\nexport function dispatchTypographyDeclaration(decl: LcDeclaration): readonly RNEntry[] | null {\n switch (decl.property) {\n case 'text-align': {\n return [['textAlign', physicalTextAlign(String(decl.value))]]\n }\n case 'text-transform': {\n return [['textTransform', decl.value.case ?? 'none']]\n }\n case 'text-decoration-line': {\n return textDecorationLineToEntries(decl.value)\n }\n case 'aspect-ratio': {\n return aspectRatioToEntries(decl.value)\n }\n case 'line-height': {\n return lineHeightToEntries(decl.value)\n }\n case 'letter-spacing': {\n return letterSpacingToEntries(decl.value)\n }\n default: {\n return null\n }\n }\n}\n"],"names":[],"mappings":"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"}