@oxyhq/bloom 0.7.6 → 0.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/theme/apply-dark-class.js +28 -10
- package/lib/commonjs/theme/apply-dark-class.js.map +1 -1
- package/lib/commonjs/theme/color-presets.js +10 -4
- package/lib/commonjs/theme/color-presets.js.map +1 -1
- package/lib/commonjs/theme/color-scope/index.web.js +19 -2
- package/lib/commonjs/theme/color-scope/index.web.js.map +1 -1
- package/lib/commonjs/theme/index.js +6 -0
- package/lib/commonjs/theme/index.js.map +1 -1
- package/lib/commonjs/theme/preset-vars.js +54 -1
- package/lib/commonjs/theme/preset-vars.js.map +1 -1
- package/lib/module/theme/apply-dark-class.js +24 -11
- package/lib/module/theme/apply-dark-class.js.map +1 -1
- package/lib/module/theme/color-presets.js +10 -4
- package/lib/module/theme/color-presets.js.map +1 -1
- package/lib/module/theme/color-scope/index.web.js +22 -3
- package/lib/module/theme/color-scope/index.web.js.map +1 -1
- package/lib/module/theme/index.js +1 -1
- package/lib/module/theme/index.js.map +1 -1
- package/lib/module/theme/preset-vars.js +53 -1
- package/lib/module/theme/preset-vars.js.map +1 -1
- package/lib/typescript/commonjs/theme/apply-dark-class.d.ts +18 -9
- package/lib/typescript/commonjs/theme/apply-dark-class.d.ts.map +1 -1
- package/lib/typescript/commonjs/theme/color-presets.d.ts +10 -4
- package/lib/typescript/commonjs/theme/color-presets.d.ts.map +1 -1
- package/lib/typescript/commonjs/theme/color-scope/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/theme/index.d.ts +1 -1
- package/lib/typescript/commonjs/theme/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/theme/preset-vars.d.ts +30 -0
- package/lib/typescript/commonjs/theme/preset-vars.d.ts.map +1 -1
- package/lib/typescript/module/theme/apply-dark-class.d.ts +18 -9
- package/lib/typescript/module/theme/apply-dark-class.d.ts.map +1 -1
- package/lib/typescript/module/theme/color-presets.d.ts +10 -4
- package/lib/typescript/module/theme/color-presets.d.ts.map +1 -1
- package/lib/typescript/module/theme/color-scope/index.web.d.ts.map +1 -1
- package/lib/typescript/module/theme/index.d.ts +1 -1
- package/lib/typescript/module/theme/index.d.ts.map +1 -1
- package/lib/typescript/module/theme/preset-vars.d.ts +30 -0
- package/lib/typescript/module/theme/preset-vars.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/BloomColorScope.test.tsx +14 -0
- package/src/__tests__/apply-dark-class.test.ts +65 -0
- package/src/__tests__/preset-vars.test.ts +47 -1
- package/src/theme/apply-dark-class.ts +24 -11
- package/src/theme/color-presets.ts +10 -4
- package/src/theme/color-scope/index.web.tsx +23 -2
- package/src/theme/index.ts +1 -0
- package/src/theme/preset-vars.ts +53 -1
|
@@ -5,7 +5,7 @@ export { BloomColorScope, useColorScopeStyle } from './color-scope';
|
|
|
5
5
|
export { buildTheme, STATUS_COLORS } from "./build-theme.js";
|
|
6
6
|
export { useTheme, useThemeColor, useBloomTheme } from "./use-theme.js";
|
|
7
7
|
export { APP_COLOR_NAMES, PREMIUM_COLOR_NAMES, APP_COLOR_PRESETS, HEX_TO_APP_COLOR, hexToAppColorName } from "./color-presets.js";
|
|
8
|
-
export { getPresetVars, applyPresetVarsToDocument } from "./preset-vars.js";
|
|
8
|
+
export { getPresetVars, applyPresetVarsToDocument, toWebColorValue } from "./preset-vars.js";
|
|
9
9
|
export { applyDarkClass } from "./apply-dark-class.js";
|
|
10
10
|
export { setColorSchemeSafe } from "./set-color-scheme-safe.js";
|
|
11
11
|
export { initCssInteropDarkMode } from "./init-css-interop.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BloomThemeProvider","BloomColorScope","useColorScopeStyle","buildTheme","STATUS_COLORS","useTheme","useThemeColor","useBloomTheme","APP_COLOR_NAMES","PREMIUM_COLOR_NAMES","APP_COLOR_PRESETS","HEX_TO_APP_COLOR","hexToAppColorName","getPresetVars","applyPresetVarsToDocument","applyDarkClass","setColorSchemeSafe","initCssInteropDarkMode","webLocalStorage"],"sourceRoot":"../../../src","sources":["theme/index.ts"],"mappings":";;AAAA,SAASA,kBAAkB,QAAQ,yBAAsB;AAKzD,SAASC,eAAe,EAAEC,kBAAkB,QAAQ,eAAe;AAEnE,SAASC,UAAU,EAAEC,aAAa,QAAQ,kBAAe;AACzD,SAASC,QAAQ,EAAEC,aAAa,EAAEC,aAAa,QAAQ,gBAAa;AAGpE,SACEC,eAAe,EACfC,mBAAmB,EACnBC,iBAAiB,EACjBC,gBAAgB,EAChBC,iBAAiB,QACZ,oBAAiB;AACxB,SACEC,aAAa,EACbC,yBAAyB,
|
|
1
|
+
{"version":3,"names":["BloomThemeProvider","BloomColorScope","useColorScopeStyle","buildTheme","STATUS_COLORS","useTheme","useThemeColor","useBloomTheme","APP_COLOR_NAMES","PREMIUM_COLOR_NAMES","APP_COLOR_PRESETS","HEX_TO_APP_COLOR","hexToAppColorName","getPresetVars","applyPresetVarsToDocument","toWebColorValue","applyDarkClass","setColorSchemeSafe","initCssInteropDarkMode","webLocalStorage"],"sourceRoot":"../../../src","sources":["theme/index.ts"],"mappings":";;AAAA,SAASA,kBAAkB,QAAQ,yBAAsB;AAKzD,SAASC,eAAe,EAAEC,kBAAkB,QAAQ,eAAe;AAEnE,SAASC,UAAU,EAAEC,aAAa,QAAQ,kBAAe;AACzD,SAASC,QAAQ,EAAEC,aAAa,EAAEC,aAAa,QAAQ,gBAAa;AAGpE,SACEC,eAAe,EACfC,mBAAmB,EACnBC,iBAAiB,EACjBC,gBAAgB,EAChBC,iBAAiB,QACZ,oBAAiB;AACxB,SACEC,aAAa,EACbC,yBAAyB,EACzBC,eAAe,QACV,kBAAe;AAEtB,SAASC,cAAc,QAAQ,uBAAoB;AACnD,SAASC,kBAAkB,QAAQ,4BAAyB;AAC5D,SAASC,sBAAsB,QAAQ,uBAAoB;AAE3D,SAASC,eAAe,QAAQ,kBAAe","ignoreList":[]}
|
|
@@ -73,6 +73,53 @@ export function hslTripletToRgb(triplet) {
|
|
|
73
73
|
}
|
|
74
74
|
return `rgb(${red} ${green} ${blue})`;
|
|
75
75
|
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Prefix that marks a Tailwind v4 resolved color var (`--color-primary`). These
|
|
79
|
+
* are already emitted as full `rgb(...)` colors by `getPresetVars` and must be
|
|
80
|
+
* written to web verbatim — wrapping them would corrupt the value.
|
|
81
|
+
*/
|
|
82
|
+
const RESOLVED_COLOR_VAR_PREFIX = '--color-';
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Matches a shadcn-style raw HSL triple — `H S% L%`, optionally with an alpha
|
|
86
|
+
* tail `H S% L% / A`. The value starts with a digit (or a leading `-`) and
|
|
87
|
+
* carries at least one `%` (the saturation/lightness units), which together
|
|
88
|
+
* distinguish a bare triple from an already-resolved CSS color (`rgb(...)`,
|
|
89
|
+
* `hsl(...)`, `#fff`, named colors) or a unitless/length token (`--radius`).
|
|
90
|
+
* Mirrors the triple shape parsed by `hslTripletToRgb`.
|
|
91
|
+
*/
|
|
92
|
+
const RAW_HSL_TRIPLE = /^-?\d[\d.]*\s+[\d.]+%/;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Transform a single preset var into the value to write to a WEB element
|
|
96
|
+
* (`document.documentElement` or a `BloomColorScope` subtree element).
|
|
97
|
+
*
|
|
98
|
+
* The web apps (Vite + Tailwind v4 + shadcn) compile their `@theme inline`
|
|
99
|
+
* block so the color utilities reference the BASE token directly — e.g.
|
|
100
|
+
* `.bg-background { background-color: var(--background) }`. So on web the base
|
|
101
|
+
* `--x` tokens MUST resolve to a COMPLETE CSS color; a bare HSL triple
|
|
102
|
+
* (`185 50% 5%`) is invalid as a `background-color` value and renders
|
|
103
|
+
* transparent (the production incident this fixes). We therefore wrap raw
|
|
104
|
+
* triples in `hsl(...)`, preserving the exact preset color math (and any `/ A`
|
|
105
|
+
* alpha tail, valid in modern `hsl(H S% L% / A)` syntax) with zero rounding
|
|
106
|
+
* drift.
|
|
107
|
+
*
|
|
108
|
+
* Values that are already full colors pass through unchanged:
|
|
109
|
+
* - `--color-*` resolved vars (already `rgb(...)` from `getPresetVars`),
|
|
110
|
+
* - any value not shaped like a raw HSL triple (`--radius: 0.5rem`,
|
|
111
|
+
* pre-resolved `rgb(...)`/`hsl(...)`, etc.).
|
|
112
|
+
*
|
|
113
|
+
* NATIVE never calls this — `getPresetVars` returns raw triples verbatim and
|
|
114
|
+
* `native-root-vars.native.ts` writes them through bloom's `hsl(var(--x))`
|
|
115
|
+
* native `global.css` indirection. Pure function — no side effects — so it is
|
|
116
|
+
* unit-testable in isolation.
|
|
117
|
+
*/
|
|
118
|
+
export function toWebColorValue(key, value) {
|
|
119
|
+
if (key.startsWith(RESOLVED_COLOR_VAR_PREFIX)) return value;
|
|
120
|
+
if (!RAW_HSL_TRIPLE.test(value)) return value;
|
|
121
|
+
return `hsl(${value})`;
|
|
122
|
+
}
|
|
76
123
|
const RESOLVED_COLOR_MAP = {
|
|
77
124
|
'--background': '--color-background',
|
|
78
125
|
'--foreground': '--color-foreground',
|
|
@@ -149,13 +196,18 @@ export function getPresetVars(colorName, mode, options = {}) {
|
|
|
149
196
|
* on native. `BloomThemeProvider` already writes the base preset vars on web;
|
|
150
197
|
* call this only when an app needs the extended (card/chart/sidebar) tokens on
|
|
151
198
|
* the document root.
|
|
199
|
+
*
|
|
200
|
+
* The base raw-HSL-triple tokens are wrapped to full `hsl(...)` colors via
|
|
201
|
+
* `toWebColorValue` so `var(--x)` (the form Tailwind v4 `@theme inline`
|
|
202
|
+
* compiles to) resolves directly on web; `--color-*` rgb vars pass through. See
|
|
203
|
+
* `toWebColorValue` for the web var contract.
|
|
152
204
|
*/
|
|
153
205
|
export function applyPresetVarsToDocument(colorName, mode, options) {
|
|
154
206
|
if (Platform.OS !== 'web' || typeof document === 'undefined') return;
|
|
155
207
|
const vars = getPresetVars(colorName, mode, options);
|
|
156
208
|
const root = document.documentElement.style;
|
|
157
209
|
for (const [key, value] of Object.entries(vars)) {
|
|
158
|
-
root.setProperty(key, value);
|
|
210
|
+
root.setProperty(key, toWebColorValue(key, value));
|
|
159
211
|
}
|
|
160
212
|
}
|
|
161
213
|
//# sourceMappingURL=preset-vars.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","APP_COLOR_PRESETS","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","base","dark","get","
|
|
1
|
+
{"version":3,"names":["Platform","APP_COLOR_PRESETS","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_VAR_PREFIX","RAW_HSL_TRIPLE","toWebColorValue","key","value","startsWith","test","RESOLVED_COLOR_MAP","getPresetVars","colorName","mode","options","preset","base","dark","get","primary","foreground","min","isDark","extended","includeResolvedColorVars","resolved","rawKey","colorKey","Object","entries","applyPresetVarsToDocument","OS","document","vars","root","documentElement","style","setProperty"],"sourceRoot":"../../../src","sources":["theme/preset-vars.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
import { type AppColorName } from './color-presets';
|
|
2
|
+
export { toWebColorValue } from './preset-vars';
|
|
2
3
|
export declare function applyDarkClass(resolved: 'light' | 'dark'): void;
|
|
3
4
|
/**
|
|
4
5
|
* Apply a color preset's CSS custom properties to the document root.
|
|
5
|
-
* No-op on native — only affects web.
|
|
6
|
+
* No-op on native — only affects web (early-returns on `Platform.OS !== 'web'`).
|
|
6
7
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* shadcn-
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
8
|
+
* Web var contract (the form Tailwind v4 `@theme inline` compiles to)
|
|
9
|
+
* -------------------------------------------------------------------
|
|
10
|
+
* The shadcn/Tailwind-v4 web apps compile their color utilities to reference the
|
|
11
|
+
* BASE token directly (`.bg-background { background-color: var(--background) }`),
|
|
12
|
+
* so on web the base `--x` tokens MUST be FULL CSS colors. We therefore write
|
|
13
|
+
* them as `hsl(...)` (e.g. `--primary: hsl(185 100% 20%)`) — `var(--primary)`
|
|
14
|
+
* then resolves to a valid color. The resolved `--color-*` vars are written
|
|
15
|
+
* verbatim as `rgb(...)` (already full colors, used by native `color-mix` alpha
|
|
16
|
+
* utilities; harmless on web). Non-color tokens (`--radius`, etc.) pass through
|
|
17
|
+
* unchanged. See `toWebColorValue`.
|
|
18
|
+
*
|
|
19
|
+
* NATIVE writes the SAME tokens as RAW HSL triples (no `hsl()` wrapper) via
|
|
20
|
+
* `rootVariables` (`native-root-vars.native.ts`), consumed through bloom's
|
|
21
|
+
* native `global.css` `hsl(var(--x))` indirection — that path is untouched here.
|
|
22
|
+
* Includes extended tokens (card, chart-*, content-area, sidebar-*) so consumer
|
|
23
|
+
* apps don't need to synthesize them.
|
|
15
24
|
*/
|
|
16
25
|
export declare function applyColorPresetVars(preset: AppColorName, resolved: 'light' | 'dark'): void;
|
|
17
26
|
//# sourceMappingURL=apply-dark-class.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-dark-class.d.ts","sourceRoot":"","sources":["../../../../src/theme/apply-dark-class.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"apply-dark-class.d.ts","sourceRoot":"","sources":["../../../../src/theme/apply-dark-class.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAMvE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,QAIxD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,QAUpF"}
|
|
@@ -6,10 +6,16 @@ export type AppColorName = 'teal' | 'blue' | 'green' | 'amber' | 'yellow' | 'red
|
|
|
6
6
|
* names) — keep in mind the values are platform-agnostic **raw HSL triples**
|
|
7
7
|
* (e.g. `'185 100% 20%'` or `'185 100% 20% / 0.5'`), not CSS-resolved colors.
|
|
8
8
|
* The same map drives both:
|
|
9
|
-
* - the web layer
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
9
|
+
* - the web layer: the base `--x` tokens are wrapped to full `hsl(...)` colors
|
|
10
|
+
* (via `toWebColorValue`) before being written to `document.documentElement`
|
|
11
|
+
* / a `BloomColorScope` element, so `var(--x)` — the form Tailwind v4
|
|
12
|
+
* `@theme inline` compiles its color utilities to — resolves to a valid
|
|
13
|
+
* color directly; the resolved `--color-*` companions are written as
|
|
14
|
+
* `rgb(...)`, and
|
|
15
|
+
* - the native layer (`buildTheme` resolves the raw triples into `hsl(...)`
|
|
16
|
+
* strings consumable by React Native styles; `native-root-vars.native.ts`
|
|
17
|
+
* writes the raw triples through bloom's `hsl(var(--x))` `global.css`
|
|
18
|
+
* indirection).
|
|
13
19
|
*
|
|
14
20
|
* The `--` prefix is an implementation detail we will drop in a future major.
|
|
15
21
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-presets.d.ts","sourceRoot":"","sources":["../../../../src/theme/color-presets.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,UAAU,CAAC;AAEvJ
|
|
1
|
+
{"version":3,"file":"color-presets.d.ts","sourceRoot":"","sources":["../../../../src/theme/color-presets.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,UAAU,CAAC;AAEvJ;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,eAAO,MAAM,eAAe,EAAE,SAAS,YAAY,EAAsH,CAAC;AAE1K,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,EAAE,SAAS,YAAY,EAAwB,CAAC;AAEhF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAczD,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAE3D;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,YAAY,EAAE,cAAc,CAkmBlE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.web.d.ts","sourceRoot":"","sources":["../../../../../src/theme/color-scope/index.web.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsE,MAAM,OAAO,CAAC;AAI3F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.web.d.ts","sourceRoot":"","sources":["../../../../../src/theme/color-scope/index.web.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsE,MAAM,OAAO,CAAC;AAI3F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAwBrD,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,WAAW,EAAE,YAAY,GAAG,SAAS,CAAC;IACtC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yGAAyG;IACzG,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAuBD,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,OAAe,EACf,KAAK,EACL,QAAQ,GACT,EAAE,oBAAoB,2CA4CtB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,YAAY,GAAG,KAAK,CAAC,aAAa,CAUjF"}
|
|
@@ -7,7 +7,7 @@ export { useTheme, useThemeColor, useBloomTheme } from './use-theme';
|
|
|
7
7
|
export type { Theme, ThemeColors, ThemeMode } from './types';
|
|
8
8
|
export type { AppColorName, AppColorPreset, PresetTokens } from './color-presets';
|
|
9
9
|
export { APP_COLOR_NAMES, PREMIUM_COLOR_NAMES, APP_COLOR_PRESETS, HEX_TO_APP_COLOR, hexToAppColorName, } from './color-presets';
|
|
10
|
-
export { getPresetVars, applyPresetVarsToDocument, } from './preset-vars';
|
|
10
|
+
export { getPresetVars, applyPresetVarsToDocument, toWebColorValue, } from './preset-vars';
|
|
11
11
|
export type { PresetVarsOptions } from './preset-vars';
|
|
12
12
|
export { applyDarkClass } from './apply-dark-class';
|
|
13
13
|
export { setColorSchemeSafe } from './set-color-scheme-safe';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/theme/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EACV,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACpE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/theme/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EACV,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACpE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -25,6 +25,31 @@ import { type AppColorName, type PresetTokens } from './color-presets';
|
|
|
25
25
|
* Tolerates a `deg` suffix on the hue and `%` suffixes on saturation/lightness.
|
|
26
26
|
*/
|
|
27
27
|
export declare function hslTripletToRgb(triplet: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Transform a single preset var into the value to write to a WEB element
|
|
30
|
+
* (`document.documentElement` or a `BloomColorScope` subtree element).
|
|
31
|
+
*
|
|
32
|
+
* The web apps (Vite + Tailwind v4 + shadcn) compile their `@theme inline`
|
|
33
|
+
* block so the color utilities reference the BASE token directly — e.g.
|
|
34
|
+
* `.bg-background { background-color: var(--background) }`. So on web the base
|
|
35
|
+
* `--x` tokens MUST resolve to a COMPLETE CSS color; a bare HSL triple
|
|
36
|
+
* (`185 50% 5%`) is invalid as a `background-color` value and renders
|
|
37
|
+
* transparent (the production incident this fixes). We therefore wrap raw
|
|
38
|
+
* triples in `hsl(...)`, preserving the exact preset color math (and any `/ A`
|
|
39
|
+
* alpha tail, valid in modern `hsl(H S% L% / A)` syntax) with zero rounding
|
|
40
|
+
* drift.
|
|
41
|
+
*
|
|
42
|
+
* Values that are already full colors pass through unchanged:
|
|
43
|
+
* - `--color-*` resolved vars (already `rgb(...)` from `getPresetVars`),
|
|
44
|
+
* - any value not shaped like a raw HSL triple (`--radius: 0.5rem`,
|
|
45
|
+
* pre-resolved `rgb(...)`/`hsl(...)`, etc.).
|
|
46
|
+
*
|
|
47
|
+
* NATIVE never calls this — `getPresetVars` returns raw triples verbatim and
|
|
48
|
+
* `native-root-vars.native.ts` writes them through bloom's `hsl(var(--x))`
|
|
49
|
+
* native `global.css` indirection. Pure function — no side effects — so it is
|
|
50
|
+
* unit-testable in isolation.
|
|
51
|
+
*/
|
|
52
|
+
export declare function toWebColorValue(key: string, value: string): string;
|
|
28
53
|
export interface PresetVarsOptions {
|
|
29
54
|
/**
|
|
30
55
|
* Also emit Tailwind v4 resolved `--color-*` vars (as sRGB `rgb(...)` strings)
|
|
@@ -56,6 +81,11 @@ export declare function getPresetVars(colorName: AppColorName, mode: 'light' | '
|
|
|
56
81
|
* on native. `BloomThemeProvider` already writes the base preset vars on web;
|
|
57
82
|
* call this only when an app needs the extended (card/chart/sidebar) tokens on
|
|
58
83
|
* the document root.
|
|
84
|
+
*
|
|
85
|
+
* The base raw-HSL-triple tokens are wrapped to full `hsl(...)` colors via
|
|
86
|
+
* `toWebColorValue` so `var(--x)` (the form Tailwind v4 `@theme inline`
|
|
87
|
+
* compiles to) resolves directly on web; `--color-*` rgb vars pass through. See
|
|
88
|
+
* `toWebColorValue` for the web var contract.
|
|
59
89
|
*/
|
|
60
90
|
export declare function applyPresetVarsToDocument(colorName: AppColorName, mode: 'light' | 'dark', options?: PresetVarsOptions): void;
|
|
61
91
|
//# sourceMappingURL=preset-vars.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preset-vars.d.ts","sourceRoot":"","sources":["../../../../src/theme/preset-vars.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAU1F;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA+CvD;AAyBD,MAAM,WAAW,iBAAiB;IAChC;;;;;;;;;;;;;OAaG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE,OAAO,GAAG,MAAM,EACtB,OAAO,GAAE,iBAAsB,GAC9B,YAAY,CAwCd;AAED
|
|
1
|
+
{"version":3,"file":"preset-vars.d.ts","sourceRoot":"","sources":["../../../../src/theme/preset-vars.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAU1F;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA+CvD;AAmBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlE;AAyBD,MAAM,WAAW,iBAAiB;IAChC;;;;;;;;;;;;;OAaG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE,OAAO,GAAG,MAAM,EACtB,OAAO,GAAE,iBAAsB,GAC9B,YAAY,CAwCd;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE,OAAO,GAAG,MAAM,EACtB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,IAAI,CAQN"}
|
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
import { type AppColorName } from './color-presets';
|
|
2
|
+
export { toWebColorValue } from './preset-vars';
|
|
2
3
|
export declare function applyDarkClass(resolved: 'light' | 'dark'): void;
|
|
3
4
|
/**
|
|
4
5
|
* Apply a color preset's CSS custom properties to the document root.
|
|
5
|
-
* No-op on native — only affects web.
|
|
6
|
+
* No-op on native — only affects web (early-returns on `Platform.OS !== 'web'`).
|
|
6
7
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* shadcn-
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
8
|
+
* Web var contract (the form Tailwind v4 `@theme inline` compiles to)
|
|
9
|
+
* -------------------------------------------------------------------
|
|
10
|
+
* The shadcn/Tailwind-v4 web apps compile their color utilities to reference the
|
|
11
|
+
* BASE token directly (`.bg-background { background-color: var(--background) }`),
|
|
12
|
+
* so on web the base `--x` tokens MUST be FULL CSS colors. We therefore write
|
|
13
|
+
* them as `hsl(...)` (e.g. `--primary: hsl(185 100% 20%)`) — `var(--primary)`
|
|
14
|
+
* then resolves to a valid color. The resolved `--color-*` vars are written
|
|
15
|
+
* verbatim as `rgb(...)` (already full colors, used by native `color-mix` alpha
|
|
16
|
+
* utilities; harmless on web). Non-color tokens (`--radius`, etc.) pass through
|
|
17
|
+
* unchanged. See `toWebColorValue`.
|
|
18
|
+
*
|
|
19
|
+
* NATIVE writes the SAME tokens as RAW HSL triples (no `hsl()` wrapper) via
|
|
20
|
+
* `rootVariables` (`native-root-vars.native.ts`), consumed through bloom's
|
|
21
|
+
* native `global.css` `hsl(var(--x))` indirection — that path is untouched here.
|
|
22
|
+
* Includes extended tokens (card, chart-*, content-area, sidebar-*) so consumer
|
|
23
|
+
* apps don't need to synthesize them.
|
|
15
24
|
*/
|
|
16
25
|
export declare function applyColorPresetVars(preset: AppColorName, resolved: 'light' | 'dark'): void;
|
|
17
26
|
//# sourceMappingURL=apply-dark-class.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-dark-class.d.ts","sourceRoot":"","sources":["../../../../src/theme/apply-dark-class.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"apply-dark-class.d.ts","sourceRoot":"","sources":["../../../../src/theme/apply-dark-class.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAMvE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,QAIxD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,QAUpF"}
|
|
@@ -6,10 +6,16 @@ export type AppColorName = 'teal' | 'blue' | 'green' | 'amber' | 'yellow' | 'red
|
|
|
6
6
|
* names) — keep in mind the values are platform-agnostic **raw HSL triples**
|
|
7
7
|
* (e.g. `'185 100% 20%'` or `'185 100% 20% / 0.5'`), not CSS-resolved colors.
|
|
8
8
|
* The same map drives both:
|
|
9
|
-
* - the web layer
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
9
|
+
* - the web layer: the base `--x` tokens are wrapped to full `hsl(...)` colors
|
|
10
|
+
* (via `toWebColorValue`) before being written to `document.documentElement`
|
|
11
|
+
* / a `BloomColorScope` element, so `var(--x)` — the form Tailwind v4
|
|
12
|
+
* `@theme inline` compiles its color utilities to — resolves to a valid
|
|
13
|
+
* color directly; the resolved `--color-*` companions are written as
|
|
14
|
+
* `rgb(...)`, and
|
|
15
|
+
* - the native layer (`buildTheme` resolves the raw triples into `hsl(...)`
|
|
16
|
+
* strings consumable by React Native styles; `native-root-vars.native.ts`
|
|
17
|
+
* writes the raw triples through bloom's `hsl(var(--x))` `global.css`
|
|
18
|
+
* indirection).
|
|
13
19
|
*
|
|
14
20
|
* The `--` prefix is an implementation detail we will drop in a future major.
|
|
15
21
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-presets.d.ts","sourceRoot":"","sources":["../../../../src/theme/color-presets.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,UAAU,CAAC;AAEvJ
|
|
1
|
+
{"version":3,"file":"color-presets.d.ts","sourceRoot":"","sources":["../../../../src/theme/color-presets.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,UAAU,CAAC;AAEvJ;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,eAAO,MAAM,eAAe,EAAE,SAAS,YAAY,EAAsH,CAAC;AAE1K,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,EAAE,SAAS,YAAY,EAAwB,CAAC;AAEhF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAczD,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAE3D;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,YAAY,EAAE,cAAc,CAkmBlE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.web.d.ts","sourceRoot":"","sources":["../../../../../src/theme/color-scope/index.web.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsE,MAAM,OAAO,CAAC;AAI3F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.web.d.ts","sourceRoot":"","sources":["../../../../../src/theme/color-scope/index.web.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsE,MAAM,OAAO,CAAC;AAI3F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAwBrD,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,WAAW,EAAE,YAAY,GAAG,SAAS,CAAC;IACtC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yGAAyG;IACzG,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAuBD,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,OAAe,EACf,KAAK,EACL,QAAQ,GACT,EAAE,oBAAoB,2CA4CtB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,YAAY,GAAG,KAAK,CAAC,aAAa,CAUjF"}
|
|
@@ -7,7 +7,7 @@ export { useTheme, useThemeColor, useBloomTheme } from './use-theme';
|
|
|
7
7
|
export type { Theme, ThemeColors, ThemeMode } from './types';
|
|
8
8
|
export type { AppColorName, AppColorPreset, PresetTokens } from './color-presets';
|
|
9
9
|
export { APP_COLOR_NAMES, PREMIUM_COLOR_NAMES, APP_COLOR_PRESETS, HEX_TO_APP_COLOR, hexToAppColorName, } from './color-presets';
|
|
10
|
-
export { getPresetVars, applyPresetVarsToDocument, } from './preset-vars';
|
|
10
|
+
export { getPresetVars, applyPresetVarsToDocument, toWebColorValue, } from './preset-vars';
|
|
11
11
|
export type { PresetVarsOptions } from './preset-vars';
|
|
12
12
|
export { applyDarkClass } from './apply-dark-class';
|
|
13
13
|
export { setColorSchemeSafe } from './set-color-scheme-safe';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/theme/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EACV,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACpE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/theme/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EACV,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACpE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -25,6 +25,31 @@ import { type AppColorName, type PresetTokens } from './color-presets';
|
|
|
25
25
|
* Tolerates a `deg` suffix on the hue and `%` suffixes on saturation/lightness.
|
|
26
26
|
*/
|
|
27
27
|
export declare function hslTripletToRgb(triplet: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Transform a single preset var into the value to write to a WEB element
|
|
30
|
+
* (`document.documentElement` or a `BloomColorScope` subtree element).
|
|
31
|
+
*
|
|
32
|
+
* The web apps (Vite + Tailwind v4 + shadcn) compile their `@theme inline`
|
|
33
|
+
* block so the color utilities reference the BASE token directly — e.g.
|
|
34
|
+
* `.bg-background { background-color: var(--background) }`. So on web the base
|
|
35
|
+
* `--x` tokens MUST resolve to a COMPLETE CSS color; a bare HSL triple
|
|
36
|
+
* (`185 50% 5%`) is invalid as a `background-color` value and renders
|
|
37
|
+
* transparent (the production incident this fixes). We therefore wrap raw
|
|
38
|
+
* triples in `hsl(...)`, preserving the exact preset color math (and any `/ A`
|
|
39
|
+
* alpha tail, valid in modern `hsl(H S% L% / A)` syntax) with zero rounding
|
|
40
|
+
* drift.
|
|
41
|
+
*
|
|
42
|
+
* Values that are already full colors pass through unchanged:
|
|
43
|
+
* - `--color-*` resolved vars (already `rgb(...)` from `getPresetVars`),
|
|
44
|
+
* - any value not shaped like a raw HSL triple (`--radius: 0.5rem`,
|
|
45
|
+
* pre-resolved `rgb(...)`/`hsl(...)`, etc.).
|
|
46
|
+
*
|
|
47
|
+
* NATIVE never calls this — `getPresetVars` returns raw triples verbatim and
|
|
48
|
+
* `native-root-vars.native.ts` writes them through bloom's `hsl(var(--x))`
|
|
49
|
+
* native `global.css` indirection. Pure function — no side effects — so it is
|
|
50
|
+
* unit-testable in isolation.
|
|
51
|
+
*/
|
|
52
|
+
export declare function toWebColorValue(key: string, value: string): string;
|
|
28
53
|
export interface PresetVarsOptions {
|
|
29
54
|
/**
|
|
30
55
|
* Also emit Tailwind v4 resolved `--color-*` vars (as sRGB `rgb(...)` strings)
|
|
@@ -56,6 +81,11 @@ export declare function getPresetVars(colorName: AppColorName, mode: 'light' | '
|
|
|
56
81
|
* on native. `BloomThemeProvider` already writes the base preset vars on web;
|
|
57
82
|
* call this only when an app needs the extended (card/chart/sidebar) tokens on
|
|
58
83
|
* the document root.
|
|
84
|
+
*
|
|
85
|
+
* The base raw-HSL-triple tokens are wrapped to full `hsl(...)` colors via
|
|
86
|
+
* `toWebColorValue` so `var(--x)` (the form Tailwind v4 `@theme inline`
|
|
87
|
+
* compiles to) resolves directly on web; `--color-*` rgb vars pass through. See
|
|
88
|
+
* `toWebColorValue` for the web var contract.
|
|
59
89
|
*/
|
|
60
90
|
export declare function applyPresetVarsToDocument(colorName: AppColorName, mode: 'light' | 'dark', options?: PresetVarsOptions): void;
|
|
61
91
|
//# sourceMappingURL=preset-vars.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preset-vars.d.ts","sourceRoot":"","sources":["../../../../src/theme/preset-vars.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAU1F;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA+CvD;AAyBD,MAAM,WAAW,iBAAiB;IAChC;;;;;;;;;;;;;OAaG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE,OAAO,GAAG,MAAM,EACtB,OAAO,GAAE,iBAAsB,GAC9B,YAAY,CAwCd;AAED
|
|
1
|
+
{"version":3,"file":"preset-vars.d.ts","sourceRoot":"","sources":["../../../../src/theme/preset-vars.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAU1F;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA+CvD;AAmBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlE;AAyBD,MAAM,WAAW,iBAAiB;IAChC;;;;;;;;;;;;;OAaG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE,OAAO,GAAG,MAAM,EACtB,OAAO,GAAE,iBAAsB,GAC9B,YAAY,CAwCd;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE,OAAO,GAAG,MAAM,EACtB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,IAAI,CAQN"}
|
package/package.json
CHANGED
|
@@ -151,6 +151,20 @@ describe('BloomColorScope', () => {
|
|
|
151
151
|
expect(flat).toEqual(
|
|
152
152
|
expect.arrayContaining([expect.objectContaining({ padding: 8 })]),
|
|
153
153
|
);
|
|
154
|
+
|
|
155
|
+
// Web var contract: the scoped base tokens (`--background`, `--primary`)
|
|
156
|
+
// must be full `hsl(...)` colors — never bare HSL triples — so the web
|
|
157
|
+
// apps' `var(--x)` color utilities resolve. (The production incident was a
|
|
158
|
+
// bare triple here too.)
|
|
159
|
+
const vars = Object.assign(
|
|
160
|
+
{},
|
|
161
|
+
...flat.filter((entry) => '--background' in entry || '--primary' in entry),
|
|
162
|
+
) as Record<string, unknown>;
|
|
163
|
+
const background = String(vars['--background'] ?? '');
|
|
164
|
+
const primary = String(vars['--primary'] ?? '');
|
|
165
|
+
expect(background.startsWith('hsl(')).toBe(true);
|
|
166
|
+
expect(primary.startsWith('hsl(')).toBe(true);
|
|
167
|
+
expect(/^-?\d[\d.]*\s+[\d.]+%/.test(background)).toBe(false);
|
|
154
168
|
});
|
|
155
169
|
});
|
|
156
170
|
});
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jest-environment jsdom
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Platform } from 'react-native';
|
|
6
|
+
|
|
7
|
+
import { applyColorPresetVars, toWebColorValue } from '../theme/apply-dark-class';
|
|
8
|
+
|
|
9
|
+
// `applyColorPresetVars` is the WEB write path that feeds the live document. It
|
|
10
|
+
// regressed by writing the base `--x` tokens as bare HSL triples (`185 50% 5%`),
|
|
11
|
+
// which the shadcn/Tailwind-v4 web apps consume directly as
|
|
12
|
+
// `background-color: var(--background)` → invalid CSS → transparent → unstyled
|
|
13
|
+
// app. These tests pin the corrected contract: base tokens are full `hsl(...)`
|
|
14
|
+
// colors, `--color-*` companions stay `rgb(...)`.
|
|
15
|
+
|
|
16
|
+
describe('applyColorPresetVars — web document var contract', () => {
|
|
17
|
+
const originalOS = Platform.OS;
|
|
18
|
+
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
Platform.OS = 'web';
|
|
21
|
+
document.documentElement.removeAttribute('style');
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
afterEach(() => {
|
|
25
|
+
Platform.OS = originalOS;
|
|
26
|
+
document.documentElement.removeAttribute('style');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('re-exports toWebColorValue (helper is consumed by the web write paths)', () => {
|
|
30
|
+
expect(toWebColorValue('--background', '185 50% 5%')).toBe('hsl(185 50% 5%)');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('writes base tokens to the document as full hsl() colors, not bare triples', () => {
|
|
34
|
+
applyColorPresetVars('oxy', 'dark');
|
|
35
|
+
|
|
36
|
+
const style = document.documentElement.style;
|
|
37
|
+
const background = style.getPropertyValue('--background').trim();
|
|
38
|
+
const primary = style.getPropertyValue('--primary').trim();
|
|
39
|
+
const foreground = style.getPropertyValue('--foreground').trim();
|
|
40
|
+
|
|
41
|
+
expect(background).not.toBe('');
|
|
42
|
+
// The exact bug: a bare `H S% L%` triple. Must be a wrapped color now.
|
|
43
|
+
expect(background.startsWith('hsl(')).toBe(true);
|
|
44
|
+
expect(background.endsWith(')')).toBe(true);
|
|
45
|
+
expect(/^-?\d[\d.]*\s+[\d.]+%/.test(background)).toBe(false);
|
|
46
|
+
|
|
47
|
+
expect(primary.startsWith('hsl(')).toBe(true);
|
|
48
|
+
expect(foreground.startsWith('hsl(')).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('keeps the resolved --color-* vars as rgb() full colors', () => {
|
|
52
|
+
applyColorPresetVars('oxy', 'dark');
|
|
53
|
+
|
|
54
|
+
const colorPrimary = document.documentElement.style
|
|
55
|
+
.getPropertyValue('--color-primary')
|
|
56
|
+
.trim();
|
|
57
|
+
expect(colorPrimary.startsWith('rgb(')).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('no-ops on native (does not touch the document)', () => {
|
|
61
|
+
Platform.OS = 'ios';
|
|
62
|
+
applyColorPresetVars('oxy', 'dark');
|
|
63
|
+
expect(document.documentElement.getAttribute('style')).toBeNull();
|
|
64
|
+
});
|
|
65
|
+
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { APP_COLOR_NAMES, APP_COLOR_PRESETS } from '../theme/color-presets';
|
|
2
|
-
import { getPresetVars, hslTripletToRgb } from '../theme/preset-vars';
|
|
2
|
+
import { getPresetVars, hslTripletToRgb, toWebColorValue } from '../theme/preset-vars';
|
|
3
3
|
|
|
4
4
|
const EXTENDED_KEYS = [
|
|
5
5
|
'--card',
|
|
@@ -97,3 +97,49 @@ describe('hslTripletToRgb', () => {
|
|
|
97
97
|
expect(hslTripletToRgb('205 87% 53% / 50%')).toBe('rgb(31 153 239 / 0.5)');
|
|
98
98
|
});
|
|
99
99
|
});
|
|
100
|
+
|
|
101
|
+
describe('toWebColorValue (web var contract)', () => {
|
|
102
|
+
it('wraps a raw HSL triple base token in hsl()', () => {
|
|
103
|
+
expect(toWebColorValue('--background', '185 50% 5%')).toBe('hsl(185 50% 5%)');
|
|
104
|
+
expect(toWebColorValue('--primary', '185 100% 20%')).toBe('hsl(185 100% 20%)');
|
|
105
|
+
expect(toWebColorValue('--foreground', '0 0% 12%')).toBe('hsl(0 0% 12%)');
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('wraps a raw HSL triple with an alpha tail into modern hsl(H S% L% / A) syntax', () => {
|
|
109
|
+
expect(toWebColorValue('--ring', '0 0% 0% / 0.5')).toBe('hsl(0 0% 0% / 0.5)');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('passes --color-* resolved rgb() vars through unchanged', () => {
|
|
113
|
+
expect(toWebColorValue('--color-primary', 'rgb(31 153 239)')).toBe('rgb(31 153 239)');
|
|
114
|
+
expect(toWebColorValue('--color-background', 'rgb(0 94 102 / 0.5)')).toBe(
|
|
115
|
+
'rgb(0 94 102 / 0.5)',
|
|
116
|
+
);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('passes non-color tokens (radius / lengths) through unchanged', () => {
|
|
120
|
+
expect(toWebColorValue('--radius', '0.5rem')).toBe('0.5rem');
|
|
121
|
+
expect(toWebColorValue('--radius-lg', '12px')).toBe('12px');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('passes already-resolved color values through unchanged', () => {
|
|
125
|
+
expect(toWebColorValue('--primary', 'rgb(31 153 239)')).toBe('rgb(31 153 239)');
|
|
126
|
+
expect(toWebColorValue('--primary', 'hsl(185 100% 20%)')).toBe('hsl(185 100% 20%)');
|
|
127
|
+
expect(toWebColorValue('--primary', '#1d9bf0')).toBe('#1d9bf0');
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('produces a full CSS color for every base preset token of every preset/mode', () => {
|
|
131
|
+
for (const name of APP_COLOR_NAMES) {
|
|
132
|
+
for (const mode of ['light', 'dark'] as const) {
|
|
133
|
+
const base = mode === 'light' ? APP_COLOR_PRESETS[name].light : APP_COLOR_PRESETS[name].dark;
|
|
134
|
+
for (const [key, value] of Object.entries(base)) {
|
|
135
|
+
const web = toWebColorValue(key, value);
|
|
136
|
+
// A bare triple (`185 50% 5%`) is INVALID CSS — the incident. Every
|
|
137
|
+
// base token must come out as a complete color the browser parses.
|
|
138
|
+
expect(web.startsWith('hsl(') || web.startsWith('rgb(') || web.startsWith('#')).toBe(
|
|
139
|
+
true,
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|