@oxyhq/bloom 0.79.0 → 0.80.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.
Files changed (147) 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 +221 -121
  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/scrollable.web.js +9 -3
  15. package/lib/commonjs/scroll/scrollable.web.js.map +1 -1
  16. package/lib/commonjs/scroll/store.js +47 -25
  17. package/lib/commonjs/scroll/store.js.map +1 -1
  18. package/lib/commonjs/tabs/Tabs.js +263 -63
  19. package/lib/commonjs/tabs/Tabs.js.map +1 -1
  20. package/lib/commonjs/tabs/expo-router/RouterTabs.js +215 -0
  21. package/lib/commonjs/tabs/expo-router/RouterTabs.js.map +1 -0
  22. package/lib/commonjs/tabs/expo-router/index.js +13 -0
  23. package/lib/commonjs/tabs/expo-router/index.js.map +1 -0
  24. package/lib/commonjs/theme/color-policy.js +11 -10
  25. package/lib/commonjs/theme/color-policy.js.map +1 -1
  26. package/lib/module/provider/index.js +10 -6
  27. package/lib/module/provider/index.js.map +1 -1
  28. package/lib/module/scroll/context.js +90 -0
  29. package/lib/module/scroll/context.js.map +1 -0
  30. package/lib/module/scroll/expo-router/index.js +128 -0
  31. package/lib/module/scroll/expo-router/index.js.map +1 -0
  32. package/lib/module/scroll/index.js +80 -21
  33. package/lib/module/scroll/index.js.map +1 -1
  34. package/lib/module/scroll/index.web.js +218 -122
  35. package/lib/module/scroll/index.web.js.map +1 -1
  36. package/lib/module/scroll/scrollable.native.js +54 -0
  37. package/lib/module/scroll/scrollable.native.js.map +1 -0
  38. package/lib/module/scroll/scrollable.web.js +9 -3
  39. package/lib/module/scroll/scrollable.web.js.map +1 -1
  40. package/lib/module/scroll/store.js +47 -25
  41. package/lib/module/scroll/store.js.map +1 -1
  42. package/lib/module/tabs/Tabs.js +271 -65
  43. package/lib/module/tabs/Tabs.js.map +1 -1
  44. package/lib/module/tabs/expo-router/RouterTabs.js +210 -0
  45. package/lib/module/tabs/expo-router/RouterTabs.js.map +1 -0
  46. package/lib/module/tabs/expo-router/index.js +10 -0
  47. package/lib/module/tabs/expo-router/index.js.map +1 -0
  48. package/lib/module/theme/color-policy.js +11 -10
  49. package/lib/module/theme/color-policy.js.map +1 -1
  50. package/lib/typescript/commonjs/provider/index.d.ts +7 -5
  51. package/lib/typescript/commonjs/provider/index.d.ts.map +1 -1
  52. package/lib/typescript/commonjs/scroll/context.d.ts +14 -0
  53. package/lib/typescript/commonjs/scroll/context.d.ts.map +1 -0
  54. package/lib/typescript/commonjs/scroll/expo-router/index.d.ts +7 -0
  55. package/lib/typescript/commonjs/scroll/expo-router/index.d.ts.map +1 -0
  56. package/lib/typescript/commonjs/scroll/index.d.ts +14 -23
  57. package/lib/typescript/commonjs/scroll/index.d.ts.map +1 -1
  58. package/lib/typescript/commonjs/scroll/index.web.d.ts +17 -19
  59. package/lib/typescript/commonjs/scroll/index.web.d.ts.map +1 -1
  60. package/lib/typescript/commonjs/scroll/scrollable.native.d.ts +23 -0
  61. package/lib/typescript/commonjs/scroll/scrollable.native.d.ts.map +1 -0
  62. package/lib/typescript/commonjs/scroll/scrollable.web.d.ts +18 -5
  63. package/lib/typescript/commonjs/scroll/scrollable.web.d.ts.map +1 -1
  64. package/lib/typescript/commonjs/scroll/store.d.ts +41 -22
  65. package/lib/typescript/commonjs/scroll/store.d.ts.map +1 -1
  66. package/lib/typescript/commonjs/scroll/types.d.ts +82 -12
  67. package/lib/typescript/commonjs/scroll/types.d.ts.map +1 -1
  68. package/lib/typescript/commonjs/tabs/Tabs.d.ts +41 -1
  69. package/lib/typescript/commonjs/tabs/Tabs.d.ts.map +1 -1
  70. package/lib/typescript/commonjs/tabs/expo-router/RouterTabs.d.ts +80 -0
  71. package/lib/typescript/commonjs/tabs/expo-router/RouterTabs.d.ts.map +1 -0
  72. package/lib/typescript/commonjs/tabs/expo-router/index.d.ts +9 -0
  73. package/lib/typescript/commonjs/tabs/expo-router/index.d.ts.map +1 -0
  74. package/lib/typescript/commonjs/tabs/types.d.ts +48 -4
  75. package/lib/typescript/commonjs/tabs/types.d.ts.map +1 -1
  76. package/lib/typescript/commonjs/theme/color-policy.d.ts.map +1 -1
  77. package/lib/typescript/module/provider/index.d.ts +7 -5
  78. package/lib/typescript/module/provider/index.d.ts.map +1 -1
  79. package/lib/typescript/module/scroll/context.d.ts +14 -0
  80. package/lib/typescript/module/scroll/context.d.ts.map +1 -0
  81. package/lib/typescript/module/scroll/expo-router/index.d.ts +7 -0
  82. package/lib/typescript/module/scroll/expo-router/index.d.ts.map +1 -0
  83. package/lib/typescript/module/scroll/index.d.ts +14 -23
  84. package/lib/typescript/module/scroll/index.d.ts.map +1 -1
  85. package/lib/typescript/module/scroll/index.web.d.ts +17 -19
  86. package/lib/typescript/module/scroll/index.web.d.ts.map +1 -1
  87. package/lib/typescript/module/scroll/scrollable.native.d.ts +23 -0
  88. package/lib/typescript/module/scroll/scrollable.native.d.ts.map +1 -0
  89. package/lib/typescript/module/scroll/scrollable.web.d.ts +18 -5
  90. package/lib/typescript/module/scroll/scrollable.web.d.ts.map +1 -1
  91. package/lib/typescript/module/scroll/store.d.ts +41 -22
  92. package/lib/typescript/module/scroll/store.d.ts.map +1 -1
  93. package/lib/typescript/module/scroll/types.d.ts +82 -12
  94. package/lib/typescript/module/scroll/types.d.ts.map +1 -1
  95. package/lib/typescript/module/tabs/Tabs.d.ts +41 -1
  96. package/lib/typescript/module/tabs/Tabs.d.ts.map +1 -1
  97. package/lib/typescript/module/tabs/expo-router/RouterTabs.d.ts +80 -0
  98. package/lib/typescript/module/tabs/expo-router/RouterTabs.d.ts.map +1 -0
  99. package/lib/typescript/module/tabs/expo-router/index.d.ts +9 -0
  100. package/lib/typescript/module/tabs/expo-router/index.d.ts.map +1 -0
  101. package/lib/typescript/module/tabs/types.d.ts +48 -4
  102. package/lib/typescript/module/tabs/types.d.ts.map +1 -1
  103. package/lib/typescript/module/theme/color-policy.d.ts.map +1 -1
  104. package/package.json +29 -1
  105. package/src/__tests__/BloomProvider.web.test.tsx +8 -15
  106. package/src/__tests__/Tabs.test.tsx +187 -0
  107. package/src/__tests__/optional-peer-imports.test.ts +7 -2
  108. package/src/__tests__/scroll-expo-router-adapter.test.tsx +164 -0
  109. package/src/__tests__/scroll-native.test.tsx +465 -0
  110. package/src/__tests__/scroll-store.test.ts +41 -17
  111. package/src/__tests__/scroll-web.test.tsx +797 -108
  112. package/src/provider/index.tsx +10 -7
  113. package/src/scroll/context.tsx +107 -0
  114. package/src/scroll/expo-router/index.ts +140 -0
  115. package/src/scroll/index.ts +92 -25
  116. package/src/scroll/index.web.tsx +255 -162
  117. package/src/scroll/scrollable.native.ts +64 -0
  118. package/src/scroll/scrollable.web.ts +30 -8
  119. package/src/scroll/store.ts +47 -25
  120. package/src/scroll/types.ts +82 -12
  121. package/src/tabs/Tabs.tsx +352 -77
  122. package/src/tabs/expo-router/RouterTabs.tsx +268 -0
  123. package/src/tabs/expo-router/index.ts +8 -0
  124. package/src/tabs/types.ts +48 -4
  125. package/src/theme/__tests__/__fixtures__/golden-resolved-tokens.json +5 -5
  126. package/src/theme/__tests__/__snapshots__/visual-gallery.test.tsx.snap +11 -11
  127. package/src/theme/__tests__/policy-legibility.test.ts +10 -7
  128. package/src/theme/color-policy.ts +11 -10
  129. package/lib/commonjs/provider/scroll-provider.js +0 -13
  130. package/lib/commonjs/provider/scroll-provider.js.map +0 -1
  131. package/lib/commonjs/provider/scroll-provider.web.js +0 -13
  132. package/lib/commonjs/provider/scroll-provider.web.js.map +0 -1
  133. package/lib/module/provider/scroll-provider.js +0 -16
  134. package/lib/module/provider/scroll-provider.js.map +0 -1
  135. package/lib/module/provider/scroll-provider.web.js +0 -5
  136. package/lib/module/provider/scroll-provider.web.js.map +0 -1
  137. package/lib/typescript/commonjs/provider/scroll-provider.d.ts +0 -14
  138. package/lib/typescript/commonjs/provider/scroll-provider.d.ts.map +0 -1
  139. package/lib/typescript/commonjs/provider/scroll-provider.web.d.ts +0 -3
  140. package/lib/typescript/commonjs/provider/scroll-provider.web.d.ts.map +0 -1
  141. package/lib/typescript/module/provider/scroll-provider.d.ts +0 -14
  142. package/lib/typescript/module/provider/scroll-provider.d.ts.map +0 -1
  143. package/lib/typescript/module/provider/scroll-provider.web.d.ts +0 -3
  144. package/lib/typescript/module/provider/scroll-provider.web.d.ts.map +0 -1
  145. package/src/__tests__/scroll-native.test.ts +0 -25
  146. package/src/provider/scroll-provider.ts +0 -13
  147. package/src/provider/scroll-provider.web.ts +0 -2
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RouterTabs = RouterTabs;
7
+ var _react = require("react");
8
+ var _reactNativeGestureHandler = require("react-native-gesture-handler");
9
+ var _reactNativeReanimated = require("react-native-reanimated");
10
+ var _expoRouter = require("expo-router");
11
+ var _Tabs = require("../Tabs.js");
12
+ var _jsxRuntime = require("react/jsx-runtime");
13
+ /**
14
+ * expo-router bindings for the in-screen tab strip.
15
+ *
16
+ * This subpath (`@oxyhq/bloom/tabs/expo-router`) is the ONLY place in the tabs
17
+ * feature allowed to import `expo-router`, which is why it is a separate entry:
18
+ * the core `@oxyhq/bloom/tabs` stays usable in an app with a different router,
19
+ * or none, and the optional peer is never pulled into a bundle that does not
20
+ * ask for it. Same split as `tab-bar` / `tab-bar/expo-router` and
21
+ * `scroll` / `scroll/expo-router`.
22
+ *
23
+ * Everything routing-shaped lives here on purpose: which tab the route means,
24
+ * what a committed swipe navigates to, and which links to warm. The strip
25
+ * itself stays presentational and knows only about measured geometry.
26
+ */
27
+
28
+ /**
29
+ * Resolve which item the current route belongs to.
30
+ *
31
+ * LONGEST matching prefix, on a segment boundary — not an exact match. All
32
+ * three properties matter:
33
+ *
34
+ * - A prefix is needed because a tab may own a subtree (`/feeds/1/topics` and
35
+ * anything under it), and an exact match would drop the underline the moment
36
+ * the user goes one level deeper.
37
+ * - LONGEST is needed because the default tab's href is a prefix of every
38
+ * sibling's (`/@ana` vs `/@ana/replies`), so a first-match rule would light
39
+ * up the default tab on every tab.
40
+ * - The segment boundary is what stops `/feeds/12` from matching `/feeds/1`.
41
+ *
42
+ * Returns `undefined` when nothing matches, which is a real state — a strip
43
+ * rendered by a LAYOUT keeps rendering while a child route outside the tab set
44
+ * is showing — and leaves the underline hidden rather than parked on a lie.
45
+ */
46
+ function matchActiveValue(items, pathname) {
47
+ let best;
48
+ for (const item of items) {
49
+ // `Href` is a string or an object; only a string form can be compared to a
50
+ // pathname, and an object form describes params we cannot resolve here.
51
+ if (typeof item.href !== 'string') continue;
52
+ // Compare paths only: a query string describes what the tab shows, not
53
+ // which tab it is, and a trailing slash is the same route either way.
54
+ const [path = ''] = item.href.split('?');
55
+ const href = path.replace(/\/$/, '');
56
+ const isMatch = pathname === href || pathname.startsWith(`${href}/`);
57
+ if (!isMatch) continue;
58
+ if (!best || href.length > best.length) {
59
+ best = {
60
+ value: item.value,
61
+ length: href.length
62
+ };
63
+ }
64
+ }
65
+ return best?.value;
66
+ }
67
+
68
+ /**
69
+ * A tab strip whose selection IS the route.
70
+ *
71
+ * Render it in the LAYOUT that owns the tabs, above the `<Slot/>` that renders
72
+ * them — not inside the tab screens themselves. That placement is the whole
73
+ * point, and it is load-bearing twice over: a strip inside the screens is
74
+ * unmounted and rebuilt by every navigation, so its underline has nothing to
75
+ * animate from and the chrome blanks while the incoming route's chunk loads;
76
+ * and a GESTURE inside the screens would be destroyed by the very navigation it
77
+ * commits, mid-release.
78
+ *
79
+ * ```tsx
80
+ * // app/(app)/[username]/_layout.tsx
81
+ * <RouterTabs
82
+ * items={[
83
+ * { value: 'posts', label: 'Posts', href: `/${username}` },
84
+ * { value: 'replies', label: 'Replies', href: `/${username}/replies` },
85
+ * ]}
86
+ * />
87
+ * <Slot />
88
+ * ```
89
+ */
90
+ function RouterTabs({
91
+ items,
92
+ onReselect,
93
+ swipeEnabled = true,
94
+ ...tabsProps
95
+ }) {
96
+ const pathname = (0, _expoRouter.usePathname)();
97
+ const activeValue = (0, _react.useMemo)(() => matchActiveValue(items, pathname), [items, pathname]);
98
+ const dragRef = (0, _react.useRef)(null);
99
+ // What releasing right now would commit. A ref rather than state: it is
100
+ // written on every frame of the drag and read once, and re-rendering the
101
+ // strip mid-gesture would fight the animation the gesture is driving.
102
+ const pendingRef = (0, _react.useRef)(null);
103
+ const navigateTo = (0, _react.useCallback)(value => {
104
+ const target = items.find(item => item.value === value);
105
+ if (!target) return;
106
+ // PUSH, not replace: a history entry per tab is what makes Back return to
107
+ // the tab the reader came from instead of leaving the screen entirely.
108
+ _expoRouter.router.push(target.href);
109
+ }, [items]);
110
+ const handlePress = (0, _react.useCallback)(item => {
111
+ if (item.value === activeValue) {
112
+ onReselect?.(item.value);
113
+ return;
114
+ }
115
+ navigateTo(item.value);
116
+ }, [activeValue, onReselect, navigateTo]);
117
+ const onDrag = (0, _react.useCallback)(translationX => {
118
+ pendingRef.current = dragRef.current?.drag(translationX) ?? null;
119
+ }, []);
120
+
121
+ // `onEnd` does not fire for every terminated gesture, and `onFinalize` fires
122
+ // for all of them — including after `onEnd`. Guarding on the ref being
123
+ // non-null is what makes the second call a no-op instead of a double commit.
124
+ const releasedRef = (0, _react.useRef)(true);
125
+ const onRelease = (0, _react.useCallback)(() => {
126
+ if (releasedRef.current) return;
127
+ releasedRef.current = true;
128
+ const committed = pendingRef.current;
129
+ pendingRef.current = null;
130
+ // The underline commits first and instantly: it lives in the layout, it
131
+ // survives the swap, and it is the honest signal the gesture was accepted.
132
+ // The content area arrives when its chunk does.
133
+ dragRef.current?.release(committed);
134
+ if (committed !== null) navigateTo(committed);
135
+ }, [navigateTo]);
136
+ const onBegin = (0, _react.useCallback)(() => {
137
+ releasedRef.current = false;
138
+ }, []);
139
+ const panGesture = (0, _react.useMemo)(() => _reactNativeGestureHandler.Gesture.Pan()
140
+ // Horizontal intent only. This is a hint to the gesture system and is
141
+ // NOT what protects vertical scrolling on web — see `touchAction` below.
142
+ .activeOffsetX([-12, 12]).failOffsetY([-12, 12]).onBegin(() => {
143
+ (0, _reactNativeReanimated.runOnJS)(onBegin)();
144
+ }).onUpdate(event => {
145
+ (0, _reactNativeReanimated.runOnJS)(onDrag)(event.translationX);
146
+ }).onFinalize(() => {
147
+ (0, _reactNativeReanimated.runOnJS)(onRelease)();
148
+ }), [onBegin, onDrag, onRelease]);
149
+
150
+ // Warm every OTHER tab's async chunk. That fetch is the ~300ms the content
151
+ // area would otherwise spend empty after a commit, and a swipe offers no
152
+ // hover to warm on, so it is done up front rather than on interaction.
153
+ //
154
+ // `router.prefetch` — the public imperative API (declared in expo-router's
155
+ // `global-state/router.d.ts`) — rather than wrapping each trigger in
156
+ // `<Link prefetch asChild>`. Both reasons are about the WRAPPER, not about
157
+ // prefetching: `asChild` is Radix's `Slot`, which COMPOSES event handlers, so
158
+ // the trigger's own `onPress` and the link's navigation would both run — and
159
+ // the link's push knows nothing about `onReselect`, so re-tapping the active
160
+ // tab would push a duplicate entry and make Back appear to do nothing. It
161
+ // also injects an `href` a `Pressable` ignores. The prefetching itself is
162
+ // identical: `<Link prefetch>` renders `<Prefetch href/>` beside its element
163
+ // and does nothing else.
164
+ //
165
+ // Known trade: a real `<Link>` would render a web anchor, which is what gives
166
+ // middle-click and open-in-new-tab. A tab strip arguably wants that; getting
167
+ // both needs the trigger to render an anchor itself, which is a change to the
168
+ // core rather than to this file.
169
+ (0, _react.useEffect)(() => {
170
+ for (const item of items) {
171
+ if (item.value === activeValue || item.disabled) continue;
172
+ _expoRouter.router.prefetch(item.href);
173
+ }
174
+ }, [items, activeValue]);
175
+ const strip =
176
+ /*#__PURE__*/
177
+ // `hasSelection` is what stops the underline asserting a tab while a
178
+ // NON-TAB sibling route is showing — the layout that renders this strip
179
+ // renders those too (a profile's `/followers` beside its tab routes).
180
+ (0, _jsxRuntime.jsx)(_Tabs.Tabs, {
181
+ ...tabsProps,
182
+ ref: dragRef,
183
+ hasSelection: activeValue !== undefined,
184
+ children: items.map(item => /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tabs.TabsTrigger, {
185
+ value: item.value,
186
+ label: item.label,
187
+ icon: item.icon,
188
+ count: item.count,
189
+ disabled: item.disabled
190
+ // Focus, never a press, is what drives the underline — so a deep
191
+ // link, a browser Back and a back gesture animate exactly like a tap.
192
+ ,
193
+ isFocused: item.value === activeValue,
194
+ onPress: () => handlePress(item)
195
+ }, item.value))
196
+ });
197
+ if (!swipeEnabled) return strip;
198
+ return (
199
+ /*#__PURE__*/
200
+ // `touchAction="pan-y"` is MANDATORY and is the landmine of this file.
201
+ // RNGH sets the detector's view to `touch-action: none` on web
202
+ // (`GestureHandlerWebDelegate.js`), which disables browser-native VERTICAL
203
+ // scrolling on that element. `failOffsetY` above does not protect against
204
+ // it: that is a JS decision taken after `touch-action` has already told the
205
+ // browser not to scroll. Removing this prop is silent on native and breaks
206
+ // scrolling on mobile web.
207
+ (0, _jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector, {
208
+ gesture: panGesture,
209
+ touchAction: "pan-y",
210
+ children: strip
211
+ })
212
+ );
213
+ }
214
+ RouterTabs.displayName = 'RouterTabs';
215
+ //# sourceMappingURL=RouterTabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_reactNativeGestureHandler","_reactNativeReanimated","_expoRouter","_Tabs","_jsxRuntime","matchActiveValue","items","pathname","best","item","href","path","split","replace","isMatch","startsWith","length","value","RouterTabs","onReselect","swipeEnabled","tabsProps","usePathname","activeValue","useMemo","dragRef","useRef","pendingRef","navigateTo","useCallback","target","find","router","push","handlePress","onDrag","translationX","current","drag","releasedRef","onRelease","committed","release","onBegin","panGesture","Gesture","Pan","activeOffsetX","failOffsetY","runOnJS","onUpdate","event","onFinalize","useEffect","disabled","prefetch","strip","jsx","Tabs","ref","hasSelection","undefined","children","map","TabsTrigger","label","icon","count","isFocused","onPress","GestureDetector","gesture","touchAction","displayName"],"sourceRoot":"../../../../src","sources":["tabs/expo-router/RouterTabs.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "RouterTabs", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _RouterTabs.RouterTabs;
10
+ }
11
+ });
12
+ var _RouterTabs = require("./RouterTabs.js");
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_RouterTabs","require"],"sourceRoot":"../../../../src","sources":["tabs/expo-router/index.ts"],"mappings":";;;;;;;;;;;AAMA,IAAAA,WAAA,GAAAC,OAAA","ignoreList":[]}
@@ -212,16 +212,17 @@ function vividHueNear(hue) {
212
212
  * why 11 of the 13 presets carry white and exactly the two light ones do not.
213
213
  */
214
214
  function whiteLabelTone(palette, seedTone, isDark) {
215
- // ONE rule, both modes. The fill comes down to the tone a white label needs,
216
- // unless the descent costs more than the budget and destroys the colour then
217
- // it keeps its own tone and takes a black label. Exempting dark, so the fill
218
- // could stay on the brand hex, is what left every Follow button, avatar and
219
- // chat bubble with a black label there while light had eleven white ones: an
220
- // asymmetry nobody chose, visible in every component at once because they all
221
- // read the same token.
222
- const target = isDark ? DARK_FILL_TONE : LIGHT_FILL_TONE;
223
- const candidate = Math.max(target, seedTone - TONE_BUDGET);
224
- return contrastOf(palette.tone(candidate), true) >= AA ? candidate : Math.max(seedTone, isDark ? DARK_SEED_FLOOR : 0);
215
+ // LIGHT: every fill comes down, no exemption. On a near-white page a bright
216
+ // colour has nothing to read against a lime at its own tone 90 is a pale
217
+ // smear there, indistinguishable from the same colour in dark, which is not a
218
+ // theme at all. Coming down is what makes faircoin a deep green in light and a
219
+ // bright lime in dark.
220
+ if (!isDark) return LIGHT_FILL_TONE;
221
+ // DARK: the budget applies. Most brands come down to where white fits, but a
222
+ // seed that is already light cannot without ceasing to be itself, so it keeps
223
+ // its own tone and takes a black label. That is the eleven-and-two pattern.
224
+ const candidate = Math.max(DARK_FILL_TONE, seedTone - TONE_BUDGET);
225
+ return contrastOf(palette.tone(candidate), true) >= AA ? candidate : Math.max(seedTone, DARK_SEED_FLOOR);
225
226
  }
226
227
 
227
228
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["_index","require","_hct","_tonalPalette","_colorUtils","STATUS_SEEDS","exports","success","error","warning","info","AA","rgb","argb","redFromArgb","greenFromArgb","blueFromArgb","rgba","alpha","contrastOf","onWhite","channel","v","c","Math","pow","luminance","foregroundFor","noLegibleForeground","LIGHT_FILL_TONE","DARK_FILL_TONE","TONE_BUDGET","DARK_SEED_FLOOR","DARK_ACCENT_FLOOR","ACCENT_CHROMA","TEXT_TONE","light","dark","TEXT_CHROMA","SUBTLE_SOURCE_TONE","SUBTLE_ALPHA","SPLIT_ROTATIONS","VIVID_SNAP_WINDOW","VIVID_SNAP_MIN_GAIN","MIN_ACCENT_SEPARATION","DESTRUCTIVE_PROXIMITY","hueDistance","a","b","d","abs","min","peakTone","hue","palette","TonalPalette","fromHueAndChroma","bestTone","bestChroma","tone","chroma","Hct","fromInt","peakChroma","vividHueNear","baseChroma","bestHue","delta","candidate","whiteLabelTone","seedTone","isDark","target","max","accentTone","peak","fillPair","startTone","fill","foreground","accentHues","seedHue","firstRotation","secondRotation","geometricA","geometricB","geometricStandout","quiet","snapped","standout","errorHue","argbFromHex","secondary","tertiary","buildPolicyTokens","seedHex","roles","pinned","seed","brandPalette","primary","tokens","surfaceContainer","surfaceContainerLowest","surfaceContainerHigh","onSurfaceVariant","hues","role","pin","undefined","fillPalette","textPalette","vividPalette","pair","i","hex","Object","entries","status"],"sourceRoot":"../../../src","sources":["theme/color-policy.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_index","require","_hct","_tonalPalette","_colorUtils","STATUS_SEEDS","exports","success","error","warning","info","AA","rgb","argb","redFromArgb","greenFromArgb","blueFromArgb","rgba","alpha","contrastOf","onWhite","channel","v","c","Math","pow","luminance","foregroundFor","noLegibleForeground","LIGHT_FILL_TONE","DARK_FILL_TONE","TONE_BUDGET","DARK_SEED_FLOOR","DARK_ACCENT_FLOOR","ACCENT_CHROMA","TEXT_TONE","light","dark","TEXT_CHROMA","SUBTLE_SOURCE_TONE","SUBTLE_ALPHA","SPLIT_ROTATIONS","VIVID_SNAP_WINDOW","VIVID_SNAP_MIN_GAIN","MIN_ACCENT_SEPARATION","DESTRUCTIVE_PROXIMITY","hueDistance","a","b","d","abs","min","peakTone","hue","palette","TonalPalette","fromHueAndChroma","bestTone","bestChroma","tone","chroma","Hct","fromInt","peakChroma","vividHueNear","baseChroma","bestHue","delta","candidate","whiteLabelTone","seedTone","isDark","max","accentTone","peak","fillPair","startTone","fill","foreground","accentHues","seedHue","firstRotation","secondRotation","geometricA","geometricB","geometricStandout","quiet","snapped","standout","errorHue","argbFromHex","secondary","tertiary","buildPolicyTokens","seedHex","roles","pinned","seed","brandPalette","primary","tokens","surfaceContainer","surfaceContainerLowest","surfaceContainerHigh","onSurfaceVariant","hues","role","pin","undefined","fillPalette","textPalette","vividPalette","pair","i","hex","Object","entries","status"],"sourceRoot":"../../../src","sources":["theme/color-policy.ts"],"mappings":"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","ignoreList":[]}
@@ -20,11 +20,13 @@
20
20
  * Nesting extra contexts costs nothing at runtime — the win is that scope is no
21
21
  * longer a per-app decision.
22
22
  *
23
- * EXPO/EXPO-ROUTER APPS ONLY. The scroll-restoration provider it mounts imports
24
- * `expo-router` (its web implementation keys offsets on the focused route), so
25
- * a Vite/SPA consumer that has no expo-router cannot resolve this module. Those
26
- * apps keep mounting `BloomThemeProvider` (and any other piece they need)
27
- * directly that is not a lesser path, just the one without a router.
23
+ * EXPO/EXPO-ROUTER APPS ONLY, and now for one narrow reason: it binds the
24
+ * scroll store to the expo-router ADAPTER, which is the only module in the
25
+ * scroll primitive that imports `expo-router`. The scroll core itself is
26
+ * router-agnostic, so a Vite/SPA consumer can mount
27
+ * `<ScrollRestorationProvider adapter={...}>` from `@oxyhq/bloom/scroll` with
28
+ * an adapter for its own router — alongside `BloomThemeProvider` and whatever
29
+ * else it needs — rather than going without.
28
30
  *
29
31
  * NOT included, on purpose — these are OUTLETS, not state, and their placement
30
32
  * in the tree is a real app decision (z-order, safe areas, and mounting a
@@ -37,7 +39,8 @@ import { ImageResolverProvider } from "../image-resolver/index.js";
37
39
  import { BloomHapticsProvider } from "../hooks/useHaptics.js";
38
40
  import { TabBarMinimizeProvider } from "../tab-bar/minimize-context.js";
39
41
  import { BloomThemeProvider } from "../theme/index.js";
40
- import { ScrollRestorationProvider } from './scroll-provider';
42
+ import { ScrollRestorationProvider } from "../scroll/context.js";
43
+ import { expoRouterScrollAdapter } from "../scroll/expo-router/index.js";
41
44
  import { jsx as _jsx } from "react/jsx-runtime";
42
45
  export function BloomProvider({
43
46
  children,
@@ -54,6 +57,7 @@ export function BloomProvider({
54
57
  children: /*#__PURE__*/_jsx(BloomThemeProvider, {
55
58
  ...themeProps,
56
59
  children: /*#__PURE__*/_jsx(ScrollRestorationProvider, {
60
+ adapter: expoRouterScrollAdapter,
57
61
  children: /*#__PURE__*/_jsx(BloomHapticsProvider, {
58
62
  enabled: haptics,
59
63
  children: /*#__PURE__*/_jsx(TabBarMinimizeProvider, {
@@ -1 +1 @@
1
- {"version":3,"names":["ImageResolverProvider","BloomHapticsProvider","TabBarMinimizeProvider","BloomThemeProvider","ScrollRestorationProvider","jsx","_jsx","BloomProvider","children","imageResolver","haptics","themeProps","value","enabled","displayName"],"sourceRoot":"../../../src","sources":["provider/index.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,qBAAqB,QAA4B,4BAAmB;AAC7E,SAASC,oBAAoB,QAAQ,wBAAqB;AAC1D,SAASC,sBAAsB,QAAQ,gCAA6B;AACpE,SAASC,kBAAkB,QAAsC,mBAAU;AAC3E,SAASC,yBAAyB,QAAQ,mBAAmB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAc9D,OAAO,SAASC,aAAaA,CAAC;EAC5BC,QAAQ;EACRC,aAAa;EACbC,OAAO,GAAG,IAAI;EACd,GAAGC;AACe,CAAC,EAAE;EACrB;IAAA;IACE;IACA;IACAL,IAAA,CAACN,qBAAqB;MAACY,KAAK,EAAEH,aAAa,IAAI,IAAK;MAAAD,QAAA,eAClDF,IAAA,CAACH,kBAAkB;QAAA,GAAKQ,UAAU;QAAAH,QAAA,eAChCF,IAAA,CAACF,yBAAyB;UAAAI,QAAA,eACxBF,IAAA,CAACL,oBAAoB;YAACY,OAAO,EAAEH,OAAQ;YAAAF,QAAA,eACrCF,IAAA,CAACJ,sBAAsB;cAAAM,QAAA,EAAEA;YAAQ,CAAyB;UAAC,CACvC;QAAC,CACE;MAAC,CACV;IAAC,CACA;EAAC;AAE5B;AAEAD,aAAa,CAACO,WAAW,GAAG,eAAe","ignoreList":[]}
1
+ {"version":3,"names":["ImageResolverProvider","BloomHapticsProvider","TabBarMinimizeProvider","BloomThemeProvider","ScrollRestorationProvider","expoRouterScrollAdapter","jsx","_jsx","BloomProvider","children","imageResolver","haptics","themeProps","value","adapter","enabled","displayName"],"sourceRoot":"../../../src","sources":["provider/index.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,qBAAqB,QAA4B,4BAAmB;AAC7E,SAASC,oBAAoB,QAAQ,wBAAqB;AAC1D,SAASC,sBAAsB,QAAQ,gCAA6B;AACpE,SAASC,kBAAkB,QAAsC,mBAAU;AAC3E,SAASC,yBAAyB,QAAQ,sBAAmB;AAC7D,SAASC,uBAAuB,QAAQ,gCAAuB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAchE,OAAO,SAASC,aAAaA,CAAC;EAC5BC,QAAQ;EACRC,aAAa;EACbC,OAAO,GAAG,IAAI;EACd,GAAGC;AACe,CAAC,EAAE;EACrB;IAAA;IACE;IACA;IACAL,IAAA,CAACP,qBAAqB;MAACa,KAAK,EAAEH,aAAa,IAAI,IAAK;MAAAD,QAAA,eAClDF,IAAA,CAACJ,kBAAkB;QAAA,GAAKS,UAAU;QAAAH,QAAA,eAChCF,IAAA,CAACH,yBAAyB;UAACU,OAAO,EAAET,uBAAwB;UAAAI,QAAA,eAC1DF,IAAA,CAACN,oBAAoB;YAACc,OAAO,EAAEJ,OAAQ;YAAAF,QAAA,eACrCF,IAAA,CAACL,sBAAsB;cAAAO,QAAA,EAAEA;YAAQ,CAAyB;UAAC,CACvC;QAAC,CACE;MAAC,CACV;IAAC,CACA;EAAC;AAE5B;AAEAD,aAAa,CAACQ,WAAW,GAAG,eAAe","ignoreList":[]}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * The provider and context both platform barrels share.
5
+ *
6
+ * Nothing here is platform-specific: the provider holds an offset store and the
7
+ * router adapter, and that composition is identical on web and native. Keeping
8
+ * it in one module also guarantees ONE context identity — a provider mounted
9
+ * from the native barrel and a hook imported from the web barrel would
10
+ * otherwise read two different contexts and the hook would throw.
11
+ */
12
+ import { createContext, useContext, useEffect, useMemo } from 'react';
13
+ import { ScrollOffsetStore } from "./store.js";
14
+ import { jsx as _jsx } from "react/jsx-runtime";
15
+ const ScrollRestorationContext = /*#__PURE__*/createContext(null);
16
+ ScrollRestorationContext.displayName = 'BloomScrollRestorationContext';
17
+
18
+ /**
19
+ * Holds the offset map and the router binding for the subtree. One provider
20
+ * near the app root is enough; the store lives as long as the provider, so
21
+ * offsets survive navigating away and back (including browser Back/Forward).
22
+ */
23
+ export function ScrollRestorationProvider({
24
+ children,
25
+ adapter
26
+ }) {
27
+ const store = useMemo(() => new ScrollOffsetStore(), []);
28
+ const value = useMemo(() => ({
29
+ store,
30
+ adapter
31
+ }), [store, adapter]);
32
+ useManualBrowserScrollRestoration();
33
+ return /*#__PURE__*/_jsx(ScrollRestorationContext.Provider, {
34
+ value: value,
35
+ children: children
36
+ });
37
+ }
38
+ export function useScrollRestorationContext() {
39
+ const value = useContext(ScrollRestorationContext);
40
+ if (value === null) {
41
+ throw new Error('useScrollRestoration must be used within a <ScrollRestorationProvider>.');
42
+ }
43
+ return value;
44
+ }
45
+
46
+ /**
47
+ * Take over scroll restoration from the browser for as long as this provider is
48
+ * mounted, and hand it back both on unmount and on `pagehide`.
49
+ *
50
+ * The browser's default `'auto'` restoration fights our restore on
51
+ * Back/Forward, so it has to be turned off — but only while something is
52
+ * actually going to restore instead. Two moments where that stops being true:
53
+ *
54
+ * - **Unmount.** This used to run at MODULE scope, which meant merely
55
+ * importing the module disabled the browser's own restoration. Now that the
56
+ * core is importable by apps that mount no provider (and by SSR and Node
57
+ * tooling), that would have left those apps with neither restoration. Tying
58
+ * the switch to the provider's lifetime makes it describe exactly the period
59
+ * during which a replacement exists. The provider mounts at the app root on
60
+ * the first commit, which is before any navigation can create a history
61
+ * entry, so nothing is lost by not doing it at module scope.
62
+ * - **`pagehide`.** The offset map lives in memory only. A reload starts with
63
+ * an empty one, and a bfcache restore resumes a document whose provider is
64
+ * already mounted and whose focus effects therefore never re-run — so in
65
+ * both cases `'manual'` means NOBODY restores. Handing the mode back to the
66
+ * browser on the way out lets it do the job we are no longer able to.
67
+ * (react-router does exactly this, for the same reason.)
68
+ *
69
+ * The feature detect is also the platform test — `history` exists on web and
70
+ * nowhere else — so this stays one implementation rather than a fork. On React
71
+ * Native and during SSR it is a no-op.
72
+ */
73
+ function useManualBrowserScrollRestoration() {
74
+ useEffect(() => {
75
+ if (typeof window === 'undefined' || typeof history === 'undefined' || !('scrollRestoration' in history)) {
76
+ return undefined;
77
+ }
78
+ const previous = history.scrollRestoration;
79
+ history.scrollRestoration = 'manual';
80
+ const handBackToBrowser = () => {
81
+ history.scrollRestoration = 'auto';
82
+ };
83
+ window.addEventListener('pagehide', handBackToBrowser);
84
+ return () => {
85
+ window.removeEventListener('pagehide', handBackToBrowser);
86
+ history.scrollRestoration = previous;
87
+ };
88
+ }, []);
89
+ }
90
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createContext","useContext","useEffect","useMemo","ScrollOffsetStore","jsx","_jsx","ScrollRestorationContext","displayName","ScrollRestorationProvider","children","adapter","store","value","useManualBrowserScrollRestoration","Provider","useScrollRestorationContext","Error","window","history","undefined","previous","scrollRestoration","handBackToBrowser","addEventListener","removeEventListener"],"sourceRoot":"../../../src","sources":["scroll/context.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,aAAa,EAAEC,UAAU,EAAEC,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAErE,SAASC,iBAAiB,QAAQ,YAAS;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAW5C,MAAMC,wBAAwB,gBAC5BP,aAAa,CAAuC,IAAI,CAAC;AAC3DO,wBAAwB,CAACC,WAAW,GAAG,+BAA+B;;AAEtE;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,yBAAyBA,CAAC;EACxCC,QAAQ;EACRC;AAC8B,CAAC,EAAE;EACjC,MAAMC,KAAK,GAAGT,OAAO,CAAC,MAAM,IAAIC,iBAAiB,CAAC,CAAC,EAAE,EAAE,CAAC;EACxD,MAAMS,KAAK,GAAGV,OAAO,CAAC,OAAO;IAAES,KAAK;IAAED;EAAQ,CAAC,CAAC,EAAE,CAACC,KAAK,EAAED,OAAO,CAAC,CAAC;EAEnEG,iCAAiC,CAAC,CAAC;EAEnC,oBACER,IAAA,CAACC,wBAAwB,CAACQ,QAAQ;IAACF,KAAK,EAAEA,KAAM;IAAAH,QAAA,EAC7CA;EAAQ,CACwB,CAAC;AAExC;AAEA,OAAO,SAASM,2BAA2BA,CAAA,EAAkC;EAC3E,MAAMH,KAAK,GAAGZ,UAAU,CAACM,wBAAwB,CAAC;EAClD,IAAIM,KAAK,KAAK,IAAI,EAAE;IAClB,MAAM,IAAII,KAAK,CACb,yEACF,CAAC;EACH;EACA,OAAOJ,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,iCAAiCA,CAAA,EAAS;EACjDZ,SAAS,CAAC,MAAM;IACd,IACE,OAAOgB,MAAM,KAAK,WAAW,IAC7B,OAAOC,OAAO,KAAK,WAAW,IAC9B,EAAE,mBAAmB,IAAIA,OAAO,CAAC,EACjC;MACA,OAAOC,SAAS;IAClB;IACA,MAAMC,QAAQ,GAAGF,OAAO,CAACG,iBAAiB;IAC1CH,OAAO,CAACG,iBAAiB,GAAG,QAAQ;IAEpC,MAAMC,iBAAiB,GAAGA,CAAA,KAAM;MAC9BJ,OAAO,CAACG,iBAAiB,GAAG,MAAM;IACpC,CAAC;IACDJ,MAAM,CAACM,gBAAgB,CAAC,UAAU,EAAED,iBAAiB,CAAC;IAEtD,OAAO,MAAM;MACXL,MAAM,CAACO,mBAAmB,CAAC,UAAU,EAAEF,iBAAiB,CAAC;MACzDJ,OAAO,CAACG,iBAAiB,GAAGD,QAAQ;IACtC,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;AACR","ignoreList":[]}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * The expo-router binding for `@oxyhq/bloom/scroll`.
5
+ *
6
+ * This is the only file in the scroll primitive that knows a router exists. It
7
+ * is separate from the core so a consumer with a different router — or none —
8
+ * can still use the core with its own adapter; before the split, a module-scope
9
+ * `expo-router` import made the whole subpath unresolvable for them.
10
+ *
11
+ * The navigation hooks come from `expo-router` (which re-exports React
12
+ * Navigation's) rather than from `@react-navigation/native` directly. Every Oxy
13
+ * app uses expo-router as its router, so it is always a DIRECT, top-level
14
+ * dependency that resolves cleanly under Bun's isolated linker — whereas
15
+ * `@react-navigation/native` is only a nested/transitive dependency of
16
+ * expo-router and would fail to resolve when bundling those apps.
17
+ */
18
+ import { useMemo } from 'react';
19
+ import { useFocusEffect, useRoute } from 'expo-router';
20
+ /**
21
+ * Params that describe how a screen was REACHED rather than what it shows, and
22
+ * so must not contribute to a content id — the same screen showing the same
23
+ * thing would otherwise get two ids depending on how the user got there.
24
+ *
25
+ * - `screen` / `params` are React Navigation's nested-navigator plumbing.
26
+ * expo-router strips both wherever it derives a URL from state
27
+ * (`global-state/getRouteInfoFromState.js` deletes them before building the
28
+ * pathname; `global-state/stateUtils.js` deletes `screen` from a payload;
29
+ * `hooks/useSearchParams.js` skips both).
30
+ * - `initial` is React Navigation's reserved anchor flag, set by expo-router's
31
+ * `withAnchor` handling in `global-state/getNavigationAction.js` — which also
32
+ * warns if an app supplies it as a real param.
33
+ */
34
+ const NON_CONTENT_PARAM_KEYS = new Set(['screen', 'params', 'initial']);
35
+
36
+ /**
37
+ * expo-router's own internal params all carry this prefix
38
+ * (`build/navigationParams.js` — `__internal_expo_router_no_animation`,
39
+ * `__internal__expo_router_is_preview_navigation`, and the two zoom-transition
40
+ * ids, verified identical in expo-router 56.2.10 and 57.0.9). They are appended
41
+ * to the params of an ordinary navigation, so matching the prefix rather than
42
+ * the four literals means a fifth one added upstream cannot silently split one
43
+ * screen's content id in two.
44
+ */
45
+ const INTERNAL_PARAM_PREFIX = '__internal';
46
+
47
+ /**
48
+ * Depth at which nested param objects stop being described. React Navigation
49
+ * expects params to be serializable, but nothing enforces it, and a serializer
50
+ * that a cyclic value can hang is not one to put on a render path. Four levels
51
+ * is far past anything a URL produces.
52
+ */
53
+ const MAX_PARAM_DEPTH = 4;
54
+ function serializeValue(value, depth) {
55
+ if (value === undefined) return '~undefined';
56
+ if (value === null) return '~null';
57
+ // JSON.stringify quotes and escapes, so a string can never be confused with
58
+ // a marker above or with the punctuation of a nested structure below.
59
+ if (typeof value === 'string') return JSON.stringify(value);
60
+ if (typeof value === 'number' || typeof value === 'boolean') {
61
+ return String(value);
62
+ }
63
+ if (depth >= MAX_PARAM_DEPTH) return '~deep';
64
+ if (Array.isArray(value)) {
65
+ return `[${value.map(entry => serializeValue(entry, depth + 1)).join(',')}]`;
66
+ }
67
+ if (typeof value === 'object') {
68
+ const source = value;
69
+ return `{${Object.keys(source).sort().map(key => `${JSON.stringify(key)}:${serializeValue(source[key], depth + 1)}`).join(',')}}`;
70
+ }
71
+ // A function, symbol or bigint reached a screen's params. Nothing about it
72
+ // identifies content, and it cannot be compared across renders anyway.
73
+ return '~opaque';
74
+ }
75
+
76
+ /**
77
+ * Render a screen's params as a stable string. Keys are SORTED so params that
78
+ * differ only in insertion order — routinely, since expo-router rebuilds the
79
+ * object on every navigation — can never produce two ids for one screen.
80
+ *
81
+ * The exclusions apply at the top level only, because that is where React
82
+ * Navigation and expo-router inject theirs; a nested user object keeps every
83
+ * key it has.
84
+ */
85
+ function serializeContentParams(params) {
86
+ if (params === undefined) return '';
87
+ const source = params;
88
+ return Object.keys(source).filter(key => !NON_CONTENT_PARAM_KEYS.has(key) && !key.startsWith(INTERNAL_PARAM_PREFIX)).sort().map(key => `${JSON.stringify(key)}:${serializeValue(source[key], 1)}`).join(',');
89
+ }
90
+
91
+ /**
92
+ * Identify WHAT the calling screen is showing: its route name plus its params.
93
+ *
94
+ * `useRoute()` is the source, and it has to be: it reads the route object of
95
+ * the nearest screen, so a background screen keeps reporting its own content.
96
+ * `usePathname()` would not do — it reads the globally focused route, so a
97
+ * background screen would adopt the foreground one's pathname and save its
98
+ * offset under a key that is not its own.
99
+ *
100
+ * `route.key` is deliberately NOT part of this. An offset belongs to what the
101
+ * user was looking at, not to the history slot it occupied — see
102
+ * `deriveScrollKey` for the full reasoning and the trade it makes.
103
+ *
104
+ * Params are what separate two screens sharing a route name. That matters most
105
+ * where expo-router RECYCLES a route object: `layouts/StackClient.js` reuses
106
+ * the current route — key included — when `NAVIGATE` targets the current route
107
+ * name and `getSingularId` matches, i.e. when only the query changed. Measured
108
+ * on 56.2.10 and 57.0.9: `search?q=cats` -> `search?q=dogs` keeps one key and
109
+ * swaps `params`, so without the params the two searches would share an offset.
110
+ */
111
+ function useScreenContentId() {
112
+ const route = useRoute();
113
+ const contentId = `${route.name}?${serializeContentParams(route.params)}`;
114
+ return useMemo(() => contentId, [contentId]);
115
+ }
116
+ function useScreenFocusEffect(effect) {
117
+ useFocusEffect(effect);
118
+ }
119
+
120
+ /**
121
+ * The adapter to hand `<ScrollRestorationProvider adapter={...}>` in an
122
+ * expo-router app. A module-level constant, as the adapter contract requires.
123
+ */
124
+ export const expoRouterScrollAdapter = {
125
+ useScreenContentId,
126
+ useScreenFocusEffect
127
+ };
128
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","useFocusEffect","useRoute","NON_CONTENT_PARAM_KEYS","Set","INTERNAL_PARAM_PREFIX","MAX_PARAM_DEPTH","serializeValue","value","depth","undefined","JSON","stringify","String","Array","isArray","map","entry","join","source","Object","keys","sort","key","serializeContentParams","params","filter","has","startsWith","useScreenContentId","route","contentId","name","useScreenFocusEffect","effect","expoRouterScrollAdapter"],"sourceRoot":"../../../../src","sources":["scroll/expo-router/index.ts"],"mappings":"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","ignoreList":[]}