@oxyhq/bloom 0.78.0 → 0.79.1
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/README.md +3 -3
- package/lib/commonjs/provider/index.js +11 -7
- package/lib/commonjs/provider/index.js.map +1 -1
- package/lib/commonjs/scroll/context.js +96 -0
- package/lib/commonjs/scroll/context.js.map +1 -0
- package/lib/commonjs/scroll/expo-router/index.js +133 -0
- package/lib/commonjs/scroll/expo-router/index.js.map +1 -0
- package/lib/commonjs/scroll/index.js +85 -21
- package/lib/commonjs/scroll/index.js.map +1 -1
- package/lib/commonjs/scroll/index.web.js +184 -118
- package/lib/commonjs/scroll/index.web.js.map +1 -1
- package/lib/commonjs/scroll/scrollable.native.js +58 -0
- package/lib/commonjs/scroll/scrollable.native.js.map +1 -0
- package/lib/commonjs/scroll/store.js +47 -25
- package/lib/commonjs/scroll/store.js.map +1 -1
- package/lib/commonjs/theme/color-policy.js +11 -9
- package/lib/commonjs/theme/color-policy.js.map +1 -1
- package/lib/module/provider/index.js +10 -6
- package/lib/module/provider/index.js.map +1 -1
- package/lib/module/scroll/context.js +90 -0
- package/lib/module/scroll/context.js.map +1 -0
- package/lib/module/scroll/expo-router/index.js +128 -0
- package/lib/module/scroll/expo-router/index.js.map +1 -0
- package/lib/module/scroll/index.js +80 -21
- package/lib/module/scroll/index.js.map +1 -1
- package/lib/module/scroll/index.web.js +181 -119
- package/lib/module/scroll/index.web.js.map +1 -1
- package/lib/module/scroll/scrollable.native.js +54 -0
- package/lib/module/scroll/scrollable.native.js.map +1 -0
- package/lib/module/scroll/store.js +47 -25
- package/lib/module/scroll/store.js.map +1 -1
- package/lib/module/theme/color-policy.js +11 -9
- package/lib/module/theme/color-policy.js.map +1 -1
- package/lib/typescript/commonjs/provider/index.d.ts +7 -5
- package/lib/typescript/commonjs/provider/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/scroll/context.d.ts +14 -0
- package/lib/typescript/commonjs/scroll/context.d.ts.map +1 -0
- package/lib/typescript/commonjs/scroll/expo-router/index.d.ts +7 -0
- package/lib/typescript/commonjs/scroll/expo-router/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/scroll/index.d.ts +14 -23
- package/lib/typescript/commonjs/scroll/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/scroll/index.web.d.ts +17 -19
- package/lib/typescript/commonjs/scroll/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/scroll/scrollable.native.d.ts +23 -0
- package/lib/typescript/commonjs/scroll/scrollable.native.d.ts.map +1 -0
- package/lib/typescript/commonjs/scroll/store.d.ts +41 -22
- package/lib/typescript/commonjs/scroll/store.d.ts.map +1 -1
- package/lib/typescript/commonjs/scroll/types.d.ts +82 -12
- package/lib/typescript/commonjs/scroll/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/theme/color-policy.d.ts.map +1 -1
- package/lib/typescript/module/provider/index.d.ts +7 -5
- package/lib/typescript/module/provider/index.d.ts.map +1 -1
- package/lib/typescript/module/scroll/context.d.ts +14 -0
- package/lib/typescript/module/scroll/context.d.ts.map +1 -0
- package/lib/typescript/module/scroll/expo-router/index.d.ts +7 -0
- package/lib/typescript/module/scroll/expo-router/index.d.ts.map +1 -0
- package/lib/typescript/module/scroll/index.d.ts +14 -23
- package/lib/typescript/module/scroll/index.d.ts.map +1 -1
- package/lib/typescript/module/scroll/index.web.d.ts +17 -19
- package/lib/typescript/module/scroll/index.web.d.ts.map +1 -1
- package/lib/typescript/module/scroll/scrollable.native.d.ts +23 -0
- package/lib/typescript/module/scroll/scrollable.native.d.ts.map +1 -0
- package/lib/typescript/module/scroll/store.d.ts +41 -22
- package/lib/typescript/module/scroll/store.d.ts.map +1 -1
- package/lib/typescript/module/scroll/types.d.ts +82 -12
- package/lib/typescript/module/scroll/types.d.ts.map +1 -1
- package/lib/typescript/module/theme/color-policy.d.ts.map +1 -1
- package/package.json +15 -1
- package/src/__tests__/BloomProvider.web.test.tsx +8 -15
- package/src/__tests__/optional-peer-imports.test.ts +2 -2
- package/src/__tests__/scroll-expo-router-adapter.test.tsx +164 -0
- package/src/__tests__/scroll-native.test.tsx +465 -0
- package/src/__tests__/scroll-store.test.ts +41 -17
- package/src/__tests__/scroll-web.test.tsx +547 -111
- package/src/provider/index.tsx +10 -7
- package/src/scroll/context.tsx +107 -0
- package/src/scroll/expo-router/index.ts +140 -0
- package/src/scroll/index.ts +92 -25
- package/src/scroll/index.web.tsx +219 -162
- package/src/scroll/scrollable.native.ts +64 -0
- package/src/scroll/store.ts +47 -25
- package/src/scroll/types.ts +82 -12
- package/src/theme/__tests__/__fixtures__/golden-resolved-tokens.json +27 -27
- package/src/theme/__tests__/__snapshots__/visual-gallery.test.tsx.snap +55 -55
- package/src/theme/__tests__/policy-legibility.test.ts +21 -1
- package/src/theme/color-policy.ts +13 -9
- package/lib/commonjs/provider/scroll-provider.js +0 -13
- package/lib/commonjs/provider/scroll-provider.js.map +0 -1
- package/lib/commonjs/provider/scroll-provider.web.js +0 -13
- package/lib/commonjs/provider/scroll-provider.web.js.map +0 -1
- package/lib/module/provider/scroll-provider.js +0 -16
- package/lib/module/provider/scroll-provider.js.map +0 -1
- package/lib/module/provider/scroll-provider.web.js +0 -5
- package/lib/module/provider/scroll-provider.web.js.map +0 -1
- package/lib/typescript/commonjs/provider/scroll-provider.d.ts +0 -14
- package/lib/typescript/commonjs/provider/scroll-provider.d.ts.map +0 -1
- package/lib/typescript/commonjs/provider/scroll-provider.web.d.ts +0 -3
- package/lib/typescript/commonjs/provider/scroll-provider.web.d.ts.map +0 -1
- package/lib/typescript/module/provider/scroll-provider.d.ts +0 -14
- package/lib/typescript/module/provider/scroll-provider.d.ts.map +0 -1
- package/lib/typescript/module/provider/scroll-provider.web.d.ts +0 -3
- package/lib/typescript/module/provider/scroll-provider.web.d.ts.map +0 -1
- package/src/__tests__/scroll-native.test.ts +0 -25
- package/src/provider/scroll-provider.ts +0 -13
- package/src/provider/scroll-provider.web.ts +0 -2
package/src/scroll/store.ts
CHANGED
|
@@ -3,16 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This file deliberately contains NO React and NO DOM/native imports so the
|
|
5
5
|
* logic can be unit-tested in isolation and shared verbatim by the web and
|
|
6
|
-
* native barrels.
|
|
7
|
-
* native barrel never instantiates it (native-stack already restores scroll).
|
|
6
|
+
* native barrels.
|
|
8
7
|
*/
|
|
9
|
-
|
|
10
8
|
/**
|
|
11
|
-
* Separator between the
|
|
12
|
-
* sub-key. A route may host more than one independently-scrolling list (e.g.
|
|
13
|
-
* a tabbed profile screen), so each list contributes its own sub-key.
|
|
9
|
+
* Separator between the two components of a storage key.
|
|
14
10
|
*
|
|
15
|
-
* `\0` (NUL) can never appear in a
|
|
11
|
+
* `\0` (NUL) can never appear in a router-derived content id or in a
|
|
16
12
|
* developer-authored sub-key, so it is collision-free as a delimiter. It is
|
|
17
13
|
* written as an escape sequence (not a literal byte) so the source stays
|
|
18
14
|
* text-diffable.
|
|
@@ -20,31 +16,51 @@
|
|
|
20
16
|
const COMPOSITE_KEY_SEPARATOR = '\0';
|
|
21
17
|
|
|
22
18
|
/**
|
|
23
|
-
* Derive the storage key for a scrollable from its
|
|
24
|
-
* optional caller sub-key.
|
|
19
|
+
* Derive the storage key for a scrollable from WHAT its screen is showing plus
|
|
20
|
+
* an optional caller sub-key.
|
|
21
|
+
*
|
|
22
|
+
* The key is CONTENT identity, deliberately not the navigation entry. An offset
|
|
23
|
+
* belongs to what the user was looking at, so returning to it restores however
|
|
24
|
+
* they got there — browser Back or Forward, a tab press, an in-app link — and
|
|
25
|
+
* only content never seen this session opens at the top. Keying on the entry
|
|
26
|
+
* would defeat that: a tab press and `router.replace` both mint a fresh entry,
|
|
27
|
+
* so both would open at the top even though the user has been there.
|
|
28
|
+
*
|
|
29
|
+
* The trade, chosen rather than overlooked: the same content occupying two LIVE
|
|
30
|
+
* entries now shares one offset. Pushing `/@alice` on top of `/@alice` in a
|
|
31
|
+
* native stack restores the first one's position instead of opening at the top,
|
|
32
|
+
* and while both are mounted each writes to the same key. That is the price of
|
|
33
|
+
* a tab press restoring, which is the behaviour that was asked for.
|
|
25
34
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
35
|
+
* The key is always the same two-field composite, with an absent sub-key
|
|
36
|
+
* written as empty, so two different identities can never collapse onto one key
|
|
37
|
+
* by omission.
|
|
28
38
|
*
|
|
29
|
-
* Returns `null` when there is no
|
|
30
|
-
* is not inside a navigator
|
|
39
|
+
* Returns `null` when there is no content id to anchor against (the scrollable
|
|
40
|
+
* is not inside a navigator, or the adapter cannot answer), which every caller
|
|
41
|
+
* treats as "do not persist and do not restore".
|
|
31
42
|
*/
|
|
32
43
|
export function deriveScrollKey(
|
|
33
|
-
|
|
44
|
+
contentId: string | null,
|
|
34
45
|
subKey?: string,
|
|
35
46
|
): string | null {
|
|
36
|
-
if (!
|
|
37
|
-
|
|
38
|
-
return `${routeKey}${COMPOSITE_KEY_SEPARATOR}${subKey}`;
|
|
47
|
+
if (!contentId) return null;
|
|
48
|
+
return [contentId, subKey ?? ''].join(COMPOSITE_KEY_SEPARATOR);
|
|
39
49
|
}
|
|
40
50
|
|
|
41
51
|
/**
|
|
42
52
|
* In-memory map of `scrollKey -> last-known scroll offset`.
|
|
43
53
|
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
54
|
+
* Offsets live only for the lifetime of the document/session. We never persist
|
|
55
|
+
* them — a full reload should start at the top — and we never auto-evict,
|
|
56
|
+
* because an entry can be revisited via browser Forward/Back long after it
|
|
57
|
+
* blurred.
|
|
58
|
+
*
|
|
59
|
+
* Deliberately an instance held in React context rather than a module-level
|
|
60
|
+
* singleton: a dependency tree can legitimately contain two copies of Bloom
|
|
61
|
+
* (a hoisted one plus a nested one under another Oxy package), and a
|
|
62
|
+
* module-global would then exist twice with no way for either half to see the
|
|
63
|
+
* other's offsets.
|
|
48
64
|
*/
|
|
49
65
|
export class ScrollOffsetStore {
|
|
50
66
|
private readonly offsets = new Map<string, number>();
|
|
@@ -55,19 +71,25 @@ export class ScrollOffsetStore {
|
|
|
55
71
|
}
|
|
56
72
|
|
|
57
73
|
/**
|
|
58
|
-
* Read the saved offset for a key. Returns `0` when nothing was saved,
|
|
59
|
-
*
|
|
74
|
+
* Read the saved offset for a key. Returns `0` when nothing was saved, which
|
|
75
|
+
* is the same value a caller writes when {@link has} is false — an unseen
|
|
76
|
+
* list restores to the top.
|
|
60
77
|
*/
|
|
61
78
|
read(key: string): number {
|
|
62
79
|
return this.offsets.get(key) ?? 0;
|
|
63
80
|
}
|
|
64
81
|
|
|
65
|
-
/**
|
|
82
|
+
/**
|
|
83
|
+
* Whether an offset was ever saved for this key. This — not `read() > 0` —
|
|
84
|
+
* is what separates "restore" from "reset": a key that was never seen and a
|
|
85
|
+
* key deliberately saved at the top both read 0, and only the store knows
|
|
86
|
+
* which is which.
|
|
87
|
+
*/
|
|
66
88
|
has(key: string): boolean {
|
|
67
89
|
return this.offsets.has(key);
|
|
68
90
|
}
|
|
69
91
|
|
|
70
|
-
/** Drop a saved offset (e.g. when
|
|
92
|
+
/** Drop a saved offset (e.g. when an entry is permanently removed). */
|
|
71
93
|
forget(key: string): void {
|
|
72
94
|
this.offsets.delete(key);
|
|
73
95
|
}
|
package/src/scroll/types.ts
CHANGED
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
import type { ReactNode, RefObject } from 'react';
|
|
2
|
+
import type { NativeScrollEvent, NativeSyntheticEvent } from 'react-native';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Anything `useScrollRestoration` knows how to read/write a vertical scroll
|
|
5
6
|
* offset from. The hook accepts a ref to one of these:
|
|
6
7
|
*
|
|
7
|
-
* - a React Native `ScrollView` / `FlatList` ref (which on web is
|
|
8
|
-
* DOM node and exposes `getScrollableNode()`),
|
|
8
|
+
* - a React Native `ScrollView` / `FlatList` / `FlashList` ref (which on web is
|
|
9
|
+
* backed by a DOM node and exposes `getScrollableNode()`),
|
|
9
10
|
* - a raw DOM element ref (when a component renders its own scroll container),
|
|
10
|
-
* - the literal `'window'` sentinel, for the
|
|
11
|
-
*
|
|
11
|
+
* - the literal `'window'` sentinel, for the layout where the list IS the
|
|
12
|
+
* document scroller.
|
|
12
13
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
14
|
+
* The two imperative methods are the native write path; web writes `scrollTop`
|
|
15
|
+
* on the resolved DOM node instead. Both are optional because a given ref only
|
|
16
|
+
* ever exposes one of them (list vs. scroll view).
|
|
15
17
|
*/
|
|
16
18
|
export interface ScrollableHandle {
|
|
17
|
-
/**
|
|
19
|
+
/** `ScrollView`'s imperative scroll API. */
|
|
18
20
|
scrollTo?: (options: { x?: number; y?: number; animated?: boolean }) => void;
|
|
21
|
+
/** `FlatList`/`FlashList`'s imperative scroll API. */
|
|
22
|
+
scrollToOffset?: (options: { offset: number; animated?: boolean }) => void;
|
|
19
23
|
/** Web/RNW path: returns the underlying DOM node. */
|
|
20
24
|
getScrollableNode?: () => unknown;
|
|
21
25
|
}
|
|
@@ -28,21 +32,87 @@ export type ScrollRestorationTarget =
|
|
|
28
32
|
| RefObject<unknown>
|
|
29
33
|
| 'window';
|
|
30
34
|
|
|
35
|
+
/** The effect shape `useScreenFocusEffect` runs — mirrors `useEffect`'s. */
|
|
36
|
+
export type ScreenFocusEffect = () => (() => void) | void;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The router bindings the scroll core needs, and the ONLY thing it knows about
|
|
40
|
+
* routing. Keeping this to two hooks is what lets the core ship without a
|
|
41
|
+
* router import, so a Vite/SPA consumer can supply its own adapter (or none).
|
|
42
|
+
*
|
|
43
|
+
* Both members are HOOKS: the core calls them from `useScrollRestoration`, so
|
|
44
|
+
* the adapter value must be referentially stable for the lifetime of the
|
|
45
|
+
* provider (a module-level constant, which is what every adapter Bloom ships
|
|
46
|
+
* is). Swapping in a different adapter at runtime would change the hook order
|
|
47
|
+
* of every consumer below it.
|
|
48
|
+
*/
|
|
49
|
+
export interface ScrollRouterAdapter {
|
|
50
|
+
/**
|
|
51
|
+
* Identify WHAT the calling screen is showing — its route and params, not the
|
|
52
|
+
* history slot it occupies. Offsets are remembered per content, so returning
|
|
53
|
+
* to something already seen restores it however the user got there.
|
|
54
|
+
*
|
|
55
|
+
* It must describe the screen the CALLER is rendered inside, never the
|
|
56
|
+
* globally focused one: a background screen has to keep reporting its own
|
|
57
|
+
* content, or it would save its offset under the foreground screen's key.
|
|
58
|
+
*
|
|
59
|
+
* `null` when the adapter cannot answer (a scrollable rendered outside any
|
|
60
|
+
* navigator), which makes the hook inert rather than guessing.
|
|
61
|
+
*/
|
|
62
|
+
useScreenContentId(): string | null;
|
|
63
|
+
/**
|
|
64
|
+
* Run `effect` while the calling screen is focused, and its cleanup on blur.
|
|
65
|
+
* Re-runs when `effect`'s identity changes AND the screen is focused — that
|
|
66
|
+
* is what makes an in-screen key change (a tab or folder swap) visible to a
|
|
67
|
+
* hook that never blurred.
|
|
68
|
+
*/
|
|
69
|
+
useScreenFocusEffect(effect: ScreenFocusEffect): void;
|
|
70
|
+
}
|
|
71
|
+
|
|
31
72
|
export interface UseScrollRestorationOptions {
|
|
32
73
|
/**
|
|
33
|
-
* Sub-key
|
|
34
|
-
*
|
|
35
|
-
*
|
|
74
|
+
* Sub-key distinguishing scrollables that share one screen AND one content
|
|
75
|
+
* id — the tabs of a profile, the folders of a saved-items screen. Changing
|
|
76
|
+
* it while the screen stays focused saves the outgoing list's offset and
|
|
77
|
+
* restores (or resets) the incoming one.
|
|
36
78
|
*/
|
|
37
79
|
key?: string;
|
|
38
80
|
/**
|
|
39
|
-
* When `false
|
|
40
|
-
*
|
|
81
|
+
* When `false` the hook is completely inert: no save, no restore, no reset.
|
|
82
|
+
*
|
|
83
|
+
* On NATIVE this is load-bearing rather than a feature flag. Restoring into a
|
|
84
|
+
* list whose rows have not been laid out yet lands at the wrong place (or is
|
|
85
|
+
* clamped away), and native has no equivalent of the web path's re-apply
|
|
86
|
+
* loop — so the caller gates on its own content being present, e.g.
|
|
87
|
+
* `enabled: rows.length > 0`. Flipping it from `false` to `true` is what
|
|
88
|
+
* triggers the restore.
|
|
89
|
+
*
|
|
41
90
|
* Defaults to `true`.
|
|
42
91
|
*/
|
|
43
92
|
enabled?: boolean;
|
|
44
93
|
}
|
|
45
94
|
|
|
95
|
+
/**
|
|
96
|
+
* What `useScrollRestoration` hands back. Identical on both platforms so call
|
|
97
|
+
* sites are written once.
|
|
98
|
+
*/
|
|
99
|
+
export interface ScrollRestorationBinding {
|
|
100
|
+
/**
|
|
101
|
+
* Wire onto the list being restored: `<FlashList onScroll={scroll.onScroll}>`.
|
|
102
|
+
*
|
|
103
|
+
* Native has no way to observe a list's offset from outside it, so this is
|
|
104
|
+
* how offsets are recorded there. On web it is a stable no-op — the web path
|
|
105
|
+
* subscribes to the resolved DOM node's own `scroll` event, which needs
|
|
106
|
+
* nothing from the caller — and passing it costs nothing.
|
|
107
|
+
*/
|
|
108
|
+
onScroll: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;
|
|
109
|
+
}
|
|
110
|
+
|
|
46
111
|
export interface ScrollRestorationProviderProps {
|
|
47
112
|
children: ReactNode;
|
|
113
|
+
/**
|
|
114
|
+
* Binds the store to a router. Must be referentially stable — see
|
|
115
|
+
* {@link ScrollRouterAdapter}.
|
|
116
|
+
*/
|
|
117
|
+
adapter: ScrollRouterAdapter;
|
|
48
118
|
}
|
|
@@ -66,8 +66,8 @@
|
|
|
66
66
|
"--surface-foreground": "rgb(215 229 232)",
|
|
67
67
|
"--popover": "rgb(21 34 36)",
|
|
68
68
|
"--popover-foreground": "rgb(215 229 232)",
|
|
69
|
-
"--primary": "rgb(
|
|
70
|
-
"--primary-foreground": "rgb(
|
|
69
|
+
"--primary": "rgb(55 126 138)",
|
|
70
|
+
"--primary-foreground": "rgb(255 255 255)",
|
|
71
71
|
"--secondary": "rgb(213 49 120)",
|
|
72
72
|
"--secondary-foreground": "rgb(255 255 255)",
|
|
73
73
|
"--tertiary": "rgb(174 97 0)",
|
|
@@ -186,8 +186,8 @@
|
|
|
186
186
|
"--surface-foreground": "rgb(220 227 238)",
|
|
187
187
|
"--popover": "rgb(25 32 40)",
|
|
188
188
|
"--popover-foreground": "rgb(220 227 238)",
|
|
189
|
-
"--primary": "rgb(
|
|
190
|
-
"--primary-foreground": "rgb(
|
|
189
|
+
"--primary": "rgb(0 121 192)",
|
|
190
|
+
"--primary-foreground": "rgb(255 255 255)",
|
|
191
191
|
"--secondary": "rgb(214 58 43)",
|
|
192
192
|
"--secondary-foreground": "rgb(255 255 255)",
|
|
193
193
|
"--tertiary": "rgb(252 220 0)",
|
|
@@ -306,8 +306,8 @@
|
|
|
306
306
|
"--surface-foreground": "rgb(217 230 220)",
|
|
307
307
|
"--popover": "rgb(23 34 28)",
|
|
308
308
|
"--popover-foreground": "rgb(217 230 220)",
|
|
309
|
-
"--primary": "rgb(
|
|
310
|
-
"--primary-foreground": "rgb(
|
|
309
|
+
"--primary": "rgb(0 133 91)",
|
|
310
|
+
"--primary-foreground": "rgb(255 255 255)",
|
|
311
311
|
"--secondary": "rgb(216 52 80)",
|
|
312
312
|
"--secondary-foreground": "rgb(255 255 255)",
|
|
313
313
|
"--tertiary": "rgb(165 64 234)",
|
|
@@ -366,7 +366,7 @@
|
|
|
366
366
|
"--surface-foreground": "rgb(36 26 14)",
|
|
367
367
|
"--popover": "rgb(255 234 215)",
|
|
368
368
|
"--popover-foreground": "rgb(36 26 14)",
|
|
369
|
-
"--primary": "rgb(
|
|
369
|
+
"--primary": "rgb(150 94 0)",
|
|
370
370
|
"--primary-foreground": "rgb(255 255 255)",
|
|
371
371
|
"--secondary": "rgb(0 117 141)",
|
|
372
372
|
"--secondary-foreground": "rgb(255 255 255)",
|
|
@@ -426,8 +426,8 @@
|
|
|
426
426
|
"--surface-foreground": "rgb(244 223 203)",
|
|
427
427
|
"--popover": "rgb(40 30 17)",
|
|
428
428
|
"--popover-foreground": "rgb(244 223 203)",
|
|
429
|
-
"--primary": "rgb(
|
|
430
|
-
"--primary-foreground": "rgb(
|
|
429
|
+
"--primary": "rgb(163 103 0)",
|
|
430
|
+
"--primary-foreground": "rgb(255 255 255)",
|
|
431
431
|
"--secondary": "rgb(0 213 255)",
|
|
432
432
|
"--secondary-foreground": "rgb(0 0 0)",
|
|
433
433
|
"--tertiary": "rgb(78 98 255)",
|
|
@@ -486,8 +486,8 @@
|
|
|
486
486
|
"--surface-foreground": "rgb(33 27 13)",
|
|
487
487
|
"--popover": "rgb(250 236 213)",
|
|
488
488
|
"--popover-foreground": "rgb(33 27 13)",
|
|
489
|
-
"--primary": "rgb(
|
|
490
|
-
"--primary-foreground": "rgb(
|
|
489
|
+
"--primary": "rgb(135 102 0)",
|
|
490
|
+
"--primary-foreground": "rgb(255 255 255)",
|
|
491
491
|
"--secondary": "rgb(0 114 158)",
|
|
492
492
|
"--secondary-foreground": "rgb(255 255 255)",
|
|
493
493
|
"--tertiary": "rgb(117 66 250)",
|
|
@@ -666,8 +666,8 @@
|
|
|
666
666
|
"--surface-foreground": "rgb(249 220 217)",
|
|
667
667
|
"--popover": "rgb(43 28 26)",
|
|
668
668
|
"--popover-foreground": "rgb(249 220 217)",
|
|
669
|
-
"--primary": "rgb(
|
|
670
|
-
"--primary-foreground": "rgb(
|
|
669
|
+
"--primary": "rgb(218 52 55)",
|
|
670
|
+
"--primary-foreground": "rgb(255 255 255)",
|
|
671
671
|
"--secondary": "rgb(0 126 166)",
|
|
672
672
|
"--secondary-foreground": "rgb(255 255 255)",
|
|
673
673
|
"--tertiary": "rgb(90 250 115)",
|
|
@@ -786,8 +786,8 @@
|
|
|
786
786
|
"--surface-foreground": "rgb(231 224 238)",
|
|
787
787
|
"--popover": "rgb(33 30 40)",
|
|
788
788
|
"--popover-foreground": "rgb(231 224 238)",
|
|
789
|
-
"--primary": "rgb(
|
|
790
|
-
"--primary-foreground": "rgb(
|
|
789
|
+
"--primary": "rgb(132 85 239)",
|
|
790
|
+
"--primary-foreground": "rgb(255 255 255)",
|
|
791
791
|
"--secondary": "rgb(254 199 0)",
|
|
792
792
|
"--secondary-foreground": "rgb(0 0 0)",
|
|
793
793
|
"--tertiary": "rgb(118 245 94)",
|
|
@@ -906,8 +906,8 @@
|
|
|
906
906
|
"--surface-foreground": "rgb(245 220 227)",
|
|
907
907
|
"--popover": "rgb(41 28 33)",
|
|
908
908
|
"--popover-foreground": "rgb(245 220 227)",
|
|
909
|
-
"--primary": "rgb(
|
|
910
|
-
"--primary-foreground": "rgb(
|
|
909
|
+
"--primary": "rgb(210 50 132)",
|
|
910
|
+
"--primary-foreground": "rgb(255 255 255)",
|
|
911
911
|
"--secondary": "rgb(0 237 255)",
|
|
912
912
|
"--secondary-foreground": "rgb(0 0 0)",
|
|
913
913
|
"--tertiary": "rgb(100 250 110)",
|
|
@@ -1026,8 +1026,8 @@
|
|
|
1026
1026
|
"--surface-foreground": "rgb(219 227 237)",
|
|
1027
1027
|
"--popover": "rgb(24 33 39)",
|
|
1028
1028
|
"--popover-foreground": "rgb(219 227 237)",
|
|
1029
|
-
"--primary": "rgb(
|
|
1030
|
-
"--primary-foreground": "rgb(
|
|
1029
|
+
"--primary": "rgb(0 124 177)",
|
|
1030
|
+
"--primary-foreground": "rgb(255 255 255)",
|
|
1031
1031
|
"--secondary": "rgb(213 61 30)",
|
|
1032
1032
|
"--secondary-foreground": "rgb(255 255 255)",
|
|
1033
1033
|
"--tertiary": "rgb(253 200 0)",
|
|
@@ -1146,8 +1146,8 @@
|
|
|
1146
1146
|
"--surface-foreground": "rgb(248 221 209)",
|
|
1147
1147
|
"--popover": "rgb(43 28 21)",
|
|
1148
1148
|
"--popover-foreground": "rgb(248 221 209)",
|
|
1149
|
-
"--primary": "rgb(
|
|
1150
|
-
"--primary-foreground": "rgb(
|
|
1149
|
+
"--primary": "rgb(192 84 0)",
|
|
1150
|
+
"--primary-foreground": "rgb(255 255 255)",
|
|
1151
1151
|
"--secondary": "rgb(0 255 254)",
|
|
1152
1152
|
"--secondary-foreground": "rgb(0 0 0)",
|
|
1153
1153
|
"--tertiary": "rgb(81 97 255)",
|
|
@@ -1266,8 +1266,8 @@
|
|
|
1266
1266
|
"--surface-foreground": "rgb(215 230 225)",
|
|
1267
1267
|
"--popover": "rgb(21 34 32)",
|
|
1268
1268
|
"--popover-foreground": "rgb(215 230 225)",
|
|
1269
|
-
"--primary": "rgb(
|
|
1270
|
-
"--primary-foreground": "rgb(
|
|
1269
|
+
"--primary": "rgb(0 131 118)",
|
|
1270
|
+
"--primary-foreground": "rgb(255 255 255)",
|
|
1271
1271
|
"--secondary": "rgb(212 63 10)",
|
|
1272
1272
|
"--secondary-foreground": "rgb(255 255 255)",
|
|
1273
1273
|
"--tertiary": "rgb(193 53 190)",
|
|
@@ -1386,8 +1386,8 @@
|
|
|
1386
1386
|
"--surface-foreground": "rgb(237 222 235)",
|
|
1387
1387
|
"--popover": "rgb(37 29 38)",
|
|
1388
1388
|
"--popover-foreground": "rgb(237 222 235)",
|
|
1389
|
-
"--primary": "rgb(
|
|
1390
|
-
"--primary-foreground": "rgb(
|
|
1389
|
+
"--primary": "rgb(165 81 191)",
|
|
1390
|
+
"--primary-foreground": "rgb(255 255 255)",
|
|
1391
1391
|
"--secondary": "rgb(0 253 200)",
|
|
1392
1392
|
"--secondary-foreground": "rgb(0 0 0)",
|
|
1393
1393
|
"--tertiary": "rgb(142 249 86)",
|
|
@@ -1446,8 +1446,8 @@
|
|
|
1446
1446
|
"--surface-foreground": "rgb(24 29 18)",
|
|
1447
1447
|
"--popover": "rgb(234 240 222)",
|
|
1448
1448
|
"--popover-foreground": "rgb(24 29 18)",
|
|
1449
|
-
"--primary": "rgb(
|
|
1450
|
-
"--primary-foreground": "rgb(
|
|
1449
|
+
"--primary": "rgb(63 120 0)",
|
|
1450
|
+
"--primary-foreground": "rgb(255 255 255)",
|
|
1451
1451
|
"--secondary": "rgb(79 79 255)",
|
|
1452
1452
|
"--secondary-foreground": "rgb(255 255 255)",
|
|
1453
1453
|
"--tertiary": "rgb(190 36 152)",
|