rnwind 0.0.11 → 0.0.12

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 (96) hide show
  1. package/lib/cjs/core/normalize-classname.cjs +3 -1
  2. package/lib/cjs/core/normalize-classname.cjs.map +1 -1
  3. package/lib/cjs/core/parser/border-dispatcher.cjs +20 -10
  4. package/lib/cjs/core/parser/border-dispatcher.cjs.map +1 -1
  5. package/lib/cjs/core/parser/color-properties-dispatcher.cjs +7 -5
  6. package/lib/cjs/core/parser/color-properties-dispatcher.cjs.map +1 -1
  7. package/lib/cjs/core/parser/color.cjs +194 -10
  8. package/lib/cjs/core/parser/color.cjs.map +1 -1
  9. package/lib/cjs/core/parser/color.d.ts +18 -3
  10. package/lib/cjs/core/parser/declaration.cjs +62 -4
  11. package/lib/cjs/core/parser/declaration.cjs.map +1 -1
  12. package/lib/cjs/core/parser/layout-dispatcher.cjs +32 -2
  13. package/lib/cjs/core/parser/layout-dispatcher.cjs.map +1 -1
  14. package/lib/cjs/core/parser/shorthand.cjs +10 -3
  15. package/lib/cjs/core/parser/shorthand.cjs.map +1 -1
  16. package/lib/cjs/core/parser/tokens.cjs +9 -0
  17. package/lib/cjs/core/parser/tokens.cjs.map +1 -1
  18. package/lib/cjs/core/parser/tw-parser.cjs +6 -0
  19. package/lib/cjs/core/parser/tw-parser.cjs.map +1 -1
  20. package/lib/cjs/core/parser/typography-dispatcher.cjs +15 -8
  21. package/lib/cjs/core/parser/typography-dispatcher.cjs.map +1 -1
  22. package/lib/cjs/core/style-builder/union-builder.cjs +81 -2
  23. package/lib/cjs/core/style-builder/union-builder.cjs.map +1 -1
  24. package/lib/cjs/core/style-builder/union-builder.d.ts +28 -0
  25. package/lib/cjs/metro/state.cjs +74 -13
  26. package/lib/cjs/metro/state.cjs.map +1 -1
  27. package/lib/cjs/metro/state.d.ts +18 -0
  28. package/lib/cjs/metro/transformer.cjs +10 -4
  29. package/lib/cjs/metro/transformer.cjs.map +1 -1
  30. package/lib/cjs/metro/with-config.cjs +57 -0
  31. package/lib/cjs/metro/with-config.cjs.map +1 -1
  32. package/lib/cjs/metro/with-config.d.ts +12 -0
  33. package/lib/cjs/metro/wrap-imports.cjs +36 -1
  34. package/lib/cjs/metro/wrap-imports.cjs.map +1 -1
  35. package/lib/cjs/runtime/hooks/use-scheme.cjs +14 -7
  36. package/lib/cjs/runtime/hooks/use-scheme.cjs.map +1 -1
  37. package/lib/cjs/runtime/resolve.cjs +6 -2
  38. package/lib/cjs/runtime/resolve.cjs.map +1 -1
  39. package/lib/cjs/runtime/resolve.d.ts +5 -1
  40. package/lib/esm/core/normalize-classname.mjs +3 -1
  41. package/lib/esm/core/normalize-classname.mjs.map +1 -1
  42. package/lib/esm/core/parser/border-dispatcher.mjs +21 -11
  43. package/lib/esm/core/parser/border-dispatcher.mjs.map +1 -1
  44. package/lib/esm/core/parser/color-properties-dispatcher.mjs +8 -6
  45. package/lib/esm/core/parser/color-properties-dispatcher.mjs.map +1 -1
  46. package/lib/esm/core/parser/color.d.ts +18 -3
  47. package/lib/esm/core/parser/color.mjs +195 -12
  48. package/lib/esm/core/parser/color.mjs.map +1 -1
  49. package/lib/esm/core/parser/declaration.mjs +63 -5
  50. package/lib/esm/core/parser/declaration.mjs.map +1 -1
  51. package/lib/esm/core/parser/layout-dispatcher.mjs +32 -2
  52. package/lib/esm/core/parser/layout-dispatcher.mjs.map +1 -1
  53. package/lib/esm/core/parser/shorthand.mjs +11 -4
  54. package/lib/esm/core/parser/shorthand.mjs.map +1 -1
  55. package/lib/esm/core/parser/tokens.mjs +10 -1
  56. package/lib/esm/core/parser/tokens.mjs.map +1 -1
  57. package/lib/esm/core/parser/tw-parser.mjs +6 -0
  58. package/lib/esm/core/parser/tw-parser.mjs.map +1 -1
  59. package/lib/esm/core/parser/typography-dispatcher.mjs +15 -8
  60. package/lib/esm/core/parser/typography-dispatcher.mjs.map +1 -1
  61. package/lib/esm/core/style-builder/union-builder.d.ts +28 -0
  62. package/lib/esm/core/style-builder/union-builder.mjs +82 -3
  63. package/lib/esm/core/style-builder/union-builder.mjs.map +1 -1
  64. package/lib/esm/metro/state.d.ts +18 -0
  65. package/lib/esm/metro/state.mjs +75 -14
  66. package/lib/esm/metro/state.mjs.map +1 -1
  67. package/lib/esm/metro/transformer.mjs +10 -4
  68. package/lib/esm/metro/transformer.mjs.map +1 -1
  69. package/lib/esm/metro/with-config.d.ts +12 -0
  70. package/lib/esm/metro/with-config.mjs +58 -2
  71. package/lib/esm/metro/with-config.mjs.map +1 -1
  72. package/lib/esm/metro/wrap-imports.mjs +36 -1
  73. package/lib/esm/metro/wrap-imports.mjs.map +1 -1
  74. package/lib/esm/runtime/hooks/use-scheme.mjs +14 -7
  75. package/lib/esm/runtime/hooks/use-scheme.mjs.map +1 -1
  76. package/lib/esm/runtime/resolve.d.ts +5 -1
  77. package/lib/esm/runtime/resolve.mjs +6 -2
  78. package/lib/esm/runtime/resolve.mjs.map +1 -1
  79. package/package.json +1 -1
  80. package/src/core/normalize-classname.ts +4 -1
  81. package/src/core/parser/border-dispatcher.ts +22 -11
  82. package/src/core/parser/color-properties-dispatcher.ts +7 -5
  83. package/src/core/parser/color.ts +182 -11
  84. package/src/core/parser/declaration.ts +61 -5
  85. package/src/core/parser/layout-dispatcher.ts +34 -2
  86. package/src/core/parser/shorthand.ts +9 -3
  87. package/src/core/parser/tokens.ts +10 -1
  88. package/src/core/parser/tw-parser.ts +5 -0
  89. package/src/core/parser/typography-dispatcher.ts +15 -6
  90. package/src/core/style-builder/union-builder.ts +83 -3
  91. package/src/metro/state.ts +117 -12
  92. package/src/metro/transformer.ts +9 -4
  93. package/src/metro/with-config.ts +59 -1
  94. package/src/metro/wrap-imports.ts +36 -1
  95. package/src/runtime/hooks/use-scheme.ts +13 -6
  96. package/src/runtime/resolve.ts +6 -2
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.cjs","sources":["../../../../../src/core/parser/tokens.ts"],"sourcesContent":["import type { Token, TokenOrValue } from 'lightningcss'\nimport { rgb as culoriRgb } from 'culori'\nimport { BARE_NUMBER_REGEX, CALC_MUL_REGEX, CALC_RATIO_REGEX, LENGTH_PX_REGEX, LENGTH_REM_REGEX, REM_TO_PX } from './constants'\nimport { cssColorToString } from './color'\nimport type { RNStyleValue } from './types'\n\n/**\n * Extract the fallback clause of a `var(--name, fallback)` by walking the\n * string with paren-depth tracking. Linear-time; safe on nested\n * `var(--a, var(--b, var(--c, 1rem)))` without regex backtracking.\n * @param text CSS value already trimmed.\n * @returns Fallback text, or `null` when `text` is not a `var(..., ...)`\n * with a fallback.\n */\nfunction extractVariableFallback(text: string): string | null {\n if (!text.startsWith('var(') || !text.endsWith(')')) return null\n const inner = text.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).trim()\n }\n return null\n}\n\n/**\n * Find the matching `)` for the opening `var(` whose body starts at\n * `start`. Returns `-1` when the parens are unbalanced.\n * @param text Source text.\n * @param start Index just past the opening `var(`.\n * @returns Index of the matching `)`, or `-1`.\n */\nfunction findBalancedParenEnd(text: string, start: number): number {\n let depth = 1\n for (let index = start; index < text.length; index += 1) {\n const ch = text[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 * Resolve a `var(…)` body (the bit between parentheses). Reads the\n * variable name, then either returns the table lookup or recurses into\n * the fallback clause. When neither resolves, re-wraps as `var(…)` so\n * downstream coercion still sees a well-formed reference.\n * @param body Text between the outer parentheses of a `var()` call.\n * @param table var → value map.\n * @returns Substituted text fragment.\n */\nfunction resolveVariableBody(body: string, table: ReadonlyMap<string, string>): string {\n let depth = 0\n let commaIndex = -1\n for (const [index, ch] of [...body].entries()) {\n if (ch === '(') depth += 1\n else if (ch === ')') depth -= 1\n else if (ch === ',' && depth === 0) {\n commaIndex = index\n break\n }\n }\n const rawName = (commaIndex === -1 ? body : body.slice(0, commaIndex)).trim()\n const fallback = commaIndex === -1 ? null : body.slice(commaIndex + 1).trim()\n const resolved = table.get(rawName)\n if (resolved !== undefined) return resolved\n if (fallback !== null) return substitutePass(fallback, table)\n return `var(${body})`\n}\n\n/**\n * One pass of left-to-right `var(...)` substitution. Separate from the\n * fixed-point driver so the recursion depth stays bounded.\n * @param text Value text to scan.\n * @param table var → value map.\n * @returns Value text after one pass.\n */\nfunction substitutePass(text: string, table: ReadonlyMap<string, string>): string {\n let out = ''\n let index = 0\n while (index < text.length) {\n const head = text.indexOf('var(', index)\n if (head === -1) {\n out += text.slice(index)\n break\n }\n out += text.slice(index, head)\n const end = findBalancedParenEnd(text, head + 4)\n if (end === -1) {\n out += text.slice(head)\n break\n }\n const body = text.slice(head + 4, end)\n out += resolveVariableBody(body, table)\n index = end + 1\n }\n return out\n}\n\n/**\n * Serialize a list of `TokenOrValue` nodes into a CSS-ish value string.\n * Preserves the CSS form closely enough for downstream numeric coercion.\n * @param tokens Token list from an unparsed declaration or custom-property body.\n * @returns Concatenated CSS-value fragment.\n */\nexport function serializeTokens(tokens: readonly TokenOrValue[]): string {\n let out = ''\n for (const token of tokens) out += serializeToken(token)\n return out.trim()\n}\n\n/**\n * Serialize one `TokenOrValue` node back to CSS text. Handles the shapes\n * Tailwind v4 actually emits in utility-class bodies: raw tokens, `var()`\n * references, and numeric functions (`calc()`).\n * @param token One token node.\n * @returns CSS-value fragment.\n */\nexport function serializeToken(token: TokenOrValue): string {\n switch (token.type) {\n case 'token': {\n return serializeRawToken(token.value)\n }\n case 'var': {\n const head = token.value.name.ident\n const { fallback } = token.value\n if (!fallback || fallback.length === 0) return `var(${head})`\n return `var(${head}, ${serializeTokens(fallback)})`\n }\n case 'function': {\n return `${token.value.name}(${serializeTokens(token.value.arguments)})`\n }\n case 'length': {\n return `${token.value.value}${token.value.unit}`\n }\n case 'dashed-ident': {\n return token.value\n }\n case 'angle': {\n return `${token.value.value}${token.value.type}`\n }\n case 'time': {\n const unit = token.value.type === 'milliseconds' ? 'ms' : 's'\n return `${token.value.value}${unit}`\n }\n case 'resolution': {\n return `${token.value.value}${token.value.type}`\n }\n case 'color': {\n // Pre-resolved CSS color (`oklch(...)`, `rgb(...)`, etc.) — render\n // it back to a hex/rgba string RN can read.\n return cssColorToString(token.value)\n }\n case 'env':\n case 'unresolved-color':\n case 'url':\n case 'animation-name': {\n return ''\n }\n default: {\n return ''\n }\n }\n}\n\n/**\n * Serialize a raw `Token` back to CSS text. `TokenOrValue` with\n * `type === 'token'` wraps one of these; the discriminated union lets\n * TypeScript narrow per branch without casts.\n * @param token Raw token.\n * @returns CSS text fragment.\n */\nexport function serializeRawToken(token: Token): string {\n switch (token.type) {\n case 'ident':\n case 'at-keyword':\n case 'string':\n case 'unquoted-url':\n case 'function': {\n return token.value\n }\n case 'hash':\n case 'id-hash': {\n return `#${token.value}`\n }\n case 'number': {\n return String(token.value)\n }\n case 'percentage': {\n return `${token.value * 100}%`\n }\n case 'dimension': {\n return `${token.value}${token.unit}`\n }\n case 'white-space': {\n return ' '\n }\n case 'delim': {\n return token.value\n }\n case 'comma': {\n return ','\n }\n case 'colon':\n case 'semicolon':\n case 'parenthesis-block':\n case 'square-bracket-block':\n case 'curly-bracket-block':\n case 'cdo':\n case 'cdc':\n case 'include-match':\n case 'dash-match':\n case 'prefix-match':\n case 'suffix-match':\n case 'substring-match':\n case 'comment':\n case 'bad-url':\n case 'bad-string': {\n return ''\n }\n default: {\n return ''\n }\n }\n}\n\n/**\n * Coerce the flat serialization of an unparsed value into an RN scalar.\n * Handles the shapes Tailwind v4 actually emits: bare numbers, pixel /\n * rem lengths, calc ratios, and `var(--x, fallback)` where we recurse into\n * the fallback. Anything else passes through as a string.\n * @param text Serialized CSS value.\n * @returns Coerced primitive, or `null` when unrepresentable.\n */\nexport function coerceUnparsedValue(text: string): RNStyleValue | null {\n const trimmed = text.trim()\n if (trimmed.length === 0) return null\n if (BARE_NUMBER_REGEX.test(trimmed)) return Number(trimmed)\n const px = LENGTH_PX_REGEX.exec(trimmed)\n if (px) return Number(px[1])\n const rem = LENGTH_REM_REGEX.exec(trimmed)\n if (rem) return Number(rem[1]) * REM_TO_PX\n const colorMix = evaluateColorMixWithTransparent(trimmed)\n if (colorMix !== null) return colorMix\n const fallback = extractVariableFallback(trimmed)\n if (fallback !== null) return coerceUnparsedValue(fallback)\n const calcRatio = CALC_RATIO_REGEX.exec(trimmed)\n if (calcRatio) {\n const right = Number(calcRatio[2])\n if (right === 0) return null\n return Number(calcRatio[1]) / right\n }\n const calcMul = CALC_MUL_REGEX.exec(trimmed)\n if (calcMul) {\n // Unit-aware multiply: `calc(0.5rem * 2)` → 16 (rem scaled to px).\n // Regex captures `(number)(unit?) * (number)` — the unit is implicit\n // in the match position; rebuild via the full match text.\n const unitMatch = /^calc\\(\\s*-?\\d+(?:\\.\\d+)?(rem|px)?/.exec(trimmed)\n const unit = unitMatch?.[1]\n const base = Number(calcMul[1]) * Number(calcMul[2])\n return unit === 'rem' ? base * REM_TO_PX : base\n }\n return unquoteCssString(trimmed)\n}\n\n/**\n * Evaluate the specific `color-mix(in <space>, <color> <pct>%, transparent)`\n * shape Tailwind v4 emits for opacity-suffixed themed colors (e.g.\n * `border-text/20`, `bg-on-background/30`). The result is the original\n * color with `alpha = originalAlpha * pct/100` — no actual color-space\n * conversion is needed because mixing a color with `transparent` only\n * changes its alpha, regardless of the named space (oklab / srgb /\n * lab / …) — the chrominance is preserved.\n *\n * Returns null when the expression isn't this shape (handed back to\n * the caller for the next coercion strategy).\n * @param text Trimmed CSS value.\n * @returns RN-compatible `rgba(...)` string, or null when unmatched.\n */\nfunction evaluateColorMixWithTransparent(text: string): string | null {\n const lower = text.toLowerCase()\n if (!lower.startsWith('color-mix(')) return null\n // Match the trailing `, transparent)` (allowing optional whitespace).\n const tail = /,\\s*transparent\\s*\\)\\s*$/.exec(text)\n if (!tail) return null\n // Skip the `in <space>` clause (everything up to the FIRST comma after\n // the opening paren). Walking by hand instead of regex because the\n // color slot may itself contain `(...)` (e.g. `rgb(...)`).\n const inComma = text.indexOf(',', 'color-mix('.length)\n if (inComma === -1 || inComma > tail.index) return null\n const middle = text.slice(inComma + 1, tail.index).trim()\n // `<color> <pct>%` — the `<num>%` token is at the END of `middle`.\n // Anchored, no backtracking — explicit `% ` then end.\n const pctMatch = COLOR_MIX_PCT_TAIL.exec(middle)\n if (!pctMatch) return null\n const pct = Number(pctMatch[1]) / 100\n if (!Number.isFinite(pct)) return null\n const colorText = middle.slice(0, pctMatch.index).trim()\n if (colorText.length === 0) return null\n return applyAlphaToCssColor(colorText, pct)\n}\n\n/** End-anchored `<num>%` matcher used to slice a color-mix percentage off the right of an expression. */\n// eslint-disable-next-line sonarjs/slow-regex -- end-anchored, atomic-style group; bounded backtracking is safe.\nconst COLOR_MIX_PCT_TAIL = /(-?\\d+(?:\\.\\d+)?)%$/\n\n/**\n * Multiply the alpha channel of a serialized CSS color by `multiplier`\n * (0…1). Recognises `#rgb` / `#rrggbb` / `#rrggbbaa` hex, named colors\n * (only `transparent` matters here), and `rgb(…)` / `rgba(…)` forms —\n * which is what theme tokens resolve to after substitution.\n * @param color CSS color text.\n * @param multiplier Alpha multiplier (0…1).\n * @returns `rgba(r, g, b, a)` string with the adjusted alpha.\n */\nfunction applyAlphaToCssColor(color: string, multiplier: number): string | null {\n const trimmed = color.trim()\n if (trimmed === 'transparent') return 'rgba(0, 0, 0, 0)'\n // Nested color-mix — Tailwind's `shadow-<token>/<opacity>` emits\n // `color-mix(… color-mix(… <token> N%, transparent) <alpha>, transparent)`.\n // Resolve the inner mix to a concrete color first, then apply this alpha.\n if (trimmed.toLowerCase().startsWith('color-mix(')) {\n const inner = evaluateColorMixWithTransparent(trimmed)\n if (inner !== null) return applyAlphaToCssColor(inner, multiplier)\n }\n return alphaFromHex(trimmed, multiplier) ?? alphaFromRgbFunction(trimmed, multiplier) ?? alphaFromCulori(trimmed, multiplier)\n}\n\n/**\n * Round a composed alpha to 4 decimals — `0.2 * 1` round-trips through f32 as\n * `0.20000000298…`; the rounded form keeps generated rgba strings compact.\n * @param alpha Raw alpha product.\n * @returns Rounded alpha.\n */\nfunction roundAlpha(alpha: number): number {\n return Math.round(alpha * 10_000) / 10_000\n}\n\n/**\n * Apply the alpha multiplier to a hex literal, expanding 3/4/6/8-digit forms.\n * @param text Candidate hex color string.\n * @param multiplier Alpha multiplier (0…1).\n * @returns `rgba(…)` string, or null when `text` is not a hex literal.\n */\nfunction alphaFromHex(text: string, multiplier: number): string | null {\n const hexMatch = /^#([0-9a-fA-F]{3,8})$/.exec(text)\n if (!hexMatch) return null\n const expanded = expandHex(hexMatch[1]!)\n if (!expanded) return null\n return `rgba(${expanded.r}, ${expanded.g}, ${expanded.b}, ${roundAlpha(expanded.alpha * multiplier)})`\n}\n\n/**\n * Apply alpha to an `rgb(…)` / `rgba(…)` literal. Walks the channels by\n * hand instead of a multi-capture regex (the linter flags the regex\n * form as backtracking-prone).\n * @param text Candidate `rgb(…)` / `rgba(…)` color string.\n * @param multiplier Alpha multiplier (0…1).\n * @returns `rgba(…)` string, or null when `text` is not an rgb function.\n */\nfunction alphaFromRgbFunction(text: string, multiplier: number): string | null {\n if (!text.startsWith('rgb(') && !text.startsWith('rgba(')) return null\n const inner = text.slice(text.indexOf('(') + 1, -1)\n const channels = inner.split(/\\s*[\\s,]\\s*/).filter((part) => part.length > 0)\n if (channels.length !== 3 && channels.length !== 4) return null\n const r = Math.round(Number(channels[0]))\n const g = Math.round(Number(channels[1]))\n const b = Math.round(Number(channels[2]))\n const baseAlpha = channels.length === 4 ? Number(channels[3]) : 1\n if (![r, g, b, baseAlpha].every((value) => Number.isFinite(value))) return null\n return `rgba(${r}, ${g}, ${b}, ${roundAlpha(baseAlpha * multiplier)})`\n}\n\n/**\n * Fallback for wide-gamut color forms (`oklch`, `oklab`, `lab`, `lch`,\n * `hsl`, …) — culori parses every CSS color shape and yields RGB. Lets\n * `color-mix(in oklab, oklch(...) 50%, transparent)` resolve when\n * Tailwind emits the source color in a wide-gamut space (every\n * built-in `bg-red-500` / `shadow-red-500` does, in v4).\n * @param text Candidate wide-gamut / named CSS color string.\n * @param multiplier Alpha multiplier (0…1).\n * @returns `rgba(…)` string, or null when culori can't parse `text`.\n */\nfunction alphaFromCulori(text: string, multiplier: number): string | null {\n try {\n const parsed = culoriRgb(text) as { r?: number; g?: number; b?: number; alpha?: number } | undefined\n if (!parsed) return null\n if (![parsed.r, parsed.g, parsed.b].every((v) => typeof v === 'number' && Number.isFinite(v))) return null\n const r = Math.round(Math.max(0, Math.min(1, parsed.r!)) * 255)\n const g = Math.round(Math.max(0, Math.min(1, parsed.g!)) * 255)\n const b = Math.round(Math.max(0, Math.min(1, parsed.b!)) * 255)\n const baseAlpha = typeof parsed.alpha === 'number' ? parsed.alpha : 1\n return `rgba(${r}, ${g}, ${b}, ${roundAlpha(baseAlpha * multiplier)})`\n } catch {\n // culori threw on an unrecognised CSS form — fall through.\n return null\n }\n}\n\n/**\n * Expand `#rgb` / `#rrggbb` / `#rrggbbaa` hex to its `{r, g, b, alpha}`\n * components. Returns null when the digit count doesn't match a CSS hex\n * shape.\n * @param digits Hex digits without the leading `#`.\n * @returns Decoded color or null.\n */\nfunction expandHex(digits: string): { r: number; g: number; b: number; alpha: number } | null {\n const {length} = digits\n if (length === 3 || length === 4) {\n const r = Number.parseInt(digits[0]! + digits[0]!, 16)\n const g = Number.parseInt(digits[1]! + digits[1]!, 16)\n const b = Number.parseInt(digits[2]! + digits[2]!, 16)\n const alpha = length === 4 ? Number.parseInt(digits[3]! + digits[3]!, 16) / 255 : 1\n return Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b) ? null : { r, g, b, alpha }\n }\n if (length === 6 || length === 8) {\n const r = Number.parseInt(digits.slice(0, 2), 16)\n const g = Number.parseInt(digits.slice(2, 4), 16)\n const b = Number.parseInt(digits.slice(4, 6), 16)\n const alpha = length === 8 ? Number.parseInt(digits.slice(6, 8), 16) / 255 : 1\n return Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b) ? null : { r, g, b, alpha }\n }\n return null\n}\n\n/**\n * Strip the matched outer quote characters from a CSS string literal.\n * `--font-sans: 'Inter-Medium'` flows through `var(--font-sans)`\n * substitution as the raw value text — quotes included. Without this\n * step `fontFamily` lands on the RN style as `\"'Inter-Medium'\"` (with\n * literal quote characters), which RN can't match against the registered\n * native font and silently falls back to the system face.\n *\n * Only strips when both ends agree (`'…'` or `\"…\"`) and there are no\n * other top-level quote chars — keeps multi-segment fallbacks like\n * `'Inter', sans-serif` untouched (those get split downstream).\n * @param text Trimmed CSS value.\n * @returns Same text with outer matching quotes removed, or unchanged.\n */\nfunction unquoteCssString(text: string): string {\n if (text.length < 2) return text\n const first = text.codePointAt(0)\n const last = text.codePointAt(text.length - 1)\n if (first === undefined || first !== last) return text\n if (first !== 34 && first !== 39) return text // \" or '\n const inner = text.slice(1, -1)\n // Don't unquote when the inner string itself contains an unescaped\n // matching quote — that means we'd be merging two adjacent literals.\n if (inner.includes(text[0]!)) return text\n return inner\n}\n\n/**\n * Coerce a CSS `font-family` value into the SINGLE typeface name RN wants.\n * CSS font-family is a fallback LIST (`\"Montserrat\", sans-serif`), but RN's\n * `fontFamily` takes one family — so take the first entry and strip its\n * quotes. This is what lets the standard Tailwind convention\n * (`--font-display: \"Name\", sans-serif`) work out of the box: `font-display`\n * resolves to `{ fontFamily: 'Name' }`, not the raw quoted list.\n * @param value Resolved `font-family` value (possibly a quoted list).\n * @returns Bare first-family name.\n */\nexport function coerceFontFamily(value: string): string {\n const first = value.split(',')[0]?.trim() ?? value\n return unquoteCssString(first)\n}\n\n/**\n * Generic CSS font-family keywords — NOT real React Native typefaces. A\n * `font-family` stack made only of these (e.g. the default `font-sans`:\n * `ui-sans-serif, system-ui, sans-serif`) should fall back to RN's system\n * font rather than emit a bogus `fontFamily`.\n */\nconst GENERIC_FONT_FAMILIES: ReadonlySet<string> = new Set([\n 'ui-sans-serif',\n 'ui-serif',\n 'ui-monospace',\n 'ui-rounded',\n 'system-ui',\n 'sans-serif',\n 'serif',\n 'monospace',\n 'cursive',\n 'fantasy',\n 'math',\n 'emoji',\n 'fangsong',\n '-apple-system',\n 'blinkmacsystemfont',\n // Emoji / symbol fonts that Tailwind appends to the default sans stack —\n // never the intended text typeface.\n 'apple color emoji',\n 'segoe ui emoji',\n 'segoe ui symbol',\n 'noto color emoji',\n])\n\n/**\n * Pick the first CONCRETE typeface from a typed `font-family` LIST (a CSS\n * fallback stack). RN takes one family, and generic keywords aren't real\n * faces, so skip them. Returns undefined when the whole stack is generic\n * (→ caller emits nothing → system font).\n * @param families Typed `font-family` value — an array of family-name strings.\n * @returns First concrete family name, or undefined.\n */\nexport function firstConcreteFontFamily(families: readonly unknown[]): string | undefined {\n for (const entry of families) {\n if (typeof entry !== 'string') continue\n const bare = coerceFontFamily(entry)\n if (bare.length > 0 && !GENERIC_FONT_FAMILIES.has(bare.toLowerCase())) return bare\n }\n return undefined\n}\n\n/**\n * Substitute every `var(--name [, fallback])` reference in `text` with\n * the value from `table` (or the fallback clause when the name misses).\n * Paren-balanced so nested `var(…)` refs don't confuse the scanner.\n * Iterates to a fixed point so multi-hop substitutions land in one call\n * (with a safety cap so a malformed self-referential token can't loop).\n * @param text Raw CSS value.\n * @param table var name → resolved value map.\n * @returns Substituted text.\n */\nexport function substituteThemeVars(text: string, table: ReadonlyMap<string, string>): string {\n let current = text\n for (let pass = 0; pass < 8; pass += 1) {\n const next = substitutePass(current, table)\n if (next === current) return next\n current = next\n }\n return current\n}\n"],"names":["cssColorToString","BARE_NUMBER_REGEX","LENGTH_PX_REGEX","LENGTH_REM_REGEX","REM_TO_PX","CALC_RATIO_REGEX","CALC_MUL_REGEX","culoriRgb"],"mappings":"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"}
1
+ {"version":3,"file":"tokens.cjs","sources":["../../../../../src/core/parser/tokens.ts"],"sourcesContent":["import type { Token, TokenOrValue } from 'lightningcss'\nimport { rgb as culoriRgb } from 'culori'\nimport { BARE_NUMBER_REGEX, CALC_MUL_REGEX, CALC_RATIO_REGEX, LENGTH_PX_REGEX, LENGTH_REM_REGEX, REM_TO_PX } from './constants'\nimport { cssColorToString, normalizeColorString } from './color'\nimport type { RNStyleValue } from './types'\n\n/**\n * Extract the fallback clause of a `var(--name, fallback)` by walking the\n * string with paren-depth tracking. Linear-time; safe on nested\n * `var(--a, var(--b, var(--c, 1rem)))` without regex backtracking.\n * @param text CSS value already trimmed.\n * @returns Fallback text, or `null` when `text` is not a `var(..., ...)`\n * with a fallback.\n */\nfunction extractVariableFallback(text: string): string | null {\n if (!text.startsWith('var(') || !text.endsWith(')')) return null\n const inner = text.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).trim()\n }\n return null\n}\n\n/**\n * Find the matching `)` for the opening `var(` whose body starts at\n * `start`. Returns `-1` when the parens are unbalanced.\n * @param text Source text.\n * @param start Index just past the opening `var(`.\n * @returns Index of the matching `)`, or `-1`.\n */\nfunction findBalancedParenEnd(text: string, start: number): number {\n let depth = 1\n for (let index = start; index < text.length; index += 1) {\n const ch = text[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 * Resolve a `var(…)` body (the bit between parentheses). Reads the\n * variable name, then either returns the table lookup or recurses into\n * the fallback clause. When neither resolves, re-wraps as `var(…)` so\n * downstream coercion still sees a well-formed reference.\n * @param body Text between the outer parentheses of a `var()` call.\n * @param table var → value map.\n * @returns Substituted text fragment.\n */\nfunction resolveVariableBody(body: string, table: ReadonlyMap<string, string>): string {\n let depth = 0\n let commaIndex = -1\n for (const [index, ch] of [...body].entries()) {\n if (ch === '(') depth += 1\n else if (ch === ')') depth -= 1\n else if (ch === ',' && depth === 0) {\n commaIndex = index\n break\n }\n }\n const rawName = (commaIndex === -1 ? body : body.slice(0, commaIndex)).trim()\n const fallback = commaIndex === -1 ? null : body.slice(commaIndex + 1).trim()\n const resolved = table.get(rawName)\n if (resolved !== undefined) return resolved\n if (fallback !== null) return substitutePass(fallback, table)\n return `var(${body})`\n}\n\n/**\n * One pass of left-to-right `var(...)` substitution. Separate from the\n * fixed-point driver so the recursion depth stays bounded.\n * @param text Value text to scan.\n * @param table var → value map.\n * @returns Value text after one pass.\n */\nfunction substitutePass(text: string, table: ReadonlyMap<string, string>): string {\n let out = ''\n let index = 0\n while (index < text.length) {\n const head = text.indexOf('var(', index)\n if (head === -1) {\n out += text.slice(index)\n break\n }\n out += text.slice(index, head)\n const end = findBalancedParenEnd(text, head + 4)\n if (end === -1) {\n out += text.slice(head)\n break\n }\n const body = text.slice(head + 4, end)\n out += resolveVariableBody(body, table)\n index = end + 1\n }\n return out\n}\n\n/**\n * Serialize a list of `TokenOrValue` nodes into a CSS-ish value string.\n * Preserves the CSS form closely enough for downstream numeric coercion.\n * @param tokens Token list from an unparsed declaration or custom-property body.\n * @returns Concatenated CSS-value fragment.\n */\nexport function serializeTokens(tokens: readonly TokenOrValue[]): string {\n let out = ''\n for (const token of tokens) out += serializeToken(token)\n return out.trim()\n}\n\n/**\n * Serialize one `TokenOrValue` node back to CSS text. Handles the shapes\n * Tailwind v4 actually emits in utility-class bodies: raw tokens, `var()`\n * references, and numeric functions (`calc()`).\n * @param token One token node.\n * @returns CSS-value fragment.\n */\nexport function serializeToken(token: TokenOrValue): string {\n switch (token.type) {\n case 'token': {\n return serializeRawToken(token.value)\n }\n case 'var': {\n const head = token.value.name.ident\n const { fallback } = token.value\n if (!fallback || fallback.length === 0) return `var(${head})`\n return `var(${head}, ${serializeTokens(fallback)})`\n }\n case 'function': {\n return `${token.value.name}(${serializeTokens(token.value.arguments)})`\n }\n case 'length': {\n return `${token.value.value}${token.value.unit}`\n }\n case 'dashed-ident': {\n return token.value\n }\n case 'angle': {\n return `${token.value.value}${token.value.type}`\n }\n case 'time': {\n const unit = token.value.type === 'milliseconds' ? 'ms' : 's'\n return `${token.value.value}${unit}`\n }\n case 'resolution': {\n return `${token.value.value}${token.value.type}`\n }\n case 'color': {\n // Pre-resolved CSS color (`oklch(...)`, `rgb(...)`, etc.) — render\n // it back to a hex/rgba string RN can read.\n return cssColorToString(token.value)\n }\n case 'env':\n case 'unresolved-color':\n case 'url':\n case 'animation-name': {\n return ''\n }\n default: {\n return ''\n }\n }\n}\n\n/**\n * Serialize a raw `Token` back to CSS text. `TokenOrValue` with\n * `type === 'token'` wraps one of these; the discriminated union lets\n * TypeScript narrow per branch without casts.\n * @param token Raw token.\n * @returns CSS text fragment.\n */\nexport function serializeRawToken(token: Token): string {\n switch (token.type) {\n case 'ident':\n case 'at-keyword':\n case 'string':\n case 'unquoted-url':\n case 'function': {\n return token.value\n }\n case 'hash':\n case 'id-hash': {\n return `#${token.value}`\n }\n case 'number': {\n return String(token.value)\n }\n case 'percentage': {\n return `${token.value * 100}%`\n }\n case 'dimension': {\n return `${token.value}${token.unit}`\n }\n case 'white-space': {\n return ' '\n }\n case 'delim': {\n return token.value\n }\n case 'comma': {\n return ','\n }\n case 'colon':\n case 'semicolon':\n case 'parenthesis-block':\n case 'square-bracket-block':\n case 'curly-bracket-block':\n case 'cdo':\n case 'cdc':\n case 'include-match':\n case 'dash-match':\n case 'prefix-match':\n case 'suffix-match':\n case 'substring-match':\n case 'comment':\n case 'bad-url':\n case 'bad-string': {\n return ''\n }\n default: {\n return ''\n }\n }\n}\n\n/**\n * Coerce the flat serialization of an unparsed value into an RN scalar.\n * Handles the shapes Tailwind v4 actually emits: bare numbers, pixel /\n * rem lengths, calc ratios, and `var(--x, fallback)` where we recurse into\n * the fallback. Anything else passes through as a string.\n * @param text Serialized CSS value.\n * @returns Coerced primitive, or `null` when unrepresentable.\n */\nexport function coerceUnparsedValue(text: string): RNStyleValue | null {\n const trimmed = text.trim()\n if (trimmed.length === 0) return null\n if (BARE_NUMBER_REGEX.test(trimmed)) return Number(trimmed)\n const px = LENGTH_PX_REGEX.exec(trimmed)\n if (px) return Number(px[1])\n const rem = LENGTH_REM_REGEX.exec(trimmed)\n if (rem) return Number(rem[1]) * REM_TO_PX\n const colorMix = evaluateColorMixWithTransparent(trimmed)\n if (colorMix !== null) return colorMix\n // Real two-color `color-mix(in <space>, A, B)` (not the `, transparent)`\n // opacity shape) — resolve it to a concrete sRGB color via culori so the\n // raw, RN-unreadable `color-mix(...)` string never reaches the StyleSheet.\n if (trimmed.toLowerCase().startsWith('color-mix(')) {\n // Resolved → concrete color; unresolvable → null (DROP). Either way the\n // raw `color-mix(...)` text must never fall through to the string path\n // below, where RN would receive an unreadable value and render nothing.\n return normalizeColorString(trimmed)\n }\n const fallback = extractVariableFallback(trimmed)\n if (fallback !== null) return coerceUnparsedValue(fallback)\n const calcRatio = CALC_RATIO_REGEX.exec(trimmed)\n if (calcRatio) {\n const right = Number(calcRatio[2])\n if (right === 0) return null\n return Number(calcRatio[1]) / right\n }\n const calcMul = CALC_MUL_REGEX.exec(trimmed)\n if (calcMul) {\n // Unit-aware multiply: `calc(0.5rem * 2)` → 16 (rem scaled to px).\n // Regex captures `(number)(unit?) * (number)` — the unit is implicit\n // in the match position; rebuild via the full match text.\n const unitMatch = /^calc\\(\\s*-?\\d+(?:\\.\\d+)?(rem|px)?/.exec(trimmed)\n const unit = unitMatch?.[1]\n const base = Number(calcMul[1]) * Number(calcMul[2])\n return unit === 'rem' ? base * REM_TO_PX : base\n }\n return unquoteCssString(trimmed)\n}\n\n/**\n * Evaluate the specific `color-mix(in <space>, <color> <pct>%, transparent)`\n * shape Tailwind v4 emits for opacity-suffixed themed colors (e.g.\n * `border-text/20`, `bg-on-background/30`). The result is the original\n * color with `alpha = originalAlpha * pct/100` — no actual color-space\n * conversion is needed because mixing a color with `transparent` only\n * changes its alpha, regardless of the named space (oklab / srgb /\n * lab / …) — the chrominance is preserved.\n *\n * Returns null when the expression isn't this shape (handed back to\n * the caller for the next coercion strategy).\n * @param text Trimmed CSS value.\n * @returns RN-compatible `rgba(...)` string, or null when unmatched.\n */\nfunction evaluateColorMixWithTransparent(text: string): string | null {\n const lower = text.toLowerCase()\n if (!lower.startsWith('color-mix(')) return null\n // Match the trailing `, transparent)` (allowing optional whitespace).\n const tail = /,\\s*transparent\\s*\\)\\s*$/.exec(text)\n if (!tail) return null\n // Skip the `in <space>` clause (everything up to the FIRST comma after\n // the opening paren). Walking by hand instead of regex because the\n // color slot may itself contain `(...)` (e.g. `rgb(...)`).\n const inComma = text.indexOf(',', 'color-mix('.length)\n if (inComma === -1 || inComma > tail.index) return null\n const middle = text.slice(inComma + 1, tail.index).trim()\n // `<color> <pct>%` — the `<num>%` token is at the END of `middle`.\n // Anchored, no backtracking — explicit `% ` then end.\n const pctMatch = COLOR_MIX_PCT_TAIL.exec(middle)\n if (!pctMatch) return null\n const pct = Number(pctMatch[1]) / 100\n if (!Number.isFinite(pct)) return null\n const colorText = middle.slice(0, pctMatch.index).trim()\n if (colorText.length === 0) return null\n return applyAlphaToCssColor(colorText, pct)\n}\n\n/** End-anchored `<num>%` matcher used to slice a color-mix percentage off the right of an expression. */\n// eslint-disable-next-line sonarjs/slow-regex -- end-anchored, atomic-style group; bounded backtracking is safe.\nconst COLOR_MIX_PCT_TAIL = /(-?\\d+(?:\\.\\d+)?)%$/\n\n/**\n * Multiply the alpha channel of a serialized CSS color by `multiplier`\n * (0…1). Recognises `#rgb` / `#rrggbb` / `#rrggbbaa` hex, named colors\n * (only `transparent` matters here), and `rgb(…)` / `rgba(…)` forms —\n * which is what theme tokens resolve to after substitution.\n * @param color CSS color text.\n * @param multiplier Alpha multiplier (0…1).\n * @returns `rgba(r, g, b, a)` string with the adjusted alpha.\n */\nfunction applyAlphaToCssColor(color: string, multiplier: number): string | null {\n const trimmed = color.trim()\n if (trimmed === 'transparent') return 'rgba(0, 0, 0, 0)'\n // Nested color-mix — Tailwind's `shadow-<token>/<opacity>` emits\n // `color-mix(… color-mix(… <token> N%, transparent) <alpha>, transparent)`.\n // Resolve the inner mix to a concrete color first, then apply this alpha.\n if (trimmed.toLowerCase().startsWith('color-mix(')) {\n const inner = evaluateColorMixWithTransparent(trimmed)\n if (inner !== null) return applyAlphaToCssColor(inner, multiplier)\n }\n return alphaFromHex(trimmed, multiplier) ?? alphaFromRgbFunction(trimmed, multiplier) ?? alphaFromCulori(trimmed, multiplier)\n}\n\n/**\n * Round a composed alpha to 4 decimals — `0.2 * 1` round-trips through f32 as\n * `0.20000000298…`; the rounded form keeps generated rgba strings compact.\n * @param alpha Raw alpha product.\n * @returns Rounded alpha.\n */\nfunction roundAlpha(alpha: number): number {\n return Math.round(alpha * 10_000) / 10_000\n}\n\n/**\n * Apply the alpha multiplier to a hex literal, expanding 3/4/6/8-digit forms.\n * @param text Candidate hex color string.\n * @param multiplier Alpha multiplier (0…1).\n * @returns `rgba(…)` string, or null when `text` is not a hex literal.\n */\nfunction alphaFromHex(text: string, multiplier: number): string | null {\n const hexMatch = /^#([0-9a-fA-F]{3,8})$/.exec(text)\n if (!hexMatch) return null\n const expanded = expandHex(hexMatch[1]!)\n if (!expanded) return null\n return `rgba(${expanded.r}, ${expanded.g}, ${expanded.b}, ${roundAlpha(expanded.alpha * multiplier)})`\n}\n\n/**\n * Apply alpha to an `rgb(…)` / `rgba(…)` literal. Walks the channels by\n * hand instead of a multi-capture regex (the linter flags the regex\n * form as backtracking-prone).\n * @param text Candidate `rgb(…)` / `rgba(…)` color string.\n * @param multiplier Alpha multiplier (0…1).\n * @returns `rgba(…)` string, or null when `text` is not an rgb function.\n */\nfunction alphaFromRgbFunction(text: string, multiplier: number): string | null {\n if (!text.startsWith('rgb(') && !text.startsWith('rgba(')) return null\n const inner = text.slice(text.indexOf('(') + 1, -1)\n const channels = inner.split(/\\s*[\\s,]\\s*/).filter((part) => part.length > 0)\n if (channels.length !== 3 && channels.length !== 4) return null\n const r = Math.round(Number(channels[0]))\n const g = Math.round(Number(channels[1]))\n const b = Math.round(Number(channels[2]))\n const baseAlpha = channels.length === 4 ? Number(channels[3]) : 1\n if (![r, g, b, baseAlpha].every((value) => Number.isFinite(value))) return null\n return `rgba(${r}, ${g}, ${b}, ${roundAlpha(baseAlpha * multiplier)})`\n}\n\n/**\n * Fallback for wide-gamut color forms (`oklch`, `oklab`, `lab`, `lch`,\n * `hsl`, …) — culori parses every CSS color shape and yields RGB. Lets\n * `color-mix(in oklab, oklch(...) 50%, transparent)` resolve when\n * Tailwind emits the source color in a wide-gamut space (every\n * built-in `bg-red-500` / `shadow-red-500` does, in v4).\n * @param text Candidate wide-gamut / named CSS color string.\n * @param multiplier Alpha multiplier (0…1).\n * @returns `rgba(…)` string, or null when culori can't parse `text`.\n */\nfunction alphaFromCulori(text: string, multiplier: number): string | null {\n try {\n const parsed = culoriRgb(text) as { r?: number; g?: number; b?: number; alpha?: number } | undefined\n if (!parsed) return null\n if (![parsed.r, parsed.g, parsed.b].every((v) => typeof v === 'number' && Number.isFinite(v))) return null\n const r = Math.round(Math.max(0, Math.min(1, parsed.r!)) * 255)\n const g = Math.round(Math.max(0, Math.min(1, parsed.g!)) * 255)\n const b = Math.round(Math.max(0, Math.min(1, parsed.b!)) * 255)\n const baseAlpha = typeof parsed.alpha === 'number' ? parsed.alpha : 1\n return `rgba(${r}, ${g}, ${b}, ${roundAlpha(baseAlpha * multiplier)})`\n } catch {\n // culori threw on an unrecognised CSS form — fall through.\n return null\n }\n}\n\n/**\n * Expand `#rgb` / `#rrggbb` / `#rrggbbaa` hex to its `{r, g, b, alpha}`\n * components. Returns null when the digit count doesn't match a CSS hex\n * shape.\n * @param digits Hex digits without the leading `#`.\n * @returns Decoded color or null.\n */\nfunction expandHex(digits: string): { r: number; g: number; b: number; alpha: number } | null {\n const {length} = digits\n if (length === 3 || length === 4) {\n const r = Number.parseInt(digits[0]! + digits[0]!, 16)\n const g = Number.parseInt(digits[1]! + digits[1]!, 16)\n const b = Number.parseInt(digits[2]! + digits[2]!, 16)\n const alpha = length === 4 ? Number.parseInt(digits[3]! + digits[3]!, 16) / 255 : 1\n return Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b) ? null : { r, g, b, alpha }\n }\n if (length === 6 || length === 8) {\n const r = Number.parseInt(digits.slice(0, 2), 16)\n const g = Number.parseInt(digits.slice(2, 4), 16)\n const b = Number.parseInt(digits.slice(4, 6), 16)\n const alpha = length === 8 ? Number.parseInt(digits.slice(6, 8), 16) / 255 : 1\n return Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b) ? null : { r, g, b, alpha }\n }\n return null\n}\n\n/**\n * Strip the matched outer quote characters from a CSS string literal.\n * `--font-sans: 'Inter-Medium'` flows through `var(--font-sans)`\n * substitution as the raw value text — quotes included. Without this\n * step `fontFamily` lands on the RN style as `\"'Inter-Medium'\"` (with\n * literal quote characters), which RN can't match against the registered\n * native font and silently falls back to the system face.\n *\n * Only strips when both ends agree (`'…'` or `\"…\"`) and there are no\n * other top-level quote chars — keeps multi-segment fallbacks like\n * `'Inter', sans-serif` untouched (those get split downstream).\n * @param text Trimmed CSS value.\n * @returns Same text with outer matching quotes removed, or unchanged.\n */\nfunction unquoteCssString(text: string): string {\n if (text.length < 2) return text\n const first = text.codePointAt(0)\n const last = text.codePointAt(text.length - 1)\n if (first === undefined || first !== last) return text\n if (first !== 34 && first !== 39) return text // \" or '\n const inner = text.slice(1, -1)\n // Don't unquote when the inner string itself contains an unescaped\n // matching quote — that means we'd be merging two adjacent literals.\n if (inner.includes(text[0]!)) return text\n return inner\n}\n\n/**\n * Coerce a CSS `font-family` value into the SINGLE typeface name RN wants.\n * CSS font-family is a fallback LIST (`\"Montserrat\", sans-serif`), but RN's\n * `fontFamily` takes one family — so take the first entry and strip its\n * quotes. This is what lets the standard Tailwind convention\n * (`--font-display: \"Name\", sans-serif`) work out of the box: `font-display`\n * resolves to `{ fontFamily: 'Name' }`, not the raw quoted list.\n * @param value Resolved `font-family` value (possibly a quoted list).\n * @returns Bare first-family name.\n */\nexport function coerceFontFamily(value: string): string {\n const first = value.split(',')[0]?.trim() ?? value\n return unquoteCssString(first)\n}\n\n/**\n * Generic CSS font-family keywords — NOT real React Native typefaces. A\n * `font-family` stack made only of these (e.g. the default `font-sans`:\n * `ui-sans-serif, system-ui, sans-serif`) should fall back to RN's system\n * font rather than emit a bogus `fontFamily`.\n */\nconst GENERIC_FONT_FAMILIES: ReadonlySet<string> = new Set([\n 'ui-sans-serif',\n 'ui-serif',\n 'ui-monospace',\n 'ui-rounded',\n 'system-ui',\n 'sans-serif',\n 'serif',\n 'monospace',\n 'cursive',\n 'fantasy',\n 'math',\n 'emoji',\n 'fangsong',\n '-apple-system',\n 'blinkmacsystemfont',\n // Emoji / symbol fonts that Tailwind appends to the default sans stack —\n // never the intended text typeface.\n 'apple color emoji',\n 'segoe ui emoji',\n 'segoe ui symbol',\n 'noto color emoji',\n])\n\n/**\n * Pick the first CONCRETE typeface from a typed `font-family` LIST (a CSS\n * fallback stack). RN takes one family, and generic keywords aren't real\n * faces, so skip them. Returns undefined when the whole stack is generic\n * (→ caller emits nothing → system font).\n * @param families Typed `font-family` value — an array of family-name strings.\n * @returns First concrete family name, or undefined.\n */\nexport function firstConcreteFontFamily(families: readonly unknown[]): string | undefined {\n for (const entry of families) {\n if (typeof entry !== 'string') continue\n const bare = coerceFontFamily(entry)\n if (bare.length > 0 && !GENERIC_FONT_FAMILIES.has(bare.toLowerCase())) return bare\n }\n return undefined\n}\n\n/**\n * Substitute every `var(--name [, fallback])` reference in `text` with\n * the value from `table` (or the fallback clause when the name misses).\n * Paren-balanced so nested `var(…)` refs don't confuse the scanner.\n * Iterates to a fixed point so multi-hop substitutions land in one call\n * (with a safety cap so a malformed self-referential token can't loop).\n * @param text Raw CSS value.\n * @param table var name → resolved value map.\n * @returns Substituted text.\n */\nexport function substituteThemeVars(text: string, table: ReadonlyMap<string, string>): string {\n let current = text\n for (let pass = 0; pass < 8; pass += 1) {\n const next = substitutePass(current, table)\n if (next === current) return next\n current = next\n }\n return current\n}\n"],"names":["cssColorToString","BARE_NUMBER_REGEX","LENGTH_PX_REGEX","LENGTH_REM_REGEX","REM_TO_PX","normalizeColorString","CALC_RATIO_REGEX","CALC_MUL_REGEX","culoriRgb"],"mappings":"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"}
@@ -1228,6 +1228,12 @@ function parseRgbaExpression(text) {
1228
1228
  if (typeof alphaText === 'string') {
1229
1229
  opacity = alphaText.endsWith('%') ? Number(alphaText.slice(0, -1)) / 100 : Number(alphaText);
1230
1230
  }
1231
+ // CSS Color 4: a `none` (or otherwise non-numeric) alpha parses to NaN here.
1232
+ // Its used value when compositing is 0 (fully transparent) — and crucially
1233
+ // RN throws on a NaN `shadowOpacity`, so collapse any non-finite alpha to 0
1234
+ // before it can reach a numeric style prop.
1235
+ if (!Number.isFinite(opacity))
1236
+ opacity = 0;
1231
1237
  const hex = `#${[r, g, b]
1232
1238
  .map((n) => Math.max(0, Math.min(255, Math.round(Number(n))))
1233
1239
  .toString(16)