@fluentui/priority-overflow 9.0.2 → 9.1.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.
@@ -1,217 +1,267 @@
1
+ var _groups, _groupId;
2
+ import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP } from './consts';
1
3
  import { debounce } from './debounce';
2
4
  import { createPriorityQueue } from './priorityQueue';
3
5
  /**
4
6
  * @internal
5
7
  * @returns overflow manager instance
6
- */
7
- export function createOverflowManager() {
8
- let container;
9
- let overflowMenu;
10
- // Set as true when resize observer is observing
11
- let observing = false;
12
- // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change
13
- let forceDispatch = false;
14
- const options = {
15
- padding: 10,
16
- overflowAxis: 'horizontal',
17
- overflowDirection: 'end',
18
- minimumVisible: 0,
19
- onUpdateItemVisibility: () => undefined,
20
- onUpdateOverflow: () => undefined
21
- };
22
- const overflowItems = {};
23
- const overflowGroups = {};
24
- const resizeObserver = new ResizeObserver(entries => {
25
- if (!entries[0] || !container) {
26
- return;
27
- }
28
- update();
29
- });
30
- const invisibleItemQueue = createPriorityQueue((a, b) => {
31
- const itemA = overflowItems[a];
32
- const itemB = overflowItems[b];
33
- // Higher priority at the top of the queue
34
- const priority = itemB.priority - itemA.priority;
35
- if (priority !== 0) {
36
- return priority;
37
- }
38
- const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
39
- // equal priority, use DOM order
40
- // eslint-disable-next-line no-bitwise
41
- return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
42
- });
43
- const visibleItemQueue = createPriorityQueue((a, b) => {
44
- const itemA = overflowItems[a];
45
- const itemB = overflowItems[b];
46
- // Lower priority at the top of the queue
47
- const priority = itemA.priority - itemB.priority;
48
- if (priority !== 0) {
49
- return priority;
50
- }
51
- const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;
52
- // equal priority, use DOM order
53
- // eslint-disable-next-line no-bitwise
54
- return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
55
- });
56
- const getOffsetSize = el => {
57
- return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;
58
- };
59
- const makeItemVisible = () => {
60
- const nextVisible = invisibleItemQueue.dequeue();
61
- visibleItemQueue.enqueue(nextVisible);
62
- const item = overflowItems[nextVisible];
63
- options.onUpdateItemVisibility({
64
- item,
65
- visible: true
66
- });
67
- if (item.groupId) {
68
- overflowGroups[item.groupId].invisibleItemIds.delete(item.id);
69
- overflowGroups[item.groupId].visibleItemIds.add(item.id);
70
- }
71
- return getOffsetSize(item.element);
72
- };
73
- const makeItemInvisible = () => {
74
- const nextInvisible = visibleItemQueue.dequeue();
75
- invisibleItemQueue.enqueue(nextInvisible);
76
- const item = overflowItems[nextInvisible];
77
- const width = getOffsetSize(item.element);
78
- options.onUpdateItemVisibility({
79
- item,
80
- visible: false
8
+ */ export function createOverflowManager() {
9
+ let container;
10
+ let overflowMenu;
11
+ // Set as true when resize observer is observing
12
+ let observing = false;
13
+ // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change
14
+ // Initially true to force dispatch on first mount
15
+ let forceDispatch = true;
16
+ const options = {
17
+ padding: 10,
18
+ overflowAxis: 'horizontal',
19
+ overflowDirection: 'end',
20
+ minimumVisible: 0,
21
+ onUpdateItemVisibility: ()=>undefined,
22
+ onUpdateOverflow: ()=>undefined
23
+ };
24
+ const overflowItems = {};
25
+ const overflowDividers = {};
26
+ const resizeObserver = new ResizeObserver((entries)=>{
27
+ if (!entries[0] || !container) {
28
+ return;
29
+ }
30
+ update();
81
31
  });
82
- if (item.groupId) {
83
- overflowGroups[item.groupId].visibleItemIds.delete(item.id);
84
- overflowGroups[item.groupId].invisibleItemIds.add(item.id);
85
- }
86
- return width;
87
- };
88
- const dispatchOverflowUpdate = () => {
89
- const visibleItemIds = visibleItemQueue.all();
90
- const invisibleItemIds = invisibleItemQueue.all();
91
- const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);
92
- const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);
93
- const groupVisibility = {};
94
- Object.entries(overflowGroups).forEach(([groupId, groupState]) => {
95
- if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {
96
- groupVisibility[groupId] = 'overflow';
97
- } else if (groupState.visibleItemIds.size === 0) {
98
- groupVisibility[groupId] = 'hidden';
99
- } else {
100
- groupVisibility[groupId] = 'visible';
101
- }
32
+ const getNextItem = (queueToDequeue, queueToEnqueue)=>{
33
+ const nextItem = queueToDequeue.dequeue();
34
+ queueToEnqueue.enqueue(nextItem);
35
+ return overflowItems[nextItem];
36
+ };
37
+ const createGroupManager = ()=>{
38
+ const groupVisibility = {};
39
+ const groups = {};
40
+ function updateGroupVisibility(groupId) {
41
+ const group = groups[groupId];
42
+ if (group.invisibleItemIds.size && group.visibleItemIds.size) {
43
+ groupVisibility[groupId] = 'overflow';
44
+ } else if (group.visibleItemIds.size === 0) {
45
+ groupVisibility[groupId] = 'hidden';
46
+ } else {
47
+ groupVisibility[groupId] = 'visible';
48
+ }
49
+ }
50
+ function isGroupVisible(groupId) {
51
+ return groupVisibility[groupId] === 'visible' || groupVisibility[groupId] === 'overflow';
52
+ }
53
+ return {
54
+ groupVisibility: ()=>groupVisibility,
55
+ isSingleItemVisible (itemId, groupId) {
56
+ return isGroupVisible(groupId) && groups[groupId].visibleItemIds.has(itemId) && groups[groupId].visibleItemIds.size === 1;
57
+ },
58
+ addItem (itemId, groupId) {
59
+ var _;
60
+ (_ = (_groups = groups)[_groupId = groupId]) !== null && _ !== void 0 ? _ : _groups[_groupId] = {
61
+ visibleItemIds: new Set(),
62
+ invisibleItemIds: new Set()
63
+ };
64
+ groups[groupId].visibleItemIds.add(itemId);
65
+ updateGroupVisibility(groupId);
66
+ },
67
+ removeItem (itemId, groupId) {
68
+ groups[groupId].invisibleItemIds.delete(itemId);
69
+ groups[groupId].visibleItemIds.delete(itemId);
70
+ updateGroupVisibility(groupId);
71
+ },
72
+ showItem (itemId, groupId) {
73
+ groups[groupId].invisibleItemIds.delete(itemId);
74
+ groups[groupId].visibleItemIds.add(itemId);
75
+ updateGroupVisibility(groupId);
76
+ },
77
+ hideItem (itemId, groupId) {
78
+ groups[groupId].invisibleItemIds.add(itemId);
79
+ groups[groupId].visibleItemIds.delete(itemId);
80
+ updateGroupVisibility(groupId);
81
+ }
82
+ };
83
+ };
84
+ const groupManager = createGroupManager();
85
+ const invisibleItemQueue = createPriorityQueue((a, b)=>{
86
+ const itemA = overflowItems[a];
87
+ const itemB = overflowItems[b];
88
+ // Higher priority at the top of the queue
89
+ const priority = itemB.priority - itemA.priority;
90
+ if (priority !== 0) {
91
+ return priority;
92
+ }
93
+ const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
94
+ // equal priority, use DOM order
95
+ // eslint-disable-next-line no-bitwise
96
+ return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
102
97
  });
103
- options.onUpdateOverflow({
104
- visibleItems,
105
- invisibleItems,
106
- groupVisibility
98
+ const visibleItemQueue = createPriorityQueue((a, b)=>{
99
+ const itemA = overflowItems[a];
100
+ const itemB = overflowItems[b];
101
+ // Lower priority at the top of the queue
102
+ const priority = itemA.priority - itemB.priority;
103
+ if (priority !== 0) {
104
+ return priority;
105
+ }
106
+ const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;
107
+ // equal priority, use DOM order
108
+ // eslint-disable-next-line no-bitwise
109
+ return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
107
110
  });
108
- };
109
- const processOverflowItems = () => {
110
- if (!container) {
111
- return false;
112
- }
113
- const availableSize = getOffsetSize(container) - options.padding;
114
- const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;
115
- // Snapshot of the visible/invisible state to compare for updates
116
- const visibleTop = visibleItemQueue.peek();
117
- const invisibleTop = invisibleItemQueue.peek();
118
- const visibleItemIds = visibleItemQueue.all();
119
- let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {
120
- const child = overflowItems[visibleItemId].element;
121
- return sum + getOffsetSize(child);
122
- }, 0);
123
- // Add items until available width is filled - can result in overflow
124
- while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {
125
- currentWidth += makeItemVisible();
126
- }
127
- // Remove items until there's no more overflow
128
- while (currentWidth > availableSize && visibleItemQueue.size() > 0) {
129
- if (visibleItemQueue.size() <= options.minimumVisible) {
130
- break;
131
- }
132
- currentWidth -= makeItemInvisible();
133
- }
134
- // make sure the overflow menu can fit
135
- if (visibleItemQueue.size() > options.minimumVisible && invisibleItemQueue.size() > 0 && currentWidth + overflowMenuOffset > availableSize) {
136
- makeItemInvisible();
137
- }
138
- // only update when the state of visible/invisible items has changed
139
- if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {
140
- return true;
141
- }
142
- return false;
143
- };
144
- const forceUpdate = () => {
145
- if (processOverflowItems() || forceDispatch) {
146
- forceDispatch = false;
147
- dispatchOverflowUpdate();
148
- }
149
- };
150
- const update = debounce(forceUpdate);
151
- const observe = (observedContainer, userOptions) => {
152
- Object.assign(options, userOptions);
153
- observing = true;
154
- Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));
155
- container = observedContainer;
156
- resizeObserver.observe(container);
157
- };
158
- const disconnect = () => {
159
- observing = false;
160
- resizeObserver.disconnect();
161
- };
162
- const addItem = item => {
163
- if (overflowItems[item.id]) {
164
- return;
165
- }
166
- overflowItems[item.id] = item;
167
- // some options can affect priority which are only set on `observe`
168
- if (observing) {
169
- // Updates to elements might not change the queue tops
170
- // i.e. new element is enqueued but the top of the queue stays the same
171
- // force a dispatch on the next batched update
172
- forceDispatch = true;
173
- visibleItemQueue.enqueue(item.id);
174
- }
175
- if (item.groupId) {
176
- if (!overflowGroups[item.groupId]) {
177
- overflowGroups[item.groupId] = {
178
- visibleItemIds: new Set(),
179
- invisibleItemIds: new Set()
180
- };
181
- }
182
- overflowGroups[item.groupId].visibleItemIds.add(item.id);
183
- }
184
- update();
185
- };
186
- const addOverflowMenu = el => {
187
- overflowMenu = el;
188
- };
189
- const removeOverflowMenu = () => {
190
- overflowMenu = undefined;
191
- };
192
- const removeItem = itemId => {
193
- if (!overflowItems[itemId]) {
194
- return;
195
- }
196
- const item = overflowItems[itemId];
197
- visibleItemQueue.remove(itemId);
198
- invisibleItemQueue.remove(itemId);
199
- if (item.groupId) {
200
- overflowGroups[item.groupId].visibleItemIds.delete(item.id);
201
- overflowGroups[item.groupId].invisibleItemIds.delete(item.id);
111
+ const getOffsetSize = (el)=>{
112
+ return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;
113
+ };
114
+ function computeSizeChange(entry) {
115
+ const dividerWidth = entry.groupId && groupManager.isSingleItemVisible(entry.id, entry.groupId) && overflowDividers[entry.groupId] ? getOffsetSize(overflowDividers[entry.groupId].element) : 0;
116
+ return getOffsetSize(entry.element) + dividerWidth;
202
117
  }
203
- delete overflowItems[itemId];
204
- update();
205
- };
206
- return {
207
- addItem,
208
- disconnect,
209
- forceUpdate,
210
- observe,
211
- removeItem,
212
- update,
213
- addOverflowMenu,
214
- removeOverflowMenu
215
- };
118
+ const showItem = ()=>{
119
+ const item = getNextItem(invisibleItemQueue, visibleItemQueue);
120
+ options.onUpdateItemVisibility({
121
+ item,
122
+ visible: true
123
+ });
124
+ if (item.groupId) {
125
+ groupManager.showItem(item.id, item.groupId);
126
+ if (groupManager.isSingleItemVisible(item.id, item.groupId)) {
127
+ var _overflowDividers_item_groupId;
128
+ (_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.removeAttribute(DATA_OVERFLOWING);
129
+ }
130
+ }
131
+ return computeSizeChange(item);
132
+ };
133
+ const hideItem = ()=>{
134
+ const item = getNextItem(visibleItemQueue, invisibleItemQueue);
135
+ const width = computeSizeChange(item);
136
+ options.onUpdateItemVisibility({
137
+ item,
138
+ visible: false
139
+ });
140
+ if (item.groupId) {
141
+ if (groupManager.isSingleItemVisible(item.id, item.groupId)) {
142
+ var _overflowDividers_item_groupId;
143
+ (_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.setAttribute(DATA_OVERFLOWING, '');
144
+ }
145
+ groupManager.hideItem(item.id, item.groupId);
146
+ }
147
+ return width;
148
+ };
149
+ const dispatchOverflowUpdate = ()=>{
150
+ const visibleItemIds = visibleItemQueue.all();
151
+ const invisibleItemIds = invisibleItemQueue.all();
152
+ const visibleItems = visibleItemIds.map((itemId)=>overflowItems[itemId]);
153
+ const invisibleItems = invisibleItemIds.map((itemId)=>overflowItems[itemId]);
154
+ options.onUpdateOverflow({
155
+ visibleItems,
156
+ invisibleItems,
157
+ groupVisibility: groupManager.groupVisibility()
158
+ });
159
+ };
160
+ const processOverflowItems = ()=>{
161
+ if (!container) {
162
+ return false;
163
+ }
164
+ const totalDividersWidth = Object.values(overflowDividers).map((dvdr)=>dvdr.groupId ? getOffsetSize(dvdr.element) : 0).reduce((prev, current)=>prev + current, 0);
165
+ const availableSize = getOffsetSize(container) - options.padding - totalDividersWidth - (overflowMenu ? getOffsetSize(overflowMenu) : 0);
166
+ // Snapshot of the visible/invisible state to compare for updates
167
+ const visibleTop = visibleItemQueue.peek();
168
+ const invisibleTop = invisibleItemQueue.peek();
169
+ let currentWidth = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);
170
+ // Add items until available width is filled - can result in overflow
171
+ while(currentWidth < availableSize && invisibleItemQueue.size() > 0){
172
+ currentWidth += showItem();
173
+ }
174
+ // Remove items until there's no more overflow
175
+ while(currentWidth > availableSize && visibleItemQueue.size() > options.minimumVisible){
176
+ currentWidth -= hideItem();
177
+ }
178
+ // only update when the state of visible/invisible items has changed
179
+ return visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop;
180
+ };
181
+ const forceUpdate = ()=>{
182
+ if (processOverflowItems() || forceDispatch) {
183
+ forceDispatch = false;
184
+ dispatchOverflowUpdate();
185
+ }
186
+ };
187
+ const update = debounce(forceUpdate);
188
+ const observe = (observedContainer, userOptions)=>{
189
+ Object.assign(options, userOptions);
190
+ observing = true;
191
+ Object.values(overflowItems).forEach((item)=>visibleItemQueue.enqueue(item.id));
192
+ container = observedContainer;
193
+ resizeObserver.observe(container);
194
+ };
195
+ const disconnect = ()=>{
196
+ observing = false;
197
+ resizeObserver.disconnect();
198
+ };
199
+ const addItem = (item)=>{
200
+ if (overflowItems[item.id]) {
201
+ return;
202
+ }
203
+ overflowItems[item.id] = item;
204
+ // some options can affect priority which are only set on `observe`
205
+ if (observing) {
206
+ // Updates to elements might not change the queue tops
207
+ // i.e. new element is enqueued but the top of the queue stays the same
208
+ // force a dispatch on the next batched update
209
+ forceDispatch = true;
210
+ visibleItemQueue.enqueue(item.id);
211
+ }
212
+ if (item.groupId) {
213
+ groupManager.addItem(item.id, item.groupId);
214
+ item.element.setAttribute(DATA_OVERFLOW_GROUP, item.groupId);
215
+ }
216
+ update();
217
+ };
218
+ const addOverflowMenu = (el)=>{
219
+ overflowMenu = el;
220
+ };
221
+ const addDivider = (divider)=>{
222
+ if (!divider.groupId || overflowDividers[divider.groupId]) {
223
+ return;
224
+ }
225
+ divider.element.setAttribute(DATA_OVERFLOW_GROUP, divider.groupId);
226
+ overflowDividers[divider.groupId] = divider;
227
+ };
228
+ const removeOverflowMenu = ()=>{
229
+ overflowMenu = undefined;
230
+ };
231
+ const removeDivider = (groupId)=>{
232
+ if (!overflowDividers[groupId]) {
233
+ return;
234
+ }
235
+ const divider = overflowDividers[groupId];
236
+ if (divider.groupId) {
237
+ delete overflowDividers[groupId];
238
+ divider.element.removeAttribute(DATA_OVERFLOW_GROUP);
239
+ }
240
+ };
241
+ const removeItem = (itemId)=>{
242
+ if (!overflowItems[itemId]) {
243
+ return;
244
+ }
245
+ const item = overflowItems[itemId];
246
+ visibleItemQueue.remove(itemId);
247
+ invisibleItemQueue.remove(itemId);
248
+ if (item.groupId) {
249
+ groupManager.removeItem(item.id, item.groupId);
250
+ item.element.removeAttribute(DATA_OVERFLOW_GROUP);
251
+ }
252
+ delete overflowItems[itemId];
253
+ update();
254
+ };
255
+ return {
256
+ addItem,
257
+ disconnect,
258
+ forceUpdate,
259
+ observe,
260
+ removeItem,
261
+ update,
262
+ addOverflowMenu,
263
+ removeOverflowMenu,
264
+ addDivider,
265
+ removeDivider
266
+ };
216
267
  }
217
- //# sourceMappingURL=overflowManager.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["debounce","createPriorityQueue","createOverflowManager","container","overflowMenu","observing","forceDispatch","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowGroups","resizeObserver","ResizeObserver","entries","update","invisibleItemQueue","a","b","itemA","itemB","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","visibleItemQueue","getOffsetSize","el","offsetWidth","offsetHeight","makeItemVisible","nextVisible","dequeue","enqueue","item","visible","groupId","invisibleItemIds","delete","id","visibleItemIds","add","makeItemInvisible","nextInvisible","width","dispatchOverflowUpdate","all","visibleItems","map","itemId","invisibleItems","groupVisibility","Object","forEach","groupState","size","processOverflowItems","availableSize","overflowMenuOffset","visibleTop","peek","invisibleTop","currentWidth","reduce","sum","visibleItemId","child","forceUpdate","observe","observedContainer","userOptions","assign","values","disconnect","addItem","Set","addOverflowMenu","removeOverflowMenu","removeItem","remove"],"sources":["../src/overflowManager.ts"],"sourcesContent":["import { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\nimport type { OverflowGroupState, OverflowItemEntry, OverflowManager, ObserveOptions } from './types';\n\n/**\n * @internal\n * @returns overflow manager instance\n */\nexport function createOverflowManager(): OverflowManager {\n let container: HTMLElement | undefined;\n let overflowMenu: HTMLElement | undefined;\n // Set as true when resize observer is observing\n let observing = false;\n // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change\n let forceDispatch = false;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowGroups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n const makeItemVisible = () => {\n const nextVisible = invisibleItemQueue.dequeue();\n visibleItemQueue.enqueue(nextVisible);\n\n const item = overflowItems[nextVisible];\n options.onUpdateItemVisibility({ item, visible: true });\n if (item.groupId) {\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n return getOffsetSize(item.element);\n };\n\n const makeItemInvisible = () => {\n const nextInvisible = visibleItemQueue.dequeue();\n invisibleItemQueue.enqueue(nextInvisible);\n\n const item = overflowItems[nextInvisible];\n const width = getOffsetSize(item.element);\n options.onUpdateItemVisibility({ item, visible: false });\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.add(item.id);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n const groupVisibility: Record<string, OverflowGroupState> = {};\n Object.entries(overflowGroups).forEach(([groupId, groupState]) => {\n if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (groupState.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n });\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const processOverflowItems = (): boolean => {\n if (!container) {\n return false;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n const visibleItemIds = visibleItemQueue.all();\n let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {\n const child = overflowItems[visibleItemId].element;\n return sum + getOffsetSize(child);\n }, 0);\n\n // Add items until available width is filled - can result in overflow\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += makeItemVisible();\n }\n\n // Remove items until there's no more overflow\n while (currentWidth > availableSize && visibleItemQueue.size() > 0) {\n if (visibleItemQueue.size() <= options.minimumVisible) {\n break;\n }\n currentWidth -= makeItemInvisible();\n }\n\n // make sure the overflow menu can fit\n if (\n visibleItemQueue.size() > options.minimumVisible &&\n invisibleItemQueue.size() > 0 &&\n currentWidth + overflowMenuOffset > availableSize\n ) {\n makeItemInvisible();\n }\n\n // only update when the state of visible/invisible items has changed\n if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {\n return true;\n }\n\n return false;\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (processOverflowItems() || forceDispatch) {\n forceDispatch = false;\n dispatchOverflowUpdate();\n }\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));\n\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n observing = false;\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n if (overflowItems[item.id]) {\n return;\n }\n\n overflowItems[item.id] = item;\n\n // some options can affect priority which are only set on `observe`\n if (observing) {\n // Updates to elements might not change the queue tops\n // i.e. new element is enqueued but the top of the queue stays the same\n // force a dispatch on the next batched update\n forceDispatch = true;\n visibleItemQueue.enqueue(item.id);\n }\n\n if (item.groupId) {\n if (!overflowGroups[item.groupId]) {\n overflowGroups[item.groupId] = {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n }\n\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n update();\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n overflowMenu = el;\n };\n\n const removeOverflowMenu: OverflowManager['removeOverflowMenu'] = () => {\n overflowMenu = undefined;\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n if (!overflowItems[itemId]) {\n return;\n }\n\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n addOverflowMenu,\n removeOverflowMenu,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"sources":["overflowManager.ts"],"sourcesContent":["import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP } from './consts';\nimport { debounce } from './debounce';\nimport { createPriorityQueue, PriorityQueue } from './priorityQueue';\nimport type {\n OverflowGroupState,\n OverflowItemEntry,\n OverflowManager,\n ObserveOptions,\n OverflowDividerEntry,\n} from './types';\n\n/**\n * @internal\n * @returns overflow manager instance\n */\nexport function createOverflowManager(): OverflowManager {\n let container: HTMLElement | undefined;\n let overflowMenu: HTMLElement | undefined;\n // Set as true when resize observer is observing\n let observing = false;\n // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change\n // Initially true to force dispatch on first mount\n let forceDispatch = true;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowDividers: Record<string, OverflowDividerEntry> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const getNextItem = (queueToDequeue: PriorityQueue<string>, queueToEnqueue: PriorityQueue<string>) => {\n const nextItem = queueToDequeue.dequeue();\n queueToEnqueue.enqueue(nextItem);\n return overflowItems[nextItem];\n };\n\n const createGroupManager = () => {\n const groupVisibility: Record<string, OverflowGroupState> = {};\n const groups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n function updateGroupVisibility(groupId: string) {\n const group = groups[groupId];\n if (group.invisibleItemIds.size && group.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (group.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n }\n function isGroupVisible(groupId: string) {\n return groupVisibility[groupId] === 'visible' || groupVisibility[groupId] === 'overflow';\n }\n return {\n groupVisibility: () => groupVisibility,\n isSingleItemVisible(itemId: string, groupId: string) {\n return (\n isGroupVisible(groupId) &&\n groups[groupId].visibleItemIds.has(itemId) &&\n groups[groupId].visibleItemIds.size === 1\n );\n },\n addItem(itemId: string, groupId: string) {\n groups[groupId] ??= {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n\n groups[groupId].visibleItemIds.add(itemId);\n updateGroupVisibility(groupId);\n },\n removeItem(itemId: string, groupId: string) {\n groups[groupId].invisibleItemIds.delete(itemId);\n groups[groupId].visibleItemIds.delete(itemId);\n updateGroupVisibility(groupId);\n },\n showItem(itemId: string, groupId: string) {\n groups[groupId].invisibleItemIds.delete(itemId);\n groups[groupId].visibleItemIds.add(itemId);\n updateGroupVisibility(groupId);\n },\n hideItem(itemId: string, groupId: string) {\n groups[groupId].invisibleItemIds.add(itemId);\n groups[groupId].visibleItemIds.delete(itemId);\n updateGroupVisibility(groupId);\n },\n };\n };\n\n const groupManager = createGroupManager();\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n function computeSizeChange(entry: OverflowItemEntry) {\n const dividerWidth =\n entry.groupId && groupManager.isSingleItemVisible(entry.id, entry.groupId) && overflowDividers[entry.groupId]\n ? getOffsetSize(overflowDividers[entry.groupId].element)\n : 0;\n\n return getOffsetSize(entry.element) + dividerWidth;\n }\n\n const showItem = () => {\n const item = getNextItem(invisibleItemQueue, visibleItemQueue);\n options.onUpdateItemVisibility({ item, visible: true });\n\n if (item.groupId) {\n groupManager.showItem(item.id, item.groupId);\n\n if (groupManager.isSingleItemVisible(item.id, item.groupId)) {\n overflowDividers[item.groupId]?.element.removeAttribute(DATA_OVERFLOWING);\n }\n }\n\n return computeSizeChange(item);\n };\n\n const hideItem = () => {\n const item = getNextItem(visibleItemQueue, invisibleItemQueue);\n const width = computeSizeChange(item);\n options.onUpdateItemVisibility({ item, visible: false });\n\n if (item.groupId) {\n if (groupManager.isSingleItemVisible(item.id, item.groupId)) {\n overflowDividers[item.groupId]?.element.setAttribute(DATA_OVERFLOWING, '');\n }\n\n groupManager.hideItem(item.id, item.groupId);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility: groupManager.groupVisibility() });\n };\n\n const processOverflowItems = (): boolean => {\n if (!container) {\n return false;\n }\n const totalDividersWidth = Object.values(overflowDividers)\n .map(dvdr => (dvdr.groupId ? getOffsetSize(dvdr.element) : 0))\n .reduce((prev, current) => prev + current, 0);\n\n const availableSize =\n getOffsetSize(container) -\n options.padding -\n totalDividersWidth -\n (overflowMenu ? getOffsetSize(overflowMenu) : 0);\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n let currentWidth = visibleItemQueue\n .all()\n .map(id => overflowItems[id].element)\n .map(getOffsetSize)\n .reduce((prev, current) => prev + current, 0);\n\n // Add items until available width is filled - can result in overflow\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += showItem();\n }\n\n // Remove items until there's no more overflow\n while (currentWidth > availableSize && visibleItemQueue.size() > options.minimumVisible) {\n currentWidth -= hideItem();\n }\n\n // only update when the state of visible/invisible items has changed\n return visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop;\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (processOverflowItems() || forceDispatch) {\n forceDispatch = false;\n dispatchOverflowUpdate();\n }\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));\n\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n observing = false;\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n if (overflowItems[item.id]) {\n return;\n }\n\n overflowItems[item.id] = item;\n\n // some options can affect priority which are only set on `observe`\n if (observing) {\n // Updates to elements might not change the queue tops\n // i.e. new element is enqueued but the top of the queue stays the same\n // force a dispatch on the next batched update\n forceDispatch = true;\n visibleItemQueue.enqueue(item.id);\n }\n\n if (item.groupId) {\n groupManager.addItem(item.id, item.groupId);\n item.element.setAttribute(DATA_OVERFLOW_GROUP, item.groupId);\n }\n\n update();\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n overflowMenu = el;\n };\n\n const addDivider: OverflowManager['addDivider'] = divider => {\n if (!divider.groupId || overflowDividers[divider.groupId]) {\n return;\n }\n\n divider.element.setAttribute(DATA_OVERFLOW_GROUP, divider.groupId);\n overflowDividers[divider.groupId] = divider;\n };\n\n const removeOverflowMenu: OverflowManager['removeOverflowMenu'] = () => {\n overflowMenu = undefined;\n };\n\n const removeDivider: OverflowManager['removeDivider'] = groupId => {\n if (!overflowDividers[groupId]) {\n return;\n }\n const divider = overflowDividers[groupId];\n if (divider.groupId) {\n delete overflowDividers[groupId];\n divider.element.removeAttribute(DATA_OVERFLOW_GROUP);\n }\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n if (!overflowItems[itemId]) {\n return;\n }\n\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n groupManager.removeItem(item.id, item.groupId);\n item.element.removeAttribute(DATA_OVERFLOW_GROUP);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n addOverflowMenu,\n removeOverflowMenu,\n addDivider,\n removeDivider,\n };\n}\n"],"names":["groups","groupId","DATA_OVERFLOWING","DATA_OVERFLOW_GROUP","debounce","createPriorityQueue","createOverflowManager","container","overflowMenu","observing","forceDispatch","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowDividers","resizeObserver","ResizeObserver","entries","update","getNextItem","queueToDequeue","queueToEnqueue","nextItem","dequeue","enqueue","createGroupManager","groupVisibility","updateGroupVisibility","group","invisibleItemIds","size","visibleItemIds","isGroupVisible","isSingleItemVisible","itemId","has","addItem","Set","add","removeItem","delete","showItem","hideItem","groupManager","invisibleItemQueue","a","b","itemA","itemB","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","visibleItemQueue","getOffsetSize","el","offsetWidth","offsetHeight","computeSizeChange","entry","dividerWidth","id","item","visible","removeAttribute","width","setAttribute","dispatchOverflowUpdate","all","visibleItems","map","invisibleItems","processOverflowItems","totalDividersWidth","Object","values","dvdr","reduce","prev","current","availableSize","visibleTop","peek","invisibleTop","currentWidth","forceUpdate","observe","observedContainer","userOptions","assign","forEach","disconnect","addOverflowMenu","addDivider","divider","removeOverflowMenu","removeDivider","remove"],"mappings":"IA0EQA,SAAOC;AA1Ef,SAASC,gBAAgB,EAAEC,mBAAmB,QAAQ,WAAW;AACjE,SAASC,QAAQ,QAAQ,aAAa;AACtC,SAASC,mBAAmB,QAAuB,kBAAkB;AASrE;;;CAGC,GACD,OAAO,SAASC,wBAAyC;IACvD,IAAIC;IACJ,IAAIC;IACJ,gDAAgD;IAChD,IAAIC,YAAY,KAAK;IACrB,+FAA+F;IAC/F,kDAAkD;IAClD,IAAIC,gBAAgB,IAAI;IACxB,MAAMC,UAAoC;QACxCC,SAAS;QACTC,cAAc;QACdC,mBAAmB;QACnBC,gBAAgB;QAChBC,wBAAwB,IAAMC;QAC9BC,kBAAkB,IAAMD;IAC1B;IAEA,MAAME,gBAAmD,CAAC;IAC1D,MAAMC,mBAAyD,CAAC;IAChE,MAAMC,iBAAiB,IAAIC,eAAeC,CAAAA,UAAW;QACnD,IAAI,CAACA,OAAO,CAAC,EAAE,IAAI,CAAChB,WAAW;YAC7B;QACF,CAAC;QAEDiB;IACF;IAEA,MAAMC,cAAc,CAACC,gBAAuCC,iBAA0C;QACpG,MAAMC,WAAWF,eAAeG,OAAO;QACvCF,eAAeG,OAAO,CAACF;QACvB,OAAOT,aAAa,CAACS,SAAS;IAChC;IAEA,MAAMG,qBAAqB,IAAM;QAC/B,MAAMC,kBAAsD,CAAC;QAC7D,MAAMhC,SAAyF,CAAC;QAChG,SAASiC,sBAAsBhC,OAAe,EAAE;YAC9C,MAAMiC,QAAQlC,MAAM,CAACC,QAAQ;YAC7B,IAAIiC,MAAMC,gBAAgB,CAACC,IAAI,IAAIF,MAAMG,cAAc,CAACD,IAAI,EAAE;gBAC5DJ,eAAe,CAAC/B,QAAQ,GAAG;YAC7B,OAAO,IAAIiC,MAAMG,cAAc,CAACD,IAAI,KAAK,GAAG;gBAC1CJ,eAAe,CAAC/B,QAAQ,GAAG;YAC7B,OAAO;gBACL+B,eAAe,CAAC/B,QAAQ,GAAG;YAC7B,CAAC;QACH;QACA,SAASqC,eAAerC,OAAe,EAAE;YACvC,OAAO+B,eAAe,CAAC/B,QAAQ,KAAK,aAAa+B,eAAe,CAAC/B,QAAQ,KAAK;QAChF;QACA,OAAO;YACL+B,iBAAiB,IAAMA;YACvBO,qBAAoBC,MAAc,EAAEvC,OAAe,EAAE;gBACnD,OACEqC,eAAerC,YACfD,MAAM,CAACC,QAAQ,CAACoC,cAAc,CAACI,GAAG,CAACD,WACnCxC,MAAM,CAACC,QAAQ,CAACoC,cAAc,CAACD,IAAI,KAAK;YAE5C;YACAM,SAAQF,MAAc,EAAEvC,OAAe,EAAE;;gBACvCD,MAAAA,UAAAA,OAAM,CAACC,WAAAA,QAAQ,iCAAfD,OAAM,CAACC,SAAQ,GAAK;oBAClBoC,gBAAgB,IAAIM;oBACpBR,kBAAkB,IAAIQ;gBACxB,CAAC;gBAED3C,MAAM,CAACC,QAAQ,CAACoC,cAAc,CAACO,GAAG,CAACJ;gBACnCP,sBAAsBhC;YACxB;YACA4C,YAAWL,MAAc,EAAEvC,OAAe,EAAE;gBAC1CD,MAAM,CAACC,QAAQ,CAACkC,gBAAgB,CAACW,MAAM,CAACN;gBACxCxC,MAAM,CAACC,QAAQ,CAACoC,cAAc,CAACS,MAAM,CAACN;gBACtCP,sBAAsBhC;YACxB;YACA8C,UAASP,MAAc,EAAEvC,OAAe,EAAE;gBACxCD,MAAM,CAACC,QAAQ,CAACkC,gBAAgB,CAACW,MAAM,CAACN;gBACxCxC,MAAM,CAACC,QAAQ,CAACoC,cAAc,CAACO,GAAG,CAACJ;gBACnCP,sBAAsBhC;YACxB;YACA+C,UAASR,MAAc,EAAEvC,OAAe,EAAE;gBACxCD,MAAM,CAACC,QAAQ,CAACkC,gBAAgB,CAACS,GAAG,CAACJ;gBACrCxC,MAAM,CAACC,QAAQ,CAACoC,cAAc,CAACS,MAAM,CAACN;gBACtCP,sBAAsBhC;YACxB;QACF;IACF;IAEA,MAAMgD,eAAelB;IAErB,MAAMmB,qBAAqB7C,oBAA4B,CAAC8C,GAAGC,IAAM;QAC/D,MAAMC,QAAQlC,aAAa,CAACgC,EAAE;QAC9B,MAAMG,QAAQnC,aAAa,CAACiC,EAAE;QAC9B,0CAA0C;QAC1C,MAAMG,WAAWD,MAAMC,QAAQ,GAAGF,MAAME,QAAQ;QAChD,IAAIA,aAAa,GAAG;YAClB,OAAOA;QACT,CAAC;QAED,MAAMC,oBACJ7C,QAAQG,iBAAiB,KAAK,QAAQ2C,KAAKC,2BAA2B,GAAGD,KAAKE,2BAA2B;QAE3G,gCAAgC;QAChC,sCAAsC;QACtC,OAAON,MAAMO,OAAO,CAACC,uBAAuB,CAACP,MAAMM,OAAO,IAAIJ,oBAAoB,CAAC,IAAI,CAAC;IAC1F;IAEA,MAAMM,mBAAmBzD,oBAA4B,CAAC8C,GAAGC,IAAM;QAC7D,MAAMC,QAAQlC,aAAa,CAACgC,EAAE;QAC9B,MAAMG,QAAQnC,aAAa,CAACiC,EAAE;QAC9B,yCAAyC;QACzC,MAAMG,WAAWF,MAAME,QAAQ,GAAGD,MAAMC,QAAQ;QAEhD,IAAIA,aAAa,GAAG;YAClB,OAAOA;QACT,CAAC;QAED,MAAMC,oBACJ7C,QAAQG,iBAAiB,KAAK,QAAQ2C,KAAKE,2BAA2B,GAAGF,KAAKC,2BAA2B;QAE3G,gCAAgC;QAChC,sCAAsC;QACtC,OAAOL,MAAMO,OAAO,CAACC,uBAAuB,CAACP,MAAMM,OAAO,IAAIJ,oBAAoB,CAAC,IAAI,CAAC;IAC1F;IAEA,MAAMO,gBAAgB,CAACC,KAAoB;QACzC,OAAOrD,QAAQE,YAAY,KAAK,eAAemD,GAAGC,WAAW,GAAGD,GAAGE,YAAY;IACjF;IAEA,SAASC,kBAAkBC,KAAwB,EAAE;QACnD,MAAMC,eACJD,MAAMnE,OAAO,IAAIgD,aAAaV,mBAAmB,CAAC6B,MAAME,EAAE,EAAEF,MAAMnE,OAAO,KAAKmB,gBAAgB,CAACgD,MAAMnE,OAAO,CAAC,GACzG8D,cAAc3C,gBAAgB,CAACgD,MAAMnE,OAAO,CAAC,CAAC2D,OAAO,IACrD,CAAC;QAEP,OAAOG,cAAcK,MAAMR,OAAO,IAAIS;IACxC;IAEA,MAAMtB,WAAW,IAAM;QACrB,MAAMwB,OAAO9C,YAAYyB,oBAAoBY;QAC7CnD,QAAQK,sBAAsB,CAAC;YAAEuD;YAAMC,SAAS,IAAI;QAAC;QAErD,IAAID,KAAKtE,OAAO,EAAE;YAChBgD,aAAaF,QAAQ,CAACwB,KAAKD,EAAE,EAAEC,KAAKtE,OAAO;YAE3C,IAAIgD,aAAaV,mBAAmB,CAACgC,KAAKD,EAAE,EAAEC,KAAKtE,OAAO,GAAG;oBAC3DmB;gBAAAA,CAAAA,iCAAAA,gBAAgB,CAACmD,KAAKtE,OAAO,CAAC,cAA9BmB,4CAAAA,KAAAA,IAAAA,+BAAgCwC,QAAQa,eAAe,CAACvE,iBAAiB;YAC3E,CAAC;QACH,CAAC;QAED,OAAOiE,kBAAkBI;IAC3B;IAEA,MAAMvB,WAAW,IAAM;QACrB,MAAMuB,OAAO9C,YAAYqC,kBAAkBZ;QAC3C,MAAMwB,QAAQP,kBAAkBI;QAChC5D,QAAQK,sBAAsB,CAAC;YAAEuD;YAAMC,SAAS,KAAK;QAAC;QAEtD,IAAID,KAAKtE,OAAO,EAAE;YAChB,IAAIgD,aAAaV,mBAAmB,CAACgC,KAAKD,EAAE,EAAEC,KAAKtE,OAAO,GAAG;oBAC3DmB;gBAAAA,CAAAA,iCAAAA,gBAAgB,CAACmD,KAAKtE,OAAO,CAAC,cAA9BmB,4CAAAA,KAAAA,IAAAA,+BAAgCwC,QAAQe,YAAY,CAACzE,kBAAkB,GAAG;YAC5E,CAAC;YAED+C,aAAaD,QAAQ,CAACuB,KAAKD,EAAE,EAAEC,KAAKtE,OAAO;QAC7C,CAAC;QAED,OAAOyE;IACT;IAEA,MAAME,yBAAyB,IAAM;QACnC,MAAMvC,iBAAiByB,iBAAiBe,GAAG;QAC3C,MAAM1C,mBAAmBe,mBAAmB2B,GAAG;QAE/C,MAAMC,eAAezC,eAAe0C,GAAG,CAACvC,CAAAA,SAAUrB,aAAa,CAACqB,OAAO;QACvE,MAAMwC,iBAAiB7C,iBAAiB4C,GAAG,CAACvC,CAAAA,SAAUrB,aAAa,CAACqB,OAAO;QAE3E7B,QAAQO,gBAAgB,CAAC;YAAE4D;YAAcE;YAAgBhD,iBAAiBiB,aAAajB,eAAe;QAAG;IAC3G;IAEA,MAAMiD,uBAAuB,IAAe;QAC1C,IAAI,CAAC1E,WAAW;YACd,OAAO,KAAK;QACd,CAAC;QACD,MAAM2E,qBAAqBC,OAAOC,MAAM,CAAChE,kBACtC2D,GAAG,CAACM,CAAAA,OAASA,KAAKpF,OAAO,GAAG8D,cAAcsB,KAAKzB,OAAO,IAAI,CAAC,EAC3D0B,MAAM,CAAC,CAACC,MAAMC,UAAYD,OAAOC,SAAS;QAE7C,MAAMC,gBACJ1B,cAAcxD,aACdI,QAAQC,OAAO,GACfsE,qBACC1E,CAAAA,eAAeuD,cAAcvD,gBAAgB,CAAC,AAAD;QAEhD,iEAAiE;QACjE,MAAMkF,aAAa5B,iBAAiB6B,IAAI;QACxC,MAAMC,eAAe1C,mBAAmByC,IAAI;QAE5C,IAAIE,eAAe/B,iBAChBe,GAAG,GACHE,GAAG,CAACT,CAAAA,KAAMnD,aAAa,CAACmD,GAAG,CAACV,OAAO,EACnCmB,GAAG,CAAChB,eACJuB,MAAM,CAAC,CAACC,MAAMC,UAAYD,OAAOC,SAAS;QAE7C,qEAAqE;QACrE,MAAOK,eAAeJ,iBAAiBvC,mBAAmBd,IAAI,KAAK,EAAG;YACpEyD,gBAAgB9C;QAClB;QAEA,8CAA8C;QAC9C,MAAO8C,eAAeJ,iBAAiB3B,iBAAiB1B,IAAI,KAAKzB,QAAQI,cAAc,CAAE;YACvF8E,gBAAgB7C;QAClB;QAEA,oEAAoE;QACpE,OAAOc,iBAAiB6B,IAAI,OAAOD,cAAcxC,mBAAmByC,IAAI,OAAOC;IACjF;IAEA,MAAME,cAA8C,IAAM;QACxD,IAAIb,0BAA0BvE,eAAe;YAC3CA,gBAAgB,KAAK;YACrBkE;QACF,CAAC;IACH;IAEA,MAAMpD,SAAoCpB,SAAS0F;IAEnD,MAAMC,UAAsC,CAACC,mBAAmBC,cAAgB;QAC9Ed,OAAOe,MAAM,CAACvF,SAASsF;QACvBxF,YAAY,IAAI;QAChB0E,OAAOC,MAAM,CAACjE,eAAegF,OAAO,CAAC5B,CAAAA,OAAQT,iBAAiBhC,OAAO,CAACyC,KAAKD,EAAE;QAE7E/D,YAAYyF;QACZ3E,eAAe0E,OAAO,CAACxF;IACzB;IAEA,MAAM6F,aAA4C,IAAM;QACtD3F,YAAY,KAAK;QACjBY,eAAe+E,UAAU;IAC3B;IAEA,MAAM1D,UAAsC6B,CAAAA,OAAQ;QAClD,IAAIpD,aAAa,CAACoD,KAAKD,EAAE,CAAC,EAAE;YAC1B;QACF,CAAC;QAEDnD,aAAa,CAACoD,KAAKD,EAAE,CAAC,GAAGC;QAEzB,mEAAmE;QACnE,IAAI9D,WAAW;YACb,sDAAsD;YACtD,uEAAuE;YACvE,8CAA8C;YAC9CC,gBAAgB,IAAI;YACpBoD,iBAAiBhC,OAAO,CAACyC,KAAKD,EAAE;QAClC,CAAC;QAED,IAAIC,KAAKtE,OAAO,EAAE;YAChBgD,aAAaP,OAAO,CAAC6B,KAAKD,EAAE,EAAEC,KAAKtE,OAAO;YAC1CsE,KAAKX,OAAO,CAACe,YAAY,CAACxE,qBAAqBoE,KAAKtE,OAAO;QAC7D,CAAC;QAEDuB;IACF;IAEA,MAAM6E,kBAAsDrC,CAAAA,KAAM;QAChExD,eAAewD;IACjB;IAEA,MAAMsC,aAA4CC,CAAAA,UAAW;QAC3D,IAAI,CAACA,QAAQtG,OAAO,IAAImB,gBAAgB,CAACmF,QAAQtG,OAAO,CAAC,EAAE;YACzD;QACF,CAAC;QAEDsG,QAAQ3C,OAAO,CAACe,YAAY,CAACxE,qBAAqBoG,QAAQtG,OAAO;QACjEmB,gBAAgB,CAACmF,QAAQtG,OAAO,CAAC,GAAGsG;IACtC;IAEA,MAAMC,qBAA4D,IAAM;QACtEhG,eAAeS;IACjB;IAEA,MAAMwF,gBAAkDxG,CAAAA,UAAW;QACjE,IAAI,CAACmB,gBAAgB,CAACnB,QAAQ,EAAE;YAC9B;QACF,CAAC;QACD,MAAMsG,UAAUnF,gBAAgB,CAACnB,QAAQ;QACzC,IAAIsG,QAAQtG,OAAO,EAAE;YACnB,OAAOmB,gBAAgB,CAACnB,QAAQ;YAChCsG,QAAQ3C,OAAO,CAACa,eAAe,CAACtE;QAClC,CAAC;IACH;IAEA,MAAM0C,aAA4CL,CAAAA,SAAU;QAC1D,IAAI,CAACrB,aAAa,CAACqB,OAAO,EAAE;YAC1B;QACF,CAAC;QAED,MAAM+B,OAAOpD,aAAa,CAACqB,OAAO;QAClCsB,iBAAiB4C,MAAM,CAAClE;QACxBU,mBAAmBwD,MAAM,CAAClE;QAE1B,IAAI+B,KAAKtE,OAAO,EAAE;YAChBgD,aAAaJ,UAAU,CAAC0B,KAAKD,EAAE,EAAEC,KAAKtE,OAAO;YAC7CsE,KAAKX,OAAO,CAACa,eAAe,CAACtE;QAC/B,CAAC;QAED,OAAOgB,aAAa,CAACqB,OAAO;QAC5BhB;IACF;IAEA,OAAO;QACLkB;QACA0D;QACAN;QACAC;QACAlD;QACArB;QACA6E;QACAG;QACAF;QACAG;IACF;AACF,CAAC"}