rnwind 0.0.8 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/lib/cjs/core/parser/color.cjs +33 -1
  2. package/lib/cjs/core/parser/color.cjs.map +1 -1
  3. package/lib/cjs/core/parser/color.d.ts +10 -0
  4. package/lib/cjs/core/parser/declaration.cjs +121 -9
  5. package/lib/cjs/core/parser/declaration.cjs.map +1 -1
  6. package/lib/cjs/core/parser/gradient.cjs +46 -12
  7. package/lib/cjs/core/parser/gradient.cjs.map +1 -1
  8. package/lib/cjs/core/parser/gradient.d.ts +2 -1
  9. package/lib/cjs/core/parser/keyframes.cjs +27 -12
  10. package/lib/cjs/core/parser/keyframes.cjs.map +1 -1
  11. package/lib/cjs/core/parser/keyframes.d.ts +11 -0
  12. package/lib/cjs/core/parser/layout-dispatcher.cjs +33 -10
  13. package/lib/cjs/core/parser/layout-dispatcher.cjs.map +1 -1
  14. package/lib/cjs/core/parser/length.cjs +17 -1
  15. package/lib/cjs/core/parser/length.cjs.map +1 -1
  16. package/lib/cjs/core/parser/safe-area.cjs +24 -3
  17. package/lib/cjs/core/parser/safe-area.cjs.map +1 -1
  18. package/lib/cjs/core/parser/theme-vars.cjs +58 -8
  19. package/lib/cjs/core/parser/theme-vars.cjs.map +1 -1
  20. package/lib/cjs/core/parser/tokens.cjs +77 -9
  21. package/lib/cjs/core/parser/tokens.cjs.map +1 -1
  22. package/lib/cjs/core/parser/tokens.d.ts +9 -0
  23. package/lib/cjs/core/parser/transform.cjs +18 -9
  24. package/lib/cjs/core/parser/transform.cjs.map +1 -1
  25. package/lib/cjs/core/parser/tw-parser.cjs +136 -34
  26. package/lib/cjs/core/parser/tw-parser.cjs.map +1 -1
  27. package/lib/cjs/core/parser/tw-parser.d.ts +20 -0
  28. package/lib/cjs/core/parser/typography-dispatcher.cjs +19 -1
  29. package/lib/cjs/core/parser/typography-dispatcher.cjs.map +1 -1
  30. package/lib/cjs/core/parser/typography.cjs +15 -18
  31. package/lib/cjs/core/parser/typography.cjs.map +1 -1
  32. package/lib/cjs/core/parser/typography.d.ts +5 -5
  33. package/lib/cjs/core/style-builder/build-style.cjs +12 -3
  34. package/lib/cjs/core/style-builder/build-style.cjs.map +1 -1
  35. package/lib/cjs/core/style-builder/build-style.d.ts +3 -1
  36. package/lib/cjs/core/style-builder/union-builder.cjs +9 -11
  37. package/lib/cjs/core/style-builder/union-builder.cjs.map +1 -1
  38. package/lib/cjs/core/style-builder/union-builder.d.ts +7 -8
  39. package/lib/cjs/metro/dts.cjs +6 -1
  40. package/lib/cjs/metro/dts.cjs.map +1 -1
  41. package/lib/cjs/metro/transformer.cjs +42 -77
  42. package/lib/cjs/metro/transformer.cjs.map +1 -1
  43. package/lib/cjs/metro/with-config.cjs +9 -29
  44. package/lib/cjs/metro/with-config.cjs.map +1 -1
  45. package/lib/cjs/runtime/hooks/use-scheme.cjs +17 -11
  46. package/lib/cjs/runtime/hooks/use-scheme.cjs.map +1 -1
  47. package/lib/cjs/runtime/hooks/use-scheme.d.ts +7 -4
  48. package/lib/cjs/runtime/index.cjs +2 -1
  49. package/lib/cjs/runtime/index.cjs.map +1 -1
  50. package/lib/cjs/runtime/index.d.ts +2 -2
  51. package/lib/cjs/runtime/lookup-css.cjs +41 -0
  52. package/lib/cjs/runtime/lookup-css.cjs.map +1 -1
  53. package/lib/cjs/runtime/lookup-css.d.ts +29 -0
  54. package/lib/cjs/runtime/resolve.cjs +8 -6
  55. package/lib/cjs/runtime/resolve.cjs.map +1 -1
  56. package/lib/cjs/runtime/wrap.cjs +50 -57
  57. package/lib/cjs/runtime/wrap.cjs.map +1 -1
  58. package/lib/cjs/runtime/wrap.d.ts +10 -4
  59. package/lib/cjs/testing/index.cjs +1 -1
  60. package/lib/cjs/testing/index.cjs.map +1 -1
  61. package/lib/esm/core/parser/color.d.ts +10 -0
  62. package/lib/esm/core/parser/color.mjs +34 -3
  63. package/lib/esm/core/parser/color.mjs.map +1 -1
  64. package/lib/esm/core/parser/declaration.mjs +122 -10
  65. package/lib/esm/core/parser/declaration.mjs.map +1 -1
  66. package/lib/esm/core/parser/gradient.d.ts +2 -1
  67. package/lib/esm/core/parser/gradient.mjs +45 -11
  68. package/lib/esm/core/parser/gradient.mjs.map +1 -1
  69. package/lib/esm/core/parser/keyframes.d.ts +11 -0
  70. package/lib/esm/core/parser/keyframes.mjs +27 -12
  71. package/lib/esm/core/parser/keyframes.mjs.map +1 -1
  72. package/lib/esm/core/parser/layout-dispatcher.mjs +33 -10
  73. package/lib/esm/core/parser/layout-dispatcher.mjs.map +1 -1
  74. package/lib/esm/core/parser/length.mjs +17 -1
  75. package/lib/esm/core/parser/length.mjs.map +1 -1
  76. package/lib/esm/core/parser/safe-area.mjs +24 -3
  77. package/lib/esm/core/parser/safe-area.mjs.map +1 -1
  78. package/lib/esm/core/parser/theme-vars.mjs +58 -8
  79. package/lib/esm/core/parser/theme-vars.mjs.map +1 -1
  80. package/lib/esm/core/parser/tokens.d.ts +9 -0
  81. package/lib/esm/core/parser/tokens.mjs +77 -10
  82. package/lib/esm/core/parser/tokens.mjs.map +1 -1
  83. package/lib/esm/core/parser/transform.mjs +18 -9
  84. package/lib/esm/core/parser/transform.mjs.map +1 -1
  85. package/lib/esm/core/parser/tw-parser.d.ts +20 -0
  86. package/lib/esm/core/parser/tw-parser.mjs +138 -36
  87. package/lib/esm/core/parser/tw-parser.mjs.map +1 -1
  88. package/lib/esm/core/parser/typography-dispatcher.mjs +19 -1
  89. package/lib/esm/core/parser/typography-dispatcher.mjs.map +1 -1
  90. package/lib/esm/core/parser/typography.d.ts +5 -5
  91. package/lib/esm/core/parser/typography.mjs +15 -18
  92. package/lib/esm/core/parser/typography.mjs.map +1 -1
  93. package/lib/esm/core/style-builder/build-style.d.ts +3 -1
  94. package/lib/esm/core/style-builder/build-style.mjs +12 -3
  95. package/lib/esm/core/style-builder/build-style.mjs.map +1 -1
  96. package/lib/esm/core/style-builder/union-builder.d.ts +7 -8
  97. package/lib/esm/core/style-builder/union-builder.mjs +9 -11
  98. package/lib/esm/core/style-builder/union-builder.mjs.map +1 -1
  99. package/lib/esm/metro/dts.mjs +6 -1
  100. package/lib/esm/metro/dts.mjs.map +1 -1
  101. package/lib/esm/metro/transformer.mjs +42 -77
  102. package/lib/esm/metro/transformer.mjs.map +1 -1
  103. package/lib/esm/metro/with-config.mjs +10 -30
  104. package/lib/esm/metro/with-config.mjs.map +1 -1
  105. package/lib/esm/runtime/hooks/use-scheme.d.ts +7 -4
  106. package/lib/esm/runtime/hooks/use-scheme.mjs +17 -11
  107. package/lib/esm/runtime/hooks/use-scheme.mjs.map +1 -1
  108. package/lib/esm/runtime/index.d.ts +2 -2
  109. package/lib/esm/runtime/index.mjs +2 -2
  110. package/lib/esm/runtime/index.mjs.map +1 -1
  111. package/lib/esm/runtime/lookup-css.d.ts +29 -0
  112. package/lib/esm/runtime/lookup-css.mjs +39 -1
  113. package/lib/esm/runtime/lookup-css.mjs.map +1 -1
  114. package/lib/esm/runtime/resolve.mjs +9 -7
  115. package/lib/esm/runtime/resolve.mjs.map +1 -1
  116. package/lib/esm/runtime/wrap.d.ts +10 -4
  117. package/lib/esm/runtime/wrap.mjs +50 -57
  118. package/lib/esm/runtime/wrap.mjs.map +1 -1
  119. package/lib/esm/testing/index.mjs +2 -2
  120. package/lib/esm/testing/index.mjs.map +1 -1
  121. package/package.json +1 -1
  122. package/src/core/parser/color.ts +32 -1
  123. package/src/core/parser/declaration.ts +119 -10
  124. package/src/core/parser/gradient.ts +48 -11
  125. package/src/core/parser/keyframes.ts +31 -3
  126. package/src/core/parser/layout-dispatcher.ts +32 -9
  127. package/src/core/parser/length.ts +18 -1
  128. package/src/core/parser/safe-area.ts +23 -2
  129. package/src/core/parser/theme-vars.ts +75 -8
  130. package/src/core/parser/tokens.ts +76 -9
  131. package/src/core/parser/transform.ts +19 -8
  132. package/src/core/parser/tw-parser.ts +148 -31
  133. package/src/core/parser/typography-dispatcher.ts +20 -1
  134. package/src/core/parser/typography.ts +15 -15
  135. package/src/core/style-builder/build-style.ts +12 -1
  136. package/src/core/style-builder/union-builder.ts +10 -12
  137. package/src/metro/dts.ts +6 -1
  138. package/src/metro/transformer.ts +42 -78
  139. package/src/metro/with-config.ts +10 -29
  140. package/src/runtime/hooks/use-scheme.ts +17 -10
  141. package/src/runtime/index.ts +2 -1
  142. package/src/runtime/lookup-css.ts +42 -0
  143. package/src/runtime/resolve.ts +9 -7
  144. package/src/runtime/wrap.tsx +57 -61
  145. package/src/testing/index.ts +3 -0
@@ -2,6 +2,7 @@ import { type SourceEntry } from '@tailwindcss/oxide';
2
2
  import { type GradientAtomInfo } from './gradient';
3
3
  import { type HapticRequest } from './haptics';
4
4
  import type { RNStyle } from './types';
5
+ import type { ThemeTables } from '../types';
5
6
  /** Parser configuration — one instance per Metro session, theme CSS fixed. */
6
7
  export interface TailwindParserConfig {
7
8
  /**
@@ -94,6 +95,14 @@ export interface ParsedOutput {
94
95
  * provider's `windowWidth`.
95
96
  */
96
97
  breakpoints: ReadonlyMap<string, number>;
98
+ /**
99
+ * Per-scheme user theme token tables (`--color-*`, `--spacing-*`, …) with
100
+ * `--color-*` values lowered to sRGB. The style-builder emits these as
101
+ * `registerThemeTokens({...})` in the manifest so `useColor` / `useToken` /
102
+ * `useSize` resolve out of the box, without the user threading a `tables`
103
+ * prop on the provider. Keyed by scheme (`base` + each declared variant).
104
+ */
105
+ themeTokens: ThemeTables;
97
106
  }
98
107
  /**
99
108
  * Parses one source file's Tailwind usage into RN-ready style objects.
@@ -170,6 +179,17 @@ export declare class TailwindParser {
170
179
  * @returns Effective var name → value lookup for the scheme.
171
180
  */
172
181
  private effectiveVars;
182
+ /**
183
+ * Build the per-scheme theme token tables for `registerThemeTokens` —
184
+ * the data source for `useColor` / `useToken` / `useSize`. Emits one table
185
+ * per scheme the user wrote tokens under (`base` + each variant block /
186
+ * `.dark` override). `--color-*` values are lowered to sRGB (matching the
187
+ * className path) using `resolver` so a wide-gamut or `var()`-referencing
188
+ * token resolves to an RN-renderable string; other tokens pass through.
189
+ * @param resolver Full compiled `:root` table, for resolving `var()` refs.
190
+ * @returns Scheme → (token name → value) map.
191
+ */
192
+ private buildThemeTokens;
173
193
  /**
174
194
  * Build the Tailwind compiler on first use and cache it. The theme CSS
175
195
  * gets a `theme(inline)` modifier on its `@import 'tailwindcss'` so
@@ -1,7 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  var typography = require('./typography.cjs');
4
+ var tokens = require('./tokens.cjs');
4
5
 
6
+ /** RN-supported `textDecorationStyle` values (`wavy` has no RN equivalent). */
7
+ const RN_DECORATION_STYLES = new Set(['solid', 'double', 'dotted', 'dashed']);
5
8
  /**
6
9
  * Build the RN `textDecorationLine` entry — string identity for the
7
10
  * single-line cases, joined-string for the array shape.
@@ -53,7 +56,9 @@ function letterSpacingToEntries(value) {
53
56
  const { unit, value: px } = inner.value;
54
57
  if (typeof px !== 'number')
55
58
  return [];
56
- return [['letterSpacing', unit === 'px' ? px : px * 16]];
59
+ const resolved = unit === 'px' ? px : px * 16;
60
+ // Round off lightningcss f32 noise (`0.1em` → `1.600000023841858`).
61
+ return [['letterSpacing', Math.round(resolved * 10_000) / 10_000]];
57
62
  }
58
63
  /**
59
64
  * Lower a CSS `text-align` keyword to one RN's `textAlign` accepts. RN
@@ -89,6 +94,19 @@ function dispatchTypographyDeclaration(decl) {
89
94
  case 'text-decoration-line': {
90
95
  return textDecorationLineToEntries(decl.value);
91
96
  }
97
+ case 'text-decoration-style': {
98
+ // RN <Text> supports textDecorationStyle (solid/double/dotted/dashed).
99
+ const style = String(decl.value);
100
+ return RN_DECORATION_STYLES.has(style) ? [['textDecorationStyle', style]] : [];
101
+ }
102
+ case 'font-family': {
103
+ // Typed `font-family` is a fallback LIST (`font-sans`, `font-mono`,
104
+ // `font-[Inter]`). RN takes one concrete typeface; an all-generic
105
+ // stack (default `font-sans`) emits nothing → system font. The themed
106
+ // `var(--font-*)` path goes through `coerceFontFamily` in declaration.ts.
107
+ const family = tokens.firstConcreteFontFamily(decl.value);
108
+ return family === undefined ? [] : [['fontFamily', family]];
109
+ }
92
110
  case 'aspect-ratio': {
93
111
  return aspectRatioToEntries(decl.value);
94
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"typography-dispatcher.cjs","sources":["../../../../../src/core/parser/typography-dispatcher.ts"],"sourcesContent":["import type { Declaration as LcDeclaration } from 'lightningcss'\nimport { lineHeightToEntries } from './typography'\nimport type { RNEntry } from './types'\n\n/**\n * Build the RN `textDecorationLine` entry — string identity for the\n * single-line cases, joined-string for the array shape.\n * @param value Typed text-decoration-line.\n * @returns Single-entry list with `textDecorationLine`.\n */\nfunction textDecorationLineToEntries(value: LcDeclaration['value']): readonly RNEntry[] {\n if (value === 'none') return [['textDecorationLine', 'none']]\n if (typeof value === 'string') return [['textDecorationLine', value]]\n if (Array.isArray(value)) return [['textDecorationLine', value.join(' ')]]\n return []\n}\n\n/**\n * Build the RN `aspectRatio` entry from lightningcss's typed value.\n * Drops `auto` (no RN equivalent).\n * @param value Typed aspect-ratio value.\n * @param value.auto Whether the value resolved to `auto`.\n * @param value.ratio Numeric `[width, height]` ratio (or null/undefined).\n * @returns Single-entry list or empty.\n */\nfunction aspectRatioToEntries(value: { auto?: boolean; ratio?: readonly [number, number] | null }): readonly RNEntry[] {\n if (value.auto) return []\n if (!value.ratio) return []\n const [w, h] = value.ratio\n if (h === 0) return []\n return [['aspectRatio', w / h]]\n}\n\n/**\n * Build the RN `letterSpacing` entry. RN expects pixel numbers; rem\n * lengths are scaled to px (16-px base).\n * @param value Typed letter-spacing value.\n * @returns Single-entry list or empty.\n */\nfunction letterSpacingToEntries(value: LcDeclaration['value']): readonly RNEntry[] {\n if (typeof value !== 'object') return []\n const tagged = value as { type?: string; value?: { type?: string; value?: { unit?: string; value?: number } } }\n if (tagged.type === 'normal') return [['letterSpacing', 0]]\n const inner = tagged.value\n if (inner?.type !== 'value' || !inner.value) return []\n const { unit, value: px } = inner.value\n if (typeof px !== 'number') return []\n return [['letterSpacing', unit === 'px' ? px : px * 16]]\n}\n\n/**\n * Lower a CSS `text-align` keyword to one RN's `textAlign` accepts. RN\n * has no logical `start`/`end`, so map them to physical sides (LTR\n * default); every other keyword (left/right/center/justify/auto) is\n * already valid and passes through.\n * @param align CSS text-align keyword.\n * @returns RN-valid textAlign keyword.\n */\nfunction physicalTextAlign(align: string): string {\n if (align === 'start') return 'left'\n if (align === 'end') return 'right'\n return align\n}\n\n/**\n * Dispatch typography declarations rnwind cares about (text-align,\n * text-transform, text-decoration-line, line-height, letter-spacing,\n * aspect-ratio). Returns null when the property isn't one of these so\n * the caller can fall through to its main switch.\n * @param decl One lightningcss declaration.\n * @returns RN entries when the property matched, else `null`.\n */\nexport function dispatchTypographyDeclaration(decl: LcDeclaration): readonly RNEntry[] | null {\n switch (decl.property) {\n case 'text-align': {\n return [['textAlign', physicalTextAlign(String(decl.value))]]\n }\n case 'text-transform': {\n return [['textTransform', decl.value.case ?? 'none']]\n }\n case 'text-decoration-line': {\n return textDecorationLineToEntries(decl.value)\n }\n case 'aspect-ratio': {\n return aspectRatioToEntries(decl.value)\n }\n case 'line-height': {\n return lineHeightToEntries(decl.value)\n }\n case 'letter-spacing': {\n return letterSpacingToEntries(decl.value)\n }\n default: {\n return null\n }\n }\n}\n"],"names":["lineHeightToEntries"],"mappings":"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"}
1
+ {"version":3,"file":"typography-dispatcher.cjs","sources":["../../../../../src/core/parser/typography-dispatcher.ts"],"sourcesContent":["import type { Declaration as LcDeclaration } from 'lightningcss'\nimport { lineHeightToEntries } from './typography'\nimport { firstConcreteFontFamily } from './tokens'\nimport type { RNEntry } from './types'\n\n/** RN-supported `textDecorationStyle` values (`wavy` has no RN equivalent). */\nconst RN_DECORATION_STYLES: ReadonlySet<string> = new Set(['solid', 'double', 'dotted', 'dashed'])\n\n/**\n * Build the RN `textDecorationLine` entry — string identity for the\n * single-line cases, joined-string for the array shape.\n * @param value Typed text-decoration-line.\n * @returns Single-entry list with `textDecorationLine`.\n */\nfunction textDecorationLineToEntries(value: LcDeclaration['value']): readonly RNEntry[] {\n if (value === 'none') return [['textDecorationLine', 'none']]\n if (typeof value === 'string') return [['textDecorationLine', value]]\n if (Array.isArray(value)) return [['textDecorationLine', value.join(' ')]]\n return []\n}\n\n/**\n * Build the RN `aspectRatio` entry from lightningcss's typed value.\n * Drops `auto` (no RN equivalent).\n * @param value Typed aspect-ratio value.\n * @param value.auto Whether the value resolved to `auto`.\n * @param value.ratio Numeric `[width, height]` ratio (or null/undefined).\n * @returns Single-entry list or empty.\n */\nfunction aspectRatioToEntries(value: { auto?: boolean; ratio?: readonly [number, number] | null }): readonly RNEntry[] {\n if (value.auto) return []\n if (!value.ratio) return []\n const [w, h] = value.ratio\n if (h === 0) return []\n return [['aspectRatio', w / h]]\n}\n\n/**\n * Build the RN `letterSpacing` entry. RN expects pixel numbers; rem\n * lengths are scaled to px (16-px base).\n * @param value Typed letter-spacing value.\n * @returns Single-entry list or empty.\n */\nfunction letterSpacingToEntries(value: LcDeclaration['value']): readonly RNEntry[] {\n if (typeof value !== 'object') return []\n const tagged = value as { type?: string; value?: { type?: string; value?: { unit?: string; value?: number } } }\n if (tagged.type === 'normal') return [['letterSpacing', 0]]\n const inner = tagged.value\n if (inner?.type !== 'value' || !inner.value) return []\n const { unit, value: px } = inner.value\n if (typeof px !== 'number') return []\n const resolved = unit === 'px' ? px : px * 16\n // Round off lightningcss f32 noise (`0.1em` → `1.600000023841858`).\n return [['letterSpacing', Math.round(resolved * 10_000) / 10_000]]\n}\n\n/**\n * Lower a CSS `text-align` keyword to one RN's `textAlign` accepts. RN\n * has no logical `start`/`end`, so map them to physical sides (LTR\n * default); every other keyword (left/right/center/justify/auto) is\n * already valid and passes through.\n * @param align CSS text-align keyword.\n * @returns RN-valid textAlign keyword.\n */\nfunction physicalTextAlign(align: string): string {\n if (align === 'start') return 'left'\n if (align === 'end') return 'right'\n return align\n}\n\n/**\n * Dispatch typography declarations rnwind cares about (text-align,\n * text-transform, text-decoration-line, line-height, letter-spacing,\n * aspect-ratio). Returns null when the property isn't one of these so\n * the caller can fall through to its main switch.\n * @param decl One lightningcss declaration.\n * @returns RN entries when the property matched, else `null`.\n */\nexport function dispatchTypographyDeclaration(decl: LcDeclaration): readonly RNEntry[] | null {\n switch (decl.property) {\n case 'text-align': {\n return [['textAlign', physicalTextAlign(String(decl.value))]]\n }\n case 'text-transform': {\n return [['textTransform', decl.value.case ?? 'none']]\n }\n case 'text-decoration-line': {\n return textDecorationLineToEntries(decl.value)\n }\n case 'text-decoration-style': {\n // RN <Text> supports textDecorationStyle (solid/double/dotted/dashed).\n const style = String(decl.value)\n return RN_DECORATION_STYLES.has(style) ? [['textDecorationStyle', style]] : []\n }\n case 'font-family': {\n // Typed `font-family` is a fallback LIST (`font-sans`, `font-mono`,\n // `font-[Inter]`). RN takes one concrete typeface; an all-generic\n // stack (default `font-sans`) emits nothing → system font. The themed\n // `var(--font-*)` path goes through `coerceFontFamily` in declaration.ts.\n const family = firstConcreteFontFamily(decl.value as readonly unknown[])\n return family === undefined ? [] : [['fontFamily', family]]\n }\n case 'aspect-ratio': {\n return aspectRatioToEntries(decl.value)\n }\n case 'line-height': {\n return lineHeightToEntries(decl.value)\n }\n case 'letter-spacing': {\n return letterSpacingToEntries(decl.value)\n }\n default: {\n return null\n }\n }\n}\n"],"names":["firstConcreteFontFamily","lineHeightToEntries"],"mappings":"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"}
@@ -3,29 +3,26 @@
3
3
  var length = require('./length.cjs');
4
4
 
5
5
  /**
6
- * Expand lightningcss's `Display` typed value to an RN `{display}` entry.
7
- * - `keyword` variant (`none`, `flex`, `grid`, `inline`, …) passes through.
8
- * - `pair` variant (the modern CSS model `{inside: {type}, outside,
9
- * isListItem}`) collapses to RN's `'flex'` / `'grid'` when the inside
10
- * type matches, otherwise skips.
6
+ * Display values React Native's `display` style prop actually accepts.
7
+ * Everything else (`block`, `inline`, `inline-block`, `grid`, `table`, …)
8
+ * has no RN analog RN lays out as flex by default, and emitting an invalid
9
+ * value triggers a dev warning + silent drop. So we drop them outright.
10
+ */
11
+ const RN_DISPLAY_VALUES = new Set(['none', 'flex', 'contents']);
12
+ /**
13
+ * Expand lightningcss's `Display` typed value to an RN `{display}` entry,
14
+ * keeping only the values RN supports (`none` / `flex` / `contents`).
15
+ * - `keyword` variant emits only when the keyword is RN-valid.
16
+ * - `pair` variant (the modern CSS model) collapses `flex` inside to
17
+ * `'flex'`; `flow` (`block`/`inline`) and `grid` have no RN analog → drop.
11
18
  * @param value Typed display value.
12
19
  * @returns RN entries (zero or one).
13
20
  */
14
21
  function displayToEntries(value) {
15
22
  if (value.type === 'keyword')
16
- return [['display', value.value]];
17
- if (value.type === 'pair') {
18
- const inside = value.inside.type;
19
- // `flow` is the default inside mode — maps to `block` / `inline` /
20
- // `inline-block` based on the outer; RN only distinguishes `block`-ish
21
- // from `flex`, so collapse the `flow` family to the `outside` keyword.
22
- if (inside === 'flow')
23
- return [['display', value.outside]];
24
- if (inside === 'flex')
25
- return [['display', 'flex']];
26
- if (inside === 'grid')
27
- return [['display', 'grid']];
28
- }
23
+ return RN_DISPLAY_VALUES.has(value.value) ? [['display', value.value]] : [];
24
+ if (value.type === 'pair' && value.inside.type === 'flex')
25
+ return [['display', 'flex']];
29
26
  return [];
30
27
  }
31
28
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"typography.cjs","sources":["../../../../../src/core/parser/typography.ts"],"sourcesContent":["import type { Display, FontSize, FontWeight, LineHeight, ZIndex } from 'lightningcss'\nimport { dimensionPercentageToNumber } from './length'\nimport type { RNEntry } from './types'\n\n/**\n * Expand lightningcss's `Display` typed value to an RN `{display}` entry.\n * - `keyword` variant (`none`, `flex`, `grid`, `inline`, …) passes through.\n * - `pair` variant (the modern CSS model `{inside: {type}, outside,\n * isListItem}`) collapses to RN's `'flex'` / `'grid'` when the inside\n * type matches, otherwise skips.\n * @param value Typed display value.\n * @returns RN entries (zero or one).\n */\nexport function displayToEntries(value: Display): readonly RNEntry[] {\n if (value.type === 'keyword') return [['display', value.value]]\n if (value.type === 'pair') {\n const inside = value.inside.type\n // `flow` is the default inside mode — maps to `block` / `inline` /\n // `inline-block` based on the outer; RN only distinguishes `block`-ish\n // from `flex`, so collapse the `flow` family to the `outside` keyword.\n if (inside === 'flow') return [['display', value.outside]]\n if (inside === 'flex') return [['display', 'flex']]\n if (inside === 'grid') return [['display', 'grid']]\n }\n return []\n}\n\n/**\n * Convert `FontSize` to a pixel number. The `length` variant carries a\n * `DimensionPercentage`; `absolute` / `relative` keyword variants have no\n * RN numeric equivalent and get dropped.\n * @param value Typed font-size value.\n * @returns Pixel size, or `null` when not a pure length.\n */\nexport function fontSizeToPx(value: FontSize): number | null {\n if (value.type !== 'length') return null\n const length = dimensionPercentageToNumber(value.value)\n if (typeof length !== 'number') return null\n return length\n}\n\n/**\n * Convert `FontWeight` to the form RN accepts — numbers for absolute\n * weights, `'bolder'` / `'lighter'` keywords pass through as strings.\n * @param value Typed font-weight value.\n * @returns RN font weight.\n */\nexport function fontWeightToValue(value: FontWeight): number | string {\n if (value.type === 'absolute') {\n if (value.value.type === 'weight') return value.value.value\n return value.value.type\n }\n return value.type\n}\n\n/**\n * Coerce `z-index` to a number. `{type: 'auto'}` has no RN equivalent so\n * it collapses to 0.\n * @param value Typed z-index value.\n * @returns Integer z-index.\n */\nexport function zIndexToNumber(value: ZIndex): number {\n if (value.type === 'auto') return 0\n return value.value\n}\n\n/**\n * Convert lightningcss `LineHeight` into RN's `lineHeight` entry. RN\n * accepts a single number (pixel value). For unitless multipliers we\n * multiply by the default 16-px font size (RN's base); for px values we\n * pass through; percentages are approximated the same way.\n * @param value Typed line-height.\n * @returns RN entry.\n */\nexport function lineHeightToEntries(value: LineHeight): readonly RNEntry[] {\n if (value.type === 'normal') return [['lineHeight', 20]]\n if (value.type === 'number') return [['lineHeight', Math.round(value.value * 16 * 10_000) / 10_000]]\n if (value.type === 'length') {\n const px = dimensionPercentageToNumber(value.value)\n if (typeof px === 'number') return [['lineHeight', Math.round(px * 10_000) / 10_000]]\n }\n return []\n}\n"],"names":["length","dimensionPercentageToNumber"],"mappings":";;;;AAIA;;;;;;;;AAQG;AACG,SAAU,gBAAgB,CAAC,KAAc,EAAA;AAC7C,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAC/D,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;AACzB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI;;;;QAIhC,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,MAAM,KAAK,MAAM;AAAE,YAAA,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,MAAM,KAAK,MAAM;AAAE,YAAA,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACrD;AACA,IAAA,OAAO,EAAE;AACX;AAEA;;;;;;AAMG;AACG,SAAU,YAAY,CAAC,KAAe,EAAA;AAC1C,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,IAAI;IACxC,MAAMA,QAAM,GAAGC,kCAA2B,CAAC,KAAK,CAAC,KAAK,CAAC;IACvD,IAAI,OAAOD,QAAM,KAAK,QAAQ;AAAE,QAAA,OAAO,IAAI;AAC3C,IAAA,OAAOA,QAAM;AACf;AAEA;;;;;AAKG;AACG,SAAU,iBAAiB,CAAC,KAAiB,EAAA;AACjD,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE;AAC7B,QAAA,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK;AAC3D,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI;IACzB;IACA,OAAO,KAAK,CAAC,IAAI;AACnB;AAEA;;;;;AAKG;AACG,SAAU,cAAc,CAAC,KAAa,EAAA;AAC1C,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;AAAE,QAAA,OAAO,CAAC;IACnC,OAAO,KAAK,CAAC,KAAK;AACpB;AAEA;;;;;;;AAOG;AACG,SAAU,mBAAmB,CAAC,KAAiB,EAAA;AACnD,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACxD,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AACpG,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;QAC3B,MAAM,EAAE,GAAGC,kCAA2B,CAAC,KAAK,CAAC,KAAK,CAAC;QACnD,IAAI,OAAO,EAAE,KAAK,QAAQ;AAAE,YAAA,OAAO,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;IACvF;AACA,IAAA,OAAO,EAAE;AACX;;;;;;;;"}
1
+ {"version":3,"file":"typography.cjs","sources":["../../../../../src/core/parser/typography.ts"],"sourcesContent":["import type { Display, FontSize, FontWeight, LineHeight, ZIndex } from 'lightningcss'\nimport { dimensionPercentageToNumber } from './length'\nimport type { RNEntry } from './types'\n\n/**\n * Display values React Native's `display` style prop actually accepts.\n * Everything else (`block`, `inline`, `inline-block`, `grid`, `table`, …)\n * has no RN analog — RN lays out as flex by default, and emitting an invalid\n * value triggers a dev warning + silent drop. So we drop them outright.\n */\nconst RN_DISPLAY_VALUES: ReadonlySet<string> = new Set(['none', 'flex', 'contents'])\n\n/**\n * Expand lightningcss's `Display` typed value to an RN `{display}` entry,\n * keeping only the values RN supports (`none` / `flex` / `contents`).\n * - `keyword` variant emits only when the keyword is RN-valid.\n * - `pair` variant (the modern CSS model) collapses `flex` inside to\n * `'flex'`; `flow` (`block`/`inline`) and `grid` have no RN analog drop.\n * @param value Typed display value.\n * @returns RN entries (zero or one).\n */\nexport function displayToEntries(value: Display): readonly RNEntry[] {\n if (value.type === 'keyword') return RN_DISPLAY_VALUES.has(value.value) ? [['display', value.value]] : []\n if (value.type === 'pair' && value.inside.type === 'flex') return [['display', 'flex']]\n return []\n}\n\n/**\n * Convert `FontSize` to a pixel number. The `length` variant carries a\n * `DimensionPercentage`; `absolute` / `relative` keyword variants have no\n * RN numeric equivalent and get dropped.\n * @param value Typed font-size value.\n * @returns Pixel size, or `null` when not a pure length.\n */\nexport function fontSizeToPx(value: FontSize): number | null {\n if (value.type !== 'length') return null\n const length = dimensionPercentageToNumber(value.value)\n if (typeof length !== 'number') return null\n return length\n}\n\n/**\n * Convert `FontWeight` to the form RN accepts — numbers for absolute\n * weights, `'bolder'` / `'lighter'` keywords pass through as strings.\n * @param value Typed font-weight value.\n * @returns RN font weight.\n */\nexport function fontWeightToValue(value: FontWeight): number | string {\n if (value.type === 'absolute') {\n if (value.value.type === 'weight') return value.value.value\n return value.value.type\n }\n return value.type\n}\n\n/**\n * Coerce `z-index` to a number. `{type: 'auto'}` has no RN equivalent so\n * it collapses to 0.\n * @param value Typed z-index value.\n * @returns Integer z-index.\n */\nexport function zIndexToNumber(value: ZIndex): number {\n if (value.type === 'auto') return 0\n return value.value\n}\n\n/**\n * Convert lightningcss `LineHeight` into RN's `lineHeight` entry. RN\n * accepts a single number (pixel value). For unitless multipliers we\n * multiply by the default 16-px font size (RN's base); for px values we\n * pass through; percentages are approximated the same way.\n * @param value Typed line-height.\n * @returns RN entry.\n */\nexport function lineHeightToEntries(value: LineHeight): readonly RNEntry[] {\n if (value.type === 'normal') return [['lineHeight', 20]]\n if (value.type === 'number') return [['lineHeight', Math.round(value.value * 16 * 10_000) / 10_000]]\n if (value.type === 'length') {\n const px = dimensionPercentageToNumber(value.value)\n if (typeof px === 'number') return [['lineHeight', Math.round(px * 10_000) / 10_000]]\n }\n return []\n}\n"],"names":["length","dimensionPercentageToNumber"],"mappings":";;;;AAIA;;;;;AAKG;AACH,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAEpF;;;;;;;;AAQG;AACG,SAAU,gBAAgB,CAAC,KAAc,EAAA;AAC7C,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE;AACzG,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM;AAAE,QAAA,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AACvF,IAAA,OAAO,EAAE;AACX;AAEA;;;;;;AAMG;AACG,SAAU,YAAY,CAAC,KAAe,EAAA;AAC1C,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,IAAI;IACxC,MAAMA,QAAM,GAAGC,kCAA2B,CAAC,KAAK,CAAC,KAAK,CAAC;IACvD,IAAI,OAAOD,QAAM,KAAK,QAAQ;AAAE,QAAA,OAAO,IAAI;AAC3C,IAAA,OAAOA,QAAM;AACf;AAEA;;;;;AAKG;AACG,SAAU,iBAAiB,CAAC,KAAiB,EAAA;AACjD,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE;AAC7B,QAAA,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK;AAC3D,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI;IACzB;IACA,OAAO,KAAK,CAAC,IAAI;AACnB;AAEA;;;;;AAKG;AACG,SAAU,cAAc,CAAC,KAAa,EAAA;AAC1C,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;AAAE,QAAA,OAAO,CAAC;IACnC,OAAO,KAAK,CAAC,KAAK;AACpB;AAEA;;;;;;;AAOG;AACG,SAAU,mBAAmB,CAAC,KAAiB,EAAA;AACnD,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACxD,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AACpG,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;QAC3B,MAAM,EAAE,GAAGC,kCAA2B,CAAC,KAAK,CAAC,KAAK,CAAC;QACnD,IAAI,OAAO,EAAE,KAAK,QAAQ;AAAE,YAAA,OAAO,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;IACvF;AACA,IAAA,OAAO,EAAE;AACX;;;;;;;;"}
@@ -1,11 +1,11 @@
1
1
  import type { Display, FontSize, FontWeight, LineHeight, ZIndex } from 'lightningcss';
2
2
  import type { RNEntry } from './types';
3
3
  /**
4
- * Expand lightningcss's `Display` typed value to an RN `{display}` entry.
5
- * - `keyword` variant (`none`, `flex`, `grid`, `inline`, …) passes through.
6
- * - `pair` variant (the modern CSS model `{inside: {type}, outside,
7
- * isListItem}`) collapses to RN's `'flex'` / `'grid'` when the inside
8
- * type matches, otherwise skips.
4
+ * Expand lightningcss's `Display` typed value to an RN `{display}` entry,
5
+ * keeping only the values RN supports (`none` / `flex` / `contents`).
6
+ * - `keyword` variant emits only when the keyword is RN-valid.
7
+ * - `pair` variant (the modern CSS model) collapses `flex` inside to
8
+ * `'flex'`; `flow` (`block`/`inline`) and `grid` have no RN analog → drop.
9
9
  * @param value Typed display value.
10
10
  * @returns RN entries (zero or one).
11
11
  */
@@ -296,14 +296,18 @@ function serializeBreakpoints(breakpoints) {
296
296
  * @param breakpoints Responsive breakpoint name → px-threshold map.
297
297
  * @param gradients Atom → gradient info for `registerGradients`.
298
298
  * @param haptics Atom → haptic request for `registerHaptics`.
299
+ * @param themeTokens
299
300
  * @returns JS source text.
300
301
  */
301
- function renderManifest(variants, breakpoints, gradients, haptics) {
302
+ function renderManifest(variants, breakpoints, gradients, haptics, themeTokens) {
303
+ const hasTokens = Object.keys(themeTokens).length > 0;
302
304
  const imports = ['registerSchemeLoader', 'registerBreakpoints'];
303
305
  if (gradients.size > 0)
304
306
  imports.push('registerGradients');
305
307
  if (haptics.size > 0)
306
308
  imports.push('registerHaptics');
309
+ if (hasTokens)
310
+ imports.push('registerThemeTokens');
307
311
  const lines = [`import { ${imports.join(', ')} } from 'rnwind'`, `import './common.style'`];
308
312
  for (const variant of variants)
309
313
  lines.push(`import ${JSON.stringify(`./${variant}.style`)}`);
@@ -312,6 +316,8 @@ function renderManifest(variants, breakpoints, gradients, haptics) {
312
316
  lines.push(`registerGradients(${serializeFeatureMap(gradients)})`);
313
317
  if (haptics.size > 0)
314
318
  lines.push(`registerHaptics(${serializeFeatureMap(haptics)})`);
319
+ if (hasTokens)
320
+ lines.push(`registerThemeTokens(${JSON.stringify(themeTokens)})`);
315
321
  lines.push(``, `function ensureSchemeLoaded(_name) {}`, ``, `registerSchemeLoader(ensureSchemeLoaded)`, ``, `export { ensureSchemeLoaded }`, ``);
316
322
  return lines.join('\n');
317
323
  }
@@ -603,9 +609,10 @@ const EMPTY_BREAKPOINTS = new Map();
603
609
  * @param literals Distinct literal className strings — pre-merged into
604
610
  * per-scheme molecules so the runtime resolver's O(1) molecule-first
605
611
  * path is populated. Empty for legacy/test callers (atom path only).
612
+ * @param themeTokens
606
613
  * @returns Per-scheme sources, manifest source, variant list.
607
614
  */
608
- function buildSchemeSources(atomNames, resolved, keyframes, cache, breakpoints = EMPTY_BREAKPOINTS, gradients = EMPTY_FEATURE_MAP, haptics = EMPTY_FEATURE_MAP, literals = EMPTY_LITERALS) {
615
+ function buildSchemeSources(atomNames, resolved, keyframes, cache, breakpoints = EMPTY_BREAKPOINTS, gradients = EMPTY_FEATURE_MAP, haptics = EMPTY_FEATURE_MAP, literals = EMPTY_LITERALS, themeTokens = EMPTY_THEME_TOKENS) {
609
616
  const variants = collectVariantSchemes(resolved);
610
617
  const commonEntries = [];
611
618
  const variantEntries = {};
@@ -630,7 +637,7 @@ function buildSchemeSources(atomNames, resolved, keyframes, cache, breakpoints =
630
637
  }
631
638
  return {
632
639
  schemeSources,
633
- manifestSource: renderManifest(variants, breakpoints, gradients, haptics),
640
+ manifestSource: renderManifest(variants, breakpoints, gradients, haptics, themeTokens),
634
641
  variants,
635
642
  serializedMisses: misses,
636
643
  };
@@ -639,6 +646,8 @@ function buildSchemeSources(atomNames, resolved, keyframes, cache, breakpoints =
639
646
  const EMPTY_FEATURE_MAP = new Map();
640
647
  /** Shared empty literal-list default (atom-only callers). */
641
648
  const EMPTY_LITERALS = [];
649
+ /** Shared empty theme-token default (callers without theme tokens). */
650
+ const EMPTY_THEME_TOKENS = {};
642
651
 
643
652
  exports.buildSchemeSources = buildSchemeSources;
644
653
  //# sourceMappingURL=build-style.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"build-style.cjs","sources":["../../../../../src/core/style-builder/build-style.ts"],"sourcesContent":["import type { KeyframeBlock, RNStyle, SchemedStyle } from '../parser'\nimport { normalizeClassName } from '../normalize-classname'\n\n/** Match atom names like `border-hairline`, `h-hairline`, `border-t-hairline`, etc. */\nconst HAIRLINE_ATOM = /-hairline$/\n\n/** Parser's synthetic \"no variant\" scheme — provides the canonical fallback. */\nconst BASE_SCHEME = 'base'\n\n/** Runtime registry key for the always-loaded fallback scheme. */\nconst COMMON_SCHEME = 'common'\n\n/** Sentinel key the parser sets on interactive (`active:`/`focus:`) atoms. */\nconst STATE_KEY = '__state'\n\n/**\n * Whether an atom is a `*-hairline` utility — its numeric value must be\n * rewritten as `StyleSheet.hairlineWidth` at runtime.\n * @param atomName Class name.\n * @returns True when the atom is a hairline utility.\n */\nfunction isHairlineAtom(atomName: string): boolean {\n return HAIRLINE_ATOM.test(atomName)\n}\n\n/**\n * Whether an RN style object carries any own key. The parser emits\n * empty `{}` for schemes an atom doesn't apply to; we treat those as\n * \"inherit canonical\" and don't emit an entry for that scheme.\n * @param style RN style object.\n * @returns Whether the style has content.\n */\nfunction isNonEmptyStyle(style: RNStyle | undefined): style is RNStyle {\n if (!style) return false\n return Object.keys(style).length > 0\n}\n\n/**\n * Iterate per-scheme entries from a parser-produced schemed bucket,\n * skipping the reserved `__state` metadata key.\n * @param schemed Parser output for one atom.\n * @yields `[scheme, style]` pairs in object-key order.\n */\nfunction* iterScheme(schemed: SchemedStyle): IterableIterator<[string, RNStyle]> {\n const raw = schemed as Readonly<Record<string, RNStyle | string>>\n for (const key in raw) {\n if (key === STATE_KEY) continue\n yield [key, raw[key] as RNStyle]\n }\n}\n\n/**\n * Pick the canonical style for an atom — the value that goes into\n * `common.style.js`. Prefers the parser's `base` entry (the \"default\n * when no variant matches\"); falls back to the first non-empty per-\n * scheme entry when the atom has no explicit base.\n * @param schemed Parser-produced per-scheme bucket.\n * @returns Canonical style, or undefined when every scheme is empty.\n */\nfunction canonicalValue(schemed: SchemedStyle): RNStyle | undefined {\n const baseEntry = (schemed as Readonly<Record<string, RNStyle>>)[BASE_SCHEME]\n if (isNonEmptyStyle(baseEntry)) return baseEntry\n for (const [, style] of iterScheme(schemed)) {\n if (isNonEmptyStyle(style)) return style\n }\n return undefined\n}\n\n/**\n * Collect every variant scheme name across the project's atoms. The\n * synthetic `base` scheme is excluded — it's folded into the `common`\n * output. Returns variants in sorted order for deterministic output.\n * @param resolved Parser-produced atom map.\n * @returns Variant scheme names (no `base`, no `common`).\n */\nfunction collectVariantSchemes(resolved: ReadonlyMap<string, SchemedStyle>): readonly string[] {\n const set = new Set<string>()\n for (const schemed of resolved.values()) {\n for (const [scheme] of iterScheme(schemed)) {\n if (scheme !== BASE_SCHEME) set.add(scheme)\n }\n }\n return [...set].toSorted((a, b) => a.localeCompare(b))\n}\n\n/**\n * Normalize a CSS keyframe selector to the percentage form Reanimated\n * v4 keyframes objects use.\n * @param offset Selector text (`'from'`, `'to'`, `'50%'`).\n * @returns Percentage string.\n */\nfunction offsetToPercent(offset: string): string {\n if (offset === 'from') return '0%'\n if (offset === 'to') return '100%'\n return offset\n}\n\n/**\n * Replace a string `animationName` with the inline keyframes object\n * Reanimated v4's CSS engine expects. Atoms whose `animationName`\n * doesn't match any registered keyframe keep the original string.\n * @param style RN style object (possibly carrying `animationName`).\n * @param keyframes Keyframes available to this build.\n * @returns Style with `animationName` inlined when matched.\n */\nfunction inlineAnimationName(style: RNStyle, keyframes: ReadonlyMap<string, KeyframeBlock>): RNStyle {\n const name = style.animationName\n if (typeof name !== 'string') return style\n const block = keyframes.get(name)\n if (!block) return style\n const out: RNStyle = { ...style }\n const inline: Record<string, Record<string, string | number>> = {}\n for (const step of block.steps) inline[offsetToPercent(step.offset)] = step.style as Record<string, string | number>\n out.animationName = inline as unknown as RNStyle[string]\n return out\n}\n\n/**\n * Convert any safe-area markers in the style into a precomputed spec\n * envelope. Atoms with `__safe` markers become\n * `{__safeStyle: [[cssKey, sideTag, or, offset], ...]}` — the runtime\n * resolver reads `value.__safeStyle` as a single property access and\n * resolves against live insets without walking the value's keys.\n * @param style RN style as resolved by the parser.\n * @returns Original style OR the safe-style envelope.\n */\nfunction envelopeSafeMarkers(\n style: RNStyle,\n): RNStyle | { __safeStyle: readonly (readonly [string, string, number | undefined, number | undefined])[] } {\n let specs: [string, string, number | undefined, number | undefined][] | null = null\n for (const key of Object.keys(style)) {\n const value = style[key]\n if (typeof value !== 'object' || !value) continue\n const marker = value as { __safe?: string; or?: number; offset?: number }\n if (typeof marker.__safe !== 'string') continue\n if (!specs) specs = []\n specs.push([key, marker.__safe, marker.or, marker.offset])\n }\n if (!specs) return style\n return { __safeStyle: specs }\n}\n\n/**\n * Serialise a single atom's RN style to a JS object literal. Honors\n * the `*-hairline` sentinel: numeric values get rewritten to\n * `StyleSheet.hairlineWidth` so device-density differences land in the\n * rendered border.\n * @param atomName The atom's class name (used to detect hairline).\n * @param style The atom's RN style object.\n * @returns JS object-literal source.\n */\nfunction serializeStyle(atomName: string, style: RNStyle): string {\n const json = JSON.stringify(style)\n if (!isHairlineAtom(atomName)) return json\n return json.replaceAll(/:(-?\\d+(?:\\.\\d+)?)/g, ': StyleSheet.hairlineWidth')\n}\n\n/**\n * Serialise an atom's resolved value — bare RN style object or an\n * already-enveloped safe-style value.\n * @param atomName Atom name (controls hairline rewrite).\n * @param value Atom value (bare style or `{__safeStyle: spec[]}`).\n * @returns JS source for the value.\n */\nfunction serializeAtomValue(atomName: string, value: unknown): string {\n if (typeof value === 'object' && value !== null && '__safeStyle' in value) return JSON.stringify(value)\n return serializeStyle(atomName, value as RNStyle)\n}\n\n/**\n * Resolve + envelope + serialize an atom's value under one scheme.\n * @param atomName Atom name.\n * @param style Raw RN style for this scheme.\n * @param keyframes Keyframes available to this build.\n * @returns Serialized text ready to emit.\n */\nfunction prepareAtomValue(atomName: string, style: RNStyle, keyframes: ReadonlyMap<string, KeyframeBlock>): string {\n const enveloped = envelopeSafeMarkers(inlineAnimationName(style, keyframes))\n return serializeAtomValue(atomName, enveloped)\n}\n\n/**\n * Decide which serialized atom values get hoisted to a shared `const`.\n * A value is hoisted ONLY when ≥2 atoms share it — then one\n * `const _s<N> = <value>` saves the repeated bytes AND gives those atoms\n * one shared object (reference identity). A value used once is inlined\n * directly at its atom (`\"-m-2\": {\"margin\":-8}`) — hoisting a singleton\n * would only add bytes. First-seen order keeps the const indices stable\n * across workers.\n * @param entries `[atomName, serializedValue]` pairs (atom-sorted).\n * @returns `{ constFor }` value→const-name map + `decls` source lines.\n */\nfunction planValueConsts(entries: readonly (readonly [string, string])[]): {\n constFor: ReadonlyMap<string, string>\n decls: readonly string[]\n} {\n const counts = new Map<string, number>()\n for (const [, value] of entries) counts.set(value, (counts.get(value) ?? 0) + 1)\n const constFor = new Map<string, string>()\n const decls: string[] = []\n for (const [value, count] of counts) {\n if (count < 2) continue\n const name = `_s${decls.length}`\n constFor.set(value, name)\n decls.push(`const ${name} = ${value}`)\n }\n return { constFor, decls }\n}\n\n/**\n * Serialize a scheme's molecule map into a `registerMolecules(...)` object\n * literal, sorted by className for byte-deterministic output.\n * @param molecules normalized className → pre-merged style object.\n * @returns Object-literal source (`null` when empty).\n */\nfunction serializeMolecules(molecules: Record<string, RNStyle> | undefined): string | null {\n if (!molecules) return null\n const keys = Object.keys(molecules).toSorted((a, b) => a.localeCompare(b))\n if (keys.length === 0) return null\n const body = keys.map((cn) => ` ${JSON.stringify(cn)}: ${JSON.stringify(molecules[cn])},`)\n return ['{', ...body, '}'].join('\\n')\n}\n\n/**\n * Render one scheme file's source. `entries` is the list of atoms this\n * scheme contributes — for `common` every atom's canonical value; for\n * a variant only atoms whose value differs from canonical. Hairline\n * atoms in this file trigger the `StyleSheet` import. Pre-merged\n * molecules (when present) are registered alongside the atoms so the\n * runtime resolver's molecule-first path is populated.\n * @param schemeName Registry key (`'common'` or the variant name).\n * @param entries `[atomName, serializedValue]` pairs to emit.\n * @param molecules Pre-merged className → style map for this scheme.\n * @returns JS source text.\n */\nfunction renderSchemeFile(\n schemeName: string,\n entries: readonly (readonly [string, string])[],\n molecules?: Record<string, RNStyle>,\n): string {\n const needsStyleSheet = entries.some(([atom]) => isHairlineAtom(atom))\n const { constFor, decls } = planValueConsts(entries)\n const recordLines = entries.map(([atom, value]) => ` ${JSON.stringify(atom)}: ${constFor.get(value) ?? value},`)\n const moleculeLiteral = serializeMolecules(molecules)\n\n const imports = ['registerAtoms']\n if (moleculeLiteral) imports.push('registerMolecules')\n const lines: string[] = []\n if (needsStyleSheet) lines.push(`import { StyleSheet } from 'react-native'`)\n lines.push(`import { ${imports.join(', ')} } from 'rnwind'`, ``)\n if (decls.length > 0) {\n for (const decl of decls) lines.push(decl)\n lines.push(``)\n }\n lines.push(`registerAtoms(${JSON.stringify(schemeName)}, {`, ...recordLines, `})`, ``)\n if (moleculeLiteral) lines.push(`registerMolecules(${JSON.stringify(schemeName)}, ${moleculeLiteral})`, ``)\n return lines.join('\\n')\n}\n\n/**\n * Serialize a feature map (atom name → JSON-able value: gradient info or\n * haptic request) into a stable JS object literal for the manifest.\n * Sorted by key so the output is byte-deterministic across workers.\n * @param map Atom name → feature value.\n * @returns Object-literal source.\n */\nfunction serializeFeatureMap(map: ReadonlyMap<string, unknown>): string {\n const entries = [...map.entries()].toSorted((a, b) => a[0].localeCompare(b[0]))\n const body = entries.map(([key, value]) => `${JSON.stringify(key)}: ${JSON.stringify(value)}`).join(', ')\n return `{ ${body} }`\n}\n\n/**\n * Render the JS-object literal for the responsive-breakpoint table the\n * runtime registers at manifest-load time. Sorted by ascending px\n * threshold so the runtime can build a deterministic \"tier index\" for\n * its style cache.\n * @param breakpoints Breakpoint name → px-threshold map.\n * @returns Object-literal source (`{}` when empty).\n */\nfunction serializeBreakpoints(breakpoints: ReadonlyMap<string, number>): string {\n if (breakpoints.size === 0) return '{}'\n const entries = [...breakpoints].toSorted((a, b) => a[1] - b[1] || a[0].localeCompare(b[0]))\n const inner = entries.map(([name, px]) => `${JSON.stringify(name)}: ${px}`).join(', ')\n return `{ ${inner} }`\n}\n\n/**\n * Render the manifest module. EAGER-imports `common.style.js` AND every\n * variant scheme file so every scheme's atoms register the moment the\n * manifest evaluates — no lazy `require`. Lazy loading raced the cold\n * start: `RnwindProvider` calls `loadScheme(scheme)` on its first render,\n * but on a cold boot the manifest (hence `registerSchemeLoader`) may not\n * have evaluated yet, so that call no-ops and the active variant's atoms\n * never load — scheme-dependent styles fall back to `common` (the light\n * default) until a reload. Eager imports remove the race entirely; the\n * variant files are small diffs, so the upfront cost is negligible.\n * `ensureSchemeLoaded` stays exported as a no-op for API compatibility.\n * @param variants Variant scheme names (no `base`, no `common`).\n * @param breakpoints Responsive breakpoint name → px-threshold map.\n * @param gradients Atom → gradient info for `registerGradients`.\n * @param haptics Atom → haptic request for `registerHaptics`.\n * @returns JS source text.\n */\nfunction renderManifest(\n variants: readonly string[],\n breakpoints: ReadonlyMap<string, number>,\n gradients: ReadonlyMap<string, unknown>,\n haptics: ReadonlyMap<string, unknown>,\n): string {\n const imports = ['registerSchemeLoader', 'registerBreakpoints']\n if (gradients.size > 0) imports.push('registerGradients')\n if (haptics.size > 0) imports.push('registerHaptics')\n const lines: string[] = [`import { ${imports.join(', ')} } from 'rnwind'`, `import './common.style'`]\n for (const variant of variants) lines.push(`import ${JSON.stringify(`./${variant}.style`)}`)\n lines.push(``, `registerBreakpoints(${serializeBreakpoints(breakpoints)})`)\n if (gradients.size > 0) lines.push(`registerGradients(${serializeFeatureMap(gradients)})`)\n if (haptics.size > 0) lines.push(`registerHaptics(${serializeFeatureMap(haptics)})`)\n lines.push(\n ``,\n `function ensureSchemeLoaded(_name) {}`,\n ``,\n `registerSchemeLoader(ensureSchemeLoaded)`,\n ``,\n `export { ensureSchemeLoaded }`,\n ``,\n )\n return lines.join('\\n')\n}\n\n/**\n * Whether a resolved style carries a nested safe-area marker — molecules\n * can't pre-bake these because the inset value is per-render.\n * @param style Raw resolved RN style (pre-envelope).\n * @returns True when any value is a `{__safe: ...}` marker.\n */\nfunction hasSafeMarker(style: RNStyle): boolean {\n for (const key of Object.keys(style)) {\n const value = style[key]\n if (typeof value !== 'object' || !value) continue\n if ('__safe' in value) return true\n }\n return false\n}\n\n/**\n * Whether a resolved style has font-scale-sensitive props. Molecules\n * can't pre-bake these because `fontSize`/`lineHeight` scale per-render\n * with `useWindowDimensions().fontScale`.\n * @param style Resolved RN style.\n * @returns True when `fontSize` or `lineHeight` is present.\n */\nfunction hasFontScaleProperty(style: RNStyle): boolean {\n return 'fontSize' in style || 'lineHeight' in style\n}\n\n/**\n * Whether a token is a feature-only utility (gradient stop/direction,\n * haptic, or text-truncate) that contributes NO RN `style` — the runtime\n * resolver folds these in via `attachFeatures`, so they don't disqualify\n * a molecule, they just merge nothing.\n * @param token Atom name.\n * @param gradients Gradient feature map.\n * @param haptics Haptic feature map.\n * @returns True when the token is a non-style feature.\n */\nfunction isFeatureToken(token: string, gradients: ReadonlyMap<string, unknown>, haptics: ReadonlyMap<string, unknown>): boolean {\n if (gradients.has(token) || haptics.has(token)) return true\n return token === 'truncate' || token === 'text-ellipsis' || token === 'text-clip' || token.startsWith('line-clamp-')\n}\n\n/**\n * Resolve one atom's value under a scheme: the scheme's own non-empty\n * bucket, falling back to canonical. `common` always reads canonical.\n * @param schemed Parser-produced per-scheme bucket.\n * @param scheme Scheme key (`'common'` or a variant name).\n * @returns The atom's RN style for that scheme, or undefined.\n */\nfunction schemeValueOf(schemed: SchemedStyle, scheme: string): RNStyle | undefined {\n if (scheme === COMMON_SCHEME) return canonicalValue(schemed)\n const own = (schemed as Readonly<Record<string, RNStyle>>)[scheme]\n return isNonEmptyStyle(own) ? own : canonicalValue(schemed)\n}\n\n/**\n * Pre-merge a normalized className's atoms into ONE RN style object for a\n * scheme, or null when the className is NOT molecule-eligible. A\n * className is eligible only when every token is context-independent:\n * - no variant prefix (`active:` / `focus:` / `md:` / `dark:` — anything\n * with a `:`), so scheme/state/breakpoint gating never applies,\n * - no `*-hairline`, `*-safe`, or font-scale (`fontSize`/`lineHeight`)\n * atom, whose value is resolved per-render.\n * Feature-only tokens (gradient / haptic / truncate) are skipped, not\n * disqualifying — the runtime folds them in via `attachFeatures`. Unknown\n * tokens disqualify so the atom path still surfaces the dev warning.\n * @param tokens Normalized className tokens (order preserved).\n * @param scheme Scheme key to resolve each atom under.\n * @param resolved Per-atom schemed styles.\n * @param keyframes Keyframes to inline into `animationName`.\n * @param gradients Gradient feature map.\n * @param haptics Haptic feature map.\n * @returns Merged style object, or null when not eligible.\n */\nfunction mergeMolecule(\n tokens: readonly string[],\n scheme: string,\n resolved: ReadonlyMap<string, SchemedStyle>,\n keyframes: ReadonlyMap<string, KeyframeBlock>,\n gradients: ReadonlyMap<string, unknown>,\n haptics: ReadonlyMap<string, unknown>,\n): RNStyle | null {\n const merged: RNStyle = {}\n for (const token of tokens) {\n if (token.includes(':')) return null\n if (isFeatureToken(token, gradients, haptics)) continue\n if (isHairlineAtom(token)) return null\n const schemed = resolved.get(token)\n if (!schemed) return null\n const raw = schemeValueOf(schemed, scheme)\n if (!raw) continue\n if (hasSafeMarker(raw) || hasFontScaleProperty(raw)) return null\n Object.assign(merged, inlineAnimationName(raw, keyframes))\n }\n return merged\n}\n\n/**\n * Emit each variant's molecule for one className — but only when the\n * variant's merge DIFFERS from common (runtime falls back to common).\n * @param normalized Normalized className key.\n * @param tokens Normalized className tokens.\n * @param commonText Serialized common-scheme merge for the diff check.\n * @param variants Variant scheme names.\n * @param variantMaps Mutable per-variant molecule collectors.\n * @param resolved Per-atom schemed styles.\n * @param keyframes Keyframes to inline.\n * @param gradients Gradient feature map.\n * @param haptics Haptic feature map.\n */\nfunction addVariantMolecules(\n normalized: string,\n tokens: readonly string[],\n commonText: string,\n variants: readonly string[],\n variantMaps: Record<string, Record<string, RNStyle>>,\n resolved: ReadonlyMap<string, SchemedStyle>,\n keyframes: ReadonlyMap<string, KeyframeBlock>,\n gradients: ReadonlyMap<string, unknown>,\n haptics: ReadonlyMap<string, unknown>,\n): void {\n for (const variant of variants) {\n const variantMerged = mergeMolecule(tokens, variant, resolved, keyframes, gradients, haptics)\n if (variantMerged === null) continue\n if (JSON.stringify(variantMerged) !== commonText) variantMaps[variant][normalized] = variantMerged\n }\n}\n\n/**\n * Build per-scheme molecules for every literal className the project\n * uses. Each eligible className gets a pre-merged style object under\n * `common`; a variant only carries an entry when its merge DIFFERS from\n * common (runtime falls back `molecules[scheme] ?? molecules.common`).\n * @param literals Distinct literal className strings (raw).\n * @param resolved Per-atom schemed styles.\n * @param keyframes Keyframes to inline.\n * @param variants Variant scheme names.\n * @param gradients Gradient feature map.\n * @param haptics Haptic feature map.\n * @returns scheme → (normalized className → merged style).\n */\nfunction buildMolecules(\n literals: readonly string[],\n resolved: ReadonlyMap<string, SchemedStyle>,\n keyframes: ReadonlyMap<string, KeyframeBlock>,\n variants: readonly string[],\n gradients: ReadonlyMap<string, unknown>,\n haptics: ReadonlyMap<string, unknown>,\n): Record<string, Record<string, RNStyle>> {\n const common: Record<string, RNStyle> = {}\n const variantMaps: Record<string, Record<string, RNStyle>> = {}\n for (const variant of variants) variantMaps[variant] = {}\n\n for (const literal of literals) {\n const normalized = normalizeClassName(literal)\n if (normalized.length === 0) continue\n const tokens = normalized.split(' ')\n const commonMerged = mergeMolecule(tokens, COMMON_SCHEME, resolved, keyframes, gradients, haptics)\n if (commonMerged === null) continue\n common[normalized] = commonMerged\n addVariantMolecules(normalized, tokens, JSON.stringify(commonMerged), variants, variantMaps, resolved, keyframes, gradients, haptics)\n }\n\n const out: Record<string, Record<string, RNStyle>> = { [COMMON_SCHEME]: common }\n for (const variant of variants) {\n if (Object.keys(variantMaps[variant]).length > 0) out[variant] = variantMaps[variant]\n }\n return out\n}\n\n/** Output of one build pass — one source per scheme plus the manifest. */\nexport interface BuildSchemeSourcesOutput {\n /** `<schemeName>.style.js` source per scheme. Always contains `common`. */\n readonly schemeSources: Readonly<Record<string, string>>\n /** Manifest module source (`schemes.js`). */\n readonly manifestSource: string\n /** Variant scheme names this build covers (sorted; excludes `common`). */\n readonly variants: readonly string[]\n /** Number of `prepareAtomValue` / JSON.stringify passes (cache MISSES) this call did — test telemetry. */\n readonly serializedMisses: number\n}\n\n/**\n * Per-atom cached serialized value. Canonical (common) string plus a\n * map of variant → own-serialized-string. `styleRef` is an identity\n * guard against the resolved SchemedStyle — when callers replace an\n * atom's value the ref diverges and the cache rebuilds that entry.\n */\nexport interface AtomSerializedEntry {\n styleRef: SchemedStyle\n canonical: string\n variants: Map<string, string>\n}\n\n/** Cache UnionBuilder owns across repeated writeSchemes calls. */\nexport type AtomSerializedCache = Map<string, AtomSerializedEntry>\n\n/**\n * Pre-serialize every non-empty variant value, reusing the per-atom\n * cache where present. Result drives both the scheme-uniform check\n * AND the per-variant emission loop downstream.\n * @param atom Atom name.\n * @param schemed Parser-produced schemed bucket.\n * @param variants Variant scheme names in deterministic order.\n * @param keyframes Keyframes available to inline.\n * @param cached Cached entry for this atom (when ref-stable).\n * @returns variantName → serialized text.\n */\nfunction buildVariantTexts(\n atom: string,\n schemed: SchemedStyle,\n variants: readonly string[],\n keyframes: ReadonlyMap<string, KeyframeBlock>,\n cached: AtomSerializedEntry | undefined,\n): Map<string, string> {\n const out = new Map<string, string>()\n for (const variant of variants) {\n const own = (schemed as Readonly<Record<string, RNStyle>>)[variant]\n if (!isNonEmptyStyle(own)) continue\n const text = cached?.variants.get(variant) ?? prepareAtomValue(atom, own, keyframes)\n out.set(variant, text)\n }\n return out\n}\n\n/**\n * Decide whether a (no-base) atom should be promoted to common because\n * every declared variant resolves to the same value. This is the\n * scheme-uniform case: `flex`, `p-4`, `absolute` all carry no theme\n * variables, so Phase-1 fills every variant bucket identically and\n * leaves `base` empty — without this collapse they'd be duplicated\n * across every scheme file.\n *\n * The variant-prefix check is what keeps a real scheme-gated atom\n * (`dark:bg-indigo-800`) out of common in a single-variant project\n * (where its 1 bucket would otherwise look \"uniform\" by definition).\n * @param atom Atom name (checked for `<variant>:` prefix).\n * @param variants Declared variant scheme names.\n * @param variantTexts Serialized variant values.\n * @param canonicalText Serialized canonical (common) value.\n * @returns Whether the atom is uniform across every declared variant.\n */\nfunction isSchemeUniform(\n atom: string,\n variants: readonly string[],\n variantTexts: ReadonlyMap<string, string>,\n canonicalText: string,\n): boolean {\n if (variants.length === 0 || variantTexts.size !== variants.length) return false\n if (variants.some((variant) => atom.startsWith(`${variant}:`))) return false\n for (const text of variantTexts.values()) {\n if (text !== canonicalText) return false\n }\n return true\n}\n\n/**\n * Serialize one atom's canonical + variant-diff entries, honouring the\n * per-atom cache. Returns the number of cache MISSES this atom incurred\n * (0 when canonical was cached AND every needed variant was cached;\n * 1 when anything had to be re-stringified).\n *\n * Three paths gated on whether the parser produced a non-empty `base`\n * bucket and whether the variants converge:\n * - **Themed atom (base present)**: canonical goes to `common`, each\n * variant whose own value diverges from canonical writes the diff\n * into its own scheme file. `lookupAtom` finds the variant's\n * override or falls through to common.\n * - **Scheme-uniform atom (base empty, every variant identical)**:\n * promoted to `common` once — the parser's Phase-1 fills every\n * variant bucket with the same value for utilities like `flex` /\n * `p-4` / `absolute` that don't reference theme variables.\n * - **Scheme-gated atom (base empty, prefixed name like `dark:foo`,\n * or variants diverge)**: each populated variant writes the value\n * into its own scheme file directly; common stays empty so the\n * runtime fallback can't leak the variant style into other schemes.\n * @param atom Atom name.\n * @param schemed Parser-produced schemed bucket for the atom.\n * @param canonical Canonical RN style for `common`.\n * @param variants Variant scheme names in deterministic order.\n * @param keyframes Keyframes available to inline.\n * @param commonEntries Mutable collector for `common`'s `[atom, text]` pairs.\n * @param variantEntries Mutable collector keyed by variant name.\n * @param cache Optional shared serialized-value cache.\n * @returns Number of JSON.stringify passes triggered for this atom.\n */\nfunction collectAtomEntries(\n atom: string,\n schemed: SchemedStyle,\n canonical: RNStyle,\n variants: readonly string[],\n keyframes: ReadonlyMap<string, KeyframeBlock>,\n commonEntries: (readonly [string, string])[],\n variantEntries: Record<string, (readonly [string, string])[]>,\n cache?: AtomSerializedCache,\n): number {\n const cached = cache?.get(atom)\n const hit = cached?.styleRef === schemed\n const baseEntry = (schemed as Readonly<Record<string, RNStyle>>)[BASE_SCHEME]\n const hasBase = isNonEmptyStyle(baseEntry)\n const canonicalText = hit ? cached.canonical : prepareAtomValue(atom, canonical, keyframes)\n const variantTexts = buildVariantTexts(atom, schemed, variants, keyframes, hit ? cached : undefined)\n const goesToCommon = hasBase || isSchemeUniform(atom, variants, variantTexts, canonicalText)\n\n if (goesToCommon) commonEntries.push([atom, canonicalText])\n\n const entry: AtomSerializedEntry = hit\n ? cached\n : { styleRef: schemed, canonical: canonicalText, variants: new Map(variantTexts) }\n if (!hit) cache?.set(atom, entry)\n\n for (const variant of variants) {\n const ownText = variantTexts.get(variant)\n if (ownText === undefined) continue\n if (goesToCommon && ownText === canonicalText) continue\n variantEntries[variant].push([atom, ownText])\n }\n return hit ? 0 : 1\n}\n\n/** Empty fallback when the caller didn't supply breakpoints (legacy callers, tests). */\nconst EMPTY_BREAKPOINTS: ReadonlyMap<string, number> = new Map()\n\n/**\n * Build the per-scheme style files + manifest source.\n *\n * Dedup rule (the thing that shrinks scheme files to their diff):\n * - Every atom's canonical value goes into `common.style.js`.\n * - Each variant's file emits an entry for an atom ONLY when the\n * variant's own resolved value differs from canonical. When the\n * variant inherits (parser emits an empty `{}` for that scheme) or\n * the variant's resolved value serializes identically to canonical,\n * the atom is omitted — at runtime the lookup falls through via\n * `cache.atoms[scheme]?.[atom] ?? cache.atoms.common[atom]`.\n *\n * Keyframes are inlined directly into atom values via `animationName`\n * ({@link inlineAnimationName}). Safe-area markers get pre-enveloped\n * via {@link envelopeSafeMarkers}. Hairline utilities stay bound to\n * `StyleSheet.hairlineWidth` at runtime.\n * @param atomNames All atom names (sorted).\n * @param resolved Per-atom schemed styles from the parser.\n * @param keyframes Keyframe blocks referenced by any atom.\n * @param cache Optional shared serialized-value cache.\n * @param breakpoints Responsive breakpoint name → px-threshold map. The\n * manifest emits `registerBreakpoints({...})` so the runtime can gate\n * `md:*` / `lg:*` atoms on `windowWidth`. Optional — empty when the\n * theme declares no breakpoints (legacy/test callers).\n * @param gradients Gradient feature map (atom → role/colour) for the manifest + molecule eligibility.\n * @param haptics Haptic feature map (atom → request) for the manifest + molecule eligibility.\n * @param literals Distinct literal className strings — pre-merged into\n * per-scheme molecules so the runtime resolver's O(1) molecule-first\n * path is populated. Empty for legacy/test callers (atom path only).\n * @returns Per-scheme sources, manifest source, variant list.\n */\nexport function buildSchemeSources(\n atomNames: readonly string[],\n resolved: ReadonlyMap<string, SchemedStyle>,\n keyframes: ReadonlyMap<string, KeyframeBlock>,\n cache?: AtomSerializedCache,\n breakpoints: ReadonlyMap<string, number> = EMPTY_BREAKPOINTS,\n gradients: ReadonlyMap<string, unknown> = EMPTY_FEATURE_MAP,\n haptics: ReadonlyMap<string, unknown> = EMPTY_FEATURE_MAP,\n literals: readonly string[] = EMPTY_LITERALS,\n): BuildSchemeSourcesOutput {\n const variants = collectVariantSchemes(resolved)\n const commonEntries: (readonly [string, string])[] = []\n const variantEntries: Record<string, (readonly [string, string])[]> = {}\n for (const variant of variants) variantEntries[variant] = []\n let misses = 0\n\n for (const atom of atomNames) {\n const schemed = resolved.get(atom)\n if (!schemed) continue\n const canonical = canonicalValue(schemed)\n if (!canonical) continue\n misses += collectAtomEntries(atom, schemed, canonical, variants, keyframes, commonEntries, variantEntries, cache)\n }\n\n const molecules = buildMolecules(literals, resolved, keyframes, variants, gradients, haptics)\n const schemeSources: Record<string, string> = {\n [COMMON_SCHEME]: renderSchemeFile(COMMON_SCHEME, commonEntries, molecules[COMMON_SCHEME]),\n }\n for (const variant of variants) {\n schemeSources[variant] = renderSchemeFile(variant, variantEntries[variant], molecules[variant])\n }\n\n return {\n schemeSources,\n manifestSource: renderManifest(variants, breakpoints, gradients, haptics),\n variants,\n serializedMisses: misses,\n }\n}\n\n/** Shared empty feature map default. */\nconst EMPTY_FEATURE_MAP: ReadonlyMap<string, unknown> = new Map()\n\n/** Shared empty literal-list default (atom-only callers). */\nconst EMPTY_LITERALS: readonly string[] = []\n\n/** Registry key the runtime uses for the always-loaded fallback. */\nexport const COMMON_SCHEME_NAME: string = COMMON_SCHEME\n"],"names":["normalizeClassName"],"mappings":"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"}
1
+ {"version":3,"file":"build-style.cjs","sources":["../../../../../src/core/style-builder/build-style.ts"],"sourcesContent":["import type { KeyframeBlock, RNStyle, SchemedStyle } from '../parser'\nimport type { ThemeTables } from '../types'\nimport { normalizeClassName } from '../normalize-classname'\n\n/** Match atom names like `border-hairline`, `h-hairline`, `border-t-hairline`, etc. */\nconst HAIRLINE_ATOM = /-hairline$/\n\n/** Parser's synthetic \"no variant\" scheme — provides the canonical fallback. */\nconst BASE_SCHEME = 'base'\n\n/** Runtime registry key for the always-loaded fallback scheme. */\nconst COMMON_SCHEME = 'common'\n\n/** Sentinel key the parser sets on interactive (`active:`/`focus:`) atoms. */\nconst STATE_KEY = '__state'\n\n/**\n * Whether an atom is a `*-hairline` utility — its numeric value must be\n * rewritten as `StyleSheet.hairlineWidth` at runtime.\n * @param atomName Class name.\n * @returns True when the atom is a hairline utility.\n */\nfunction isHairlineAtom(atomName: string): boolean {\n return HAIRLINE_ATOM.test(atomName)\n}\n\n/**\n * Whether an RN style object carries any own key. The parser emits\n * empty `{}` for schemes an atom doesn't apply to; we treat those as\n * \"inherit canonical\" and don't emit an entry for that scheme.\n * @param style RN style object.\n * @returns Whether the style has content.\n */\nfunction isNonEmptyStyle(style: RNStyle | undefined): style is RNStyle {\n if (!style) return false\n return Object.keys(style).length > 0\n}\n\n/**\n * Iterate per-scheme entries from a parser-produced schemed bucket,\n * skipping the reserved `__state` metadata key.\n * @param schemed Parser output for one atom.\n * @yields `[scheme, style]` pairs in object-key order.\n */\nfunction* iterScheme(schemed: SchemedStyle): IterableIterator<[string, RNStyle]> {\n const raw = schemed as Readonly<Record<string, RNStyle | string>>\n for (const key in raw) {\n if (key === STATE_KEY) continue\n yield [key, raw[key] as RNStyle]\n }\n}\n\n/**\n * Pick the canonical style for an atom — the value that goes into\n * `common.style.js`. Prefers the parser's `base` entry (the \"default\n * when no variant matches\"); falls back to the first non-empty per-\n * scheme entry when the atom has no explicit base.\n * @param schemed Parser-produced per-scheme bucket.\n * @returns Canonical style, or undefined when every scheme is empty.\n */\nfunction canonicalValue(schemed: SchemedStyle): RNStyle | undefined {\n const baseEntry = (schemed as Readonly<Record<string, RNStyle>>)[BASE_SCHEME]\n if (isNonEmptyStyle(baseEntry)) return baseEntry\n for (const [, style] of iterScheme(schemed)) {\n if (isNonEmptyStyle(style)) return style\n }\n return undefined\n}\n\n/**\n * Collect every variant scheme name across the project's atoms. The\n * synthetic `base` scheme is excluded — it's folded into the `common`\n * output. Returns variants in sorted order for deterministic output.\n * @param resolved Parser-produced atom map.\n * @returns Variant scheme names (no `base`, no `common`).\n */\nfunction collectVariantSchemes(resolved: ReadonlyMap<string, SchemedStyle>): readonly string[] {\n const set = new Set<string>()\n for (const schemed of resolved.values()) {\n for (const [scheme] of iterScheme(schemed)) {\n if (scheme !== BASE_SCHEME) set.add(scheme)\n }\n }\n return [...set].toSorted((a, b) => a.localeCompare(b))\n}\n\n/**\n * Normalize a CSS keyframe selector to the percentage form Reanimated\n * v4 keyframes objects use.\n * @param offset Selector text (`'from'`, `'to'`, `'50%'`).\n * @returns Percentage string.\n */\nfunction offsetToPercent(offset: string): string {\n if (offset === 'from') return '0%'\n if (offset === 'to') return '100%'\n return offset\n}\n\n/**\n * Replace a string `animationName` with the inline keyframes object\n * Reanimated v4's CSS engine expects. Atoms whose `animationName`\n * doesn't match any registered keyframe keep the original string.\n * @param style RN style object (possibly carrying `animationName`).\n * @param keyframes Keyframes available to this build.\n * @returns Style with `animationName` inlined when matched.\n */\nfunction inlineAnimationName(style: RNStyle, keyframes: ReadonlyMap<string, KeyframeBlock>): RNStyle {\n const name = style.animationName\n if (typeof name !== 'string') return style\n const block = keyframes.get(name)\n if (!block) return style\n const out: RNStyle = { ...style }\n const inline: Record<string, Record<string, string | number>> = {}\n for (const step of block.steps) inline[offsetToPercent(step.offset)] = step.style as Record<string, string | number>\n out.animationName = inline as unknown as RNStyle[string]\n return out\n}\n\n/**\n * Convert any safe-area markers in the style into a precomputed spec\n * envelope. Atoms with `__safe` markers become\n * `{__safeStyle: [[cssKey, sideTag, or, offset], ...]}` — the runtime\n * resolver reads `value.__safeStyle` as a single property access and\n * resolves against live insets without walking the value's keys.\n * @param style RN style as resolved by the parser.\n * @returns Original style OR the safe-style envelope.\n */\nfunction envelopeSafeMarkers(\n style: RNStyle,\n): RNStyle | { __safeStyle: readonly (readonly [string, string, number | undefined, number | undefined])[] } {\n let specs: [string, string, number | undefined, number | undefined][] | null = null\n for (const key of Object.keys(style)) {\n const value = style[key]\n if (typeof value !== 'object' || !value) continue\n const marker = value as { __safe?: string; or?: number; offset?: number }\n if (typeof marker.__safe !== 'string') continue\n if (!specs) specs = []\n specs.push([key, marker.__safe, marker.or, marker.offset])\n }\n if (!specs) return style\n return { __safeStyle: specs }\n}\n\n/**\n * Serialise a single atom's RN style to a JS object literal. Honors\n * the `*-hairline` sentinel: numeric values get rewritten to\n * `StyleSheet.hairlineWidth` so device-density differences land in the\n * rendered border.\n * @param atomName The atom's class name (used to detect hairline).\n * @param style The atom's RN style object.\n * @returns JS object-literal source.\n */\nfunction serializeStyle(atomName: string, style: RNStyle): string {\n const json = JSON.stringify(style)\n if (!isHairlineAtom(atomName)) return json\n return json.replaceAll(/:(-?\\d+(?:\\.\\d+)?)/g, ': StyleSheet.hairlineWidth')\n}\n\n/**\n * Serialise an atom's resolved value — bare RN style object or an\n * already-enveloped safe-style value.\n * @param atomName Atom name (controls hairline rewrite).\n * @param value Atom value (bare style or `{__safeStyle: spec[]}`).\n * @returns JS source for the value.\n */\nfunction serializeAtomValue(atomName: string, value: unknown): string {\n if (typeof value === 'object' && value !== null && '__safeStyle' in value) return JSON.stringify(value)\n return serializeStyle(atomName, value as RNStyle)\n}\n\n/**\n * Resolve + envelope + serialize an atom's value under one scheme.\n * @param atomName Atom name.\n * @param style Raw RN style for this scheme.\n * @param keyframes Keyframes available to this build.\n * @returns Serialized text ready to emit.\n */\nfunction prepareAtomValue(atomName: string, style: RNStyle, keyframes: ReadonlyMap<string, KeyframeBlock>): string {\n const enveloped = envelopeSafeMarkers(inlineAnimationName(style, keyframes))\n return serializeAtomValue(atomName, enveloped)\n}\n\n/**\n * Decide which serialized atom values get hoisted to a shared `const`.\n * A value is hoisted ONLY when ≥2 atoms share it — then one\n * `const _s<N> = <value>` saves the repeated bytes AND gives those atoms\n * one shared object (reference identity). A value used once is inlined\n * directly at its atom (`\"-m-2\": {\"margin\":-8}`) — hoisting a singleton\n * would only add bytes. First-seen order keeps the const indices stable\n * across workers.\n * @param entries `[atomName, serializedValue]` pairs (atom-sorted).\n * @returns `{ constFor }` value→const-name map + `decls` source lines.\n */\nfunction planValueConsts(entries: readonly (readonly [string, string])[]): {\n constFor: ReadonlyMap<string, string>\n decls: readonly string[]\n} {\n const counts = new Map<string, number>()\n for (const [, value] of entries) counts.set(value, (counts.get(value) ?? 0) + 1)\n const constFor = new Map<string, string>()\n const decls: string[] = []\n for (const [value, count] of counts) {\n if (count < 2) continue\n const name = `_s${decls.length}`\n constFor.set(value, name)\n decls.push(`const ${name} = ${value}`)\n }\n return { constFor, decls }\n}\n\n/**\n * Serialize a scheme's molecule map into a `registerMolecules(...)` object\n * literal, sorted by className for byte-deterministic output.\n * @param molecules normalized className → pre-merged style object.\n * @returns Object-literal source (`null` when empty).\n */\nfunction serializeMolecules(molecules: Record<string, RNStyle> | undefined): string | null {\n if (!molecules) return null\n const keys = Object.keys(molecules).toSorted((a, b) => a.localeCompare(b))\n if (keys.length === 0) return null\n const body = keys.map((cn) => ` ${JSON.stringify(cn)}: ${JSON.stringify(molecules[cn])},`)\n return ['{', ...body, '}'].join('\\n')\n}\n\n/**\n * Render one scheme file's source. `entries` is the list of atoms this\n * scheme contributes — for `common` every atom's canonical value; for\n * a variant only atoms whose value differs from canonical. Hairline\n * atoms in this file trigger the `StyleSheet` import. Pre-merged\n * molecules (when present) are registered alongside the atoms so the\n * runtime resolver's molecule-first path is populated.\n * @param schemeName Registry key (`'common'` or the variant name).\n * @param entries `[atomName, serializedValue]` pairs to emit.\n * @param molecules Pre-merged className → style map for this scheme.\n * @returns JS source text.\n */\nfunction renderSchemeFile(\n schemeName: string,\n entries: readonly (readonly [string, string])[],\n molecules?: Record<string, RNStyle>,\n): string {\n const needsStyleSheet = entries.some(([atom]) => isHairlineAtom(atom))\n const { constFor, decls } = planValueConsts(entries)\n const recordLines = entries.map(([atom, value]) => ` ${JSON.stringify(atom)}: ${constFor.get(value) ?? value},`)\n const moleculeLiteral = serializeMolecules(molecules)\n\n const imports = ['registerAtoms']\n if (moleculeLiteral) imports.push('registerMolecules')\n const lines: string[] = []\n if (needsStyleSheet) lines.push(`import { StyleSheet } from 'react-native'`)\n lines.push(`import { ${imports.join(', ')} } from 'rnwind'`, ``)\n if (decls.length > 0) {\n for (const decl of decls) lines.push(decl)\n lines.push(``)\n }\n lines.push(`registerAtoms(${JSON.stringify(schemeName)}, {`, ...recordLines, `})`, ``)\n if (moleculeLiteral) lines.push(`registerMolecules(${JSON.stringify(schemeName)}, ${moleculeLiteral})`, ``)\n return lines.join('\\n')\n}\n\n/**\n * Serialize a feature map (atom name → JSON-able value: gradient info or\n * haptic request) into a stable JS object literal for the manifest.\n * Sorted by key so the output is byte-deterministic across workers.\n * @param map Atom name → feature value.\n * @returns Object-literal source.\n */\nfunction serializeFeatureMap(map: ReadonlyMap<string, unknown>): string {\n const entries = [...map.entries()].toSorted((a, b) => a[0].localeCompare(b[0]))\n const body = entries.map(([key, value]) => `${JSON.stringify(key)}: ${JSON.stringify(value)}`).join(', ')\n return `{ ${body} }`\n}\n\n/**\n * Render the JS-object literal for the responsive-breakpoint table the\n * runtime registers at manifest-load time. Sorted by ascending px\n * threshold so the runtime can build a deterministic \"tier index\" for\n * its style cache.\n * @param breakpoints Breakpoint name → px-threshold map.\n * @returns Object-literal source (`{}` when empty).\n */\nfunction serializeBreakpoints(breakpoints: ReadonlyMap<string, number>): string {\n if (breakpoints.size === 0) return '{}'\n const entries = [...breakpoints].toSorted((a, b) => a[1] - b[1] || a[0].localeCompare(b[0]))\n const inner = entries.map(([name, px]) => `${JSON.stringify(name)}: ${px}`).join(', ')\n return `{ ${inner} }`\n}\n\n/**\n * Render the manifest module. EAGER-imports `common.style.js` AND every\n * variant scheme file so every scheme's atoms register the moment the\n * manifest evaluates — no lazy `require`. Lazy loading raced the cold\n * start: `RnwindProvider` calls `loadScheme(scheme)` on its first render,\n * but on a cold boot the manifest (hence `registerSchemeLoader`) may not\n * have evaluated yet, so that call no-ops and the active variant's atoms\n * never load — scheme-dependent styles fall back to `common` (the light\n * default) until a reload. Eager imports remove the race entirely; the\n * variant files are small diffs, so the upfront cost is negligible.\n * `ensureSchemeLoaded` stays exported as a no-op for API compatibility.\n * @param variants Variant scheme names (no `base`, no `common`).\n * @param breakpoints Responsive breakpoint name → px-threshold map.\n * @param gradients Atom → gradient info for `registerGradients`.\n * @param haptics Atom → haptic request for `registerHaptics`.\n * @param themeTokens\n * @returns JS source text.\n */\nfunction renderManifest(\n variants: readonly string[],\n breakpoints: ReadonlyMap<string, number>,\n gradients: ReadonlyMap<string, unknown>,\n haptics: ReadonlyMap<string, unknown>,\n themeTokens: ThemeTables,\n): string {\n const hasTokens = Object.keys(themeTokens).length > 0\n const imports = ['registerSchemeLoader', 'registerBreakpoints']\n if (gradients.size > 0) imports.push('registerGradients')\n if (haptics.size > 0) imports.push('registerHaptics')\n if (hasTokens) imports.push('registerThemeTokens')\n const lines: string[] = [`import { ${imports.join(', ')} } from 'rnwind'`, `import './common.style'`]\n for (const variant of variants) lines.push(`import ${JSON.stringify(`./${variant}.style`)}`)\n lines.push(``, `registerBreakpoints(${serializeBreakpoints(breakpoints)})`)\n if (gradients.size > 0) lines.push(`registerGradients(${serializeFeatureMap(gradients)})`)\n if (haptics.size > 0) lines.push(`registerHaptics(${serializeFeatureMap(haptics)})`)\n if (hasTokens) lines.push(`registerThemeTokens(${JSON.stringify(themeTokens)})`)\n lines.push(\n ``,\n `function ensureSchemeLoaded(_name) {}`,\n ``,\n `registerSchemeLoader(ensureSchemeLoaded)`,\n ``,\n `export { ensureSchemeLoaded }`,\n ``,\n )\n return lines.join('\\n')\n}\n\n/**\n * Whether a resolved style carries a nested safe-area marker — molecules\n * can't pre-bake these because the inset value is per-render.\n * @param style Raw resolved RN style (pre-envelope).\n * @returns True when any value is a `{__safe: ...}` marker.\n */\nfunction hasSafeMarker(style: RNStyle): boolean {\n for (const key of Object.keys(style)) {\n const value = style[key]\n if (typeof value !== 'object' || !value) continue\n if ('__safe' in value) return true\n }\n return false\n}\n\n/**\n * Whether a resolved style has font-scale-sensitive props. Molecules\n * can't pre-bake these because `fontSize`/`lineHeight` scale per-render\n * with `useWindowDimensions().fontScale`.\n * @param style Resolved RN style.\n * @returns True when `fontSize` or `lineHeight` is present.\n */\nfunction hasFontScaleProperty(style: RNStyle): boolean {\n return 'fontSize' in style || 'lineHeight' in style\n}\n\n/**\n * Whether a token is a feature-only utility (gradient stop/direction,\n * haptic, or text-truncate) that contributes NO RN `style` — the runtime\n * resolver folds these in via `attachFeatures`, so they don't disqualify\n * a molecule, they just merge nothing.\n * @param token Atom name.\n * @param gradients Gradient feature map.\n * @param haptics Haptic feature map.\n * @returns True when the token is a non-style feature.\n */\nfunction isFeatureToken(token: string, gradients: ReadonlyMap<string, unknown>, haptics: ReadonlyMap<string, unknown>): boolean {\n if (gradients.has(token) || haptics.has(token)) return true\n return token === 'truncate' || token === 'text-ellipsis' || token === 'text-clip' || token.startsWith('line-clamp-')\n}\n\n/**\n * Resolve one atom's value under a scheme: the scheme's own non-empty\n * bucket, falling back to canonical. `common` always reads canonical.\n * @param schemed Parser-produced per-scheme bucket.\n * @param scheme Scheme key (`'common'` or a variant name).\n * @returns The atom's RN style for that scheme, or undefined.\n */\nfunction schemeValueOf(schemed: SchemedStyle, scheme: string): RNStyle | undefined {\n if (scheme === COMMON_SCHEME) return canonicalValue(schemed)\n const own = (schemed as Readonly<Record<string, RNStyle>>)[scheme]\n return isNonEmptyStyle(own) ? own : canonicalValue(schemed)\n}\n\n/**\n * Pre-merge a normalized className's atoms into ONE RN style object for a\n * scheme, or null when the className is NOT molecule-eligible. A\n * className is eligible only when every token is context-independent:\n * - no variant prefix (`active:` / `focus:` / `md:` / `dark:` — anything\n * with a `:`), so scheme/state/breakpoint gating never applies,\n * - no `*-hairline`, `*-safe`, or font-scale (`fontSize`/`lineHeight`)\n * atom, whose value is resolved per-render.\n * Feature-only tokens (gradient / haptic / truncate) are skipped, not\n * disqualifying — the runtime folds them in via `attachFeatures`. Unknown\n * tokens disqualify so the atom path still surfaces the dev warning.\n * @param tokens Normalized className tokens (order preserved).\n * @param scheme Scheme key to resolve each atom under.\n * @param resolved Per-atom schemed styles.\n * @param keyframes Keyframes to inline into `animationName`.\n * @param gradients Gradient feature map.\n * @param haptics Haptic feature map.\n * @returns Merged style object, or null when not eligible.\n */\nfunction mergeMolecule(\n tokens: readonly string[],\n scheme: string,\n resolved: ReadonlyMap<string, SchemedStyle>,\n keyframes: ReadonlyMap<string, KeyframeBlock>,\n gradients: ReadonlyMap<string, unknown>,\n haptics: ReadonlyMap<string, unknown>,\n): RNStyle | null {\n const merged: RNStyle = {}\n for (const token of tokens) {\n if (token.includes(':')) return null\n if (isFeatureToken(token, gradients, haptics)) continue\n if (isHairlineAtom(token)) return null\n const schemed = resolved.get(token)\n if (!schemed) return null\n const raw = schemeValueOf(schemed, scheme)\n if (!raw) continue\n if (hasSafeMarker(raw) || hasFontScaleProperty(raw)) return null\n Object.assign(merged, inlineAnimationName(raw, keyframes))\n }\n return merged\n}\n\n/**\n * Emit each variant's molecule for one className — but only when the\n * variant's merge DIFFERS from common (runtime falls back to common).\n * @param normalized Normalized className key.\n * @param tokens Normalized className tokens.\n * @param commonText Serialized common-scheme merge for the diff check.\n * @param variants Variant scheme names.\n * @param variantMaps Mutable per-variant molecule collectors.\n * @param resolved Per-atom schemed styles.\n * @param keyframes Keyframes to inline.\n * @param gradients Gradient feature map.\n * @param haptics Haptic feature map.\n */\nfunction addVariantMolecules(\n normalized: string,\n tokens: readonly string[],\n commonText: string,\n variants: readonly string[],\n variantMaps: Record<string, Record<string, RNStyle>>,\n resolved: ReadonlyMap<string, SchemedStyle>,\n keyframes: ReadonlyMap<string, KeyframeBlock>,\n gradients: ReadonlyMap<string, unknown>,\n haptics: ReadonlyMap<string, unknown>,\n): void {\n for (const variant of variants) {\n const variantMerged = mergeMolecule(tokens, variant, resolved, keyframes, gradients, haptics)\n if (variantMerged === null) continue\n if (JSON.stringify(variantMerged) !== commonText) variantMaps[variant][normalized] = variantMerged\n }\n}\n\n/**\n * Build per-scheme molecules for every literal className the project\n * uses. Each eligible className gets a pre-merged style object under\n * `common`; a variant only carries an entry when its merge DIFFERS from\n * common (runtime falls back `molecules[scheme] ?? molecules.common`).\n * @param literals Distinct literal className strings (raw).\n * @param resolved Per-atom schemed styles.\n * @param keyframes Keyframes to inline.\n * @param variants Variant scheme names.\n * @param gradients Gradient feature map.\n * @param haptics Haptic feature map.\n * @returns scheme → (normalized className → merged style).\n */\nfunction buildMolecules(\n literals: readonly string[],\n resolved: ReadonlyMap<string, SchemedStyle>,\n keyframes: ReadonlyMap<string, KeyframeBlock>,\n variants: readonly string[],\n gradients: ReadonlyMap<string, unknown>,\n haptics: ReadonlyMap<string, unknown>,\n): Record<string, Record<string, RNStyle>> {\n const common: Record<string, RNStyle> = {}\n const variantMaps: Record<string, Record<string, RNStyle>> = {}\n for (const variant of variants) variantMaps[variant] = {}\n\n for (const literal of literals) {\n const normalized = normalizeClassName(literal)\n if (normalized.length === 0) continue\n const tokens = normalized.split(' ')\n const commonMerged = mergeMolecule(tokens, COMMON_SCHEME, resolved, keyframes, gradients, haptics)\n if (commonMerged === null) continue\n common[normalized] = commonMerged\n addVariantMolecules(normalized, tokens, JSON.stringify(commonMerged), variants, variantMaps, resolved, keyframes, gradients, haptics)\n }\n\n const out: Record<string, Record<string, RNStyle>> = { [COMMON_SCHEME]: common }\n for (const variant of variants) {\n if (Object.keys(variantMaps[variant]).length > 0) out[variant] = variantMaps[variant]\n }\n return out\n}\n\n/** Output of one build pass — one source per scheme plus the manifest. */\nexport interface BuildSchemeSourcesOutput {\n /** `<schemeName>.style.js` source per scheme. Always contains `common`. */\n readonly schemeSources: Readonly<Record<string, string>>\n /** Manifest module source (`schemes.js`). */\n readonly manifestSource: string\n /** Variant scheme names this build covers (sorted; excludes `common`). */\n readonly variants: readonly string[]\n /** Number of `prepareAtomValue` / JSON.stringify passes (cache MISSES) this call did — test telemetry. */\n readonly serializedMisses: number\n}\n\n/**\n * Per-atom cached serialized value. Canonical (common) string plus a\n * map of variant → own-serialized-string. `styleRef` is an identity\n * guard against the resolved SchemedStyle — when callers replace an\n * atom's value the ref diverges and the cache rebuilds that entry.\n */\nexport interface AtomSerializedEntry {\n styleRef: SchemedStyle\n canonical: string\n variants: Map<string, string>\n}\n\n/** Cache UnionBuilder owns across repeated writeSchemes calls. */\nexport type AtomSerializedCache = Map<string, AtomSerializedEntry>\n\n/**\n * Pre-serialize every non-empty variant value, reusing the per-atom\n * cache where present. Result drives both the scheme-uniform check\n * AND the per-variant emission loop downstream.\n * @param atom Atom name.\n * @param schemed Parser-produced schemed bucket.\n * @param variants Variant scheme names in deterministic order.\n * @param keyframes Keyframes available to inline.\n * @param cached Cached entry for this atom (when ref-stable).\n * @returns variantName → serialized text.\n */\nfunction buildVariantTexts(\n atom: string,\n schemed: SchemedStyle,\n variants: readonly string[],\n keyframes: ReadonlyMap<string, KeyframeBlock>,\n cached: AtomSerializedEntry | undefined,\n): Map<string, string> {\n const out = new Map<string, string>()\n for (const variant of variants) {\n const own = (schemed as Readonly<Record<string, RNStyle>>)[variant]\n if (!isNonEmptyStyle(own)) continue\n const text = cached?.variants.get(variant) ?? prepareAtomValue(atom, own, keyframes)\n out.set(variant, text)\n }\n return out\n}\n\n/**\n * Decide whether a (no-base) atom should be promoted to common because\n * every declared variant resolves to the same value. This is the\n * scheme-uniform case: `flex`, `p-4`, `absolute` all carry no theme\n * variables, so Phase-1 fills every variant bucket identically and\n * leaves `base` empty — without this collapse they'd be duplicated\n * across every scheme file.\n *\n * The variant-prefix check is what keeps a real scheme-gated atom\n * (`dark:bg-indigo-800`) out of common in a single-variant project\n * (where its 1 bucket would otherwise look \"uniform\" by definition).\n * @param atom Atom name (checked for `<variant>:` prefix).\n * @param variants Declared variant scheme names.\n * @param variantTexts Serialized variant values.\n * @param canonicalText Serialized canonical (common) value.\n * @returns Whether the atom is uniform across every declared variant.\n */\nfunction isSchemeUniform(\n atom: string,\n variants: readonly string[],\n variantTexts: ReadonlyMap<string, string>,\n canonicalText: string,\n): boolean {\n if (variants.length === 0 || variantTexts.size !== variants.length) return false\n if (variants.some((variant) => atom.startsWith(`${variant}:`))) return false\n for (const text of variantTexts.values()) {\n if (text !== canonicalText) return false\n }\n return true\n}\n\n/**\n * Serialize one atom's canonical + variant-diff entries, honouring the\n * per-atom cache. Returns the number of cache MISSES this atom incurred\n * (0 when canonical was cached AND every needed variant was cached;\n * 1 when anything had to be re-stringified).\n *\n * Three paths gated on whether the parser produced a non-empty `base`\n * bucket and whether the variants converge:\n * - **Themed atom (base present)**: canonical goes to `common`, each\n * variant whose own value diverges from canonical writes the diff\n * into its own scheme file. `lookupAtom` finds the variant's\n * override or falls through to common.\n * - **Scheme-uniform atom (base empty, every variant identical)**:\n * promoted to `common` once — the parser's Phase-1 fills every\n * variant bucket with the same value for utilities like `flex` /\n * `p-4` / `absolute` that don't reference theme variables.\n * - **Scheme-gated atom (base empty, prefixed name like `dark:foo`,\n * or variants diverge)**: each populated variant writes the value\n * into its own scheme file directly; common stays empty so the\n * runtime fallback can't leak the variant style into other schemes.\n * @param atom Atom name.\n * @param schemed Parser-produced schemed bucket for the atom.\n * @param canonical Canonical RN style for `common`.\n * @param variants Variant scheme names in deterministic order.\n * @param keyframes Keyframes available to inline.\n * @param commonEntries Mutable collector for `common`'s `[atom, text]` pairs.\n * @param variantEntries Mutable collector keyed by variant name.\n * @param cache Optional shared serialized-value cache.\n * @returns Number of JSON.stringify passes triggered for this atom.\n */\nfunction collectAtomEntries(\n atom: string,\n schemed: SchemedStyle,\n canonical: RNStyle,\n variants: readonly string[],\n keyframes: ReadonlyMap<string, KeyframeBlock>,\n commonEntries: (readonly [string, string])[],\n variantEntries: Record<string, (readonly [string, string])[]>,\n cache?: AtomSerializedCache,\n): number {\n const cached = cache?.get(atom)\n const hit = cached?.styleRef === schemed\n const baseEntry = (schemed as Readonly<Record<string, RNStyle>>)[BASE_SCHEME]\n const hasBase = isNonEmptyStyle(baseEntry)\n const canonicalText = hit ? cached.canonical : prepareAtomValue(atom, canonical, keyframes)\n const variantTexts = buildVariantTexts(atom, schemed, variants, keyframes, hit ? cached : undefined)\n const goesToCommon = hasBase || isSchemeUniform(atom, variants, variantTexts, canonicalText)\n\n if (goesToCommon) commonEntries.push([atom, canonicalText])\n\n const entry: AtomSerializedEntry = hit\n ? cached\n : { styleRef: schemed, canonical: canonicalText, variants: new Map(variantTexts) }\n if (!hit) cache?.set(atom, entry)\n\n for (const variant of variants) {\n const ownText = variantTexts.get(variant)\n if (ownText === undefined) continue\n if (goesToCommon && ownText === canonicalText) continue\n variantEntries[variant].push([atom, ownText])\n }\n return hit ? 0 : 1\n}\n\n/** Empty fallback when the caller didn't supply breakpoints (legacy callers, tests). */\nconst EMPTY_BREAKPOINTS: ReadonlyMap<string, number> = new Map()\n\n/**\n * Build the per-scheme style files + manifest source.\n *\n * Dedup rule (the thing that shrinks scheme files to their diff):\n * - Every atom's canonical value goes into `common.style.js`.\n * - Each variant's file emits an entry for an atom ONLY when the\n * variant's own resolved value differs from canonical. When the\n * variant inherits (parser emits an empty `{}` for that scheme) or\n * the variant's resolved value serializes identically to canonical,\n * the atom is omitted — at runtime the lookup falls through via\n * `cache.atoms[scheme]?.[atom] ?? cache.atoms.common[atom]`.\n *\n * Keyframes are inlined directly into atom values via `animationName`\n * ({@link inlineAnimationName}). Safe-area markers get pre-enveloped\n * via {@link envelopeSafeMarkers}. Hairline utilities stay bound to\n * `StyleSheet.hairlineWidth` at runtime.\n * @param atomNames All atom names (sorted).\n * @param resolved Per-atom schemed styles from the parser.\n * @param keyframes Keyframe blocks referenced by any atom.\n * @param cache Optional shared serialized-value cache.\n * @param breakpoints Responsive breakpoint name → px-threshold map. The\n * manifest emits `registerBreakpoints({...})` so the runtime can gate\n * `md:*` / `lg:*` atoms on `windowWidth`. Optional — empty when the\n * theme declares no breakpoints (legacy/test callers).\n * @param gradients Gradient feature map (atom → role/colour) for the manifest + molecule eligibility.\n * @param haptics Haptic feature map (atom → request) for the manifest + molecule eligibility.\n * @param literals Distinct literal className strings — pre-merged into\n * per-scheme molecules so the runtime resolver's O(1) molecule-first\n * path is populated. Empty for legacy/test callers (atom path only).\n * @param themeTokens\n * @returns Per-scheme sources, manifest source, variant list.\n */\nexport function buildSchemeSources(\n atomNames: readonly string[],\n resolved: ReadonlyMap<string, SchemedStyle>,\n keyframes: ReadonlyMap<string, KeyframeBlock>,\n cache?: AtomSerializedCache,\n breakpoints: ReadonlyMap<string, number> = EMPTY_BREAKPOINTS,\n gradients: ReadonlyMap<string, unknown> = EMPTY_FEATURE_MAP,\n haptics: ReadonlyMap<string, unknown> = EMPTY_FEATURE_MAP,\n literals: readonly string[] = EMPTY_LITERALS,\n themeTokens: ThemeTables = EMPTY_THEME_TOKENS,\n): BuildSchemeSourcesOutput {\n const variants = collectVariantSchemes(resolved)\n const commonEntries: (readonly [string, string])[] = []\n const variantEntries: Record<string, (readonly [string, string])[]> = {}\n for (const variant of variants) variantEntries[variant] = []\n let misses = 0\n\n for (const atom of atomNames) {\n const schemed = resolved.get(atom)\n if (!schemed) continue\n const canonical = canonicalValue(schemed)\n if (!canonical) continue\n misses += collectAtomEntries(atom, schemed, canonical, variants, keyframes, commonEntries, variantEntries, cache)\n }\n\n const molecules = buildMolecules(literals, resolved, keyframes, variants, gradients, haptics)\n const schemeSources: Record<string, string> = {\n [COMMON_SCHEME]: renderSchemeFile(COMMON_SCHEME, commonEntries, molecules[COMMON_SCHEME]),\n }\n for (const variant of variants) {\n schemeSources[variant] = renderSchemeFile(variant, variantEntries[variant], molecules[variant])\n }\n\n return {\n schemeSources,\n manifestSource: renderManifest(variants, breakpoints, gradients, haptics, themeTokens),\n variants,\n serializedMisses: misses,\n }\n}\n\n/** Shared empty feature map default. */\nconst EMPTY_FEATURE_MAP: ReadonlyMap<string, unknown> = new Map()\n\n/** Shared empty literal-list default (atom-only callers). */\nconst EMPTY_LITERALS: readonly string[] = []\n\n/** Shared empty theme-token default (callers without theme tokens). */\nconst EMPTY_THEME_TOKENS: ThemeTables = {}\n\n/** Registry key the runtime uses for the always-loaded fallback. */\nexport const COMMON_SCHEME_NAME: string = COMMON_SCHEME\n"],"names":["normalizeClassName"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { KeyframeBlock, SchemedStyle } from '../parser';
2
+ import type { ThemeTables } from '../types';
2
3
  /** Output of one build pass — one source per scheme plus the manifest. */
3
4
  export interface BuildSchemeSourcesOutput {
4
5
  /** `<schemeName>.style.js` source per scheme. Always contains `common`. */
@@ -52,8 +53,9 @@ export type AtomSerializedCache = Map<string, AtomSerializedEntry>;
52
53
  * @param literals Distinct literal className strings — pre-merged into
53
54
  * per-scheme molecules so the runtime resolver's O(1) molecule-first
54
55
  * path is populated. Empty for legacy/test callers (atom path only).
56
+ * @param themeTokens
55
57
  * @returns Per-scheme sources, manifest source, variant list.
56
58
  */
57
- export declare function buildSchemeSources(atomNames: readonly string[], resolved: ReadonlyMap<string, SchemedStyle>, keyframes: ReadonlyMap<string, KeyframeBlock>, cache?: AtomSerializedCache, breakpoints?: ReadonlyMap<string, number>, gradients?: ReadonlyMap<string, unknown>, haptics?: ReadonlyMap<string, unknown>, literals?: readonly string[]): BuildSchemeSourcesOutput;
59
+ export declare function buildSchemeSources(atomNames: readonly string[], resolved: ReadonlyMap<string, SchemedStyle>, keyframes: ReadonlyMap<string, KeyframeBlock>, cache?: AtomSerializedCache, breakpoints?: ReadonlyMap<string, number>, gradients?: ReadonlyMap<string, unknown>, haptics?: ReadonlyMap<string, unknown>, literals?: readonly string[], themeTokens?: ThemeTables): BuildSchemeSourcesOutput;
58
60
  /** Registry key the runtime uses for the always-loaded fallback. */
59
61
  export declare const COMMON_SCHEME_NAME: string;
@@ -112,6 +112,13 @@ class UnionBuilder {
112
112
  * snapshot is sufficient.
113
113
  */
114
114
  breakpoints = new Map();
115
+ /**
116
+ * Per-scheme theme token tables captured from the parser. Refreshed on
117
+ * every `recordFile` / `ensureProjectScanned` so theme-token edits land in
118
+ * the manifest's `registerThemeTokens({...})` — the data source for
119
+ * `useColor` / `useToken` / `useSize`.
120
+ */
121
+ themeTokens = {};
115
122
  /** file → set of atom names this file currently contributes. */
116
123
  fileAtomSets = new Map();
117
124
  /** atom name → how many files currently contribute it (refcount). */
@@ -142,16 +149,6 @@ class UnionBuilder {
142
149
  get manifestPath() {
143
150
  return path.join(this.cacheDir, MANIFEST_BASENAME);
144
151
  }
145
- /**
146
- * Snapshot of every source file the builder has recorded atoms for
147
- * this worker session. Used by `withRnwindConfig`'s CSS watcher to
148
- * touch `mtime` on each and nudge Metro into re-transforming them
149
- * with the new theme values.
150
- * @returns Absolute source paths.
151
- */
152
- recordedFiles() {
153
- return [...this.fileAtomSets.keys()];
154
- }
155
152
  /** Cumulative cache-miss count — exposed for tests to assert cache behaviour. */
156
153
  get serializedMisses() {
157
154
  return this.serializedMissesCount;
@@ -185,6 +182,7 @@ class UnionBuilder {
185
182
  for (const [name, haptic] of parsed.hapticAtoms)
186
183
  this.unionHaptics.set(name, haptic);
187
184
  this.breakpoints = parsed.breakpoints;
185
+ this.themeTokens = parsed.themeTokens;
188
186
  this.projectScanned = true;
189
187
  })();
190
188
  try {
@@ -278,7 +276,7 @@ class UnionBuilder {
278
276
  async writeSchemes() {
279
277
  await this.ensureProjectScanned();
280
278
  const sortedAtomNames = [...this.unionAtoms.keys()].toSorted((a, b) => a.localeCompare(b));
281
- const result = buildStyle.buildSchemeSources(sortedAtomNames, this.unionAtoms, this.unionKeyframes, this.serializedCache, this.breakpoints, this.unionGradients, this.unionHaptics, [...this.unionLiterals]);
279
+ const result = buildStyle.buildSchemeSources(sortedAtomNames, this.unionAtoms, this.unionKeyframes, this.serializedCache, this.breakpoints, this.unionGradients, this.unionHaptics, [...this.unionLiterals], this.themeTokens);
282
280
  this.serializedMissesCount += result.serializedMisses;
283
281
  const { schemeSources, manifestSource } = result;
284
282
  const changed = [];