@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.
Files changed (105) hide show
  1. package/README.md +3 -3
  2. package/lib/commonjs/provider/index.js +11 -7
  3. package/lib/commonjs/provider/index.js.map +1 -1
  4. package/lib/commonjs/scroll/context.js +96 -0
  5. package/lib/commonjs/scroll/context.js.map +1 -0
  6. package/lib/commonjs/scroll/expo-router/index.js +133 -0
  7. package/lib/commonjs/scroll/expo-router/index.js.map +1 -0
  8. package/lib/commonjs/scroll/index.js +85 -21
  9. package/lib/commonjs/scroll/index.js.map +1 -1
  10. package/lib/commonjs/scroll/index.web.js +184 -118
  11. package/lib/commonjs/scroll/index.web.js.map +1 -1
  12. package/lib/commonjs/scroll/scrollable.native.js +58 -0
  13. package/lib/commonjs/scroll/scrollable.native.js.map +1 -0
  14. package/lib/commonjs/scroll/store.js +47 -25
  15. package/lib/commonjs/scroll/store.js.map +1 -1
  16. package/lib/commonjs/theme/color-policy.js +11 -9
  17. package/lib/commonjs/theme/color-policy.js.map +1 -1
  18. package/lib/module/provider/index.js +10 -6
  19. package/lib/module/provider/index.js.map +1 -1
  20. package/lib/module/scroll/context.js +90 -0
  21. package/lib/module/scroll/context.js.map +1 -0
  22. package/lib/module/scroll/expo-router/index.js +128 -0
  23. package/lib/module/scroll/expo-router/index.js.map +1 -0
  24. package/lib/module/scroll/index.js +80 -21
  25. package/lib/module/scroll/index.js.map +1 -1
  26. package/lib/module/scroll/index.web.js +181 -119
  27. package/lib/module/scroll/index.web.js.map +1 -1
  28. package/lib/module/scroll/scrollable.native.js +54 -0
  29. package/lib/module/scroll/scrollable.native.js.map +1 -0
  30. package/lib/module/scroll/store.js +47 -25
  31. package/lib/module/scroll/store.js.map +1 -1
  32. package/lib/module/theme/color-policy.js +11 -9
  33. package/lib/module/theme/color-policy.js.map +1 -1
  34. package/lib/typescript/commonjs/provider/index.d.ts +7 -5
  35. package/lib/typescript/commonjs/provider/index.d.ts.map +1 -1
  36. package/lib/typescript/commonjs/scroll/context.d.ts +14 -0
  37. package/lib/typescript/commonjs/scroll/context.d.ts.map +1 -0
  38. package/lib/typescript/commonjs/scroll/expo-router/index.d.ts +7 -0
  39. package/lib/typescript/commonjs/scroll/expo-router/index.d.ts.map +1 -0
  40. package/lib/typescript/commonjs/scroll/index.d.ts +14 -23
  41. package/lib/typescript/commonjs/scroll/index.d.ts.map +1 -1
  42. package/lib/typescript/commonjs/scroll/index.web.d.ts +17 -19
  43. package/lib/typescript/commonjs/scroll/index.web.d.ts.map +1 -1
  44. package/lib/typescript/commonjs/scroll/scrollable.native.d.ts +23 -0
  45. package/lib/typescript/commonjs/scroll/scrollable.native.d.ts.map +1 -0
  46. package/lib/typescript/commonjs/scroll/store.d.ts +41 -22
  47. package/lib/typescript/commonjs/scroll/store.d.ts.map +1 -1
  48. package/lib/typescript/commonjs/scroll/types.d.ts +82 -12
  49. package/lib/typescript/commonjs/scroll/types.d.ts.map +1 -1
  50. package/lib/typescript/commonjs/theme/color-policy.d.ts.map +1 -1
  51. package/lib/typescript/module/provider/index.d.ts +7 -5
  52. package/lib/typescript/module/provider/index.d.ts.map +1 -1
  53. package/lib/typescript/module/scroll/context.d.ts +14 -0
  54. package/lib/typescript/module/scroll/context.d.ts.map +1 -0
  55. package/lib/typescript/module/scroll/expo-router/index.d.ts +7 -0
  56. package/lib/typescript/module/scroll/expo-router/index.d.ts.map +1 -0
  57. package/lib/typescript/module/scroll/index.d.ts +14 -23
  58. package/lib/typescript/module/scroll/index.d.ts.map +1 -1
  59. package/lib/typescript/module/scroll/index.web.d.ts +17 -19
  60. package/lib/typescript/module/scroll/index.web.d.ts.map +1 -1
  61. package/lib/typescript/module/scroll/scrollable.native.d.ts +23 -0
  62. package/lib/typescript/module/scroll/scrollable.native.d.ts.map +1 -0
  63. package/lib/typescript/module/scroll/store.d.ts +41 -22
  64. package/lib/typescript/module/scroll/store.d.ts.map +1 -1
  65. package/lib/typescript/module/scroll/types.d.ts +82 -12
  66. package/lib/typescript/module/scroll/types.d.ts.map +1 -1
  67. package/lib/typescript/module/theme/color-policy.d.ts.map +1 -1
  68. package/package.json +15 -1
  69. package/src/__tests__/BloomProvider.web.test.tsx +8 -15
  70. package/src/__tests__/optional-peer-imports.test.ts +2 -2
  71. package/src/__tests__/scroll-expo-router-adapter.test.tsx +164 -0
  72. package/src/__tests__/scroll-native.test.tsx +465 -0
  73. package/src/__tests__/scroll-store.test.ts +41 -17
  74. package/src/__tests__/scroll-web.test.tsx +547 -111
  75. package/src/provider/index.tsx +10 -7
  76. package/src/scroll/context.tsx +107 -0
  77. package/src/scroll/expo-router/index.ts +140 -0
  78. package/src/scroll/index.ts +92 -25
  79. package/src/scroll/index.web.tsx +219 -162
  80. package/src/scroll/scrollable.native.ts +64 -0
  81. package/src/scroll/store.ts +47 -25
  82. package/src/scroll/types.ts +82 -12
  83. package/src/theme/__tests__/__fixtures__/golden-resolved-tokens.json +27 -27
  84. package/src/theme/__tests__/__snapshots__/visual-gallery.test.tsx.snap +55 -55
  85. package/src/theme/__tests__/policy-legibility.test.ts +21 -1
  86. package/src/theme/color-policy.ts +13 -9
  87. package/lib/commonjs/provider/scroll-provider.js +0 -13
  88. package/lib/commonjs/provider/scroll-provider.js.map +0 -1
  89. package/lib/commonjs/provider/scroll-provider.web.js +0 -13
  90. package/lib/commonjs/provider/scroll-provider.web.js.map +0 -1
  91. package/lib/module/provider/scroll-provider.js +0 -16
  92. package/lib/module/provider/scroll-provider.js.map +0 -1
  93. package/lib/module/provider/scroll-provider.web.js +0 -5
  94. package/lib/module/provider/scroll-provider.web.js.map +0 -1
  95. package/lib/typescript/commonjs/provider/scroll-provider.d.ts +0 -14
  96. package/lib/typescript/commonjs/provider/scroll-provider.d.ts.map +0 -1
  97. package/lib/typescript/commonjs/provider/scroll-provider.web.d.ts +0 -3
  98. package/lib/typescript/commonjs/provider/scroll-provider.web.d.ts.map +0 -1
  99. package/lib/typescript/module/provider/scroll-provider.d.ts +0 -14
  100. package/lib/typescript/module/provider/scroll-provider.d.ts.map +0 -1
  101. package/lib/typescript/module/provider/scroll-provider.web.d.ts +0 -3
  102. package/lib/typescript/module/provider/scroll-provider.web.d.ts.map +0 -1
  103. package/src/__tests__/scroll-native.test.ts +0 -25
  104. package/src/provider/scroll-provider.ts +0 -13
  105. package/src/provider/scroll-provider.web.ts +0 -2
@@ -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. The web barrel drives it with real scroll offsets; the
7
- * native barrel never instantiates it (native-stack already restores scroll).
6
+ * native barrels.
8
7
  */
9
-
10
8
  /**
11
- * Separator between the navigation route key and an optional caller-supplied
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 React Navigation route key or 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 owning route key and an
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
- * - `routeKey` is React Navigation's stable per-route `route.key`.
27
- * - `subKey` distinguishes multiple scrollables that share a single route.
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 route key to anchor against (the scrollable
30
- * is not inside a navigator), which the caller treats as "do not persist".
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
- routeKey: string | undefined,
44
+ contentId: string | null,
34
45
  subKey?: string,
35
46
  ): string | null {
36
- if (!routeKey) return null;
37
- if (subKey === undefined || subKey === '') return routeKey;
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
- * Mirrors the semantics of Bluesky's `Map<screenKey, scrollY>`: offsets live
45
- * only for the lifetime of the document/session. We never persist them — a
46
- * full reload should start at the top and we never auto-evict, because a
47
- * route can be revisited via browser Forward/Back long after it blurred.
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, so
59
- * callers can restore unconditionally (an unseen list restores to the top).
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
- /** Whether an offset was ever saved for this key. */
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 a route is permanently removed). */
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
  }
@@ -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 backed by a
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 rare layout where the list IS the
11
- * window scroller (matches Bluesky's default).
11
+ * - the literal `'window'` sentinel, for the layout where the list IS the
12
+ * document scroller.
12
13
  *
13
- * Native never reads any of these — the native hook is a no-op — so the type is
14
- * intentionally permissive rather than coupled to a specific RN class.
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
- /** Imperative scroll API exposed by RN scrollables. */
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 to disambiguate multiple scrollables that live on the same route
34
- * (e.g. the tabs of a profile screen). Combined with the active route key to
35
- * form the storage key. Omit when a route has a single scrollable.
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`, the hook is inert (saves and restores are skipped). Useful to
40
- * gate restoration behind a feature flag without changing call sites.
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(80 150 161)",
70
- "--primary-foreground": "rgb(0 0 0)",
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(29 155 240)",
190
- "--primary-foreground": "rgb(0 0 0)",
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(16 185 129)",
310
- "--primary-foreground": "rgb(0 0 0)",
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(157 99 0)",
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(245 158 11)",
430
- "--primary-foreground": "rgb(0 0 0)",
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(255 195 0)",
490
- "--primary-foreground": "rgb(0 0 0)",
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(250 76 75)",
670
- "--primary-foreground": "rgb(0 0 0)",
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(155 113 255)",
790
- "--primary-foreground": "rgb(0 0 0)",
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(240 75 156)",
910
- "--primary-foreground": "rgb(0 0 0)",
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(14 165 233)",
1030
- "--primary-foreground": "rgb(0 0 0)",
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(249 115 22)",
1150
- "--primary-foreground": "rgb(0 0 0)",
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(20 184 166)",
1270
- "--primary-foreground": "rgb(0 0 0)",
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(196 110 222)",
1390
- "--primary-foreground": "rgb(0 0 0)",
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(139 255 0)",
1450
- "--primary-foreground": "rgb(0 0 0)",
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)",