@oxyhq/bloom 0.7.0 → 0.7.2

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 (76) hide show
  1. package/lib/commonjs/react-native-css.d.js +2 -0
  2. package/lib/commonjs/react-native-css.d.js.map +1 -0
  3. package/lib/commonjs/theme/BloomThemeProvider.js +39 -7
  4. package/lib/commonjs/theme/BloomThemeProvider.js.map +1 -1
  5. package/lib/commonjs/theme/apply-dark-class.js +6 -3
  6. package/lib/commonjs/theme/apply-dark-class.js.map +1 -1
  7. package/lib/commonjs/theme/color-presets.js +118 -118
  8. package/lib/commonjs/theme/color-presets.js.map +1 -1
  9. package/lib/commonjs/theme/color-scope/index.js +28 -6
  10. package/lib/commonjs/theme/color-scope/index.js.map +1 -1
  11. package/lib/commonjs/theme/color-scope/style-builder.js +35 -0
  12. package/lib/commonjs/theme/color-scope/style-builder.js.map +1 -1
  13. package/lib/commonjs/theme/native-root-vars.js +110 -0
  14. package/lib/commonjs/theme/native-root-vars.js.map +1 -0
  15. package/lib/commonjs/theme/native-root-vars.web.js +27 -0
  16. package/lib/commonjs/theme/native-root-vars.web.js.map +1 -0
  17. package/lib/commonjs/theme/preset-vars.js +71 -2
  18. package/lib/commonjs/theme/preset-vars.js.map +1 -1
  19. package/lib/module/react-native-css.d.js +2 -0
  20. package/lib/module/react-native-css.d.js.map +1 -0
  21. package/lib/module/theme/BloomThemeProvider.js +40 -8
  22. package/lib/module/theme/BloomThemeProvider.js.map +1 -1
  23. package/lib/module/theme/apply-dark-class.js +6 -3
  24. package/lib/module/theme/apply-dark-class.js.map +1 -1
  25. package/lib/module/theme/color-presets.js +118 -118
  26. package/lib/module/theme/color-presets.js.map +1 -1
  27. package/lib/module/theme/color-scope/index.js +29 -7
  28. package/lib/module/theme/color-scope/index.js.map +1 -1
  29. package/lib/module/theme/color-scope/style-builder.js +35 -0
  30. package/lib/module/theme/color-scope/style-builder.js.map +1 -1
  31. package/lib/module/theme/native-root-vars.js +106 -0
  32. package/lib/module/theme/native-root-vars.js.map +1 -0
  33. package/lib/module/theme/native-root-vars.web.js +23 -0
  34. package/lib/module/theme/native-root-vars.web.js.map +1 -0
  35. package/lib/module/theme/preset-vars.js +70 -2
  36. package/lib/module/theme/preset-vars.js.map +1 -1
  37. package/lib/typescript/commonjs/icons/common.d.ts +8 -8
  38. package/lib/typescript/commonjs/theme/BloomThemeProvider.d.ts.map +1 -1
  39. package/lib/typescript/commonjs/theme/apply-dark-class.d.ts +6 -3
  40. package/lib/typescript/commonjs/theme/apply-dark-class.d.ts.map +1 -1
  41. package/lib/typescript/commonjs/theme/color-scope/index.d.ts +9 -2
  42. package/lib/typescript/commonjs/theme/color-scope/index.d.ts.map +1 -1
  43. package/lib/typescript/commonjs/theme/color-scope/style-builder.d.ts +32 -0
  44. package/lib/typescript/commonjs/theme/color-scope/style-builder.d.ts.map +1 -1
  45. package/lib/typescript/commonjs/theme/native-root-vars.d.ts +94 -0
  46. package/lib/typescript/commonjs/theme/native-root-vars.d.ts.map +1 -0
  47. package/lib/typescript/commonjs/theme/native-root-vars.web.d.ts +20 -0
  48. package/lib/typescript/commonjs/theme/native-root-vars.web.d.ts.map +1 -0
  49. package/lib/typescript/commonjs/theme/preset-vars.d.ts +35 -2
  50. package/lib/typescript/commonjs/theme/preset-vars.d.ts.map +1 -1
  51. package/lib/typescript/module/icons/common.d.ts +8 -8
  52. package/lib/typescript/module/theme/BloomThemeProvider.d.ts.map +1 -1
  53. package/lib/typescript/module/theme/apply-dark-class.d.ts +6 -3
  54. package/lib/typescript/module/theme/apply-dark-class.d.ts.map +1 -1
  55. package/lib/typescript/module/theme/color-scope/index.d.ts +9 -2
  56. package/lib/typescript/module/theme/color-scope/index.d.ts.map +1 -1
  57. package/lib/typescript/module/theme/color-scope/style-builder.d.ts +32 -0
  58. package/lib/typescript/module/theme/color-scope/style-builder.d.ts.map +1 -1
  59. package/lib/typescript/module/theme/native-root-vars.d.ts +94 -0
  60. package/lib/typescript/module/theme/native-root-vars.d.ts.map +1 -0
  61. package/lib/typescript/module/theme/native-root-vars.web.d.ts +20 -0
  62. package/lib/typescript/module/theme/native-root-vars.web.d.ts.map +1 -0
  63. package/lib/typescript/module/theme/preset-vars.d.ts +35 -2
  64. package/lib/typescript/module/theme/preset-vars.d.ts.map +1 -1
  65. package/package.json +1 -1
  66. package/src/__tests__/native-root-vars.test.ts +127 -0
  67. package/src/__tests__/preset-vars.test.ts +45 -4
  68. package/src/react-native-css.d.ts +70 -0
  69. package/src/theme/BloomThemeProvider.tsx +32 -6
  70. package/src/theme/apply-dark-class.ts +6 -3
  71. package/src/theme/color-presets.ts +118 -118
  72. package/src/theme/color-scope/index.tsx +30 -8
  73. package/src/theme/color-scope/style-builder.ts +40 -0
  74. package/src/theme/native-root-vars.ts +107 -0
  75. package/src/theme/native-root-vars.web.ts +22 -0
  76. package/src/theme/preset-vars.ts +88 -4
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Ambient declaration for `react-native-css/native-internal`.
3
+ *
4
+ * react-native-css is NOT a Bloom dependency — it arrives transitively via the
5
+ * host app's NativeWind install (NativeWind 5 is built on react-native-css@3).
6
+ * Bloom's `native-root-vars.native.ts` statically imports `rootVariables` from
7
+ * this subpath so Metro resolves the `import` export condition to the package's
8
+ * `module` build — the SAME family instance the react-native-css renderer
9
+ * (`varResolver`) subscribes to. A runtime `require()` would resolve the
10
+ * `require` condition to the separate `commonjs` build, whose `rootVariables`
11
+ * is a distinct, un-observed family instance (see the file-level comment in
12
+ * `native-root-vars.native.ts`).
13
+ *
14
+ * Because the package isn't installed in Bloom, `tsc` can't see its published
15
+ * types, so we declare the slice we use here — typed to match react-native-css
16
+ * @3.0.7's `dist/typescript/.../native-internal/root.d.ts` exactly (no `any`,
17
+ * no shims). This file is `.native`-only in spirit; the web fork never imports
18
+ * the subpath, so on web bundlers the static import is never reached.
19
+ */
20
+ declare module 'react-native-css/native-internal' {
21
+ /**
22
+ * A leaf style value. Mirrors react-native-css's `compiler.types`
23
+ * `StyleDescriptor`. Bloom only ever writes string color values (raw HSL
24
+ * triples for the `--*` vars, sRGB `rgb(...)` for the resolved `--color-*`
25
+ * vars), but the family is typed against the full descriptor union.
26
+ */
27
+ type StyleDescriptor =
28
+ | string
29
+ | number
30
+ | boolean
31
+ | undefined
32
+ | StyleDescriptor[];
33
+
34
+ /**
35
+ * A media-conditioned predicate guarding a variable value. Bloom never emits
36
+ * conditioned values (its preset vars are unconditional), so the inner shape
37
+ * is intentionally opaque here — declaring the full recursive union would
38
+ * duplicate a large compiler type we never construct.
39
+ */
40
+ type MediaCondition = readonly unknown[];
41
+
42
+ /**
43
+ * A single variable value: a `[value]` tuple, optionally guarded by media
44
+ * conditions. Mirrors react-native-css's `VariableValue`. `rootVariables(...).set`
45
+ * takes a `VariableValue[]` (the variable's full ordered value list).
46
+ */
47
+ type VariableValue =
48
+ | readonly [StyleDescriptor]
49
+ | readonly [StyleDescriptor, readonly MediaCondition[]];
50
+
51
+ /**
52
+ * The reactive cell react-native-css renders from. `rootVariables(name)`
53
+ * returns one of these; `.set` replaces its value list and notifies the
54
+ * renderer's subscribed effects. Mirrors `Observable<StyleDescriptor, VariableValue[]>`.
55
+ */
56
+ interface Observable {
57
+ set: (value: readonly VariableValue[]) => void;
58
+ }
59
+
60
+ /**
61
+ * The GLOBAL root-variable family — `rootVariables(name)` returns the
62
+ * observable for the bare variable `name` (no leading `--`). This is the
63
+ * exact callable react-native-css's compiled `:root {}` / `@theme` vars are
64
+ * written through (`StyleCollection.inject` → `rootVariables(name).set(...)`).
65
+ */
66
+ export const rootVariables: ((name: string) => Observable) & {
67
+ delete(name: string): boolean;
68
+ clear(): void;
69
+ };
70
+ }
@@ -27,7 +27,8 @@ import { FontLoader } from '../fonts/FontLoader';
27
27
  import { applyDarkClass, applyColorPresetVars } from './apply-dark-class';
28
28
  import { buildTheme } from './build-theme';
29
29
  import { type AppColorName } from './color-presets';
30
- import { buildNativePresetStyle } from './color-scope/style-builder';
30
+ import { buildScopeVars, getVariableContextProvider } from './color-scope/style-builder';
31
+ import { applyNativeRootVars } from './native-root-vars';
31
32
  import {
32
33
  readPersistedTheme,
33
34
  readPersistedThemeSync,
@@ -295,6 +296,17 @@ export function BloomThemeProvider({
295
296
  applyColorPresetVars(colorPreset, resolved);
296
297
  }, [effectiveMode, resolved, colorPreset]);
297
298
 
299
+ // Native only: publish the preset vars into react-native-css's GLOBAL root
300
+ // variable family so they reach the ENTIRE app tree — navigator screens and
301
+ // every portal/modal/bottom-sheet that paints outside the provider's React
302
+ // subtree (and therefore never sees the `VariableContextProvider` vars below).
303
+ // Web writes the same vars to `document.documentElement` above, so this no-ops
304
+ // there. Runs before paint via `useIsomorphicLayoutEffect`, matching the
305
+ // sibling `applyColorPresetVars` side effect.
306
+ useIsomorphicLayoutEffect(() => {
307
+ applyNativeRootVars(colorPreset, resolved);
308
+ }, [colorPreset, resolved]);
309
+
298
310
  const contextValue = useMemo<BloomThemeContextValue>(
299
311
  () => ({
300
312
  theme: buildTheme(colorPreset, resolved, isAdaptive),
@@ -310,10 +322,15 @@ export function BloomThemeProvider({
310
322
  const shouldAwait = awaitHydration ?? Boolean(persistKey && storage);
311
323
  const isGated = shouldAwait && !hydrated;
312
324
 
313
- const nativeVarsStyle = useMemo(
314
- () => (Platform.OS === 'web' ? undefined : buildNativePresetStyle(colorPreset, resolved)),
325
+ // The full `--name -> value` record for the active preset. On native this is
326
+ // handed to `VariableContextProvider` so descendants resolve `var(--primary)`
327
+ // etc. through react-native-css's real VariableContext. Web writes these to
328
+ // `document.documentElement` via `applyColorPresetVars`, so it's unused there.
329
+ const nativeVars = useMemo(
330
+ () => (Platform.OS === 'web' ? null : buildScopeVars(colorPreset, resolved)),
315
331
  [colorPreset, resolved],
316
332
  );
333
+ const VariableProvider = getVariableContextProvider();
317
334
 
318
335
  const content = (
319
336
  <FontLoader enabled={fonts} fallback={onFontsLoading}>
@@ -321,12 +338,21 @@ export function BloomThemeProvider({
321
338
  </FontLoader>
322
339
  );
323
340
 
341
+ if (Platform.OS === 'web') {
342
+ return <BloomThemeContext.Provider value={contextValue}>{content}</BloomThemeContext.Provider>;
343
+ }
344
+
345
+ // The flex wrapper is still needed for layout; the preset vars now flow
346
+ // through `VariableContextProvider` rather than an (inert) inline-vars style.
347
+ // If NativeWind isn't installed the wrapper still renders so we never crash.
348
+ const nativeTree = <View style={[{ flex: 1 }, nativeWrapperStyle]}>{content}</View>;
349
+
324
350
  return (
325
351
  <BloomThemeContext.Provider value={contextValue}>
326
- {Platform.OS === 'web' ? (
327
- content
352
+ {VariableProvider && nativeVars ? (
353
+ <VariableProvider value={nativeVars}>{nativeTree}</VariableProvider>
328
354
  ) : (
329
- <View style={[{ flex: 1 }, nativeVarsStyle, nativeWrapperStyle]}>{content}</View>
355
+ nativeTree
330
356
  )}
331
357
  </BloomThemeContext.Provider>
332
358
  );
@@ -13,10 +13,13 @@ export function applyDarkClass(resolved: 'light' | 'dark') {
13
13
  * No-op on native — only affects web.
14
14
  *
15
15
  * Writes both the raw HSL triples (e.g. `--primary: 185 100% 20%`) and the
16
- * resolved `--color-*` vars (`--color-primary: hsl(185 100% 20%)`) so both
16
+ * resolved `--color-*` vars (`--color-primary: rgb(0 94 102)`) so both
17
17
  * shadcn-style `hsl(var(--primary))` plumbing and Tailwind v4 `@theme`
18
- * utilities resolve consistently. Includes extended tokens (card, chart-*,
19
- * content-area, sidebar-*) so consumer apps don't need to synthesize them.
18
+ * utilities resolve consistently. The resolved vars are emitted as `rgb(...)`
19
+ * (not `hsl(...)`) so the alpha utilities (`bg-primary/10`) resolve on native —
20
+ * see `getPresetVars` / `hslTripletToRgb`. Includes extended tokens (card,
21
+ * chart-*, content-area, sidebar-*) so consumer apps don't need to synthesize
22
+ * them.
20
23
  */
21
24
  export function applyColorPresetVars(preset: AppColorName, resolved: 'light' | 'dark') {
22
25
  if (Platform.OS !== 'web' || typeof document === 'undefined') return;
@@ -53,25 +53,25 @@ export const APP_COLOR_PRESETS: Record<AppColorName, AppColorPreset> = {
53
53
  name: 'teal',
54
54
  hex: '#005c67',
55
55
  light: {
56
- '--background': '0 0% 99%',
56
+ '--background': '185 8% 99%',
57
57
  '--foreground': '0 0% 12%',
58
- '--surface': '185 10% 97%',
58
+ '--surface': '185 14% 97%',
59
59
  '--surface-foreground': '0 0% 12%',
60
- '--popover': '0 0% 100%',
60
+ '--popover': '185 12% 99%',
61
61
  '--popover-foreground': '0 0% 12%',
62
62
  '--primary': '185 100% 20%',
63
63
  '--primary-foreground': '0 0% 100%',
64
- '--secondary': '185 8% 95%',
64
+ '--secondary': '185 12% 95%',
65
65
  '--secondary-foreground': '0 0% 12%',
66
- '--muted': '185 8% 95%',
66
+ '--muted': '185 12% 95%',
67
67
  '--muted-foreground': '185 5% 42%',
68
- '--accent': '185 8% 95%',
68
+ '--accent': '185 12% 95%',
69
69
  '--accent-foreground': '0 0% 12%',
70
70
  '--destructive': '0 84% 60%',
71
- '--border': '185 8% 88%',
72
- '--input': '185 8% 88%',
71
+ '--border': '185 14% 88%',
72
+ '--input': '185 14% 88%',
73
73
  '--ring': '185 100% 20%',
74
- '--sidebar': '185 10% 97%',
74
+ '--sidebar': '185 14% 97%',
75
75
  },
76
76
  dark: {
77
77
  '--background': '185 50% 5%',
@@ -100,25 +100,25 @@ export const APP_COLOR_PRESETS: Record<AppColorName, AppColorPreset> = {
100
100
  name: 'blue',
101
101
  hex: '#1D9BF0',
102
102
  light: {
103
- '--background': '0 0% 99%',
103
+ '--background': '205 8% 99%',
104
104
  '--foreground': '0 0% 12%',
105
- '--surface': '205 10% 97%',
105
+ '--surface': '205 14% 97%',
106
106
  '--surface-foreground': '0 0% 12%',
107
- '--popover': '0 0% 100%',
107
+ '--popover': '205 12% 99%',
108
108
  '--popover-foreground': '0 0% 12%',
109
109
  '--primary': '205 87% 53%',
110
110
  '--primary-foreground': '0 0% 100%',
111
- '--secondary': '205 8% 95%',
111
+ '--secondary': '205 12% 95%',
112
112
  '--secondary-foreground': '0 0% 12%',
113
- '--muted': '205 8% 95%',
113
+ '--muted': '205 12% 95%',
114
114
  '--muted-foreground': '205 5% 42%',
115
- '--accent': '205 8% 95%',
115
+ '--accent': '205 12% 95%',
116
116
  '--accent-foreground': '0 0% 12%',
117
117
  '--destructive': '0 84% 60%',
118
- '--border': '205 8% 88%',
119
- '--input': '205 8% 88%',
118
+ '--border': '205 14% 88%',
119
+ '--input': '205 14% 88%',
120
120
  '--ring': '205 87% 53%',
121
- '--sidebar': '205 10% 97%',
121
+ '--sidebar': '205 14% 97%',
122
122
  },
123
123
  dark: {
124
124
  '--background': '205 50% 5%',
@@ -147,25 +147,25 @@ export const APP_COLOR_PRESETS: Record<AppColorName, AppColorPreset> = {
147
147
  name: 'green',
148
148
  hex: '#10B981',
149
149
  light: {
150
- '--background': '0 0% 99%',
150
+ '--background': '160 8% 99%',
151
151
  '--foreground': '0 0% 12%',
152
- '--surface': '160 10% 97%',
152
+ '--surface': '160 14% 97%',
153
153
  '--surface-foreground': '0 0% 12%',
154
- '--popover': '0 0% 100%',
154
+ '--popover': '160 12% 99%',
155
155
  '--popover-foreground': '0 0% 12%',
156
156
  '--primary': '160 84% 39%',
157
157
  '--primary-foreground': '0 0% 100%',
158
- '--secondary': '160 8% 95%',
158
+ '--secondary': '160 12% 95%',
159
159
  '--secondary-foreground': '0 0% 12%',
160
- '--muted': '160 8% 95%',
160
+ '--muted': '160 12% 95%',
161
161
  '--muted-foreground': '160 5% 42%',
162
- '--accent': '160 8% 95%',
162
+ '--accent': '160 12% 95%',
163
163
  '--accent-foreground': '0 0% 12%',
164
164
  '--destructive': '0 84% 60%',
165
- '--border': '160 8% 88%',
166
- '--input': '160 8% 88%',
165
+ '--border': '160 14% 88%',
166
+ '--input': '160 14% 88%',
167
167
  '--ring': '160 84% 39%',
168
- '--sidebar': '160 10% 97%',
168
+ '--sidebar': '160 14% 97%',
169
169
  },
170
170
  dark: {
171
171
  '--background': '160 50% 5%',
@@ -194,25 +194,25 @@ export const APP_COLOR_PRESETS: Record<AppColorName, AppColorPreset> = {
194
194
  name: 'amber',
195
195
  hex: '#F59E0B',
196
196
  light: {
197
- '--background': '0 0% 99%',
197
+ '--background': '38 8% 99%',
198
198
  '--foreground': '0 0% 12%',
199
- '--surface': '38 10% 97%',
199
+ '--surface': '38 14% 97%',
200
200
  '--surface-foreground': '0 0% 12%',
201
- '--popover': '0 0% 100%',
201
+ '--popover': '38 12% 99%',
202
202
  '--popover-foreground': '0 0% 12%',
203
203
  '--primary': '38 92% 50%',
204
204
  '--primary-foreground': '0 0% 0%',
205
- '--secondary': '38 8% 95%',
205
+ '--secondary': '38 12% 95%',
206
206
  '--secondary-foreground': '0 0% 12%',
207
- '--muted': '38 8% 95%',
207
+ '--muted': '38 12% 95%',
208
208
  '--muted-foreground': '38 5% 42%',
209
- '--accent': '38 8% 95%',
209
+ '--accent': '38 12% 95%',
210
210
  '--accent-foreground': '0 0% 12%',
211
211
  '--destructive': '0 84% 60%',
212
- '--border': '38 8% 88%',
213
- '--input': '38 8% 88%',
212
+ '--border': '38 14% 88%',
213
+ '--input': '38 14% 88%',
214
214
  '--ring': '38 92% 50%',
215
- '--sidebar': '38 10% 97%',
215
+ '--sidebar': '38 14% 97%',
216
216
  },
217
217
  dark: {
218
218
  '--background': '38 50% 5%',
@@ -241,25 +241,25 @@ export const APP_COLOR_PRESETS: Record<AppColorName, AppColorPreset> = {
241
241
  name: 'yellow',
242
242
  hex: '#ffc300',
243
243
  light: {
244
- '--background': '0 0% 99%',
244
+ '--background': '46 8% 99%',
245
245
  '--foreground': '0 0% 12%',
246
- '--surface': '46 10% 97%',
246
+ '--surface': '46 14% 97%',
247
247
  '--surface-foreground': '0 0% 12%',
248
- '--popover': '0 0% 100%',
248
+ '--popover': '46 12% 99%',
249
249
  '--popover-foreground': '0 0% 12%',
250
250
  '--primary': '46 100% 50%',
251
251
  '--primary-foreground': '0 0% 0%',
252
- '--secondary': '46 8% 95%',
252
+ '--secondary': '46 12% 95%',
253
253
  '--secondary-foreground': '0 0% 12%',
254
- '--muted': '46 8% 95%',
254
+ '--muted': '46 12% 95%',
255
255
  '--muted-foreground': '46 5% 42%',
256
- '--accent': '46 8% 95%',
256
+ '--accent': '46 12% 95%',
257
257
  '--accent-foreground': '0 0% 12%',
258
258
  '--destructive': '0 84% 60%',
259
- '--border': '46 8% 88%',
260
- '--input': '46 8% 88%',
259
+ '--border': '46 14% 88%',
260
+ '--input': '46 14% 88%',
261
261
  '--ring': '46 100% 50%',
262
- '--sidebar': '46 10% 97%',
262
+ '--sidebar': '46 14% 97%',
263
263
  },
264
264
  dark: {
265
265
  '--background': '46 50% 5%',
@@ -288,25 +288,25 @@ export const APP_COLOR_PRESETS: Record<AppColorName, AppColorPreset> = {
288
288
  name: 'red',
289
289
  hex: '#EF4444',
290
290
  light: {
291
- '--background': '0 0% 99%',
291
+ '--background': '0 8% 99%',
292
292
  '--foreground': '0 0% 12%',
293
- '--surface': '0 10% 97%',
293
+ '--surface': '0 14% 97%',
294
294
  '--surface-foreground': '0 0% 12%',
295
- '--popover': '0 0% 100%',
295
+ '--popover': '0 12% 99%',
296
296
  '--popover-foreground': '0 0% 12%',
297
297
  '--primary': '0 84% 60%',
298
298
  '--primary-foreground': '0 0% 100%',
299
- '--secondary': '0 8% 95%',
299
+ '--secondary': '0 12% 95%',
300
300
  '--secondary-foreground': '0 0% 12%',
301
- '--muted': '0 8% 95%',
301
+ '--muted': '0 12% 95%',
302
302
  '--muted-foreground': '0 5% 42%',
303
- '--accent': '0 8% 95%',
303
+ '--accent': '0 12% 95%',
304
304
  '--accent-foreground': '0 0% 12%',
305
305
  '--destructive': '0 84% 60%',
306
- '--border': '0 8% 88%',
307
- '--input': '0 8% 88%',
306
+ '--border': '0 14% 88%',
307
+ '--input': '0 14% 88%',
308
308
  '--ring': '0 84% 60%',
309
- '--sidebar': '0 10% 97%',
309
+ '--sidebar': '0 14% 97%',
310
310
  },
311
311
  dark: {
312
312
  '--background': '0 50% 5%',
@@ -335,25 +335,25 @@ export const APP_COLOR_PRESETS: Record<AppColorName, AppColorPreset> = {
335
335
  name: 'purple',
336
336
  hex: '#8B5CF6',
337
337
  light: {
338
- '--background': '0 0% 99%',
338
+ '--background': '258 8% 99%',
339
339
  '--foreground': '0 0% 12%',
340
- '--surface': '258 10% 97%',
340
+ '--surface': '258 14% 97%',
341
341
  '--surface-foreground': '0 0% 12%',
342
- '--popover': '0 0% 100%',
342
+ '--popover': '258 12% 99%',
343
343
  '--popover-foreground': '0 0% 12%',
344
344
  '--primary': '258 90% 66%',
345
345
  '--primary-foreground': '0 0% 100%',
346
- '--secondary': '258 8% 95%',
346
+ '--secondary': '258 12% 95%',
347
347
  '--secondary-foreground': '0 0% 12%',
348
- '--muted': '258 8% 95%',
348
+ '--muted': '258 12% 95%',
349
349
  '--muted-foreground': '258 5% 42%',
350
- '--accent': '258 8% 95%',
350
+ '--accent': '258 12% 95%',
351
351
  '--accent-foreground': '0 0% 12%',
352
352
  '--destructive': '0 84% 60%',
353
- '--border': '258 8% 88%',
354
- '--input': '258 8% 88%',
353
+ '--border': '258 14% 88%',
354
+ '--input': '258 14% 88%',
355
355
  '--ring': '258 90% 66%',
356
- '--sidebar': '258 10% 97%',
356
+ '--sidebar': '258 14% 97%',
357
357
  },
358
358
  dark: {
359
359
  '--background': '258 50% 5%',
@@ -382,25 +382,25 @@ export const APP_COLOR_PRESETS: Record<AppColorName, AppColorPreset> = {
382
382
  name: 'pink',
383
383
  hex: '#EC4899',
384
384
  light: {
385
- '--background': '0 0% 99%',
385
+ '--background': '330 8% 99%',
386
386
  '--foreground': '0 0% 12%',
387
- '--surface': '330 10% 97%',
387
+ '--surface': '330 14% 97%',
388
388
  '--surface-foreground': '0 0% 12%',
389
- '--popover': '0 0% 100%',
389
+ '--popover': '330 12% 99%',
390
390
  '--popover-foreground': '0 0% 12%',
391
391
  '--primary': '330 81% 60%',
392
392
  '--primary-foreground': '0 0% 100%',
393
- '--secondary': '330 8% 95%',
393
+ '--secondary': '330 12% 95%',
394
394
  '--secondary-foreground': '0 0% 12%',
395
- '--muted': '330 8% 95%',
395
+ '--muted': '330 12% 95%',
396
396
  '--muted-foreground': '330 5% 42%',
397
- '--accent': '330 8% 95%',
397
+ '--accent': '330 12% 95%',
398
398
  '--accent-foreground': '0 0% 12%',
399
399
  '--destructive': '0 84% 60%',
400
- '--border': '330 8% 88%',
401
- '--input': '330 8% 88%',
400
+ '--border': '330 14% 88%',
401
+ '--input': '330 14% 88%',
402
402
  '--ring': '330 81% 60%',
403
- '--sidebar': '330 10% 97%',
403
+ '--sidebar': '330 14% 97%',
404
404
  },
405
405
  dark: {
406
406
  '--background': '330 50% 5%',
@@ -429,25 +429,25 @@ export const APP_COLOR_PRESETS: Record<AppColorName, AppColorPreset> = {
429
429
  name: 'sky',
430
430
  hex: '#0EA5E9',
431
431
  light: {
432
- '--background': '0 0% 99%',
432
+ '--background': '199 8% 99%',
433
433
  '--foreground': '0 0% 12%',
434
- '--surface': '199 10% 97%',
434
+ '--surface': '199 14% 97%',
435
435
  '--surface-foreground': '0 0% 12%',
436
- '--popover': '0 0% 100%',
436
+ '--popover': '199 12% 99%',
437
437
  '--popover-foreground': '0 0% 12%',
438
438
  '--primary': '199 89% 48%',
439
439
  '--primary-foreground': '0 0% 100%',
440
- '--secondary': '199 8% 95%',
440
+ '--secondary': '199 12% 95%',
441
441
  '--secondary-foreground': '0 0% 12%',
442
- '--muted': '199 8% 95%',
442
+ '--muted': '199 12% 95%',
443
443
  '--muted-foreground': '199 5% 42%',
444
- '--accent': '199 8% 95%',
444
+ '--accent': '199 12% 95%',
445
445
  '--accent-foreground': '0 0% 12%',
446
446
  '--destructive': '0 84% 60%',
447
- '--border': '199 8% 88%',
448
- '--input': '199 8% 88%',
447
+ '--border': '199 14% 88%',
448
+ '--input': '199 14% 88%',
449
449
  '--ring': '199 89% 48%',
450
- '--sidebar': '199 10% 97%',
450
+ '--sidebar': '199 14% 97%',
451
451
  },
452
452
  dark: {
453
453
  '--background': '199 50% 5%',
@@ -476,25 +476,25 @@ export const APP_COLOR_PRESETS: Record<AppColorName, AppColorPreset> = {
476
476
  name: 'orange',
477
477
  hex: '#F97316',
478
478
  light: {
479
- '--background': '0 0% 99%',
479
+ '--background': '25 8% 99%',
480
480
  '--foreground': '0 0% 12%',
481
- '--surface': '25 10% 97%',
481
+ '--surface': '25 14% 97%',
482
482
  '--surface-foreground': '0 0% 12%',
483
- '--popover': '0 0% 100%',
483
+ '--popover': '25 12% 99%',
484
484
  '--popover-foreground': '0 0% 12%',
485
485
  '--primary': '25 95% 53%',
486
486
  '--primary-foreground': '0 0% 100%',
487
- '--secondary': '25 8% 95%',
487
+ '--secondary': '25 12% 95%',
488
488
  '--secondary-foreground': '0 0% 12%',
489
- '--muted': '25 8% 95%',
489
+ '--muted': '25 12% 95%',
490
490
  '--muted-foreground': '25 5% 42%',
491
- '--accent': '25 8% 95%',
491
+ '--accent': '25 12% 95%',
492
492
  '--accent-foreground': '0 0% 12%',
493
493
  '--destructive': '0 84% 60%',
494
- '--border': '25 8% 88%',
495
- '--input': '25 8% 88%',
494
+ '--border': '25 14% 88%',
495
+ '--input': '25 14% 88%',
496
496
  '--ring': '25 95% 53%',
497
- '--sidebar': '25 10% 97%',
497
+ '--sidebar': '25 14% 97%',
498
498
  },
499
499
  dark: {
500
500
  '--background': '25 50% 5%',
@@ -523,25 +523,25 @@ export const APP_COLOR_PRESETS: Record<AppColorName, AppColorPreset> = {
523
523
  name: 'mint',
524
524
  hex: '#14B8A6',
525
525
  light: {
526
- '--background': '0 0% 99%',
526
+ '--background': '173 8% 99%',
527
527
  '--foreground': '0 0% 12%',
528
- '--surface': '173 10% 97%',
528
+ '--surface': '173 14% 97%',
529
529
  '--surface-foreground': '0 0% 12%',
530
- '--popover': '0 0% 100%',
530
+ '--popover': '173 12% 99%',
531
531
  '--popover-foreground': '0 0% 12%',
532
532
  '--primary': '173 80% 40%',
533
533
  '--primary-foreground': '0 0% 100%',
534
- '--secondary': '173 8% 95%',
534
+ '--secondary': '173 12% 95%',
535
535
  '--secondary-foreground': '0 0% 12%',
536
- '--muted': '173 8% 95%',
536
+ '--muted': '173 12% 95%',
537
537
  '--muted-foreground': '173 5% 42%',
538
- '--accent': '173 8% 95%',
538
+ '--accent': '173 12% 95%',
539
539
  '--accent-foreground': '0 0% 12%',
540
540
  '--destructive': '0 84% 60%',
541
- '--border': '173 8% 88%',
542
- '--input': '173 8% 88%',
541
+ '--border': '173 14% 88%',
542
+ '--input': '173 14% 88%',
543
543
  '--ring': '173 80% 40%',
544
- '--sidebar': '173 10% 97%',
544
+ '--sidebar': '173 14% 97%',
545
545
  },
546
546
  dark: {
547
547
  '--background': '173 50% 5%',
@@ -570,25 +570,25 @@ export const APP_COLOR_PRESETS: Record<AppColorName, AppColorPreset> = {
570
570
  name: 'oxy',
571
571
  hex: '#c46ede',
572
572
  light: {
573
- '--background': '0 0% 99%',
573
+ '--background': '277 8% 99%',
574
574
  '--foreground': '0 0% 12%',
575
- '--surface': '277 10% 97%',
575
+ '--surface': '277 14% 97%',
576
576
  '--surface-foreground': '0 0% 12%',
577
- '--popover': '0 0% 100%',
577
+ '--popover': '277 12% 99%',
578
578
  '--popover-foreground': '0 0% 12%',
579
579
  '--primary': '277 66% 56%',
580
580
  '--primary-foreground': '0 0% 100%',
581
- '--secondary': '277 8% 95%',
581
+ '--secondary': '277 12% 95%',
582
582
  '--secondary-foreground': '0 0% 12%',
583
- '--muted': '277 8% 95%',
583
+ '--muted': '277 12% 95%',
584
584
  '--muted-foreground': '277 5% 42%',
585
- '--accent': '277 8% 95%',
585
+ '--accent': '277 12% 95%',
586
586
  '--accent-foreground': '0 0% 12%',
587
587
  '--destructive': '0 84% 60%',
588
- '--border': '277 8% 88%',
589
- '--input': '277 8% 88%',
588
+ '--border': '277 14% 88%',
589
+ '--input': '277 14% 88%',
590
590
  '--ring': '277 66% 56%',
591
- '--sidebar': '277 10% 97%',
591
+ '--sidebar': '277 14% 97%',
592
592
  },
593
593
  dark: {
594
594
  '--background': '277 50% 5%',
@@ -616,25 +616,25 @@ export const APP_COLOR_PRESETS: Record<AppColorName, AppColorPreset> = {
616
616
  name: 'faircoin',
617
617
  hex: '#9ffb50',
618
618
  light: {
619
- '--background': '0 0% 99%',
619
+ '--background': '92 8% 99%',
620
620
  '--foreground': '0 0% 12%',
621
- '--surface': '92 12% 95%',
621
+ '--surface': '92 16% 95%',
622
622
  '--surface-foreground': '0 0% 12%',
623
- '--popover': '0 0% 100%',
623
+ '--popover': '92 12% 99%',
624
624
  '--popover-foreground': '0 0% 12%',
625
625
  '--primary': '92 90% 25%',
626
626
  '--primary-foreground': '0 0% 100%',
627
- '--secondary': '92 10% 92%',
627
+ '--secondary': '92 14% 92%',
628
628
  '--secondary-foreground': '0 0% 12%',
629
- '--muted': '92 8% 93%',
630
- '--muted-foreground': '0 0% 40%',
631
- '--accent': '92 10% 92%',
629
+ '--muted': '92 12% 93%',
630
+ '--muted-foreground': '92 5% 40%',
631
+ '--accent': '92 14% 92%',
632
632
  '--accent-foreground': '0 0% 12%',
633
633
  '--destructive': '0 84% 60%',
634
- '--border': '92 8% 85%',
635
- '--input': '92 8% 85%',
634
+ '--border': '92 12% 85%',
635
+ '--input': '92 12% 85%',
636
636
  '--ring': '92 90% 25%',
637
- '--sidebar': '92 12% 95%',
637
+ '--sidebar': '92 16% 95%',
638
638
  },
639
639
  dark: {
640
640
  '--background': '69 54% 8%',