rnwind 0.0.10 → 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.
- package/lib/cjs/core/normalize-classname.cjs +3 -1
- package/lib/cjs/core/normalize-classname.cjs.map +1 -1
- package/lib/cjs/core/parser/border-dispatcher.cjs +20 -10
- package/lib/cjs/core/parser/border-dispatcher.cjs.map +1 -1
- package/lib/cjs/core/parser/color-properties-dispatcher.cjs +7 -5
- package/lib/cjs/core/parser/color-properties-dispatcher.cjs.map +1 -1
- package/lib/cjs/core/parser/color.cjs +194 -10
- package/lib/cjs/core/parser/color.cjs.map +1 -1
- package/lib/cjs/core/parser/color.d.ts +18 -3
- package/lib/cjs/core/parser/declaration.cjs +62 -4
- package/lib/cjs/core/parser/declaration.cjs.map +1 -1
- package/lib/cjs/core/parser/layout-dispatcher.cjs +32 -2
- package/lib/cjs/core/parser/layout-dispatcher.cjs.map +1 -1
- package/lib/cjs/core/parser/shorthand.cjs +10 -3
- package/lib/cjs/core/parser/shorthand.cjs.map +1 -1
- package/lib/cjs/core/parser/tokens.cjs +9 -0
- package/lib/cjs/core/parser/tokens.cjs.map +1 -1
- package/lib/cjs/core/parser/tw-parser.cjs +89 -2
- package/lib/cjs/core/parser/tw-parser.cjs.map +1 -1
- package/lib/cjs/core/parser/tw-parser.d.ts +2 -0
- package/lib/cjs/core/parser/typography-dispatcher.cjs +15 -8
- package/lib/cjs/core/parser/typography-dispatcher.cjs.map +1 -1
- package/lib/cjs/core/style-builder/union-builder.cjs +81 -2
- package/lib/cjs/core/style-builder/union-builder.cjs.map +1 -1
- package/lib/cjs/core/style-builder/union-builder.d.ts +28 -0
- package/lib/cjs/metro/state.cjs +74 -13
- package/lib/cjs/metro/state.cjs.map +1 -1
- package/lib/cjs/metro/state.d.ts +18 -0
- package/lib/cjs/metro/transformer.cjs +10 -4
- package/lib/cjs/metro/transformer.cjs.map +1 -1
- package/lib/cjs/metro/with-config.cjs +57 -0
- package/lib/cjs/metro/with-config.cjs.map +1 -1
- package/lib/cjs/metro/with-config.d.ts +12 -0
- package/lib/cjs/metro/wrap-imports.cjs +36 -1
- package/lib/cjs/metro/wrap-imports.cjs.map +1 -1
- package/lib/cjs/runtime/hooks/use-scheme.cjs +14 -7
- package/lib/cjs/runtime/hooks/use-scheme.cjs.map +1 -1
- package/lib/cjs/runtime/resolve.cjs +6 -2
- package/lib/cjs/runtime/resolve.cjs.map +1 -1
- package/lib/cjs/runtime/resolve.d.ts +5 -1
- package/lib/esm/core/normalize-classname.mjs +3 -1
- package/lib/esm/core/normalize-classname.mjs.map +1 -1
- package/lib/esm/core/parser/border-dispatcher.mjs +21 -11
- package/lib/esm/core/parser/border-dispatcher.mjs.map +1 -1
- package/lib/esm/core/parser/color-properties-dispatcher.mjs +8 -6
- package/lib/esm/core/parser/color-properties-dispatcher.mjs.map +1 -1
- package/lib/esm/core/parser/color.d.ts +18 -3
- package/lib/esm/core/parser/color.mjs +195 -12
- package/lib/esm/core/parser/color.mjs.map +1 -1
- package/lib/esm/core/parser/declaration.mjs +63 -5
- package/lib/esm/core/parser/declaration.mjs.map +1 -1
- package/lib/esm/core/parser/layout-dispatcher.mjs +32 -2
- package/lib/esm/core/parser/layout-dispatcher.mjs.map +1 -1
- package/lib/esm/core/parser/shorthand.mjs +11 -4
- package/lib/esm/core/parser/shorthand.mjs.map +1 -1
- package/lib/esm/core/parser/tokens.mjs +10 -1
- package/lib/esm/core/parser/tokens.mjs.map +1 -1
- package/lib/esm/core/parser/tw-parser.d.ts +2 -0
- package/lib/esm/core/parser/tw-parser.mjs +69 -0
- package/lib/esm/core/parser/tw-parser.mjs.map +1 -1
- package/lib/esm/core/parser/typography-dispatcher.mjs +15 -8
- package/lib/esm/core/parser/typography-dispatcher.mjs.map +1 -1
- package/lib/esm/core/style-builder/union-builder.d.ts +28 -0
- package/lib/esm/core/style-builder/union-builder.mjs +82 -3
- package/lib/esm/core/style-builder/union-builder.mjs.map +1 -1
- package/lib/esm/metro/state.d.ts +18 -0
- package/lib/esm/metro/state.mjs +75 -14
- package/lib/esm/metro/state.mjs.map +1 -1
- package/lib/esm/metro/transformer.mjs +10 -4
- package/lib/esm/metro/transformer.mjs.map +1 -1
- package/lib/esm/metro/with-config.d.ts +12 -0
- package/lib/esm/metro/with-config.mjs +58 -2
- package/lib/esm/metro/with-config.mjs.map +1 -1
- package/lib/esm/metro/wrap-imports.mjs +36 -1
- package/lib/esm/metro/wrap-imports.mjs.map +1 -1
- package/lib/esm/runtime/hooks/use-scheme.mjs +14 -7
- package/lib/esm/runtime/hooks/use-scheme.mjs.map +1 -1
- package/lib/esm/runtime/resolve.d.ts +5 -1
- package/lib/esm/runtime/resolve.mjs +6 -2
- package/lib/esm/runtime/resolve.mjs.map +1 -1
- package/package.json +1 -1
- package/src/core/normalize-classname.ts +4 -1
- package/src/core/parser/border-dispatcher.ts +22 -11
- package/src/core/parser/color-properties-dispatcher.ts +7 -5
- package/src/core/parser/color.ts +182 -11
- package/src/core/parser/declaration.ts +61 -5
- package/src/core/parser/layout-dispatcher.ts +34 -2
- package/src/core/parser/shorthand.ts +9 -3
- package/src/core/parser/tokens.ts +10 -1
- package/src/core/parser/tw-parser.ts +71 -1
- package/src/core/parser/typography-dispatcher.ts +15 -6
- package/src/core/style-builder/union-builder.ts +83 -3
- package/src/metro/state.ts +117 -12
- package/src/metro/transformer.ts +9 -4
- package/src/metro/with-config.ts +59 -1
- package/src/metro/wrap-imports.ts +36 -1
- package/src/runtime/hooks/use-scheme.ts +13 -6
- package/src/runtime/resolve.ts +6 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declaration.mjs","sources":["../../../../../src/core/parser/declaration.ts"],"sourcesContent":["/* eslint-disable sonarjs/cognitive-complexity -- the main Declaration → RN-entries dispatcher is intentionally a flat switch so each branch keeps its narrowed value type */\nimport type { Declaration as LcDeclaration, TokenOrValue } from 'lightningcss'\nimport { kebabToCamel } from './case-convert'\nimport { cssColorToString, normalizeColorString } from './color'\nimport { dimensionPercentageToNumber, gapValueToValue, lengthPercentageOrAutoToValue, sizeLikeToValue } from './length'\nimport {\n expandBorderColor,\n expandBorderRadius,\n expandFourSided,\n expandGap,\n expandLogicalBlock,\n expandLogicalInline,\n flexToEntries,\n} from './shorthand'\nimport { coerceFontFamily, coerceUnparsedValue, serializeTokens, substituteThemeVars } from './tokens'\nimport { displayToEntries, fontSizeToPx, fontWeightToValue, zIndexToNumber } from './typography'\nimport { dispatchMotionDeclaration } from './motion-dispatcher'\nimport { dispatchTypographyDeclaration } from './typography-dispatcher'\nimport { dispatchLayoutDeclaration } from './layout-dispatcher'\nimport { dispatchColorPropertyDeclaration } from './color-properties-dispatcher'\nimport { dispatchBorderDeclaration } from './border-dispatcher'\nimport { detectSafeAreaMarker } from './safe-area'\nimport type { RNEntry } from './types'\n\n/** CSS timing-function properties that need `cubic-bezier(...)` snapping. */\nconst TIMING_FUNCTION_PROPS = new Set(['transition-timing-function', 'animation-timing-function'])\n\n/** CSS easing keywords Reanimated v4's CSS engine accepts as strings. */\nconst CSS_EASING_KEYWORDS = new Set(['linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out', 'step-start', 'step-end'])\n\n/** CSS properties with no useful RN equivalent — silently dropped. */\nconst UNSUPPORTED_LOGICAL_PROPS = new Set([\n 'border-inline-style',\n 'border-block-style',\n 'border-inline-start-style',\n 'border-inline-end-style',\n 'border-block-start-style',\n 'border-block-end-style',\n])\n\n/**\n * Web-only CSS properties Tailwind v4 emits that have NO React Native style\n * equivalent. Without this denylist they reach the generic `kebabToCamel`\n * fallback and emit dead keys (`objectPosition`, `textWrap`, `willChange`,\n * `float`, `columns`, `-webkit-line-clamp` → `WebkitLineClamp`, …) that bloat\n * every StyleSheet and read as \"supported\" when they do nothing. Dropping the\n * property name (kebab-case, pre-camel) is safe: it only excludes known\n * web-only props — anything RN supports is handled by a typed branch above.\n * (line-clamp's real RN behaviour comes from `numberOfLines` in text-truncate.)\n */\nconst RN_UNSUPPORTED_PROPERTIES: ReadonlySet<string> = new Set([\n 'object-position',\n 'text-wrap',\n 'will-change',\n 'columns',\n 'float',\n 'clear',\n 'table-layout',\n 'caption-side',\n 'transform-style',\n 'background-blend-mode',\n 'scroll-behavior',\n 'overscroll-behavior',\n 'overscroll-behavior-x',\n 'overscroll-behavior-y',\n 'scroll-snap-type',\n 'scroll-snap-align',\n 'scroll-snap-stop',\n 'break-after',\n 'break-before',\n 'break-inside',\n 'content',\n 'field-sizing',\n 'forced-color-adjust',\n 'text-shadow',\n 'touch-action',\n 'backdrop-filter',\n '-webkit-backdrop-filter',\n '-webkit-line-clamp',\n '-webkit-box-orient',\n '-webkit-font-smoothing',\n '-moz-osx-font-smoothing',\n])\n\n/** CSS single-sided logical-inline property → RN writing-direction Yoga key. */\nconst LOGICAL_INLINE_TO_RN: Record<string, string> = {\n 'margin-inline-start': 'marginStart',\n 'margin-inline-end': 'marginEnd',\n 'padding-inline-start': 'paddingStart',\n 'padding-inline-end': 'paddingEnd',\n}\n\n/**\n * Logical border-COLOR property → physical RN side key(s). Custom `@theme`\n * tokens reach the unparsed path as `border-inline-color: var(--color-x)`,\n * which a plain `kebabToCamel` would turn into `borderInlineColor` — a key RN\n * silently drops, so the border color never paints. Lower to the physical\n * keys RN actually honors, matching the typed `dispatchBorderDeclaration`.\n */\nconst LOGICAL_BORDER_COLOR_SIDES: Record<string, readonly string[]> = {\n 'border-inline-color': ['borderLeftColor', 'borderRightColor'],\n 'border-block-color': ['borderTopColor', 'borderBottomColor'],\n 'border-inline-start-color': ['borderLeftColor'],\n 'border-inline-end-color': ['borderRightColor'],\n 'border-block-start-color': ['borderTopColor'],\n 'border-block-end-color': ['borderBottomColor'],\n}\n\n/**\n * Pick the closest predefined CSS easing keyword for a `cubic-bezier`\n * control-point set. Mirrors {@link snapCubicBezierToKeyword} in\n * `animation.ts` — kept here so the unparsed-string path doesn't need\n * to import a typed-only helper.\n * @param x1 First control-point x (0–1).\n * @param y1 First control-point y (0–1).\n * @param x2 Second control-point x (0–1).\n * @param y2 Second control-point y (0–1).\n * @returns CSS easing keyword.\n */\nfunction snapBezier(x1: number, y1: number, x2: number, y2: number): string {\n const tol = 0.01\n const eq = (a: number, b: number): boolean => Math.abs(a - b) < tol\n if (eq(x1, 0) && eq(y1, 0) && eq(x2, 1) && eq(y2, 1)) return 'linear'\n if (eq(x1, 0.25) && eq(y1, 0.1) && eq(x2, 0.25) && eq(y2, 1)) return 'ease'\n if (eq(x1, 0.4) && eq(y1, 0) && eq(x2, 1) && eq(y2, 1)) return 'ease-in'\n if (eq(x1, 0) && eq(y1, 0) && eq(x2, 0.2) && eq(y2, 1)) return 'ease-out'\n if (eq(x1, 0.4) && eq(y1, 0) && eq(x2, 0.2) && eq(y2, 1)) return 'ease-in-out'\n const startsFlat = x1 < 0.1\n const endsFlat = x2 > 0.9\n if (startsFlat && !endsFlat) return 'ease-out'\n if (!startsFlat && endsFlat) return 'ease-in'\n return 'ease-in-out'\n}\n\n/**\n * Snap a cubic-bezier expression string to the closest CSS keyword\n * Reanimated v4's CSS engine accepts. Strings that already are keywords\n * pass through unchanged.\n * @param value Resolved value text from an unparsed timing-function declaration.\n * @returns CSS easing keyword.\n */\nfunction coerceCubicBezierString(value: string): string {\n const text = value.trim()\n if (CSS_EASING_KEYWORDS.has(text)) return text\n const match = /^cubic-bezier\\(\\s*([\\d.-]+)\\s*,\\s*([\\d.-]+)\\s*,\\s*([\\d.-]+)\\s*,\\s*([\\d.-]+)\\s*\\)$/.exec(text)\n if (!match) return 'ease-in-out'\n const [, x1, y1, x2, y2] = match\n return snapBezier(Number(x1), Number(y1), Number(x2), Number(y2))\n}\n\n/**\n * Whether `text` has a whitespace char OUTSIDE any parenthesised group —\n * the signature of a multi-token CSS value (`2px solid #000`) rather than a\n * single color (`#000`, `rgb(1 2 3)`, `red`).\n * @param text Resolved value text.\n * @returns True when a top-level space is present.\n */\nfunction hasTopLevelSpace(text: string): boolean {\n let depth = 0\n for (const ch of text.trim()) {\n if (ch === '(') depth += 1\n else if (ch === ')') depth = Math.max(0, depth - 1)\n else if (depth === 0 && (ch === ' ' || ch === '\\t' || ch === '\\n')) return true\n }\n return false\n}\n\n/**\n * Fast-path check for the handful of color property names Tailwind emits.\n * @param property Kebab-case CSS property name.\n * @returns Whether the property's value should be treated as a color.\n */\nfunction isColorProperty(property: string): boolean {\n return (\n property === 'color' ||\n property === 'background-color' ||\n // SVG paint props (`fill-<token>` / `stroke-<token>` via react-native-svg) —\n // they don't end in `-color`, so without this they'd skip normalization and\n // leak a raw `oklch(…)` string for custom `@theme` tokens.\n property === 'fill' ||\n property === 'stroke' ||\n (property.startsWith('border-') && property.endsWith('-color')) ||\n property.endsWith('-color')\n )\n}\n\n/**\n * Convert an unparsed declaration (typical Tailwind v4 output containing\n * `var()` / `calc()`) into RN entries. Serializes the token list, then\n * coerces the flat string into a number / keyword / length via a tight\n * set of shapes Tailwind actually emits.\n * @param property Real property name (kebab-case).\n * @param tokens Token list from lightningcss.\n * @param themeVars Optional lookup table for resolving `var(--x)` references.\n * @returns RN entries — usually one, empty when unusable.\n */\nfunction unparsedToEntries(\n property: string,\n tokens: readonly TokenOrValue[],\n themeVars: ReadonlyMap<string, string> | undefined,\n): readonly RNEntry[] {\n if (property.length === 0) return []\n if (RN_UNSUPPORTED_PROPERTIES.has(property)) return []\n // Safe-area detection runs BEFORE token serialization because\n // `env()` serializes to an empty string, which would strip the side\n // info we need. If the tokens encode a recognised `env(safe-area-inset-*)`\n // pattern (pure / `max(..., n)` / `calc(...+n)` / `h-screen-safe`),\n // emit a runtime-resolved marker instead.\n if (UNSUPPORTED_LOGICAL_PROPS.has(property)) return []\n const safe = detectSafeAreaMarker(tokens, themeVars)\n if (safe !== null) return [[kebabToCamel(property), safe]]\n let text = serializeTokens(tokens)\n if (themeVars && themeVars.size > 0) text = substituteThemeVars(text, themeVars)\n const coerced = coerceUnparsedValue(text)\n if (coerced === null) return []\n // Skip values still carrying an unresolved `var(--tw-*)` ANYWHERE in the\n // string — they came from a `@property --tw-*` composable with no real\n // fallback (e.g. `filter: blur(8px) var(--tw-brightness) …`,\n // `transform: rotateX(45deg) var(--tw-rotate-y) …`, `touch-action`,\n // `scroll-snap-type`). RN can't evaluate the cascade, so a leaked `var()`\n // makes the whole declaration an invalid string RN rejects — drop it and\n // rely on RN's default rather than emit garbage. `var(--color-*)` refs are\n // already substituted above, so anything left is a genuine composable miss.\n if (typeof coerced === 'string' && coerced.includes('var(')) return []\n // RN `fontFamily` is a single typeface, not a CSS fallback list — take\n // the first family so `--font-x: \"Name\", sans-serif` works out of the box.\n if (property === 'font-family' && typeof coerced === 'string') {\n return [['fontFamily', coerceFontFamily(coerced)]]\n }\n // Logical-direction CSS properties RN doesn't have direct equivalents\n // for. Keep the dropped names in one place so it's easy to audit.\n if (UNSUPPORTED_LOGICAL_PROPS.has(property)) return []\n if (TIMING_FUNCTION_PROPS.has(property) && typeof coerced === 'string') {\n // `transition-colors` and similar emit `var(--tw-ease, cubic-bezier(...))`\n // which serializes to a cubic-bezier STRING after substitution.\n // Reanimated v4's CSS engine rejects those — snap to the closest\n // predefined keyword (same logic as the typed `EasingFunction` path).\n return [[kebabToCamel(property), coerceCubicBezierString(coerced)]]\n }\n if (isColorProperty(property) && typeof coerced === 'string') {\n // A color is a single token. Tailwind compiles an arbitrary shorthand like\n // `border-[2px_solid_#000]` to `border-color: 2px solid #000` (invalid for\n // a color property → unparsed), which would otherwise emit\n // `borderColor: \"2px solid #000000\"` — a string RN rejects. A top-level\n // space (outside parens — `rgb(1 2 3)` keeps its inner spaces) means it's a\n // multi-token shorthand, not a color: drop it.\n if (hasTopLevelSpace(coerced)) return []\n // Lower modern color spaces (`oklch(…)`, `lab(…)`, `color(p3 …)`) that\n // RN can't paint to sRGB; hex/rgb/hsl/named pass through unchanged.\n const color = normalizeColorString(coerced) ?? coerced\n // Logical border-color utilities must lower to physical RN side keys —\n // RN ignores `borderInlineColor` / `borderInlineStartColor`.\n const sides = LOGICAL_BORDER_COLOR_SIDES[property]\n if (sides) return sides.map((key): RNEntry => [key, color])\n return [[kebabToCamel(property), color]]\n }\n return [[kebabToCamel(property), coerced]]\n}\n\n/**\n * Convert one lightningcss `Declaration` into zero-or-more RN style\n * entries. Shorthand declarations (padding/margin/border-radius/flex) can\n * emit multiple entries; skipped or unsupported properties emit none.\n *\n * The switch branches on `decl.property` so TypeScript narrows\n * `decl.value` to the exact typed shape for each branch — no casts\n * required. Unknown properties fall through to `[]`.\n * @param decl One declaration from a lightningcss style rule.\n * @param themeVars Optional lookup table for resolving `var(--x)` references inside unparsed values.\n * @returns Array of `[key, value]` entries.\n */\nexport function declarationToRnEntries(decl: LcDeclaration, themeVars?: ReadonlyMap<string, string>): readonly RNEntry[] {\n switch (decl.property) {\n case 'custom': {\n // Lightningcss routes two shapes through `custom`:\n // - Actual CSS custom properties (`--my-var`): no RN meaning, drop.\n // - Real properties it doesn't have a dedicated typed entry for\n // (e.g. `object-fit`, `pointer-events`, future CSS keyword-only\n // props): treat like an unparsed declaration so the keyword\n // surfaces in the RN style.\n const customName = decl.value.name\n if (customName.startsWith('--')) return []\n return unparsedToEntries(customName, decl.value.value ?? [], themeVars)\n }\n case 'unparsed': {\n return unparsedToEntries(decl.value.propertyId.property, decl.value.value, themeVars)\n }\n case 'color':\n case 'background-color':\n case 'border-top-color':\n case 'border-right-color':\n case 'border-bottom-color':\n case 'border-left-color': {\n // `background-color` narrows to `CssColor | 'background'` — the\n // literal keyword means UA default. Skip the keyword.\n if (typeof decl.value === 'string') return []\n return [[kebabToCamel(decl.property), cssColorToString(decl.value)]]\n }\n case 'border-color': {\n return expandBorderColor(decl.value)\n }\n case 'opacity': {\n // Lightningcss hands us an `f32` for opacity, so values like `0.8`\n // round-trip as `0.800000011920929`. Snap to 4 decimals to match the\n // rest of the parser's numeric convention.\n return [[decl.property, Math.round(decl.value * 10_000) / 10_000]]\n }\n case 'z-index': {\n return [['zIndex', zIndexToNumber(decl.value)]]\n }\n case 'top':\n case 'right':\n case 'bottom':\n case 'left': {\n const v = lengthPercentageOrAutoToValue(decl.value)\n if (v === null) return []\n return [[decl.property, v]]\n }\n case 'inset': {\n const top = lengthPercentageOrAutoToValue(decl.value.top)\n const right = lengthPercentageOrAutoToValue(decl.value.right)\n const bottom = lengthPercentageOrAutoToValue(decl.value.bottom)\n const left = lengthPercentageOrAutoToValue(decl.value.left)\n if (top === null || right === null || bottom === null || left === null) return []\n return [\n ['top', top],\n ['right', right],\n ['bottom', bottom],\n ['left', left],\n ]\n }\n case 'inset-inline': {\n const start = lengthPercentageOrAutoToValue(decl.value.inlineStart)\n const end = lengthPercentageOrAutoToValue(decl.value.inlineEnd)\n if (start === null || end === null) return []\n return [\n ['left', start],\n ['right', end],\n ]\n }\n case 'inset-block': {\n const start = lengthPercentageOrAutoToValue(decl.value.blockStart)\n const end = lengthPercentageOrAutoToValue(decl.value.blockEnd)\n if (start === null || end === null) return []\n return [\n ['top', start],\n ['bottom', end],\n ]\n }\n case 'width':\n case 'height':\n case 'min-width':\n case 'min-height':\n case 'max-width':\n case 'max-height': {\n const v = sizeLikeToValue(decl.value)\n if (v === null) return []\n return [[kebabToCamel(decl.property), v]]\n }\n case 'gap': {\n return expandGap(decl.value)\n }\n case 'row-gap':\n case 'column-gap': {\n const v = gapValueToValue(decl.value)\n if (v === null) return []\n return [[kebabToCamel(decl.property), v]]\n }\n case 'font-style': {\n return [['fontStyle', decl.value.type]]\n }\n case 'display': {\n return displayToEntries(decl.value)\n }\n case 'position': {\n return [['position', decl.value.type]]\n }\n case 'font-size': {\n const px = fontSizeToPx(decl.value)\n if (px === null) return []\n return [['fontSize', px]]\n }\n case 'font-weight': {\n return [['fontWeight', fontWeightToValue(decl.value)]]\n }\n case 'padding': {\n return expandFourSided('padding', decl.value)\n }\n case 'margin': {\n return expandFourSided('margin', decl.value)\n }\n case 'padding-inline': {\n return expandLogicalInline('padding', decl.value)\n }\n case 'padding-block': {\n return expandLogicalBlock('padding', decl.value)\n }\n case 'margin-inline': {\n return expandLogicalInline('margin', decl.value)\n }\n case 'margin-block': {\n return expandLogicalBlock('margin', decl.value)\n }\n case 'padding-top':\n case 'padding-right':\n case 'padding-bottom':\n case 'padding-left':\n case 'margin-top':\n case 'margin-right':\n case 'margin-bottom':\n case 'margin-left': {\n const v = lengthPercentageOrAutoToValue(decl.value)\n if (v === null) return []\n return [[kebabToCamel(decl.property), v]]\n }\n case 'border-radius': {\n return expandBorderRadius(decl.value)\n }\n case 'border-top-left-radius':\n case 'border-top-right-radius':\n case 'border-bottom-left-radius':\n case 'border-bottom-right-radius': {\n const [xAxis] = decl.value\n const v = dimensionPercentageToNumber(xAxis)\n if (v === null) return []\n return [[kebabToCamel(decl.property), v]]\n }\n case 'flex': {\n return flexToEntries(decl.value)\n }\n case 'flex-grow':\n case 'flex-shrink': {\n return [[kebabToCamel(decl.property), decl.value]]\n }\n case 'flex-basis': {\n const v = lengthPercentageOrAutoToValue(decl.value)\n if (v === null) return []\n return [['flexBasis', v]]\n }\n default: {\n return (\n dispatchLogicalInline(decl) ??\n dispatchLayoutDeclaration(decl) ??\n dispatchTypographyDeclaration(decl) ??\n dispatchColorPropertyDeclaration(decl) ??\n dispatchBorderDeclaration(decl) ??\n dispatchMotionDeclaration(decl) ??\n []\n )\n }\n }\n}\n\n/**\n * Map single-sided CSS logical-inline props to RN's writing-direction-aware\n * Yoga keys: `ms-2` → `marginStart`, `pe-4` → `paddingEnd`, `start-2` →\n * `start`, `end-3` → `end`. RN resolves start/end against the layout\n * direction, so these stay RTL-correct. Returns null for any other property\n * (so the dispatch chain continues).\n * @param decl One declaration from a lightningcss style rule.\n * @returns RN entries, or null when not a logical-inline property.\n */\nfunction dispatchLogicalInline(decl: LcDeclaration): readonly RNEntry[] | null {\n switch (decl.property) {\n case 'margin-inline-start':\n case 'margin-inline-end':\n case 'padding-inline-start':\n case 'padding-inline-end': {\n const v = lengthPercentageOrAutoToValue(decl.value)\n return v === null ? [] : [[LOGICAL_INLINE_TO_RN[decl.property], v]]\n }\n case 'inset-inline-start': {\n const v = lengthPercentageOrAutoToValue(decl.value)\n return v === null ? [] : [['start', v]]\n }\n case 'inset-inline-end': {\n const v = lengthPercentageOrAutoToValue(decl.value)\n return v === null ? [] : [['end', v]]\n }\n // Logical border-radius corners (`rounded-s/e/ss/se/ee/es-*`). RN has\n // matching keys — `kebabToCamel('border-start-start-radius')` is exactly\n // `borderStartStartRadius`. Value is a `[x, y]` tuple like physical corners.\n case 'border-start-start-radius':\n case 'border-start-end-radius':\n case 'border-end-start-radius':\n case 'border-end-end-radius': {\n const [xAxis] = decl.value\n const v = dimensionPercentageToNumber(xAxis)\n return v === null ? [] : [[kebabToCamel(decl.property), v]]\n }\n default: {\n return null\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"declaration.mjs","sources":["../../../../../src/core/parser/declaration.ts"],"sourcesContent":["/* eslint-disable sonarjs/cognitive-complexity -- the main Declaration → RN-entries dispatcher is intentionally a flat switch so each branch keeps its narrowed value type */\nimport type { Declaration as LcDeclaration, TokenOrValue } from 'lightningcss'\nimport { kebabToCamel } from './case-convert'\nimport { cssColorToString, isCssWideColorKeyword, normalizeColorString } from './color'\nimport { dimensionPercentageToNumber, gapValueToValue, lengthPercentageOrAutoToValue, sizeLikeToValue } from './length'\nimport {\n expandBorderColor,\n expandBorderRadius,\n expandFourSided,\n expandGap,\n expandLogicalBlock,\n expandLogicalInline,\n flexToEntries,\n} from './shorthand'\nimport { coerceFontFamily, coerceUnparsedValue, serializeTokens, substituteThemeVars } from './tokens'\nimport { displayToEntries, fontSizeToPx, fontWeightToValue, zIndexToNumber } from './typography'\nimport { dispatchMotionDeclaration } from './motion-dispatcher'\nimport { dispatchTypographyDeclaration } from './typography-dispatcher'\nimport { dispatchLayoutDeclaration } from './layout-dispatcher'\nimport { dispatchColorPropertyDeclaration } from './color-properties-dispatcher'\nimport { dispatchBorderDeclaration } from './border-dispatcher'\nimport { detectSafeAreaMarker } from './safe-area'\nimport type { RNEntry } from './types'\n\n/** CSS timing-function properties that need `cubic-bezier(...)` snapping. */\nconst TIMING_FUNCTION_PROPS = new Set(['transition-timing-function', 'animation-timing-function'])\n\n/** CSS easing keywords Reanimated v4's CSS engine accepts as strings. */\nconst CSS_EASING_KEYWORDS = new Set(['linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out', 'step-start', 'step-end'])\n\n/** CSS properties with no useful RN equivalent — silently dropped. */\nconst UNSUPPORTED_LOGICAL_PROPS = new Set([\n 'border-inline-style',\n 'border-block-style',\n 'border-inline-start-style',\n 'border-inline-end-style',\n 'border-block-start-style',\n 'border-block-end-style',\n])\n\n/**\n * Web-only CSS properties Tailwind v4 emits that have NO React Native style\n * equivalent. Without this denylist they reach the generic `kebabToCamel`\n * fallback and emit dead keys (`objectPosition`, `textWrap`, `willChange`,\n * `float`, `columns`, `-webkit-line-clamp` → `WebkitLineClamp`, …) that bloat\n * every StyleSheet and read as \"supported\" when they do nothing. Dropping the\n * property name (kebab-case, pre-camel) is safe: it only excludes known\n * web-only props — anything RN supports is handled by a typed branch above.\n * (line-clamp's real RN behaviour comes from `numberOfLines` in text-truncate.)\n */\nconst RN_UNSUPPORTED_PROPERTIES: ReadonlySet<string> = new Set([\n 'object-position',\n 'text-wrap',\n 'will-change',\n 'columns',\n 'float',\n 'clear',\n 'table-layout',\n 'caption-side',\n // Web table-model props with no RN equivalent. `border-spacing` otherwise\n // reaches the generic fallback and leaks an unresolved `calc(0.25rem * N)`.\n 'border-spacing',\n 'border-collapse',\n 'transform-style',\n 'background-blend-mode',\n 'scroll-behavior',\n 'overscroll-behavior',\n 'overscroll-behavior-x',\n 'overscroll-behavior-y',\n 'scroll-snap-type',\n 'scroll-snap-align',\n 'scroll-snap-stop',\n 'break-after',\n 'break-before',\n 'break-inside',\n 'content',\n 'field-sizing',\n 'forced-color-adjust',\n 'text-shadow',\n // Web-only KEYS RN has no style prop for. `order` leaks through the negative\n // variant (`-order-1` → `order: calc(1 * -1)` unparsed → resolves to `-1`);\n // the positive `order-*` already drops since no typed branch claims it. Adding\n // it here drops BOTH signs. `isolation` (`isolate` / `isolation-auto`) reaches\n // the `custom` path as `isolation: isolate|auto` — also no RN equivalent.\n 'order',\n 'isolation',\n // `normal-nums` reaches the `custom` path as `font-variant-numeric: normal`\n // and leaked the non-RN key `fontVariantNumeric`. RN expresses numeric\n // variants via the `fontVariant` array, not this property — drop it. (The\n // `tabular-nums`/`oldstyle-nums`/… utilities carry their token in dropped\n // `--tw-numeric-*` vars and already resolve to {}; mapping those to\n // `fontVariant` is a tracked future enhancement, not a leak.)\n 'font-variant-numeric',\n 'touch-action',\n 'backdrop-filter',\n '-webkit-backdrop-filter',\n '-webkit-line-clamp',\n '-webkit-box-orient',\n '-webkit-font-smoothing',\n '-moz-osx-font-smoothing',\n])\n\n/**\n * Valid value sets for RN enum style props (keyed by the camelCase RN key).\n * A value outside its prop's set is RN-invalid even when the string itself\n * looks clean — RN ignores or warns on it (`position: 'fixed'`, `display:\n * 'contents'`, `justifyContent: 'stretch' | 'baseline'`, `alignContent:\n * 'normal'`). This is the dimension the leak-shape (`var(`/`calc(`/NaN) check\n * misses. Both the typed `display` / `position` branches AND the generic\n * unparsed fallback consult this — Tailwind routes some keyword-only values\n * (`justify-content: baseline`) through the unparsed channel, which would\n * otherwise emit them via `kebabToCamel` with no enum awareness.\n */\nconst RN_ENUM_VALUES: Readonly<Record<string, ReadonlySet<string>>> = {\n position: new Set(['absolute', 'relative', 'static']),\n display: new Set(['flex', 'none']),\n justifyContent: new Set(['flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'space-evenly']),\n alignContent: new Set(['flex-start', 'flex-end', 'center', 'stretch', 'space-between', 'space-around', 'space-evenly']),\n}\n\n/** CSS single-sided logical-inline property → RN writing-direction Yoga key. */\nconst LOGICAL_INLINE_TO_RN: Record<string, string> = {\n 'margin-inline-start': 'marginStart',\n 'margin-inline-end': 'marginEnd',\n 'padding-inline-start': 'paddingStart',\n 'padding-inline-end': 'paddingEnd',\n}\n\n/**\n * Logical border-COLOR property → physical RN side key(s). Custom `@theme`\n * tokens reach the unparsed path as `border-inline-color: var(--color-x)`,\n * which a plain `kebabToCamel` would turn into `borderInlineColor` — a key RN\n * silently drops, so the border color never paints. Lower to the physical\n * keys RN actually honors, matching the typed `dispatchBorderDeclaration`.\n */\nconst LOGICAL_BORDER_COLOR_SIDES: Record<string, readonly string[]> = {\n 'border-inline-color': ['borderLeftColor', 'borderRightColor'],\n 'border-block-color': ['borderTopColor', 'borderBottomColor'],\n 'border-inline-start-color': ['borderLeftColor'],\n 'border-inline-end-color': ['borderRightColor'],\n 'border-block-start-color': ['borderTopColor'],\n 'border-block-end-color': ['borderBottomColor'],\n}\n\n/**\n * Pick the closest predefined CSS easing keyword for a `cubic-bezier`\n * control-point set. Mirrors {@link snapCubicBezierToKeyword} in\n * `animation.ts` — kept here so the unparsed-string path doesn't need\n * to import a typed-only helper.\n * @param x1 First control-point x (0–1).\n * @param y1 First control-point y (0–1).\n * @param x2 Second control-point x (0–1).\n * @param y2 Second control-point y (0–1).\n * @returns CSS easing keyword.\n */\nfunction snapBezier(x1: number, y1: number, x2: number, y2: number): string {\n const tol = 0.01\n const eq = (a: number, b: number): boolean => Math.abs(a - b) < tol\n if (eq(x1, 0) && eq(y1, 0) && eq(x2, 1) && eq(y2, 1)) return 'linear'\n if (eq(x1, 0.25) && eq(y1, 0.1) && eq(x2, 0.25) && eq(y2, 1)) return 'ease'\n if (eq(x1, 0.4) && eq(y1, 0) && eq(x2, 1) && eq(y2, 1)) return 'ease-in'\n if (eq(x1, 0) && eq(y1, 0) && eq(x2, 0.2) && eq(y2, 1)) return 'ease-out'\n if (eq(x1, 0.4) && eq(y1, 0) && eq(x2, 0.2) && eq(y2, 1)) return 'ease-in-out'\n const startsFlat = x1 < 0.1\n const endsFlat = x2 > 0.9\n if (startsFlat && !endsFlat) return 'ease-out'\n if (!startsFlat && endsFlat) return 'ease-in'\n return 'ease-in-out'\n}\n\n/**\n * Snap a cubic-bezier expression string to the closest CSS keyword\n * Reanimated v4's CSS engine accepts. Strings that already are keywords\n * pass through unchanged.\n * @param value Resolved value text from an unparsed timing-function declaration.\n * @returns CSS easing keyword.\n */\nfunction coerceCubicBezierString(value: string): string {\n const text = value.trim()\n if (CSS_EASING_KEYWORDS.has(text)) return text\n const match = /^cubic-bezier\\(\\s*([\\d.-]+)\\s*,\\s*([\\d.-]+)\\s*,\\s*([\\d.-]+)\\s*,\\s*([\\d.-]+)\\s*\\)$/.exec(text)\n if (!match) return 'ease-in-out'\n const [, x1, y1, x2, y2] = match\n return snapBezier(Number(x1), Number(y1), Number(x2), Number(y2))\n}\n\n/**\n * Whether `text` has a whitespace char OUTSIDE any parenthesised group —\n * the signature of a multi-token CSS value (`2px solid #000`) rather than a\n * single color (`#000`, `rgb(1 2 3)`, `red`).\n * @param text Resolved value text.\n * @returns True when a top-level space is present.\n */\nfunction hasTopLevelSpace(text: string): boolean {\n let depth = 0\n for (const ch of text.trim()) {\n if (ch === '(') depth += 1\n else if (ch === ')') depth = Math.max(0, depth - 1)\n else if (depth === 0 && (ch === ' ' || ch === '\\t' || ch === '\\n')) return true\n }\n return false\n}\n\n/**\n * Fast-path check for the handful of color property names Tailwind emits.\n * @param property Kebab-case CSS property name.\n * @returns Whether the property's value should be treated as a color.\n */\nfunction isColorProperty(property: string): boolean {\n return (\n property === 'color' ||\n property === 'background-color' ||\n // SVG paint props (`fill-<token>` / `stroke-<token>` via react-native-svg) —\n // they don't end in `-color`, so without this they'd skip normalization and\n // leak a raw `oklch(…)` string for custom `@theme` tokens.\n property === 'fill' ||\n property === 'stroke' ||\n (property.startsWith('border-') && property.endsWith('-color')) ||\n property.endsWith('-color')\n )\n}\n\n/**\n * Convert an unparsed declaration (typical Tailwind v4 output containing\n * `var()` / `calc()`) into RN entries. Serializes the token list, then\n * coerces the flat string into a number / keyword / length via a tight\n * set of shapes Tailwind actually emits.\n * @param property Real property name (kebab-case).\n * @param tokens Token list from lightningcss.\n * @param themeVars Optional lookup table for resolving `var(--x)` references.\n * @returns RN entries — usually one, empty when unusable.\n */\nfunction unparsedToEntries(\n property: string,\n tokens: readonly TokenOrValue[],\n themeVars: ReadonlyMap<string, string> | undefined,\n): readonly RNEntry[] {\n if (property.length === 0) return []\n if (RN_UNSUPPORTED_PROPERTIES.has(property)) return []\n // Safe-area detection runs BEFORE token serialization because\n // `env()` serializes to an empty string, which would strip the side\n // info we need. If the tokens encode a recognised `env(safe-area-inset-*)`\n // pattern (pure / `max(..., n)` / `calc(...+n)` / `h-screen-safe`),\n // emit a runtime-resolved marker instead.\n if (UNSUPPORTED_LOGICAL_PROPS.has(property)) return []\n const safe = detectSafeAreaMarker(tokens, themeVars)\n if (safe !== null) return [[kebabToCamel(property), safe]]\n let text = serializeTokens(tokens)\n if (themeVars && themeVars.size > 0) text = substituteThemeVars(text, themeVars)\n const coerced = coerceUnparsedValue(text)\n if (coerced === null) return []\n // Skip values still carrying an unresolved `var(--tw-*)` ANYWHERE in the\n // string — they came from a `@property --tw-*` composable with no real\n // fallback (e.g. `filter: blur(8px) var(--tw-brightness) …`,\n // `transform: rotateX(45deg) var(--tw-rotate-y) …`, `touch-action`,\n // `scroll-snap-type`). RN can't evaluate the cascade, so a leaked `var()`\n // makes the whole declaration an invalid string RN rejects — drop it and\n // rely on RN's default rather than emit garbage. `var(--color-*)` refs are\n // already substituted above, so anything left is a genuine composable miss.\n if (typeof coerced === 'string' && coerced.includes('var(')) return []\n // RN `fontFamily` is a single typeface, not a CSS fallback list — take\n // the first family so `--font-x: \"Name\", sans-serif` works out of the box.\n if (property === 'font-family' && typeof coerced === 'string') {\n return [['fontFamily', coerceFontFamily(coerced)]]\n }\n // Logical-direction CSS properties RN doesn't have direct equivalents\n // for. Keep the dropped names in one place so it's easy to audit.\n if (UNSUPPORTED_LOGICAL_PROPS.has(property)) return []\n if (TIMING_FUNCTION_PROPS.has(property) && typeof coerced === 'string') {\n // `transition-colors` and similar emit `var(--tw-ease, cubic-bezier(...))`\n // which serializes to a cubic-bezier STRING after substitution.\n // Reanimated v4's CSS engine rejects those — snap to the closest\n // predefined keyword (same logic as the typed `EasingFunction` path).\n return [[kebabToCamel(property), coerceCubicBezierString(coerced)]]\n }\n if (isColorProperty(property) && typeof coerced === 'string') {\n // A color is a single token. Tailwind compiles an arbitrary shorthand like\n // `border-[2px_solid_#000]` to `border-color: 2px solid #000` (invalid for\n // a color property → unparsed), which would otherwise emit\n // `borderColor: \"2px solid #000000\"` — a string RN rejects. A top-level\n // space (outside parens — `rgb(1 2 3)` keeps its inner spaces) means it's a\n // multi-token shorthand, not a color: drop it.\n if (hasTopLevelSpace(coerced)) return []\n // CSS-wide cascade keywords (`inherit`, `currentColor`, `initial`, `unset`,\n // `revert`, `revert-layer`) have no RN equivalent — RN has no color\n // cascade. Drop rather than leak an invalid color string to RN.\n if (isCssWideColorKeyword(coerced)) return []\n // Lower modern color spaces (`oklch(…)`, `lab(…)`, `color(p3 …)`) that\n // RN can't paint to sRGB; hex/rgb/hsl/named pass through unchanged.\n const color = normalizeColorString(coerced) ?? coerced\n // Logical border-color utilities must lower to physical RN side keys —\n // RN ignores `borderInlineColor` / `borderInlineStartColor`.\n const sides = LOGICAL_BORDER_COLOR_SIDES[property]\n if (sides) return sides.map((key): RNEntry => [key, color])\n return [[kebabToCamel(property), color]]\n }\n const camelKey = kebabToCamel(property)\n // Enum props whose value Tailwind sometimes routes through the unparsed\n // channel (`justify-content: baseline` → `justifyContent: 'baseline'`),\n // bypassing the typed dispatcher's keyword map. RN rejects values outside\n // the prop's set, so gate them here exactly like the typed branches do.\n const enumValues = RN_ENUM_VALUES[camelKey]\n if (enumValues && typeof coerced === 'string' && !enumValues.has(coerced)) return []\n return [[camelKey, coerced]]\n}\n\n/**\n * Convert one lightningcss `Declaration` into zero-or-more RN style\n * entries. Shorthand declarations (padding/margin/border-radius/flex) can\n * emit multiple entries; skipped or unsupported properties emit none.\n *\n * The switch branches on `decl.property` so TypeScript narrows\n * `decl.value` to the exact typed shape for each branch — no casts\n * required. Unknown properties fall through to `[]`.\n * @param decl One declaration from a lightningcss style rule.\n * @param themeVars Optional lookup table for resolving `var(--x)` references inside unparsed values.\n * @returns Array of `[key, value]` entries.\n */\nexport function declarationToRnEntries(decl: LcDeclaration, themeVars?: ReadonlyMap<string, string>): readonly RNEntry[] {\n switch (decl.property) {\n case 'custom': {\n // Lightningcss routes two shapes through `custom`:\n // - Actual CSS custom properties (`--my-var`): no RN meaning, drop.\n // - Real properties it doesn't have a dedicated typed entry for\n // (e.g. `object-fit`, `pointer-events`, future CSS keyword-only\n // props): treat like an unparsed declaration so the keyword\n // surfaces in the RN style.\n const customName = decl.value.name\n if (customName.startsWith('--')) return []\n return unparsedToEntries(customName, decl.value.value ?? [], themeVars)\n }\n case 'unparsed': {\n return unparsedToEntries(decl.value.propertyId.property, decl.value.value, themeVars)\n }\n case 'color':\n case 'background-color':\n case 'border-top-color':\n case 'border-right-color':\n case 'border-bottom-color':\n case 'border-left-color': {\n // `background-color` narrows to `CssColor | 'background'` — the\n // literal keyword means UA default. Skip the keyword.\n if (typeof decl.value === 'string') return []\n const colorString = cssColorToString(decl.value)\n // `currentColor` (lightningcss `{type:'currentcolor'}`) and any other\n // CSS-wide cascade keyword have no RN equivalent — drop instead of\n // leaking the keyword string to RN.\n if (isCssWideColorKeyword(colorString)) return []\n return [[kebabToCamel(decl.property), colorString]]\n }\n case 'border-color': {\n return expandBorderColor(decl.value)\n }\n case 'opacity': {\n // Lightningcss hands us an `f32` for opacity, so values like `0.8`\n // round-trip as `0.800000011920929`. Snap to 4 decimals to match the\n // rest of the parser's numeric convention.\n return [[decl.property, Math.round(decl.value * 10_000) / 10_000]]\n }\n case 'z-index': {\n return [['zIndex', zIndexToNumber(decl.value)]]\n }\n case 'top':\n case 'right':\n case 'bottom':\n case 'left': {\n const v = lengthPercentageOrAutoToValue(decl.value)\n if (v === null) return []\n return [[decl.property, v]]\n }\n case 'inset': {\n const top = lengthPercentageOrAutoToValue(decl.value.top)\n const right = lengthPercentageOrAutoToValue(decl.value.right)\n const bottom = lengthPercentageOrAutoToValue(decl.value.bottom)\n const left = lengthPercentageOrAutoToValue(decl.value.left)\n if (top === null || right === null || bottom === null || left === null) return []\n return [\n ['top', top],\n ['right', right],\n ['bottom', bottom],\n ['left', left],\n ]\n }\n case 'inset-inline': {\n const start = lengthPercentageOrAutoToValue(decl.value.inlineStart)\n const end = lengthPercentageOrAutoToValue(decl.value.inlineEnd)\n if (start === null || end === null) return []\n return [\n ['left', start],\n ['right', end],\n ]\n }\n case 'inset-block': {\n const start = lengthPercentageOrAutoToValue(decl.value.blockStart)\n const end = lengthPercentageOrAutoToValue(decl.value.blockEnd)\n if (start === null || end === null) return []\n return [\n ['top', start],\n ['bottom', end],\n ]\n }\n case 'width':\n case 'height':\n case 'min-width':\n case 'min-height':\n case 'max-width':\n case 'max-height': {\n const v = sizeLikeToValue(decl.value)\n if (v === null) return []\n return [[kebabToCamel(decl.property), v]]\n }\n case 'gap': {\n return expandGap(decl.value)\n }\n case 'row-gap':\n case 'column-gap': {\n const v = gapValueToValue(decl.value)\n if (v === null) return []\n return [[kebabToCamel(decl.property), v]]\n }\n case 'font-style': {\n return [['fontStyle', decl.value.type]]\n }\n case 'display': {\n // `displayToEntries` can still emit `contents` (a CSS value RN rejects —\n // only `flex` / `none` are valid). Gate the result on the RN-valid set.\n return displayToEntries(decl.value).filter(([, value]) => typeof value === 'string' && RN_ENUM_VALUES.display.has(value))\n }\n case 'position': {\n // RN `position` accepts only `absolute` / `relative` / `static`; CSS\n // `fixed` / `sticky` are invalid for RN, so drop them.\n return RN_ENUM_VALUES.position.has(decl.value.type) ? [['position', decl.value.type]] : []\n }\n case 'font-size': {\n const px = fontSizeToPx(decl.value)\n if (px === null) return []\n return [['fontSize', px]]\n }\n case 'font-weight': {\n return [['fontWeight', fontWeightToValue(decl.value)]]\n }\n case 'padding': {\n return expandFourSided('padding', decl.value)\n }\n case 'margin': {\n return expandFourSided('margin', decl.value)\n }\n case 'padding-inline': {\n return expandLogicalInline('padding', decl.value)\n }\n case 'padding-block': {\n return expandLogicalBlock('padding', decl.value)\n }\n case 'margin-inline': {\n return expandLogicalInline('margin', decl.value)\n }\n case 'margin-block': {\n return expandLogicalBlock('margin', decl.value)\n }\n case 'padding-top':\n case 'padding-right':\n case 'padding-bottom':\n case 'padding-left':\n case 'margin-top':\n case 'margin-right':\n case 'margin-bottom':\n case 'margin-left': {\n const v = lengthPercentageOrAutoToValue(decl.value)\n if (v === null) return []\n return [[kebabToCamel(decl.property), v]]\n }\n case 'border-radius': {\n return expandBorderRadius(decl.value)\n }\n case 'border-top-left-radius':\n case 'border-top-right-radius':\n case 'border-bottom-left-radius':\n case 'border-bottom-right-radius': {\n const [xAxis] = decl.value\n const v = dimensionPercentageToNumber(xAxis)\n if (v === null) return []\n return [[kebabToCamel(decl.property), v]]\n }\n case 'flex': {\n return flexToEntries(decl.value)\n }\n case 'flex-grow':\n case 'flex-shrink': {\n return [[kebabToCamel(decl.property), decl.value]]\n }\n case 'flex-basis': {\n const v = lengthPercentageOrAutoToValue(decl.value)\n if (v === null) return []\n return [['flexBasis', v]]\n }\n default: {\n return (\n dispatchLogicalInline(decl) ??\n dispatchLayoutDeclaration(decl) ??\n dispatchTypographyDeclaration(decl) ??\n dispatchColorPropertyDeclaration(decl) ??\n dispatchBorderDeclaration(decl) ??\n dispatchMotionDeclaration(decl) ??\n []\n )\n }\n }\n}\n\n/**\n * Map single-sided CSS logical-inline props to RN's writing-direction-aware\n * Yoga keys: `ms-2` → `marginStart`, `pe-4` → `paddingEnd`, `start-2` →\n * `start`, `end-3` → `end`. RN resolves start/end against the layout\n * direction, so these stay RTL-correct. Returns null for any other property\n * (so the dispatch chain continues).\n * @param decl One declaration from a lightningcss style rule.\n * @returns RN entries, or null when not a logical-inline property.\n */\nfunction dispatchLogicalInline(decl: LcDeclaration): readonly RNEntry[] | null {\n switch (decl.property) {\n case 'margin-inline-start':\n case 'margin-inline-end':\n case 'padding-inline-start':\n case 'padding-inline-end': {\n const v = lengthPercentageOrAutoToValue(decl.value)\n return v === null ? [] : [[LOGICAL_INLINE_TO_RN[decl.property], v]]\n }\n case 'inset-inline-start': {\n const v = lengthPercentageOrAutoToValue(decl.value)\n return v === null ? [] : [['start', v]]\n }\n case 'inset-inline-end': {\n const v = lengthPercentageOrAutoToValue(decl.value)\n return v === null ? [] : [['end', v]]\n }\n // Logical border-radius corners (`rounded-s/e/ss/se/ee/es-*`). RN has\n // matching keys — `kebabToCamel('border-start-start-radius')` is exactly\n // `borderStartStartRadius`. Value is a `[x, y]` tuple like physical corners.\n case 'border-start-start-radius':\n case 'border-start-end-radius':\n case 'border-end-start-radius':\n case 'border-end-end-radius': {\n const [xAxis] = decl.value\n const v = dimensionPercentageToNumber(xAxis)\n return v === null ? [] : [[kebabToCamel(decl.property), v]]\n }\n default: {\n return null\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `justify-content` keywords RN accepts. CSS adds `stretch` / `normal` /
|
|
3
|
+
* `left` / `right` (and `start`/`end`, which we lower to `flex-start`/`flex-end`
|
|
4
|
+
* BEFORE this gate). RN rejects anything outside this set — drop it.
|
|
5
|
+
*/
|
|
6
|
+
const RN_JUSTIFY_CONTENT_VALUES = new Set([
|
|
7
|
+
'flex-start',
|
|
8
|
+
'flex-end',
|
|
9
|
+
'center',
|
|
10
|
+
'space-between',
|
|
11
|
+
'space-around',
|
|
12
|
+
'space-evenly',
|
|
13
|
+
]);
|
|
14
|
+
/**
|
|
15
|
+
* `align-content` keywords RN accepts. Differs from `justify-content`: RN
|
|
16
|
+
* allows `stretch` here but rejects `normal`. Drop values outside the set.
|
|
17
|
+
*/
|
|
18
|
+
const RN_ALIGN_CONTENT_VALUES = new Set([
|
|
19
|
+
'flex-start',
|
|
20
|
+
'flex-end',
|
|
21
|
+
'center',
|
|
22
|
+
'stretch',
|
|
23
|
+
'space-between',
|
|
24
|
+
'space-around',
|
|
25
|
+
'space-evenly',
|
|
26
|
+
]);
|
|
1
27
|
/**
|
|
2
28
|
* Lower a CSS `overflow` keyword to one RN's `overflow` prop accepts
|
|
3
29
|
* (`'visible' | 'hidden' | 'scroll'`). `auto` → `scroll` (auto means
|
|
@@ -109,12 +135,16 @@ function dispatchLayoutDeclaration(decl) {
|
|
|
109
135
|
return v === null ? [] : [['alignSelf', v]];
|
|
110
136
|
}
|
|
111
137
|
case 'align-content': {
|
|
138
|
+
// After CSS→RN lowering, gate on RN's valid set — drops `normal`
|
|
139
|
+
// (`content-normal`) which RN's `alignContent` rejects.
|
|
112
140
|
const v = mapAlignKeyword(decl.value);
|
|
113
|
-
return v === null ? [] : [['alignContent', v]];
|
|
141
|
+
return v === null || !RN_ALIGN_CONTENT_VALUES.has(v) ? [] : [['alignContent', v]];
|
|
114
142
|
}
|
|
115
143
|
case 'justify-content': {
|
|
144
|
+
// After CSS→RN lowering, gate on RN's valid set — drops `stretch`
|
|
145
|
+
// (`justify-stretch`) and any other keyword RN's `justifyContent` rejects.
|
|
116
146
|
const v = mapJustifyKeyword(decl.value);
|
|
117
|
-
return v === null ? [] : [['justifyContent', v]];
|
|
147
|
+
return v === null || !RN_JUSTIFY_CONTENT_VALUES.has(v) ? [] : [['justifyContent', v]];
|
|
118
148
|
}
|
|
119
149
|
case 'overflow': {
|
|
120
150
|
// Lightningcss splits CSS `overflow` into `{x, y}` axes; RN only
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-dispatcher.mjs","sources":["../../../../../src/core/parser/layout-dispatcher.ts"],"sourcesContent":["import type { Declaration as LcDeclaration } from 'lightningcss'\nimport type { RNEntry } from './types'\n\n/**\n * Lower a CSS `overflow` keyword to one RN's `overflow` prop accepts\n * (`'visible' | 'hidden' | 'scroll'`). `auto` → `scroll` (auto means\n * scroll-when-needed), `clip` → `hidden` (closest no-scroll clip). Anything\n * else (an unexpected keyword) drops so RN never sees an invalid value.\n * @param css CSS overflow keyword.\n * @returns RN overflow keyword, or `null` to drop.\n */\nfunction mapOverflow(css: string): string | null {\n if (css === 'visible' || css === 'hidden' || css === 'scroll') return css\n if (css === 'auto') return 'scroll'\n if (css === 'clip') return 'hidden'\n return null\n}\n\n/**\n * Build the RN `overflow` entry for a raw axis value, mapping it to an\n * RN-valid keyword and dropping unrepresentable shapes. Shared by the\n * `overflow` shorthand and the `overflow-x` / `overflow-y` longhands.\n * @param value Raw per-axis overflow value (string keyword or other).\n * @returns Single `[overflow, …]` entry, or empty when unmappable.\n */\nfunction overflowEntry(value: unknown): readonly RNEntry[] {\n const mapped = typeof value === 'string' ? mapOverflow(value) : null\n return mapped === null ? [] : [['overflow', mapped]]\n}\n\n/**\n * Lower CSS alignment keywords to the strings RN accepts. CSS uses\n * `start`/`end` while RN sticks with the legacy `flex-start`/`flex-end`.\n * Shared between `align-items`, `align-self`, `align-content`, and\n * `justify-content` — the lowering rule is identical for all four.\n * @param css CSS keyword (`center` / `start` / `end` / `baseline` / `stretch`).\n * @returns RN-compatible keyword.\n */\nfunction cssToRnAlignment(css: string): string {\n if (css === 'start') return 'flex-start'\n if (css === 'end') return 'flex-end'\n return css\n}\n\n/** Alias kept for clarity at the call site. Identical lowering rule. */\nconst cssToRnJustify = cssToRnAlignment\n\n/**\n * Map lightningcss's `align-items` / `align-self` / `align-content`\n * value (typed as `{type: 'self-position' | 'baseline-position', value: …}`)\n * to the RN keyword RN expects.\n * @param value Typed alignment value.\n * @returns RN alignment string, or `null` when unmappable.\n */\nfunction mapAlignKeyword(value: unknown): string | null {\n if (typeof value === 'string') return cssToRnAlignment(value)\n if (typeof value !== 'object' || value === null) return null\n const tagged = value as { type?: string; value?: string }\n if (tagged.type === 'baseline-position') return 'baseline'\n if (typeof tagged.value === 'string') return cssToRnAlignment(tagged.value)\n // Bare-keyword variants like `{type: 'stretch'}` carry the keyword\n // in the `type` field with no separate `value`.\n if (tagged.type === 'stretch' || tagged.type === 'normal') return cssToRnAlignment(tagged.type)\n return null\n}\n\n/**\n * Map lightningcss's `justify-content` value to the RN keyword.\n * @param value Typed justify value.\n * @returns RN justify string, or `null` when unmappable.\n */\nfunction mapJustifyKeyword(value: unknown): string | null {\n if (typeof value === 'string') return cssToRnJustify(value)\n if (typeof value !== 'object' || value === null) return null\n const tagged = value as { type?: string; value?: string }\n if (typeof tagged.value === 'string') return cssToRnJustify(tagged.value)\n return null\n}\n\n/**\n * Dispatch flexbox-layout declarations (flex-direction, flex-wrap,\n * align-items, align-self, align-content, justify-content). Returns\n * `null` for any property the dispatcher doesn't handle so the caller\n * can fall through to its main switch.\n *\n * RN expects keyword-mapped strings: `flex-start` / `flex-end` instead\n * of CSS's `start` / `end`. We do the lowering here.\n * @param decl One lightningcss declaration.\n * @returns RN entries when the property matched, else `null`.\n */\nexport function dispatchLayoutDeclaration(decl: LcDeclaration): readonly RNEntry[] | null {\n switch (decl.property) {\n case 'flex-direction': {\n return [['flexDirection', String(decl.value)]]\n }\n case 'flex-wrap': {\n return [['flexWrap', String(decl.value)]]\n }\n case 'align-items': {\n const v = mapAlignKeyword(decl.value)\n return v === null ? [] : [['alignItems', v]]\n }\n case 'align-self': {\n const v = mapAlignKeyword(decl.value)\n return v === null ? [] : [['alignSelf', v]]\n }\n case 'align-content': {\n const v = mapAlignKeyword(decl.value)\n return v === null ? [] : [['alignContent', v]]\n }\n case 'justify-content': {\n const v = mapJustifyKeyword(decl.value)\n return v === null ? [] : [['justifyContent', v]]\n }\n case 'overflow': {\n // Lightningcss splits CSS `overflow` into `{x, y}` axes; RN only\n // supports a single `overflow` keyword. Take the `x` axis when the\n // user wrote shorthand; per-axis Tailwind utilities both emit\n // shorthand here so axis splitting is rare.\n return overflowEntry((decl.value as { x?: unknown }).x)\n }\n case 'overflow-x':\n case 'overflow-y': {\n // Tailwind's `overflow-x-*` / `overflow-y-*` emit these longhands,\n // not the `overflow` shorthand. RN has only a single `overflow`,\n // so collapse both axes onto it (last one declared wins via the\n // normal entry-merge order).\n return overflowEntry(decl.value)\n }\n default: {\n return null\n }\n }\n}\n"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"layout-dispatcher.mjs","sources":["../../../../../src/core/parser/layout-dispatcher.ts"],"sourcesContent":["import type { Declaration as LcDeclaration } from 'lightningcss'\nimport type { RNEntry } from './types'\n\n/**\n * `justify-content` keywords RN accepts. CSS adds `stretch` / `normal` /\n * `left` / `right` (and `start`/`end`, which we lower to `flex-start`/`flex-end`\n * BEFORE this gate). RN rejects anything outside this set — drop it.\n */\nconst RN_JUSTIFY_CONTENT_VALUES: ReadonlySet<string> = new Set([\n 'flex-start',\n 'flex-end',\n 'center',\n 'space-between',\n 'space-around',\n 'space-evenly',\n])\n\n/**\n * `align-content` keywords RN accepts. Differs from `justify-content`: RN\n * allows `stretch` here but rejects `normal`. Drop values outside the set.\n */\nconst RN_ALIGN_CONTENT_VALUES: ReadonlySet<string> = new Set([\n 'flex-start',\n 'flex-end',\n 'center',\n 'stretch',\n 'space-between',\n 'space-around',\n 'space-evenly',\n])\n\n/**\n * Lower a CSS `overflow` keyword to one RN's `overflow` prop accepts\n * (`'visible' | 'hidden' | 'scroll'`). `auto` → `scroll` (auto means\n * scroll-when-needed), `clip` → `hidden` (closest no-scroll clip). Anything\n * else (an unexpected keyword) drops so RN never sees an invalid value.\n * @param css CSS overflow keyword.\n * @returns RN overflow keyword, or `null` to drop.\n */\nfunction mapOverflow(css: string): string | null {\n if (css === 'visible' || css === 'hidden' || css === 'scroll') return css\n if (css === 'auto') return 'scroll'\n if (css === 'clip') return 'hidden'\n return null\n}\n\n/**\n * Build the RN `overflow` entry for a raw axis value, mapping it to an\n * RN-valid keyword and dropping unrepresentable shapes. Shared by the\n * `overflow` shorthand and the `overflow-x` / `overflow-y` longhands.\n * @param value Raw per-axis overflow value (string keyword or other).\n * @returns Single `[overflow, …]` entry, or empty when unmappable.\n */\nfunction overflowEntry(value: unknown): readonly RNEntry[] {\n const mapped = typeof value === 'string' ? mapOverflow(value) : null\n return mapped === null ? [] : [['overflow', mapped]]\n}\n\n/**\n * Lower CSS alignment keywords to the strings RN accepts. CSS uses\n * `start`/`end` while RN sticks with the legacy `flex-start`/`flex-end`.\n * Shared between `align-items`, `align-self`, `align-content`, and\n * `justify-content` — the lowering rule is identical for all four.\n * @param css CSS keyword (`center` / `start` / `end` / `baseline` / `stretch`).\n * @returns RN-compatible keyword.\n */\nfunction cssToRnAlignment(css: string): string {\n if (css === 'start') return 'flex-start'\n if (css === 'end') return 'flex-end'\n return css\n}\n\n/** Alias kept for clarity at the call site. Identical lowering rule. */\nconst cssToRnJustify = cssToRnAlignment\n\n/**\n * Map lightningcss's `align-items` / `align-self` / `align-content`\n * value (typed as `{type: 'self-position' | 'baseline-position', value: …}`)\n * to the RN keyword RN expects.\n * @param value Typed alignment value.\n * @returns RN alignment string, or `null` when unmappable.\n */\nfunction mapAlignKeyword(value: unknown): string | null {\n if (typeof value === 'string') return cssToRnAlignment(value)\n if (typeof value !== 'object' || value === null) return null\n const tagged = value as { type?: string; value?: string }\n if (tagged.type === 'baseline-position') return 'baseline'\n if (typeof tagged.value === 'string') return cssToRnAlignment(tagged.value)\n // Bare-keyword variants like `{type: 'stretch'}` carry the keyword\n // in the `type` field with no separate `value`.\n if (tagged.type === 'stretch' || tagged.type === 'normal') return cssToRnAlignment(tagged.type)\n return null\n}\n\n/**\n * Map lightningcss's `justify-content` value to the RN keyword.\n * @param value Typed justify value.\n * @returns RN justify string, or `null` when unmappable.\n */\nfunction mapJustifyKeyword(value: unknown): string | null {\n if (typeof value === 'string') return cssToRnJustify(value)\n if (typeof value !== 'object' || value === null) return null\n const tagged = value as { type?: string; value?: string }\n if (typeof tagged.value === 'string') return cssToRnJustify(tagged.value)\n return null\n}\n\n/**\n * Dispatch flexbox-layout declarations (flex-direction, flex-wrap,\n * align-items, align-self, align-content, justify-content). Returns\n * `null` for any property the dispatcher doesn't handle so the caller\n * can fall through to its main switch.\n *\n * RN expects keyword-mapped strings: `flex-start` / `flex-end` instead\n * of CSS's `start` / `end`. We do the lowering here.\n * @param decl One lightningcss declaration.\n * @returns RN entries when the property matched, else `null`.\n */\nexport function dispatchLayoutDeclaration(decl: LcDeclaration): readonly RNEntry[] | null {\n switch (decl.property) {\n case 'flex-direction': {\n return [['flexDirection', String(decl.value)]]\n }\n case 'flex-wrap': {\n return [['flexWrap', String(decl.value)]]\n }\n case 'align-items': {\n const v = mapAlignKeyword(decl.value)\n return v === null ? [] : [['alignItems', v]]\n }\n case 'align-self': {\n const v = mapAlignKeyword(decl.value)\n return v === null ? [] : [['alignSelf', v]]\n }\n case 'align-content': {\n // After CSS→RN lowering, gate on RN's valid set — drops `normal`\n // (`content-normal`) which RN's `alignContent` rejects.\n const v = mapAlignKeyword(decl.value)\n return v === null || !RN_ALIGN_CONTENT_VALUES.has(v) ? [] : [['alignContent', v]]\n }\n case 'justify-content': {\n // After CSS→RN lowering, gate on RN's valid set — drops `stretch`\n // (`justify-stretch`) and any other keyword RN's `justifyContent` rejects.\n const v = mapJustifyKeyword(decl.value)\n return v === null || !RN_JUSTIFY_CONTENT_VALUES.has(v) ? [] : [['justifyContent', v]]\n }\n case 'overflow': {\n // Lightningcss splits CSS `overflow` into `{x, y}` axes; RN only\n // supports a single `overflow` keyword. Take the `x` axis when the\n // user wrote shorthand; per-axis Tailwind utilities both emit\n // shorthand here so axis splitting is rare.\n return overflowEntry((decl.value as { x?: unknown }).x)\n }\n case 'overflow-x':\n case 'overflow-y': {\n // Tailwind's `overflow-x-*` / `overflow-y-*` emit these longhands,\n // not the `overflow` shorthand. RN has only a single `overflow`,\n // so collapse both axes onto it (last one declared wins via the\n // normal entry-merge order).\n return overflowEntry(decl.value)\n }\n default: {\n return null\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cssColorToString } from './color.mjs';
|
|
1
|
+
import { cssColorToString, isCssWideColorKeyword } from './color.mjs';
|
|
2
2
|
import { lengthPercentageOrAutoToValue, dimensionPercentageToNumber, gapValueToValue } from './length.mjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -126,14 +126,21 @@ function expandBorderColor(value) {
|
|
|
126
126
|
const right = cssColorToString(value.right);
|
|
127
127
|
const bottom = cssColorToString(value.bottom);
|
|
128
128
|
const left = cssColorToString(value.left);
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
129
|
+
// CSS-wide cascade keywords (`currentColor`, `inherit`, …) have no RN
|
|
130
|
+
// equivalent — drop any side that resolves to one rather than leak the
|
|
131
|
+
// keyword as a `borderColor`/`border*Color` value RN can't paint.
|
|
132
|
+
const sides = [
|
|
132
133
|
['borderTopColor', top],
|
|
133
134
|
['borderRightColor', right],
|
|
134
135
|
['borderBottomColor', bottom],
|
|
135
136
|
['borderLeftColor', left],
|
|
136
137
|
];
|
|
138
|
+
const paintable = sides.filter(([, color]) => !isCssWideColorKeyword(color));
|
|
139
|
+
if (paintable.length === 0)
|
|
140
|
+
return [];
|
|
141
|
+
if (paintable.length === 4 && top === right && right === bottom && bottom === left)
|
|
142
|
+
return [['borderColor', top]];
|
|
143
|
+
return paintable;
|
|
137
144
|
}
|
|
138
145
|
/**
|
|
139
146
|
* Expand `gap` shorthand (`{row, column}`) into RN entries. When both
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shorthand.mjs","sources":["../../../../../src/core/parser/shorthand.ts"],"sourcesContent":["import type {\n BorderColor,\n BorderRadius,\n Flex,\n Gap,\n Margin,\n MarginBlock,\n MarginInline,\n Padding,\n PaddingBlock,\n PaddingInline,\n} from 'lightningcss'\nimport { cssColorToString } from './color'\nimport { dimensionPercentageToNumber, gapValueToValue, lengthPercentageOrAutoToValue } from './length'\nimport type { RNEntry } from './types'\n\n/**\n * Expand `margin` / `padding` shorthand (`{top, right, bottom, left}`) to\n * RN entries. Collapses progressively for a smaller emitted style:\n * - all four equal → single `padding` / `margin`\n * - matching axes → `paddingHorizontal` + `paddingVertical`\n * - one matching axis → that axis collapsed, opposite axis as longhands\n * - otherwise → four longhands\n * @param property `'padding'` or `'margin'`.\n * @param value Typed shorthand record.\n * @returns RN entries.\n */\nexport function expandFourSided(property: 'padding' | 'margin', value: Padding | Margin): readonly RNEntry[] {\n const top = lengthPercentageOrAutoToValue(value.top)\n const right = lengthPercentageOrAutoToValue(value.right)\n const bottom = lengthPercentageOrAutoToValue(value.bottom)\n const left = lengthPercentageOrAutoToValue(value.left)\n if (top === null || right === null || bottom === null || left === null) return []\n if (top === right && right === bottom && bottom === left) return [[property, top]]\n const horizontalEqual = left === right\n const verticalEqual = top === bottom\n if (horizontalEqual && verticalEqual) {\n return [\n [`${property}Vertical`, top],\n [`${property}Horizontal`, left],\n ]\n }\n if (horizontalEqual) {\n return [\n [`${property}Top`, top],\n [`${property}Bottom`, bottom],\n [`${property}Horizontal`, left],\n ]\n }\n if (verticalEqual) {\n return [\n [`${property}Vertical`, top],\n [`${property}Right`, right],\n [`${property}Left`, left],\n ]\n }\n return [\n [`${property}Top`, top],\n [`${property}Right`, right],\n [`${property}Bottom`, bottom],\n [`${property}Left`, left],\n ]\n}\n\n/**\n * Expand `padding-inline` / `margin-inline` (logical property) into RN's\n * physical pair. RN has no RTL-aware logical props at the style-object\n * level, so we lower at compile time. When both sides match, emit the\n * single `paddingHorizontal` / `marginHorizontal` shorthand for a more\n * compact style.\n * @param property `'padding'` or `'margin'`.\n * @param value Typed inline shorthand.\n * @returns RN entries.\n */\nexport function expandLogicalInline(property: 'padding' | 'margin', value: PaddingInline | MarginInline): readonly RNEntry[] {\n const start = lengthPercentageOrAutoToValue(value.inlineStart)\n const end = lengthPercentageOrAutoToValue(value.inlineEnd)\n if (start === null || end === null) return []\n if (start === end) return [[`${property}Horizontal`, start]]\n return [\n [`${property}Left`, start],\n [`${property}Right`, end],\n ]\n}\n\n/**\n * Expand `padding-block` / `margin-block` (logical property) into RN's\n * physical pair. When both sides match, emit `paddingVertical` /\n * `marginVertical` for a more compact style.\n * @param property `'padding'` or `'margin'`.\n * @param value Typed block shorthand.\n * @returns RN entries.\n */\nexport function expandLogicalBlock(property: 'padding' | 'margin', value: PaddingBlock | MarginBlock): readonly RNEntry[] {\n const start = lengthPercentageOrAutoToValue(value.blockStart)\n const end = lengthPercentageOrAutoToValue(value.blockEnd)\n if (start === null || end === null) return []\n if (start === end) return [[`${property}Vertical`, start]]\n return [\n [`${property}Top`, start],\n [`${property}Bottom`, end],\n ]\n}\n\n/**\n * Expand a `border-radius` shorthand into RN corner entries. Each corner\n * is a 2-tuple `[x, y]` in lightningcss; RN exposes one radius per corner\n * so we use the x-axis. When all four corners match, collapse to the\n * single `borderRadius` key.\n * @param value Typed `BorderRadius` record.\n * @returns RN entries.\n */\nexport function expandBorderRadius(value: BorderRadius): readonly RNEntry[] {\n const corners: Array<[string, number | string | null]> = [\n ['borderTopLeftRadius', dimensionPercentageToNumber(value.topLeft[0])],\n ['borderTopRightRadius', dimensionPercentageToNumber(value.topRight[0])],\n ['borderBottomRightRadius', dimensionPercentageToNumber(value.bottomRight[0])],\n ['borderBottomLeftRadius', dimensionPercentageToNumber(value.bottomLeft[0])],\n ]\n const [first] = corners\n if (first?.[1] == null) return []\n if (corners.every(([, v]) => v === first[1])) return [['borderRadius', first[1]]]\n return corners.filter((entry): entry is [string, number | string] => entry[1] !== null)\n}\n\n/**\n * Expand a `border-color` shorthand into RN longhands. When all four\n * sides match, collapse to a single `borderColor`; otherwise emit per-side\n * props.\n * @param value Typed `BorderColor` record.\n * @returns RN entries.\n */\nexport function expandBorderColor(value: BorderColor): readonly RNEntry[] {\n const top = cssColorToString(value.top)\n const right = cssColorToString(value.right)\n const bottom = cssColorToString(value.bottom)\n const left = cssColorToString(value.left)\n if (top === right && right === bottom && bottom === left) return [['borderColor', top]]\n return [\n ['borderTopColor', top],\n ['borderRightColor', right],\n ['borderBottomColor', bottom],\n ['borderLeftColor', left],\n ]\n}\n\n/**\n * Expand `gap` shorthand (`{row, column}`) into RN entries. When both\n * axes equal the same value collapse to the single `gap` key; otherwise\n * emit `rowGap` + `columnGap`.\n * @param value Typed `Gap` record.\n * @returns RN entries.\n */\nexport function expandGap(value: Gap): readonly RNEntry[] {\n const row = gapValueToValue(value.row)\n const column = gapValueToValue(value.column)\n if (row === null || column === null) return []\n if (row === column) return [['gap', row]]\n return [\n ['rowGap', row],\n ['columnGap', column],\n ]\n}\n\n/**\n * Convert `Flex` shorthand to RN entries. When the shape matches `flex:\n * 1` (`{grow:1, shrink:1, basis: 0%}`), emit the single `flex` key RN\n * understands. Otherwise expand to the three longhands.\n * @param value Typed `Flex` record.\n * @returns RN entries.\n */\nexport function flexToEntries(value: Flex): readonly RNEntry[] {\n const basis = lengthPercentageOrAutoToValue(value.basis)\n if (basis === null) return []\n if (value.grow === 1 && value.shrink === 1 && basis === '0%') return [['flex', 1]]\n const entries: RNEntry[] = [\n ['flexGrow', value.grow],\n ['flexShrink', value.shrink],\n ]\n if (basis !== 'auto') entries.push(['flexBasis', basis])\n return entries\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shorthand.mjs","sources":["../../../../../src/core/parser/shorthand.ts"],"sourcesContent":["import type {\n BorderColor,\n BorderRadius,\n Flex,\n Gap,\n Margin,\n MarginBlock,\n MarginInline,\n Padding,\n PaddingBlock,\n PaddingInline,\n} from 'lightningcss'\nimport { cssColorToString, isCssWideColorKeyword } from './color'\nimport { dimensionPercentageToNumber, gapValueToValue, lengthPercentageOrAutoToValue } from './length'\nimport type { RNEntry } from './types'\n\n/**\n * Expand `margin` / `padding` shorthand (`{top, right, bottom, left}`) to\n * RN entries. Collapses progressively for a smaller emitted style:\n * - all four equal → single `padding` / `margin`\n * - matching axes → `paddingHorizontal` + `paddingVertical`\n * - one matching axis → that axis collapsed, opposite axis as longhands\n * - otherwise → four longhands\n * @param property `'padding'` or `'margin'`.\n * @param value Typed shorthand record.\n * @returns RN entries.\n */\nexport function expandFourSided(property: 'padding' | 'margin', value: Padding | Margin): readonly RNEntry[] {\n const top = lengthPercentageOrAutoToValue(value.top)\n const right = lengthPercentageOrAutoToValue(value.right)\n const bottom = lengthPercentageOrAutoToValue(value.bottom)\n const left = lengthPercentageOrAutoToValue(value.left)\n if (top === null || right === null || bottom === null || left === null) return []\n if (top === right && right === bottom && bottom === left) return [[property, top]]\n const horizontalEqual = left === right\n const verticalEqual = top === bottom\n if (horizontalEqual && verticalEqual) {\n return [\n [`${property}Vertical`, top],\n [`${property}Horizontal`, left],\n ]\n }\n if (horizontalEqual) {\n return [\n [`${property}Top`, top],\n [`${property}Bottom`, bottom],\n [`${property}Horizontal`, left],\n ]\n }\n if (verticalEqual) {\n return [\n [`${property}Vertical`, top],\n [`${property}Right`, right],\n [`${property}Left`, left],\n ]\n }\n return [\n [`${property}Top`, top],\n [`${property}Right`, right],\n [`${property}Bottom`, bottom],\n [`${property}Left`, left],\n ]\n}\n\n/**\n * Expand `padding-inline` / `margin-inline` (logical property) into RN's\n * physical pair. RN has no RTL-aware logical props at the style-object\n * level, so we lower at compile time. When both sides match, emit the\n * single `paddingHorizontal` / `marginHorizontal` shorthand for a more\n * compact style.\n * @param property `'padding'` or `'margin'`.\n * @param value Typed inline shorthand.\n * @returns RN entries.\n */\nexport function expandLogicalInline(property: 'padding' | 'margin', value: PaddingInline | MarginInline): readonly RNEntry[] {\n const start = lengthPercentageOrAutoToValue(value.inlineStart)\n const end = lengthPercentageOrAutoToValue(value.inlineEnd)\n if (start === null || end === null) return []\n if (start === end) return [[`${property}Horizontal`, start]]\n return [\n [`${property}Left`, start],\n [`${property}Right`, end],\n ]\n}\n\n/**\n * Expand `padding-block` / `margin-block` (logical property) into RN's\n * physical pair. When both sides match, emit `paddingVertical` /\n * `marginVertical` for a more compact style.\n * @param property `'padding'` or `'margin'`.\n * @param value Typed block shorthand.\n * @returns RN entries.\n */\nexport function expandLogicalBlock(property: 'padding' | 'margin', value: PaddingBlock | MarginBlock): readonly RNEntry[] {\n const start = lengthPercentageOrAutoToValue(value.blockStart)\n const end = lengthPercentageOrAutoToValue(value.blockEnd)\n if (start === null || end === null) return []\n if (start === end) return [[`${property}Vertical`, start]]\n return [\n [`${property}Top`, start],\n [`${property}Bottom`, end],\n ]\n}\n\n/**\n * Expand a `border-radius` shorthand into RN corner entries. Each corner\n * is a 2-tuple `[x, y]` in lightningcss; RN exposes one radius per corner\n * so we use the x-axis. When all four corners match, collapse to the\n * single `borderRadius` key.\n * @param value Typed `BorderRadius` record.\n * @returns RN entries.\n */\nexport function expandBorderRadius(value: BorderRadius): readonly RNEntry[] {\n const corners: Array<[string, number | string | null]> = [\n ['borderTopLeftRadius', dimensionPercentageToNumber(value.topLeft[0])],\n ['borderTopRightRadius', dimensionPercentageToNumber(value.topRight[0])],\n ['borderBottomRightRadius', dimensionPercentageToNumber(value.bottomRight[0])],\n ['borderBottomLeftRadius', dimensionPercentageToNumber(value.bottomLeft[0])],\n ]\n const [first] = corners\n if (first?.[1] == null) return []\n if (corners.every(([, v]) => v === first[1])) return [['borderRadius', first[1]]]\n return corners.filter((entry): entry is [string, number | string] => entry[1] !== null)\n}\n\n/**\n * Expand a `border-color` shorthand into RN longhands. When all four\n * sides match, collapse to a single `borderColor`; otherwise emit per-side\n * props.\n * @param value Typed `BorderColor` record.\n * @returns RN entries.\n */\nexport function expandBorderColor(value: BorderColor): readonly RNEntry[] {\n const top = cssColorToString(value.top)\n const right = cssColorToString(value.right)\n const bottom = cssColorToString(value.bottom)\n const left = cssColorToString(value.left)\n // CSS-wide cascade keywords (`currentColor`, `inherit`, …) have no RN\n // equivalent — drop any side that resolves to one rather than leak the\n // keyword as a `borderColor`/`border*Color` value RN can't paint.\n const sides: readonly (readonly [string, string])[] = [\n ['borderTopColor', top],\n ['borderRightColor', right],\n ['borderBottomColor', bottom],\n ['borderLeftColor', left],\n ]\n const paintable = sides.filter(([, color]) => !isCssWideColorKeyword(color))\n if (paintable.length === 0) return []\n if (paintable.length === 4 && top === right && right === bottom && bottom === left) return [['borderColor', top]]\n return paintable\n}\n\n/**\n * Expand `gap` shorthand (`{row, column}`) into RN entries. When both\n * axes equal the same value collapse to the single `gap` key; otherwise\n * emit `rowGap` + `columnGap`.\n * @param value Typed `Gap` record.\n * @returns RN entries.\n */\nexport function expandGap(value: Gap): readonly RNEntry[] {\n const row = gapValueToValue(value.row)\n const column = gapValueToValue(value.column)\n if (row === null || column === null) return []\n if (row === column) return [['gap', row]]\n return [\n ['rowGap', row],\n ['columnGap', column],\n ]\n}\n\n/**\n * Convert `Flex` shorthand to RN entries. When the shape matches `flex:\n * 1` (`{grow:1, shrink:1, basis: 0%}`), emit the single `flex` key RN\n * understands. Otherwise expand to the three longhands.\n * @param value Typed `Flex` record.\n * @returns RN entries.\n */\nexport function flexToEntries(value: Flex): readonly RNEntry[] {\n const basis = lengthPercentageOrAutoToValue(value.basis)\n if (basis === null) return []\n if (value.grow === 1 && value.shrink === 1 && basis === '0%') return [['flex', 1]]\n const entries: RNEntry[] = [\n ['flexGrow', value.grow],\n ['flexShrink', value.shrink],\n ]\n if (basis !== 'auto') entries.push(['flexBasis', basis])\n return entries\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { rgb } from 'culori';
|
|
2
2
|
import { BARE_NUMBER_REGEX, REM_TO_PX, LENGTH_PX_REGEX, LENGTH_REM_REGEX, CALC_RATIO_REGEX, CALC_MUL_REGEX } from './constants.mjs';
|
|
3
|
-
import { cssColorToString } from './color.mjs';
|
|
3
|
+
import { normalizeColorString, cssColorToString } from './color.mjs';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Extract the fallback clause of a `var(--name, fallback)` by walking the
|
|
@@ -255,6 +255,15 @@ function coerceUnparsedValue(text) {
|
|
|
255
255
|
const colorMix = evaluateColorMixWithTransparent(trimmed);
|
|
256
256
|
if (colorMix !== null)
|
|
257
257
|
return colorMix;
|
|
258
|
+
// Real two-color `color-mix(in <space>, A, B)` (not the `, transparent)`
|
|
259
|
+
// opacity shape) — resolve it to a concrete sRGB color via culori so the
|
|
260
|
+
// raw, RN-unreadable `color-mix(...)` string never reaches the StyleSheet.
|
|
261
|
+
if (trimmed.toLowerCase().startsWith('color-mix(')) {
|
|
262
|
+
// Resolved → concrete color; unresolvable → null (DROP). Either way the
|
|
263
|
+
// raw `color-mix(...)` text must never fall through to the string path
|
|
264
|
+
// below, where RN would receive an unreadable value and render nothing.
|
|
265
|
+
return normalizeColorString(trimmed);
|
|
266
|
+
}
|
|
258
267
|
const fallback = extractVariableFallback(trimmed);
|
|
259
268
|
if (fallback !== null)
|
|
260
269
|
return coerceUnparsedValue(fallback);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.mjs","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":["culoriRgb"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tokens.mjs","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":["culoriRgb"],"mappings":"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"}
|
|
@@ -124,6 +124,8 @@ export declare class TailwindParser {
|
|
|
124
124
|
private readonly config;
|
|
125
125
|
private readonly scanner;
|
|
126
126
|
private compiler;
|
|
127
|
+
/** Full resolved base theme (built-in palette + user `@theme`), colors lowered to sRGB. Source for `useColor` / `useToken`. */
|
|
128
|
+
private baseThemeTokens;
|
|
127
129
|
private readonly themeSchemes;
|
|
128
130
|
private readonly schemeAliases;
|
|
129
131
|
/**
|