@oxyhq/bloom 0.53.0 → 0.54.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.
@@ -51,6 +51,8 @@ function TabBarBody({
51
51
  onIndexLongPress,
52
52
  theme: themeOverrides,
53
53
  haptics = true,
54
+ blur = true,
55
+ maxWidth,
54
56
  style,
55
57
  ...viewProps
56
58
  }) {
@@ -67,6 +69,19 @@ function TabBarBody({
67
69
  const theme = (0, _shared.useTabBarTheme)(themeOverrides);
68
70
  const impact = (0, _useHaptics.useHaptics)();
69
71
 
72
+ // The pill's OUTER width (the box the animated minimize inset is applied
73
+ // inside), and the single source of truth for it: the wrap's own layout, the
74
+ // highlight geometry and the `indexAtX` scrub worklet all derive from this one
75
+ // number. They have to, or a tap lands on a tab the highlight is not under —
76
+ // the exact failure `maxWidth` exists to prevent, since narrowing the bar from
77
+ // the outside with a `style` override moves only the pixels.
78
+ //
79
+ // Unconstrained it is what the stretched wrap already measures
80
+ // (`windowWidth - BAR_MARGIN * 2`), so an existing consumer's geometry is
81
+ // unchanged to the pixel. `maxWidth` is a ceiling, never a floor: on a window
82
+ // narrower than it, the bar stays full-bleed.
83
+ const barOuterWidth = maxWidth === undefined ? windowWidth - _shared.BAR_MARGIN * 2 : Math.min(windowWidth - _shared.BAR_MARGIN * 2, maxWidth);
84
+
70
85
  // Picker-style tick while the highlight crosses tab boundaries mid-drag.
71
86
  // `useHaptics` already no-ops on web, when the optional `expo-haptics` peer
72
87
  // is absent, and when a `BloomHapticsProvider` has haptics turned off — so
@@ -107,7 +122,13 @@ function TabBarBody({
107
122
  'worklet';
108
123
 
109
124
  const sideInset = (0, _reactNativeReanimated.interpolate)(minimizedValue, [0, 1], [0, _shared.MINIMIZED_INSET], _reactNativeReanimated.Extrapolation.CLAMP);
110
- const barWidth = windowWidth - _shared.BAR_MARGIN * 2 - sideInset * 2;
125
+ // `event.x` is measured from the left edge of the view the detector is
126
+ // attached to — the animated pill itself, NOT the window and not the wrap
127
+ // around it. Its width is therefore the outer width minus the two
128
+ // animated margins, which is exactly what this computes, constrained or
129
+ // not. (Margins sit outside a view's own box, so x = 0 is the pill's left
130
+ // border edge either way.)
131
+ const barWidth = barOuterWidth - sideInset * 2;
111
132
  const itemWidth = (barWidth - _shared.ROW_PAD_H * 2) / tabCount;
112
133
  const raw = (x - _shared.ROW_PAD_H) / itemWidth - 0.5;
113
134
  return Math.min(Math.max(raw, 0), tabCount - 1);
@@ -163,7 +184,7 @@ function TabBarBody({
163
184
  (0, _reactNativeReanimated.runOnJS)(longPressIndex)(Math.round(indexAtX(event.x, progress.value)));
164
185
  });
165
186
  return _reactNativeGestureHandler.Gesture.Race(pan, tap, longPress);
166
- }, [windowWidth, tabCount, selectIndex, hasLongPress, longPressIndex, tick, isDragging, lastTicked, slideIndex, minimized, progress]);
187
+ }, [barOuterWidth, tabCount, selectIndex, hasLongPress, longPressIndex, tick, isDragging, lastTicked, slideIndex, minimized, progress]);
167
188
 
168
189
  // CRITICAL — every shared value and every scalar a mapper READS must appear
169
190
  // in its dependency array. On web WITHOUT the react-native-worklets babel
@@ -214,7 +235,9 @@ function TabBarBody({
214
235
  const barHeight = (0, _reactNativeReanimated.interpolate)(progress.value, [0, 1], [_shared.EXPANDED_HEIGHT, _shared.MINIMIZED_HEIGHT], _reactNativeReanimated.Extrapolation.CLAMP);
215
236
  const height = (0, _reactNativeReanimated.interpolate)(progress.value, [0, 1], [_shared.HIGHLIGHT_EXPANDED, _shared.HIGHLIGHT_MINIMIZED], _reactNativeReanimated.Extrapolation.CLAMP);
216
237
  const sideInset = (0, _reactNativeReanimated.interpolate)(progress.value, [0, 1], [0, _shared.MINIMIZED_INSET], _reactNativeReanimated.Extrapolation.CLAMP);
217
- const barWidth = windowWidth - _shared.BAR_MARGIN * 2 - sideInset * 2;
238
+ // Same `barOuterWidth` the scrub worklet resolves an index from see the
239
+ // note where it is computed.
240
+ const barWidth = barOuterWidth - sideInset * 2;
218
241
  const itemWidth = (barWidth - _shared.ROW_PAD_H * 2) / tabCount;
219
242
  return {
220
243
  height,
@@ -225,11 +248,27 @@ function TabBarBody({
225
248
  translateX: _shared.ROW_PAD_H + itemWidth * slideIndex.value
226
249
  }]
227
250
  };
228
- }, [progress, slideIndex, windowWidth, tabCount]);
251
+ }, [progress, slideIndex, barOuterWidth, tabCount]);
229
252
 
230
253
  // Shared with `useTabBarFootprint`, so a consumer accounting for the bar in
231
254
  // its own layout can never drift from where the bar actually sits.
232
255
  const bottomOffset = (0, _shared.tabBarBottomGap)(insets.bottom);
256
+
257
+ // How centring and the animated inset compose: centring is STATIC and belongs
258
+ // to the wrap, the inset stays ANIMATED on the pill inside it. The wrap is
259
+ // centred once by layout at a definite width, and the pill's two equal
260
+ // margins keep it centred within that wrap at every point of the minimize
261
+ // animation — neither has to know about the other. Centring the animated view
262
+ // itself would instead mean `alignSelf: 'center'` on a node with no width of
263
+ // its own (its width comes from those margins), which Yoga then sizes from its
264
+ // CONTENT rather than from the constraint.
265
+ //
266
+ // Applied only when `maxWidth` is set: with no width and no `alignSelf` the
267
+ // wrap stretches, which is the original full-bleed behaviour.
268
+ const constrainedWrapStyle = maxWidth === undefined ? null : {
269
+ width: barOuterWidth,
270
+ alignSelf: 'center'
271
+ };
233
272
  const barContext = (0, _react.useMemo)(() => ({
234
273
  slideIndex,
235
274
  isDragging,
@@ -240,8 +279,9 @@ function TabBarBody({
240
279
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
241
280
  ...viewProps,
242
281
  style: [styles.root, style],
243
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Blur, {
282
+ children: [blur !== false && /*#__PURE__*/(0, _jsxRuntime.jsx)(Blur, {
244
283
  direction: "bottom",
284
+ intensity: typeof blur === 'object' ? blur.intensity : undefined,
245
285
  style: {
246
286
  position: 'absolute',
247
287
  left: 0,
@@ -252,7 +292,7 @@ function TabBarBody({
252
292
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
253
293
  style: [styles.barWrap, {
254
294
  marginBottom: bottomOffset
255
- }],
295
+ }, constrainedWrapStyle],
256
296
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector, {
257
297
  gesture: gesture,
258
298
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNativeReanimated.default.View, {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_reactNative","_reactNativeGestureHandler","_reactNativeReanimated","_interopRequireWildcard","_reactNativeSafeAreaContext","_useHaptics","_minimizeContext","_shared","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","BarContext","createContext","TabBarBody","Surface","Blur","children","activeIndex","onIndexChange","onIndexLongPress","theme","themeOverrides","haptics","style","viewProps","insets","useSafeAreaInsets","width","windowWidth","useWindowDimensions","minimized","useMinimizeState","progress","slideIndex","useSharedValue","isDragging","lastTicked","tabCount","Math","max","Children","count","useTabBarTheme","impact","useHaptics","tick","useCallback","selectIndex","index","longPressIndex","hasLongPress","undefined","useEffect","value","withSpring","SLIDE_SPRING","gesture","useMemo","indexAtX","x","minimizedValue","sideInset","interpolate","MINIMIZED_INSET","Extrapolation","CLAMP","barWidth","BAR_MARGIN","itemWidth","ROW_PAD_H","raw","min","pan","Gesture","Pan","activeOffsetX","failOffsetY","onStart","round","setMinimized","onUpdate","event","rounded","runOnJS","onFinalize","tap","Tap","maxDistance","maxDuration","onEnd","success","Race","longPress","LongPress","minDuration","LONG_PRESS_MIN_DURATION","barStyle","useAnimatedStyle","height","EXPANDED_HEIGHT","MINIMIZED_HEIGHT","inset","marginLeft","marginRight","shapeStyle","borderRadius","highlightStyle","barHeight","HIGHLIGHT_EXPANDED","HIGHLIGHT_MINIMIZED","top","transform","translateX","bottomOffset","tabBarBottomGap","bottom","barContext","jsxs","View","styles","root","jsx","direction","position","left","right","BLUR_BLEED","barWrap","marginBottom","GestureDetector","highlight","backgroundColor","accessibilityRole","itemRow","Provider","TabBarButtonBody","Glyph","item","isFocused","onPress","pressableProps","bar","useContext","standaloneTheme","focused","activeGlyphStyle","opacity","abs","labelStyle","color","interpolateColor","activeTint","inactiveTint","boxStyle","Pressable","accessibilityState","selected","accessibilityLabel","label","state","button","itemBox","tint","size","ICON_SIZE","active","StyleSheet","absoluteFill","glyphLayer","Text","numberOfLines","createTabBar","TabBar","props","displayName","createTabBarButton","TabBarButton","create","pointerEvents","marginHorizontal","borderCurve","flex","flexDirection","alignItems","paddingHorizontal","justifyContent","alignSelf","paddingTop","ITEM_PAD_V","overflow","fontSize","LABEL_FONT_SIZE","fontWeight","marginTop","ITEM_GAP"],"sourceRoot":"../../../src","sources":["tab-bar/TabBarBase.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_reactNative","_reactNativeGestureHandler","_reactNativeReanimated","_interopRequireWildcard","_reactNativeSafeAreaContext","_useHaptics","_minimizeContext","_shared","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","BarContext","createContext","TabBarBody","Surface","Blur","children","activeIndex","onIndexChange","onIndexLongPress","theme","themeOverrides","haptics","blur","maxWidth","style","viewProps","insets","useSafeAreaInsets","width","windowWidth","useWindowDimensions","minimized","useMinimizeState","progress","slideIndex","useSharedValue","isDragging","lastTicked","tabCount","Math","max","Children","count","useTabBarTheme","impact","useHaptics","barOuterWidth","undefined","BAR_MARGIN","min","tick","useCallback","selectIndex","index","longPressIndex","hasLongPress","useEffect","value","withSpring","SLIDE_SPRING","gesture","useMemo","indexAtX","x","minimizedValue","sideInset","interpolate","MINIMIZED_INSET","Extrapolation","CLAMP","barWidth","itemWidth","ROW_PAD_H","raw","pan","Gesture","Pan","activeOffsetX","failOffsetY","onStart","round","setMinimized","onUpdate","event","rounded","runOnJS","onFinalize","tap","Tap","maxDistance","maxDuration","onEnd","success","Race","longPress","LongPress","minDuration","LONG_PRESS_MIN_DURATION","barStyle","useAnimatedStyle","height","EXPANDED_HEIGHT","MINIMIZED_HEIGHT","inset","marginLeft","marginRight","shapeStyle","borderRadius","highlightStyle","barHeight","HIGHLIGHT_EXPANDED","HIGHLIGHT_MINIMIZED","top","transform","translateX","bottomOffset","tabBarBottomGap","bottom","constrainedWrapStyle","alignSelf","barContext","jsxs","View","styles","root","jsx","direction","intensity","position","left","right","BLUR_BLEED","barWrap","marginBottom","GestureDetector","highlight","backgroundColor","accessibilityRole","itemRow","Provider","TabBarButtonBody","Glyph","item","isFocused","onPress","pressableProps","bar","useContext","standaloneTheme","focused","activeGlyphStyle","opacity","abs","labelStyle","color","interpolateColor","activeTint","inactiveTint","boxStyle","Pressable","accessibilityState","selected","accessibilityLabel","label","state","button","itemBox","tint","size","ICON_SIZE","active","StyleSheet","absoluteFill","glyphLayer","Text","numberOfLines","createTabBar","TabBar","props","displayName","createTabBarButton","TabBarButton","create","pointerEvents","marginHorizontal","borderCurve","flex","flexDirection","alignItems","paddingHorizontal","justifyContent","paddingTop","ITEM_PAD_V","overflow","fontSize","LABEL_FONT_SIZE","fontWeight","marginTop","ITEM_GAP"],"sourceRoot":"../../../src","sources":["tab-bar/TabBarBase.tsx"],"mappings":";;;;;;;AAeA,IAAAA,MAAA,GAAAC,OAAA;AASA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,0BAAA,GAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAC,uBAAA,CAAAJ,OAAA;AAUA,IAAAK,2BAAA,GAAAL,OAAA;AAEA,IAAAM,WAAA,GAAAN,OAAA;AAEA,IAAAO,gBAAA,GAAAP,OAAA;AACA,IAAAQ,OAAA,GAAAR,OAAA;AAmBkB,IAAAS,WAAA,GAAAT,OAAA;AAAA,SAAAI,wBAAAM,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAR,uBAAA,YAAAA,CAAAM,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AA5DlB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAiDA;AACA;AACA;AACA;AACA;;AAaA,MAAMkB,UAAU,gBAAG,IAAAC,oBAAa,EAAyB,IAAI,CAAC;AAO9D;AACA;AACA;AACA;AACA,SAASC,UAAUA,CAAC;EAClBC,OAAO;EACPC,IAAI;EACJC,QAAQ;EACRC,WAAW;EACXC,aAAa;EACbC,gBAAgB;EAChBC,KAAK,EAAEC,cAAc;EACrBC,OAAO,GAAG,IAAI;EACdC,IAAI,GAAG,IAAI;EACXC,QAAQ;EACRC,KAAK;EACL,GAAGC;AACY,CAAC,EAAE;EAClB,MAAMC,MAAM,GAAG,IAAAC,6CAAiB,EAAC,CAAC;EAClC,MAAM;IAAEC,KAAK,EAAEC;EAAY,CAAC,GAAG,IAAAC,gCAAmB,EAAC,CAAC;EACpD,MAAMC,SAAS,GAAG,IAAAC,iCAAgB,EAAC,CAAC;EACpC,MAAMC,QAAQ,GAAGF,SAAS,CAACE,QAAQ;EACnC,MAAMC,UAAU,GAAG,IAAAC,qCAAc,EAAC,CAAC,CAAC;EACpC,MAAMC,UAAU,GAAG,IAAAD,qCAAc,EAAC,KAAK,CAAC;EACxC,MAAME,UAAU,GAAG,IAAAF,qCAAc,EAAC,CAAC,CAAC,CAAC;EACrC,MAAMG,QAAQ,GAAGC,IAAI,CAACC,GAAG,CAACC,eAAQ,CAACC,KAAK,CAAC3B,QAAQ,CAAC,EAAE,CAAC,CAAC;EACtD,MAAMI,KAAK,GAAG,IAAAwB,sBAAc,EAACvB,cAAc,CAAC;EAC5C,MAAMwB,MAAM,GAAG,IAAAC,sBAAU,EAAC,CAAC;;EAE3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAAMC,aAAa,GACjBvB,QAAQ,KAAKwB,SAAS,GAClBlB,WAAW,GAAGmB,kBAAU,GAAG,CAAC,GAC5BT,IAAI,CAACU,GAAG,CAACpB,WAAW,GAAGmB,kBAAU,GAAG,CAAC,EAAEzB,QAAQ,CAAC;;EAEtD;EACA;EACA;EACA;EACA,MAAM2B,IAAI,GAAG,IAAAC,kBAAW,EAAC,MAAM;IAC7B,IAAI9B,OAAO,EAAEuB,MAAM,CAAC,OAAO,CAAC;EAC9B,CAAC,EAAE,CAACvB,OAAO,EAAEuB,MAAM,CAAC,CAAC;;EAErB;EACA;EACA,MAAMQ,WAAW,GAAG,IAAAD,kBAAW,EAAEE,KAAa,IAAKpC,aAAa,GAAGoC,KAAK,CAAC,EAAE,CAACpC,aAAa,CAAC,CAAC;;EAE3F;EACA;EACA,MAAMqC,cAAc,GAAG,IAAAH,kBAAW,EAC/BE,KAAa,IAAKnC,gBAAgB,GAAGmC,KAAK,CAAC,EAC5C,CAACnC,gBAAgB,CACnB,CAAC;EACD,MAAMqC,YAAY,GAAGrC,gBAAgB,KAAK6B,SAAS;;EAEnD;EACA;EACA;EACA;EACA;EACA;EACA,IAAAS,gBAAS,EAAC,MAAM;IACd,IAAIxC,WAAW,KAAK+B,SAAS,EAAE;IAC/B;IACA,IAAIX,UAAU,CAACqB,KAAK,EAAE;IACtBvB,UAAU,CAACuB,KAAK,GAAG,IAAAC,iCAAU,EAAC1C,WAAW,EAAE2C,oBAAY,CAAC;EAC1D,CAAC,EAAE,CAAC3C,WAAW,EAAEkB,UAAU,EAAEE,UAAU,CAAC,CAAC;;EAEzC;EACA;EACA;EACA;EACA;EACA,MAAMwB,OAAO,GAAG,IAAAC,cAAO,EAAC,MAAM;IAC5B,MAAMC,QAAQ,GAAGA,CAACC,CAAS,EAAEC,cAAsB,KAAK;MACtD,SAAS;;MACT,MAAMC,SAAS,GAAG,IAAAC,kCAAW,EAC3BF,cAAc,EACd,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,CAAC,EAAEG,uBAAe,CAAC,EACpBC,oCAAa,CAACC,KAChB,CAAC;MACD;MACA;MACA;MACA;MACA;MACA;MACA,MAAMC,QAAQ,GAAGxB,aAAa,GAAGmB,SAAS,GAAG,CAAC;MAC9C,MAAMM,SAAS,GAAG,CAACD,QAAQ,GAAGE,iBAAS,GAAG,CAAC,IAAIlC,QAAQ;MACvD,MAAMmC,GAAG,GAAG,CAACV,CAAC,GAAGS,iBAAS,IAAID,SAAS,GAAG,GAAG;MAC7C,OAAOhC,IAAI,CAACU,GAAG,CAACV,IAAI,CAACC,GAAG,CAACiC,GAAG,EAAE,CAAC,CAAC,EAAEnC,QAAQ,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,MAAMoC,GAAG,GAAGC,kCAAO,CAACC,GAAG,CAAC,CAAC,CACtBC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CACtBC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CACtBC,OAAO,CAAC,MAAM;MACb3C,UAAU,CAACqB,KAAK,GAAG,IAAI;MACvBpB,UAAU,CAACoB,KAAK,GAAGlB,IAAI,CAACyC,KAAK,CAAC9C,UAAU,CAACuB,KAAK,CAAC;MAC/C;MACA,IAAAwB,6BAAY,EAAClD,SAAS,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CACDmD,QAAQ,CAAEC,KAAK,IAAK;MACnB,MAAM9B,KAAK,GAAGS,QAAQ,CAACqB,KAAK,CAACpB,CAAC,EAAE9B,QAAQ,CAACwB,KAAK,CAAC;MAC/CvB,UAAU,CAACuB,KAAK,GAAGJ,KAAK;MAExB,MAAM+B,OAAO,GAAG7C,IAAI,CAACyC,KAAK,CAAC3B,KAAK,CAAC;MACjC,IAAI+B,OAAO,KAAK/C,UAAU,CAACoB,KAAK,EAAE;QAChCpB,UAAU,CAACoB,KAAK,GAAG2B,OAAO;QAC1B,IAAAC,8BAAO,EAACnC,IAAI,CAAC,CAAC,CAAC;MACjB;IACF,CAAC,CAAC,CACDoC,UAAU,CAAC,MAAM;MAChB;MACA;MACA,IAAI,CAAClD,UAAU,CAACqB,KAAK,EAAE;QACrB;MACF;MACA,MAAM2B,OAAO,GAAG7C,IAAI,CAACyC,KAAK,CAAC9C,UAAU,CAACuB,KAAK,CAAC;MAC5CvB,UAAU,CAACuB,KAAK,GAAG,IAAAC,iCAAU,EAAC0B,OAAO,EAAEzB,oBAAY,CAAC;MACpD,IAAA0B,8BAAO,EAACjC,WAAW,CAAC,CAACgC,OAAO,CAAC;MAC7BhD,UAAU,CAACqB,KAAK,GAAG,KAAK;IAC1B,CAAC,CAAC;IAEJ,MAAM8B,GAAG,GAAGZ,kCAAO,CAACa,GAAG,CAAC;IACtB;IACA;IAAA,CACCC,WAAW,CAAC,EAAE,CAAC,CACfC,WAAW,CAAC,GAAG,CAAC,CAChBC,KAAK,CAAC,CAACR,KAAK,EAAES,OAAO,KAAK;MACzB,IAAI,CAACA,OAAO,EAAE;QACZ;MACF;MACA,MAAMvC,KAAK,GAAGd,IAAI,CAACyC,KAAK,CAAClB,QAAQ,CAACqB,KAAK,CAACpB,CAAC,EAAE9B,QAAQ,CAACwB,KAAK,CAAC,CAAC;MAC3DvB,UAAU,CAACuB,KAAK,GAAG,IAAAC,iCAAU,EAACL,KAAK,EAAEM,oBAAY,CAAC;MAClD,IAAAsB,6BAAY,EAAClD,SAAS,EAAE,CAAC,CAAC;MAC1B,IAAAsD,8BAAO,EAACjC,WAAW,CAAC,CAACC,KAAK,CAAC;IAC7B,CAAC,CAAC;IAEJ,IAAI,CAACE,YAAY,EAAE,OAAOoB,kCAAO,CAACkB,IAAI,CAACnB,GAAG,EAAEa,GAAG,CAAC;;IAEhD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,MAAMO,SAAS,GAAGnB,kCAAO,CAACoB,SAAS,CAAC,CAAC,CAClCC,WAAW,CAACC,+BAAuB,CAAC,CACpClB,OAAO,CAAEI,KAAK,IAAK;MAClB,IAAAE,8BAAO,EAAC/B,cAAc,CAAC,CAACf,IAAI,CAACyC,KAAK,CAAClB,QAAQ,CAACqB,KAAK,CAACpB,CAAC,EAAE9B,QAAQ,CAACwB,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC;IAEJ,OAAOkB,kCAAO,CAACkB,IAAI,CAACnB,GAAG,EAAEa,GAAG,EAAEO,SAAS,CAAC;EAC1C,CAAC,EAAE,CACDhD,aAAa,EACbR,QAAQ,EACRc,WAAW,EACXG,YAAY,EACZD,cAAc,EACdJ,IAAI,EACJd,UAAU,EACVC,UAAU,EACVH,UAAU,EACVH,SAAS,EACTE,QAAQ,CACT,CAAC;;EAEF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAAMiE,QAAQ,GAAG,IAAAC,uCAAgB,EAAC,MAAM;IACtC,MAAMC,MAAM,GAAG,IAAAlC,kCAAW,EACxBjC,QAAQ,CAACwB,KAAK,EACd,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC4C,uBAAe,EAAEC,wBAAgB,CAAC,EACnClC,oCAAa,CAACC,KAChB,CAAC;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,MAAMkC,KAAK,GAAG,IAAArC,kCAAW,EAACjC,QAAQ,CAACwB,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAEU,uBAAe,CAAC,EAAEC,oCAAa,CAACC,KAAK,CAAC;IAC5F,OAAO;MAAE+B,MAAM;MAAEI,UAAU,EAAED,KAAK;MAAEE,WAAW,EAAEF;IAAM,CAAC;EAC1D,CAAC,EAAE,CAACtE,QAAQ,CAAC,CAAC;;EAEd;EACA;EACA;EACA,MAAMyE,UAAU,GAAG,IAAAP,uCAAgB,EAAC,MAAM;IACxC,MAAMC,MAAM,GAAG,IAAAlC,kCAAW,EACxBjC,QAAQ,CAACwB,KAAK,EACd,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC4C,uBAAe,EAAEC,wBAAgB,CAAC,EACnClC,oCAAa,CAACC,KAChB,CAAC;IACD,OAAO;MAAEsC,YAAY,EAAEP,MAAM,GAAG;IAAE,CAAC;EACrC,CAAC,EAAE,CAACnE,QAAQ,CAAC,CAAC;;EAEd;EACA;EACA,MAAM2E,cAAc,GAAG,IAAAT,uCAAgB,EAAC,MAAM;IAC5C,MAAMU,SAAS,GAAG,IAAA3C,kCAAW,EAC3BjC,QAAQ,CAACwB,KAAK,EACd,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC4C,uBAAe,EAAEC,wBAAgB,CAAC,EACnClC,oCAAa,CAACC,KAChB,CAAC;IACD,MAAM+B,MAAM,GAAG,IAAAlC,kCAAW,EACxBjC,QAAQ,CAACwB,KAAK,EACd,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAACqD,0BAAkB,EAAEC,2BAAmB,CAAC,EACzC3C,oCAAa,CAACC,KAChB,CAAC;IACD,MAAMJ,SAAS,GAAG,IAAAC,kCAAW,EAC3BjC,QAAQ,CAACwB,KAAK,EACd,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,CAAC,EAAEU,uBAAe,CAAC,EACpBC,oCAAa,CAACC,KAChB,CAAC;IACD;IACA;IACA,MAAMC,QAAQ,GAAGxB,aAAa,GAAGmB,SAAS,GAAG,CAAC;IAC9C,MAAMM,SAAS,GAAG,CAACD,QAAQ,GAAGE,iBAAS,GAAG,CAAC,IAAIlC,QAAQ;IACvD,OAAO;MACL8D,MAAM;MACNxE,KAAK,EAAE2C,SAAS;MAChBoC,YAAY,EAAEP,MAAM,GAAG,CAAC;MACxBY,GAAG,EAAE,CAACH,SAAS,GAAGT,MAAM,IAAI,CAAC;MAC7Ba,SAAS,EAAE,CAAC;QAAEC,UAAU,EAAE1C,iBAAS,GAAGD,SAAS,GAAGrC,UAAU,CAACuB;MAAM,CAAC;IACtE,CAAC;EACH,CAAC,EAAE,CAACxB,QAAQ,EAAEC,UAAU,EAAEY,aAAa,EAAER,QAAQ,CAAC,CAAC;;EAEnD;EACA;EACA,MAAM6E,YAAY,GAAG,IAAAC,uBAAe,EAAC1F,MAAM,CAAC2F,MAAM,CAAC;;EAEnD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAAMC,oBAAsC,GAC1C/F,QAAQ,KAAKwB,SAAS,GAAG,IAAI,GAAG;IAAEnB,KAAK,EAAEkB,aAAa;IAAEyE,SAAS,EAAE;EAAS,CAAC;EAC/E,MAAMC,UAAU,GAAG,IAAA3D,cAAO,EACxB,OAAO;IAAE3B,UAAU;IAAEE,UAAU;IAAEjB,KAAK;IAAEH,WAAW;IAAEoC;EAAY,CAAC,CAAC,EACnE,CAAClB,UAAU,EAAEE,UAAU,EAAEjB,KAAK,EAAEH,WAAW,EAAEoC,WAAW,CAC1D,CAAC;EAED,oBACE,IAAA9D,WAAA,CAAAmI,IAAA,EAAC3I,YAAA,CAAA4I,IAAI;IAAA,GAAKjG,SAAS;IAAED,KAAK,EAAE,CAACmG,MAAM,CAACC,IAAI,EAAEpG,KAAK,CAAE;IAAAT,QAAA,GAS9CO,IAAI,KAAK,KAAK,iBACb,IAAAhC,WAAA,CAAAuI,GAAA,EAAC/G,IAAI;MACHgH,SAAS,EAAC,QAAQ;MAClBC,SAAS,EAAE,OAAOzG,IAAI,KAAK,QAAQ,GAAGA,IAAI,CAACyG,SAAS,GAAGhF,SAAU;MACjEvB,KAAK,EAAE;QACLwG,QAAQ,EAAE,UAAU;QACpBC,IAAI,EAAE,CAAC;QACPC,KAAK,EAAE,CAAC;QACRb,MAAM,EAAE,CAAC;QACTjB,MAAM,EAAEe,YAAY,GAAGd,uBAAe,GAAG8B;MAC3C;IAAE,CACH,CACF,eACD,IAAA7I,WAAA,CAAAuI,GAAA,EAAC/I,YAAA,CAAA4I,IAAI;MAAClG,KAAK,EAAE,CAACmG,MAAM,CAACS,OAAO,EAAE;QAAEC,YAAY,EAAElB;MAAa,CAAC,EAAEG,oBAAoB,CAAE;MAAAvG,QAAA,eAClF,IAAAzB,WAAA,CAAAuI,GAAA,EAAC9I,0BAAA,CAAAuJ,eAAe;QAAC1E,OAAO,EAAEA,OAAQ;QAAA7C,QAAA,eAChC,IAAAzB,WAAA,CAAAmI,IAAA,EAACzI,sBAAA,CAAAiB,OAAQ,CAACyH,IAAI;UAAClG,KAAK,EAAE0E,QAAS;UAAAnF,QAAA,gBAC7B,IAAAzB,WAAA,CAAAuI,GAAA,EAAChH,OAAO;YAACM,KAAK,EAAEA,KAAM;YAACK,KAAK,EAAEkF;UAAW,CAAE,CAAC,eAC5C,IAAApH,WAAA,CAAAuI,GAAA,EAAC7I,sBAAA,CAAAiB,OAAQ,CAACyH,IAAI;YACZlG,KAAK,EAAE,CAACmG,MAAM,CAACY,SAAS,EAAE;cAAEC,eAAe,EAAErH,KAAK,CAACoH;YAAU,CAAC,EAAE3B,cAAc;UAAE,CACjF,CAAC,eACF,IAAAtH,WAAA,CAAAuI,GAAA,EAAC/I,YAAA,CAAA4I,IAAI;YAACe,iBAAiB,EAAC,SAAS;YAACjH,KAAK,EAAEmG,MAAM,CAACe,OAAQ;YAAA3H,QAAA,eACtD,IAAAzB,WAAA,CAAAuI,GAAA,EAACnH,UAAU,CAACiI,QAAQ;cAAClF,KAAK,EAAE+D,UAAW;cAAAzG,QAAA,EAAEA;YAAQ,CAAsB;UAAC,CACpE,CAAC;QAAA,CACM;MAAC,CACD;IAAC,CACd,CAAC;EAAA,CACH,CAAC;AAEX;AAMA;AACA,SAAS6H,gBAAgBA,CAAC;EACxBC,KAAK;EACLC,IAAI;EACJzF,KAAK;EACL0F,SAAS;EACTC,OAAO;EACPxH,KAAK;EACL,GAAGyH;AACkB,CAAC,EAAE;EACxB,MAAMlH,SAAS,GAAG,IAAAC,iCAAgB,EAAC,CAAC;EACpC,MAAMC,QAAQ,GAAGF,SAAS,CAACE,QAAQ;EACnC,MAAMiH,GAAG,GAAG,IAAAC,iBAAU,EAACzI,UAAU,CAAC;EAClC;EACA,MAAM0I,eAAe,GAAG,IAAAzG,sBAAc,EAAC,CAAC;EACxC,MAAMxB,KAAK,GAAG+H,GAAG,EAAE/H,KAAK,IAAIiI,eAAe;EAC3C,MAAMlH,UAAU,GAAGgH,GAAG,EAAEhH,UAAU;EAClC;EACA;EACA,MAAMmH,OAAO,GAAGN,SAAS,IAAKG,GAAG,EAAElI,WAAW,KAAKqC,KAAM;;EAEzD;EACA;EACA;EACA;EACA;EACA,IAAAG,gBAAS,EAAC,MAAM;IACd,IAAIuF,SAAS,KAAKhG,SAAS,IAAI,CAACgG,SAAS,IAAI,CAACG,GAAG,EAAE;IACnD,IAAIA,GAAG,CAAC9G,UAAU,CAACqB,KAAK,EAAE;IAC1ByF,GAAG,CAAChH,UAAU,CAACuB,KAAK,GAAG,IAAAC,iCAAU,EAACL,KAAK,EAAEM,oBAAY,CAAC;EACxD,CAAC,EAAE,CAACoF,SAAS,EAAE1F,KAAK,EAAE6F,GAAG,CAAC,CAAC;;EAE3B;EACA;EACA;EACA;EACA,MAAMI,gBAAgB,GAAG,IAAAnD,uCAAgB,EACvC,OAAO;IACLoD,OAAO,EAAErH,UAAU,GAAG,CAAC,GAAGK,IAAI,CAACU,GAAG,CAACV,IAAI,CAACiH,GAAG,CAACtH,UAAU,CAACuB,KAAK,GAAGJ,KAAK,CAAC,EAAE,CAAC,CAAC,GAAGgG,OAAO,GAAG,CAAC,GAAG;EAC5F,CAAC,CAAC,EACF,CAACnH,UAAU,EAAEmB,KAAK,EAAEgG,OAAO,CAC7B,CAAC;EAED,MAAMI,UAAU,GAAG,IAAAtD,uCAAgB,EACjC,OAAO;IACLoD,OAAO,EAAE,IAAArF,kCAAW,EAACjC,QAAQ,CAACwB,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAEW,oCAAa,CAACC,KAAK,CAAC;IAC3EqF,KAAK,EAAExH,UAAU,GACb,IAAAyH,uCAAgB,EACdpH,IAAI,CAACU,GAAG,CAACV,IAAI,CAACiH,GAAG,CAACtH,UAAU,CAACuB,KAAK,GAAGJ,KAAK,CAAC,EAAE,CAAC,CAAC,EAC/C,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAClC,KAAK,CAACyI,UAAU,EAAEzI,KAAK,CAAC0I,YAAY,CACvC,CAAC,GACDR,OAAO,GACLlI,KAAK,CAACyI,UAAU,GAChBzI,KAAK,CAAC0I;EACd,CAAC,CAAC,EACF,CAAC5H,QAAQ,EAAEC,UAAU,EAAEmB,KAAK,EAAEgG,OAAO,EAAElI,KAAK,CAC9C,CAAC;;EAED;EACA;EACA;EACA,MAAM2I,QAAQ,GAAG,IAAA3D,uCAAgB,EAC/B,OAAO;IACLC,MAAM,EAAE,IAAAlC,kCAAW,EACjBjC,QAAQ,CAACwB,KAAK,EACd,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAACqD,0BAAkB,EAAEC,2BAAmB,CAAC,EACzC3C,oCAAa,CAACC,KAChB;EACF,CAAC,CAAC,EACF,CAACpC,QAAQ,CACX,CAAC;EAED,oBACE,IAAA3C,WAAA,CAAAuI,GAAA,EAAC/I,YAAA,CAAAiL;EACC;EACA;EAAA;IACAtB,iBAAiB,EAAC,KAAK;IACvBuB,kBAAkB,EAAE;MAAEC,QAAQ,EAAEZ;IAAQ,CAAE;IAC1Ca,kBAAkB,EAAEpB,IAAI,CAACqB,KAAM;IAAA,GAC3BlB,cAAc;IAClBD,OAAO,EAAG7D,KAAK,IAAK;MAClB;MACA;MACA,IAAI+D,GAAG,EAAEA,GAAG,CAAChH,UAAU,CAACuB,KAAK,GAAG,IAAAC,iCAAU,EAACL,KAAK,EAAEM,oBAAY,CAAC;MAC/D,IAAAsB,6BAAY,EAAClD,SAAS,EAAE,CAAC,CAAC;MAC1B;MACA;MACA;MACA,IAAIgH,SAAS,KAAKhG,SAAS,EAAEmG,GAAG,EAAE9F,WAAW,CAACC,KAAK,CAAC;MACpD2F,OAAO,GAAG7D,KAAK,CAAC;IAClB;IACA;IACA;IACA;IAAA;IACA3D,KAAK,EACH,OAAOA,KAAK,KAAK,UAAU,GACtB4I,KAAK,IAAK,CAACzC,MAAM,CAAC0C,MAAM,EAAE7I,KAAK,CAAC4I,KAAK,CAAC,CAAC,GACxC,CAACzC,MAAM,CAAC0C,MAAM,EAAE7I,KAAK,CAC1B;IAAAT,QAAA,eAED,IAAAzB,WAAA,CAAAmI,IAAA,EAACzI,sBAAA,CAAAiB,OAAQ,CAACyH,IAAI;MAAClG,KAAK,EAAE,CAACmG,MAAM,CAAC2C,OAAO,EAAER,QAAQ,CAAE;MAAA/I,QAAA,gBAI/C,IAAAzB,WAAA,CAAAmI,IAAA,EAAC3I,YAAA,CAAA4I,IAAI;QAAA3G,QAAA,gBACH,IAAAzB,WAAA,CAAAuI,GAAA,EAACgB,KAAK;UAACC,IAAI,EAAEA,IAAK;UAACyB,IAAI,EAAEpJ,KAAK,CAAC0I,YAAa;UAACW,IAAI,EAAEC,iBAAU;UAACC,MAAM,EAAE;QAAM,CAAE,CAAC,eAC/E,IAAApL,WAAA,CAAAuI,GAAA,EAAC7I,sBAAA,CAAAiB,OAAQ,CAACyH,IAAI;UAAClG,KAAK,EAAE,CAACmJ,uBAAU,CAACC,YAAY,EAAEjD,MAAM,CAACkD,UAAU,EAAEvB,gBAAgB,CAAE;UAAAvI,QAAA,eACnF,IAAAzB,WAAA,CAAAuI,GAAA,EAACgB,KAAK;YAACC,IAAI,EAAEA,IAAK;YAACyB,IAAI,EAAEpJ,KAAK,CAACyI,UAAW;YAACY,IAAI,EAAEC,iBAAU;YAACC,MAAM;UAAA,CAAE;QAAC,CACxD,CAAC;MAAA,CACZ,CAAC,eAEP,IAAApL,WAAA,CAAAuI,GAAA,EAAC7I,sBAAA,CAAAiB,OAAQ,CAAC6K,IAAI;QAACC,aAAa,EAAE,CAAE;QAACvJ,KAAK,EAAE,CAACmG,MAAM,CAACwC,KAAK,EAAEV,UAAU,CAAE;QAAA1I,QAAA,EAChE+H,IAAI,CAACqB;MAAK,CACE,CAAC;IAAA,CACH;EAAC,CACP,CAAC;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASa,YAAYA,CAC1BnK,OAA0C,EAC1CC,IAAyC,EACzC;EACA,MAAMmK,MAAM,GAAIC,KAAkB,iBAAK,IAAA5L,WAAA,CAAAuI,GAAA,EAACjH,UAAU;IAAA,GAAKsK,KAAK;IAAErK,OAAO,EAAEA,OAAQ;IAACC,IAAI,EAAEA;EAAK,CAAE,CAAC;EAC9FmK,MAAM,CAACE,WAAW,GAAG,QAAQ;EAC7B,OAAOF,MAAM;AACf;;AAEA;AACO,SAASG,kBAAkBA,CAACvC,KAAsC,EAAE;EACzE,MAAMwC,YAAY,GAAIH,KAAwB,iBAAK,IAAA5L,WAAA,CAAAuI,GAAA,EAACe,gBAAgB;IAAA,GAAKsC,KAAK;IAAErC,KAAK,EAAEA;EAAM,CAAE,CAAC;EAChGwC,YAAY,CAACF,WAAW,GAAG,cAAc;EACzC,OAAOE,YAAY;AACrB;AAEA,MAAM1D,MAAM,GAAGgD,uBAAU,CAACW,MAAM,CAAC;EAC/B1D,IAAI,EAAE;IACJI,QAAQ,EAAE,UAAU;IACpBC,IAAI,EAAE,CAAC;IACPC,KAAK,EAAE,CAAC;IACRb,MAAM,EAAE,CAAC;IACT;IACA;IACAkE,aAAa,EAAE;EACjB,CAAC;EACDnD,OAAO,EAAE;IACPoD,gBAAgB,EAAExI,kBAAU;IAC5BuI,aAAa,EAAE;EACjB,CAAC;EACDhD,SAAS,EAAE;IACTP,QAAQ,EAAE,UAAU;IACpBC,IAAI,EAAE,CAAC;IACPwD,WAAW,EAAE;EACf,CAAC;EACD/C,OAAO,EAAE;IACPgD,IAAI,EAAE,CAAC;IACPC,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBC,iBAAiB,EAAErH;EACrB,CAAC;EACD6F,MAAM,EAAE;IACNqB,IAAI,EAAE,CAAC;IACPE,UAAU,EAAE,QAAQ;IACpBE,cAAc,EAAE;EAClB,CAAC;EACDxB,OAAO,EAAE;IACP/C,SAAS,EAAE,SAAS;IACpBqE,UAAU,EAAE,QAAQ;IACpBG,UAAU,EAAEC,kBAAU;IACtBC,QAAQ,EAAE;EACZ,CAAC;EACDpB,UAAU,EAAE;IACVe,UAAU,EAAE,QAAQ;IACpBE,cAAc,EAAE;EAClB,CAAC;EACD3B,KAAK,EAAE;IACL+B,QAAQ,EAAEC,uBAAe;IACzBC,UAAU,EAAE,KAAK;IACjBC,SAAS,EAAEC;EACb;AACF,CAAC,CAAC","ignoreList":[]}
@@ -44,6 +44,8 @@ function TabBarBody({
44
44
  onIndexLongPress,
45
45
  theme: themeOverrides,
46
46
  haptics = true,
47
+ blur = true,
48
+ maxWidth,
47
49
  style,
48
50
  ...viewProps
49
51
  }) {
@@ -60,6 +62,19 @@ function TabBarBody({
60
62
  const theme = useTabBarTheme(themeOverrides);
61
63
  const impact = useHaptics();
62
64
 
65
+ // The pill's OUTER width (the box the animated minimize inset is applied
66
+ // inside), and the single source of truth for it: the wrap's own layout, the
67
+ // highlight geometry and the `indexAtX` scrub worklet all derive from this one
68
+ // number. They have to, or a tap lands on a tab the highlight is not under —
69
+ // the exact failure `maxWidth` exists to prevent, since narrowing the bar from
70
+ // the outside with a `style` override moves only the pixels.
71
+ //
72
+ // Unconstrained it is what the stretched wrap already measures
73
+ // (`windowWidth - BAR_MARGIN * 2`), so an existing consumer's geometry is
74
+ // unchanged to the pixel. `maxWidth` is a ceiling, never a floor: on a window
75
+ // narrower than it, the bar stays full-bleed.
76
+ const barOuterWidth = maxWidth === undefined ? windowWidth - BAR_MARGIN * 2 : Math.min(windowWidth - BAR_MARGIN * 2, maxWidth);
77
+
63
78
  // Picker-style tick while the highlight crosses tab boundaries mid-drag.
64
79
  // `useHaptics` already no-ops on web, when the optional `expo-haptics` peer
65
80
  // is absent, and when a `BloomHapticsProvider` has haptics turned off — so
@@ -100,7 +115,13 @@ function TabBarBody({
100
115
  'worklet';
101
116
 
102
117
  const sideInset = interpolate(minimizedValue, [0, 1], [0, MINIMIZED_INSET], Extrapolation.CLAMP);
103
- const barWidth = windowWidth - BAR_MARGIN * 2 - sideInset * 2;
118
+ // `event.x` is measured from the left edge of the view the detector is
119
+ // attached to — the animated pill itself, NOT the window and not the wrap
120
+ // around it. Its width is therefore the outer width minus the two
121
+ // animated margins, which is exactly what this computes, constrained or
122
+ // not. (Margins sit outside a view's own box, so x = 0 is the pill's left
123
+ // border edge either way.)
124
+ const barWidth = barOuterWidth - sideInset * 2;
104
125
  const itemWidth = (barWidth - ROW_PAD_H * 2) / tabCount;
105
126
  const raw = (x - ROW_PAD_H) / itemWidth - 0.5;
106
127
  return Math.min(Math.max(raw, 0), tabCount - 1);
@@ -156,7 +177,7 @@ function TabBarBody({
156
177
  runOnJS(longPressIndex)(Math.round(indexAtX(event.x, progress.value)));
157
178
  });
158
179
  return Gesture.Race(pan, tap, longPress);
159
- }, [windowWidth, tabCount, selectIndex, hasLongPress, longPressIndex, tick, isDragging, lastTicked, slideIndex, minimized, progress]);
180
+ }, [barOuterWidth, tabCount, selectIndex, hasLongPress, longPressIndex, tick, isDragging, lastTicked, slideIndex, minimized, progress]);
160
181
 
161
182
  // CRITICAL — every shared value and every scalar a mapper READS must appear
162
183
  // in its dependency array. On web WITHOUT the react-native-worklets babel
@@ -207,7 +228,9 @@ function TabBarBody({
207
228
  const barHeight = interpolate(progress.value, [0, 1], [EXPANDED_HEIGHT, MINIMIZED_HEIGHT], Extrapolation.CLAMP);
208
229
  const height = interpolate(progress.value, [0, 1], [HIGHLIGHT_EXPANDED, HIGHLIGHT_MINIMIZED], Extrapolation.CLAMP);
209
230
  const sideInset = interpolate(progress.value, [0, 1], [0, MINIMIZED_INSET], Extrapolation.CLAMP);
210
- const barWidth = windowWidth - BAR_MARGIN * 2 - sideInset * 2;
231
+ // Same `barOuterWidth` the scrub worklet resolves an index from see the
232
+ // note where it is computed.
233
+ const barWidth = barOuterWidth - sideInset * 2;
211
234
  const itemWidth = (barWidth - ROW_PAD_H * 2) / tabCount;
212
235
  return {
213
236
  height,
@@ -218,11 +241,27 @@ function TabBarBody({
218
241
  translateX: ROW_PAD_H + itemWidth * slideIndex.value
219
242
  }]
220
243
  };
221
- }, [progress, slideIndex, windowWidth, tabCount]);
244
+ }, [progress, slideIndex, barOuterWidth, tabCount]);
222
245
 
223
246
  // Shared with `useTabBarFootprint`, so a consumer accounting for the bar in
224
247
  // its own layout can never drift from where the bar actually sits.
225
248
  const bottomOffset = tabBarBottomGap(insets.bottom);
249
+
250
+ // How centring and the animated inset compose: centring is STATIC and belongs
251
+ // to the wrap, the inset stays ANIMATED on the pill inside it. The wrap is
252
+ // centred once by layout at a definite width, and the pill's two equal
253
+ // margins keep it centred within that wrap at every point of the minimize
254
+ // animation — neither has to know about the other. Centring the animated view
255
+ // itself would instead mean `alignSelf: 'center'` on a node with no width of
256
+ // its own (its width comes from those margins), which Yoga then sizes from its
257
+ // CONTENT rather than from the constraint.
258
+ //
259
+ // Applied only when `maxWidth` is set: with no width and no `alignSelf` the
260
+ // wrap stretches, which is the original full-bleed behaviour.
261
+ const constrainedWrapStyle = maxWidth === undefined ? null : {
262
+ width: barOuterWidth,
263
+ alignSelf: 'center'
264
+ };
226
265
  const barContext = useMemo(() => ({
227
266
  slideIndex,
228
267
  isDragging,
@@ -233,8 +272,9 @@ function TabBarBody({
233
272
  return /*#__PURE__*/_jsxs(View, {
234
273
  ...viewProps,
235
274
  style: [styles.root, style],
236
- children: [/*#__PURE__*/_jsx(Blur, {
275
+ children: [blur !== false && /*#__PURE__*/_jsx(Blur, {
237
276
  direction: "bottom",
277
+ intensity: typeof blur === 'object' ? blur.intensity : undefined,
238
278
  style: {
239
279
  position: 'absolute',
240
280
  left: 0,
@@ -245,7 +285,7 @@ function TabBarBody({
245
285
  }), /*#__PURE__*/_jsx(View, {
246
286
  style: [styles.barWrap, {
247
287
  marginBottom: bottomOffset
248
- }],
288
+ }, constrainedWrapStyle],
249
289
  children: /*#__PURE__*/_jsx(GestureDetector, {
250
290
  gesture: gesture,
251
291
  children: /*#__PURE__*/_jsxs(Animated.View, {
@@ -1 +1 @@
1
- {"version":3,"names":["Children","createContext","useCallback","useContext","useEffect","useMemo","Pressable","StyleSheet","useWindowDimensions","View","Gesture","GestureDetector","Animated","Extrapolation","interpolate","interpolateColor","runOnJS","useAnimatedStyle","useSharedValue","withSpring","useSafeAreaInsets","useHaptics","setMinimized","useMinimizeState","BAR_MARGIN","BLUR_BLEED","EXPANDED_HEIGHT","HIGHLIGHT_EXPANDED","HIGHLIGHT_MINIMIZED","ICON_SIZE","ITEM_GAP","ITEM_PAD_V","LABEL_FONT_SIZE","LONG_PRESS_MIN_DURATION","MINIMIZED_HEIGHT","MINIMIZED_INSET","ROW_PAD_H","SLIDE_SPRING","tabBarBottomGap","useTabBarTheme","jsx","_jsx","jsxs","_jsxs","BarContext","TabBarBody","Surface","Blur","children","activeIndex","onIndexChange","onIndexLongPress","theme","themeOverrides","haptics","style","viewProps","insets","width","windowWidth","minimized","progress","slideIndex","isDragging","lastTicked","tabCount","Math","max","count","impact","tick","selectIndex","index","longPressIndex","hasLongPress","undefined","value","gesture","indexAtX","x","minimizedValue","sideInset","CLAMP","barWidth","itemWidth","raw","min","pan","Pan","activeOffsetX","failOffsetY","onStart","round","onUpdate","event","rounded","onFinalize","tap","Tap","maxDistance","maxDuration","onEnd","success","Race","longPress","LongPress","minDuration","barStyle","height","inset","marginLeft","marginRight","shapeStyle","borderRadius","highlightStyle","barHeight","top","transform","translateX","bottomOffset","bottom","barContext","styles","root","direction","position","left","right","barWrap","marginBottom","highlight","backgroundColor","accessibilityRole","itemRow","Provider","TabBarButtonBody","Glyph","item","isFocused","onPress","pressableProps","bar","standaloneTheme","focused","activeGlyphStyle","opacity","abs","labelStyle","color","activeTint","inactiveTint","boxStyle","accessibilityState","selected","accessibilityLabel","label","state","button","itemBox","tint","size","active","absoluteFill","glyphLayer","Text","numberOfLines","createTabBar","TabBar","props","displayName","createTabBarButton","TabBarButton","create","pointerEvents","marginHorizontal","borderCurve","flex","flexDirection","alignItems","paddingHorizontal","justifyContent","alignSelf","paddingTop","overflow","fontSize","fontWeight","marginTop"],"sourceRoot":"../../../src","sources":["tab-bar/TabBarBase.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Children","createContext","useCallback","useContext","useEffect","useMemo","Pressable","StyleSheet","useWindowDimensions","View","Gesture","GestureDetector","Animated","Extrapolation","interpolate","interpolateColor","runOnJS","useAnimatedStyle","useSharedValue","withSpring","useSafeAreaInsets","useHaptics","setMinimized","useMinimizeState","BAR_MARGIN","BLUR_BLEED","EXPANDED_HEIGHT","HIGHLIGHT_EXPANDED","HIGHLIGHT_MINIMIZED","ICON_SIZE","ITEM_GAP","ITEM_PAD_V","LABEL_FONT_SIZE","LONG_PRESS_MIN_DURATION","MINIMIZED_HEIGHT","MINIMIZED_INSET","ROW_PAD_H","SLIDE_SPRING","tabBarBottomGap","useTabBarTheme","jsx","_jsx","jsxs","_jsxs","BarContext","TabBarBody","Surface","Blur","children","activeIndex","onIndexChange","onIndexLongPress","theme","themeOverrides","haptics","blur","maxWidth","style","viewProps","insets","width","windowWidth","minimized","progress","slideIndex","isDragging","lastTicked","tabCount","Math","max","count","impact","barOuterWidth","undefined","min","tick","selectIndex","index","longPressIndex","hasLongPress","value","gesture","indexAtX","x","minimizedValue","sideInset","CLAMP","barWidth","itemWidth","raw","pan","Pan","activeOffsetX","failOffsetY","onStart","round","onUpdate","event","rounded","onFinalize","tap","Tap","maxDistance","maxDuration","onEnd","success","Race","longPress","LongPress","minDuration","barStyle","height","inset","marginLeft","marginRight","shapeStyle","borderRadius","highlightStyle","barHeight","top","transform","translateX","bottomOffset","bottom","constrainedWrapStyle","alignSelf","barContext","styles","root","direction","intensity","position","left","right","barWrap","marginBottom","highlight","backgroundColor","accessibilityRole","itemRow","Provider","TabBarButtonBody","Glyph","item","isFocused","onPress","pressableProps","bar","standaloneTheme","focused","activeGlyphStyle","opacity","abs","labelStyle","color","activeTint","inactiveTint","boxStyle","accessibilityState","selected","accessibilityLabel","label","state","button","itemBox","tint","size","active","absoluteFill","glyphLayer","Text","numberOfLines","createTabBar","TabBar","props","displayName","createTabBarButton","TabBarButton","create","pointerEvents","marginHorizontal","borderCurve","flex","flexDirection","alignItems","paddingHorizontal","justifyContent","paddingTop","overflow","fontSize","fontWeight","marginTop"],"sourceRoot":"../../../src","sources":["tab-bar/TabBarBase.tsx"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"TabBarBase.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/TabBarBase.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AAgBf,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,OAAO,EAiBL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAe,MAAM,SAAS,CAAC;AA0a3E;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,CAAC,kBAAkB,CAAC,EAC1C,IAAI,EAAE,aAAa,CAAC,oBAAoB,CAAC;YAElB,WAAW;;EAGnC;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC;YAC1C,iBAAiB;;EAG/C"}
1
+ {"version":3,"file":"TabBarBase.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/TabBarBase.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AAgBf,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,OAAO,EAiBL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAe,MAAM,SAAS,CAAC;AA4d3E;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,CAAC,kBAAkB,CAAC,EAC1C,IAAI,EAAE,aAAa,CAAC,oBAAoB,CAAC;YAElB,WAAW;;EAGnC;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC;YAC1C,iBAAiB;;EAG/C"}
@@ -104,6 +104,46 @@ export type TabBarProps = ViewProps & {
104
104
  * optional `expo-haptics` peer is absent.
105
105
  */
106
106
  haptics?: boolean;
107
+ /**
108
+ * The progressive blur rising from the bottom edge of the screen behind the
109
+ * pill. Defaults to `true`; `{ intensity }` tunes its strength.
110
+ *
111
+ * Pass `false` to remove it entirely — no blur, and no node left behind. The
112
+ * band is tall (the bar's own bottom gap plus its expanded height plus the
113
+ * bleed above it, 114pt at a zero bottom inset) and full-bleed, so anything a
114
+ * screen floats near the bottom edge — a video scrubber, a FAB — sits INSIDE
115
+ * it and is blurred. That cannot be undone from the outside: `zIndex` only
116
+ * orders siblings within one stacking context, and a screen's FAB is inside
117
+ * an earlier sibling of the bar's host, so no z-order a consumer can write
118
+ * lifts it above this band. Turning the blur off is the only fix that does
119
+ * not also change where the FAB paints relative to everything else.
120
+ *
121
+ * On native the band is ten stacked `expo-blur` layers plus a tail gradient;
122
+ * on web it is one masked `backdrop-filter`. `false` skips both.
123
+ */
124
+ blur?: boolean | {
125
+ intensity?: number;
126
+ };
127
+ /**
128
+ * Maximum width of the pill, in points. No default — omit it and the bar
129
+ * spans the window exactly as it always has.
130
+ *
131
+ * A CEILING, never a floor: on a window narrower than this the bar keeps its
132
+ * full-bleed width, so a phone layout is untouched by any value big enough to
133
+ * matter on a tablet. When it binds, the pill is constrained to this width and
134
+ * CENTRED, and the ITEM geometry follows it — the item width, the sliding
135
+ * highlight's position and the tap/scrub hit-testing all derive from the same
136
+ * constrained width, so a tap still lands on the tab it is visibly over.
137
+ *
138
+ * That last part is why this cannot be done from the outside. Narrowing the
139
+ * bar with a `style` override moves the pixels only: the highlight and the
140
+ * scrub worklet would still divide the WINDOW width by the tab count, leaving
141
+ * the highlight sized and positioned for a bar that is no longer there. On an
142
+ * iPad the unconstrained bar is the reason to reach for this at all — 810pt at
143
+ * 11" portrait, 1342pt in landscape, leaving 21pt glyphs adrift in cells
144
+ * hundreds of points wide.
145
+ */
146
+ maxWidth?: number;
107
147
  };
108
148
  export type TabBarButtonProps = PressableProps & {
109
149
  item: TabBarItem;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,MAAM,UAAU,GAAG;IACvB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;;OAUG;IACH,IAAI,EAAE,SAAS,CAAC;IAChB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IACpC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;;;;;;;;;;OAYG;IACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,IAAI,EAAE,UAAU,CAAC;IACjB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,MAAM,UAAU,GAAG;IACvB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;;OAUG;IACH,IAAI,EAAE,SAAS,CAAC;IAChB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IACpC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;;;;;;;;;;OAYG;IACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;;;;;;;;;OAgBG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,IAAI,EAAE,UAAU,CAAC;IACjB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TabBarBase.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/TabBarBase.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AAgBf,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,OAAO,EAiBL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAe,MAAM,SAAS,CAAC;AA0a3E;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,CAAC,kBAAkB,CAAC,EAC1C,IAAI,EAAE,aAAa,CAAC,oBAAoB,CAAC;YAElB,WAAW;;EAGnC;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC;YAC1C,iBAAiB;;EAG/C"}
1
+ {"version":3,"file":"TabBarBase.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/TabBarBase.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AAgBf,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,OAAO,EAiBL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAe,MAAM,SAAS,CAAC;AA4d3E;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,CAAC,kBAAkB,CAAC,EAC1C,IAAI,EAAE,aAAa,CAAC,oBAAoB,CAAC;YAElB,WAAW;;EAGnC;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC;YAC1C,iBAAiB;;EAG/C"}
@@ -104,6 +104,46 @@ export type TabBarProps = ViewProps & {
104
104
  * optional `expo-haptics` peer is absent.
105
105
  */
106
106
  haptics?: boolean;
107
+ /**
108
+ * The progressive blur rising from the bottom edge of the screen behind the
109
+ * pill. Defaults to `true`; `{ intensity }` tunes its strength.
110
+ *
111
+ * Pass `false` to remove it entirely — no blur, and no node left behind. The
112
+ * band is tall (the bar's own bottom gap plus its expanded height plus the
113
+ * bleed above it, 114pt at a zero bottom inset) and full-bleed, so anything a
114
+ * screen floats near the bottom edge — a video scrubber, a FAB — sits INSIDE
115
+ * it and is blurred. That cannot be undone from the outside: `zIndex` only
116
+ * orders siblings within one stacking context, and a screen's FAB is inside
117
+ * an earlier sibling of the bar's host, so no z-order a consumer can write
118
+ * lifts it above this band. Turning the blur off is the only fix that does
119
+ * not also change where the FAB paints relative to everything else.
120
+ *
121
+ * On native the band is ten stacked `expo-blur` layers plus a tail gradient;
122
+ * on web it is one masked `backdrop-filter`. `false` skips both.
123
+ */
124
+ blur?: boolean | {
125
+ intensity?: number;
126
+ };
127
+ /**
128
+ * Maximum width of the pill, in points. No default — omit it and the bar
129
+ * spans the window exactly as it always has.
130
+ *
131
+ * A CEILING, never a floor: on a window narrower than this the bar keeps its
132
+ * full-bleed width, so a phone layout is untouched by any value big enough to
133
+ * matter on a tablet. When it binds, the pill is constrained to this width and
134
+ * CENTRED, and the ITEM geometry follows it — the item width, the sliding
135
+ * highlight's position and the tap/scrub hit-testing all derive from the same
136
+ * constrained width, so a tap still lands on the tab it is visibly over.
137
+ *
138
+ * That last part is why this cannot be done from the outside. Narrowing the
139
+ * bar with a `style` override moves the pixels only: the highlight and the
140
+ * scrub worklet would still divide the WINDOW width by the tab count, leaving
141
+ * the highlight sized and positioned for a bar that is no longer there. On an
142
+ * iPad the unconstrained bar is the reason to reach for this at all — 810pt at
143
+ * 11" portrait, 1342pt in landscape, leaving 21pt glyphs adrift in cells
144
+ * hundreds of points wide.
145
+ */
146
+ maxWidth?: number;
107
147
  };
108
148
  export type TabBarButtonProps = PressableProps & {
109
149
  item: TabBarItem;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,MAAM,UAAU,GAAG;IACvB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;;OAUG;IACH,IAAI,EAAE,SAAS,CAAC;IAChB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IACpC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;;;;;;;;;;OAYG;IACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,IAAI,EAAE,UAAU,CAAC;IACjB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,MAAM,UAAU,GAAG;IACvB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;;OAUG;IACH,IAAI,EAAE,SAAS,CAAC;IAChB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IACpC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;;;;;;;;;;OAYG;IACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;;;;;;;;;OAgBG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,IAAI,EAAE,UAAU,CAAC;IACjB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxyhq/bloom",
3
- "version": "0.53.0",
3
+ "version": "0.54.0",
4
4
  "description": "Bloom UI — Oxy ecosystem component library for React Native + Expo + Web",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -0,0 +1,154 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react-native';
3
+ import type { ReactTestRendererJSON, ReactTestRendererNode } from 'react-test-renderer';
4
+
5
+ import { BloomThemeProvider } from '../theme/BloomThemeProvider';
6
+ import { TabBar, TabBarButton } from '../tab-bar';
7
+ import { BLUR_BLEED, EXPANDED_HEIGHT, tabBarBottomGap } from '../tab-bar/shared';
8
+ import type { TabBarItem, TabBarProps } from '../tab-bar/types';
9
+
10
+ /**
11
+ * `blur` — turning the bar's bottom band off, and tuning it.
12
+ *
13
+ * The band is full-bleed and 114pt tall at a zero bottom inset (the bar's own
14
+ * bottom gap + its expanded height + the bleed above it), so ANY chrome a screen
15
+ * floats near the bottom edge sits inside it and is blurred: a video scrubber, a
16
+ * compose FAB, a QR-scan button. No consumer can escape it from the outside —
17
+ * `zIndex` orders siblings within one stacking context, and a screen's FAB lives
18
+ * inside an earlier sibling of the bar's host — so the prop is the only fix that
19
+ * does not also change where that FAB paints relative to everything else.
20
+ *
21
+ * Asserted end to end through the REAL `TabBar` (jest has no platform-extension
22
+ * resolution, so `../tab-bar` binds the neutral surface and the NATIVE
23
+ * `ProgressiveBlur`, whose ten `BlurView`s are what the `expo-blur` mock
24
+ * renders). That makes these assertions about the shipped composition rather
25
+ * than about a stand-in wired up by the test.
26
+ */
27
+
28
+ const ITEMS: TabBarItem[] = [
29
+ { name: 'home', label: 'Home', icon: null },
30
+ { name: 'search', label: 'Search', icon: null },
31
+ { name: 'you', label: 'You', icon: null },
32
+ ];
33
+
34
+ /** Insets are all zero under the safe-area mock, so this is the real 114. */
35
+ const BAND_HEIGHT = tabBarBottomGap(0) + EXPANDED_HEIGHT + BLUR_BLEED;
36
+
37
+ /** The fork's own default, applied when nothing overrides it. */
38
+ const DEFAULT_INTENSITY = 5;
39
+
40
+ function renderBar(blur?: TabBarProps['blur']) {
41
+ return render(
42
+ <BloomThemeProvider mode="light" colorPreset="teal">
43
+ <TabBar activeIndex={0} blur={blur}>
44
+ {ITEMS.map((item, index) => (
45
+ <TabBarButton key={item.name} item={item} index={index} />
46
+ ))}
47
+ </TabBar>
48
+ </BloomThemeProvider>,
49
+ ).toJSON();
50
+ }
51
+
52
+ /** What `toJSON()` hands back — a node, several, or nothing rendered at all. */
53
+ type RenderedTree = ReactTestRendererNode | ReactTestRendererNode[] | null;
54
+
55
+ function isJsonNode(node: ReactTestRendererNode): node is ReactTestRendererJSON {
56
+ return typeof node !== 'string';
57
+ }
58
+
59
+ /** Every HOST node in the rendered tree — composites collapse to what they render. */
60
+ function hostNodes(tree: RenderedTree): ReactTestRendererJSON[] {
61
+ if (tree === null) return [];
62
+ const roots = (Array.isArray(tree) ? tree : [tree]).filter(isJsonNode);
63
+ return roots.flatMap((node) => [node, ...hostNodes(node.children ?? [])]);
64
+ }
65
+
66
+ function flattenStyle(style: unknown): Record<string, unknown> {
67
+ const out: Record<string, unknown> = {};
68
+ const visit = (value: unknown): void => {
69
+ if (Array.isArray(value)) value.forEach(visit);
70
+ else if (value && typeof value === 'object') Object.assign(out, value);
71
+ };
72
+ visit(style);
73
+ return out;
74
+ }
75
+
76
+ /**
77
+ * The bar's outermost view — `styles.root`, the absolutely-positioned
78
+ * `box-none` layer the blur and the pill wrap are the two children of.
79
+ */
80
+ function barRoot(tree: RenderedTree): ReactTestRendererJSON {
81
+ const found = hostNodes(tree).find((node) => {
82
+ const style = flattenStyle(node.props.style);
83
+ return style.position === 'absolute' && style.pointerEvents === 'box-none';
84
+ });
85
+ if (!found) throw new Error('The bar rendered no absolute box-none root');
86
+ return found;
87
+ }
88
+
89
+ function children(node: ReactTestRendererJSON): ReactTestRendererJSON[] {
90
+ return (node.children ?? []).filter(isJsonNode);
91
+ }
92
+
93
+ function blurLayers(tree: RenderedTree): ReactTestRendererJSON[] {
94
+ return hostNodes(tree).filter((node) => node.type === 'BlurView');
95
+ }
96
+
97
+ function intensities(tree: RenderedTree): unknown[] {
98
+ return [...new Set(blurLayers(tree).map((layer) => layer.props.intensity))];
99
+ }
100
+
101
+ describe('TabBar blur', () => {
102
+ it('renders the band by default, behind the pill', () => {
103
+ const tree = renderBar();
104
+ expect(blurLayers(tree).length).toBeGreaterThan(0);
105
+
106
+ // FIRST child, so it paints behind the pill rather than over it.
107
+ const band = children(barRoot(tree))[0];
108
+ const style = flattenStyle(band?.props.style);
109
+ expect(style.position).toBe('absolute');
110
+ expect(style.bottom).toBe(0);
111
+ // Full-bleed, and tall enough to reach anything a screen floats down here.
112
+ expect(style.left).toBe(0);
113
+ expect(style.right).toBe(0);
114
+ expect(style.height).toBe(BAND_HEIGHT);
115
+ expect(BAND_HEIGHT).toBe(114);
116
+ });
117
+
118
+ it('treats blur={true} as exactly the default', () => {
119
+ // The prop defaults to `true`, so an app that never heard of it and one that
120
+ // asks for the blur explicitly must render the identical tree.
121
+ expect(JSON.stringify(renderBar(true))).toBe(JSON.stringify(renderBar()));
122
+ });
123
+
124
+ it('renders no blur at all with blur={false}', () => {
125
+ expect(blurLayers(renderBar(false))).toEqual([]);
126
+ });
127
+
128
+ it('leaves no empty node behind with blur={false}', () => {
129
+ // Not merely "invisible": an absolutely-positioned 114pt view that renders
130
+ // nothing is still a node, still a rect, and still something to reason about
131
+ // when debugging why a FAB is not reachable.
132
+ expect(children(barRoot(renderBar())).length).toBe(2);
133
+ expect(children(barRoot(renderBar(false))).length).toBe(1);
134
+ });
135
+
136
+ it('keeps the bar itself when the blur is off', () => {
137
+ // Guards the obvious over-reach: `false` removes the band, not the pill.
138
+ const tabs = hostNodes(renderBar(false)).filter(
139
+ (node) => node.props.accessibilityRole === 'tab',
140
+ );
141
+ expect(tabs).toHaveLength(ITEMS.length);
142
+ });
143
+
144
+ it('tunes the strength with the object form', () => {
145
+ expect(intensities(renderBar({ intensity: 12 }))).toEqual([12]);
146
+ });
147
+
148
+ it('keeps the fork default for an object with no intensity', () => {
149
+ // `{}` says "blurred, default strength" — it must not resolve to 0, which
150
+ // would read as "off" while still paying for ten composited layers.
151
+ expect(intensities(renderBar({}))).toEqual([DEFAULT_INTENSITY]);
152
+ expect(intensities(renderBar())).toEqual([DEFAULT_INTENSITY]);
153
+ });
154
+ });
@@ -0,0 +1,413 @@
1
+ import React from 'react';
2
+ import { act, render } from '@testing-library/react-native';
3
+ import type { ReactTestInstance } from 'react-test-renderer';
4
+
5
+ import { BloomThemeProvider } from '../theme/BloomThemeProvider';
6
+ import { TabBar, TabBarButton, TabBarMinimizeProvider, useMinimizeState } from '../tab-bar';
7
+ import type { MinimizeState } from '../tab-bar/minimize-context';
8
+ import { BAR_MARGIN, MINIMIZED_INSET, ROW_PAD_H } from '../tab-bar/shared';
9
+ import type { TabBarItem } from '../tab-bar/types';
10
+
11
+ /**
12
+ * `maxWidth` — constraining the pill on a tablet, and keeping every piece of
13
+ * geometry on the SAME width while doing it.
14
+ *
15
+ * Unconstrained, the bar spans the window: 810pt at iPad 11" portrait, 1342pt
16
+ * in landscape, 21pt glyphs adrift in cells hundreds of points wide. A consumer
17
+ * cannot fix that from the outside, and the reason is what this file is really
18
+ * about: narrowing the bar with a `style` override moves the PIXELS only, while
19
+ * the highlight's width, its `translateX` and the tap/scrub hit-testing all keep
20
+ * dividing the WINDOW width by the tab count. The highlight then sits under one
21
+ * tab and a tap at the same point selects another.
22
+ *
23
+ * So the load-bearing test here is not "the bar got narrower" — it is that a tap
24
+ * at the centre of the slot the RENDERED highlight occupies selects that slot's
25
+ * tab, with the item width read back out of the rendered highlight rather than
26
+ * recomputed by the test. Layout and hit-testing are asserted against each
27
+ * other; nothing but agreement between the two can make it pass.
28
+ *
29
+ * Two pieces of the environment are replaced to get there:
30
+ *
31
+ * 1. `useWindowDimensions`, so the window is a tablet's rather than the 375pt
32
+ * the react-native mock reports — with a 375pt window every plausible
33
+ * `maxWidth` is inert and the prop could never be exercised.
34
+ * 2. `react-native-gesture-handler`, with the same RECORDING mock
35
+ * `TabBarLongPress.test.tsx` uses: the shared mock discards every registered
36
+ * callback, and the bar's gesture detector is the only path a real tap takes
37
+ * (it consumes the touches, which is what makes scrubbing possible).
38
+ */
39
+
40
+ /** iPad 11" portrait, the window that produced the report. */
41
+ const TABLET_WIDTH = 1024;
42
+ /** Must be `mock`-prefixed to be readable from the hoisted factory below. */
43
+ let mockWindowWidth = TABLET_WIDTH;
44
+
45
+ jest.mock('react-native', () => {
46
+ const actual = jest.requireActual('react-native');
47
+ return {
48
+ ...actual,
49
+ useWindowDimensions: () => ({
50
+ width: mockWindowWidth,
51
+ height: 1366,
52
+ scale: 2,
53
+ fontScale: 1,
54
+ }),
55
+ };
56
+ });
57
+
58
+ interface MockGestureEvent {
59
+ x: number;
60
+ }
61
+
62
+ interface MockGesture {
63
+ kind: string;
64
+ start?: (event: MockGestureEvent) => void;
65
+ update?: (event: MockGestureEvent) => void;
66
+ end?: (event: MockGestureEvent, success: boolean) => void;
67
+ finalize?: () => void;
68
+ /** Members of a composed `Gesture.Race(…)`; empty for a leaf gesture. */
69
+ members: MockGesture[];
70
+ activeOffsetX: (range: number[]) => MockGesture;
71
+ failOffsetY: (range: number[]) => MockGesture;
72
+ maxDistance: (px: number) => MockGesture;
73
+ maxDuration: (ms: number) => MockGesture;
74
+ minDuration: (ms: number) => MockGesture;
75
+ onStart: (worklet: (event: MockGestureEvent) => void) => MockGesture;
76
+ onUpdate: (worklet: (event: MockGestureEvent) => void) => MockGesture;
77
+ onEnd: (worklet: (event: MockGestureEvent, success: boolean) => void) => MockGesture;
78
+ onFinalize: (worklet: () => void) => MockGesture;
79
+ }
80
+
81
+ const mockGestures: MockGesture[] = [];
82
+
83
+ jest.mock('react-native-gesture-handler', () => {
84
+ const build = (kind: string): MockGesture => {
85
+ const gesture: MockGesture = {
86
+ kind,
87
+ members: [],
88
+ activeOffsetX: () => gesture,
89
+ failOffsetY: () => gesture,
90
+ maxDistance: () => gesture,
91
+ maxDuration: () => gesture,
92
+ minDuration: () => gesture,
93
+ onStart: (worklet) => {
94
+ gesture.start = worklet;
95
+ return gesture;
96
+ },
97
+ onUpdate: (worklet) => {
98
+ gesture.update = worklet;
99
+ return gesture;
100
+ },
101
+ onEnd: (worklet) => {
102
+ gesture.end = worklet;
103
+ return gesture;
104
+ },
105
+ onFinalize: (worklet) => {
106
+ gesture.finalize = worklet;
107
+ return gesture;
108
+ },
109
+ };
110
+ mockGestures.push(gesture);
111
+ return gesture;
112
+ };
113
+
114
+ return {
115
+ Gesture: {
116
+ Pan: () => build('Pan'),
117
+ Tap: () => build('Tap'),
118
+ LongPress: () => build('LongPress'),
119
+ Race: (...members: MockGesture[]) => {
120
+ const race = build('Race');
121
+ race.members.push(...members);
122
+ return race;
123
+ },
124
+ },
125
+ GestureDetector: ({ children }: { children: React.ReactNode }) => children,
126
+ GestureHandlerRootView: ({ children }: { children: React.ReactNode }) => children,
127
+ };
128
+ });
129
+
130
+ const ITEMS: TabBarItem[] = [
131
+ { name: 'home', label: 'Home', icon: null },
132
+ { name: 'search', label: 'Search', icon: null },
133
+ { name: 'you', label: 'You', icon: null },
134
+ ];
135
+
136
+ /** Comfortably narrower than the tablet window, so the constraint binds. */
137
+ const MAX_WIDTH = 480;
138
+
139
+ /** Captures the shared minimize progress so a test can drive the bar minimized. */
140
+ function MinimizeProbe({ onState }: { onState: (state: MinimizeState) => void }) {
141
+ onState(useMinimizeState());
142
+ return null;
143
+ }
144
+
145
+ function Tree({
146
+ maxWidth,
147
+ onIndexChange,
148
+ onState,
149
+ }: {
150
+ maxWidth?: number;
151
+ onIndexChange?: (index: number) => void;
152
+ onState?: (state: MinimizeState) => void;
153
+ }) {
154
+ return (
155
+ <BloomThemeProvider mode="light" colorPreset="teal">
156
+ <TabBarMinimizeProvider>
157
+ {onState ? <MinimizeProbe onState={onState} /> : null}
158
+ <TabBar activeIndex={0} maxWidth={maxWidth} onIndexChange={onIndexChange}>
159
+ {ITEMS.map((item, index) => (
160
+ <TabBarButton key={item.name} item={item} index={index} />
161
+ ))}
162
+ </TabBar>
163
+ </TabBarMinimizeProvider>
164
+ </BloomThemeProvider>
165
+ );
166
+ }
167
+
168
+ function renderBar(props: {
169
+ maxWidth?: number;
170
+ onIndexChange?: (index: number) => void;
171
+ onState?: (state: MinimizeState) => void;
172
+ }) {
173
+ const utils = render(<Tree {...props} />);
174
+ return { ...utils, resettle: () => utils.rerender(<Tree {...props} />) };
175
+ }
176
+
177
+ function flattenStyle(style: unknown): Record<string, unknown> {
178
+ const out: Record<string, unknown> = {};
179
+ const visit = (value: unknown): void => {
180
+ if (Array.isArray(value)) value.forEach(visit);
181
+ else if (value && typeof value === 'object') Object.assign(out, value);
182
+ };
183
+ visit(style);
184
+ return out;
185
+ }
186
+
187
+ /** Flattened style of the one node matching `match`, which must be unique. */
188
+ function styleOf(
189
+ root: ReactTestInstance,
190
+ match: (style: Record<string, unknown>) => boolean,
191
+ what: string,
192
+ ): Record<string, unknown> {
193
+ const found = root
194
+ .findAll((node) => typeof node.type === 'string')
195
+ .map((node) => flattenStyle(node.props.style))
196
+ .filter(match);
197
+ if (found.length !== 1) throw new Error(`Expected exactly one ${what}, found ${found.length}`);
198
+ return found[0] as Record<string, unknown>;
199
+ }
200
+
201
+ /** `styles.barWrap` — the box the pill's animated margins are applied inside. */
202
+ function wrapStyle(root: ReactTestInstance): Record<string, unknown> {
203
+ return styleOf(root, (style) => style.marginHorizontal === BAR_MARGIN, 'bar wrap');
204
+ }
205
+
206
+ /**
207
+ * The sliding highlight. The capsule surface also carries
208
+ * `borderCurve: 'continuous'`, but it is an `absoluteFill` with no width of its
209
+ * own — the width IS the highlight's geometry, which is what this reads.
210
+ */
211
+ function highlightStyle(root: ReactTestInstance): Record<string, unknown> {
212
+ return styleOf(
213
+ root,
214
+ (style) => style.borderCurve === 'continuous' && typeof style.width === 'number',
215
+ 'highlight',
216
+ );
217
+ }
218
+
219
+ /** The item width the bar ACTUALLY rendered, read back off the highlight. */
220
+ function renderedItemWidth(root: ReactTestInstance): number {
221
+ const width = highlightStyle(root).width;
222
+ if (typeof width !== 'number') throw new Error('The highlight rendered no numeric width');
223
+ return width;
224
+ }
225
+
226
+ /** Centre of tab `index`, in the pill's own coordinates (what `event.x` uses). */
227
+ function centreOf(index: number, itemWidth: number): number {
228
+ return ROW_PAD_H + (index + 0.5) * itemWidth;
229
+ }
230
+
231
+ /** The gesture the detector was given — the last race constructed. */
232
+ function member(kind: string): MockGesture {
233
+ const race = mockGestures.filter((gesture) => gesture.kind === 'Race').pop();
234
+ if (!race) throw new Error('The bar composed no gesture race');
235
+ const found = race.members.find((gesture) => gesture.kind === kind);
236
+ if (!found) throw new Error(`No ${kind} gesture in the bar's race`);
237
+ return found;
238
+ }
239
+
240
+ /** A tap that succeeded at `x`, measured from the pill's left edge. */
241
+ function tapAt(x: number) {
242
+ act(() => {
243
+ member('Tap').end?.({ x }, true);
244
+ });
245
+ }
246
+
247
+ /** Scrub to `x` and release there — the other path through `indexAtX`. */
248
+ function scrubTo(x: number) {
249
+ act(() => {
250
+ member('Pan').start?.({ x });
251
+ member('Pan').update?.({ x });
252
+ member('Pan').finalize?.();
253
+ });
254
+ }
255
+
256
+ beforeEach(() => {
257
+ mockGestures.length = 0;
258
+ mockWindowWidth = TABLET_WIDTH;
259
+ });
260
+
261
+ describe('TabBar maxWidth', () => {
262
+ describe('layout', () => {
263
+ it('leaves the wrap unconstrained when the prop is omitted', () => {
264
+ // No default: an existing consumer's bar must be the same bar, so the wrap
265
+ // keeps stretching to the full window rather than acquiring a width.
266
+ const style = wrapStyle(renderBar({}).UNSAFE_root);
267
+ expect(style.width).toBeUndefined();
268
+ expect(style.alignSelf).toBeUndefined();
269
+ });
270
+
271
+ it('constrains the wrap and centres it', () => {
272
+ const style = wrapStyle(renderBar({ maxWidth: MAX_WIDTH }).UNSAFE_root);
273
+ expect(style.width).toBe(MAX_WIDTH);
274
+ // Centring is static and belongs to the WRAP; the minimize inset stays an
275
+ // animated pair of equal margins on the pill inside it.
276
+ expect(style.alignSelf).toBe('center');
277
+ });
278
+
279
+ it('is a ceiling, never a floor', () => {
280
+ // A phone narrower than the value keeps the full-bleed bar, so one value
281
+ // can be passed unconditionally from a shared tab layout.
282
+ mockWindowWidth = 375;
283
+ const style = wrapStyle(renderBar({ maxWidth: MAX_WIDTH }).UNSAFE_root);
284
+ expect(style.width).toBe(375 - BAR_MARGIN * 2);
285
+ });
286
+
287
+ it('never lets the bar exceed the window', () => {
288
+ mockWindowWidth = 900;
289
+ const style = wrapStyle(renderBar({ maxWidth: 4000 }).UNSAFE_root);
290
+ expect(style.width).toBe(900 - BAR_MARGIN * 2);
291
+ });
292
+ });
293
+
294
+ describe('geometry', () => {
295
+ it('sizes the highlight from the constrained width, not the window', () => {
296
+ const { UNSAFE_root } = renderBar({ maxWidth: MAX_WIDTH });
297
+ expect(renderedItemWidth(UNSAFE_root)).toBeCloseTo((MAX_WIDTH - ROW_PAD_H * 2) / 3, 5);
298
+ });
299
+
300
+ it('sizes it from the window when the prop is omitted', () => {
301
+ const { UNSAFE_root } = renderBar({});
302
+ const available = TABLET_WIDTH - BAR_MARGIN * 2;
303
+ expect(renderedItemWidth(UNSAFE_root)).toBeCloseTo((available - ROW_PAD_H * 2) / 3, 5);
304
+ });
305
+
306
+ it('a tap lands on the tab it is visibly over', () => {
307
+ // THE test this prop exists for. The item width comes from the highlight
308
+ // the bar actually rendered, so this asserts layout and hit-testing
309
+ // against each other: derive either one from a different width and the
310
+ // centre of a rendered slot resolves to a different tab.
311
+ const onIndexChange = jest.fn();
312
+ const { UNSAFE_root } = renderBar({ maxWidth: MAX_WIDTH, onIndexChange });
313
+ const itemWidth = renderedItemWidth(UNSAFE_root);
314
+
315
+ for (const index of ITEMS.map((_item, i) => i)) tapAt(centreOf(index, itemWidth));
316
+
317
+ expect(onIndexChange.mock.calls).toEqual([[0], [1], [2]]);
318
+ });
319
+
320
+ it('resolves the far right of the constrained pill to the LAST tab', () => {
321
+ // The same failure stated as a single number, so what regresses is legible
322
+ // in the diff: at 1024pt the unconstrained geometry makes each tab 330.7pt
323
+ // wide, and 479 is only 1.4 of those from the left — the middle tab.
324
+ const onIndexChange = jest.fn();
325
+ renderBar({ maxWidth: MAX_WIDTH, onIndexChange });
326
+
327
+ tapAt(MAX_WIDTH - 1);
328
+
329
+ expect(onIndexChange).toHaveBeenCalledWith(ITEMS.length - 1);
330
+ });
331
+
332
+ it('resolves the far left to the FIRST tab', () => {
333
+ const onIndexChange = jest.fn();
334
+ renderBar({ maxWidth: MAX_WIDTH, onIndexChange });
335
+
336
+ tapAt(1);
337
+
338
+ expect(onIndexChange).toHaveBeenCalledWith(0);
339
+ });
340
+
341
+ it('scrubs to the same tabs a tap would', () => {
342
+ // Pan, tap and long press share one `indexAtX` worklet; the scrub is the
343
+ // path that would drag the highlight visibly past the end of a
344
+ // window-width bar.
345
+ const onIndexChange = jest.fn();
346
+ const { UNSAFE_root } = renderBar({ maxWidth: MAX_WIDTH, onIndexChange });
347
+ const itemWidth = renderedItemWidth(UNSAFE_root);
348
+
349
+ for (const index of ITEMS.map((_item, i) => i)) scrubTo(centreOf(index, itemWidth));
350
+
351
+ expect(onIndexChange.mock.calls).toEqual([[0], [1], [2]]);
352
+ });
353
+ });
354
+
355
+ describe('composed with the minimize inset', () => {
356
+ /** Render constrained, drive the bar fully minimized, settle the mappers. */
357
+ function renderMinimized() {
358
+ let state: MinimizeState | undefined;
359
+ const onIndexChange = jest.fn();
360
+ const utils = renderBar({
361
+ maxWidth: MAX_WIDTH,
362
+ onIndexChange,
363
+ onState: (value) => {
364
+ state = value;
365
+ },
366
+ });
367
+ if (!state) throw new Error('MinimizeProbe never ran');
368
+ // The reanimated mock's shared values are plain boxes: a write is only
369
+ // visible to `useAnimatedStyle` on the NEXT render.
370
+ const progress = state.progress;
371
+ act(() => {
372
+ progress.value = 1;
373
+ });
374
+ utils.resettle();
375
+ return { ...utils, onIndexChange };
376
+ }
377
+
378
+ it('shrinks the pill by the inset on BOTH sides of the constrained width', () => {
379
+ const { UNSAFE_root } = renderMinimized();
380
+ const barWidth = MAX_WIDTH - MINIMIZED_INSET * 2;
381
+ expect(renderedItemWidth(UNSAFE_root)).toBeCloseTo((barWidth - ROW_PAD_H * 2) / 3, 5);
382
+ });
383
+
384
+ it('still lands a tap on the tab it is visibly over', () => {
385
+ // Centring (static, on the wrap) and the inset (animated, on the pill)
386
+ // compose: equal margins keep the pill centred inside the constrained
387
+ // wrap, and `event.x` stays relative to the pill, so the same geometry
388
+ // holds at both ends of the minimize animation.
389
+ const { UNSAFE_root, onIndexChange } = renderMinimized();
390
+ const itemWidth = renderedItemWidth(UNSAFE_root);
391
+
392
+ for (const index of ITEMS.map((_item, i) => i)) tapAt(centreOf(index, itemWidth));
393
+
394
+ expect(onIndexChange.mock.calls).toEqual([[0], [1], [2]]);
395
+ });
396
+ });
397
+
398
+ it('leaves the blur band full-bleed', () => {
399
+ // The band is the screen-edge scrim content dissolves into, not part of the
400
+ // pill — constraining it would leave a floating blurred rectangle.
401
+ const { UNSAFE_root } = renderBar({ maxWidth: MAX_WIDTH });
402
+ // The band's own root, not one of the ten layers inside it: only the root
403
+ // is the `pointerEvents: 'none'` box that the bar sizes.
404
+ const band = styleOf(
405
+ UNSAFE_root,
406
+ (style) => style.pointerEvents === 'none' && typeof style.height === 'number',
407
+ 'blur band',
408
+ );
409
+ expect(band.left).toBe(0);
410
+ expect(band.right).toBe(0);
411
+ expect(band.width).toBeUndefined();
412
+ });
413
+ });
@@ -22,7 +22,7 @@ import {
22
22
  useMemo,
23
23
  type ComponentType,
24
24
  } from 'react';
25
- import { Pressable, StyleSheet, useWindowDimensions, View } from 'react-native';
25
+ import { Pressable, StyleSheet, useWindowDimensions, View, type ViewStyle } from 'react-native';
26
26
  import { Gesture, GestureDetector } from 'react-native-gesture-handler';
27
27
  import Animated, {
28
28
  Extrapolation,
@@ -98,6 +98,8 @@ function TabBarBody({
98
98
  onIndexLongPress,
99
99
  theme: themeOverrides,
100
100
  haptics = true,
101
+ blur = true,
102
+ maxWidth,
101
103
  style,
102
104
  ...viewProps
103
105
  }: TabBarBodyProps) {
@@ -112,6 +114,22 @@ function TabBarBody({
112
114
  const theme = useTabBarTheme(themeOverrides);
113
115
  const impact = useHaptics();
114
116
 
117
+ // The pill's OUTER width (the box the animated minimize inset is applied
118
+ // inside), and the single source of truth for it: the wrap's own layout, the
119
+ // highlight geometry and the `indexAtX` scrub worklet all derive from this one
120
+ // number. They have to, or a tap lands on a tab the highlight is not under —
121
+ // the exact failure `maxWidth` exists to prevent, since narrowing the bar from
122
+ // the outside with a `style` override moves only the pixels.
123
+ //
124
+ // Unconstrained it is what the stretched wrap already measures
125
+ // (`windowWidth - BAR_MARGIN * 2`), so an existing consumer's geometry is
126
+ // unchanged to the pixel. `maxWidth` is a ceiling, never a floor: on a window
127
+ // narrower than it, the bar stays full-bleed.
128
+ const barOuterWidth =
129
+ maxWidth === undefined
130
+ ? windowWidth - BAR_MARGIN * 2
131
+ : Math.min(windowWidth - BAR_MARGIN * 2, maxWidth);
132
+
115
133
  // Picker-style tick while the highlight crosses tab boundaries mid-drag.
116
134
  // `useHaptics` already no-ops on web, when the optional `expo-haptics` peer
117
135
  // is absent, and when a `BloomHapticsProvider` has haptics turned off — so
@@ -159,7 +177,13 @@ function TabBarBody({
159
177
  [0, MINIMIZED_INSET],
160
178
  Extrapolation.CLAMP,
161
179
  );
162
- const barWidth = windowWidth - BAR_MARGIN * 2 - sideInset * 2;
180
+ // `event.x` is measured from the left edge of the view the detector is
181
+ // attached to — the animated pill itself, NOT the window and not the wrap
182
+ // around it. Its width is therefore the outer width minus the two
183
+ // animated margins, which is exactly what this computes, constrained or
184
+ // not. (Margins sit outside a view's own box, so x = 0 is the pill's left
185
+ // border edge either way.)
186
+ const barWidth = barOuterWidth - sideInset * 2;
163
187
  const itemWidth = (barWidth - ROW_PAD_H * 2) / tabCount;
164
188
  const raw = (x - ROW_PAD_H) / itemWidth - 0.5;
165
189
  return Math.min(Math.max(raw, 0), tabCount - 1);
@@ -230,7 +254,7 @@ function TabBarBody({
230
254
 
231
255
  return Gesture.Race(pan, tap, longPress);
232
256
  }, [
233
- windowWidth,
257
+ barOuterWidth,
234
258
  tabCount,
235
259
  selectIndex,
236
260
  hasLongPress,
@@ -311,7 +335,9 @@ function TabBarBody({
311
335
  [0, MINIMIZED_INSET],
312
336
  Extrapolation.CLAMP,
313
337
  );
314
- const barWidth = windowWidth - BAR_MARGIN * 2 - sideInset * 2;
338
+ // Same `barOuterWidth` the scrub worklet resolves an index from see the
339
+ // note where it is computed.
340
+ const barWidth = barOuterWidth - sideInset * 2;
315
341
  const itemWidth = (barWidth - ROW_PAD_H * 2) / tabCount;
316
342
  return {
317
343
  height,
@@ -320,11 +346,25 @@ function TabBarBody({
320
346
  top: (barHeight - height) / 2,
321
347
  transform: [{ translateX: ROW_PAD_H + itemWidth * slideIndex.value }],
322
348
  };
323
- }, [progress, slideIndex, windowWidth, tabCount]);
349
+ }, [progress, slideIndex, barOuterWidth, tabCount]);
324
350
 
325
351
  // Shared with `useTabBarFootprint`, so a consumer accounting for the bar in
326
352
  // its own layout can never drift from where the bar actually sits.
327
353
  const bottomOffset = tabBarBottomGap(insets.bottom);
354
+
355
+ // How centring and the animated inset compose: centring is STATIC and belongs
356
+ // to the wrap, the inset stays ANIMATED on the pill inside it. The wrap is
357
+ // centred once by layout at a definite width, and the pill's two equal
358
+ // margins keep it centred within that wrap at every point of the minimize
359
+ // animation — neither has to know about the other. Centring the animated view
360
+ // itself would instead mean `alignSelf: 'center'` on a node with no width of
361
+ // its own (its width comes from those margins), which Yoga then sizes from its
362
+ // CONTENT rather than from the constraint.
363
+ //
364
+ // Applied only when `maxWidth` is set: with no width and no `alignSelf` the
365
+ // wrap stretches, which is the original full-bleed behaviour.
366
+ const constrainedWrapStyle: ViewStyle | null =
367
+ maxWidth === undefined ? null : { width: barOuterWidth, alignSelf: 'center' };
328
368
  const barContext = useMemo(
329
369
  () => ({ slideIndex, isDragging, theme, activeIndex, selectIndex }),
330
370
  [slideIndex, isDragging, theme, activeIndex, selectIndex],
@@ -332,18 +372,28 @@ function TabBarBody({
332
372
 
333
373
  return (
334
374
  <View {...viewProps} style={[styles.root, style]}>
335
- {/* Progressive blur rising from the screen's bottom edge behind the pill. */}
336
- <Blur
337
- direction="bottom"
338
- style={{
339
- position: 'absolute',
340
- left: 0,
341
- right: 0,
342
- bottom: 0,
343
- height: bottomOffset + EXPANDED_HEIGHT + BLUR_BLEED,
344
- }}
345
- />
346
- <View style={[styles.barWrap, { marginBottom: bottomOffset }]}>
375
+ {/* Progressive blur rising from the screen's bottom edge behind the pill.
376
+ Rendered CONDITIONALLY, and as nothing at all when off: the band is
377
+ full-bleed and 114pt tall at a zero bottom inset, so it blurs whatever
378
+ a screen floats near the bottom edge (a scrubber, a FAB), and leaving
379
+ an empty absolutely-positioned view behind would keep a node — and a
380
+ rect — that exists to do nothing. Stays full-bleed under `maxWidth`:
381
+ it is the screen-edge scrim content dissolves into, not part of the
382
+ pill. */}
383
+ {blur !== false && (
384
+ <Blur
385
+ direction="bottom"
386
+ intensity={typeof blur === 'object' ? blur.intensity : undefined}
387
+ style={{
388
+ position: 'absolute',
389
+ left: 0,
390
+ right: 0,
391
+ bottom: 0,
392
+ height: bottomOffset + EXPANDED_HEIGHT + BLUR_BLEED,
393
+ }}
394
+ />
395
+ )}
396
+ <View style={[styles.barWrap, { marginBottom: bottomOffset }, constrainedWrapStyle]}>
347
397
  <GestureDetector gesture={gesture}>
348
398
  <Animated.View style={barStyle}>
349
399
  <Surface theme={theme} style={shapeStyle} />
@@ -107,6 +107,44 @@ export type TabBarProps = ViewProps & {
107
107
  * optional `expo-haptics` peer is absent.
108
108
  */
109
109
  haptics?: boolean;
110
+ /**
111
+ * The progressive blur rising from the bottom edge of the screen behind the
112
+ * pill. Defaults to `true`; `{ intensity }` tunes its strength.
113
+ *
114
+ * Pass `false` to remove it entirely — no blur, and no node left behind. The
115
+ * band is tall (the bar's own bottom gap plus its expanded height plus the
116
+ * bleed above it, 114pt at a zero bottom inset) and full-bleed, so anything a
117
+ * screen floats near the bottom edge — a video scrubber, a FAB — sits INSIDE
118
+ * it and is blurred. That cannot be undone from the outside: `zIndex` only
119
+ * orders siblings within one stacking context, and a screen's FAB is inside
120
+ * an earlier sibling of the bar's host, so no z-order a consumer can write
121
+ * lifts it above this band. Turning the blur off is the only fix that does
122
+ * not also change where the FAB paints relative to everything else.
123
+ *
124
+ * On native the band is ten stacked `expo-blur` layers plus a tail gradient;
125
+ * on web it is one masked `backdrop-filter`. `false` skips both.
126
+ */
127
+ blur?: boolean | { intensity?: number };
128
+ /**
129
+ * Maximum width of the pill, in points. No default — omit it and the bar
130
+ * spans the window exactly as it always has.
131
+ *
132
+ * A CEILING, never a floor: on a window narrower than this the bar keeps its
133
+ * full-bleed width, so a phone layout is untouched by any value big enough to
134
+ * matter on a tablet. When it binds, the pill is constrained to this width and
135
+ * CENTRED, and the ITEM geometry follows it — the item width, the sliding
136
+ * highlight's position and the tap/scrub hit-testing all derive from the same
137
+ * constrained width, so a tap still lands on the tab it is visibly over.
138
+ *
139
+ * That last part is why this cannot be done from the outside. Narrowing the
140
+ * bar with a `style` override moves the pixels only: the highlight and the
141
+ * scrub worklet would still divide the WINDOW width by the tab count, leaving
142
+ * the highlight sized and positioned for a bar that is no longer there. On an
143
+ * iPad the unconstrained bar is the reason to reach for this at all — 810pt at
144
+ * 11" portrait, 1342pt in landscape, leaving 21pt glyphs adrift in cells
145
+ * hundreds of points wide.
146
+ */
147
+ maxWidth?: number;
110
148
  };
111
149
 
112
150
  export type TabBarButtonProps = PressableProps & {