react-native-magic-tab-bar 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +253 -44
- package/lib/module/MagicTabBar.js +50 -7
- package/lib/module/MagicTabBar.js.map +1 -1
- package/lib/module/MagicTabItem.js +256 -23
- package/lib/module/MagicTabItem.js.map +1 -1
- package/lib/module/MagicTabs.js +95 -15
- package/lib/module/MagicTabs.js.map +1 -1
- package/lib/module/defaultTabs.js +5 -4
- package/lib/module/defaultTabs.js.map +1 -1
- package/lib/module/index.js +6 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/theme.js +10 -1
- package/lib/module/theme.js.map +1 -1
- package/lib/typescript/MagicTabBar.d.ts +18 -1
- package/lib/typescript/MagicTabBar.d.ts.map +1 -1
- package/lib/typescript/MagicTabItem.d.ts +30 -4
- package/lib/typescript/MagicTabItem.d.ts.map +1 -1
- package/lib/typescript/MagicTabs.d.ts +43 -6
- package/lib/typescript/MagicTabs.d.ts.map +1 -1
- package/lib/typescript/defaultTabs.d.ts +5 -4
- package/lib/typescript/defaultTabs.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -2
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/theme.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +60 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +14 -4
- package/src/MagicTabBar.tsx +81 -7
- package/src/MagicTabItem.tsx +338 -19
- package/src/MagicTabs.tsx +168 -13
- package/src/defaultTabs.tsx +5 -4
- package/src/index.tsx +10 -1
- package/src/theme.ts +5 -0
- package/src/types.ts +64 -0
|
@@ -1,16 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { forwardRef, useEffect } from 'react';
|
|
4
|
-
import { Pressable, StyleSheet } from 'react-native';
|
|
5
|
-
import Animated, { FadeIn, LinearTransition, useAnimatedStyle, useSharedValue, withSpring } from 'react-native-reanimated';
|
|
3
|
+
import { forwardRef, memo, useCallback, useEffect, useMemo } from 'react';
|
|
4
|
+
import { Pressable, StyleSheet, Text, View } from 'react-native';
|
|
5
|
+
import Animated, { FadeIn, FadeOut, LinearTransition, useAnimatedStyle, useSharedValue, withSpring } from 'react-native-reanimated';
|
|
6
|
+
|
|
7
|
+
/** Minimal shape we use from the optional `expo-haptics` module. */
|
|
6
8
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
|
+
/**
|
|
10
|
+
* `expo-haptics` is an optional peer dependency. We load it through a guarded
|
|
11
|
+
* `require` so the library still installs and runs without it — when it's
|
|
12
|
+
* absent, the `haptics` prop simply has no effect.
|
|
13
|
+
*/
|
|
14
|
+
const expoHaptics = (() => {
|
|
15
|
+
try {
|
|
16
|
+
return require('expo-haptics');
|
|
17
|
+
} catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
})();
|
|
7
21
|
const AnimatedPressable = Animated.createAnimatedComponent(Pressable);
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
22
|
+
|
|
23
|
+
/** Fixed small icon size used by the compact "light" tab bar. */
|
|
24
|
+
const LIGHT_ICON_SIZE = 20;
|
|
25
|
+
|
|
26
|
+
/** Whether a `badge` value should render anything at all. */
|
|
27
|
+
function hasBadge(badge) {
|
|
28
|
+
return badge === true || typeof badge === 'number' && badge > 0 || typeof badge === 'string' && badge.length > 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Formats a numeric/string badge; numbers above 99 collapse to `99+`. */
|
|
32
|
+
function formatBadge(badge) {
|
|
33
|
+
return typeof badge === 'number' && badge > 99 ? '99+' : String(badge);
|
|
34
|
+
}
|
|
14
35
|
/**
|
|
15
36
|
* A single tab. Designed to be used as the `asChild` target of an
|
|
16
37
|
* Expo Router `<TabTrigger>`, which injects the focus state and press handlers.
|
|
@@ -18,49 +39,193 @@ const transition = LinearTransition.springify().mass(SPRING.mass).damping(SPRING
|
|
|
18
39
|
* Each tab sizes to its content — just the icon when inactive, icon + label
|
|
19
40
|
* when active — so the active label is never clipped, on any screen width.
|
|
20
41
|
*/
|
|
21
|
-
export const MagicTabItem = /*#__PURE__*/forwardRef(function MagicTabItem({
|
|
42
|
+
export const MagicTabItem = /*#__PURE__*/memo(/*#__PURE__*/forwardRef(function MagicTabItem({
|
|
22
43
|
icon,
|
|
23
44
|
label,
|
|
45
|
+
labelMode = 'active',
|
|
46
|
+
labelPosition = 'right',
|
|
47
|
+
badge,
|
|
48
|
+
disabled = false,
|
|
49
|
+
variant,
|
|
50
|
+
isLight = false,
|
|
51
|
+
haptics = false,
|
|
52
|
+
name,
|
|
53
|
+
onTabPress,
|
|
54
|
+
onTabLongPress,
|
|
24
55
|
theme,
|
|
25
56
|
isFocused,
|
|
26
57
|
onPress,
|
|
27
58
|
onLongPress
|
|
28
59
|
}, ref) {
|
|
29
60
|
const focused = Boolean(isFocused);
|
|
61
|
+
const {
|
|
62
|
+
spring
|
|
63
|
+
} = theme;
|
|
30
64
|
const progress = useSharedValue(focused ? 1 : 0);
|
|
31
65
|
useEffect(() => {
|
|
32
|
-
progress.value = withSpring(focused ? 1 : 0,
|
|
33
|
-
}, [focused, progress]);
|
|
66
|
+
progress.value = withSpring(focused ? 1 : 0, spring);
|
|
67
|
+
}, [focused, progress, spring]);
|
|
68
|
+
|
|
69
|
+
// Rebuilt only when the theme's spring changes, so consumers can tune the
|
|
70
|
+
// layout animation's feel via `theme.spring`.
|
|
71
|
+
const transition = useMemo(() => LinearTransition.springify().mass(spring.mass).damping(spring.damping).stiffness(spring.stiffness), [spring.mass, spring.damping, spring.stiffness]);
|
|
34
72
|
const pillStyle = useAnimatedStyle(() => ({
|
|
35
73
|
opacity: progress.value,
|
|
36
74
|
transform: [{
|
|
37
75
|
scale: 0.8 + progress.value * 0.2
|
|
38
76
|
}]
|
|
39
77
|
}));
|
|
78
|
+
const handlePress = useCallback(event => {
|
|
79
|
+
if (haptics) expoHaptics?.selectionAsync?.();
|
|
80
|
+
onTabPress?.(name ?? '', focused);
|
|
81
|
+
onPress?.(event);
|
|
82
|
+
}, [haptics, onTabPress, name, focused, onPress]);
|
|
83
|
+
const handleLongPress = useCallback(event => {
|
|
84
|
+
onTabLongPress?.(name ?? '', focused);
|
|
85
|
+
onLongPress?.(event);
|
|
86
|
+
}, [onTabLongPress, name, focused, onLongPress]);
|
|
87
|
+
const badgeVisible = hasBadge(badge);
|
|
88
|
+
const badgeIsDot = badge === true;
|
|
89
|
+
const iconWithBadge = (iconColor, size) => /*#__PURE__*/_jsxs(View, {
|
|
90
|
+
children: [icon({
|
|
91
|
+
focused,
|
|
92
|
+
color: iconColor,
|
|
93
|
+
size
|
|
94
|
+
}), badgeVisible ? /*#__PURE__*/_jsx(View, {
|
|
95
|
+
pointerEvents: "none",
|
|
96
|
+
style: [styles.badge, badgeIsDot && styles.badgeDot, {
|
|
97
|
+
backgroundColor: theme.badgeColor
|
|
98
|
+
}],
|
|
99
|
+
children: badgeIsDot ? null : /*#__PURE__*/_jsx(Text, {
|
|
100
|
+
numberOfLines: 1,
|
|
101
|
+
style: [styles.badgeText, {
|
|
102
|
+
color: theme.badgeTextColor
|
|
103
|
+
}],
|
|
104
|
+
children: formatBadge(badge)
|
|
105
|
+
})
|
|
106
|
+
}) : null]
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// ---- Raised circular action ("FAB") tab ----
|
|
110
|
+
if (variant === 'action') {
|
|
111
|
+
const size = theme.height - 6;
|
|
112
|
+
return /*#__PURE__*/_jsx(AnimatedPressable, {
|
|
113
|
+
ref: ref,
|
|
114
|
+
onPress: handlePress,
|
|
115
|
+
onLongPress: handleLongPress,
|
|
116
|
+
disabled: disabled,
|
|
117
|
+
accessibilityRole: "button",
|
|
118
|
+
accessibilityState: {
|
|
119
|
+
selected: focused,
|
|
120
|
+
disabled
|
|
121
|
+
},
|
|
122
|
+
style: [styles.action, {
|
|
123
|
+
width: size,
|
|
124
|
+
height: size,
|
|
125
|
+
borderRadius: size / 2,
|
|
126
|
+
backgroundColor: theme.actionColor
|
|
127
|
+
}, disabled && styles.disabled],
|
|
128
|
+
children: iconWithBadge(theme.actionIconColor, theme.iconSize + 2)
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// ---- Normal tab ----
|
|
40
133
|
const color = focused ? theme.activeColor : theme.inactiveColor;
|
|
41
|
-
|
|
134
|
+
|
|
135
|
+
// ---- Compact "light" tab: small icon only, no label ----
|
|
136
|
+
if (isLight) {
|
|
137
|
+
return /*#__PURE__*/_jsxs(AnimatedPressable, {
|
|
138
|
+
ref: ref,
|
|
139
|
+
onPress: handlePress,
|
|
140
|
+
onLongPress: handleLongPress,
|
|
141
|
+
disabled: disabled,
|
|
142
|
+
accessibilityRole: "tab",
|
|
143
|
+
accessibilityState: {
|
|
144
|
+
selected: focused,
|
|
145
|
+
disabled
|
|
146
|
+
},
|
|
147
|
+
layout: transition,
|
|
148
|
+
style: [styles.itemLight, disabled && styles.disabled],
|
|
149
|
+
children: [/*#__PURE__*/_jsx(Animated.View, {
|
|
150
|
+
pointerEvents: "none",
|
|
151
|
+
style: [StyleSheet.absoluteFill, {
|
|
152
|
+
backgroundColor: theme.activePillColor,
|
|
153
|
+
borderRadius: theme.radius
|
|
154
|
+
}, pillStyle]
|
|
155
|
+
}), iconWithBadge(color, LIGHT_ICON_SIZE)]
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
const showLabel = !!label && labelMode !== 'never' && (labelMode === 'always' || focused);
|
|
159
|
+
|
|
160
|
+
// ---- Bottom labels: Material Design 3 layout ----
|
|
161
|
+
// The active indicator ("pill") wraps only the icon as a capsule; the label
|
|
162
|
+
// sits below it. Following M3's `LABEL_VISIBILITY_SELECTED` behaviour, each
|
|
163
|
+
// item is centered as a group: unlabeled tabs are just a centered icon, and
|
|
164
|
+
// the active tab grows to icon + label (nudging its icon up a touch). The
|
|
165
|
+
// layout transition animates that shift smoothly. Indicator sizing follows
|
|
166
|
+
// M3's 64x32-over-24dp ratio, scaled to the theme's icon size.
|
|
167
|
+
if (labelPosition === 'bottom') {
|
|
168
|
+
const indicatorHeight = theme.iconSize + 10;
|
|
169
|
+
const indicatorWidth = theme.iconSize + 32;
|
|
170
|
+
return /*#__PURE__*/_jsxs(AnimatedPressable, {
|
|
171
|
+
ref: ref,
|
|
172
|
+
onPress: handlePress,
|
|
173
|
+
onLongPress: handleLongPress,
|
|
174
|
+
disabled: disabled,
|
|
175
|
+
accessibilityRole: "tab",
|
|
176
|
+
accessibilityState: {
|
|
177
|
+
selected: focused,
|
|
178
|
+
disabled
|
|
179
|
+
},
|
|
180
|
+
layout: transition,
|
|
181
|
+
style: [styles.itemBottom, disabled && styles.disabled],
|
|
182
|
+
children: [/*#__PURE__*/_jsxs(View, {
|
|
183
|
+
style: [styles.indicatorWrap, {
|
|
184
|
+
width: indicatorWidth,
|
|
185
|
+
height: indicatorHeight
|
|
186
|
+
}],
|
|
187
|
+
children: [/*#__PURE__*/_jsx(Animated.View, {
|
|
188
|
+
pointerEvents: "none",
|
|
189
|
+
style: [StyleSheet.absoluteFill, {
|
|
190
|
+
backgroundColor: theme.activePillColor,
|
|
191
|
+
borderRadius: indicatorHeight / 2
|
|
192
|
+
}, pillStyle]
|
|
193
|
+
}), iconWithBadge(color, theme.iconSize)]
|
|
194
|
+
}), showLabel ? /*#__PURE__*/_jsx(Animated.Text, {
|
|
195
|
+
entering: FadeIn.duration(150),
|
|
196
|
+
exiting: FadeOut.duration(120),
|
|
197
|
+
numberOfLines: 1,
|
|
198
|
+
style: [styles.labelBottom, {
|
|
199
|
+
color,
|
|
200
|
+
fontSize: theme.fontSize - 1
|
|
201
|
+
}],
|
|
202
|
+
children: label
|
|
203
|
+
}) : null]
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// ---- Right labels: floating pill wrapping icon + label ----
|
|
42
208
|
return /*#__PURE__*/_jsxs(AnimatedPressable, {
|
|
43
209
|
ref: ref,
|
|
44
|
-
onPress:
|
|
45
|
-
onLongPress:
|
|
210
|
+
onPress: handlePress,
|
|
211
|
+
onLongPress: handleLongPress,
|
|
212
|
+
disabled: disabled,
|
|
46
213
|
accessibilityRole: "tab",
|
|
47
214
|
accessibilityState: {
|
|
48
|
-
selected: focused
|
|
215
|
+
selected: focused,
|
|
216
|
+
disabled
|
|
49
217
|
},
|
|
50
218
|
layout: transition,
|
|
51
|
-
style: [styles.pressable, focused && styles.pressableActive],
|
|
219
|
+
style: [styles.pressable, focused && styles.pressableActive, disabled && styles.disabled],
|
|
52
220
|
children: [/*#__PURE__*/_jsx(Animated.View, {
|
|
53
221
|
pointerEvents: "none",
|
|
54
222
|
style: [StyleSheet.absoluteFill, {
|
|
55
223
|
backgroundColor: theme.activePillColor,
|
|
56
224
|
borderRadius: theme.radius
|
|
57
225
|
}, pillStyle]
|
|
58
|
-
}),
|
|
59
|
-
focused,
|
|
60
|
-
color,
|
|
61
|
-
size: theme.iconSize
|
|
62
|
-
}), showLabel ? /*#__PURE__*/_jsx(Animated.Text, {
|
|
226
|
+
}), iconWithBadge(color, theme.iconSize), showLabel ? /*#__PURE__*/_jsx(Animated.Text, {
|
|
63
227
|
entering: FadeIn.duration(150),
|
|
228
|
+
exiting: FadeOut.duration(120),
|
|
64
229
|
numberOfLines: 1,
|
|
65
230
|
style: [styles.label, {
|
|
66
231
|
color,
|
|
@@ -69,7 +234,7 @@ export const MagicTabItem = /*#__PURE__*/forwardRef(function MagicTabItem({
|
|
|
69
234
|
children: label
|
|
70
235
|
}) : null]
|
|
71
236
|
});
|
|
72
|
-
});
|
|
237
|
+
}));
|
|
73
238
|
const styles = StyleSheet.create({
|
|
74
239
|
pressable: {
|
|
75
240
|
alignSelf: 'center',
|
|
@@ -91,6 +256,74 @@ const styles = StyleSheet.create({
|
|
|
91
256
|
label: {
|
|
92
257
|
fontWeight: '600',
|
|
93
258
|
flexShrink: 1
|
|
259
|
+
},
|
|
260
|
+
// Material Design 3 bottom layout: icon (with capsule indicator) stacked
|
|
261
|
+
// over an always-below label.
|
|
262
|
+
itemBottom: {
|
|
263
|
+
alignSelf: 'center',
|
|
264
|
+
flexDirection: 'column',
|
|
265
|
+
alignItems: 'center',
|
|
266
|
+
justifyContent: 'center',
|
|
267
|
+
gap: 2,
|
|
268
|
+
paddingVertical: 3,
|
|
269
|
+
paddingHorizontal: 4
|
|
270
|
+
},
|
|
271
|
+
indicatorWrap: {
|
|
272
|
+
alignItems: 'center',
|
|
273
|
+
justifyContent: 'center'
|
|
274
|
+
},
|
|
275
|
+
// Compact "light" mode: small icon-only tap target with its own tight padding.
|
|
276
|
+
itemLight: {
|
|
277
|
+
alignSelf: 'center',
|
|
278
|
+
alignItems: 'center',
|
|
279
|
+
justifyContent: 'center',
|
|
280
|
+
paddingVertical: 6,
|
|
281
|
+
paddingHorizontal: 14
|
|
282
|
+
},
|
|
283
|
+
labelBottom: {
|
|
284
|
+
fontWeight: '600',
|
|
285
|
+
textAlign: 'center'
|
|
286
|
+
},
|
|
287
|
+
action: {
|
|
288
|
+
alignSelf: 'center',
|
|
289
|
+
alignItems: 'center',
|
|
290
|
+
justifyContent: 'center',
|
|
291
|
+
marginTop: -22,
|
|
292
|
+
shadowColor: '#000',
|
|
293
|
+
shadowOpacity: 0.3,
|
|
294
|
+
shadowRadius: 8,
|
|
295
|
+
shadowOffset: {
|
|
296
|
+
width: 0,
|
|
297
|
+
height: 4
|
|
298
|
+
},
|
|
299
|
+
elevation: 8
|
|
300
|
+
},
|
|
301
|
+
disabled: {
|
|
302
|
+
opacity: 0.4
|
|
303
|
+
},
|
|
304
|
+
badge: {
|
|
305
|
+
position: 'absolute',
|
|
306
|
+
top: -5,
|
|
307
|
+
left: '65%',
|
|
308
|
+
minWidth: 16,
|
|
309
|
+
height: 16,
|
|
310
|
+
paddingHorizontal: 4,
|
|
311
|
+
borderRadius: 8,
|
|
312
|
+
alignItems: 'center',
|
|
313
|
+
justifyContent: 'center'
|
|
314
|
+
},
|
|
315
|
+
badgeDot: {
|
|
316
|
+
top: -2,
|
|
317
|
+
minWidth: 8,
|
|
318
|
+
width: 8,
|
|
319
|
+
height: 8,
|
|
320
|
+
paddingHorizontal: 0,
|
|
321
|
+
borderRadius: 4
|
|
322
|
+
},
|
|
323
|
+
badgeText: {
|
|
324
|
+
fontSize: 10,
|
|
325
|
+
fontWeight: '700',
|
|
326
|
+
textAlign: 'center'
|
|
94
327
|
}
|
|
95
328
|
});
|
|
96
329
|
//# sourceMappingURL=MagicTabItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["forwardRef","useEffect","Pressable","StyleSheet","Animated","FadeIn","LinearTransition","useAnimatedStyle","useSharedValue","withSpring","jsx","_jsx","jsxs","_jsxs","AnimatedPressable","createAnimatedComponent","SPRING","mass","damping","stiffness","transition","springify","MagicTabItem","icon","label","theme","isFocused","onPress","onLongPress","ref","focused","Boolean","progress","value","pillStyle","opacity","transform","scale","color","activeColor","inactiveColor","showLabel","accessibilityRole","accessibilityState","selected","layout","style","styles","pressable","pressableActive","children","View","pointerEvents","absoluteFill","backgroundColor","activePillColor","borderRadius","radius","size","iconSize","Text","entering","duration","numberOfLines","fontSize","create","alignSelf","flexDirection","alignItems","justifyContent","gap","paddingVertical","paddingHorizontal","flexShrink","fontWeight"],"sourceRoot":"../../src","sources":["MagicTabItem.tsx"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["forwardRef","memo","useCallback","useEffect","useMemo","Pressable","StyleSheet","Text","View","Animated","FadeIn","FadeOut","LinearTransition","useAnimatedStyle","useSharedValue","withSpring","jsx","_jsx","jsxs","_jsxs","expoHaptics","require","AnimatedPressable","createAnimatedComponent","LIGHT_ICON_SIZE","hasBadge","badge","length","formatBadge","String","MagicTabItem","icon","label","labelMode","labelPosition","disabled","variant","isLight","haptics","name","onTabPress","onTabLongPress","theme","isFocused","onPress","onLongPress","ref","focused","Boolean","spring","progress","value","transition","springify","mass","damping","stiffness","pillStyle","opacity","transform","scale","handlePress","event","selectionAsync","handleLongPress","badgeVisible","badgeIsDot","iconWithBadge","iconColor","size","children","color","pointerEvents","style","styles","badgeDot","backgroundColor","badgeColor","numberOfLines","badgeText","badgeTextColor","height","accessibilityRole","accessibilityState","selected","action","width","borderRadius","actionColor","actionIconColor","iconSize","activeColor","inactiveColor","layout","itemLight","absoluteFill","activePillColor","radius","showLabel","indicatorHeight","indicatorWidth","itemBottom","indicatorWrap","entering","duration","exiting","labelBottom","fontSize","pressable","pressableActive","create","alignSelf","flexDirection","alignItems","justifyContent","gap","paddingVertical","paddingHorizontal","flexShrink","fontWeight","textAlign","marginTop","shadowColor","shadowOpacity","shadowRadius","shadowOffset","elevation","position","top","left","minWidth"],"sourceRoot":"../../src","sources":["MagicTabItem.tsx"],"mappings":"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","ignoreList":[]}
|
package/lib/module/MagicTabs.js
CHANGED
|
@@ -1,11 +1,56 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import { useMemo } from 'react';
|
|
3
4
|
import { Tabs, TabList, TabSlot, TabTrigger } from 'expo-router/ui';
|
|
5
|
+
import { usePathname } from 'expo-router';
|
|
4
6
|
import { MagicTabBar } from "./MagicTabBar.js";
|
|
5
7
|
import { MagicTabItem } from "./MagicTabItem.js";
|
|
6
|
-
import { defaultTabs } from "./defaultTabs.js";
|
|
7
8
|
import { defaultTheme } from "./theme.js";
|
|
8
9
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
10
|
+
/** Best-effort string path for an `Href` (covers string and `{ pathname }` forms). */
|
|
11
|
+
function hrefToPath(href) {
|
|
12
|
+
if (typeof href === 'string') return href;
|
|
13
|
+
const pathname = href?.pathname;
|
|
14
|
+
return typeof pathname === 'string' ? pathname : '';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Finds the tab whose `href` best matches the current path, by longest prefix
|
|
19
|
+
* so nested routes (e.g. `/explore/details`) still resolve to their tab.
|
|
20
|
+
*/
|
|
21
|
+
function findActiveTab(tabs, pathname) {
|
|
22
|
+
let best;
|
|
23
|
+
let bestLen = -1;
|
|
24
|
+
for (const tab of tabs) {
|
|
25
|
+
const path = hrefToPath(tab.href);
|
|
26
|
+
if (!path) continue;
|
|
27
|
+
const matches = path === '/' ? pathname === '/' : pathname === path || pathname.startsWith(`${path}/`);
|
|
28
|
+
if (matches && path.length > bestLen) {
|
|
29
|
+
best = tab;
|
|
30
|
+
bestLen = path.length;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return best;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Normalizes the `showLabels` prop (boolean shorthand or explicit mode) and
|
|
38
|
+
* clamps it to what the current `labelPosition` can display well.
|
|
39
|
+
*
|
|
40
|
+
* `'always'` only works with `labelPosition="bottom"`: side-by-side, every tab
|
|
41
|
+
* would expand to its full label width and overflow the bar, so we downgrade
|
|
42
|
+
* it to `'active'` (and warn in dev).
|
|
43
|
+
*/
|
|
44
|
+
function resolveLabelMode(showLabels, labelPosition) {
|
|
45
|
+
const mode = showLabels === true ? 'active' : showLabels === false ? 'never' : showLabels;
|
|
46
|
+
if (mode === 'always' && labelPosition !== 'bottom') {
|
|
47
|
+
if (__DEV__) {
|
|
48
|
+
console.warn('[MagicTabs] showLabels="always" requires labelPosition="bottom"; ' + 'falling back to "active". Set labelPosition="bottom" to keep every label visible.');
|
|
49
|
+
}
|
|
50
|
+
return 'active';
|
|
51
|
+
}
|
|
52
|
+
return mode;
|
|
53
|
+
}
|
|
9
54
|
/**
|
|
10
55
|
* A drop-in custom tab bar for Expo Router.
|
|
11
56
|
*
|
|
@@ -21,38 +66,73 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
21
66
|
* ```
|
|
22
67
|
*/
|
|
23
68
|
export function MagicTabs({
|
|
24
|
-
tabs
|
|
69
|
+
tabs,
|
|
25
70
|
theme: themeOverride,
|
|
71
|
+
showLabels = true,
|
|
72
|
+
labelPosition = 'right',
|
|
73
|
+
isLight = false,
|
|
74
|
+
lightBottomMargin,
|
|
26
75
|
variant,
|
|
27
76
|
isTransparent,
|
|
28
77
|
transparency,
|
|
29
78
|
glass,
|
|
30
|
-
renderBackground
|
|
79
|
+
renderBackground,
|
|
80
|
+
haptics,
|
|
81
|
+
onTabPress,
|
|
82
|
+
onTabLongPress
|
|
31
83
|
}) {
|
|
32
|
-
|
|
84
|
+
// Stable identity so it doesn't re-trigger memoized children every render.
|
|
85
|
+
const theme = useMemo(() => ({
|
|
33
86
|
...defaultTheme,
|
|
34
87
|
...themeOverride
|
|
35
|
-
};
|
|
88
|
+
}), [themeOverride]);
|
|
89
|
+
const barLabelMode = resolveLabelMode(showLabels, labelPosition);
|
|
90
|
+
|
|
91
|
+
// The bar is "light" when either the whole bar is forced light (`isLight`)
|
|
92
|
+
// or the currently active tab opts in via its own `isLight` config. Changing
|
|
93
|
+
// routes flips this and the bar animates between the two layouts.
|
|
94
|
+
const pathname = usePathname();
|
|
95
|
+
const activeTab = findActiveTab(tabs, pathname);
|
|
96
|
+
const effectiveLight = isLight || !!activeTab?.isLight;
|
|
36
97
|
return /*#__PURE__*/_jsxs(Tabs, {
|
|
37
98
|
children: [/*#__PURE__*/_jsx(TabSlot, {}), /*#__PURE__*/_jsx(TabList, {
|
|
38
99
|
asChild: true,
|
|
39
100
|
children: /*#__PURE__*/_jsx(MagicTabBar, {
|
|
40
101
|
theme: theme,
|
|
41
102
|
variant: variant,
|
|
103
|
+
labelPosition: labelPosition,
|
|
104
|
+
isLight: effectiveLight,
|
|
105
|
+
lightBottomMargin: lightBottomMargin,
|
|
42
106
|
isTransparent: isTransparent,
|
|
43
107
|
transparency: transparency,
|
|
44
108
|
glass: glass,
|
|
45
109
|
renderBackground: renderBackground,
|
|
46
|
-
children: tabs.map(tab =>
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
110
|
+
children: tabs.map(tab => {
|
|
111
|
+
// A tab's `showLabel` overrides the bar-level mode: `false` forces
|
|
112
|
+
// icon-only, `true` shows it (falling back to `'active'` when the
|
|
113
|
+
// bar itself is set to `'never'`).
|
|
114
|
+
const labelMode = tab.showLabel === undefined ? barLabelMode : tab.showLabel ? barLabelMode === 'never' ? 'active' : barLabelMode : 'never';
|
|
115
|
+
return /*#__PURE__*/_jsx(TabTrigger, {
|
|
116
|
+
name: tab.name,
|
|
117
|
+
href: tab.href,
|
|
118
|
+
asChild: true,
|
|
119
|
+
children: /*#__PURE__*/_jsx(MagicTabItem, {
|
|
120
|
+
name: tab.name,
|
|
121
|
+
icon: tab.icon,
|
|
122
|
+
label: tab.label,
|
|
123
|
+
labelMode: labelMode,
|
|
124
|
+
labelPosition: labelPosition,
|
|
125
|
+
badge: tab.badge,
|
|
126
|
+
disabled: tab.disabled,
|
|
127
|
+
variant: tab.variant,
|
|
128
|
+
isLight: effectiveLight,
|
|
129
|
+
haptics: haptics,
|
|
130
|
+
onTabPress: onTabPress,
|
|
131
|
+
onTabLongPress: onTabLongPress,
|
|
132
|
+
theme: theme
|
|
133
|
+
})
|
|
134
|
+
}, tab.name);
|
|
135
|
+
})
|
|
56
136
|
})
|
|
57
137
|
})]
|
|
58
138
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Tabs","TabList","TabSlot","TabTrigger","
|
|
1
|
+
{"version":3,"names":["useMemo","Tabs","TabList","TabSlot","TabTrigger","usePathname","MagicTabBar","MagicTabItem","defaultTheme","jsx","_jsx","jsxs","_jsxs","hrefToPath","href","pathname","findActiveTab","tabs","best","bestLen","tab","path","matches","startsWith","length","resolveLabelMode","showLabels","labelPosition","mode","__DEV__","console","warn","MagicTabs","theme","themeOverride","isLight","lightBottomMargin","variant","isTransparent","transparency","glass","renderBackground","haptics","onTabPress","onTabLongPress","barLabelMode","activeTab","effectiveLight","children","asChild","map","labelMode","showLabel","undefined","name","icon","label","badge","disabled"],"sourceRoot":"../../src","sources":["MagicTabs.tsx"],"mappings":";;AAAA,SAASA,OAAO,QAAwB,OAAO;AAC/C,SAASC,IAAI,EAAEC,OAAO,EAAEC,OAAO,EAAEC,UAAU,QAAQ,gBAAgB;AACnE,SAASC,WAAW,QAAQ,aAAa;AACzC,SAASC,WAAW,QAAQ,kBAAe;AAC3C,SAASC,YAAY,QAAQ,mBAAgB;AAC7C,SAASC,YAAY,QAAQ,YAAS;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAavC;AACA,SAASC,UAAUA,CAACC,IAAU,EAAU;EACtC,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE,OAAOA,IAAI;EACzC,MAAMC,QAAQ,GAAID,IAAI,EAA4BC,QAAQ;EAC1D,OAAO,OAAOA,QAAQ,KAAK,QAAQ,GAAGA,QAAQ,GAAG,EAAE;AACrD;;AAEA;AACA;AACA;AACA;AACA,SAASC,aAAaA,CACpBC,IAAsB,EACtBF,QAAgB,EACY;EAC5B,IAAIG,IAAgC;EACpC,IAAIC,OAAO,GAAG,CAAC,CAAC;EAChB,KAAK,MAAMC,GAAG,IAAIH,IAAI,EAAE;IACtB,MAAMI,IAAI,GAAGR,UAAU,CAACO,GAAG,CAACN,IAAI,CAAC;IACjC,IAAI,CAACO,IAAI,EAAE;IACX,MAAMC,OAAO,GACXD,IAAI,KAAK,GAAG,GACRN,QAAQ,KAAK,GAAG,GAChBA,QAAQ,KAAKM,IAAI,IAAIN,QAAQ,CAACQ,UAAU,CAAC,GAAGF,IAAI,GAAG,CAAC;IAC1D,IAAIC,OAAO,IAAID,IAAI,CAACG,MAAM,GAAGL,OAAO,EAAE;MACpCD,IAAI,GAAGE,GAAG;MACVD,OAAO,GAAGE,IAAI,CAACG,MAAM;IACvB;EACF;EACA,OAAON,IAAI;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASO,gBAAgBA,CACvBC,UAAoC,EACpCC,aAAiC,EACjB;EAChB,MAAMC,IAAoB,GACxBF,UAAU,KAAK,IAAI,GAAG,QAAQ,GAAGA,UAAU,KAAK,KAAK,GAAG,OAAO,GAAGA,UAAU;EAE9E,IAAIE,IAAI,KAAK,QAAQ,IAAID,aAAa,KAAK,QAAQ,EAAE;IACnD,IAAIE,OAAO,EAAE;MACXC,OAAO,CAACC,IAAI,CACV,mEAAmE,GACjE,mFACJ,CAAC;IACH;IACA,OAAO,QAAQ;EACjB;EACA,OAAOH,IAAI;AACb;AAuEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,SAASA,CAAC;EACxBf,IAAI;EACJgB,KAAK,EAAEC,aAAa;EACpBR,UAAU,GAAG,IAAI;EACjBC,aAAa,GAAG,OAAO;EACvBQ,OAAO,GAAG,KAAK;EACfC,iBAAiB;EACjBC,OAAO;EACPC,aAAa;EACbC,YAAY;EACZC,KAAK;EACLC,gBAAgB;EAChBC,OAAO;EACPC,UAAU;EACVC;AACc,CAAC,EAAE;EACjB;EACA,MAAMX,KAAK,GAAGjC,OAAO,CACnB,OAAO;IAAE,GAAGQ,YAAY;IAAE,GAAG0B;EAAc,CAAC,CAAC,EAC7C,CAACA,aAAa,CAChB,CAAC;EACD,MAAMW,YAAY,GAAGpB,gBAAgB,CAACC,UAAU,EAAEC,aAAa,CAAC;;EAEhE;EACA;EACA;EACA,MAAMZ,QAAQ,GAAGV,WAAW,CAAC,CAAC;EAC9B,MAAMyC,SAAS,GAAG9B,aAAa,CAACC,IAAI,EAAEF,QAAQ,CAAC;EAC/C,MAAMgC,cAAc,GAAGZ,OAAO,IAAI,CAAC,CAACW,SAAS,EAAEX,OAAO;EAEtD,oBACEvB,KAAA,CAACX,IAAI;IAAA+C,QAAA,gBACHtC,IAAA,CAACP,OAAO,IAAE,CAAC,eACXO,IAAA,CAACR,OAAO;MAAC+C,OAAO;MAAAD,QAAA,eACdtC,IAAA,CAACJ,WAAW;QACV2B,KAAK,EAAEA,KAAM;QACbI,OAAO,EAAEA,OAAQ;QACjBV,aAAa,EAAEA,aAAc;QAC7BQ,OAAO,EAAEY,cAAe;QACxBX,iBAAiB,EAAEA,iBAAkB;QACrCE,aAAa,EAAEA,aAAc;QAC7BC,YAAY,EAAEA,YAAa;QAC3BC,KAAK,EAAEA,KAAM;QACbC,gBAAgB,EAAEA,gBAAiB;QAAAO,QAAA,EAElC/B,IAAI,CAACiC,GAAG,CAAE9B,GAAG,IAAK;UACjB;UACA;UACA;UACA,MAAM+B,SAAyB,GAC7B/B,GAAG,CAACgC,SAAS,KAAKC,SAAS,GACvBR,YAAY,GACZzB,GAAG,CAACgC,SAAS,GACXP,YAAY,KAAK,OAAO,GACtB,QAAQ,GACRA,YAAY,GACd,OAAO;UACf,oBACEnC,IAAA,CAACN,UAAU;YAAgBkD,IAAI,EAAElC,GAAG,CAACkC,IAAK;YAACxC,IAAI,EAAEM,GAAG,CAACN,IAAK;YAACmC,OAAO;YAAAD,QAAA,eAChEtC,IAAA,CAACH,YAAY;cACX+C,IAAI,EAAElC,GAAG,CAACkC,IAAK;cACfC,IAAI,EAAEnC,GAAG,CAACmC,IAAK;cACfC,KAAK,EAAEpC,GAAG,CAACoC,KAAM;cACjBL,SAAS,EAAEA,SAAU;cACrBxB,aAAa,EAAEA,aAAc;cAC7B8B,KAAK,EAAErC,GAAG,CAACqC,KAAM;cACjBC,QAAQ,EAAEtC,GAAG,CAACsC,QAAS;cACvBrB,OAAO,EAAEjB,GAAG,CAACiB,OAAQ;cACrBF,OAAO,EAAEY,cAAe;cACxBL,OAAO,EAAEA,OAAQ;cACjBC,UAAU,EAAEA,UAAW;cACvBC,cAAc,EAAEA,cAAe;cAC/BX,KAAK,EAAEA;YAAM,CACd;UAAC,GAfab,GAAG,CAACkC,IAgBT,CAAC;QAEjB,CAAC;MAAC,CACS;IAAC,CACP,CAAC;EAAA,CACN,CAAC;AAEX","ignoreList":[]}
|
|
@@ -17,11 +17,12 @@ const ionicon = (active, inactive) => ({
|
|
|
17
17
|
});
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
20
|
+
* A ready-made demo tab set — Home, Explore, Notifications, Inbox and Profile,
|
|
21
|
+
* each with a matching Ionicon. Opt in via the subpath:
|
|
22
|
+
* `import { defaultTabs } from 'react-native-magic-tab-bar/default-tabs'`.
|
|
22
23
|
*
|
|
23
|
-
*
|
|
24
|
-
* `inbox` and `profile`.
|
|
24
|
+
* Requires `@expo/vector-icons` and assumes the app has routes named `index`
|
|
25
|
+
* (`/`), `explore`, `notifications`, `inbox` and `profile`.
|
|
25
26
|
*/
|
|
26
27
|
export const defaultTabs = [{
|
|
27
28
|
name: "index",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Ionicons","jsx","_jsx","ionicon","active","inactive","focused","color","size","name","defaultTabs","href","label","icon"],"sourceRoot":"../../src","sources":["defaultTabs.tsx"],"mappings":";;AAAA,SAASA,QAAQ,QAAQ,oBAAoB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAM9C;AACA;AACA;AACA;AACA,MAAMC,OAAO,GACXA,CAACC,MAAmB,EAAEC,QAAqB,KAC3C,CAAC;EAAEC,OAAO;EAAEC,KAAK;EAAEC;AAAwB,CAAC,kBAC1CN,IAAA,CAACF,QAAQ;EAACS,IAAI,EAAEH,OAAO,GAAGF,MAAM,GAAGC,QAAS;EAACE,KAAK,EAAEA,KAAM;EAACC,IAAI,EAAEA;AAAK,CAAE,CACzE;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAME,WAA6B,GAAG,CAC3C;EACED,IAAI,EAAE,OAAO;EACbE,IAAI,EAAE,GAAG;EACTC,KAAK,EAAE,MAAM;EACbC,IAAI,EAAEV,OAAO,CAAC,MAAM,EAAE,cAAc;AACtC,CAAC,EACD;EACEM,IAAI,EAAE,SAAS;EACfE,IAAI,EAAE,UAAU;EAChBC,KAAK,EAAE,SAAS;EAChBC,IAAI,EAAEV,OAAO,CAAC,SAAS,EAAE,iBAAiB;AAC5C,CAAC,EACD;EACEM,IAAI,EAAE,eAAe;EACrBE,IAAI,EAAE,gBAAgB;EACtBC,KAAK,EAAE,eAAe;EACtBC,IAAI,EAAEV,OAAO,CAAC,eAAe,EAAE,uBAAuB;AACxD,CAAC,EACD;EACEM,IAAI,EAAE,OAAO;EACbE,IAAI,EAAE,QAAQ;EACdC,KAAK,EAAE,OAAO;EACdC,IAAI,EAAEV,OAAO,CAAC,kBAAkB,EAAE,oBAAoB;AACxD,CAAC,EACD;EACEM,IAAI,EAAE,SAAS;EACfE,IAAI,EAAE,UAAU;EAChBC,KAAK,EAAE,SAAS;EAChBC,IAAI,EAAEV,OAAO,CAAC,QAAQ,EAAE,gBAAgB;AAC1C,CAAC,CACF","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Ionicons","jsx","_jsx","ionicon","active","inactive","focused","color","size","name","defaultTabs","href","label","icon"],"sourceRoot":"../../src","sources":["defaultTabs.tsx"],"mappings":";;AAAA,SAASA,QAAQ,QAAQ,oBAAoB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAM9C;AACA;AACA;AACA;AACA,MAAMC,OAAO,GACXA,CAACC,MAAmB,EAAEC,QAAqB,KAC3C,CAAC;EAAEC,OAAO;EAAEC,KAAK;EAAEC;AAAwB,CAAC,kBAC1CN,IAAA,CAACF,QAAQ;EAACS,IAAI,EAAEH,OAAO,GAAGF,MAAM,GAAGC,QAAS;EAACE,KAAK,EAAEA,KAAM;EAACC,IAAI,EAAEA;AAAK,CAAE,CACzE;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAME,WAA6B,GAAG,CAC3C;EACED,IAAI,EAAE,OAAO;EACbE,IAAI,EAAE,GAAG;EACTC,KAAK,EAAE,MAAM;EACbC,IAAI,EAAEV,OAAO,CAAC,MAAM,EAAE,cAAc;AACtC,CAAC,EACD;EACEM,IAAI,EAAE,SAAS;EACfE,IAAI,EAAE,UAAU;EAChBC,KAAK,EAAE,SAAS;EAChBC,IAAI,EAAEV,OAAO,CAAC,SAAS,EAAE,iBAAiB;AAC5C,CAAC,EACD;EACEM,IAAI,EAAE,eAAe;EACrBE,IAAI,EAAE,gBAAgB;EACtBC,KAAK,EAAE,eAAe;EACtBC,IAAI,EAAEV,OAAO,CAAC,eAAe,EAAE,uBAAuB;AACxD,CAAC,EACD;EACEM,IAAI,EAAE,OAAO;EACbE,IAAI,EAAE,QAAQ;EACdC,KAAK,EAAE,OAAO;EACdC,IAAI,EAAEV,OAAO,CAAC,kBAAkB,EAAE,oBAAoB;AACxD,CAAC,EACD;EACEM,IAAI,EAAE,SAAS;EACfE,IAAI,EAAE,UAAU;EAChBC,KAAK,EAAE,SAAS;EAChBC,IAAI,EAAEV,OAAO,CAAC,QAAQ,EAAE,gBAAgB;AAC1C,CAAC,CACF","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
export { MagicTabs } from "./MagicTabs.js";
|
|
4
4
|
export { MagicTabBar } from "./MagicTabBar.js";
|
|
5
5
|
export { MagicTabItem } from "./MagicTabItem.js";
|
|
6
|
-
export { defaultTabs } from "./defaultTabs.js";
|
|
7
6
|
export { defaultTheme } from "./theme.js";
|
|
7
|
+
|
|
8
|
+
// `defaultTabs` is intentionally NOT re-exported here — it depends on an icon
|
|
9
|
+
// library, and keeping it out of the main entry means the core stays
|
|
10
|
+
// zero-runtime-dependency. Import it from the subpath for the demo set:
|
|
11
|
+
//
|
|
12
|
+
// import { defaultTabs } from 'react-native-magic-tab-bar/default-tabs';
|
|
8
13
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MagicTabs","MagicTabBar","MagicTabItem","
|
|
1
|
+
{"version":3,"names":["MagicTabs","MagicTabBar","MagicTabItem","defaultTheme"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,SAAS,QAAQ,gBAAa;AACvC,SAASC,WAAW,QAAQ,kBAAe;AAC3C,SAASC,YAAY,QAAQ,mBAAgB;AAC7C,SAASC,YAAY,QAAQ,YAAS;;AAEtC;AACA;AACA;AACA;AACA","ignoreList":[]}
|
package/lib/module/theme.js
CHANGED
|
@@ -10,7 +10,16 @@ export const defaultTheme = {
|
|
|
10
10
|
fontSize: 12,
|
|
11
11
|
height: 56,
|
|
12
12
|
radius: 28,
|
|
13
|
+
badgeColor: '#FF3B30',
|
|
14
|
+
badgeTextColor: '#FFFFFF',
|
|
15
|
+
actionColor: '#0A84FF',
|
|
16
|
+
actionIconColor: '#FFFFFF',
|
|
13
17
|
horizontalMargin: 14,
|
|
14
|
-
bottomInset: 10
|
|
18
|
+
bottomInset: 10,
|
|
19
|
+
spring: {
|
|
20
|
+
mass: 0.6,
|
|
21
|
+
damping: 18,
|
|
22
|
+
stiffness: 180
|
|
23
|
+
}
|
|
15
24
|
};
|
|
16
25
|
//# sourceMappingURL=theme.js.map
|
package/lib/module/theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["defaultTheme","barColor","activePillColor","activeColor","inactiveColor","iconSize","fontSize","height","radius","horizontalMargin","bottomInset"],"sourceRoot":"../../src","sources":["theme.ts"],"mappings":";;AAEA;AACA,OAAO,MAAMA,YAA8B,GAAG;EAC5CC,QAAQ,EAAE,wBAAwB;EAClCC,eAAe,EAAE,2BAA2B;EAC5CC,WAAW,EAAE,SAAS;EACtBC,aAAa,EAAE,SAAS;EACxBC,QAAQ,EAAE,EAAE;EACZC,QAAQ,EAAE,EAAE;EACZC,MAAM,EAAE,EAAE;EACVC,MAAM,EAAE,EAAE;EACVC,gBAAgB,EAAE,EAAE;EACpBC,WAAW,EAAE;
|
|
1
|
+
{"version":3,"names":["defaultTheme","barColor","activePillColor","activeColor","inactiveColor","iconSize","fontSize","height","radius","badgeColor","badgeTextColor","actionColor","actionIconColor","horizontalMargin","bottomInset","spring","mass","damping","stiffness"],"sourceRoot":"../../src","sources":["theme.ts"],"mappings":";;AAEA;AACA,OAAO,MAAMA,YAA8B,GAAG;EAC5CC,QAAQ,EAAE,wBAAwB;EAClCC,eAAe,EAAE,2BAA2B;EAC5CC,WAAW,EAAE,SAAS;EACtBC,aAAa,EAAE,SAAS;EACxBC,QAAQ,EAAE,EAAE;EACZC,QAAQ,EAAE,EAAE;EACZC,MAAM,EAAE,EAAE;EACVC,MAAM,EAAE,EAAE;EACVC,UAAU,EAAE,SAAS;EACrBC,cAAc,EAAE,SAAS;EACzBC,WAAW,EAAE,SAAS;EACtBC,eAAe,EAAE,SAAS;EAC1BC,gBAAgB,EAAE,EAAE;EACpBC,WAAW,EAAE,EAAE;EACfC,MAAM,EAAE;IAAEC,IAAI,EAAE,GAAG;IAAEC,OAAO,EAAE,EAAE;IAAEC,SAAS,EAAE;EAAI;AACnD,CAAC","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
2
|
import { View, type ViewProps } from "react-native";
|
|
3
|
-
import type { MagicTabBarTheme, MagicTabBarVariant } from "./types";
|
|
3
|
+
import type { MagicLabelPosition, MagicTabBarTheme, MagicTabBarVariant } from "./types";
|
|
4
4
|
/** Lowest bar opacity we allow, so a transparent bar never becomes invisible. */
|
|
5
5
|
export declare const MIN_BAR_OPACITY = 0.1;
|
|
6
6
|
export interface MagicTabBarProps extends ViewProps {
|
|
@@ -8,6 +8,12 @@ export interface MagicTabBarProps extends ViewProps {
|
|
|
8
8
|
theme: MagicTabBarTheme;
|
|
9
9
|
/** Position the bar floating over content (default) or docked in-flow. */
|
|
10
10
|
variant?: MagicTabBarVariant;
|
|
11
|
+
/**
|
|
12
|
+
* Where the tab labels sit. `'bottom'` gives the bar extra height so the
|
|
13
|
+
* stacked icon+label has room to breathe. Provided automatically by
|
|
14
|
+
* `MagicTabs`.
|
|
15
|
+
*/
|
|
16
|
+
labelPosition?: MagicLabelPosition;
|
|
11
17
|
/**
|
|
12
18
|
* Make the bar background see-through. Off by default — the bar is fully
|
|
13
19
|
* opaque. Set the strength of the effect with `transparency`.
|
|
@@ -27,6 +33,17 @@ export interface MagicTabBarProps extends ViewProps {
|
|
|
27
33
|
glass?: boolean;
|
|
28
34
|
/** Render a custom background (e.g. a blur/glass view) behind the bar. */
|
|
29
35
|
renderBackground?: () => ReactNode;
|
|
36
|
+
/**
|
|
37
|
+
* Compact "light" mode: a shorter, icon-only bar with extra bottom margin.
|
|
38
|
+
* Provided automatically by `MagicTabs`.
|
|
39
|
+
*/
|
|
40
|
+
isLight?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Extra bottom margin below the bar in "light" mode only. Added on top of the
|
|
43
|
+
* safe-area inset and `theme.bottomInset`. Ignored when `isLight` is false.
|
|
44
|
+
* Defaults to {@link LIGHT_EXTRA_BOTTOM_MARGIN}.
|
|
45
|
+
*/
|
|
46
|
+
lightBottomMargin?: number;
|
|
30
47
|
/** The tab items. Provided automatically by `MagicTabs`. */
|
|
31
48
|
children?: ReactNode;
|
|
32
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MagicTabBar.d.ts","sourceRoot":"","sources":["../../src/MagicTabBar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAEL,IAAI,EAEJ,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"MagicTabBar.d.ts","sourceRoot":"","sources":["../../src/MagicTabBar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAEL,IAAI,EAEJ,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAGtB,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAqCjB,iFAAiF;AACjF,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,6DAA6D;IAC7D,KAAK,EAAE,gBAAgB,CAAC;IACxB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,SAAS,CAAC;IACnC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,mGA4GvB,CAAC"}
|