@wallarm-org/design-system 2.1.3 → 2.2.0-rc-fix-overflow-list-api.2

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 (29) hide show
  1. package/dist/components/OverflowList/OverflowList.d.ts +18 -9
  2. package/dist/components/OverflowList/OverflowList.js +193 -204
  3. package/dist/components/OverflowList/OverflowListContext.d.ts +25 -0
  4. package/dist/components/OverflowList/OverflowListContext.js +12 -0
  5. package/dist/components/OverflowList/OverflowListMore.d.ts +17 -0
  6. package/dist/components/OverflowList/OverflowListMore.js +85 -0
  7. package/dist/components/OverflowList/OverflowListMoreContent.d.ts +7 -0
  8. package/dist/components/OverflowList/OverflowListMoreContent.js +60 -0
  9. package/dist/components/OverflowList/OverflowListMoreCount.d.ts +8 -0
  10. package/dist/components/OverflowList/OverflowListMoreCount.js +41 -0
  11. package/dist/components/OverflowList/OverflowListMoreHeader.d.ts +7 -0
  12. package/dist/components/OverflowList/OverflowListMoreHeader.js +36 -0
  13. package/dist/components/OverflowList/OverflowListMoreItems.d.ts +18 -0
  14. package/dist/components/OverflowList/OverflowListMoreItems.js +105 -0
  15. package/dist/components/OverflowList/OverflowListMoreTrigger.d.ts +10 -0
  16. package/dist/components/OverflowList/OverflowListMoreTrigger.js +143 -0
  17. package/dist/components/OverflowList/classes.d.ts +3 -0
  18. package/dist/components/OverflowList/classes.js +13 -0
  19. package/dist/components/OverflowList/index.d.ts +8 -1
  20. package/dist/components/OverflowList/index.js +7 -0
  21. package/dist/components/OverflowList/useOverflowListMore.d.ts +12 -0
  22. package/dist/components/OverflowList/useOverflowListMore.js +22 -0
  23. package/dist/components/Popover/index.d.ts +1 -1
  24. package/dist/components/Select/SelectInput/SelectInputOverflowRenderer.d.ts +1 -3
  25. package/dist/components/Select/SelectInput/SelectInputOverflowRenderer.js +16 -26
  26. package/dist/metadata/components.json +2049 -506
  27. package/package.json +1 -1
  28. package/dist/components/OverflowList/DefaultOverflowRenderer.d.ts +0 -17
  29. package/dist/components/OverflowList/DefaultOverflowRenderer.js +0 -179
@@ -1,22 +1,31 @@
1
1
  import { type HTMLAttributes, type ReactElement, type ReactNode } from 'react';
2
2
  import type { TestableProps } from '../../utils/testId.js';
3
3
  type CollapseDirection = 'start' | 'end';
4
- export interface ShowAllOverflowData<T> {
4
+ export interface OverflowListOverflowMeta<T> {
5
+ /** Full source list, in order. */
5
6
  allItems: T[];
6
- visibleCount: number;
7
- hiddenCount: number;
7
+ /** Items rendered in the row. Empty in the hidden measurement layer. */
8
+ visibleItems: T[];
8
9
  }
10
+ export type OverflowListRenderer<T> = (hiddenItems: T[], meta: OverflowListOverflowMeta<T>) => ReactNode;
9
11
  export interface OverflowListProps<T> extends HTMLAttributes<HTMLDivElement>, TestableProps {
12
+ /** Measurements are cached by array identity — keep it referentially stable. */
10
13
  items: T[];
11
14
  itemRenderer: (item: T, index: number) => ReactNode;
12
- overflowRenderer?: (data: ShowAllOverflowData<T>) => ReactNode;
13
- overflowHeaderLabel?: string;
14
- showAll?: boolean;
15
- overlayOrigin?: boolean;
16
- dimVisibleItems?: boolean;
15
+ /**
16
+ * Renders the overflow indicator. Also called once in the hidden measurement
17
+ * layer with every item hidden, so it must be pure. Compose it from the
18
+ * `OverflowListMore` parts; defaults to `<OverflowListMore />`.
19
+ */
20
+ overflowRenderer?: OverflowListRenderer<T>;
21
+ /** Keep at least this many items visible however narrow the row gets. */
17
22
  minVisibleItems?: number;
18
- onOverflow?: (items: T[]) => void;
23
+ onOverflow?: (hiddenItems: T[]) => void;
19
24
  collapseFrom?: CollapseDirection;
25
+ /**
26
+ * Call `overflowRenderer` even when nothing is hidden. `OverflowListMore`
27
+ * itself renders nothing at zero hidden items.
28
+ */
20
29
  alwaysRenderOverflow?: boolean;
21
30
  }
22
31
  export declare const OverflowList: <T>(props: OverflowListProps<T>) => ReactElement;
@@ -1,194 +1,124 @@
1
1
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
2
  import { c } from "react/compiler-runtime";
3
- import { memo, useEffect, useRef, useState } from "react";
3
+ import { memo, useEffect, useRef } from "react";
4
4
  import { useOverflowItems } from "../../hooks/index.js";
5
5
  import { cn } from "../../utils/cn.js";
6
- import { DefaultOverflowRenderer } from "./DefaultOverflowRenderer.js";
7
6
  import { OVERFLOW_RESERVE_SPACE, areItemsShallowEqual, resolveVisibleItems } from "./OverflowList.helpers.js";
7
+ import { OverflowListProvider } from "./OverflowListContext.js";
8
+ import { OverflowListMore } from "./OverflowListMore.js";
9
+ const NO_ITEMS = [];
10
+ const renderDefaultOverflow = ()=>/*#__PURE__*/ jsx(OverflowListMore, {});
8
11
  const OverflowListComponent = (t0)=>{
9
- const $ = c(71);
12
+ const $ = c(74);
10
13
  let className;
11
14
  let itemRenderer;
12
15
  let items;
13
16
  let onOverflow;
14
- let overflowHeaderLabel;
15
- let overflowRenderer;
16
17
  let props;
17
18
  let t1;
18
19
  let t2;
19
20
  let t3;
20
21
  let t4;
21
- let t5;
22
- let t6;
22
+ let testId;
23
23
  if ($[0] !== t0) {
24
- ({ items, itemRenderer, overflowRenderer, overflowHeaderLabel, showAll: t1, overlayOrigin: t2, dimVisibleItems: t3, className, collapseFrom: t4, minVisibleItems: t5, alwaysRenderOverflow: t6, onOverflow, ...props } = t0);
24
+ ({ items, itemRenderer, overflowRenderer: t1, className, collapseFrom: t2, minVisibleItems: t3, alwaysRenderOverflow: t4, onOverflow, "data-testid": testId, ...props } = t0);
25
25
  $[0] = t0;
26
26
  $[1] = className;
27
27
  $[2] = itemRenderer;
28
28
  $[3] = items;
29
29
  $[4] = onOverflow;
30
- $[5] = overflowHeaderLabel;
31
- $[6] = overflowRenderer;
32
- $[7] = props;
33
- $[8] = t1;
34
- $[9] = t2;
35
- $[10] = t3;
36
- $[11] = t4;
37
- $[12] = t5;
38
- $[13] = t6;
30
+ $[5] = props;
31
+ $[6] = t1;
32
+ $[7] = t2;
33
+ $[8] = t3;
34
+ $[9] = t4;
35
+ $[10] = testId;
39
36
  } else {
40
37
  className = $[1];
41
38
  itemRenderer = $[2];
42
39
  items = $[3];
43
40
  onOverflow = $[4];
44
- overflowHeaderLabel = $[5];
45
- overflowRenderer = $[6];
46
- props = $[7];
47
- t1 = $[8];
48
- t2 = $[9];
49
- t3 = $[10];
50
- t4 = $[11];
51
- t5 = $[12];
52
- t6 = $[13];
41
+ props = $[5];
42
+ t1 = $[6];
43
+ t2 = $[7];
44
+ t3 = $[8];
45
+ t4 = $[9];
46
+ testId = $[10];
53
47
  }
54
- const showAll = void 0 === t1 ? true : t1;
55
- const overlayOrigin = void 0 === t2 ? false : t2;
56
- const dimVisibleItems = void 0 === t3 ? true : t3;
57
- const collapseFrom = void 0 === t4 ? "end" : t4;
58
- const minVisibleItems = void 0 === t5 ? 0 : t5;
59
- const alwaysRenderOverflow = void 0 === t6 ? false : t6;
48
+ const overflowRenderer = void 0 === t1 ? renderDefaultOverflow : t1;
49
+ const collapseFrom = void 0 === t2 ? "end" : t2;
50
+ const minVisibleItems = void 0 === t3 ? 0 : t3;
51
+ const alwaysRenderOverflow = void 0 === t4 ? false : t4;
60
52
  let map;
61
- if ($[14] !== items) {
53
+ if ($[11] !== items) {
62
54
  map = new Map();
63
55
  items.forEach((item, index)=>{
64
56
  if (!map.has(item)) map.set(item, index);
65
57
  });
66
- $[14] = items;
67
- $[15] = map;
68
- } else map = $[15];
58
+ $[11] = items;
59
+ $[12] = map;
60
+ } else map = $[12];
69
61
  const indexMap = map;
70
- let t7;
62
+ let t5;
63
+ if ($[13] !== indexMap || $[14] !== itemRenderer) {
64
+ t5 = (item_0)=>itemRenderer(item_0, indexMap.get(item_0) ?? 0);
65
+ $[13] = indexMap;
66
+ $[14] = itemRenderer;
67
+ $[15] = t5;
68
+ } else t5 = $[15];
69
+ const memoizedItemRenderer = t5;
70
+ let t6;
71
71
  if ($[16] !== indexMap || $[17] !== itemRenderer) {
72
- t7 = (item_0)=>itemRenderer(item_0, indexMap.get(item_0) ?? 0);
72
+ t6 = (item_1)=>itemRenderer(item_1, indexMap.get(item_1) ?? 0);
73
73
  $[16] = indexMap;
74
74
  $[17] = itemRenderer;
75
- $[18] = t7;
76
- } else t7 = $[18];
77
- const memoizedItemRenderer = t7;
78
- let t8;
79
- if ($[19] !== indexMap || $[20] !== itemRenderer) {
80
- t8 = (item_1)=>itemRenderer(item_1, indexMap.get(item_1) ?? 0);
81
- $[19] = indexMap;
82
- $[20] = itemRenderer;
83
- $[21] = t8;
84
- } else t8 = $[21];
85
- const memoizedMeasurementRenderer = t8;
86
- const [overlayOffset, setOverlayOffset] = useState(0);
87
- const triggerRef = useRef(null);
88
- let t9;
89
- if ($[22] !== dimVisibleItems || $[23] !== itemRenderer || $[24] !== overflowHeaderLabel || $[25] !== overlayOffset || $[26] !== overlayOrigin || $[27] !== showAll) {
90
- t9 = (data)=>/*#__PURE__*/ jsx(DefaultOverflowRenderer, {
91
- data: data,
92
- itemRenderer: itemRenderer,
93
- overflowHeaderLabel: overflowHeaderLabel,
94
- showAll: showAll,
95
- overlayOrigin: overlayOrigin,
96
- dimVisibleItems: dimVisibleItems,
97
- overlayOffset: overlayOffset,
98
- triggerRef: triggerRef
75
+ $[18] = t6;
76
+ } else t6 = $[18];
77
+ const memoizedMeasurementRenderer = t6;
78
+ let t7;
79
+ if ($[19] !== overflowRenderer) {
80
+ t7 = (allItems)=>overflowRenderer(allItems, {
81
+ allItems,
82
+ visibleItems: NO_ITEMS
99
83
  });
100
- $[22] = dimVisibleItems;
101
- $[23] = itemRenderer;
102
- $[24] = overflowHeaderLabel;
103
- $[25] = overlayOffset;
104
- $[26] = overlayOrigin;
105
- $[27] = showAll;
106
- $[28] = t9;
107
- } else t9 = $[28];
108
- const defaultOverflowRenderer = t9;
109
- const finalOverflowRenderer = overflowRenderer ?? defaultOverflowRenderer;
110
- let t10;
111
- if ($[29] !== finalOverflowRenderer || $[30] !== items) {
112
- t10 = (hiddenItems)=>{
113
- const data_0 = {
114
- allItems: items,
115
- visibleCount: items.length - hiddenItems.length,
116
- hiddenCount: hiddenItems.length
117
- };
118
- return finalOverflowRenderer(data_0);
119
- };
120
- $[29] = finalOverflowRenderer;
121
- $[30] = items;
122
- $[31] = t10;
123
- } else t10 = $[31];
124
- const wrappedOverflowRenderer = t10;
125
- let t11;
126
- if ($[32] !== items || $[33] !== memoizedMeasurementRenderer || $[34] !== wrappedOverflowRenderer) {
127
- t11 = {
84
+ $[19] = overflowRenderer;
85
+ $[20] = t7;
86
+ } else t7 = $[20];
87
+ const measurementOverflowRenderer = t7;
88
+ let t8;
89
+ if ($[21] !== items || $[22] !== measurementOverflowRenderer || $[23] !== memoizedMeasurementRenderer) {
90
+ t8 = {
128
91
  items,
129
92
  renderItem: memoizedMeasurementRenderer,
130
- overflowRenderer: wrappedOverflowRenderer,
93
+ overflowRenderer: measurementOverflowRenderer,
131
94
  reserveSpace: OVERFLOW_RESERVE_SPACE
132
95
  };
133
- $[32] = items;
134
- $[33] = memoizedMeasurementRenderer;
135
- $[34] = wrappedOverflowRenderer;
136
- $[35] = t11;
137
- } else t11 = $[35];
138
- const { containerRef, visibleItems, hiddenItems: hiddenItems_0, MeasurementContainer } = useOverflowItems(t11);
139
- let t12;
140
- let t13;
141
- if ($[36] !== containerRef || $[37] !== overlayOrigin) {
142
- t12 = ()=>{
143
- if (!overlayOrigin || !containerRef.current || !triggerRef.current) return;
144
- const updateOffset = ()=>{
145
- if (containerRef.current && triggerRef.current) {
146
- const containerRect = containerRef.current.getBoundingClientRect();
147
- const triggerRect = triggerRef.current.getBoundingClientRect();
148
- const offset = -(triggerRect.left - containerRect.left);
149
- setOverlayOffset(offset);
150
- }
151
- };
152
- updateOffset();
153
- const resizeObserver = new ResizeObserver(updateOffset);
154
- resizeObserver.observe(containerRef.current);
155
- if (triggerRef.current) resizeObserver.observe(triggerRef.current);
156
- return ()=>resizeObserver.disconnect();
157
- };
158
- t13 = [
159
- overlayOrigin,
160
- containerRef
161
- ];
162
- $[36] = containerRef;
163
- $[37] = overlayOrigin;
164
- $[38] = t12;
165
- $[39] = t13;
166
- } else {
167
- t12 = $[38];
168
- t13 = $[39];
169
- }
170
- useEffect(t12, t13);
171
- let t14;
172
- if ($[40] !== hiddenItems_0 || $[41] !== items || $[42] !== minVisibleItems || $[43] !== visibleItems) {
173
- t14 = resolveVisibleItems({
96
+ $[21] = items;
97
+ $[22] = measurementOverflowRenderer;
98
+ $[23] = memoizedMeasurementRenderer;
99
+ $[24] = t8;
100
+ } else t8 = $[24];
101
+ const { containerRef, visibleItems, hiddenItems, MeasurementContainer } = useOverflowItems(t8);
102
+ let t9;
103
+ if ($[25] !== hiddenItems || $[26] !== items || $[27] !== minVisibleItems || $[28] !== visibleItems) {
104
+ t9 = resolveVisibleItems({
174
105
  items,
175
106
  visibleItems,
176
- hiddenItems: hiddenItems_0,
107
+ hiddenItems,
177
108
  minVisibleItems
178
109
  });
179
- $[40] = hiddenItems_0;
180
- $[41] = items;
181
- $[42] = minVisibleItems;
182
- $[43] = visibleItems;
183
- $[44] = t14;
184
- } else t14 = $[44];
185
- const { visibleItems: finalVisibleItems, hiddenItems: finalHiddenItems } = t14;
186
- const finalHiddenCount = finalHiddenItems.length;
110
+ $[25] = hiddenItems;
111
+ $[26] = items;
112
+ $[27] = minVisibleItems;
113
+ $[28] = visibleItems;
114
+ $[29] = t9;
115
+ } else t9 = $[29];
116
+ const { visibleItems: finalVisibleItems, hiddenItems: finalHiddenItems } = t9;
187
117
  const prevHiddenRef = useRef(null);
188
- let t15;
189
- let t16;
190
- if ($[45] !== finalHiddenItems || $[46] !== onOverflow) {
191
- t15 = ()=>{
118
+ let t10;
119
+ let t11;
120
+ if ($[30] !== finalHiddenItems || $[31] !== onOverflow) {
121
+ t10 = ()=>{
192
122
  if (!onOverflow || 0 === finalHiddenItems.length) {
193
123
  prevHiddenRef.current = finalHiddenItems;
194
124
  return;
@@ -196,97 +126,156 @@ const OverflowListComponent = (t0)=>{
196
126
  if (!areItemsShallowEqual(prevHiddenRef.current, finalHiddenItems)) onOverflow(finalHiddenItems);
197
127
  prevHiddenRef.current = finalHiddenItems;
198
128
  };
199
- t16 = [
129
+ t11 = [
200
130
  finalHiddenItems,
201
131
  onOverflow
202
132
  ];
203
- $[45] = finalHiddenItems;
204
- $[46] = onOverflow;
205
- $[47] = t15;
206
- $[48] = t16;
133
+ $[30] = finalHiddenItems;
134
+ $[31] = onOverflow;
135
+ $[32] = t10;
136
+ $[33] = t11;
207
137
  } else {
208
- t15 = $[47];
209
- t16 = $[48];
138
+ t10 = $[32];
139
+ t11 = $[33];
210
140
  }
211
- useEffect(t15, t16);
212
- let t17;
141
+ useEffect(t10, t11);
142
+ let t12;
143
+ if ($[34] !== containerRef || $[35] !== finalHiddenItems || $[36] !== finalVisibleItems || $[37] !== itemRenderer || $[38] !== items || $[39] !== testId) {
144
+ t12 = {
145
+ allItems: items,
146
+ visibleItems: finalVisibleItems,
147
+ hiddenItems: finalHiddenItems,
148
+ itemRenderer,
149
+ containerRef,
150
+ measuring: false,
151
+ testId
152
+ };
153
+ $[34] = containerRef;
154
+ $[35] = finalHiddenItems;
155
+ $[36] = finalVisibleItems;
156
+ $[37] = itemRenderer;
157
+ $[38] = items;
158
+ $[39] = testId;
159
+ $[40] = t12;
160
+ } else t12 = $[40];
161
+ const context = t12;
162
+ let t13;
163
+ if ($[41] !== containerRef || $[42] !== itemRenderer || $[43] !== items) {
164
+ t13 = {
165
+ allItems: items,
166
+ visibleItems: NO_ITEMS,
167
+ hiddenItems: items,
168
+ itemRenderer,
169
+ containerRef,
170
+ measuring: true,
171
+ testId: void 0
172
+ };
173
+ $[41] = containerRef;
174
+ $[42] = itemRenderer;
175
+ $[43] = items;
176
+ $[44] = t13;
177
+ } else t13 = $[44];
178
+ const measurementContext = t13;
179
+ let t14;
213
180
  bb0: {
214
- if (0 === finalHiddenCount && !alwaysRenderOverflow) {
215
- t17 = null;
181
+ if (0 === finalHiddenItems.length && !alwaysRenderOverflow) {
182
+ t14 = null;
216
183
  break bb0;
217
184
  }
218
- let t18;
219
- if ($[49] !== finalHiddenCount || $[50] !== finalOverflowRenderer || $[51] !== finalVisibleItems.length || $[52] !== items) {
220
- const overflowData = {
185
+ let t15;
186
+ if ($[45] !== finalHiddenItems || $[46] !== finalVisibleItems || $[47] !== items || $[48] !== overflowRenderer) {
187
+ t15 = overflowRenderer(finalHiddenItems, {
221
188
  allItems: items,
222
- visibleCount: finalVisibleItems.length,
223
- hiddenCount: finalHiddenCount
224
- };
225
- t18 = finalOverflowRenderer(overflowData);
226
- $[49] = finalHiddenCount;
227
- $[50] = finalOverflowRenderer;
228
- $[51] = finalVisibleItems.length;
229
- $[52] = items;
230
- $[53] = t18;
231
- } else t18 = $[53];
232
- t17 = t18;
189
+ visibleItems: finalVisibleItems
190
+ });
191
+ $[45] = finalHiddenItems;
192
+ $[46] = finalVisibleItems;
193
+ $[47] = items;
194
+ $[48] = overflowRenderer;
195
+ $[49] = t15;
196
+ } else t15 = $[49];
197
+ t14 = t15;
233
198
  }
234
- const overflowElement = t17;
199
+ const overflowElement = t14;
200
+ let t15;
201
+ if ($[50] !== finalVisibleItems || $[51] !== memoizedItemRenderer) {
202
+ t15 = finalVisibleItems.map(memoizedItemRenderer);
203
+ $[50] = finalVisibleItems;
204
+ $[51] = memoizedItemRenderer;
205
+ $[52] = t15;
206
+ } else t15 = $[52];
207
+ const visibleElements = t15;
208
+ let t16;
209
+ if ($[53] !== context || $[54] !== overflowElement) {
210
+ t16 = overflowElement && /*#__PURE__*/ jsx(OverflowListProvider, {
211
+ value: context,
212
+ children: overflowElement
213
+ });
214
+ $[53] = context;
215
+ $[54] = overflowElement;
216
+ $[55] = t16;
217
+ } else t16 = $[55];
218
+ const overflow = t16;
219
+ const t17 = measurementContext;
235
220
  let t18;
236
- if ($[54] !== finalVisibleItems || $[55] !== memoizedItemRenderer) {
237
- t18 = finalVisibleItems.map(memoizedItemRenderer);
238
- $[54] = finalVisibleItems;
239
- $[55] = memoizedItemRenderer;
240
- $[56] = t18;
241
- } else t18 = $[56];
242
- const visibleElements = t18;
221
+ if ($[56] !== MeasurementContainer) {
222
+ t18 = /*#__PURE__*/ jsx(MeasurementContainer, {});
223
+ $[56] = MeasurementContainer;
224
+ $[57] = t18;
225
+ } else t18 = $[57];
243
226
  let t19;
244
- if ($[57] !== MeasurementContainer) {
245
- t19 = /*#__PURE__*/ jsx(MeasurementContainer, {});
246
- $[57] = MeasurementContainer;
247
- $[58] = t19;
248
- } else t19 = $[58];
227
+ if ($[58] !== t17 || $[59] !== t18) {
228
+ t19 = /*#__PURE__*/ jsx(OverflowListProvider, {
229
+ value: t17,
230
+ children: t18
231
+ });
232
+ $[58] = t17;
233
+ $[59] = t18;
234
+ $[60] = t19;
235
+ } else t19 = $[60];
249
236
  let t20;
250
- if ($[59] !== className) {
237
+ if ($[61] !== className) {
251
238
  t20 = cn("flex w-full min-w-0", className);
252
- $[59] = className;
253
- $[60] = t20;
254
- } else t20 = $[60];
255
- const t21 = "start" === collapseFrom && overflowElement;
256
- const t22 = "end" === collapseFrom && overflowElement;
239
+ $[61] = className;
240
+ $[62] = t20;
241
+ } else t20 = $[62];
242
+ const t21 = "start" === collapseFrom && overflow;
243
+ const t22 = "end" === collapseFrom && overflow;
257
244
  let t23;
258
- if ($[61] !== containerRef || $[62] !== props || $[63] !== t20 || $[64] !== t21 || $[65] !== t22 || $[66] !== visibleElements) {
245
+ if ($[63] !== containerRef || $[64] !== props || $[65] !== t20 || $[66] !== t21 || $[67] !== t22 || $[68] !== testId || $[69] !== visibleElements) {
259
246
  t23 = /*#__PURE__*/ jsxs("div", {
247
+ ...props,
260
248
  ref: containerRef,
261
249
  "data-slot": "overflow-list",
250
+ "data-testid": testId,
262
251
  className: t20,
263
- ...props,
264
252
  children: [
265
253
  t21,
266
254
  visibleElements,
267
255
  t22
268
256
  ]
269
257
  });
270
- $[61] = containerRef;
271
- $[62] = props;
272
- $[63] = t20;
273
- $[64] = t21;
274
- $[65] = t22;
275
- $[66] = visibleElements;
276
- $[67] = t23;
277
- } else t23 = $[67];
258
+ $[63] = containerRef;
259
+ $[64] = props;
260
+ $[65] = t20;
261
+ $[66] = t21;
262
+ $[67] = t22;
263
+ $[68] = testId;
264
+ $[69] = visibleElements;
265
+ $[70] = t23;
266
+ } else t23 = $[70];
278
267
  let t24;
279
- if ($[68] !== t19 || $[69] !== t23) {
268
+ if ($[71] !== t19 || $[72] !== t23) {
280
269
  t24 = /*#__PURE__*/ jsxs(Fragment, {
281
270
  children: [
282
271
  t19,
283
272
  t23
284
273
  ]
285
274
  });
286
- $[68] = t19;
287
- $[69] = t23;
288
- $[70] = t24;
289
- } else t24 = $[70];
275
+ $[71] = t19;
276
+ $[72] = t23;
277
+ $[73] = t24;
278
+ } else t24 = $[73];
290
279
  return t24;
291
280
  };
292
281
  const OverflowList = /*#__PURE__*/ memo(OverflowListComponent);
@@ -0,0 +1,25 @@
1
+ import { type ReactNode, type RefObject } from 'react';
2
+ export interface OverflowListContextValue<T = unknown> {
3
+ /** Full source list, in order. */
4
+ allItems: T[];
5
+ /** Items rendered in the row. */
6
+ visibleItems: T[];
7
+ /** Items folded into the overflow indicator. */
8
+ hiddenItems: T[];
9
+ /** The list's own `itemRenderer`, reused by `OverflowListMoreItems`. */
10
+ itemRenderer: (item: T, index: number) => ReactNode;
11
+ /** The row element — the anchor for `OverflowListMore placement='cover'`. */
12
+ containerRef: RefObject<HTMLDivElement | null>;
13
+ /**
14
+ * True inside the hidden measurement layer. `OverflowListMore` parts render
15
+ * only the bare trigger chip there — no popover, no refs, no test ids.
16
+ */
17
+ measuring: boolean;
18
+ /** The list's `data-testid` — the base `OverflowListMore` derives `--more` from. */
19
+ testId: string | undefined;
20
+ }
21
+ export declare const OverflowListProvider: import("react").Provider<OverflowListContextValue<unknown> | null>;
22
+ export declare const useOverflowListContext: <T = unknown>() => OverflowListContextValue<T>;
23
+ export declare const OverflowListMoreTriggerRefProvider: import("react").Provider<RefObject<HTMLButtonElement | null> | null>;
24
+ /** The `OverflowListMore` trigger ref — `cover` placement anchors to its top edge. */
25
+ export declare const useOverflowListMoreTriggerRef: () => RefObject<HTMLButtonElement | null> | null;
@@ -0,0 +1,12 @@
1
+ import { createContext, useContext } from "react";
2
+ const OverflowListContext = createContext(null);
3
+ const OverflowListProvider = OverflowListContext.Provider;
4
+ const useOverflowListContext = ()=>{
5
+ const context = useContext(OverflowListContext);
6
+ if (!context) throw new Error("OverflowListMore parts must be rendered inside an OverflowList overflowRenderer");
7
+ return context;
8
+ };
9
+ const OverflowListMoreTriggerRefContext = createContext(null);
10
+ const OverflowListMoreTriggerRefProvider = OverflowListMoreTriggerRefContext.Provider;
11
+ const useOverflowListMoreTriggerRef = ()=>useContext(OverflowListMoreTriggerRefContext);
12
+ export { OverflowListMoreTriggerRefProvider, OverflowListProvider, useOverflowListContext, useOverflowListMoreTriggerRef };
@@ -0,0 +1,17 @@
1
+ import { type FC, type ReactNode } from 'react';
2
+ import { type TestableProps } from '../../utils/testId.js';
3
+ import { type PopoverProps } from '../Popover/index.js';
4
+ export interface OverflowListMoreProps extends Pick<PopoverProps, 'open' | 'onOpenChange'>, TestableProps {
5
+ /**
6
+ * Defaults to `<OverflowListMoreTrigger />` + `<OverflowListMoreContent />`.
7
+ * Compose from the `OverflowListMore*` parts only — they know to render a bare
8
+ * chip in the hidden measurement layer, where there is no popover root.
9
+ */
10
+ children?: ReactNode;
11
+ /**
12
+ * `trigger` — the popover opens below the "+N" chip.
13
+ * `cover` — the popover opens over the row, from the list's left edge.
14
+ */
15
+ placement?: 'trigger' | 'cover';
16
+ }
17
+ export declare const OverflowListMore: FC<OverflowListMoreProps>;
@@ -0,0 +1,85 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { c } from "react/compiler-runtime";
3
+ import { useRef } from "react";
4
+ import { TestIdProvider } from "../../utils/testId.js";
5
+ import { Popover } from "../Popover/index.js";
6
+ import { OverflowListMoreTriggerRefProvider, useOverflowListContext } from "./OverflowListContext.js";
7
+ import { OverflowListMoreContent } from "./OverflowListMoreContent.js";
8
+ import { OverflowListMoreTrigger } from "./OverflowListMoreTrigger.js";
9
+ const DEFAULT_CHILDREN = /*#__PURE__*/ jsxs(Fragment, {
10
+ children: [
11
+ /*#__PURE__*/ jsx(OverflowListMoreTrigger, {}),
12
+ /*#__PURE__*/ jsx(OverflowListMoreContent, {})
13
+ ]
14
+ });
15
+ const OverflowListMore = (t0)=>{
16
+ const $ = c(11);
17
+ const { children: t1, placement: t2, open, onOpenChange, "data-testid": testIdProp } = t0;
18
+ const children = void 0 === t1 ? DEFAULT_CHILDREN : t1;
19
+ const placement = void 0 === t2 ? "trigger" : t2;
20
+ const { hiddenItems, containerRef, measuring, testId: listTestId } = useOverflowListContext();
21
+ const testId = testIdProp ?? (listTestId ? `${listTestId}--more` : void 0);
22
+ const triggerRef = useRef(null);
23
+ if (measuring) {
24
+ let t3;
25
+ if ($[0] !== children) {
26
+ t3 = /*#__PURE__*/ jsx(TestIdProvider, {
27
+ value: void 0,
28
+ children: children
29
+ });
30
+ $[0] = children;
31
+ $[1] = t3;
32
+ } else t3 = $[1];
33
+ return t3;
34
+ }
35
+ if (0 === hiddenItems.length) return null;
36
+ let t3;
37
+ if ($[2] !== containerRef || $[3] !== placement) {
38
+ t3 = "cover" === placement ? {
39
+ placement: "bottom-start",
40
+ gutter: 0,
41
+ offset: {
42
+ mainAxis: 0,
43
+ crossAxis: 0
44
+ },
45
+ getAnchorElement: ()=>{
46
+ const container = containerRef.current;
47
+ if (!container) return null;
48
+ return {
49
+ contextElement: container,
50
+ getBoundingClientRect: ()=>{
51
+ const row = container.getBoundingClientRect();
52
+ const top = triggerRef.current?.getBoundingClientRect().top ?? row.top;
53
+ return new DOMRect(row.left, top, row.width, 0);
54
+ }
55
+ };
56
+ }
57
+ } : void 0;
58
+ $[2] = containerRef;
59
+ $[3] = placement;
60
+ $[4] = t3;
61
+ } else t3 = $[4];
62
+ const positioning = t3;
63
+ let t4;
64
+ if ($[5] !== children || $[6] !== onOpenChange || $[7] !== open || $[8] !== positioning || $[9] !== testId) {
65
+ t4 = /*#__PURE__*/ jsx(OverflowListMoreTriggerRefProvider, {
66
+ value: triggerRef,
67
+ children: /*#__PURE__*/ jsx(Popover, {
68
+ open: open,
69
+ onOpenChange: onOpenChange,
70
+ positioning: positioning,
71
+ "data-testid": testId,
72
+ children: children
73
+ })
74
+ });
75
+ $[5] = children;
76
+ $[6] = onOpenChange;
77
+ $[7] = open;
78
+ $[8] = positioning;
79
+ $[9] = testId;
80
+ $[10] = t4;
81
+ } else t4 = $[10];
82
+ return t4;
83
+ };
84
+ OverflowListMore.displayName = "OverflowListMore";
85
+ export { OverflowListMore };