@oxyhq/bloom 0.44.0 → 0.45.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.
- package/lib/commonjs/bottom-sheet/BottomSheetBase.js +9 -1
- package/lib/commonjs/bottom-sheet/BottomSheetBase.js.map +1 -1
- package/lib/commonjs/theme/BloomThemeProvider.js +34 -15
- package/lib/commonjs/theme/BloomThemeProvider.js.map +1 -1
- package/lib/commonjs/theme/ambient-store.js +153 -0
- package/lib/commonjs/theme/ambient-store.js.map +1 -0
- package/lib/commonjs/theme/index.js +13 -0
- package/lib/commonjs/theme/index.js.map +1 -1
- package/lib/module/bottom-sheet/BottomSheetBase.js +9 -1
- package/lib/module/bottom-sheet/BottomSheetBase.js.map +1 -1
- package/lib/module/theme/BloomThemeProvider.js +34 -15
- package/lib/module/theme/BloomThemeProvider.js.map +1 -1
- package/lib/module/theme/ambient-store.js +146 -0
- package/lib/module/theme/ambient-store.js.map +1 -0
- package/lib/module/theme/index.js +1 -0
- package/lib/module/theme/index.js.map +1 -1
- package/lib/typescript/commonjs/theme/BloomThemeProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/theme/ambient-store.d.ts +61 -0
- package/lib/typescript/commonjs/theme/ambient-store.d.ts.map +1 -0
- package/lib/typescript/commonjs/theme/index.d.ts +2 -0
- package/lib/typescript/commonjs/theme/index.d.ts.map +1 -1
- package/lib/typescript/module/theme/BloomThemeProvider.d.ts.map +1 -1
- package/lib/typescript/module/theme/ambient-store.d.ts +61 -0
- package/lib/typescript/module/theme/ambient-store.d.ts.map +1 -0
- package/lib/typescript/module/theme/index.d.ts +2 -0
- package/lib/typescript/module/theme/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/ambient-theme.test.tsx +136 -0
- package/src/bottom-sheet/BottomSheetBase.tsx +8 -0
- package/src/theme/BloomThemeProvider.tsx +52 -13
- package/src/theme/ambient-store.ts +186 -0
- package/src/theme/index.ts +7 -0
|
@@ -9,6 +9,7 @@ import React, { createContext, useCallback, useEffect, useMemo, useRef, useState
|
|
|
9
9
|
import { Platform, View, useColorScheme as useRNColorScheme } from 'react-native';
|
|
10
10
|
import { useControllableState } from "../hooks/useControllableState.js";
|
|
11
11
|
import { FontLoader } from '../fonts/FontLoader';
|
|
12
|
+
import { useAmbientThemeState } from "./ambient-store.js";
|
|
12
13
|
import { applyDarkClass, applyVarsToDocument } from "./apply-dark-class.js";
|
|
13
14
|
import { buildTheme } from "./build-theme.js";
|
|
14
15
|
import { buildThemeFromSeed } from "./build-theme-from-seed.js";
|
|
@@ -166,14 +167,32 @@ export function BloomThemeProvider({
|
|
|
166
167
|
}) {
|
|
167
168
|
const rnScheme = useRNColorScheme();
|
|
168
169
|
|
|
170
|
+
// The app-wide ambient override, driven imperatively via `useAmbientTheme()`
|
|
171
|
+
// from anywhere in the app. Subscribed through the module-level store's
|
|
172
|
+
// `useSyncExternalStore` (stable snapshot ref while unchanged → React-Compiler
|
|
173
|
+
// safe). When an ambient seed is set it OVERRIDES the static `seed` prop and
|
|
174
|
+
// the active preset; clearing it restores them.
|
|
175
|
+
const ambient = useAmbientThemeState();
|
|
176
|
+
|
|
177
|
+
// The EFFECTIVE dynamic seed + accents for this render: ambient wins over the
|
|
178
|
+
// static props. `null` ambient seed means "no override" → fall back to the
|
|
179
|
+
// `seed` prop (which itself may be undefined → preset path). When ambient is
|
|
180
|
+
// active, ambient accents replace the static accent props entirely (a null
|
|
181
|
+
// ambient accent = "no pin for this artwork colour").
|
|
182
|
+
const ambientActive = ambient.seed !== null;
|
|
183
|
+
const effectiveSeed = ambientActive ? ambient.seed ?? undefined : seed;
|
|
184
|
+
const effectiveSecondary = ambientActive ? ambient.secondary ?? undefined : secondaryColor;
|
|
185
|
+
const effectiveTertiary = ambientActive ? ambient.tertiary ?? undefined : tertiaryColor;
|
|
186
|
+
|
|
169
187
|
// The app-wide pinned accents, if any. Memoized so its identity only changes
|
|
170
|
-
// when
|
|
188
|
+
// when an accent changes (keeps the effect/memo deps below stable). Left
|
|
171
189
|
// `undefined` when neither is set so every downstream call is byte-identical
|
|
172
|
-
// to the no-accent path.
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
190
|
+
// to the no-accent path. Uses the EFFECTIVE accents so ambient accents apply
|
|
191
|
+
// to the preset path too when no ambient seed is present.
|
|
192
|
+
const explicitAccents = useMemo(() => effectiveSecondary === undefined && effectiveTertiary === undefined ? undefined : {
|
|
193
|
+
secondaryHex: effectiveSecondary,
|
|
194
|
+
tertiaryHex: effectiveTertiary
|
|
195
|
+
}, [effectiveSecondary, effectiveTertiary]);
|
|
177
196
|
const {
|
|
178
197
|
mode,
|
|
179
198
|
colorPreset,
|
|
@@ -204,16 +223,16 @@ export function BloomThemeProvider({
|
|
|
204
223
|
// (whole-app dynamic theming — `secondaryColor`/`tertiaryColor` pin this seed's
|
|
205
224
|
// accents) when `seed` is set, else the named preset. Both go through the same
|
|
206
225
|
// colour engine, so there is one code path — no seed/preset duplication.
|
|
207
|
-
const themeVars = useMemo(() =>
|
|
208
|
-
seed,
|
|
226
|
+
const themeVars = useMemo(() => effectiveSeed ? buildSeedScopeVars({
|
|
227
|
+
seed: effectiveSeed,
|
|
209
228
|
mode: resolved,
|
|
210
|
-
secondarySeed:
|
|
211
|
-
tertiarySeed:
|
|
212
|
-
}) : buildScopeVars(colorPreset, resolved, explicitAccents), [
|
|
213
|
-
const themeColors = useMemo(() =>
|
|
214
|
-
secondarySeed:
|
|
215
|
-
tertiarySeed:
|
|
216
|
-
}) : buildTheme(colorPreset, resolved, isAdaptive, explicitAccents), [
|
|
229
|
+
secondarySeed: effectiveSecondary,
|
|
230
|
+
tertiarySeed: effectiveTertiary
|
|
231
|
+
}) : buildScopeVars(colorPreset, resolved, explicitAccents), [effectiveSeed, effectiveSecondary, effectiveTertiary, colorPreset, resolved, explicitAccents]);
|
|
232
|
+
const themeColors = useMemo(() => effectiveSeed ? buildThemeFromSeed(effectiveSeed, resolved, undefined, undefined, {
|
|
233
|
+
secondarySeed: effectiveSecondary,
|
|
234
|
+
tertiarySeed: effectiveTertiary
|
|
235
|
+
}) : buildTheme(colorPreset, resolved, isAdaptive, explicitAccents), [effectiveSeed, effectiveSecondary, effectiveTertiary, colorPreset, resolved, isAdaptive, explicitAccents]);
|
|
217
236
|
useIsomorphicLayoutEffect(() => {
|
|
218
237
|
setColorSchemeSafe(effectiveMode);
|
|
219
238
|
applyDarkClass(resolved);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","createContext","useCallback","useEffect","useMemo","useRef","useState","Platform","View","useColorScheme","useRNColorScheme","useControllableState","FontLoader","applyDarkClass","applyVarsToDocument","buildTheme","buildThemeFromSeed","buildSeedScopeVars","buildScopeVars","getVariableContextProvider","applyVarsToRootVariables","readPersistedTheme","readPersistedThemeSync","removePersistedTheme","writePersistedTheme","setColorSchemeSafe","useIsomorphicLayoutEffect","jsx","_jsx","DEFAULT_PRESET","DEFAULT_MODE","BloomThemeContext","globalThis","__oxyhq_bloom_theme_context__","useThemeState","controlledMode","controlledPreset","defaultMode","defaultPreset","persistKey","storage","onModeChange","onColorPresetChange","syncResult","syncState","kind","state","initialMode","mode","initialPreset","colorPreset","hydrated","setHydrated","setModeInternal","value","defaultValue","setPresetInternal","modeRef","current","presetRef","cancelled","then","undefined","setMode","next","setColorPreset","resetTheme","BloomThemeProvider","defaultColorPreset","awaitHydration","onHydrating","fonts","onFontsLoading","nativeWrapperStyle","secondaryColor","tertiaryColor","seed","children","rnScheme","explicitAccents","secondaryHex","tertiaryHex","isAdaptive","effectiveMode","resolved","themeVars","secondarySeed","tertiarySeed","themeColors","contextValue","theme","shouldAwait","Boolean","isGated","nativeVars","OS","VariableProvider","content","enabled","fallback","Provider","nativeTree","style","flex"],"sourceRoot":"../../../src","sources":["theme/BloomThemeProvider.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA,OAAO,uBAAoB;AAE3B,OAAOA,KAAK,IACVC,aAAa,EACbC,WAAW,EAEXC,SAAS,EACTC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACH,OAAO;AACd,SACEC,QAAQ,EACRC,IAAI,EACJC,cAAc,IAAIC,gBAAgB,QAG7B,cAAc;AAErB,SAASC,oBAAoB,QAAQ,kCAA+B;AACpE,SAASC,UAAU,QAAQ,qBAAqB;AAEhD,SAASC,cAAc,EAAEC,mBAAmB,QAAQ,uBAAoB;AACxE,SAASC,UAAU,QAAQ,kBAAe;AAC1C,SAASC,kBAAkB,QAAQ,4BAAyB;AAC5D,SAASC,kBAAkB,QAAQ,6BAA0B;AAE7D,SAASC,cAAc,EAAEC,0BAA0B,QAAQ,gCAA6B;AACxF,SAASC,wBAAwB,QAAQ,oBAAoB;AAC7D,SACEC,kBAAkB,EAClBC,sBAAsB,EACtBC,oBAAoB,EACpBC,mBAAmB,QAGd,kBAAe;AAEtB,SAASC,kBAAkB,QAAQ,4BAAyB;AAC5D,SAASC,yBAAyB,QAAQ,mCAAgC;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAG3E,MAAMC,cAA4B,GAAG,KAAK;AAC1C,MAAMC,YAAuB,GAAG,QAAQ;AAuBxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,iBAA+D,GACzEC,UAAU,CAACC,6BAA6B,
|
|
1
|
+
{"version":3,"names":["React","createContext","useCallback","useEffect","useMemo","useRef","useState","Platform","View","useColorScheme","useRNColorScheme","useControllableState","FontLoader","useAmbientThemeState","applyDarkClass","applyVarsToDocument","buildTheme","buildThemeFromSeed","buildSeedScopeVars","buildScopeVars","getVariableContextProvider","applyVarsToRootVariables","readPersistedTheme","readPersistedThemeSync","removePersistedTheme","writePersistedTheme","setColorSchemeSafe","useIsomorphicLayoutEffect","jsx","_jsx","DEFAULT_PRESET","DEFAULT_MODE","BloomThemeContext","globalThis","__oxyhq_bloom_theme_context__","useThemeState","controlledMode","controlledPreset","defaultMode","defaultPreset","persistKey","storage","onModeChange","onColorPresetChange","syncResult","syncState","kind","state","initialMode","mode","initialPreset","colorPreset","hydrated","setHydrated","setModeInternal","value","defaultValue","setPresetInternal","modeRef","current","presetRef","cancelled","then","undefined","setMode","next","setColorPreset","resetTheme","BloomThemeProvider","defaultColorPreset","awaitHydration","onHydrating","fonts","onFontsLoading","nativeWrapperStyle","secondaryColor","tertiaryColor","seed","children","rnScheme","ambient","ambientActive","effectiveSeed","effectiveSecondary","secondary","effectiveTertiary","tertiary","explicitAccents","secondaryHex","tertiaryHex","isAdaptive","effectiveMode","resolved","themeVars","secondarySeed","tertiarySeed","themeColors","contextValue","theme","shouldAwait","Boolean","isGated","nativeVars","OS","VariableProvider","content","enabled","fallback","Provider","nativeTree","style","flex"],"sourceRoot":"../../../src","sources":["theme/BloomThemeProvider.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useSyncExternalStore } from 'react';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The current ambient theme override. When `seed` is non-null the whole app is
|
|
7
|
+
* themed from this dynamic seed (same colour engine the `seed` prop uses),
|
|
8
|
+
* overriding the active preset / static `seed` prop. `secondary`/`tertiary` pin
|
|
9
|
+
* this seed's accent families (e.g. the 2nd/3rd colours extracted from artwork).
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** Options for {@link useAmbientTheme}. */
|
|
13
|
+
|
|
14
|
+
const DEFAULT_DEBOUNCE_MS = 120;
|
|
15
|
+
|
|
16
|
+
// A single frozen "no override" snapshot. `getSnapshot` returns this EXACT
|
|
17
|
+
// reference whenever nothing is set, so `useSyncExternalStore` sees a stable
|
|
18
|
+
// identity across renders (React-Compiler-safe: the memoized value never
|
|
19
|
+
// silently goes stale because the snapshot ref only changes on a real commit).
|
|
20
|
+
const EMPTY_STATE = Object.freeze({
|
|
21
|
+
seed: null,
|
|
22
|
+
secondary: null,
|
|
23
|
+
tertiary: null
|
|
24
|
+
});
|
|
25
|
+
let state = EMPTY_STATE;
|
|
26
|
+
const listeners = new Set();
|
|
27
|
+
|
|
28
|
+
// Pending debounced commit. `null` operation means "clear".
|
|
29
|
+
let pendingTimer = null;
|
|
30
|
+
let pendingCommit = null;
|
|
31
|
+
function emit() {
|
|
32
|
+
for (const listener of listeners) listener();
|
|
33
|
+
}
|
|
34
|
+
function commit(next) {
|
|
35
|
+
// Skip a no-op commit so subscribers don't re-render for an identical value.
|
|
36
|
+
if (next.seed === state.seed && next.secondary === state.secondary && next.tertiary === state.tertiary) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
state = next;
|
|
40
|
+
emit();
|
|
41
|
+
}
|
|
42
|
+
function schedule(next, debounceMs) {
|
|
43
|
+
if (pendingTimer !== null) {
|
|
44
|
+
clearTimeout(pendingTimer);
|
|
45
|
+
pendingTimer = null;
|
|
46
|
+
}
|
|
47
|
+
const run = () => {
|
|
48
|
+
pendingTimer = null;
|
|
49
|
+
pendingCommit = null;
|
|
50
|
+
commit(next);
|
|
51
|
+
};
|
|
52
|
+
if (debounceMs <= 0) {
|
|
53
|
+
run();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
pendingCommit = run;
|
|
57
|
+
pendingTimer = setTimeout(run, debounceMs);
|
|
58
|
+
pendingTimer.unref?.();
|
|
59
|
+
}
|
|
60
|
+
function subscribe(listener) {
|
|
61
|
+
listeners.add(listener);
|
|
62
|
+
return () => {
|
|
63
|
+
listeners.delete(listener);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function getSnapshot() {
|
|
67
|
+
return state;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Internal setter used by the debounced hook API. */
|
|
71
|
+
function setAmbientInternal(seed, accents, debounceMs) {
|
|
72
|
+
schedule({
|
|
73
|
+
seed,
|
|
74
|
+
secondary: accents?.secondary ?? null,
|
|
75
|
+
tertiary: accents?.tertiary ?? null
|
|
76
|
+
}, debounceMs);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Internal clear used by the debounced hook API. */
|
|
80
|
+
function clearAmbientInternal(debounceMs) {
|
|
81
|
+
schedule(EMPTY_STATE, debounceMs);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Read + drive the app-wide ambient theme. Reading returns the current override
|
|
86
|
+
* (via `useSyncExternalStore` — stable snapshot ref while unchanged); the
|
|
87
|
+
* returned `setAmbient`/`clearAmbient` are debounced imperative controls.
|
|
88
|
+
*
|
|
89
|
+
* `BloomThemeProvider` consumes the SAME store internally, so calling
|
|
90
|
+
* `setAmbient(...)` from anywhere themes the whole app through the provider's
|
|
91
|
+
* single apply path — no `seed` prop threading, no app-owned theming store.
|
|
92
|
+
*/
|
|
93
|
+
export function useAmbientTheme(options) {
|
|
94
|
+
const debounceMs = options?.debounceMs ?? DEFAULT_DEBOUNCE_MS;
|
|
95
|
+
const current = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
96
|
+
return {
|
|
97
|
+
seed: current.seed,
|
|
98
|
+
secondary: current.secondary,
|
|
99
|
+
tertiary: current.tertiary,
|
|
100
|
+
setAmbient: (seed, accents) => setAmbientInternal(seed, accents, debounceMs),
|
|
101
|
+
clearAmbient: () => clearAmbientInternal(debounceMs)
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Provider-side subscription. Returns the current ambient state with a stable
|
|
107
|
+
* ref while unchanged. Uses the same store, so it stays in lockstep with any
|
|
108
|
+
* `useAmbientTheme()` caller.
|
|
109
|
+
*/
|
|
110
|
+
export function useAmbientThemeState() {
|
|
111
|
+
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Non-hook imperative escape hatch (e.g. gesture handlers / worklets bridges /
|
|
116
|
+
* non-React callers). Same debounced store as {@link useAmbientTheme}.
|
|
117
|
+
*/
|
|
118
|
+
export const ambientTheme = {
|
|
119
|
+
setAmbient: (seed, accents) => setAmbientInternal(seed, accents, DEFAULT_DEBOUNCE_MS),
|
|
120
|
+
clearAmbient: () => clearAmbientInternal(DEFAULT_DEBOUNCE_MS),
|
|
121
|
+
getState: getSnapshot
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/** Test-only: flush any pending debounced commit synchronously. */
|
|
125
|
+
export function __flushAmbientForTests() {
|
|
126
|
+
if (pendingCommit) {
|
|
127
|
+
if (pendingTimer !== null) {
|
|
128
|
+
clearTimeout(pendingTimer);
|
|
129
|
+
pendingTimer = null;
|
|
130
|
+
}
|
|
131
|
+
const run = pendingCommit;
|
|
132
|
+
pendingCommit = null;
|
|
133
|
+
run();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** Test-only: reset the store to the empty state without notifying via debounce. */
|
|
138
|
+
export function __resetAmbientForTests() {
|
|
139
|
+
if (pendingTimer !== null) {
|
|
140
|
+
clearTimeout(pendingTimer);
|
|
141
|
+
pendingTimer = null;
|
|
142
|
+
}
|
|
143
|
+
pendingCommit = null;
|
|
144
|
+
commit(EMPTY_STATE);
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=ambient-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useSyncExternalStore","DEFAULT_DEBOUNCE_MS","EMPTY_STATE","Object","freeze","seed","secondary","tertiary","state","listeners","Set","pendingTimer","pendingCommit","emit","listener","commit","next","schedule","debounceMs","clearTimeout","run","setTimeout","unref","subscribe","add","delete","getSnapshot","setAmbientInternal","accents","clearAmbientInternal","useAmbientTheme","options","current","setAmbient","clearAmbient","useAmbientThemeState","ambientTheme","getState","__flushAmbientForTests","__resetAmbientForTests"],"sourceRoot":"../../../src","sources":["theme/ambient-store.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -12,6 +12,7 @@ export { buildTheme, STATUS_COLORS } from "./build-theme.js";
|
|
|
12
12
|
export { buildThemeFromSeed, buildColorsFromSeed } from "./build-theme-from-seed.js";
|
|
13
13
|
export { THEME_GRADIENTS } from "./gradients.js";
|
|
14
14
|
export { useTheme, useThemeColor, useBloomTheme } from "./use-theme.js";
|
|
15
|
+
export { useAmbientTheme, ambientTheme } from "./ambient-store.js";
|
|
15
16
|
export { useNavigationTheme } from "./use-navigation-theme.js";
|
|
16
17
|
export { APP_COLOR_NAMES, PREMIUM_COLOR_NAMES, APP_COLOR_PRESETS, HEX_TO_APP_COLOR, hexToAppColorName } from "./color-presets.js";
|
|
17
18
|
export { parseRgb, withAlpha } from "./color-utils.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BloomThemeProvider","BloomColorScope","useColorScopeStyle","BloomSeedScope","buildSeedScopeVars","roleColorsToPresetTokens","generateRoleColors","seedHexFromImagePixels","seedsFromImagePixels","quantizeImage","argbFromHex","hexFromArgb","argbFromRgb","redFromArgb","greenFromArgb","blueFromArgb","buildTheme","STATUS_COLORS","buildThemeFromSeed","buildColorsFromSeed","THEME_GRADIENTS","useTheme","useThemeColor","useBloomTheme","useNavigationTheme","APP_COLOR_NAMES","PREMIUM_COLOR_NAMES","APP_COLOR_PRESETS","HEX_TO_APP_COLOR","hexToAppColorName","parseRgb","withAlpha","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,cAAc,QAAQ,cAAc;AAE7C,SAASC,kBAAkB,EAAEC,wBAAwB,QAAQ,6BAA0B;AAEvF;AACA;AACA;AACA,SACEC,kBAAkB,EAClBC,sBAAsB,EACtBC,oBAAoB,EACpBC,aAAa,EACbC,WAAW,EACXC,WAAW,EACXC,WAAW,EACXC,WAAW,EACXC,aAAa,EACbC,YAAY,QACP,yBAAgB;AAEvB,SAASC,UAAU,EAAEC,aAAa,QAAQ,kBAAe;AACzD,SAASC,kBAAkB,EAAEC,mBAAmB,QAAQ,4BAAyB;AAEjF,SAASC,eAAe,QAAQ,gBAAa;AAC7C,SAASC,QAAQ,EAAEC,aAAa,EAAEC,aAAa,QAAQ,gBAAa;AACpE,SAASC,kBAAkB,QAAQ,2BAAwB;AAI3D,SACEC,eAAe,EACfC,mBAAmB,EACnBC,iBAAiB,EACjBC,gBAAgB,EAChBC,iBAAiB,QACZ,oBAAiB;AACxB,SAASC,QAAQ,EAAEC,SAAS,QAAQ,kBAAe;AAEnD,SAASC,aAAa,EAAEC,yBAAyB,QAAQ,kBAAe;AAExE,SAASC,cAAc,QAAQ,uBAAoB;AACnD,SAASC,kBAAkB,QAAQ,4BAAyB;AAC5D,SAASC,sBAAsB,QAAQ,uBAAoB;AAE3D,SAASC,eAAe,QAAQ,kBAAe","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["BloomThemeProvider","BloomColorScope","useColorScopeStyle","BloomSeedScope","buildSeedScopeVars","roleColorsToPresetTokens","generateRoleColors","seedHexFromImagePixels","seedsFromImagePixels","quantizeImage","argbFromHex","hexFromArgb","argbFromRgb","redFromArgb","greenFromArgb","blueFromArgb","buildTheme","STATUS_COLORS","buildThemeFromSeed","buildColorsFromSeed","THEME_GRADIENTS","useTheme","useThemeColor","useBloomTheme","useAmbientTheme","ambientTheme","useNavigationTheme","APP_COLOR_NAMES","PREMIUM_COLOR_NAMES","APP_COLOR_PRESETS","HEX_TO_APP_COLOR","hexToAppColorName","parseRgb","withAlpha","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,cAAc,QAAQ,cAAc;AAE7C,SAASC,kBAAkB,EAAEC,wBAAwB,QAAQ,6BAA0B;AAEvF;AACA;AACA;AACA,SACEC,kBAAkB,EAClBC,sBAAsB,EACtBC,oBAAoB,EACpBC,aAAa,EACbC,WAAW,EACXC,WAAW,EACXC,WAAW,EACXC,WAAW,EACXC,aAAa,EACbC,YAAY,QACP,yBAAgB;AAEvB,SAASC,UAAU,EAAEC,aAAa,QAAQ,kBAAe;AACzD,SAASC,kBAAkB,EAAEC,mBAAmB,QAAQ,4BAAyB;AAEjF,SAASC,eAAe,QAAQ,gBAAa;AAC7C,SAASC,QAAQ,EAAEC,aAAa,EAAEC,aAAa,QAAQ,gBAAa;AACpE,SAASC,eAAe,EAAEC,YAAY,QAAQ,oBAAiB;AAO/D,SAASC,kBAAkB,QAAQ,2BAAwB;AAI3D,SACEC,eAAe,EACfC,mBAAmB,EACnBC,iBAAiB,EACjBC,gBAAgB,EAChBC,iBAAiB,QACZ,oBAAiB;AACxB,SAASC,QAAQ,EAAEC,SAAS,QAAQ,kBAAe;AAEnD,SAASC,aAAa,EAAEC,yBAAyB,QAAQ,kBAAe;AAExE,SAASC,cAAc,QAAQ,uBAAoB;AACnD,SAASC,kBAAkB,QAAQ,4BAAyB;AAC5D,SAASC,sBAAsB,QAAQ,uBAAoB;AAE3D,SAASC,eAAe,QAAQ,kBAAe","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BloomThemeProvider.d.ts","sourceRoot":"","sources":["../../../../src/theme/BloomThemeProvider.tsx"],"names":[],"mappings":"AAIA,OAAO,oBAAoB,CAAC;AAE5B,OAAO,KAQN,MAAM,OAAO,CAAC;AACf,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"BloomThemeProvider.d.ts","sourceRoot":"","sources":["../../../../src/theme/BloomThemeProvider.tsx"],"names":[],"mappings":"AAIA,OAAO,oBAAoB,CAAC;AAE5B,OAAO,KAQN,MAAM,OAAO,CAAC;AACf,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAWtB,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,EAKL,KAAK,iBAAiB,EAEvB,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAKhD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,YAAY,CAAC;IAC1B,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACnC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/C;;;;OAIG;IACH,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,6BAA6B,EAC7B,KAAK,CAAC,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,GAC5C,SAAS,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAEpB,CAAC;AAExD,MAAM,WAAW,uBAAuB;IACtC,uFAAuF;IACvF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,mEAAmE;IACnE,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,mEAAmE;IACnE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,YAAY,CAAC;IAElC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAErD;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE9B,2DAA2D;IAC3D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wDAAwD;IACxD,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEjC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAE1C;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAkJD,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EAAE,cAAc,EACpB,WAAW,EAAE,gBAAgB,EAC7B,WAA0B,EAC1B,kBAAmC,EACnC,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,OAAO,EACP,cAAc,EACd,WAAW,EACX,KAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,IAAI,EACJ,QAAQ,GACT,EAAE,uBAAuB,2CA+JzB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The current ambient theme override. When `seed` is non-null the whole app is
|
|
3
|
+
* themed from this dynamic seed (same colour engine the `seed` prop uses),
|
|
4
|
+
* overriding the active preset / static `seed` prop. `secondary`/`tertiary` pin
|
|
5
|
+
* this seed's accent families (e.g. the 2nd/3rd colours extracted from artwork).
|
|
6
|
+
*/
|
|
7
|
+
export interface AmbientThemeState {
|
|
8
|
+
readonly seed: string | null;
|
|
9
|
+
readonly secondary: string | null;
|
|
10
|
+
readonly tertiary: string | null;
|
|
11
|
+
}
|
|
12
|
+
export interface AmbientAccents {
|
|
13
|
+
secondary?: string | null;
|
|
14
|
+
tertiary?: string | null;
|
|
15
|
+
}
|
|
16
|
+
export interface AmbientThemeApi {
|
|
17
|
+
/**
|
|
18
|
+
* Set the ambient seed (and optional accents). Coalesced through an internal
|
|
19
|
+
* debounce so rapid hover/scroll doesn't thrash the theme. The debounce lives
|
|
20
|
+
* HERE — apps never own one.
|
|
21
|
+
*/
|
|
22
|
+
setAmbient: (seed: string, accents?: AmbientAccents) => void;
|
|
23
|
+
/** Clear the ambient override, restoring the preset (or the static `seed` prop). */
|
|
24
|
+
clearAmbient: () => void;
|
|
25
|
+
}
|
|
26
|
+
/** Options for {@link useAmbientTheme}. */
|
|
27
|
+
export interface UseAmbientThemeOptions {
|
|
28
|
+
/**
|
|
29
|
+
* Debounce, in ms, applied to `setAmbient`/`clearAmbient` before the store
|
|
30
|
+
* commits. Default `120`. Pass `0` to apply synchronously.
|
|
31
|
+
*/
|
|
32
|
+
debounceMs?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Read + drive the app-wide ambient theme. Reading returns the current override
|
|
36
|
+
* (via `useSyncExternalStore` — stable snapshot ref while unchanged); the
|
|
37
|
+
* returned `setAmbient`/`clearAmbient` are debounced imperative controls.
|
|
38
|
+
*
|
|
39
|
+
* `BloomThemeProvider` consumes the SAME store internally, so calling
|
|
40
|
+
* `setAmbient(...)` from anywhere themes the whole app through the provider's
|
|
41
|
+
* single apply path — no `seed` prop threading, no app-owned theming store.
|
|
42
|
+
*/
|
|
43
|
+
export declare function useAmbientTheme(options?: UseAmbientThemeOptions): AmbientThemeState & AmbientThemeApi;
|
|
44
|
+
/**
|
|
45
|
+
* Provider-side subscription. Returns the current ambient state with a stable
|
|
46
|
+
* ref while unchanged. Uses the same store, so it stays in lockstep with any
|
|
47
|
+
* `useAmbientTheme()` caller.
|
|
48
|
+
*/
|
|
49
|
+
export declare function useAmbientThemeState(): AmbientThemeState;
|
|
50
|
+
/**
|
|
51
|
+
* Non-hook imperative escape hatch (e.g. gesture handlers / worklets bridges /
|
|
52
|
+
* non-React callers). Same debounced store as {@link useAmbientTheme}.
|
|
53
|
+
*/
|
|
54
|
+
export declare const ambientTheme: AmbientThemeApi & {
|
|
55
|
+
getState: () => AmbientThemeState;
|
|
56
|
+
};
|
|
57
|
+
/** Test-only: flush any pending debounced commit synchronously. */
|
|
58
|
+
export declare function __flushAmbientForTests(): void;
|
|
59
|
+
/** Test-only: reset the store to the empty state without notifying via debounce. */
|
|
60
|
+
export declare function __resetAmbientForTests(): void;
|
|
61
|
+
//# sourceMappingURL=ambient-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ambient-store.d.ts","sourceRoot":"","sources":["../../../../src/theme/ambient-store.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7D,oFAAoF;IACpF,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAqFD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,CAAC,EAAE,sBAAsB,GAC/B,iBAAiB,GAAG,eAAe,CAUrC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAExD;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,eAAe,GAAG;IAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;CAI/E,CAAC;AAEF,mEAAmE;AACnE,wBAAgB,sBAAsB,IAAI,IAAI,CAU7C;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,IAAI,IAAI,CAO7C"}
|
|
@@ -13,6 +13,8 @@ export { buildThemeFromSeed, buildColorsFromSeed } from './build-theme-from-seed
|
|
|
13
13
|
export type { SeedAccents } from './build-theme-from-seed';
|
|
14
14
|
export { THEME_GRADIENTS } from './gradients';
|
|
15
15
|
export { useTheme, useThemeColor, useBloomTheme } from './use-theme';
|
|
16
|
+
export { useAmbientTheme, ambientTheme } from './ambient-store';
|
|
17
|
+
export type { AmbientThemeState, AmbientThemeApi, AmbientAccents, UseAmbientThemeOptions, } from './ambient-store';
|
|
16
18
|
export { useNavigationTheme } from './use-navigation-theme';
|
|
17
19
|
export type { NavigationTheme, NavigationThemeFont } from './use-navigation-theme';
|
|
18
20
|
export type { Theme, ThemeColors, ThemeMode, ThemeGradient, ThemeGradients } from './types';
|
|
@@ -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,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACxF,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAIjE,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,EACb,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAClF,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACnF,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5F,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,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AACzE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,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"}
|
|
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,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACxF,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAIjE,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,EACb,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAClF,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAChE,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACnF,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5F,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,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AACzE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BloomThemeProvider.d.ts","sourceRoot":"","sources":["../../../../src/theme/BloomThemeProvider.tsx"],"names":[],"mappings":"AAIA,OAAO,oBAAoB,CAAC;AAE5B,OAAO,KAQN,MAAM,OAAO,CAAC;AACf,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"BloomThemeProvider.d.ts","sourceRoot":"","sources":["../../../../src/theme/BloomThemeProvider.tsx"],"names":[],"mappings":"AAIA,OAAO,oBAAoB,CAAC;AAE5B,OAAO,KAQN,MAAM,OAAO,CAAC;AACf,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAWtB,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,EAKL,KAAK,iBAAiB,EAEvB,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAKhD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,YAAY,CAAC;IAC1B,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACnC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/C;;;;OAIG;IACH,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,6BAA6B,EAC7B,KAAK,CAAC,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,GAC5C,SAAS,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAEpB,CAAC;AAExD,MAAM,WAAW,uBAAuB;IACtC,uFAAuF;IACvF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,mEAAmE;IACnE,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,mEAAmE;IACnE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,YAAY,CAAC;IAElC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAErD;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE9B,2DAA2D;IAC3D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wDAAwD;IACxD,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEjC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAE1C;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAkJD,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EAAE,cAAc,EACpB,WAAW,EAAE,gBAAgB,EAC7B,WAA0B,EAC1B,kBAAmC,EACnC,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,OAAO,EACP,cAAc,EACd,WAAW,EACX,KAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,IAAI,EACJ,QAAQ,GACT,EAAE,uBAAuB,2CA+JzB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The current ambient theme override. When `seed` is non-null the whole app is
|
|
3
|
+
* themed from this dynamic seed (same colour engine the `seed` prop uses),
|
|
4
|
+
* overriding the active preset / static `seed` prop. `secondary`/`tertiary` pin
|
|
5
|
+
* this seed's accent families (e.g. the 2nd/3rd colours extracted from artwork).
|
|
6
|
+
*/
|
|
7
|
+
export interface AmbientThemeState {
|
|
8
|
+
readonly seed: string | null;
|
|
9
|
+
readonly secondary: string | null;
|
|
10
|
+
readonly tertiary: string | null;
|
|
11
|
+
}
|
|
12
|
+
export interface AmbientAccents {
|
|
13
|
+
secondary?: string | null;
|
|
14
|
+
tertiary?: string | null;
|
|
15
|
+
}
|
|
16
|
+
export interface AmbientThemeApi {
|
|
17
|
+
/**
|
|
18
|
+
* Set the ambient seed (and optional accents). Coalesced through an internal
|
|
19
|
+
* debounce so rapid hover/scroll doesn't thrash the theme. The debounce lives
|
|
20
|
+
* HERE — apps never own one.
|
|
21
|
+
*/
|
|
22
|
+
setAmbient: (seed: string, accents?: AmbientAccents) => void;
|
|
23
|
+
/** Clear the ambient override, restoring the preset (or the static `seed` prop). */
|
|
24
|
+
clearAmbient: () => void;
|
|
25
|
+
}
|
|
26
|
+
/** Options for {@link useAmbientTheme}. */
|
|
27
|
+
export interface UseAmbientThemeOptions {
|
|
28
|
+
/**
|
|
29
|
+
* Debounce, in ms, applied to `setAmbient`/`clearAmbient` before the store
|
|
30
|
+
* commits. Default `120`. Pass `0` to apply synchronously.
|
|
31
|
+
*/
|
|
32
|
+
debounceMs?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Read + drive the app-wide ambient theme. Reading returns the current override
|
|
36
|
+
* (via `useSyncExternalStore` — stable snapshot ref while unchanged); the
|
|
37
|
+
* returned `setAmbient`/`clearAmbient` are debounced imperative controls.
|
|
38
|
+
*
|
|
39
|
+
* `BloomThemeProvider` consumes the SAME store internally, so calling
|
|
40
|
+
* `setAmbient(...)` from anywhere themes the whole app through the provider's
|
|
41
|
+
* single apply path — no `seed` prop threading, no app-owned theming store.
|
|
42
|
+
*/
|
|
43
|
+
export declare function useAmbientTheme(options?: UseAmbientThemeOptions): AmbientThemeState & AmbientThemeApi;
|
|
44
|
+
/**
|
|
45
|
+
* Provider-side subscription. Returns the current ambient state with a stable
|
|
46
|
+
* ref while unchanged. Uses the same store, so it stays in lockstep with any
|
|
47
|
+
* `useAmbientTheme()` caller.
|
|
48
|
+
*/
|
|
49
|
+
export declare function useAmbientThemeState(): AmbientThemeState;
|
|
50
|
+
/**
|
|
51
|
+
* Non-hook imperative escape hatch (e.g. gesture handlers / worklets bridges /
|
|
52
|
+
* non-React callers). Same debounced store as {@link useAmbientTheme}.
|
|
53
|
+
*/
|
|
54
|
+
export declare const ambientTheme: AmbientThemeApi & {
|
|
55
|
+
getState: () => AmbientThemeState;
|
|
56
|
+
};
|
|
57
|
+
/** Test-only: flush any pending debounced commit synchronously. */
|
|
58
|
+
export declare function __flushAmbientForTests(): void;
|
|
59
|
+
/** Test-only: reset the store to the empty state without notifying via debounce. */
|
|
60
|
+
export declare function __resetAmbientForTests(): void;
|
|
61
|
+
//# sourceMappingURL=ambient-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ambient-store.d.ts","sourceRoot":"","sources":["../../../../src/theme/ambient-store.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7D,oFAAoF;IACpF,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAqFD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,CAAC,EAAE,sBAAsB,GAC/B,iBAAiB,GAAG,eAAe,CAUrC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAExD;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,eAAe,GAAG;IAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;CAI/E,CAAC;AAEF,mEAAmE;AACnE,wBAAgB,sBAAsB,IAAI,IAAI,CAU7C;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,IAAI,IAAI,CAO7C"}
|
|
@@ -13,6 +13,8 @@ export { buildThemeFromSeed, buildColorsFromSeed } from './build-theme-from-seed
|
|
|
13
13
|
export type { SeedAccents } from './build-theme-from-seed';
|
|
14
14
|
export { THEME_GRADIENTS } from './gradients';
|
|
15
15
|
export { useTheme, useThemeColor, useBloomTheme } from './use-theme';
|
|
16
|
+
export { useAmbientTheme, ambientTheme } from './ambient-store';
|
|
17
|
+
export type { AmbientThemeState, AmbientThemeApi, AmbientAccents, UseAmbientThemeOptions, } from './ambient-store';
|
|
16
18
|
export { useNavigationTheme } from './use-navigation-theme';
|
|
17
19
|
export type { NavigationTheme, NavigationThemeFont } from './use-navigation-theme';
|
|
18
20
|
export type { Theme, ThemeColors, ThemeMode, ThemeGradient, ThemeGradients } from './types';
|
|
@@ -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,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACxF,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAIjE,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,EACb,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAClF,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACnF,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5F,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,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AACzE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,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"}
|
|
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,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACxF,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAIjE,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,EACb,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAClF,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAChE,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACnF,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5F,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,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AACzE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,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"}
|