@oxyhq/bloom 0.35.1 → 0.35.3
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/lib/commonjs/avatar-group/cluster-layout.js +43 -6
- package/lib/commonjs/avatar-group/cluster-layout.js.map +1 -1
- package/lib/commonjs/tabs/Tabs.js +20 -8
- package/lib/commonjs/tabs/Tabs.js.map +1 -1
- package/lib/module/avatar-group/cluster-layout.js +43 -6
- package/lib/module/avatar-group/cluster-layout.js.map +1 -1
- package/lib/module/tabs/Tabs.js +20 -8
- package/lib/module/tabs/Tabs.js.map +1 -1
- package/lib/typescript/commonjs/avatar-group/cluster-layout.d.ts +8 -4
- package/lib/typescript/commonjs/avatar-group/cluster-layout.d.ts.map +1 -1
- package/lib/typescript/commonjs/tabs/Tabs.d.ts.map +1 -1
- package/lib/typescript/commonjs/tabs/types.d.ts +7 -0
- package/lib/typescript/commonjs/tabs/types.d.ts.map +1 -1
- package/lib/typescript/module/avatar-group/cluster-layout.d.ts +8 -4
- package/lib/typescript/module/avatar-group/cluster-layout.d.ts.map +1 -1
- package/lib/typescript/module/tabs/Tabs.d.ts.map +1 -1
- package/lib/typescript/module/tabs/types.d.ts +7 -0
- package/lib/typescript/module/tabs/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/AvatarGroupCluster.test.tsx +59 -3
- package/src/avatar-group/cluster-layout.ts +32 -6
- package/src/tabs/Tabs.tsx +29 -13
- package/src/tabs/types.ts +7 -0
|
@@ -18,9 +18,10 @@ exports.computeClusterLayout = computeClusterLayout;
|
|
|
18
18
|
* centre and (b) push any two circles apart until they clear a uniform gap. A
|
|
19
19
|
* fixed iteration count + deterministic seed means the same `count` always
|
|
20
20
|
* yields byte-identical positions, so native and web render the cluster
|
|
21
|
-
* identically with no `onLayout`/DOM measurement. The
|
|
22
|
-
*
|
|
23
|
-
*
|
|
21
|
+
* identically with no `onLayout`/DOM measurement. The small counts (1, 2, 3, 4)
|
|
22
|
+
* use explicit iMessage-style arrangements instead — 1–3 because a relaxation
|
|
23
|
+
* there degenerates into a line or a lone pair, and 4 because the iconic
|
|
24
|
+
* 4-person layout is a clean 2×2 grid of equal circles rather than a pack.
|
|
24
25
|
*
|
|
25
26
|
* Output is resolution-independent: each bubble is expressed as a fraction of
|
|
26
27
|
* the group's bounding box (`cx`/`cy` centre, `d` diameter, all 0..1), so the
|
|
@@ -112,8 +113,8 @@ function separate(xs, ys, radii, count) {
|
|
|
112
113
|
|
|
113
114
|
/**
|
|
114
115
|
* Deterministic force-directed pack of `count` circles (primary pinned at the
|
|
115
|
-
* centre), returned as box-fraction bubbles. Used for every cluster with
|
|
116
|
-
* members; 1–
|
|
116
|
+
* centre), returned as box-fraction bubbles. Used for every cluster with 5+
|
|
117
|
+
* members; 1–4 are handled as explicit arrangements in
|
|
117
118
|
* {@link computeClusterLayout}.
|
|
118
119
|
*/
|
|
119
120
|
function packCluster(count) {
|
|
@@ -205,7 +206,10 @@ function packCluster(count) {
|
|
|
205
206
|
* secondary; the overlap + separator ring alone convey the stacking.
|
|
206
207
|
* - `3` → an iMessage-style triangle: the larger primary along the bottom with
|
|
207
208
|
* two smaller members above it.
|
|
208
|
-
* - `4
|
|
209
|
+
* - `4` → the iMessage 4-person layout: a 2×2 grid of EQUAL-diameter bubbles,
|
|
210
|
+
* centred in the box with a uniform gap, sized so the outermost edges reach the
|
|
211
|
+
* box edge like the other counts.
|
|
212
|
+
* - `5+` → the deterministic force-directed pack of near-equal bubbles, recentred
|
|
209
213
|
* and scaled to fill the round box edge-to-edge (a modestly larger primary near
|
|
210
214
|
* the centre, the rest packed magnetically around it, denser as the count
|
|
211
215
|
* grows).
|
|
@@ -247,6 +251,39 @@ function computeClusterLayout(count) {
|
|
|
247
251
|
d: 0.4
|
|
248
252
|
}];
|
|
249
253
|
}
|
|
254
|
+
if (count === 4) {
|
|
255
|
+
// The iMessage 4-person layout: a 2×2 grid of EQUAL-diameter bubbles,
|
|
256
|
+
// centred in the box with the same uniform neighbour gap the rest of the
|
|
257
|
+
// cluster keeps (LAYOUT_GAP, in circle-radius units), sized so the outermost
|
|
258
|
+
// bubble edge reaches the box radius (0.5 from the centre) — exactly as the
|
|
259
|
+
// force-packed counts do — so the four circles fill the round box
|
|
260
|
+
// edge-to-edge with a clean uniform gap and no overlap.
|
|
261
|
+
//
|
|
262
|
+
// With diameter `d` and radius `r = d/2`, the neighbour gap `g = LAYOUT_GAP·r`,
|
|
263
|
+
// so the centre-to-centre spacing is `s = d + g = d·(1 + LAYOUT_GAP/2)`. Each
|
|
264
|
+
// centre sits `(s/2, s/2)` from the box centre, so its farthest point lies
|
|
265
|
+
// `(s/2)·√2 + r` away; setting that to `0.5` and solving for `d`:
|
|
266
|
+
const spacingFactor = 1 + LAYOUT_GAP / 2;
|
|
267
|
+
const d = 0.5 / (spacingFactor * Math.SQRT2 / 2 + 0.5);
|
|
268
|
+
const half = d * spacingFactor / 2;
|
|
269
|
+
return [{
|
|
270
|
+
cx: 0.5 - half,
|
|
271
|
+
cy: 0.5 - half,
|
|
272
|
+
d
|
|
273
|
+
}, {
|
|
274
|
+
cx: 0.5 + half,
|
|
275
|
+
cy: 0.5 - half,
|
|
276
|
+
d
|
|
277
|
+
}, {
|
|
278
|
+
cx: 0.5 - half,
|
|
279
|
+
cy: 0.5 + half,
|
|
280
|
+
d
|
|
281
|
+
}, {
|
|
282
|
+
cx: 0.5 + half,
|
|
283
|
+
cy: 0.5 + half,
|
|
284
|
+
d
|
|
285
|
+
}];
|
|
286
|
+
}
|
|
250
287
|
return packCluster(count);
|
|
251
288
|
}
|
|
252
289
|
//# sourceMappingURL=cluster-layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["GOLDEN_ANGLE","Math","PI","sqrt","ITERATIONS","CLEANUP_ITERATIONS","CENTERING","SEPARATION_STRENGTH","LAYOUT_GAP","SEED_SPACING","PRIMARY_RADIUS","SECONDARY_MAX","SECONDARY_MIN","EPSILON","relativeRadius","index","count","t","separate","xs","ys","radii","i","j","dx","dy","dist","hypot","minDist","a","cos","sin","overlap","nx","ny","packCluster","Array","seedR","angle","iter","minX","Infinity","maxX","minY","maxY","x","y","r","centerX","centerY","bound","reach","scale","bubbles","cx","cy","d","computeClusterLayout"],"sourceRoot":"../../../src","sources":["avatar-group/cluster-layout.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["GOLDEN_ANGLE","Math","PI","sqrt","ITERATIONS","CLEANUP_ITERATIONS","CENTERING","SEPARATION_STRENGTH","LAYOUT_GAP","SEED_SPACING","PRIMARY_RADIUS","SECONDARY_MAX","SECONDARY_MIN","EPSILON","relativeRadius","index","count","t","separate","xs","ys","radii","i","j","dx","dy","dist","hypot","minDist","a","cos","sin","overlap","nx","ny","packCluster","Array","seedR","angle","iter","minX","Infinity","maxX","minY","maxY","x","y","r","centerX","centerY","bound","reach","scale","bubbles","cx","cy","d","computeClusterLayout","spacingFactor","SQRT2","half"],"sourceRoot":"../../../src","sources":["avatar-group/cluster-layout.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,12 +14,14 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
|
|
|
14
14
|
const TabsContext = /*#__PURE__*/(0, _react.createContext)({
|
|
15
15
|
value: '',
|
|
16
16
|
onValueChange: () => {},
|
|
17
|
-
variant: 'underline'
|
|
17
|
+
variant: 'underline',
|
|
18
|
+
fullWidth: false
|
|
18
19
|
});
|
|
19
20
|
const TabsBarComponent = ({
|
|
20
21
|
value,
|
|
21
22
|
onValueChange,
|
|
22
23
|
variant = 'underline',
|
|
24
|
+
fullWidth = false,
|
|
23
25
|
children,
|
|
24
26
|
style,
|
|
25
27
|
testID
|
|
@@ -28,8 +30,9 @@ const TabsBarComponent = ({
|
|
|
28
30
|
const contextValue = (0, _react.useMemo)(() => ({
|
|
29
31
|
value,
|
|
30
32
|
onValueChange,
|
|
31
|
-
variant
|
|
32
|
-
|
|
33
|
+
variant,
|
|
34
|
+
fullWidth
|
|
35
|
+
}), [value, onValueChange, variant, fullWidth]);
|
|
33
36
|
const containerStyle = (0, _react.useMemo)(() => {
|
|
34
37
|
const base = {
|
|
35
38
|
flexDirection: 'row',
|
|
@@ -56,7 +59,11 @@ const TabsBarComponent = ({
|
|
|
56
59
|
}, [variant, theme]);
|
|
57
60
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(TabsContext.Provider, {
|
|
58
61
|
value: contextValue,
|
|
59
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.
|
|
62
|
+
children: fullWidth ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
63
|
+
style: [containerStyle, style],
|
|
64
|
+
testID: testID,
|
|
65
|
+
children: children
|
|
66
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
|
|
60
67
|
horizontal: true,
|
|
61
68
|
showsHorizontalScrollIndicator: false,
|
|
62
69
|
contentContainerStyle: [containerStyle, style],
|
|
@@ -77,7 +84,8 @@ const TabComponent = ({
|
|
|
77
84
|
const {
|
|
78
85
|
value: selectedValue,
|
|
79
86
|
onValueChange,
|
|
80
|
-
variant
|
|
87
|
+
variant,
|
|
88
|
+
fullWidth
|
|
81
89
|
} = (0, _react.useContext)(TabsContext);
|
|
82
90
|
const isSelected = value === selectedValue;
|
|
83
91
|
const {
|
|
@@ -145,13 +153,17 @@ const TabComponent = ({
|
|
|
145
153
|
return base;
|
|
146
154
|
}, [variant, isSelected, theme]);
|
|
147
155
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Animated.View, {
|
|
148
|
-
style: {
|
|
156
|
+
style: [{
|
|
149
157
|
transform: [{
|
|
150
158
|
scale: scaleAnim
|
|
151
159
|
}]
|
|
152
|
-
},
|
|
160
|
+
}, fullWidth && {
|
|
161
|
+
flex: 1
|
|
162
|
+
}],
|
|
153
163
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Pressable, {
|
|
154
|
-
style: [tabStyle,
|
|
164
|
+
style: [tabStyle, fullWidth && {
|
|
165
|
+
flex: 1
|
|
166
|
+
}, disabled && {
|
|
155
167
|
opacity: 0.4
|
|
156
168
|
}, style],
|
|
157
169
|
onPress: handlePress,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_useTheme","_usePressAnimation","_tokens","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","TabsContext","createContext","value","onValueChange","variant","TabsBarComponent","children","style","testID","theme","useTheme","contextValue","useMemo","containerStyle","base","flexDirection","alignItems","borderBottomWidth","borderBottomColor","colors","borderLight","backgroundColor","backgroundSecondary","borderRadius","sm","padding","borderWidth","borderColor","border","jsx","Provider","ScrollView","horizontal","showsHorizontalScrollIndicator","contentContainerStyle","TabComponent","label","icon","disabled","textStyle","selectedValue","useContext","isSelected","scaleAnim","onPressIn","onPressOut","usePressAnimation","handlePress","useCallback","tabStyle","justifyContent","paddingHorizontal","space","lg","paddingVertical","gap","xs","primary","marginBottom","card","shadowColor","shadow","shadowOffset","width","height","shadowOpacity","shadowRadius","elevation","labelStyle","fontSize","fontWeight","color","primaryForeground","textSecondary","Animated","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_useTheme","_usePressAnimation","_tokens","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","TabsContext","createContext","value","onValueChange","variant","fullWidth","TabsBarComponent","children","style","testID","theme","useTheme","contextValue","useMemo","containerStyle","base","flexDirection","alignItems","borderBottomWidth","borderBottomColor","colors","borderLight","backgroundColor","backgroundSecondary","borderRadius","sm","padding","borderWidth","borderColor","border","jsx","Provider","View","ScrollView","horizontal","showsHorizontalScrollIndicator","contentContainerStyle","TabComponent","label","icon","disabled","textStyle","selectedValue","useContext","isSelected","scaleAnim","onPressIn","onPressOut","usePressAnimation","handlePress","useCallback","tabStyle","justifyContent","paddingHorizontal","space","lg","paddingVertical","gap","xs","primary","marginBottom","card","shadowColor","shadow","shadowOffset","width","height","shadowOpacity","shadowRadius","elevation","labelStyle","fontSize","fontWeight","color","primaryForeground","textSecondary","Animated","transform","scale","flex","jsxs","Pressable","opacity","onPress","accessibilityRole","accessibilityState","selected","Text","TabPanelComponent","Tabs","exports","memo","displayName","TabsTrigger","TabsContent"],"sourceRoot":"../../../src","sources":["tabs/Tabs.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,9 +14,10 @@
|
|
|
14
14
|
* centre and (b) push any two circles apart until they clear a uniform gap. A
|
|
15
15
|
* fixed iteration count + deterministic seed means the same `count` always
|
|
16
16
|
* yields byte-identical positions, so native and web render the cluster
|
|
17
|
-
* identically with no `onLayout`/DOM measurement. The
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* identically with no `onLayout`/DOM measurement. The small counts (1, 2, 3, 4)
|
|
18
|
+
* use explicit iMessage-style arrangements instead — 1–3 because a relaxation
|
|
19
|
+
* there degenerates into a line or a lone pair, and 4 because the iconic
|
|
20
|
+
* 4-person layout is a clean 2×2 grid of equal circles rather than a pack.
|
|
20
21
|
*
|
|
21
22
|
* Output is resolution-independent: each bubble is expressed as a fraction of
|
|
22
23
|
* the group's bounding box (`cx`/`cy` centre, `d` diameter, all 0..1), so the
|
|
@@ -108,8 +109,8 @@ function separate(xs, ys, radii, count) {
|
|
|
108
109
|
|
|
109
110
|
/**
|
|
110
111
|
* Deterministic force-directed pack of `count` circles (primary pinned at the
|
|
111
|
-
* centre), returned as box-fraction bubbles. Used for every cluster with
|
|
112
|
-
* members; 1–
|
|
112
|
+
* centre), returned as box-fraction bubbles. Used for every cluster with 5+
|
|
113
|
+
* members; 1–4 are handled as explicit arrangements in
|
|
113
114
|
* {@link computeClusterLayout}.
|
|
114
115
|
*/
|
|
115
116
|
function packCluster(count) {
|
|
@@ -201,7 +202,10 @@ function packCluster(count) {
|
|
|
201
202
|
* secondary; the overlap + separator ring alone convey the stacking.
|
|
202
203
|
* - `3` → an iMessage-style triangle: the larger primary along the bottom with
|
|
203
204
|
* two smaller members above it.
|
|
204
|
-
* - `4
|
|
205
|
+
* - `4` → the iMessage 4-person layout: a 2×2 grid of EQUAL-diameter bubbles,
|
|
206
|
+
* centred in the box with a uniform gap, sized so the outermost edges reach the
|
|
207
|
+
* box edge like the other counts.
|
|
208
|
+
* - `5+` → the deterministic force-directed pack of near-equal bubbles, recentred
|
|
205
209
|
* and scaled to fill the round box edge-to-edge (a modestly larger primary near
|
|
206
210
|
* the centre, the rest packed magnetically around it, denser as the count
|
|
207
211
|
* grows).
|
|
@@ -243,6 +247,39 @@ export function computeClusterLayout(count) {
|
|
|
243
247
|
d: 0.4
|
|
244
248
|
}];
|
|
245
249
|
}
|
|
250
|
+
if (count === 4) {
|
|
251
|
+
// The iMessage 4-person layout: a 2×2 grid of EQUAL-diameter bubbles,
|
|
252
|
+
// centred in the box with the same uniform neighbour gap the rest of the
|
|
253
|
+
// cluster keeps (LAYOUT_GAP, in circle-radius units), sized so the outermost
|
|
254
|
+
// bubble edge reaches the box radius (0.5 from the centre) — exactly as the
|
|
255
|
+
// force-packed counts do — so the four circles fill the round box
|
|
256
|
+
// edge-to-edge with a clean uniform gap and no overlap.
|
|
257
|
+
//
|
|
258
|
+
// With diameter `d` and radius `r = d/2`, the neighbour gap `g = LAYOUT_GAP·r`,
|
|
259
|
+
// so the centre-to-centre spacing is `s = d + g = d·(1 + LAYOUT_GAP/2)`. Each
|
|
260
|
+
// centre sits `(s/2, s/2)` from the box centre, so its farthest point lies
|
|
261
|
+
// `(s/2)·√2 + r` away; setting that to `0.5` and solving for `d`:
|
|
262
|
+
const spacingFactor = 1 + LAYOUT_GAP / 2;
|
|
263
|
+
const d = 0.5 / (spacingFactor * Math.SQRT2 / 2 + 0.5);
|
|
264
|
+
const half = d * spacingFactor / 2;
|
|
265
|
+
return [{
|
|
266
|
+
cx: 0.5 - half,
|
|
267
|
+
cy: 0.5 - half,
|
|
268
|
+
d
|
|
269
|
+
}, {
|
|
270
|
+
cx: 0.5 + half,
|
|
271
|
+
cy: 0.5 - half,
|
|
272
|
+
d
|
|
273
|
+
}, {
|
|
274
|
+
cx: 0.5 - half,
|
|
275
|
+
cy: 0.5 + half,
|
|
276
|
+
d
|
|
277
|
+
}, {
|
|
278
|
+
cx: 0.5 + half,
|
|
279
|
+
cy: 0.5 + half,
|
|
280
|
+
d
|
|
281
|
+
}];
|
|
282
|
+
}
|
|
246
283
|
return packCluster(count);
|
|
247
284
|
}
|
|
248
285
|
//# sourceMappingURL=cluster-layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["GOLDEN_ANGLE","Math","PI","sqrt","ITERATIONS","CLEANUP_ITERATIONS","CENTERING","SEPARATION_STRENGTH","LAYOUT_GAP","SEED_SPACING","PRIMARY_RADIUS","SECONDARY_MAX","SECONDARY_MIN","EPSILON","relativeRadius","index","count","t","separate","xs","ys","radii","i","j","dx","dy","dist","hypot","minDist","a","cos","sin","overlap","nx","ny","packCluster","Array","seedR","angle","iter","minX","Infinity","maxX","minY","maxY","x","y","r","centerX","centerY","bound","reach","scale","bubbles","cx","cy","d","computeClusterLayout"],"sourceRoot":"../../../src","sources":["avatar-group/cluster-layout.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["GOLDEN_ANGLE","Math","PI","sqrt","ITERATIONS","CLEANUP_ITERATIONS","CENTERING","SEPARATION_STRENGTH","LAYOUT_GAP","SEED_SPACING","PRIMARY_RADIUS","SECONDARY_MAX","SECONDARY_MIN","EPSILON","relativeRadius","index","count","t","separate","xs","ys","radii","i","j","dx","dy","dist","hypot","minDist","a","cos","sin","overlap","nx","ny","packCluster","Array","seedR","angle","iter","minX","Infinity","maxX","minY","maxY","x","y","r","centerX","centerY","bound","reach","scale","bubbles","cx","cy","d","computeClusterLayout","spacingFactor","SQRT2","half"],"sourceRoot":"../../../src","sources":["avatar-group/cluster-layout.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/tabs/Tabs.js
CHANGED
|
@@ -9,12 +9,14 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
9
9
|
const TabsContext = /*#__PURE__*/createContext({
|
|
10
10
|
value: '',
|
|
11
11
|
onValueChange: () => {},
|
|
12
|
-
variant: 'underline'
|
|
12
|
+
variant: 'underline',
|
|
13
|
+
fullWidth: false
|
|
13
14
|
});
|
|
14
15
|
const TabsBarComponent = ({
|
|
15
16
|
value,
|
|
16
17
|
onValueChange,
|
|
17
18
|
variant = 'underline',
|
|
19
|
+
fullWidth = false,
|
|
18
20
|
children,
|
|
19
21
|
style,
|
|
20
22
|
testID
|
|
@@ -23,8 +25,9 @@ const TabsBarComponent = ({
|
|
|
23
25
|
const contextValue = useMemo(() => ({
|
|
24
26
|
value,
|
|
25
27
|
onValueChange,
|
|
26
|
-
variant
|
|
27
|
-
|
|
28
|
+
variant,
|
|
29
|
+
fullWidth
|
|
30
|
+
}), [value, onValueChange, variant, fullWidth]);
|
|
28
31
|
const containerStyle = useMemo(() => {
|
|
29
32
|
const base = {
|
|
30
33
|
flexDirection: 'row',
|
|
@@ -51,7 +54,11 @@ const TabsBarComponent = ({
|
|
|
51
54
|
}, [variant, theme]);
|
|
52
55
|
return /*#__PURE__*/_jsx(TabsContext.Provider, {
|
|
53
56
|
value: contextValue,
|
|
54
|
-
children: /*#__PURE__*/_jsx(
|
|
57
|
+
children: fullWidth ? /*#__PURE__*/_jsx(View, {
|
|
58
|
+
style: [containerStyle, style],
|
|
59
|
+
testID: testID,
|
|
60
|
+
children: children
|
|
61
|
+
}) : /*#__PURE__*/_jsx(ScrollView, {
|
|
55
62
|
horizontal: true,
|
|
56
63
|
showsHorizontalScrollIndicator: false,
|
|
57
64
|
contentContainerStyle: [containerStyle, style],
|
|
@@ -72,7 +79,8 @@ const TabComponent = ({
|
|
|
72
79
|
const {
|
|
73
80
|
value: selectedValue,
|
|
74
81
|
onValueChange,
|
|
75
|
-
variant
|
|
82
|
+
variant,
|
|
83
|
+
fullWidth
|
|
76
84
|
} = useContext(TabsContext);
|
|
77
85
|
const isSelected = value === selectedValue;
|
|
78
86
|
const {
|
|
@@ -140,13 +148,17 @@ const TabComponent = ({
|
|
|
140
148
|
return base;
|
|
141
149
|
}, [variant, isSelected, theme]);
|
|
142
150
|
return /*#__PURE__*/_jsx(Animated.View, {
|
|
143
|
-
style: {
|
|
151
|
+
style: [{
|
|
144
152
|
transform: [{
|
|
145
153
|
scale: scaleAnim
|
|
146
154
|
}]
|
|
147
|
-
},
|
|
155
|
+
}, fullWidth && {
|
|
156
|
+
flex: 1
|
|
157
|
+
}],
|
|
148
158
|
children: /*#__PURE__*/_jsxs(Pressable, {
|
|
149
|
-
style: [tabStyle,
|
|
159
|
+
style: [tabStyle, fullWidth && {
|
|
160
|
+
flex: 1
|
|
161
|
+
}, disabled && {
|
|
150
162
|
opacity: 0.4
|
|
151
163
|
}, style],
|
|
152
164
|
onPress: handlePress,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","createContext","memo","useCallback","useContext","useMemo","View","Text","Pressable","Animated","ScrollView","useTheme","usePressAnimation","borderRadius","space","jsx","_jsx","jsxs","_jsxs","TabsContext","value","onValueChange","variant","TabsBarComponent","children","style","testID","theme","contextValue","containerStyle","base","flexDirection","alignItems","borderBottomWidth","borderBottomColor","colors","borderLight","backgroundColor","backgroundSecondary","sm","padding","borderWidth","borderColor","border","Provider","horizontal","showsHorizontalScrollIndicator","contentContainerStyle","TabComponent","label","icon","disabled","textStyle","selectedValue","isSelected","scaleAnim","onPressIn","onPressOut","handlePress","tabStyle","justifyContent","paddingHorizontal","lg","paddingVertical","gap","xs","primary","marginBottom","card","shadowColor","shadow","shadowOffset","width","height","shadowOpacity","shadowRadius","elevation","labelStyle","fontSize","fontWeight","color","primaryForeground","textSecondary","transform","scale","opacity","onPress","accessibilityRole","accessibilityState","selected","TabPanelComponent","Tabs","displayName","TabsTrigger","TabsContent"],"sourceRoot":"../../../src","sources":["tabs/Tabs.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IACVC,aAAa,EACbC,IAAI,EACJC,WAAW,EACXC,UAAU,EACVC,OAAO,QACF,OAAO;AACd,SACEC,IAAI,EACJC,IAAI,EACJC,SAAS,EACTC,QAAQ,EACRC,UAAU,QAGL,cAAc;AAErB,SAASC,QAAQ,QAAQ,uBAAoB;AAC7C,SAASC,iBAAiB,QAAQ,+BAA4B;AAC9D,SAASC,YAAY,EAAEC,KAAK,QAAQ,qBAAkB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;
|
|
1
|
+
{"version":3,"names":["React","createContext","memo","useCallback","useContext","useMemo","View","Text","Pressable","Animated","ScrollView","useTheme","usePressAnimation","borderRadius","space","jsx","_jsx","jsxs","_jsxs","TabsContext","value","onValueChange","variant","fullWidth","TabsBarComponent","children","style","testID","theme","contextValue","containerStyle","base","flexDirection","alignItems","borderBottomWidth","borderBottomColor","colors","borderLight","backgroundColor","backgroundSecondary","sm","padding","borderWidth","borderColor","border","Provider","horizontal","showsHorizontalScrollIndicator","contentContainerStyle","TabComponent","label","icon","disabled","textStyle","selectedValue","isSelected","scaleAnim","onPressIn","onPressOut","handlePress","tabStyle","justifyContent","paddingHorizontal","lg","paddingVertical","gap","xs","primary","marginBottom","card","shadowColor","shadow","shadowOffset","width","height","shadowOpacity","shadowRadius","elevation","labelStyle","fontSize","fontWeight","color","primaryForeground","textSecondary","transform","scale","flex","opacity","onPress","accessibilityRole","accessibilityState","selected","TabPanelComponent","Tabs","displayName","TabsTrigger","TabsContent"],"sourceRoot":"../../../src","sources":["tabs/Tabs.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -12,9 +12,10 @@
|
|
|
12
12
|
* centre and (b) push any two circles apart until they clear a uniform gap. A
|
|
13
13
|
* fixed iteration count + deterministic seed means the same `count` always
|
|
14
14
|
* yields byte-identical positions, so native and web render the cluster
|
|
15
|
-
* identically with no `onLayout`/DOM measurement. The
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* identically with no `onLayout`/DOM measurement. The small counts (1, 2, 3, 4)
|
|
16
|
+
* use explicit iMessage-style arrangements instead — 1–3 because a relaxation
|
|
17
|
+
* there degenerates into a line or a lone pair, and 4 because the iconic
|
|
18
|
+
* 4-person layout is a clean 2×2 grid of equal circles rather than a pack.
|
|
18
19
|
*
|
|
19
20
|
* Output is resolution-independent: each bubble is expressed as a fraction of
|
|
20
21
|
* the group's bounding box (`cx`/`cy` centre, `d` diameter, all 0..1), so the
|
|
@@ -46,7 +47,10 @@ export interface ClusterBubble {
|
|
|
46
47
|
* secondary; the overlap + separator ring alone convey the stacking.
|
|
47
48
|
* - `3` → an iMessage-style triangle: the larger primary along the bottom with
|
|
48
49
|
* two smaller members above it.
|
|
49
|
-
* - `4
|
|
50
|
+
* - `4` → the iMessage 4-person layout: a 2×2 grid of EQUAL-diameter bubbles,
|
|
51
|
+
* centred in the box with a uniform gap, sized so the outermost edges reach the
|
|
52
|
+
* box edge like the other counts.
|
|
53
|
+
* - `5+` → the deterministic force-directed pack of near-equal bubbles, recentred
|
|
50
54
|
* and scaled to fill the round box edge-to-edge (a modestly larger primary near
|
|
51
55
|
* the centre, the rest packed magnetically around it, denser as the count
|
|
52
56
|
* grows).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cluster-layout.d.ts","sourceRoot":"","sources":["../../../../src/avatar-group/cluster-layout.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cluster-layout.d.ts","sourceRoot":"","sources":["../../../../src/avatar-group/cluster-layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,iFAAiF;AACjF,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,CAAC,EAAE,MAAM,CAAC;CACX;AAqKD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CA2CnE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../../src/tabs/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAcf,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAe,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../../src/tabs/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAcf,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAe,MAAM,SAAS,CAAC;AA4L1F,eAAO,MAAM,IAAI,uCAAyB,CAAC;AAG3C,eAAO,MAAM,WAAW,8CAAqB,CAAC;AAG9C,eAAO,MAAM,WAAW,8CAA0B,CAAC"}
|
|
@@ -7,6 +7,13 @@ export interface TabsProps {
|
|
|
7
7
|
onValueChange: (value: string) => void;
|
|
8
8
|
/** Visual variant for the tab bar. */
|
|
9
9
|
variant?: TabsVariant;
|
|
10
|
+
/**
|
|
11
|
+
* When true, the tab bar spans the full container width and each trigger
|
|
12
|
+
* takes an equal share of it (edge to edge), instead of the default
|
|
13
|
+
* content-sized, horizontally scrollable layout. Best for a small, fixed
|
|
14
|
+
* set of tabs (e.g. 2–3). Defaults to `false`.
|
|
15
|
+
*/
|
|
16
|
+
fullWidth?: boolean;
|
|
10
17
|
/** The tab items. Must be TabsTrigger components. */
|
|
11
18
|
children: React.ReactNode;
|
|
12
19
|
style?: StyleProp<ViewStyle>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tabs/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,SAAS;IACxB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,sCAAsC;IACtC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,qDAAqD;IACrD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tabs/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,SAAS;IACxB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,sCAAsC;IACtC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qDAAqD;IACrD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B"}
|
|
@@ -12,9 +12,10 @@
|
|
|
12
12
|
* centre and (b) push any two circles apart until they clear a uniform gap. A
|
|
13
13
|
* fixed iteration count + deterministic seed means the same `count` always
|
|
14
14
|
* yields byte-identical positions, so native and web render the cluster
|
|
15
|
-
* identically with no `onLayout`/DOM measurement. The
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* identically with no `onLayout`/DOM measurement. The small counts (1, 2, 3, 4)
|
|
16
|
+
* use explicit iMessage-style arrangements instead — 1–3 because a relaxation
|
|
17
|
+
* there degenerates into a line or a lone pair, and 4 because the iconic
|
|
18
|
+
* 4-person layout is a clean 2×2 grid of equal circles rather than a pack.
|
|
18
19
|
*
|
|
19
20
|
* Output is resolution-independent: each bubble is expressed as a fraction of
|
|
20
21
|
* the group's bounding box (`cx`/`cy` centre, `d` diameter, all 0..1), so the
|
|
@@ -46,7 +47,10 @@ export interface ClusterBubble {
|
|
|
46
47
|
* secondary; the overlap + separator ring alone convey the stacking.
|
|
47
48
|
* - `3` → an iMessage-style triangle: the larger primary along the bottom with
|
|
48
49
|
* two smaller members above it.
|
|
49
|
-
* - `4
|
|
50
|
+
* - `4` → the iMessage 4-person layout: a 2×2 grid of EQUAL-diameter bubbles,
|
|
51
|
+
* centred in the box with a uniform gap, sized so the outermost edges reach the
|
|
52
|
+
* box edge like the other counts.
|
|
53
|
+
* - `5+` → the deterministic force-directed pack of near-equal bubbles, recentred
|
|
50
54
|
* and scaled to fill the round box edge-to-edge (a modestly larger primary near
|
|
51
55
|
* the centre, the rest packed magnetically around it, denser as the count
|
|
52
56
|
* grows).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cluster-layout.d.ts","sourceRoot":"","sources":["../../../../src/avatar-group/cluster-layout.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cluster-layout.d.ts","sourceRoot":"","sources":["../../../../src/avatar-group/cluster-layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,iFAAiF;AACjF,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,CAAC,EAAE,MAAM,CAAC;CACX;AAqKD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CA2CnE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../../src/tabs/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAcf,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAe,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../../src/tabs/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAcf,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAe,MAAM,SAAS,CAAC;AA4L1F,eAAO,MAAM,IAAI,uCAAyB,CAAC;AAG3C,eAAO,MAAM,WAAW,8CAAqB,CAAC;AAG9C,eAAO,MAAM,WAAW,8CAA0B,CAAC"}
|
|
@@ -7,6 +7,13 @@ export interface TabsProps {
|
|
|
7
7
|
onValueChange: (value: string) => void;
|
|
8
8
|
/** Visual variant for the tab bar. */
|
|
9
9
|
variant?: TabsVariant;
|
|
10
|
+
/**
|
|
11
|
+
* When true, the tab bar spans the full container width and each trigger
|
|
12
|
+
* takes an equal share of it (edge to edge), instead of the default
|
|
13
|
+
* content-sized, horizontally scrollable layout. Best for a small, fixed
|
|
14
|
+
* set of tabs (e.g. 2–3). Defaults to `false`.
|
|
15
|
+
*/
|
|
16
|
+
fullWidth?: boolean;
|
|
10
17
|
/** The tab items. Must be TabsTrigger components. */
|
|
11
18
|
children: React.ReactNode;
|
|
12
19
|
style?: StyleProp<ViewStyle>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tabs/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,SAAS;IACxB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,sCAAsC;IACtC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,qDAAqD;IACrD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tabs/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,SAAS;IACxB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,sCAAsC;IACtC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qDAAqD;IACrD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B"}
|
package/package.json
CHANGED
|
@@ -74,11 +74,12 @@ describe('computeClusterLayout', () => {
|
|
|
74
74
|
}
|
|
75
75
|
});
|
|
76
76
|
|
|
77
|
-
it('fills the round box edge-to-edge for the force-packed counts (
|
|
77
|
+
it('fills the round box edge-to-edge for the force-packed counts (5+)', () => {
|
|
78
78
|
// After the recentre + scale, the outermost bubble edge lands on the box
|
|
79
79
|
// radius (0.5 from the box centre) — the blob fills the round box densely
|
|
80
80
|
// with no big empty margin — and the whole cluster stays roughly centred.
|
|
81
|
-
|
|
81
|
+
// (count=4 is the explicit 2×2 grid, covered separately below.)
|
|
82
|
+
for (const count of [5, 8, 12, 20]) {
|
|
82
83
|
const bubbles = computeClusterLayout(count);
|
|
83
84
|
let reach = 0;
|
|
84
85
|
for (const bubble of bubbles) {
|
|
@@ -98,7 +99,8 @@ describe('computeClusterLayout', () => {
|
|
|
98
99
|
// The pack should read as near-equal magnetic bubbles: a modestly larger
|
|
99
100
|
// primary, everyone else only slightly smaller — not a big primary ringed by
|
|
100
101
|
// tiny dots. The smallest bubble stays at least ~75% of the largest.
|
|
101
|
-
|
|
102
|
+
// (count=4 is the explicit 2×2 grid, covered separately below.)
|
|
103
|
+
for (const count of [5, 6, 8, 12, 20]) {
|
|
102
104
|
const diameters = computeClusterLayout(count).map((bubble) => bubble.d);
|
|
103
105
|
const maxD = Math.max(...diameters);
|
|
104
106
|
const minD = Math.min(...diameters);
|
|
@@ -113,6 +115,60 @@ describe('computeClusterLayout', () => {
|
|
|
113
115
|
}
|
|
114
116
|
});
|
|
115
117
|
|
|
118
|
+
it('arranges the four-member cluster as an equal-size 2×2 grid', () => {
|
|
119
|
+
// The iMessage 4-person layout: four EQUAL-diameter bubbles at the corners of
|
|
120
|
+
// a 2×2 grid centred in the box, with a clean uniform gap (no overlap), sized
|
|
121
|
+
// so the outermost edges reach the box edge like the other counts.
|
|
122
|
+
const bubbles = computeClusterLayout(4);
|
|
123
|
+
expect(bubbles).toHaveLength(4);
|
|
124
|
+
|
|
125
|
+
// All four share one diameter.
|
|
126
|
+
const d = bubbleAt(bubbles, 0).d;
|
|
127
|
+
for (const bubble of bubbles) {
|
|
128
|
+
expect(bubble.d).toBeCloseTo(d, 10);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Exactly two distinct rows (cy) and two distinct columns (cx), each shared by
|
|
132
|
+
// two bubbles — a true 2×2 grid, centred on the box (rows/cols symmetric
|
|
133
|
+
// about 0.5).
|
|
134
|
+
const round = (v: number) => Math.round(v * 1e6) / 1e6;
|
|
135
|
+
const cols = [...new Set(bubbles.map((b) => round(b.cx)))].sort((a, b) => a - b);
|
|
136
|
+
const rows = [...new Set(bubbles.map((b) => round(b.cy)))].sort((a, b) => a - b);
|
|
137
|
+
expect(cols).toHaveLength(2);
|
|
138
|
+
expect(rows).toHaveLength(2);
|
|
139
|
+
const col0 = cols[0];
|
|
140
|
+
const col1 = cols[1];
|
|
141
|
+
const row0 = rows[0];
|
|
142
|
+
const row1 = rows[1];
|
|
143
|
+
if (col0 === undefined || col1 === undefined || row0 === undefined || row1 === undefined) {
|
|
144
|
+
throw new Error('expected two distinct rows and columns');
|
|
145
|
+
}
|
|
146
|
+
expect((col0 + col1) / 2).toBeCloseTo(0.5, 9);
|
|
147
|
+
expect((row0 + row1) / 2).toBeCloseTo(0.5, 9);
|
|
148
|
+
// Square grid: the row and column spacings match.
|
|
149
|
+
expect(col1 - col0).toBeCloseTo(row1 - row0, 9);
|
|
150
|
+
|
|
151
|
+
// Clean uniform gap between neighbours — no overlap.
|
|
152
|
+
expect(minEdgeGap(bubbles)).toBeGreaterThan(0);
|
|
153
|
+
|
|
154
|
+
// Outermost edge reaches the box radius (fills the round box like the others).
|
|
155
|
+
let reach = 0;
|
|
156
|
+
for (const bubble of bubbles) {
|
|
157
|
+
const r = Math.hypot(bubble.cx - 0.5, bubble.cy - 0.5) + bubble.d / 2;
|
|
158
|
+
if (r > reach) reach = r;
|
|
159
|
+
}
|
|
160
|
+
expect(reach).toBeCloseTo(0.5, 6);
|
|
161
|
+
|
|
162
|
+
// Fully inside the unit box, and deterministic.
|
|
163
|
+
for (const bubble of bubbles) {
|
|
164
|
+
expect(bubble.cx - bubble.d / 2).toBeGreaterThanOrEqual(-1e-6);
|
|
165
|
+
expect(bubble.cx + bubble.d / 2).toBeLessThanOrEqual(1 + 1e-6);
|
|
166
|
+
expect(bubble.cy - bubble.d / 2).toBeGreaterThanOrEqual(-1e-6);
|
|
167
|
+
expect(bubble.cy + bubble.d / 2).toBeLessThanOrEqual(1 + 1e-6);
|
|
168
|
+
}
|
|
169
|
+
expect(computeClusterLayout(4)).toEqual(bubbles);
|
|
170
|
+
});
|
|
171
|
+
|
|
116
172
|
it('gives the two-member cluster equal-diameter, overlapping bubbles', () => {
|
|
117
173
|
const bubbles = computeClusterLayout(2);
|
|
118
174
|
expect(bubbles).toHaveLength(2);
|
|
@@ -12,9 +12,10 @@
|
|
|
12
12
|
* centre and (b) push any two circles apart until they clear a uniform gap. A
|
|
13
13
|
* fixed iteration count + deterministic seed means the same `count` always
|
|
14
14
|
* yields byte-identical positions, so native and web render the cluster
|
|
15
|
-
* identically with no `onLayout`/DOM measurement. The
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* identically with no `onLayout`/DOM measurement. The small counts (1, 2, 3, 4)
|
|
16
|
+
* use explicit iMessage-style arrangements instead — 1–3 because a relaxation
|
|
17
|
+
* there degenerates into a line or a lone pair, and 4 because the iconic
|
|
18
|
+
* 4-person layout is a clean 2×2 grid of equal circles rather than a pack.
|
|
18
19
|
*
|
|
19
20
|
* Output is resolution-independent: each bubble is expressed as a fraction of
|
|
20
21
|
* the group's bounding box (`cx`/`cy` centre, `d` diameter, all 0..1), so the
|
|
@@ -114,8 +115,8 @@ function separate(xs: number[], ys: number[], radii: number[], count: number): v
|
|
|
114
115
|
|
|
115
116
|
/**
|
|
116
117
|
* Deterministic force-directed pack of `count` circles (primary pinned at the
|
|
117
|
-
* centre), returned as box-fraction bubbles. Used for every cluster with
|
|
118
|
-
* members; 1–
|
|
118
|
+
* centre), returned as box-fraction bubbles. Used for every cluster with 5+
|
|
119
|
+
* members; 1–4 are handled as explicit arrangements in
|
|
119
120
|
* {@link computeClusterLayout}.
|
|
120
121
|
*/
|
|
121
122
|
function packCluster(count: number): ClusterBubble[] {
|
|
@@ -211,7 +212,10 @@ function packCluster(count: number): ClusterBubble[] {
|
|
|
211
212
|
* secondary; the overlap + separator ring alone convey the stacking.
|
|
212
213
|
* - `3` → an iMessage-style triangle: the larger primary along the bottom with
|
|
213
214
|
* two smaller members above it.
|
|
214
|
-
* - `4
|
|
215
|
+
* - `4` → the iMessage 4-person layout: a 2×2 grid of EQUAL-diameter bubbles,
|
|
216
|
+
* centred in the box with a uniform gap, sized so the outermost edges reach the
|
|
217
|
+
* box edge like the other counts.
|
|
218
|
+
* - `5+` → the deterministic force-directed pack of near-equal bubbles, recentred
|
|
215
219
|
* and scaled to fill the round box edge-to-edge (a modestly larger primary near
|
|
216
220
|
* the centre, the rest packed magnetically around it, denser as the count
|
|
217
221
|
* grows).
|
|
@@ -236,5 +240,27 @@ export function computeClusterLayout(count: number): ClusterBubble[] {
|
|
|
236
240
|
{ cx: 0.715, cy: 0.24, d: 0.4 },
|
|
237
241
|
];
|
|
238
242
|
}
|
|
243
|
+
if (count === 4) {
|
|
244
|
+
// The iMessage 4-person layout: a 2×2 grid of EQUAL-diameter bubbles,
|
|
245
|
+
// centred in the box with the same uniform neighbour gap the rest of the
|
|
246
|
+
// cluster keeps (LAYOUT_GAP, in circle-radius units), sized so the outermost
|
|
247
|
+
// bubble edge reaches the box radius (0.5 from the centre) — exactly as the
|
|
248
|
+
// force-packed counts do — so the four circles fill the round box
|
|
249
|
+
// edge-to-edge with a clean uniform gap and no overlap.
|
|
250
|
+
//
|
|
251
|
+
// With diameter `d` and radius `r = d/2`, the neighbour gap `g = LAYOUT_GAP·r`,
|
|
252
|
+
// so the centre-to-centre spacing is `s = d + g = d·(1 + LAYOUT_GAP/2)`. Each
|
|
253
|
+
// centre sits `(s/2, s/2)` from the box centre, so its farthest point lies
|
|
254
|
+
// `(s/2)·√2 + r` away; setting that to `0.5` and solving for `d`:
|
|
255
|
+
const spacingFactor = 1 + LAYOUT_GAP / 2;
|
|
256
|
+
const d = 0.5 / ((spacingFactor * Math.SQRT2) / 2 + 0.5);
|
|
257
|
+
const half = (d * spacingFactor) / 2;
|
|
258
|
+
return [
|
|
259
|
+
{ cx: 0.5 - half, cy: 0.5 - half, d },
|
|
260
|
+
{ cx: 0.5 + half, cy: 0.5 - half, d },
|
|
261
|
+
{ cx: 0.5 - half, cy: 0.5 + half, d },
|
|
262
|
+
{ cx: 0.5 + half, cy: 0.5 + half, d },
|
|
263
|
+
];
|
|
264
|
+
}
|
|
239
265
|
return packCluster(count);
|
|
240
266
|
}
|
package/src/tabs/Tabs.tsx
CHANGED
|
@@ -24,18 +24,21 @@ interface TabsContextValue {
|
|
|
24
24
|
value: string;
|
|
25
25
|
onValueChange: (value: string) => void;
|
|
26
26
|
variant: TabsVariant;
|
|
27
|
+
fullWidth: boolean;
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
const TabsContext = createContext<TabsContextValue>({
|
|
30
31
|
value: '',
|
|
31
32
|
onValueChange: () => {},
|
|
32
33
|
variant: 'underline',
|
|
34
|
+
fullWidth: false,
|
|
33
35
|
});
|
|
34
36
|
|
|
35
37
|
const TabsBarComponent: React.FC<TabsProps> = ({
|
|
36
38
|
value,
|
|
37
39
|
onValueChange,
|
|
38
40
|
variant = 'underline',
|
|
41
|
+
fullWidth = false,
|
|
39
42
|
children,
|
|
40
43
|
style,
|
|
41
44
|
testID,
|
|
@@ -43,8 +46,8 @@ const TabsBarComponent: React.FC<TabsProps> = ({
|
|
|
43
46
|
const theme = useTheme();
|
|
44
47
|
|
|
45
48
|
const contextValue = useMemo(
|
|
46
|
-
() => ({ value, onValueChange, variant }),
|
|
47
|
-
[value, onValueChange, variant],
|
|
49
|
+
() => ({ value, onValueChange, variant, fullWidth }),
|
|
50
|
+
[value, onValueChange, variant, fullWidth],
|
|
48
51
|
);
|
|
49
52
|
|
|
50
53
|
const containerStyle = useMemo((): ViewStyle => {
|
|
@@ -76,14 +79,20 @@ const TabsBarComponent: React.FC<TabsProps> = ({
|
|
|
76
79
|
|
|
77
80
|
return (
|
|
78
81
|
<TabsContext.Provider value={contextValue}>
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
82
|
+
{fullWidth ? (
|
|
83
|
+
<View style={[containerStyle, style]} testID={testID}>
|
|
84
|
+
{children}
|
|
85
|
+
</View>
|
|
86
|
+
) : (
|
|
87
|
+
<ScrollView
|
|
88
|
+
horizontal
|
|
89
|
+
showsHorizontalScrollIndicator={false}
|
|
90
|
+
contentContainerStyle={[containerStyle, style]}
|
|
91
|
+
testID={testID}
|
|
92
|
+
>
|
|
93
|
+
{children}
|
|
94
|
+
</ScrollView>
|
|
95
|
+
)}
|
|
87
96
|
</TabsContext.Provider>
|
|
88
97
|
);
|
|
89
98
|
};
|
|
@@ -97,7 +106,12 @@ const TabComponent: React.FC<TabsTriggerProps> = ({
|
|
|
97
106
|
textStyle,
|
|
98
107
|
}) => {
|
|
99
108
|
const theme = useTheme();
|
|
100
|
-
const {
|
|
109
|
+
const {
|
|
110
|
+
value: selectedValue,
|
|
111
|
+
onValueChange,
|
|
112
|
+
variant,
|
|
113
|
+
fullWidth,
|
|
114
|
+
} = useContext(TabsContext);
|
|
101
115
|
const isSelected = value === selectedValue;
|
|
102
116
|
const { scaleAnim, onPressIn, onPressOut } = usePressAnimation(0.97);
|
|
103
117
|
|
|
@@ -165,9 +179,11 @@ const TabComponent: React.FC<TabsTriggerProps> = ({
|
|
|
165
179
|
}, [variant, isSelected, theme]);
|
|
166
180
|
|
|
167
181
|
return (
|
|
168
|
-
<Animated.View
|
|
182
|
+
<Animated.View
|
|
183
|
+
style={[{ transform: [{ scale: scaleAnim }] }, fullWidth && { flex: 1 }]}
|
|
184
|
+
>
|
|
169
185
|
<Pressable
|
|
170
|
-
style={[tabStyle, disabled && { opacity: 0.4 }, style]}
|
|
186
|
+
style={[tabStyle, fullWidth && { flex: 1 }, disabled && { opacity: 0.4 }, style]}
|
|
171
187
|
onPress={handlePress}
|
|
172
188
|
onPressIn={onPressIn}
|
|
173
189
|
onPressOut={onPressOut}
|
package/src/tabs/types.ts
CHANGED
|
@@ -9,6 +9,13 @@ export interface TabsProps {
|
|
|
9
9
|
onValueChange: (value: string) => void;
|
|
10
10
|
/** Visual variant for the tab bar. */
|
|
11
11
|
variant?: TabsVariant;
|
|
12
|
+
/**
|
|
13
|
+
* When true, the tab bar spans the full container width and each trigger
|
|
14
|
+
* takes an equal share of it (edge to edge), instead of the default
|
|
15
|
+
* content-sized, horizontally scrollable layout. Best for a small, fixed
|
|
16
|
+
* set of tabs (e.g. 2–3). Defaults to `false`.
|
|
17
|
+
*/
|
|
18
|
+
fullWidth?: boolean;
|
|
12
19
|
/** The tab items. Must be TabsTrigger components. */
|
|
13
20
|
children: React.ReactNode;
|
|
14
21
|
style?: StyleProp<ViewStyle>;
|