@oxyhq/bloom 0.7.6 → 0.8.0

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 (111) hide show
  1. package/lib/commonjs/normalize-colors.d.js +2 -0
  2. package/lib/commonjs/normalize-colors.d.js.map +1 -0
  3. package/lib/commonjs/theme/apply-dark-class.js +15 -13
  4. package/lib/commonjs/theme/apply-dark-class.js.map +1 -1
  5. package/lib/commonjs/theme/build-theme.js +39 -61
  6. package/lib/commonjs/theme/build-theme.js.map +1 -1
  7. package/lib/commonjs/theme/color-presets.js +11 -5
  8. package/lib/commonjs/theme/color-presets.js.map +1 -1
  9. package/lib/commonjs/theme/color-scope/index.web.js +13 -3
  10. package/lib/commonjs/theme/color-scope/index.web.js.map +1 -1
  11. package/lib/commonjs/theme/color-scope/style-builder.js +7 -6
  12. package/lib/commonjs/theme/color-scope/style-builder.js.map +1 -1
  13. package/lib/commonjs/theme/color-space.js +76 -0
  14. package/lib/commonjs/theme/color-space.js.map +1 -0
  15. package/lib/commonjs/theme/index.js.map +1 -1
  16. package/lib/commonjs/theme/native-root-vars.native.js +28 -18
  17. package/lib/commonjs/theme/native-root-vars.native.js.map +1 -1
  18. package/lib/commonjs/theme/preset-vars.js +20 -99
  19. package/lib/commonjs/theme/preset-vars.js.map +1 -1
  20. package/lib/commonjs/theme/token-registry.js +123 -0
  21. package/lib/commonjs/theme/token-registry.js.map +1 -0
  22. package/lib/module/normalize-colors.d.js +2 -0
  23. package/lib/module/normalize-colors.d.js.map +1 -0
  24. package/lib/module/theme/apply-dark-class.js +15 -13
  25. package/lib/module/theme/apply-dark-class.js.map +1 -1
  26. package/lib/module/theme/build-theme.js +39 -61
  27. package/lib/module/theme/build-theme.js.map +1 -1
  28. package/lib/module/theme/color-presets.js +11 -5
  29. package/lib/module/theme/color-presets.js.map +1 -1
  30. package/lib/module/theme/color-scope/index.web.js +16 -4
  31. package/lib/module/theme/color-scope/index.web.js.map +1 -1
  32. package/lib/module/theme/color-scope/style-builder.js +7 -6
  33. package/lib/module/theme/color-scope/style-builder.js.map +1 -1
  34. package/lib/module/theme/color-space.js +69 -0
  35. package/lib/module/theme/color-space.js.map +1 -0
  36. package/lib/module/theme/index.js.map +1 -1
  37. package/lib/module/theme/native-root-vars.native.js +29 -18
  38. package/lib/module/theme/native-root-vars.native.js.map +1 -1
  39. package/lib/module/theme/preset-vars.js +19 -98
  40. package/lib/module/theme/preset-vars.js.map +1 -1
  41. package/lib/module/theme/token-registry.js +113 -0
  42. package/lib/module/theme/token-registry.js.map +1 -0
  43. package/lib/typescript/commonjs/theme/apply-dark-class.d.ts +13 -9
  44. package/lib/typescript/commonjs/theme/apply-dark-class.d.ts.map +1 -1
  45. package/lib/typescript/commonjs/theme/build-theme.d.ts +1 -1
  46. package/lib/typescript/commonjs/theme/build-theme.d.ts.map +1 -1
  47. package/lib/typescript/commonjs/theme/color-presets.d.ts +11 -5
  48. package/lib/typescript/commonjs/theme/color-presets.d.ts.map +1 -1
  49. package/lib/typescript/commonjs/theme/color-scope/index.web.d.ts.map +1 -1
  50. package/lib/typescript/commonjs/theme/color-scope/style-builder.d.ts +5 -2
  51. package/lib/typescript/commonjs/theme/color-scope/style-builder.d.ts.map +1 -1
  52. package/lib/typescript/commonjs/theme/color-space.d.ts +28 -0
  53. package/lib/typescript/commonjs/theme/color-space.d.ts.map +1 -0
  54. package/lib/typescript/commonjs/theme/index.d.ts +1 -2
  55. package/lib/typescript/commonjs/theme/index.d.ts.map +1 -1
  56. package/lib/typescript/commonjs/theme/native-root-vars.native.d.ts +25 -15
  57. package/lib/typescript/commonjs/theme/native-root-vars.native.d.ts.map +1 -1
  58. package/lib/typescript/commonjs/theme/preset-vars.d.ts +12 -45
  59. package/lib/typescript/commonjs/theme/preset-vars.d.ts.map +1 -1
  60. package/lib/typescript/commonjs/theme/token-registry.d.ts +53 -0
  61. package/lib/typescript/commonjs/theme/token-registry.d.ts.map +1 -0
  62. package/lib/typescript/commonjs/theme/types.d.ts +3 -0
  63. package/lib/typescript/commonjs/theme/types.d.ts.map +1 -1
  64. package/lib/typescript/module/theme/apply-dark-class.d.ts +13 -9
  65. package/lib/typescript/module/theme/apply-dark-class.d.ts.map +1 -1
  66. package/lib/typescript/module/theme/build-theme.d.ts +1 -1
  67. package/lib/typescript/module/theme/build-theme.d.ts.map +1 -1
  68. package/lib/typescript/module/theme/color-presets.d.ts +11 -5
  69. package/lib/typescript/module/theme/color-presets.d.ts.map +1 -1
  70. package/lib/typescript/module/theme/color-scope/index.web.d.ts.map +1 -1
  71. package/lib/typescript/module/theme/color-scope/style-builder.d.ts +5 -2
  72. package/lib/typescript/module/theme/color-scope/style-builder.d.ts.map +1 -1
  73. package/lib/typescript/module/theme/color-space.d.ts +28 -0
  74. package/lib/typescript/module/theme/color-space.d.ts.map +1 -0
  75. package/lib/typescript/module/theme/index.d.ts +1 -2
  76. package/lib/typescript/module/theme/index.d.ts.map +1 -1
  77. package/lib/typescript/module/theme/native-root-vars.native.d.ts +25 -15
  78. package/lib/typescript/module/theme/native-root-vars.native.d.ts.map +1 -1
  79. package/lib/typescript/module/theme/preset-vars.d.ts +12 -45
  80. package/lib/typescript/module/theme/preset-vars.d.ts.map +1 -1
  81. package/lib/typescript/module/theme/token-registry.d.ts +53 -0
  82. package/lib/typescript/module/theme/token-registry.d.ts.map +1 -0
  83. package/lib/typescript/module/theme/types.d.ts +3 -0
  84. package/lib/typescript/module/theme/types.d.ts.map +1 -1
  85. package/package.json +1 -1
  86. package/src/__tests__/BloomColorScope.test.tsx +14 -0
  87. package/src/__tests__/BloomThemeProvider.test.tsx +4 -3
  88. package/src/__tests__/apply-dark-class.test.ts +70 -0
  89. package/src/__tests__/native-root-vars.test.ts +8 -7
  90. package/src/__tests__/preset-vars.test.ts +42 -42
  91. package/src/__tests__/theme.test.ts +6 -6
  92. package/src/normalize-colors.d.ts +22 -0
  93. package/src/react-native-css.d.ts +3 -3
  94. package/src/theme/__tests__/__fixtures__/golden-resolved-tokens.json +574 -0
  95. package/src/theme/__tests__/__snapshots__/visual-gallery.test.tsx.snap +838 -0
  96. package/src/theme/__tests__/color-space.test.ts +28 -0
  97. package/src/theme/__tests__/golden-tokens.test.ts +33 -0
  98. package/src/theme/__tests__/runtime-contract.test.ts +49 -0
  99. package/src/theme/__tests__/token-registry.test.ts +30 -0
  100. package/src/theme/__tests__/visual-gallery.test.tsx +10 -0
  101. package/src/theme/apply-dark-class.ts +15 -11
  102. package/src/theme/build-theme.ts +39 -67
  103. package/src/theme/color-presets.ts +11 -5
  104. package/src/theme/color-scope/index.web.tsx +17 -3
  105. package/src/theme/color-scope/style-builder.ts +7 -4
  106. package/src/theme/color-space.ts +56 -0
  107. package/src/theme/index.ts +1 -5
  108. package/src/theme/native-root-vars.native.ts +28 -18
  109. package/src/theme/preset-vars.ts +17 -126
  110. package/src/theme/token-registry.ts +159 -0
  111. package/src/theme/types.ts +3 -0
@@ -5,9 +5,14 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.applyPresetVarsToDocument = applyPresetVarsToDocument;
7
7
  exports.getPresetVars = getPresetVars;
8
- exports.hslTripletToRgb = hslTripletToRgb;
9
8
  var _reactNative = require("react-native");
10
9
  var _colorPresets = require("./color-presets.js");
10
+ var _tokenRegistry = require("./token-registry.js");
11
+ // Circular at the module graph level (`token-registry` imports `getPresetVars`
12
+ // from here), but safe: `getResolvedTokens` is only referenced inside the
13
+ // `applyPresetVarsToDocument` function body — i.e. at call time, after both
14
+ // modules have finished evaluating — never during module initialization.
15
+
11
16
  function extractHue(hslVar) {
12
17
  return parseInt(hslVar.split(' ')[0] ?? '0', 10);
13
18
  }
@@ -15,92 +20,6 @@ function extractSat(hslVar) {
15
20
  return parseInt(hslVar.split(' ')[1] ?? '0', 10);
16
21
  }
17
22
 
18
- /**
19
- * Convert a shadcn-style HSL triple (`'H S% L%'`, optionally with an alpha tail
20
- * `'H S% L% / A'`) into an sRGB `rgb(...)` string.
21
- *
22
- * Why rgb and not hsl (the native alpha-utility bug this fixes)
23
- * -------------------------------------------------------------
24
- * Tailwind v4 compiles an alpha-on-theme-color utility (`bg-primary/10`) into a
25
- * `color-mix(... var(--color-primary) 10%, transparent)` declaration. On native,
26
- * react-native-css resolves that `color-mix` at runtime via `colorjs.io/fn`, but
27
- * its `color-mix` implementation registers ONLY the `sRGB`, `P3`, and `OKLab`
28
- * color spaces — never `HSL`. So if `--color-primary` resolves to an `hsl(...)`
29
- * string, `parse('hsl(...)')` throws, the mix is swallowed, and the utility
30
- * silently produces no color. Emitting the resolved var as `rgb(...)` (a space
31
- * colorjs.io always has registered) makes the alpha utilities resolve on native,
32
- * matching web. Full (non-alpha) utilities already worked because React Native's
33
- * native color parser handles `hsl()` directly; only `color-mix` was affected.
34
- *
35
- * Output is space-separated channels (`rgb(31 153 239)`), the modern CSS syntax
36
- * parsed by both `colorjs.io/fn` (with only sRGB/P3/OKLab registered) and
37
- * react-native-web / browsers. An alpha tail emits `rgb(r g b / a)`, likewise
38
- * parsed by both.
39
- *
40
- * Pure function — standard HSL→sRGB conversion, channels rounded to integers.
41
- * Tolerates a `deg` suffix on the hue and `%` suffixes on saturation/lightness.
42
- */
43
- function hslTripletToRgb(triplet) {
44
- const [colorPart, alphaPart] = triplet.split('/').map(part => part.trim());
45
- const channels = (colorPart ?? '').split(/\s+/).filter(Boolean);
46
- const hue = parseFloat((channels[0] ?? '0').replace(/deg$/i, ''));
47
- const sat = parseFloat((channels[1] ?? '0').replace('%', '')) / 100;
48
- const light = parseFloat((channels[2] ?? '0').replace('%', '')) / 100;
49
- const h = Number.isFinite(hue) ? hue : 0;
50
- const s = Number.isFinite(sat) ? sat : 0;
51
- const l = Number.isFinite(light) ? light : 0;
52
- const chroma = (1 - Math.abs(2 * l - 1)) * s;
53
- const huePrime = (h % 360 + 360) % 360 / 60;
54
- const second = chroma * (1 - Math.abs(huePrime % 2 - 1));
55
- let r = 0;
56
- let g = 0;
57
- let b = 0;
58
- if (huePrime < 1) {
59
- [r, g, b] = [chroma, second, 0];
60
- } else if (huePrime < 2) {
61
- [r, g, b] = [second, chroma, 0];
62
- } else if (huePrime < 3) {
63
- [r, g, b] = [0, chroma, second];
64
- } else if (huePrime < 4) {
65
- [r, g, b] = [0, second, chroma];
66
- } else if (huePrime < 5) {
67
- [r, g, b] = [second, 0, chroma];
68
- } else {
69
- [r, g, b] = [chroma, 0, second];
70
- }
71
- const match = l - chroma / 2;
72
- const red = Math.round((r + match) * 255);
73
- const green = Math.round((g + match) * 255);
74
- const blue = Math.round((b + match) * 255);
75
- if (alphaPart !== undefined && alphaPart !== '') {
76
- const alpha = alphaPart.endsWith('%') ? parseFloat(alphaPart) / 100 : parseFloat(alphaPart);
77
- const safeAlpha = Number.isFinite(alpha) ? alpha : 1;
78
- return `rgb(${red} ${green} ${blue} / ${safeAlpha})`;
79
- }
80
- return `rgb(${red} ${green} ${blue})`;
81
- }
82
- const RESOLVED_COLOR_MAP = {
83
- '--background': '--color-background',
84
- '--foreground': '--color-foreground',
85
- '--primary': '--color-primary',
86
- '--primary-foreground': '--color-primary-foreground',
87
- '--secondary': '--color-secondary',
88
- '--secondary-foreground': '--color-secondary-foreground',
89
- '--muted': '--color-muted',
90
- '--muted-foreground': '--color-muted-foreground',
91
- '--accent': '--color-accent',
92
- '--accent-foreground': '--color-accent-foreground',
93
- '--destructive': '--color-destructive',
94
- '--border': '--color-border',
95
- '--input': '--color-input',
96
- '--ring': '--color-ring',
97
- '--popover': '--color-popover',
98
- '--popover-foreground': '--color-popover-foreground',
99
- '--surface': '--color-surface',
100
- '--surface-foreground': '--color-surface-foreground',
101
- '--card': '--color-card',
102
- '--card-foreground': '--color-card-foreground'
103
- };
104
23
  /**
105
24
  * Bloom's base preset tokens extended with the surface/card/chart/sidebar
106
25
  * tokens that apps layer on top of the core shadcn palette. Synthesized from
@@ -108,8 +27,13 @@ const RESOLVED_COLOR_MAP = {
108
27
  *
109
28
  * This is the single source of truth for extended theming vars — consumer apps
110
29
  * must not redefine these per-app.
30
+ *
31
+ * Values are platform-agnostic **raw HSL triples** (`'185 100% 20%'`, optionally
32
+ * with a `/ A` alpha tail). The single canonical resolver `getResolvedTokens`
33
+ * (in `token-registry.ts`) converts these to sRGB `rgb(...)` for BOTH web and
34
+ * native runtime writes — this function only produces the raw triple map.
111
35
  */
112
- function getPresetVars(colorName, mode, options = {}) {
36
+ function getPresetVars(colorName, mode) {
113
37
  const preset = _colorPresets.APP_COLOR_PRESETS[colorName];
114
38
  const base = mode === 'light' ? preset.light : preset.dark;
115
39
  const get = key => base[key] ?? '0 0% 0%';
@@ -139,15 +63,7 @@ function getPresetVars(colorName, mode, options = {}) {
139
63
  '--sidebar-border': get('--border'),
140
64
  '--sidebar-ring': get('--ring')
141
65
  };
142
- if (!options.includeResolvedColorVars) return extended;
143
- const resolved = {
144
- ...extended
145
- };
146
- for (const [rawKey, colorKey] of Object.entries(RESOLVED_COLOR_MAP)) {
147
- const value = extended[rawKey];
148
- if (value) resolved[colorKey] = hslTripletToRgb(value);
149
- }
150
- return resolved;
66
+ return extended;
151
67
  }
152
68
 
153
69
  /**
@@ -155,10 +71,15 @@ function getPresetVars(colorName, mode, options = {}) {
155
71
  * on native. `BloomThemeProvider` already writes the base preset vars on web;
156
72
  * call this only when an app needs the extended (card/chart/sidebar) tokens on
157
73
  * the document root.
74
+ *
75
+ * Tokens are resolved to sRGB `rgb(...)` via the single canonical
76
+ * `getResolvedTokens` pipeline, so `var(--x)` — the form Tailwind v4
77
+ * `@theme inline` compiles its color utilities to — resolves directly to a
78
+ * valid color on web.
158
79
  */
159
- function applyPresetVarsToDocument(colorName, mode, options) {
80
+ function applyPresetVarsToDocument(colorName, mode) {
160
81
  if (_reactNative.Platform.OS !== 'web' || typeof document === 'undefined') return;
161
- const vars = getPresetVars(colorName, mode, options);
82
+ const vars = (0, _tokenRegistry.getResolvedTokens)(colorName, mode);
162
83
  const root = document.documentElement.style;
163
84
  for (const [key, value] of Object.entries(vars)) {
164
85
  root.setProperty(key, value);
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_colorPresets","extractHue","hslVar","parseInt","split","extractSat","hslTripletToRgb","triplet","colorPart","alphaPart","map","part","trim","channels","filter","Boolean","hue","parseFloat","replace","sat","light","h","Number","isFinite","s","l","chroma","Math","abs","huePrime","second","r","g","b","match","red","round","green","blue","undefined","alpha","endsWith","safeAlpha","RESOLVED_COLOR_MAP","getPresetVars","colorName","mode","options","preset","APP_COLOR_PRESETS","base","dark","get","key","primary","foreground","min","isDark","extended","includeResolvedColorVars","resolved","rawKey","colorKey","Object","entries","value","applyPresetVarsToDocument","Platform","OS","document","vars","root","documentElement","style","setProperty"],"sourceRoot":"../../../src","sources":["theme/preset-vars.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_colorPresets","_tokenRegistry","extractHue","hslVar","parseInt","split","extractSat","getPresetVars","colorName","mode","preset","APP_COLOR_PRESETS","base","light","dark","get","key","primary","foreground","hue","sat","Math","min","isDark","extended","applyPresetVarsToDocument","Platform","OS","document","vars","getResolvedTokens","root","documentElement","style","value","Object","entries","setProperty"],"sourceRoot":"../../../src","sources":["theme/preset-vars.ts"],"mappings":";;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AAKA,IAAAE,cAAA,GAAAF,OAAA;AAJA;AACA;AACA;AACA;;AAGA,SAASG,UAAUA,CAACC,MAAc,EAAU;EAC1C,OAAOC,QAAQ,CAACD,MAAM,CAACE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;AAClD;AAEA,SAASC,UAAUA,CAACH,MAAc,EAAU;EAC1C,OAAOC,QAAQ,CAACD,MAAM,CAACE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;AAClD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASE,aAAaA,CAC3BC,SAAuB,EACvBC,IAAsB,EACR;EACd,MAAMC,MAAM,GAAGC,+BAAiB,CAACH,SAAS,CAAC;EAC3C,MAAMI,IAAI,GAAGH,IAAI,KAAK,OAAO,GAAGC,MAAM,CAACG,KAAK,GAAGH,MAAM,CAACI,IAAI;EAC1D,MAAMC,GAAG,GAAIC,GAAW,IAAaJ,IAAI,CAACI,GAAG,CAAC,IAAI,SAAS;EAC3D,MAAMC,OAAO,GAAGF,GAAG,CAAC,WAAW,CAAC;EAChC,MAAMG,UAAU,GAAGH,GAAG,CAAC,cAAc,CAAC;EACtC,MAAMI,GAAG,GAAGjB,UAAU,CAACe,OAAO,CAAC;EAC/B,MAAMG,GAAG,GAAGC,IAAI,CAACC,GAAG,CAAChB,UAAU,CAACW,OAAO,CAAC,EAAE,EAAE,CAAC;EAC7C,MAAMM,MAAM,GAAGd,IAAI,KAAK,MAAM;EAE9B,MAAMe,QAAsB,GAAG;IAC7B,GAAGZ,IAAI;IACP;IACA;IACA;IACA,QAAQ,EAAEW,MAAM,GAAG,GAAGJ,GAAG,UAAU,GAAG,GAAGA,GAAG,UAAU;IACtD,mBAAmB,EAAED,UAAU;IAC/B,WAAW,EAAE,GAAGC,GAAG,IAAIC,GAAG,OAAO;IACjC,WAAW,EAAE,GAAGD,GAAG,IAAIC,GAAG,OAAO;IACjC,WAAW,EAAE,GAAGD,GAAG,IAAIC,GAAG,OAAO;IACjC,WAAW,EAAE,GAAGD,GAAG,IAAIC,GAAG,KAAKG,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG;IAClD,WAAW,EAAE,GAAGJ,GAAG,IAAIC,GAAG,KAAKG,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG;IAClD,gBAAgB,EAAEA,MAAM,GAAG,GAAGJ,GAAG,SAAS,GAAGJ,GAAG,CAAC,WAAW,CAAC;IAC7D,sBAAsB,EAAEG,UAAU;IAClC,mBAAmB,EAAED,OAAO;IAC5B,8BAA8B,EAAEF,GAAG,CAAC,sBAAsB,CAAC;IAC3D,kBAAkB,EAAEQ,MAAM,GAAGR,GAAG,CAAC,WAAW,CAAC,GAAGA,GAAG,CAAC,UAAU,CAAC;IAC/D,6BAA6B,EAAEQ,MAAM,GAAGL,UAAU,GAAGH,GAAG,CAAC,qBAAqB,CAAC;IAC/E,kBAAkB,EAAEA,GAAG,CAAC,UAAU,CAAC;IACnC,gBAAgB,EAAEA,GAAG,CAAC,QAAQ;EAChC,CAAC;EAED,OAAOS,QAAQ;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,yBAAyBA,CACvCjB,SAAuB,EACvBC,IAAsB,EAChB;EACN,IAAIiB,qBAAQ,CAACC,EAAE,KAAK,KAAK,IAAI,OAAOC,QAAQ,KAAK,WAAW,EAAE;EAE9D,MAAMC,IAAI,GAAG,IAAAC,gCAAiB,EAACtB,SAAS,EAAEC,IAAI,CAAC;EAC/C,MAAMsB,IAAI,GAAGH,QAAQ,CAACI,eAAe,CAACC,KAAK;EAC3C,KAAK,MAAM,CAACjB,GAAG,EAAEkB,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACP,IAAI,CAAC,EAAE;IAC/CE,IAAI,CAACM,WAAW,CAACrB,GAAG,EAAEkB,KAAK,CAAC;EAC9B;AACF","ignoreList":[]}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "APP_COLOR_NAMES", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _colorPresets.APP_COLOR_NAMES;
10
+ }
11
+ });
12
+ exports.CANONICAL_TOKENS = void 0;
13
+ exports.getResolvedTokens = getResolvedTokens;
14
+ exports.hslToSrgb = hslToSrgb;
15
+ var _colorPresets = require("./color-presets.js");
16
+ var _presetVars = require("./preset-vars.js");
17
+ /**
18
+ * The canonical set of Bloom theme token names — WITHOUT the leading `--`.
19
+ *
20
+ * This is the single source of truth for which tokens a preset produces. It
21
+ * covers exactly the keys returned by `getPresetVars(name, mode)` (the base
22
+ * shadcn palette plus the synthesized extended tokens: card/chart/content-area/
23
+ * sidebar-*). The list is intentionally hand-maintained and verified by
24
+ * `token-registry.test.ts` against the live `getPresetVars('oxy', 'light')`
25
+ * output, so any drift in the preset shape fails CI.
26
+ *
27
+ * Order mirrors `getPresetVars`'s insertion order: base tokens first (in the
28
+ * order they appear in the preset data), then the synthesized extended tokens.
29
+ */
30
+ const CANONICAL_TOKENS = exports.CANONICAL_TOKENS = ['background', 'foreground', 'surface', 'surface-foreground', 'popover', 'popover-foreground', 'primary', 'primary-foreground', 'secondary', 'secondary-foreground', 'muted', 'muted-foreground', 'accent', 'accent-foreground', 'destructive', 'border', 'input', 'ring', 'sidebar', 'card', 'card-foreground', 'chart-1', 'chart-2', 'chart-3', 'chart-4', 'chart-5', 'content-area', 'sidebar-foreground', 'sidebar-primary', 'sidebar-primary-foreground', 'sidebar-accent', 'sidebar-accent-foreground', 'sidebar-border', 'sidebar-ring'];
31
+
32
+ /** A canonical token name (no leading `--`). */
33
+
34
+ /**
35
+ * Matches a shadcn-style raw HSL triple — `H S% L%`, optionally with an alpha
36
+ * tail `H S% L% / A`. The value starts with a digit (or a leading `-`) and
37
+ * carries at least one `%` (the saturation/lightness units), which distinguishes
38
+ * a bare triple from an already-resolved color (`rgb(...)`, `#fff`) or a
39
+ * unitless/length token (`--radius: 0.5rem`).
40
+ */
41
+ const RAW_HSL_TRIPLE = /^-?\d[\d.]*\s+[\d.]+%/;
42
+
43
+ /**
44
+ * Convert a shadcn-style HSL triple (`'H S% L%'`, optionally with an alpha tail
45
+ * `'H S% L% / A'`) into an sRGB `rgb(...)` string.
46
+ *
47
+ * Standard HSL→sRGB math with integer-rounded channels and modern
48
+ * space-separated output (`rgb(r g b)` / `rgb(r g b / a)`). This is the SINGLE
49
+ * conversion the whole library uses — web document writes, web scope vars, and
50
+ * native `rootVariables` all flow through `getResolvedTokens`, which calls this.
51
+ * The byte-for-byte output is frozen by the golden parity fixture
52
+ * (`__fixtures__/golden-resolved-tokens.json`), so the visible palette cannot
53
+ * drift.
54
+ *
55
+ * Task 2's `oklchToSrgb` (in `color-space.ts`) stays available for a FUTURE
56
+ * OKLCH re-authoring of the seed palette; it is intentionally NOT used here —
57
+ * routing through OKLCH would shift the rounded channels off the frozen palette.
58
+ *
59
+ * Pure function — no side effects.
60
+ */
61
+ function hslToSrgb(triple) {
62
+ const [colorPart, alphaPart] = triple.split('/').map(part => part.trim());
63
+ const channels = (colorPart ?? '').split(/\s+/).filter(Boolean);
64
+ const hue = parseFloat((channels[0] ?? '0').replace(/deg$/i, ''));
65
+ const sat = parseFloat((channels[1] ?? '0').replace('%', '')) / 100;
66
+ const light = parseFloat((channels[2] ?? '0').replace('%', '')) / 100;
67
+ const h = Number.isFinite(hue) ? hue : 0;
68
+ const s = Number.isFinite(sat) ? sat : 0;
69
+ const l = Number.isFinite(light) ? light : 0;
70
+ const chroma = (1 - Math.abs(2 * l - 1)) * s;
71
+ const huePrime = (h % 360 + 360) % 360 / 60;
72
+ const second = chroma * (1 - Math.abs(huePrime % 2 - 1));
73
+ let r = 0;
74
+ let g = 0;
75
+ let b = 0;
76
+ if (huePrime < 1) {
77
+ [r, g, b] = [chroma, second, 0];
78
+ } else if (huePrime < 2) {
79
+ [r, g, b] = [second, chroma, 0];
80
+ } else if (huePrime < 3) {
81
+ [r, g, b] = [0, chroma, second];
82
+ } else if (huePrime < 4) {
83
+ [r, g, b] = [0, second, chroma];
84
+ } else if (huePrime < 5) {
85
+ [r, g, b] = [second, 0, chroma];
86
+ } else {
87
+ [r, g, b] = [chroma, 0, second];
88
+ }
89
+ const match = l - chroma / 2;
90
+ const red = Math.round((r + match) * 255);
91
+ const green = Math.round((g + match) * 255);
92
+ const blue = Math.round((b + match) * 255);
93
+ if (alphaPart !== undefined && alphaPart !== '') {
94
+ const alpha = alphaPart.endsWith('%') ? parseFloat(alphaPart) / 100 : parseFloat(alphaPart);
95
+ const safeAlpha = Number.isFinite(alpha) ? alpha : 1;
96
+ return `rgb(${red} ${green} ${blue} / ${safeAlpha})`;
97
+ }
98
+ return `rgb(${red} ${green} ${blue})`;
99
+ }
100
+
101
+ /**
102
+ * Resolve a preset's canonical runtime color tokens to sRGB `rgb(...)` strings.
103
+ *
104
+ * THE single source of runtime color tokens for the whole library, on BOTH web
105
+ * and native. Takes the raw triple map from `getPresetVars(preset, mode)` (base
106
+ * + extended) and converts every value that looks like an HSL triple via
107
+ * `hslToSrgb`. Non-triple values (already-resolved colors, length/radius tokens)
108
+ * pass through unchanged. Keys retain the `--` prefix, so each `--x` token IS a
109
+ * full CSS color — no resolved-color companion universe, no per-platform wrapping.
110
+ *
111
+ * The result is frozen by the golden parity fixture
112
+ * (`__fixtures__/golden-resolved-tokens.json`), guaranteeing the visible palette
113
+ * matches the previous resolved-color pipeline byte-for-byte.
114
+ */
115
+ function getResolvedTokens(preset, mode) {
116
+ const raw = (0, _presetVars.getPresetVars)(preset, mode);
117
+ const resolved = {};
118
+ for (const [key, value] of Object.entries(raw)) {
119
+ resolved[key] = RAW_HSL_TRIPLE.test(value) ? hslToSrgb(value) : value;
120
+ }
121
+ return resolved;
122
+ }
123
+ //# sourceMappingURL=token-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_colorPresets","require","_presetVars","CANONICAL_TOKENS","exports","RAW_HSL_TRIPLE","hslToSrgb","triple","colorPart","alphaPart","split","map","part","trim","channels","filter","Boolean","hue","parseFloat","replace","sat","light","h","Number","isFinite","s","l","chroma","Math","abs","huePrime","second","r","g","b","match","red","round","green","blue","undefined","alpha","endsWith","safeAlpha","getResolvedTokens","preset","mode","raw","getPresetVars","resolved","key","value","Object","entries","test"],"sourceRoot":"../../../src","sources":["theme/token-registry.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=normalize-colors.d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["normalize-colors.d.ts"],"mappings":"","ignoreList":[]}
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { Platform } from 'react-native';
4
4
  import { APP_COLOR_PRESETS } from "./color-presets.js";
5
- import { getPresetVars } from "./preset-vars.js";
5
+ import { getResolvedTokens } from "./token-registry.js";
6
6
  export function applyDarkClass(resolved) {
7
7
  if (Platform.OS === 'web' && typeof document !== 'undefined') {
8
8
  document.documentElement.classList.toggle('dark', resolved === 'dark');
@@ -11,23 +11,25 @@ export function applyDarkClass(resolved) {
11
11
 
12
12
  /**
13
13
  * Apply a color preset's CSS custom properties to the document root.
14
- * No-op on native — only affects web.
14
+ * No-op on native — only affects web (early-returns on `Platform.OS !== 'web'`).
15
15
  *
16
- * Writes both the raw HSL triples (e.g. `--primary: 185 100% 20%`) and the
17
- * resolved `--color-*` vars (`--color-primary: rgb(0 94 102)`) so both
18
- * shadcn-style `hsl(var(--primary))` plumbing and Tailwind v4 `@theme`
19
- * utilities resolve consistently. The resolved vars are emitted as `rgb(...)`
20
- * (not `hsl(...)`) so the alpha utilities (`bg-primary/10`) resolve on native
21
- * see `getPresetVars` / `hslTripletToRgb`. Includes extended tokens (card,
22
- * chart-*, content-area, sidebar-*) so consumer apps don't need to synthesize
23
- * them.
16
+ * Web var contract (the form Tailwind v4 `@theme inline` compiles to)
17
+ * -------------------------------------------------------------------
18
+ * The shadcn/Tailwind-v4 web apps compile their color utilities to reference the
19
+ * BASE token directly (`.bg-background { background-color: var(--background) }`),
20
+ * so on web the base `--x` tokens MUST be FULL CSS colors. `getResolvedTokens`
21
+ * returns every canonical token already resolved to an sRGB `rgb(...)` string,
22
+ * so `var(--x)` resolves to a valid color directly — no per-value wrapping. The
23
+ * same rgb values feed native (`color-mix` alpha utilities resolve on sRGB), so
24
+ * web and native share one canonical token pipeline.
25
+ *
26
+ * Includes extended tokens (card, chart-*, content-area, sidebar-*) so consumer
27
+ * apps don't need to synthesize them.
24
28
  */
25
29
  export function applyColorPresetVars(preset, resolved) {
26
30
  if (Platform.OS !== 'web' || typeof document === 'undefined') return;
27
31
  if (!APP_COLOR_PRESETS[preset]) return;
28
- const vars = getPresetVars(preset, resolved, {
29
- includeResolvedColorVars: true
30
- });
32
+ const vars = getResolvedTokens(preset, resolved);
31
33
  const root = document.documentElement.style;
32
34
  for (const [key, value] of Object.entries(vars)) {
33
35
  root.setProperty(key, value);
@@ -1 +1 @@
1
- {"version":3,"names":["Platform","APP_COLOR_PRESETS","getPresetVars","applyDarkClass","resolved","OS","document","documentElement","classList","toggle","applyColorPresetVars","preset","vars","includeResolvedColorVars","root","style","key","value","Object","entries","setProperty"],"sourceRoot":"../../../src","sources":["theme/apply-dark-class.ts"],"mappings":";;AAAA,SAASA,QAAQ,QAAQ,cAAc;AACvC,SAASC,iBAAiB,QAA2B,oBAAiB;AACtE,SAASC,aAAa,QAAQ,kBAAe;AAE7C,OAAO,SAASC,cAAcA,CAACC,QAA0B,EAAE;EACzD,IAAIJ,QAAQ,CAACK,EAAE,KAAK,KAAK,IAAI,OAAOC,QAAQ,KAAK,WAAW,EAAE;IAC5DA,QAAQ,CAACC,eAAe,CAACC,SAAS,CAACC,MAAM,CAAC,MAAM,EAAEL,QAAQ,KAAK,MAAM,CAAC;EACxE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASM,oBAAoBA,CAACC,MAAoB,EAAEP,QAA0B,EAAE;EACrF,IAAIJ,QAAQ,CAACK,EAAE,KAAK,KAAK,IAAI,OAAOC,QAAQ,KAAK,WAAW,EAAE;EAC9D,IAAI,CAACL,iBAAiB,CAACU,MAAM,CAAC,EAAE;EAEhC,MAAMC,IAAI,GAAGV,aAAa,CAACS,MAAM,EAAEP,QAAQ,EAAE;IAAES,wBAAwB,EAAE;EAAK,CAAC,CAAC;EAChF,MAAMC,IAAI,GAAGR,QAAQ,CAACC,eAAe,CAACQ,KAAK;EAE3C,KAAK,MAAM,CAACC,GAAG,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACP,IAAI,CAAC,EAAE;IAC/CE,IAAI,CAACM,WAAW,CAACJ,GAAG,EAAEC,KAAK,CAAC;EAC9B;AACF","ignoreList":[]}
1
+ {"version":3,"names":["Platform","APP_COLOR_PRESETS","getResolvedTokens","applyDarkClass","resolved","OS","document","documentElement","classList","toggle","applyColorPresetVars","preset","vars","root","style","key","value","Object","entries","setProperty"],"sourceRoot":"../../../src","sources":["theme/apply-dark-class.ts"],"mappings":";;AAAA,SAASA,QAAQ,QAAQ,cAAc;AACvC,SAASC,iBAAiB,QAA2B,oBAAiB;AACtE,SAASC,iBAAiB,QAAQ,qBAAkB;AAEpD,OAAO,SAASC,cAAcA,CAACC,QAA0B,EAAE;EACzD,IAAIJ,QAAQ,CAACK,EAAE,KAAK,KAAK,IAAI,OAAOC,QAAQ,KAAK,WAAW,EAAE;IAC5DA,QAAQ,CAACC,eAAe,CAACC,SAAS,CAACC,MAAM,CAAC,MAAM,EAAEL,QAAQ,KAAK,MAAM,CAAC;EACxE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASM,oBAAoBA,CAACC,MAAoB,EAAEP,QAA0B,EAAE;EACrF,IAAIJ,QAAQ,CAACK,EAAE,KAAK,KAAK,IAAI,OAAOC,QAAQ,KAAK,WAAW,EAAE;EAC9D,IAAI,CAACL,iBAAiB,CAACU,MAAM,CAAC,EAAE;EAEhC,MAAMC,IAAI,GAAGV,iBAAiB,CAACS,MAAM,EAAEP,QAAQ,CAAC;EAChD,MAAMS,IAAI,GAAGP,QAAQ,CAACC,eAAe,CAACO,KAAK;EAE3C,KAAK,MAAM,CAACC,GAAG,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACN,IAAI,CAAC,EAAE;IAC/CC,IAAI,CAACM,WAAW,CAACJ,GAAG,EAAEC,KAAK,CAAC;EAC9B;AACF","ignoreList":[]}
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
 
3
3
  import { Platform } from 'react-native';
4
- import { APP_COLOR_PRESETS } from "./color-presets.js";
5
4
  import { getAdaptiveColors } from "./adaptive-colors.js";
5
+ import { getResolvedTokens } from "./token-registry.js";
6
+ import { parseRgbString, srgbToRgbString } from "./color-space.js";
6
7
  /**
7
8
  * Status colors used across the design system. Independent of the accent
8
9
  * preset so semantic intent stays stable across themes.
@@ -15,72 +16,49 @@ export const STATUS_COLORS = {
15
16
  };
16
17
 
17
18
  /**
18
- * Convert a shadcn-style HSL CSS variable (`'H S% L%'` or `'H S% L% / A'`)
19
- * into a fully-resolved `hsl()` / `hsla()` color string consumable by both
20
- * web `style` and React Native.
19
+ * Build the JS `theme.colors` object from the SAME canonical rgb token source
20
+ * the web/native CSS-var writes use (`getResolvedTokens`). JS styles and the
21
+ * `var(--x)` document tokens therefore share one rgb pipeline — no second,
22
+ * drift-prone HSL conversion lives here. Subtle/alpha mixes derive from the
23
+ * resolved rgb via `parseRgbString` + `srgbToRgbString`.
21
24
  */
22
- function hslVarToColor(hslVar) {
23
- const parts = hslVar.split('/').map(p => p.trim());
24
- const triple = parts[0] ?? '0 0% 0%';
25
- const components = triple.replace(/\s+/g, ', ');
26
- if (parts.length === 2) {
27
- const alpha = parseFloat(parts[1] ?? '100') / 100;
28
- return `hsla(${components}, ${alpha})`;
29
- }
30
- return `hsl(${components})`;
31
- }
32
- function extractHue(hslVar) {
33
- const first = hslVar.split(/\s+/)[0] ?? '0';
34
- const hue = parseInt(first, 10);
35
- return Number.isFinite(hue) ? hue : 0;
36
- }
37
- function hsl(h, s, l) {
38
- return `hsl(${h}, ${s}%, ${l}%)`;
39
- }
40
- function readToken(tokens, key, fallback = '0 0% 0%') {
41
- return hslVarToColor(tokens[key] ?? fallback);
42
- }
43
25
  function buildColorsFromPreset(preset, resolved) {
44
- const config = APP_COLOR_PRESETS[preset];
45
- const tokens = resolved === 'dark' ? config.dark : config.light;
26
+ const t = getResolvedTokens(preset, resolved);
46
27
  const isDark = resolved === 'dark';
47
- const primaryHue = extractHue(tokens['--primary'] ?? '0 0% 50%');
48
- const destructiveHue = extractHue(tokens['--destructive'] ?? '0 0% 0%');
49
- const background = readToken(tokens, '--background');
50
- const surface = readToken(tokens, '--surface');
51
- const mutedForeground = readToken(tokens, '--muted-foreground', '0 0% 50%');
52
- const primaryColor = readToken(tokens, '--primary', '0 0% 50%');
53
- const primaryForeground = readToken(tokens, '--primary-foreground', '0 0% 100%');
28
+
29
+ // Read a resolved `rgb(...)` token by its bare name (no leading `--`).
30
+ const g = k => t[`--${k}`] ?? 'rgb(0 0 0)';
31
+ // Re-emit a resolved token at a given alpha (sRGB rgb-with-alpha).
32
+ const mix = (k, a) => srgbToRgbString(parseRgbString(g(k)), a);
54
33
  return {
55
- background,
56
- backgroundSecondary: surface,
57
- backgroundTertiary: readToken(tokens, '--muted'),
58
- text: readToken(tokens, '--foreground', '0 0% 100%'),
59
- textSecondary: mutedForeground,
60
- textTertiary: mutedForeground,
61
- border: readToken(tokens, '--border', '0 0% 20%'),
62
- borderLight: readToken(tokens, '--input', '0 0% 20%'),
63
- primary: primaryColor,
64
- primaryForeground,
65
- // Legacy aliases retained for backwards compatibility with downstream
66
- // consumers. `primaryLight` should be a brand tint, not the surface, but
67
- // changing this is a breaking change handled in a separate major.
68
- primaryLight: surface,
69
- primaryDark: background,
70
- // `secondary` historically mirrored `primary`. Retained for compatibility.
71
- secondary: primaryColor,
72
- tint: primaryColor,
73
- icon: mutedForeground,
74
- iconActive: primaryColor,
34
+ background: g('background'),
35
+ backgroundSecondary: g('surface'),
36
+ backgroundTertiary: g('muted'),
37
+ text: g('foreground'),
38
+ textSecondary: g('muted-foreground'),
39
+ textTertiary: g('muted-foreground'),
40
+ border: g('border'),
41
+ borderLight: g('input'),
42
+ primary: g('primary'),
43
+ primaryForeground: g('primary-foreground'),
44
+ // Corrected aliases (see types.ts): `primaryLight` is the preset accent
45
+ // tint, `primaryDark` is the focus-ring shade NOT the surface/background.
46
+ primaryLight: g('accent'),
47
+ primaryDark: g('ring'),
48
+ // Corrected: `secondary` is the preset's secondary surface, NOT a primary mirror.
49
+ secondary: g('secondary'),
50
+ tint: g('primary'),
51
+ icon: g('muted-foreground'),
52
+ iconActive: g('primary'),
75
53
  ...STATUS_COLORS,
76
- primarySubtle: isDark ? hsl(primaryHue, 50, 10) : hsl(primaryHue, 70, 93),
77
- primarySubtleForeground: isDark ? hsl(primaryHue, 70, 65) : hsl(primaryHue, 90, 25),
78
- negative: hsl(destructiveHue, 84, 45),
54
+ primarySubtle: mix('primary', isDark ? 0.16 : 0.12),
55
+ primarySubtleForeground: g('primary'),
56
+ negative: g('destructive'),
79
57
  negativeForeground: '#FFFFFF',
80
- negativeSubtle: isDark ? hsl(destructiveHue, 50, 10) : hsl(destructiveHue, 90, 95),
81
- negativeSubtleForeground: isDark ? hsl(destructiveHue, 70, 65) : hsl(destructiveHue, 80, 40),
82
- contrast50: isDark ? hsl(primaryHue, 15, 12) : hsl(primaryHue, 10, 93),
83
- card: surface,
58
+ negativeSubtle: mix('destructive', isDark ? 0.16 : 0.12),
59
+ negativeSubtleForeground: g('destructive'),
60
+ contrast50: mix('foreground', 0.5),
61
+ card: g('card'),
84
62
  shadow: isDark ? 'rgba(0, 0, 0, 0.3)' : 'rgba(0, 0, 0, 0.1)',
85
63
  overlay: 'rgba(0, 0, 0, 0.5)'
86
64
  };
@@ -1 +1 @@
1
- {"version":3,"names":["Platform","APP_COLOR_PRESETS","getAdaptiveColors","STATUS_COLORS","success","error","warning","info","hslVarToColor","hslVar","parts","split","map","p","trim","triple","components","replace","length","alpha","parseFloat","extractHue","first","hue","parseInt","Number","isFinite","hsl","h","s","l","readToken","tokens","key","fallback","buildColorsFromPreset","preset","resolved","config","dark","light","isDark","primaryHue","destructiveHue","background","surface","mutedForeground","primaryColor","primaryForeground","backgroundSecondary","backgroundTertiary","text","textSecondary","textTertiary","border","borderLight","primary","primaryLight","primaryDark","secondary","tint","icon","iconActive","primarySubtle","primarySubtleForeground","negative","negativeForeground","negativeSubtle","negativeSubtleForeground","contrast50","card","shadow","overlay","buildTheme","isAdaptive","adaptive","OS","undefined","colors","mode","isLight"],"sourceRoot":"../../../src","sources":["theme/build-theme.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Platform","getAdaptiveColors","getResolvedTokens","parseRgbString","srgbToRgbString","STATUS_COLORS","success","error","warning","info","buildColorsFromPreset","preset","resolved","t","isDark","g","k","mix","a","background","backgroundSecondary","backgroundTertiary","text","textSecondary","textTertiary","border","borderLight","primary","primaryForeground","primaryLight","primaryDark","secondary","tint","icon","iconActive","primarySubtle","primarySubtleForeground","negative","negativeForeground","negativeSubtle","negativeSubtleForeground","contrast50","card","shadow","overlay","buildTheme","isAdaptive","adaptive","OS","undefined","colors","mode","isLight"],"sourceRoot":"../../../src","sources":["theme/build-theme.ts"],"mappings":"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","ignoreList":[]}
@@ -6,11 +6,17 @@
6
6
  * Keys carry a leading `--` for historical reasons (shadcn-style CSS variable
7
7
  * names) — keep in mind the values are platform-agnostic **raw HSL triples**
8
8
  * (e.g. `'185 100% 20%'` or `'185 100% 20% / 0.5'`), not CSS-resolved colors.
9
- * The same map drives both:
10
- * - the web layer (written verbatim into `document.documentElement.style`
11
- * so Tailwind's `hsl(var(--primary))` plumbing picks them up), and
12
- * - the native layer (`buildTheme` resolves them into `hsl(...)` strings
13
- * consumable by React Native styles).
9
+ * The single canonical resolver `getResolvedTokens` (in `token-registry.ts`)
10
+ * converts this raw map to sRGB `rgb(...)` for every runtime write — the same
11
+ * values drive BOTH layers:
12
+ * - the web layer: `getResolvedTokens`'s `rgb(...)` strings are written to
13
+ * `document.documentElement` / a `BloomColorScope` element, so `var(--x)` —
14
+ * the form Tailwind v4 `@theme inline` compiles its color utilities to —
15
+ * resolves to a valid color directly, and
16
+ * - the native layer (`buildTheme` resolves the raw triples into `hsl(...)`
17
+ * strings consumable by React Native styles; `native-root-vars.native.ts`
18
+ * writes the same canonical `rgb(...)` values into react-native-css's
19
+ * `rootVariables` family).
14
20
  *
15
21
  * The `--` prefix is an implementation detail we will drop in a future major.
16
22
  */