@oxyhq/bloom 0.34.2 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/lib/commonjs/avatar-group/AvatarGroup.js +3 -2
  2. package/lib/commonjs/avatar-group/AvatarGroup.js.map +1 -1
  3. package/lib/commonjs/avatar-group/AvatarGroup.web.js +5 -5
  4. package/lib/commonjs/avatar-group/AvatarGroupBase.js +217 -48
  5. package/lib/commonjs/avatar-group/AvatarGroupBase.js.map +1 -1
  6. package/lib/commonjs/avatar-group/cluster-layout.js +217 -0
  7. package/lib/commonjs/avatar-group/cluster-layout.js.map +1 -0
  8. package/lib/commonjs/zoomable-image-gallery/ZoomableImageGallery.js +23 -13
  9. package/lib/commonjs/zoomable-image-gallery/ZoomableImageGallery.js.map +1 -1
  10. package/lib/module/avatar-group/AvatarGroup.js +3 -2
  11. package/lib/module/avatar-group/AvatarGroup.js.map +1 -1
  12. package/lib/module/avatar-group/AvatarGroup.web.js +5 -5
  13. package/lib/module/avatar-group/AvatarGroupBase.js +217 -48
  14. package/lib/module/avatar-group/AvatarGroupBase.js.map +1 -1
  15. package/lib/module/avatar-group/cluster-layout.js +213 -0
  16. package/lib/module/avatar-group/cluster-layout.js.map +1 -0
  17. package/lib/module/zoomable-image-gallery/ZoomableImageGallery.js +23 -13
  18. package/lib/module/zoomable-image-gallery/ZoomableImageGallery.js.map +1 -1
  19. package/lib/typescript/commonjs/avatar-group/AvatarGroup.d.ts.map +1 -1
  20. package/lib/typescript/commonjs/avatar-group/AvatarGroupBase.d.ts.map +1 -1
  21. package/lib/typescript/commonjs/avatar-group/cluster-layout.d.ts +48 -0
  22. package/lib/typescript/commonjs/avatar-group/cluster-layout.d.ts.map +1 -0
  23. package/lib/typescript/commonjs/avatar-group/types.d.ts +23 -5
  24. package/lib/typescript/commonjs/avatar-group/types.d.ts.map +1 -1
  25. package/lib/typescript/commonjs/zoomable-image-gallery/ZoomableImageGallery.d.ts.map +1 -1
  26. package/lib/typescript/module/avatar-group/AvatarGroup.d.ts.map +1 -1
  27. package/lib/typescript/module/avatar-group/AvatarGroupBase.d.ts.map +1 -1
  28. package/lib/typescript/module/avatar-group/cluster-layout.d.ts +48 -0
  29. package/lib/typescript/module/avatar-group/cluster-layout.d.ts.map +1 -0
  30. package/lib/typescript/module/avatar-group/types.d.ts +23 -5
  31. package/lib/typescript/module/avatar-group/types.d.ts.map +1 -1
  32. package/lib/typescript/module/zoomable-image-gallery/ZoomableImageGallery.d.ts.map +1 -1
  33. package/package.json +1 -1
  34. package/src/__tests__/AvatarGroupCluster.test.tsx +123 -0
  35. package/src/avatar-group/AvatarGroup.stories.tsx +68 -0
  36. package/src/avatar-group/AvatarGroup.tsx +3 -2
  37. package/src/avatar-group/AvatarGroup.web.tsx +5 -5
  38. package/src/avatar-group/AvatarGroupBase.tsx +298 -89
  39. package/src/avatar-group/cluster-layout.ts +204 -0
  40. package/src/avatar-group/types.ts +23 -5
  41. package/src/zoomable-image-gallery/ZoomableImageGallery.tsx +27 -12
@@ -5,6 +5,7 @@ import { Pressable, StyleSheet, Text, View } from 'react-native';
5
5
  import { Avatar } from "../avatar/index.js";
6
6
  import { useTheme } from "../theme/use-theme.js";
7
7
  import { fontSize } from "../styles/tokens.js";
8
+ import { computeClusterLayout } from "./cluster-layout.js";
8
9
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
10
  /** Ring (border) thickness around each avatar, in pixels. Matches the
10
11
  * original Mention `AvatarStack` (a single hairline-ish 1px separator). */
@@ -12,6 +13,15 @@ const RING_WIDTH = 1;
12
13
  /** Default horizontal overlap as a fraction of avatar size — the original
13
14
  * stack pulled each avatar left by `size / 3`. */
14
15
  const DEFAULT_OVERLAP_RATIO = 1 / 3;
16
+ /** Default `max` for the `stack`/`row` facepile layouts. */
17
+ const DEFAULT_MAX = 5;
18
+ /** Default `max` (visible cap) for the `cluster` layout — it packs densely. */
19
+ const CLUSTER_DEFAULT_MAX = 20;
20
+ /** Separator ring thickness for cluster bubbles, as a fraction of the box. */
21
+ const CLUSTER_RING_RATIO = 0.02;
22
+ /** Overflow "+N" text color — white reads on the grey chip in light + dark,
23
+ * matching the original Mention count circle (shared by every layout). */
24
+ const OVERFLOW_TEXT_COLOR = '#FFFFFF';
15
25
  function getItemName(item) {
16
26
  return item.displayName ?? item.name ?? item.username;
17
27
  }
@@ -21,12 +31,61 @@ function getItemKey(item, index) {
21
31
 
22
32
  /** Hover callbacks injected by the web fork; undefined (no-op) on native. */
23
33
 
34
+ /**
35
+ * A single avatar cell shared by every layout: a circular, clipped container
36
+ * (`cellStyle`) holding one {@link Avatar}, positioned by `wrapperStyle`, and
37
+ * made pressable/hoverable when the relevant handlers are supplied. Layout
38
+ * (margins for the facepile, absolute coords for the cluster) lives entirely in
39
+ * the caller-provided styles so this stays layout-agnostic.
40
+ */
41
+ function AvatarGroupCell({
42
+ item,
43
+ index,
44
+ innerSize,
45
+ variant,
46
+ showInitials,
47
+ cellStyle,
48
+ wrapperStyle,
49
+ onPressItem,
50
+ hoverHandlers
51
+ }) {
52
+ const name = getItemName(item);
53
+ const accessibilityLabel = item.username ? `${name ?? item.username} (@${item.username})` : name;
54
+ const interactive = typeof onPressItem === 'function';
55
+ const hoverable = typeof hoverHandlers?.onHoverIn === 'function' || typeof hoverHandlers?.onHoverOut === 'function';
56
+ const cell = /*#__PURE__*/_jsx(View, {
57
+ ref: hoverHandlers?.registerCellRef ? node => hoverHandlers.registerCellRef?.(index, node) : undefined,
58
+ collapsable: false,
59
+ style: cellStyle,
60
+ children: /*#__PURE__*/_jsx(Avatar, {
61
+ source: item.uri ?? undefined,
62
+ name: showInitials ? name : undefined,
63
+ variant: variant,
64
+ size: innerSize
65
+ })
66
+ });
67
+ if (interactive || hoverable) {
68
+ return /*#__PURE__*/_jsx(Pressable, {
69
+ onPress: interactive ? () => onPressItem?.(item, index) : undefined,
70
+ onHoverIn: hoverHandlers?.onHoverIn ? () => hoverHandlers.onHoverIn?.(item, index) : undefined,
71
+ onHoverOut: hoverHandlers?.onHoverOut ? () => hoverHandlers.onHoverOut?.(item, index) : undefined,
72
+ accessibilityRole: interactive ? 'button' : undefined,
73
+ accessibilityLabel: accessibilityLabel,
74
+ style: wrapperStyle,
75
+ children: cell
76
+ });
77
+ }
78
+ return /*#__PURE__*/_jsx(View, {
79
+ style: wrapperStyle,
80
+ children: cell
81
+ });
82
+ }
24
83
  const AvatarGroupBaseComponent = ({
25
84
  items,
26
85
  layout = 'stack',
27
86
  size = 32,
28
87
  variant = 'thumb',
29
- max = 5,
88
+ max,
30
89
  total,
31
90
  overlap,
32
91
  spacing,
@@ -38,6 +97,7 @@ const AvatarGroupBaseComponent = ({
38
97
  hoverHandlers
39
98
  }) => {
40
99
  const theme = useTheme();
100
+ const isCluster = layout === 'cluster';
41
101
  const isRow = layout === 'row';
42
102
 
43
103
  // The ring is the thin separator drawn between overlapping avatars. It
@@ -45,6 +105,7 @@ const AvatarGroupBaseComponent = ({
45
105
  // the surface behind them — matching the original Mention stack, which used
46
106
  // `theme.colors.background`, not a large `card`-colored ring cell.
47
107
  const ring = ringColor ?? theme.colors.background;
108
+ const effectiveMax = max ?? DEFAULT_MAX;
48
109
  const effectiveOverlap = overlap ?? Math.round(size * DEFAULT_OVERLAP_RATIO);
49
110
  // Each avatar after the first is pulled left by `overlap`. The cell carries a
50
111
  // 1px border on each side, so the negative margin absorbs both borders to
@@ -54,7 +115,7 @@ const AvatarGroupBaseComponent = ({
54
115
  const rowGap = spacing ?? Math.round(size * DEFAULT_OVERLAP_RATIO);
55
116
  // Horizontal offset applied to every avatar after the first.
56
117
  const itemMargin = isRow ? rowGap : negativeMargin;
57
- const shown = useMemo(() => items.slice(0, Math.max(0, max)), [items, max]);
118
+ const shown = useMemo(() => items.slice(0, Math.max(0, effectiveMax)), [items, effectiveMax]);
58
119
  const realTotal = total ?? items.length;
59
120
  const overflow = Math.max(0, realTotal - shown.length);
60
121
 
@@ -84,24 +145,38 @@ const AvatarGroupBaseComponent = ({
84
145
  };
85
146
  }, [isRow, size, ring]);
86
147
  const overflowTextStyle = useMemo(() => ({
87
- color: '#FFFFFF',
148
+ color: OVERFLOW_TEXT_COLOR,
88
149
  fontSize: Math.max(fontSize._2xs, Math.round(size * 0.36)),
89
150
  fontWeight: '600'
90
151
  }), [size]);
91
152
  const interactive = typeof onPressItem === 'function';
92
- const hoverable = typeof hoverHandlers?.onHoverIn === 'function' || typeof hoverHandlers?.onHoverOut === 'function';
93
153
 
94
154
  // Pressing the "+N" circle surfaces the first hidden member (if any), so
95
155
  // consumers can route it to a full member list.
96
156
  const firstHidden = items[shown.length];
97
157
  const overflowOnPress = interactive && firstHidden ? () => onPressItem?.(firstHidden, shown.length) : undefined;
158
+
159
+ // The cluster is a compact 2D bubble pack with its own absolute-positioned
160
+ // renderer; hooks above still run unconditionally so the branch is safe.
161
+ if (isCluster) {
162
+ return /*#__PURE__*/_jsx(ClusterAvatarGroup, {
163
+ items: items,
164
+ size: size,
165
+ variant: variant,
166
+ max: max,
167
+ total: total,
168
+ ring: ring,
169
+ showInitials: showInitials,
170
+ onPressItem: onPressItem,
171
+ style: style,
172
+ testID: testID,
173
+ hoverHandlers: hoverHandlers
174
+ });
175
+ }
98
176
  return /*#__PURE__*/_jsxs(View, {
99
177
  style: [styles.row, style],
100
178
  testID: testID,
101
179
  children: [shown.map((item, index) => {
102
- const name = getItemName(item);
103
- const accessibilityLabel = item.username ? `${name ?? item.username} (@${item.username})` : name;
104
-
105
180
  // The horizontal margin and stacking order live on the outermost row
106
181
  // element so layout and hit-testing stay aligned with the visual
107
182
  // overlap. In stack mode earlier siblings render on top of later ones
@@ -115,65 +190,159 @@ const AvatarGroupBaseComponent = ({
115
190
  zIndex: shown.length - index
116
191
  })
117
192
  };
118
- const cell = /*#__PURE__*/_jsx(View, {
119
- ref: hoverHandlers?.registerCellRef ? node => hoverHandlers.registerCellRef?.(index, node) : undefined,
120
- collapsable: false,
121
- style: cellStyle,
122
- children: /*#__PURE__*/_jsx(Avatar, {
123
- source: item.uri ?? undefined,
124
- name: showInitials ? name : undefined,
125
- variant: variant,
126
- size: innerSize
127
- })
128
- });
129
- if (interactive || hoverable) {
130
- return /*#__PURE__*/_jsx(Pressable, {
131
- onPress: interactive ? () => onPressItem?.(item, index) : undefined,
132
- onHoverIn: hoverHandlers?.onHoverIn ? () => hoverHandlers.onHoverIn?.(item, index) : undefined,
133
- onHoverOut: hoverHandlers?.onHoverOut ? () => hoverHandlers.onHoverOut?.(item, index) : undefined,
134
- accessibilityRole: interactive ? 'button' : undefined,
135
- accessibilityLabel: accessibilityLabel,
136
- style: wrapperStyle,
137
- children: cell
138
- }, getItemKey(item, index));
139
- }
140
- return /*#__PURE__*/_jsx(View, {
141
- style: wrapperStyle,
142
- children: cell
193
+ return /*#__PURE__*/_jsx(AvatarGroupCell, {
194
+ item: item,
195
+ index: index,
196
+ innerSize: innerSize,
197
+ variant: variant,
198
+ showInitials: showInitials,
199
+ cellStyle: cellStyle,
200
+ wrapperStyle: wrapperStyle,
201
+ onPressItem: onPressItem,
202
+ hoverHandlers: hoverHandlers
143
203
  }, getItemKey(item, index));
144
204
  }), overflow > 0 && /*#__PURE__*/_jsx(OverflowCircle, {
145
205
  count: overflow,
146
206
  cellStyle: cellStyle,
147
- marginLeft: shown.length > 0 ? itemMargin : 0,
148
- isRow: isRow,
207
+ wrapperStyle: {
208
+ ...(shown.length > 0 && {
209
+ marginLeft: itemMargin
210
+ }),
211
+ ...(isRow ? {} : {
212
+ zIndex: 0
213
+ })
214
+ },
149
215
  textStyle: overflowTextStyle,
150
216
  onPress: overflowOnPress
151
217
  })]
152
218
  });
153
219
  };
220
+ /**
221
+ * The `cluster` layout: an iMessage-style magnetic bubble pack. Members are laid
222
+ * out by {@link computeClusterLayout} (a deterministic force-directed pack) into
223
+ * box-fraction bubbles, then absolutely positioned inside a `size × size` box so
224
+ * the whole cluster drops in where a single round Avatar would. The largest
225
+ * member (index 0) sits centred and in front; the rest pack around it with a
226
+ * uniform gap. Overflow beyond `max` collapses into a trailing "+N" bubble.
227
+ */
228
+ const ClusterAvatarGroup = ({
229
+ items,
230
+ size,
231
+ variant,
232
+ max,
233
+ total,
234
+ ring,
235
+ showInitials,
236
+ onPressItem,
237
+ style,
238
+ testID,
239
+ hoverHandlers
240
+ }) => {
241
+ const cap = Math.max(1, max ?? CLUSTER_DEFAULT_MAX);
242
+ const realTotal = total ?? items.length;
243
+ const hasOverflow = realTotal > cap;
244
+ // Reserve the last bubble for the "+N" chip when there are more members than
245
+ // the cap; otherwise every capped member gets its own bubble.
246
+ const avatarCap = hasOverflow ? Math.max(0, cap - 1) : cap;
247
+ const shown = useMemo(() => items.slice(0, avatarCap), [items, avatarCap]);
248
+ const overflow = hasOverflow ? Math.max(0, realTotal - shown.length) : 0;
249
+ const bubbleCount = shown.length + (overflow > 0 ? 1 : 0);
250
+ const bubbles = useMemo(() => computeClusterLayout(bubbleCount), [bubbleCount]);
251
+ const ringWidth = Math.max(1, Math.round(size * CLUSTER_RING_RATIO));
252
+ const interactive = typeof onPressItem === 'function';
253
+
254
+ // Pressing "+N" surfaces the first hidden member (parity with the stack).
255
+ const firstHidden = items[shown.length];
256
+ const overflowOnPress = interactive && firstHidden ? () => onPressItem?.(firstHidden, shown.length) : undefined;
257
+ const overflowBubble = overflow > 0 ? bubbles[bubbleCount - 1] : undefined;
258
+ let overflowElement = null;
259
+ if (overflow > 0 && overflowBubble) {
260
+ const diameter = overflowBubble.d * size;
261
+ overflowElement = /*#__PURE__*/_jsx(OverflowCircle, {
262
+ count: overflow,
263
+ cellStyle: {
264
+ width: diameter,
265
+ height: diameter,
266
+ borderRadius: diameter / 2,
267
+ borderWidth: ringWidth,
268
+ borderColor: ring,
269
+ alignItems: 'center',
270
+ justifyContent: 'center'
271
+ },
272
+ wrapperStyle: {
273
+ position: 'absolute',
274
+ left: overflowBubble.cx * size - diameter / 2,
275
+ top: overflowBubble.cy * size - diameter / 2,
276
+ width: diameter,
277
+ height: diameter,
278
+ zIndex: 0
279
+ },
280
+ textStyle: {
281
+ color: OVERFLOW_TEXT_COLOR,
282
+ fontSize: Math.max(fontSize._2xs, Math.round(diameter * 0.34)),
283
+ fontWeight: '600'
284
+ },
285
+ onPress: overflowOnPress
286
+ });
287
+ }
288
+ return /*#__PURE__*/_jsxs(View, {
289
+ style: [{
290
+ width: size,
291
+ height: size
292
+ }, style],
293
+ testID: testID,
294
+ children: [shown.map((item, index) => {
295
+ const bubble = bubbles[index];
296
+ if (!bubble) return null;
297
+ const diameter = bubble.d * size;
298
+ const inner = Math.max(1, diameter - ringWidth * 2);
299
+ const wrapperStyle = {
300
+ position: 'absolute',
301
+ left: bubble.cx * size - diameter / 2,
302
+ top: bubble.cy * size - diameter / 2,
303
+ width: diameter,
304
+ height: diameter,
305
+ // Primary (index 0) is largest and sits in front; later members tuck
306
+ // behind in descending order (the "+N" chip lands lowest).
307
+ zIndex: bubbleCount - index
308
+ };
309
+ const cellStyle = {
310
+ width: diameter,
311
+ height: diameter,
312
+ borderRadius: diameter / 2,
313
+ borderWidth: ringWidth,
314
+ borderColor: ring,
315
+ overflow: 'hidden',
316
+ alignItems: 'center',
317
+ justifyContent: 'center'
318
+ };
319
+ return /*#__PURE__*/_jsx(AvatarGroupCell, {
320
+ item: item,
321
+ index: index,
322
+ innerSize: inner,
323
+ variant: variant,
324
+ showInitials: showInitials,
325
+ cellStyle: cellStyle,
326
+ wrapperStyle: wrapperStyle,
327
+ onPressItem: onPressItem,
328
+ hoverHandlers: hoverHandlers
329
+ }, getItemKey(item, index));
330
+ }), overflowElement]
331
+ });
332
+ };
154
333
  function OverflowCircle({
155
334
  count,
156
335
  cellStyle,
157
- marginLeft,
158
- isRow,
336
+ wrapperStyle,
159
337
  textStyle,
160
338
  onPress
161
339
  }) {
162
340
  const theme = useTheme();
163
- // In stack mode the count circle is anchored at the lowest stacking order so
164
- // it tucks behind the last avatar's ring; row mode has no overlap. The margin
165
- // lives on the outer element to keep layout aligned with the spacing.
166
- const wrapperStyle = {
167
- ...(marginLeft !== 0 && {
168
- marginLeft
169
- }),
170
- ...(isRow ? {} : {
171
- zIndex: 0
172
- })
173
- };
174
341
 
175
342
  // A solid "+N" count circle: secondary-text-colored fill with white text,
176
- // matching the original Mention `ResponsiveAvatarStack` count circle.
343
+ // matching the original Mention `ResponsiveAvatarStack` count circle. Layout
344
+ // (margin for the facepile, absolute coords for the cluster) is supplied by
345
+ // the caller via `wrapperStyle`.
177
346
  const circle = /*#__PURE__*/_jsx(View, {
178
347
  style: [cellStyle, {
179
348
  backgroundColor: theme.colors.textSecondary
@@ -1 +1 @@
1
- {"version":3,"names":["React","memo","useMemo","Pressable","StyleSheet","Text","View","Avatar","useTheme","fontSize","jsx","_jsx","jsxs","_jsxs","RING_WIDTH","DEFAULT_OVERLAP_RATIO","getItemName","item","displayName","name","username","getItemKey","index","id","uri","AvatarGroupBaseComponent","items","layout","size","variant","max","total","overlap","spacing","ringColor","showInitials","onPressItem","style","testID","hoverHandlers","theme","isRow","ring","colors","background","effectiveOverlap","Math","round","negativeMargin","rowGap","itemMargin","shown","slice","realTotal","length","overflow","innerSize","cellStyle","width","height","borderRadius","alignItems","justifyContent","borderWidth","borderColor","overflowTextStyle","color","_2xs","fontWeight","interactive","hoverable","onHoverIn","onHoverOut","firstHidden","overflowOnPress","undefined","styles","row","children","map","accessibilityLabel","wrapperStyle","marginLeft","zIndex","cell","ref","registerCellRef","node","collapsable","source","onPress","accessibilityRole","OverflowCircle","count","textStyle","circle","backgroundColor","textSecondary","allowFontScaling","create","flexDirection","AvatarGroupBase"],"sourceRoot":"../../../src","sources":["avatar-group/AvatarGroupBase.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","memo","useMemo","Pressable","StyleSheet","Text","View","Avatar","useTheme","fontSize","computeClusterLayout","jsx","_jsx","jsxs","_jsxs","RING_WIDTH","DEFAULT_OVERLAP_RATIO","DEFAULT_MAX","CLUSTER_DEFAULT_MAX","CLUSTER_RING_RATIO","OVERFLOW_TEXT_COLOR","getItemName","item","displayName","name","username","getItemKey","index","id","uri","AvatarGroupCell","innerSize","variant","showInitials","cellStyle","wrapperStyle","onPressItem","hoverHandlers","accessibilityLabel","interactive","hoverable","onHoverIn","onHoverOut","cell","ref","registerCellRef","node","undefined","collapsable","style","children","source","size","onPress","accessibilityRole","AvatarGroupBaseComponent","items","layout","max","total","overlap","spacing","ringColor","testID","theme","isCluster","isRow","ring","colors","background","effectiveMax","effectiveOverlap","Math","round","negativeMargin","rowGap","itemMargin","shown","slice","realTotal","length","overflow","width","height","borderRadius","alignItems","justifyContent","borderWidth","borderColor","overflowTextStyle","color","_2xs","fontWeight","firstHidden","overflowOnPress","ClusterAvatarGroup","styles","row","map","marginLeft","zIndex","OverflowCircle","count","textStyle","cap","hasOverflow","avatarCap","bubbleCount","bubbles","ringWidth","overflowBubble","overflowElement","diameter","d","position","left","cx","top","cy","bubble","inner","circle","backgroundColor","textSecondary","allowFontScaling","create","flexDirection","AvatarGroupBase"],"sourceRoot":"../../../src","sources":["avatar-group/AvatarGroupBase.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Deterministic organic circle-packing for the {@link AvatarGroup} `cluster`
5
+ * layout — the iMessage-style "magnetic bubble cluster" where several avatars of
6
+ * varying sizes nestle together inside a round bounding box (a large primary in
7
+ * the middle/front, smaller members packed around it with a uniform gap).
8
+ *
9
+ * For 4+ members the layout is produced by a small, FULLY DETERMINISTIC
10
+ * force-directed relaxation (no `Math.random`): the primary is pinned at the
11
+ * centre and the remaining members are seeded on a golden-angle spiral, then a
12
+ * fixed number of relaxation passes (a) pull every non-primary circle toward the
13
+ * centre and (b) push any two circles apart until they clear a uniform gap. A
14
+ * fixed iteration count + deterministic seed means the same `count` always
15
+ * yields byte-identical positions, so native and web render the cluster
16
+ * identically with no `onLayout`/DOM measurement. The very small counts (1, 2,
17
+ * 3) — where a relaxation degenerates into a line or a lone pair — use explicit
18
+ * iMessage-style arrangements instead.
19
+ *
20
+ * Output is resolution-independent: each bubble is expressed as a fraction of
21
+ * the group's bounding box (`cx`/`cy` centre, `d` diameter, all 0..1), so the
22
+ * consumer just multiplies by the pixel `size`. Every bubble is guaranteed to
23
+ * sit fully inside the `[0, 1]` box (the packed result is scaled + translated to
24
+ * fit), so the cluster drops in exactly where a single round Avatar would.
25
+ */
26
+
27
+ /** A single packed bubble, expressed as fractions of the bounding box (0..1). */
28
+
29
+ // Golden angle (~137.5°) — spreads the seed points evenly with no directional
30
+ // bias, which is what gives the relaxed result its organic, non-grid feel.
31
+ const GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));
32
+ // Fixed relaxation passes + a final separation-only cleanup so the last thing
33
+ // that happens is overlap resolution (gaps end uniform and non-negative).
34
+ const ITERATIONS = 500;
35
+ const CLEANUP_ITERATIONS = 80;
36
+ // How hard each pass pulls every non-primary circle toward the centre. This is
37
+ // the only compacting force; separation only ever pushes apart, so any positive
38
+ // value packs the cluster fully — this just controls convergence speed.
39
+ const CENTERING = 0.05;
40
+ // Fraction of an overlap resolved per pass. 1 fully separates each pass; with
41
+ // the pinned primary and many passes this stays stable and converges.
42
+ const SEPARATION_STRENGTH = 1;
43
+ // Uniform gap kept between every touching pair, in primary-radius units
44
+ // (primary radius = 1). Reads as consistent spacing everywhere in the cluster.
45
+ const LAYOUT_GAP = 0.16;
46
+ // Initial spiral spacing. Only affects convergence (the result is re-fitted to
47
+ // the box afterwards), not the final scale.
48
+ const SEED_SPACING = 1.7;
49
+ // Relative radii: the primary is the largest; the remaining members taper from
50
+ // SECONDARY_MAX (nearest the primary) down to SECONDARY_MIN (outermost) so size
51
+ // decreases outward and later/overflow members are the smallest.
52
+ const PRIMARY_RADIUS = 1;
53
+ const SECONDARY_MAX = 0.72;
54
+ const SECONDARY_MIN = 0.5;
55
+ const EPSILON = 1e-6;
56
+
57
+ /** Relative radius for member `index` of a `count`-member cluster. */
58
+ function relativeRadius(index, count) {
59
+ if (index === 0) return PRIMARY_RADIUS;
60
+ if (count <= 2) return SECONDARY_MAX;
61
+ const t = (index - 1) / (count - 2);
62
+ return SECONDARY_MAX + (SECONDARY_MIN - SECONDARY_MAX) * t;
63
+ }
64
+
65
+ /**
66
+ * One separation pass: push any pair closer than `(r_i + r_j + gap)` apart. The
67
+ * primary (index 0) is pinned — when a pair involves it, only the other circle
68
+ * moves — which keeps the largest avatar dead-centre and in front.
69
+ */
70
+ function separate(xs, ys, radii, count) {
71
+ for (let i = 0; i < count; i++) {
72
+ for (let j = i + 1; j < count; j++) {
73
+ let dx = (xs[j] ?? 0) - (xs[i] ?? 0);
74
+ let dy = (ys[j] ?? 0) - (ys[i] ?? 0);
75
+ let dist = Math.hypot(dx, dy);
76
+ const minDist = (radii[i] ?? 0) + (radii[j] ?? 0) + LAYOUT_GAP;
77
+ if (dist >= minDist) continue;
78
+ if (dist < EPSILON) {
79
+ // Coincident points: pick a deterministic direction from the indices so
80
+ // the split is stable (never random).
81
+ const a = (i + 1) * GOLDEN_ANGLE + j;
82
+ dx = Math.cos(a);
83
+ dy = Math.sin(a);
84
+ dist = 1;
85
+ }
86
+ const overlap = (minDist - dist) * SEPARATION_STRENGTH;
87
+ const nx = dx / dist;
88
+ const ny = dy / dist;
89
+ if (i === 0) {
90
+ // Primary pinned: move only the other circle by the full overlap.
91
+ xs[j] = (xs[j] ?? 0) + nx * overlap;
92
+ ys[j] = (ys[j] ?? 0) + ny * overlap;
93
+ } else {
94
+ xs[i] = (xs[i] ?? 0) - nx * overlap / 2;
95
+ ys[i] = (ys[i] ?? 0) - ny * overlap / 2;
96
+ xs[j] = (xs[j] ?? 0) + nx * overlap / 2;
97
+ ys[j] = (ys[j] ?? 0) + ny * overlap / 2;
98
+ }
99
+ }
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Deterministic force-directed pack of `count` circles (primary pinned at the
105
+ * centre), returned as box-fraction bubbles. Used for every cluster with 4+
106
+ * members; 1–3 are handled as explicit arrangements in
107
+ * {@link computeClusterLayout}.
108
+ */
109
+ function packCluster(count) {
110
+ const radii = new Array(count);
111
+ const xs = new Array(count);
112
+ const ys = new Array(count);
113
+ for (let i = 0; i < count; i++) {
114
+ radii[i] = relativeRadius(i, count);
115
+ if (i === 0) {
116
+ xs[i] = 0;
117
+ ys[i] = 0;
118
+ } else {
119
+ // Golden-angle spiral seed around the pinned primary.
120
+ const seedR = SEED_SPACING * Math.sqrt(i);
121
+ const angle = i * GOLDEN_ANGLE;
122
+ xs[i] = seedR * Math.cos(angle);
123
+ ys[i] = seedR * Math.sin(angle);
124
+ }
125
+ }
126
+ for (let iter = 0; iter < ITERATIONS; iter++) {
127
+ // (a) Centering: pull every non-primary circle toward the centre.
128
+ for (let i = 1; i < count; i++) {
129
+ xs[i] = (xs[i] ?? 0) * (1 - CENTERING);
130
+ ys[i] = (ys[i] ?? 0) * (1 - CENTERING);
131
+ }
132
+ // (b) Separation resolves any resulting overlaps (primary stays pinned).
133
+ separate(xs, ys, radii, count);
134
+ xs[0] = 0;
135
+ ys[0] = 0;
136
+ }
137
+ // Final separation-only passes so the cluster ends with clean uniform gaps.
138
+ for (let iter = 0; iter < CLEANUP_ITERATIONS; iter++) {
139
+ separate(xs, ys, radii, count);
140
+ xs[0] = 0;
141
+ ys[0] = 0;
142
+ }
143
+
144
+ // Fit to the unit box: the primary is at the origin, so scale so the
145
+ // outermost circle edge lands on the box radius (0.5) and place the primary at
146
+ // the box centre.
147
+ let bound = 0;
148
+ for (let i = 0; i < count; i++) {
149
+ const reach = Math.hypot(xs[i] ?? 0, ys[i] ?? 0) + (radii[i] ?? 0);
150
+ if (reach > bound) bound = reach;
151
+ }
152
+ const scale = bound > EPSILON ? 0.5 / bound : 0.5;
153
+ const bubbles = new Array(count);
154
+ for (let i = 0; i < count; i++) {
155
+ bubbles[i] = {
156
+ cx: 0.5 + (xs[i] ?? 0) * scale,
157
+ cy: 0.5 + (ys[i] ?? 0) * scale,
158
+ d: 2 * (radii[i] ?? 0) * scale
159
+ };
160
+ }
161
+ return bubbles;
162
+ }
163
+
164
+ /**
165
+ * Deterministic cluster layout for `count` bubbles, as box-fraction bubbles
166
+ * ordered primary-first. `count` includes the `+N` overflow bubble when present
167
+ * (it is simply the last, smallest member of the pack).
168
+ *
169
+ * - `<= 0` → empty.
170
+ * - `1` → a single bubble filling the box.
171
+ * - `2` → the iMessage "one in front, one behind" pair: a larger primary set
172
+ * low-left with a smaller member tucked behind it to the upper-right.
173
+ * - `3` → an iMessage-style triangle: the larger primary along the bottom with
174
+ * two smaller members above it.
175
+ * - `4+` → the deterministic force-directed pack (primary centred, the rest
176
+ * packed magnetically around it, denser as the count grows).
177
+ */
178
+ export function computeClusterLayout(count) {
179
+ if (count <= 0) return [];
180
+ if (count === 1) return [{
181
+ cx: 0.5,
182
+ cy: 0.5,
183
+ d: 1
184
+ }];
185
+ if (count === 2) {
186
+ return [{
187
+ cx: 0.42,
188
+ cy: 0.56,
189
+ d: 0.66
190
+ }, {
191
+ cx: 0.68,
192
+ cy: 0.36,
193
+ d: 0.5
194
+ }];
195
+ }
196
+ if (count === 3) {
197
+ return [{
198
+ cx: 0.5,
199
+ cy: 0.69,
200
+ d: 0.54
201
+ }, {
202
+ cx: 0.285,
203
+ cy: 0.24,
204
+ d: 0.4
205
+ }, {
206
+ cx: 0.715,
207
+ cy: 0.24,
208
+ d: 0.4
209
+ }];
210
+ }
211
+ return packCluster(count);
212
+ }
213
+ //# sourceMappingURL=cluster-layout.js.map
@@ -0,0 +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","bound","reach","scale","bubbles","cx","cy","d","computeClusterLayout"],"sourceRoot":"../../../src","sources":["avatar-group/cluster-layout.ts"],"mappings":"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","ignoreList":[]}