@fluentui/priority-overflow 9.1.2 → 9.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.json CHANGED
@@ -2,7 +2,37 @@
2
2
  "name": "@fluentui/priority-overflow",
3
3
  "entries": [
4
4
  {
5
- "date": "Tue, 25 Jul 2023 13:26:18 GMT",
5
+ "date": "Fri, 11 Aug 2023 12:10:19 GMT",
6
+ "tag": "@fluentui/priority-overflow_v9.1.4",
7
+ "version": "9.1.4",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "author": "vkozlova@microsoft.com",
12
+ "package": "@fluentui/priority-overflow",
13
+ "commit": "b52b54415c4d663885710fc113166be24d810742",
14
+ "comment": "fix: flickering in Overflow"
15
+ }
16
+ ]
17
+ }
18
+ },
19
+ {
20
+ "date": "Wed, 09 Aug 2023 13:16:48 GMT",
21
+ "tag": "@fluentui/priority-overflow_v9.1.3",
22
+ "version": "9.1.3",
23
+ "comments": {
24
+ "patch": [
25
+ {
26
+ "author": "vkozlova@microsoft.com",
27
+ "package": "@fluentui/priority-overflow",
28
+ "commit": "6247214bde5df11e951247f0a6d1278cc98490ea",
29
+ "comment": "fix: inaccurate calculation of size"
30
+ }
31
+ ]
32
+ }
33
+ },
34
+ {
35
+ "date": "Tue, 25 Jul 2023 13:29:15 GMT",
6
36
  "tag": "@fluentui/priority-overflow_v9.1.2",
7
37
  "version": "9.1.2",
8
38
  "comments": {
package/CHANGELOG.md CHANGED
@@ -1,12 +1,30 @@
1
1
  # Change Log - @fluentui/priority-overflow
2
2
 
3
- This log was last generated on Tue, 25 Jul 2023 13:26:18 GMT and should not be manually modified.
3
+ This log was last generated on Fri, 11 Aug 2023 12:10:19 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## [9.1.4](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.1.4)
8
+
9
+ Fri, 11 Aug 2023 12:10:19 GMT
10
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.1.3..@fluentui/priority-overflow_v9.1.4)
11
+
12
+ ### Patches
13
+
14
+ - fix: flickering in Overflow ([PR #28767](https://github.com/microsoft/fluentui/pull/28767) by vkozlova@microsoft.com)
15
+
16
+ ## [9.1.3](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.1.3)
17
+
18
+ Wed, 09 Aug 2023 13:16:48 GMT
19
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.1.2..@fluentui/priority-overflow_v9.1.3)
20
+
21
+ ### Patches
22
+
23
+ - fix: inaccurate calculation of size ([PR #28728](https://github.com/microsoft/fluentui/pull/28728) by vkozlova@microsoft.com)
24
+
7
25
  ## [9.1.2](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.1.2)
8
26
 
9
- Tue, 25 Jul 2023 13:26:18 GMT
27
+ Tue, 25 Jul 2023 13:29:15 GMT
10
28
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.1.1..@fluentui/priority-overflow_v9.1.2)
11
29
 
12
30
  ### Patches
@@ -1,4 +1,3 @@
1
- var _groups, _groupId;
2
1
  import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP } from './consts';
3
2
  import { debounce } from './debounce';
4
3
  import { createPriorityQueue } from './priorityQueue';
@@ -59,6 +58,7 @@ import { createPriorityQueue } from './priorityQueue';
59
58
  return isGroupVisible(groupId) && groups[groupId].visibleItemIds.has(itemId) && groups[groupId].visibleItemIds.size === 1;
60
59
  },
61
60
  addItem (itemId, groupId) {
61
+ var _groups, _groupId;
62
62
  var _;
63
63
  (_ = (_groups = groups)[_groupId = groupId]) !== null && _ !== void 0 ? _ : _groups[_groupId] = {
64
64
  visibleItemIds: new Set(),
@@ -85,43 +85,34 @@ import { createPriorityQueue } from './priorityQueue';
85
85
  };
86
86
  };
87
87
  const groupManager = createGroupManager();
88
- const invisibleItemQueue = createPriorityQueue((a, b)=>{
89
- const itemA = overflowItems[a];
90
- const itemB = overflowItems[b];
91
- // Higher priority at the top of the queue
92
- const priority = itemB.priority - itemA.priority;
93
- if (priority !== 0) {
94
- return priority;
88
+ function compareItems(lt, rt) {
89
+ if (!lt || !rt) {
90
+ return 0;
95
91
  }
96
- const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
97
- // equal priority, use DOM order
98
- // eslint-disable-next-line no-bitwise
99
- return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
100
- });
101
- const visibleItemQueue = createPriorityQueue((a, b)=>{
102
- const itemA = overflowItems[a];
103
- const itemB = overflowItems[b];
104
- // Lower priority at the top of the queue
105
- const priority = itemA.priority - itemB.priority;
106
- if (priority !== 0) {
107
- return priority;
92
+ const lte = overflowItems[lt];
93
+ const rte = overflowItems[rt];
94
+ if (lte.priority !== rte.priority) {
95
+ return lte.priority > rte.priority ? 1 : -1;
108
96
  }
109
- const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;
110
- // equal priority, use DOM order
97
+ const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
111
98
  // eslint-disable-next-line no-bitwise
112
- return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
113
- });
114
- const getOffsetSize = (el)=>{
115
- if (sizeCache.has(el)) {
116
- return sizeCache.get(el);
99
+ return lte.element.compareDocumentPosition(rte.element) & positionStatusBit ? 1 : -1;
100
+ }
101
+ function getElementAxisSize(horizontal, vertical, el) {
102
+ if (!sizeCache.has(el)) {
103
+ sizeCache.set(el, options.overflowAxis === 'horizontal' ? el[horizontal] : el[vertical]);
117
104
  }
118
- const offsetSize = options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;
119
- sizeCache.set(el, offsetSize);
120
- return offsetSize;
121
- };
122
- function computeSizeChange(entry) {
123
- const dividerWidth = entry.groupId && groupManager.isSingleItemVisible(entry.id, entry.groupId) && overflowDividers[entry.groupId] ? getOffsetSize(overflowDividers[entry.groupId].element) : 0;
124
- return getOffsetSize(entry.element) + dividerWidth;
105
+ return sizeCache.get(el);
106
+ }
107
+ const getOffsetSize = getElementAxisSize.bind(null, 'offsetWidth', 'offsetHeight');
108
+ const getClientSize = getElementAxisSize.bind(null, 'clientWidth', 'clientHeight');
109
+ const invisibleItemQueue = createPriorityQueue((a, b)=>-1 * compareItems(a, b));
110
+ const visibleItemQueue = createPriorityQueue(compareItems);
111
+ function occupiedSize() {
112
+ const totalItemSize = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);
113
+ const totalDividerSize = Object.entries(groupManager.groupVisibility()).reduce((acc, [id, state])=>acc + (state !== 'hidden' && overflowDividers[id] ? getOffsetSize(overflowDividers[id].element) : 0), 0);
114
+ const overflowMenuSize = invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;
115
+ return totalItemSize + totalDividerSize + overflowMenuSize;
125
116
  }
126
117
  const showItem = ()=>{
127
118
  const item = getNextItem(invisibleItemQueue, visibleItemQueue);
@@ -136,11 +127,9 @@ import { createPriorityQueue } from './priorityQueue';
136
127
  (_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.removeAttribute(DATA_OVERFLOWING);
137
128
  }
138
129
  }
139
- return computeSizeChange(item);
140
130
  };
141
131
  const hideItem = ()=>{
142
132
  const item = getNextItem(visibleItemQueue, invisibleItemQueue);
143
- const width = computeSizeChange(item);
144
133
  options.onUpdateItemVisibility({
145
134
  item,
146
135
  visible: false
@@ -152,7 +141,6 @@ import { createPriorityQueue } from './priorityQueue';
152
141
  }
153
142
  groupManager.hideItem(item.id, item.groupId);
154
143
  }
155
- return width;
156
144
  };
157
145
  const dispatchOverflowUpdate = ()=>{
158
146
  const visibleItemIds = visibleItemQueue.all();
@@ -170,25 +158,24 @@ import { createPriorityQueue } from './priorityQueue';
170
158
  return false;
171
159
  }
172
160
  sizeCache.clear();
173
- const totalDividersWidth = Object.values(overflowDividers).map((dvdr)=>dvdr.groupId ? getOffsetSize(dvdr.element) : 0).reduce((prev, current)=>prev + current, 0);
174
- function overflowMenuSize() {
175
- return invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;
176
- }
177
- const availableSize = getOffsetSize(container) - totalDividersWidth - options.padding;
161
+ const availableSize = getClientSize(container) - options.padding;
178
162
  // Snapshot of the visible/invisible state to compare for updates
179
163
  const visibleTop = visibleItemQueue.peek();
180
164
  const invisibleTop = invisibleItemQueue.peek();
181
- let currentSize = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);
165
+ while(compareItems(invisibleItemQueue.peek(), visibleItemQueue.peek()) > 0){
166
+ hideItem(); // hide elements whose priority become smaller than the highest priority of the hidden one
167
+ }
182
168
  // Run the show/hide step twice - the first step might not be correct if
183
169
  // it was triggered by a new item being added - new items are always visible by default.
184
170
  for(let i = 0; i < 2; i++){
185
171
  // Add items until available width is filled - can result in overflow
186
- while(currentSize + overflowMenuSize() < availableSize && invisibleItemQueue.size() > 0){
187
- currentSize += showItem();
172
+ while(occupiedSize() < availableSize && invisibleItemQueue.size() > 0 || invisibleItemQueue.size() === 1 // attempt to show the last invisible item hoping it's size does not exceed overflow menu size
173
+ ){
174
+ showItem();
188
175
  }
189
176
  // Remove items until there's no more overflow
190
- while(currentSize + overflowMenuSize() > availableSize && visibleItemQueue.size() > options.minimumVisible){
191
- currentSize -= hideItem();
177
+ while(occupiedSize() > availableSize && visibleItemQueue.size() > options.minimumVisible){
178
+ hideItem();
192
179
  }
193
180
  }
194
181
  // only update when the state of visible/invisible items has changed
@@ -1 +1 @@
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 // calls to `offsetWidth or offsetHeight` can happen multiple times in an update\n // Use a cache to avoid causing too many recalcs and avoid scripting time to meausure sizes\n const sizeCache = new Map<HTMLElement, number>();\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 if (sizeCache.has(el)) {\n return sizeCache.get(el)!;\n }\n\n const offsetSize = options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n sizeCache.set(el, offsetSize);\n return offsetSize;\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 sizeCache.clear();\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 function overflowMenuSize() {\n return invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;\n }\n\n const availableSize = getOffsetSize(container) - totalDividersWidth - options.padding;\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 currentSize = visibleItemQueue\n .all()\n .map(id => overflowItems[id].element)\n .map(getOffsetSize)\n .reduce((prev, current) => prev + current, 0);\n\n // Run the show/hide step twice - the first step might not be correct if\n // it was triggered by a new item being added - new items are always visible by default.\n for (let i = 0; i < 2; i++) {\n // Add items until available width is filled - can result in overflow\n while (currentSize + overflowMenuSize() < availableSize && invisibleItemQueue.size() > 0) {\n currentSize += showItem();\n }\n\n // Remove items until there's no more overflow\n while (currentSize + overflowMenuSize() > availableSize && visibleItemQueue.size() > options.minimumVisible) {\n currentSize -= hideItem();\n }\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 sizeCache.clear();\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 sizeCache.delete(item.element);\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","sizeCache","Map","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","get","offsetSize","offsetWidth","offsetHeight","set","computeSizeChange","entry","dividerWidth","id","item","visible","removeAttribute","width","setAttribute","dispatchOverflowUpdate","all","visibleItems","map","invisibleItems","processOverflowItems","clear","totalDividersWidth","Object","values","dvdr","reduce","prev","current","overflowMenuSize","availableSize","visibleTop","peek","invisibleTop","currentSize","i","forceUpdate","observe","observedContainer","userOptions","assign","forEach","disconnect","addOverflowMenu","addDivider","divider","removeOverflowMenu","removeDivider","remove"],"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 // calls to `offsetWidth or offsetHeight` can happen multiple times in an update\n // Use a cache to avoid causing too many recalcs and avoid scripting time to meausure sizes\n const sizeCache = new Map<HTMLElement, number>();\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 function compareItems(lt: string | null, rt: string | null): number {\n if (!lt || !rt) {\n return 0;\n }\n\n const lte = overflowItems[lt];\n const rte = overflowItems[rt];\n\n if (lte.priority !== rte.priority) {\n return lte.priority > rte.priority ? 1 : -1;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // eslint-disable-next-line no-bitwise\n return lte.element.compareDocumentPosition(rte.element) & positionStatusBit ? 1 : -1;\n }\n\n function getElementAxisSize(\n horizontal: 'clientWidth' | 'offsetWidth',\n vertical: 'clientHeight' | 'offsetHeight',\n el: HTMLElement,\n ): number {\n if (!sizeCache.has(el)) {\n sizeCache.set(el, options.overflowAxis === 'horizontal' ? el[horizontal] : el[vertical]);\n }\n\n return sizeCache.get(el)!;\n }\n\n const getOffsetSize = getElementAxisSize.bind(null, 'offsetWidth', 'offsetHeight');\n const getClientSize = getElementAxisSize.bind(null, 'clientWidth', 'clientHeight');\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => -1 * compareItems(a, b));\n\n const visibleItemQueue = createPriorityQueue<string>(compareItems);\n\n function occupiedSize(): number {\n const totalItemSize = visibleItemQueue\n .all()\n .map(id => overflowItems[id].element)\n .map(getOffsetSize)\n .reduce((prev, current) => prev + current, 0);\n\n const totalDividerSize = Object.entries(groupManager.groupVisibility()).reduce(\n (acc, [id, state]) =>\n acc + (state !== 'hidden' && overflowDividers[id] ? getOffsetSize(overflowDividers[id].element) : 0),\n 0,\n );\n\n const overflowMenuSize = invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;\n\n return totalItemSize + totalDividerSize + overflowMenuSize;\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\n const hideItem = () => {\n const item = getNextItem(visibleItemQueue, invisibleItemQueue);\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\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 sizeCache.clear();\n\n const availableSize = getClientSize(container) - options.padding;\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n while (compareItems(invisibleItemQueue.peek(), visibleItemQueue.peek()) > 0) {\n hideItem(); // hide elements whose priority become smaller than the highest priority of the hidden one\n }\n\n // Run the show/hide step twice - the first step might not be correct if\n // it was triggered by a new item being added - new items are always visible by default.\n for (let i = 0; i < 2; i++) {\n // Add items until available width is filled - can result in overflow\n while (\n (occupiedSize() < availableSize && invisibleItemQueue.size() > 0) ||\n invisibleItemQueue.size() === 1 // attempt to show the last invisible item hoping it's size does not exceed overflow menu size\n ) {\n showItem();\n }\n\n // Remove items until there's no more overflow\n while (occupiedSize() > availableSize && visibleItemQueue.size() > options.minimumVisible) {\n hideItem();\n }\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 sizeCache.clear();\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 sizeCache.delete(item.element);\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":["DATA_OVERFLOWING","DATA_OVERFLOW_GROUP","debounce","createPriorityQueue","createOverflowManager","sizeCache","Map","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","groups","updateGroupVisibility","groupId","group","invisibleItemIds","size","visibleItemIds","isGroupVisible","isSingleItemVisible","itemId","has","addItem","Set","add","removeItem","delete","showItem","hideItem","groupManager","compareItems","lt","rt","lte","rte","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","getElementAxisSize","horizontal","vertical","el","set","get","getOffsetSize","bind","getClientSize","invisibleItemQueue","a","b","visibleItemQueue","occupiedSize","totalItemSize","all","map","id","reduce","prev","current","totalDividerSize","Object","acc","state","overflowMenuSize","item","visible","removeAttribute","setAttribute","dispatchOverflowUpdate","visibleItems","invisibleItems","processOverflowItems","clear","availableSize","visibleTop","peek","invisibleTop","i","forceUpdate","observe","observedContainer","userOptions","assign","values","forEach","disconnect","addOverflowMenu","addDivider","divider","removeOverflowMenu","removeDivider","remove"],"mappings":"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"}
@@ -9,7 +9,6 @@ Object.defineProperty(exports, "createOverflowManager", {
9
9
  const _consts = require("./consts");
10
10
  const _debounce = require("./debounce");
11
11
  const _priorityQueue = require("./priorityQueue");
12
- var _groups, _groupId;
13
12
  function createOverflowManager() {
14
13
  // calls to `offsetWidth or offsetHeight` can happen multiple times in an update
15
14
  // Use a cache to avoid causing too many recalcs and avoid scripting time to meausure sizes
@@ -64,6 +63,7 @@ function createOverflowManager() {
64
63
  return isGroupVisible(groupId) && groups[groupId].visibleItemIds.has(itemId) && groups[groupId].visibleItemIds.size === 1;
65
64
  },
66
65
  addItem (itemId, groupId) {
66
+ var _groups, _groupId;
67
67
  var _;
68
68
  (_ = (_groups = groups)[_groupId = groupId]) !== null && _ !== void 0 ? _ : _groups[_groupId] = {
69
69
  visibleItemIds: new Set(),
@@ -90,43 +90,34 @@ function createOverflowManager() {
90
90
  };
91
91
  };
92
92
  const groupManager = createGroupManager();
93
- const invisibleItemQueue = (0, _priorityQueue.createPriorityQueue)((a, b)=>{
94
- const itemA = overflowItems[a];
95
- const itemB = overflowItems[b];
96
- // Higher priority at the top of the queue
97
- const priority = itemB.priority - itemA.priority;
98
- if (priority !== 0) {
99
- return priority;
93
+ function compareItems(lt, rt) {
94
+ if (!lt || !rt) {
95
+ return 0;
100
96
  }
101
- const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
102
- // equal priority, use DOM order
103
- // eslint-disable-next-line no-bitwise
104
- return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
105
- });
106
- const visibleItemQueue = (0, _priorityQueue.createPriorityQueue)((a, b)=>{
107
- const itemA = overflowItems[a];
108
- const itemB = overflowItems[b];
109
- // Lower priority at the top of the queue
110
- const priority = itemA.priority - itemB.priority;
111
- if (priority !== 0) {
112
- return priority;
97
+ const lte = overflowItems[lt];
98
+ const rte = overflowItems[rt];
99
+ if (lte.priority !== rte.priority) {
100
+ return lte.priority > rte.priority ? 1 : -1;
113
101
  }
114
- const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;
115
- // equal priority, use DOM order
102
+ const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
116
103
  // eslint-disable-next-line no-bitwise
117
- return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
118
- });
119
- const getOffsetSize = (el)=>{
120
- if (sizeCache.has(el)) {
121
- return sizeCache.get(el);
104
+ return lte.element.compareDocumentPosition(rte.element) & positionStatusBit ? 1 : -1;
105
+ }
106
+ function getElementAxisSize(horizontal, vertical, el) {
107
+ if (!sizeCache.has(el)) {
108
+ sizeCache.set(el, options.overflowAxis === 'horizontal' ? el[horizontal] : el[vertical]);
122
109
  }
123
- const offsetSize = options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;
124
- sizeCache.set(el, offsetSize);
125
- return offsetSize;
126
- };
127
- function computeSizeChange(entry) {
128
- const dividerWidth = entry.groupId && groupManager.isSingleItemVisible(entry.id, entry.groupId) && overflowDividers[entry.groupId] ? getOffsetSize(overflowDividers[entry.groupId].element) : 0;
129
- return getOffsetSize(entry.element) + dividerWidth;
110
+ return sizeCache.get(el);
111
+ }
112
+ const getOffsetSize = getElementAxisSize.bind(null, 'offsetWidth', 'offsetHeight');
113
+ const getClientSize = getElementAxisSize.bind(null, 'clientWidth', 'clientHeight');
114
+ const invisibleItemQueue = (0, _priorityQueue.createPriorityQueue)((a, b)=>-1 * compareItems(a, b));
115
+ const visibleItemQueue = (0, _priorityQueue.createPriorityQueue)(compareItems);
116
+ function occupiedSize() {
117
+ const totalItemSize = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);
118
+ const totalDividerSize = Object.entries(groupManager.groupVisibility()).reduce((acc, [id, state])=>acc + (state !== 'hidden' && overflowDividers[id] ? getOffsetSize(overflowDividers[id].element) : 0), 0);
119
+ const overflowMenuSize = invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;
120
+ return totalItemSize + totalDividerSize + overflowMenuSize;
130
121
  }
131
122
  const showItem = ()=>{
132
123
  const item = getNextItem(invisibleItemQueue, visibleItemQueue);
@@ -141,11 +132,9 @@ function createOverflowManager() {
141
132
  (_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.removeAttribute(_consts.DATA_OVERFLOWING);
142
133
  }
143
134
  }
144
- return computeSizeChange(item);
145
135
  };
146
136
  const hideItem = ()=>{
147
137
  const item = getNextItem(visibleItemQueue, invisibleItemQueue);
148
- const width = computeSizeChange(item);
149
138
  options.onUpdateItemVisibility({
150
139
  item,
151
140
  visible: false
@@ -157,7 +146,6 @@ function createOverflowManager() {
157
146
  }
158
147
  groupManager.hideItem(item.id, item.groupId);
159
148
  }
160
- return width;
161
149
  };
162
150
  const dispatchOverflowUpdate = ()=>{
163
151
  const visibleItemIds = visibleItemQueue.all();
@@ -175,25 +163,24 @@ function createOverflowManager() {
175
163
  return false;
176
164
  }
177
165
  sizeCache.clear();
178
- const totalDividersWidth = Object.values(overflowDividers).map((dvdr)=>dvdr.groupId ? getOffsetSize(dvdr.element) : 0).reduce((prev, current)=>prev + current, 0);
179
- function overflowMenuSize() {
180
- return invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;
181
- }
182
- const availableSize = getOffsetSize(container) - totalDividersWidth - options.padding;
166
+ const availableSize = getClientSize(container) - options.padding;
183
167
  // Snapshot of the visible/invisible state to compare for updates
184
168
  const visibleTop = visibleItemQueue.peek();
185
169
  const invisibleTop = invisibleItemQueue.peek();
186
- let currentSize = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);
170
+ while(compareItems(invisibleItemQueue.peek(), visibleItemQueue.peek()) > 0){
171
+ hideItem(); // hide elements whose priority become smaller than the highest priority of the hidden one
172
+ }
187
173
  // Run the show/hide step twice - the first step might not be correct if
188
174
  // it was triggered by a new item being added - new items are always visible by default.
189
175
  for(let i = 0; i < 2; i++){
190
176
  // Add items until available width is filled - can result in overflow
191
- while(currentSize + overflowMenuSize() < availableSize && invisibleItemQueue.size() > 0){
192
- currentSize += showItem();
177
+ while(occupiedSize() < availableSize && invisibleItemQueue.size() > 0 || invisibleItemQueue.size() === 1 // attempt to show the last invisible item hoping it's size does not exceed overflow menu size
178
+ ){
179
+ showItem();
193
180
  }
194
181
  // Remove items until there's no more overflow
195
- while(currentSize + overflowMenuSize() > availableSize && visibleItemQueue.size() > options.minimumVisible){
196
- currentSize -= hideItem();
182
+ while(occupiedSize() > availableSize && visibleItemQueue.size() > options.minimumVisible){
183
+ hideItem();
197
184
  }
198
185
  }
199
186
  // only update when the state of visible/invisible items has changed
@@ -1 +1 @@
1
- {"version":3,"sources":["overflowManager.js"],"sourcesContent":["var _groups, _groupId;\nimport { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP } from './consts';\nimport { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\n/**\n * @internal\n * @returns overflow manager instance\n */ export function createOverflowManager() {\n // calls to `offsetWidth or offsetHeight` can happen multiple times in an update\n // Use a cache to avoid causing too many recalcs and avoid scripting time to meausure sizes\n const sizeCache = new Map();\n let container;\n let overflowMenu;\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 = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: ()=>undefined,\n onUpdateOverflow: ()=>undefined\n };\n const overflowItems = {};\n const overflowDividers = {};\n const resizeObserver = new ResizeObserver((entries)=>{\n if (!entries[0] || !container) {\n return;\n }\n update();\n });\n const getNextItem = (queueToDequeue, queueToEnqueue)=>{\n const nextItem = queueToDequeue.dequeue();\n queueToEnqueue.enqueue(nextItem);\n return overflowItems[nextItem];\n };\n const createGroupManager = ()=>{\n const groupVisibility = {};\n const groups = {};\n function updateGroupVisibility(groupId) {\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) {\n return groupVisibility[groupId] === 'visible' || groupVisibility[groupId] === 'overflow';\n }\n return {\n groupVisibility: ()=>groupVisibility,\n isSingleItemVisible (itemId, groupId) {\n return isGroupVisible(groupId) && groups[groupId].visibleItemIds.has(itemId) && groups[groupId].visibleItemIds.size === 1;\n },\n addItem (itemId, groupId) {\n var _;\n (_ = (_groups = groups)[_groupId = groupId]) !== null && _ !== void 0 ? _ : _groups[_groupId] = {\n visibleItemIds: new Set(),\n invisibleItemIds: new Set()\n };\n groups[groupId].visibleItemIds.add(itemId);\n updateGroupVisibility(groupId);\n },\n removeItem (itemId, groupId) {\n groups[groupId].invisibleItemIds.delete(itemId);\n groups[groupId].visibleItemIds.delete(itemId);\n updateGroupVisibility(groupId);\n },\n showItem (itemId, groupId) {\n groups[groupId].invisibleItemIds.delete(itemId);\n groups[groupId].visibleItemIds.add(itemId);\n updateGroupVisibility(groupId);\n },\n hideItem (itemId, groupId) {\n groups[groupId].invisibleItemIds.add(itemId);\n groups[groupId].visibleItemIds.delete(itemId);\n updateGroupVisibility(groupId);\n }\n };\n };\n const groupManager = createGroupManager();\n const invisibleItemQueue = createPriorityQueue((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 const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\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 const visibleItemQueue = createPriorityQueue((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 if (priority !== 0) {\n return priority;\n }\n const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\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 const getOffsetSize = (el)=>{\n if (sizeCache.has(el)) {\n return sizeCache.get(el);\n }\n const offsetSize = options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n sizeCache.set(el, offsetSize);\n return offsetSize;\n };\n function computeSizeChange(entry) {\n const dividerWidth = entry.groupId && groupManager.isSingleItemVisible(entry.id, entry.groupId) && overflowDividers[entry.groupId] ? getOffsetSize(overflowDividers[entry.groupId].element) : 0;\n return getOffsetSize(entry.element) + dividerWidth;\n }\n const showItem = ()=>{\n const item = getNextItem(invisibleItemQueue, visibleItemQueue);\n options.onUpdateItemVisibility({\n item,\n visible: true\n });\n if (item.groupId) {\n groupManager.showItem(item.id, item.groupId);\n if (groupManager.isSingleItemVisible(item.id, item.groupId)) {\n var _overflowDividers_item_groupId;\n (_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.removeAttribute(DATA_OVERFLOWING);\n }\n }\n return computeSizeChange(item);\n };\n const hideItem = ()=>{\n const item = getNextItem(visibleItemQueue, invisibleItemQueue);\n const width = computeSizeChange(item);\n options.onUpdateItemVisibility({\n item,\n visible: false\n });\n if (item.groupId) {\n if (groupManager.isSingleItemVisible(item.id, item.groupId)) {\n var _overflowDividers_item_groupId;\n (_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.setAttribute(DATA_OVERFLOWING, '');\n }\n groupManager.hideItem(item.id, item.groupId);\n }\n return width;\n };\n const dispatchOverflowUpdate = ()=>{\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n const visibleItems = visibleItemIds.map((itemId)=>overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map((itemId)=>overflowItems[itemId]);\n options.onUpdateOverflow({\n visibleItems,\n invisibleItems,\n groupVisibility: groupManager.groupVisibility()\n });\n };\n const processOverflowItems = ()=>{\n if (!container) {\n return false;\n }\n sizeCache.clear();\n const totalDividersWidth = Object.values(overflowDividers).map((dvdr)=>dvdr.groupId ? getOffsetSize(dvdr.element) : 0).reduce((prev, current)=>prev + current, 0);\n function overflowMenuSize() {\n return invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;\n }\n const availableSize = getOffsetSize(container) - totalDividersWidth - options.padding;\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n let currentSize = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);\n // Run the show/hide step twice - the first step might not be correct if\n // it was triggered by a new item being added - new items are always visible by default.\n for(let i = 0; i < 2; i++){\n // Add items until available width is filled - can result in overflow\n while(currentSize + overflowMenuSize() < availableSize && invisibleItemQueue.size() > 0){\n currentSize += showItem();\n }\n // Remove items until there's no more overflow\n while(currentSize + overflowMenuSize() > availableSize && visibleItemQueue.size() > options.minimumVisible){\n currentSize -= 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 const forceUpdate = ()=>{\n if (processOverflowItems() || forceDispatch) {\n forceDispatch = false;\n dispatchOverflowUpdate();\n }\n };\n const update = debounce(forceUpdate);\n const observe = (observedContainer, userOptions)=>{\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach((item)=>visibleItemQueue.enqueue(item.id));\n container = observedContainer;\n resizeObserver.observe(container);\n };\n const disconnect = ()=>{\n observing = false;\n sizeCache.clear();\n resizeObserver.disconnect();\n };\n const addItem = (item)=>{\n if (overflowItems[item.id]) {\n return;\n }\n overflowItems[item.id] = item;\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 if (item.groupId) {\n groupManager.addItem(item.id, item.groupId);\n item.element.setAttribute(DATA_OVERFLOW_GROUP, item.groupId);\n }\n update();\n };\n const addOverflowMenu = (el)=>{\n overflowMenu = el;\n };\n const addDivider = (divider)=>{\n if (!divider.groupId || overflowDividers[divider.groupId]) {\n return;\n }\n divider.element.setAttribute(DATA_OVERFLOW_GROUP, divider.groupId);\n overflowDividers[divider.groupId] = divider;\n };\n const removeOverflowMenu = ()=>{\n overflowMenu = undefined;\n };\n const 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 const removeItem = (itemId)=>{\n if (!overflowItems[itemId]) {\n return;\n }\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n if (item.groupId) {\n groupManager.removeItem(item.id, item.groupId);\n item.element.removeAttribute(DATA_OVERFLOW_GROUP);\n }\n sizeCache.delete(item.element);\n delete overflowItems[itemId];\n update();\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":["createOverflowManager","_groups","_groupId","sizeCache","Map","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","groups","updateGroupVisibility","groupId","group","invisibleItemIds","size","visibleItemIds","isGroupVisible","isSingleItemVisible","itemId","has","addItem","_","Set","add","removeItem","delete","showItem","hideItem","groupManager","invisibleItemQueue","createPriorityQueue","a","b","itemA","itemB","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","visibleItemQueue","getOffsetSize","el","get","offsetSize","offsetWidth","offsetHeight","set","computeSizeChange","entry","dividerWidth","id","item","visible","_overflowDividers_item_groupId","removeAttribute","DATA_OVERFLOWING","width","setAttribute","dispatchOverflowUpdate","all","visibleItems","map","invisibleItems","processOverflowItems","clear","totalDividersWidth","Object","values","dvdr","reduce","prev","current","overflowMenuSize","availableSize","visibleTop","peek","invisibleTop","currentSize","i","forceUpdate","debounce","observe","observedContainer","userOptions","assign","forEach","disconnect","DATA_OVERFLOW_GROUP","addOverflowMenu","addDivider","divider","removeOverflowMenu","removeDivider","remove"],"mappings":"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"}
1
+ {"version":3,"sources":["overflowManager.js"],"sourcesContent":["import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP } from './consts';\nimport { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\n/**\n * @internal\n * @returns overflow manager instance\n */ export function createOverflowManager() {\n // calls to `offsetWidth or offsetHeight` can happen multiple times in an update\n // Use a cache to avoid causing too many recalcs and avoid scripting time to meausure sizes\n const sizeCache = new Map();\n let container;\n let overflowMenu;\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 = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: ()=>undefined,\n onUpdateOverflow: ()=>undefined\n };\n const overflowItems = {};\n const overflowDividers = {};\n const resizeObserver = new ResizeObserver((entries)=>{\n if (!entries[0] || !container) {\n return;\n }\n update();\n });\n const getNextItem = (queueToDequeue, queueToEnqueue)=>{\n const nextItem = queueToDequeue.dequeue();\n queueToEnqueue.enqueue(nextItem);\n return overflowItems[nextItem];\n };\n const createGroupManager = ()=>{\n const groupVisibility = {};\n const groups = {};\n function updateGroupVisibility(groupId) {\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) {\n return groupVisibility[groupId] === 'visible' || groupVisibility[groupId] === 'overflow';\n }\n return {\n groupVisibility: ()=>groupVisibility,\n isSingleItemVisible (itemId, groupId) {\n return isGroupVisible(groupId) && groups[groupId].visibleItemIds.has(itemId) && groups[groupId].visibleItemIds.size === 1;\n },\n addItem (itemId, groupId) {\n var _groups, _groupId;\n var _;\n (_ = (_groups = groups)[_groupId = groupId]) !== null && _ !== void 0 ? _ : _groups[_groupId] = {\n visibleItemIds: new Set(),\n invisibleItemIds: new Set()\n };\n groups[groupId].visibleItemIds.add(itemId);\n updateGroupVisibility(groupId);\n },\n removeItem (itemId, groupId) {\n groups[groupId].invisibleItemIds.delete(itemId);\n groups[groupId].visibleItemIds.delete(itemId);\n updateGroupVisibility(groupId);\n },\n showItem (itemId, groupId) {\n groups[groupId].invisibleItemIds.delete(itemId);\n groups[groupId].visibleItemIds.add(itemId);\n updateGroupVisibility(groupId);\n },\n hideItem (itemId, groupId) {\n groups[groupId].invisibleItemIds.add(itemId);\n groups[groupId].visibleItemIds.delete(itemId);\n updateGroupVisibility(groupId);\n }\n };\n };\n const groupManager = createGroupManager();\n function compareItems(lt, rt) {\n if (!lt || !rt) {\n return 0;\n }\n const lte = overflowItems[lt];\n const rte = overflowItems[rt];\n if (lte.priority !== rte.priority) {\n return lte.priority > rte.priority ? 1 : -1;\n }\n const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n // eslint-disable-next-line no-bitwise\n return lte.element.compareDocumentPosition(rte.element) & positionStatusBit ? 1 : -1;\n }\n function getElementAxisSize(horizontal, vertical, el) {\n if (!sizeCache.has(el)) {\n sizeCache.set(el, options.overflowAxis === 'horizontal' ? el[horizontal] : el[vertical]);\n }\n return sizeCache.get(el);\n }\n const getOffsetSize = getElementAxisSize.bind(null, 'offsetWidth', 'offsetHeight');\n const getClientSize = getElementAxisSize.bind(null, 'clientWidth', 'clientHeight');\n const invisibleItemQueue = createPriorityQueue((a, b)=>-1 * compareItems(a, b));\n const visibleItemQueue = createPriorityQueue(compareItems);\n function occupiedSize() {\n const totalItemSize = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);\n const totalDividerSize = Object.entries(groupManager.groupVisibility()).reduce((acc, [id, state])=>acc + (state !== 'hidden' && overflowDividers[id] ? getOffsetSize(overflowDividers[id].element) : 0), 0);\n const overflowMenuSize = invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;\n return totalItemSize + totalDividerSize + overflowMenuSize;\n }\n const showItem = ()=>{\n const item = getNextItem(invisibleItemQueue, visibleItemQueue);\n options.onUpdateItemVisibility({\n item,\n visible: true\n });\n if (item.groupId) {\n groupManager.showItem(item.id, item.groupId);\n if (groupManager.isSingleItemVisible(item.id, item.groupId)) {\n var _overflowDividers_item_groupId;\n (_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.removeAttribute(DATA_OVERFLOWING);\n }\n }\n };\n const hideItem = ()=>{\n const item = getNextItem(visibleItemQueue, invisibleItemQueue);\n options.onUpdateItemVisibility({\n item,\n visible: false\n });\n if (item.groupId) {\n if (groupManager.isSingleItemVisible(item.id, item.groupId)) {\n var _overflowDividers_item_groupId;\n (_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.setAttribute(DATA_OVERFLOWING, '');\n }\n groupManager.hideItem(item.id, item.groupId);\n }\n };\n const dispatchOverflowUpdate = ()=>{\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n const visibleItems = visibleItemIds.map((itemId)=>overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map((itemId)=>overflowItems[itemId]);\n options.onUpdateOverflow({\n visibleItems,\n invisibleItems,\n groupVisibility: groupManager.groupVisibility()\n });\n };\n const processOverflowItems = ()=>{\n if (!container) {\n return false;\n }\n sizeCache.clear();\n const availableSize = getClientSize(container) - options.padding;\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n while(compareItems(invisibleItemQueue.peek(), visibleItemQueue.peek()) > 0){\n hideItem(); // hide elements whose priority become smaller than the highest priority of the hidden one\n }\n // Run the show/hide step twice - the first step might not be correct if\n // it was triggered by a new item being added - new items are always visible by default.\n for(let i = 0; i < 2; i++){\n // Add items until available width is filled - can result in overflow\n while(occupiedSize() < availableSize && invisibleItemQueue.size() > 0 || invisibleItemQueue.size() === 1 // attempt to show the last invisible item hoping it's size does not exceed overflow menu size\n ){\n showItem();\n }\n // Remove items until there's no more overflow\n while(occupiedSize() > availableSize && visibleItemQueue.size() > options.minimumVisible){\n 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 const forceUpdate = ()=>{\n if (processOverflowItems() || forceDispatch) {\n forceDispatch = false;\n dispatchOverflowUpdate();\n }\n };\n const update = debounce(forceUpdate);\n const observe = (observedContainer, userOptions)=>{\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach((item)=>visibleItemQueue.enqueue(item.id));\n container = observedContainer;\n resizeObserver.observe(container);\n };\n const disconnect = ()=>{\n observing = false;\n sizeCache.clear();\n resizeObserver.disconnect();\n };\n const addItem = (item)=>{\n if (overflowItems[item.id]) {\n return;\n }\n overflowItems[item.id] = item;\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 if (item.groupId) {\n groupManager.addItem(item.id, item.groupId);\n item.element.setAttribute(DATA_OVERFLOW_GROUP, item.groupId);\n }\n update();\n };\n const addOverflowMenu = (el)=>{\n overflowMenu = el;\n };\n const addDivider = (divider)=>{\n if (!divider.groupId || overflowDividers[divider.groupId]) {\n return;\n }\n divider.element.setAttribute(DATA_OVERFLOW_GROUP, divider.groupId);\n overflowDividers[divider.groupId] = divider;\n };\n const removeOverflowMenu = ()=>{\n overflowMenu = undefined;\n };\n const 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 const removeItem = (itemId)=>{\n if (!overflowItems[itemId]) {\n return;\n }\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n if (item.groupId) {\n groupManager.removeItem(item.id, item.groupId);\n item.element.removeAttribute(DATA_OVERFLOW_GROUP);\n }\n sizeCache.delete(item.element);\n delete overflowItems[itemId];\n update();\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":["createOverflowManager","sizeCache","Map","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","groups","updateGroupVisibility","groupId","group","invisibleItemIds","size","visibleItemIds","isGroupVisible","isSingleItemVisible","itemId","has","addItem","_groups","_groupId","_","Set","add","removeItem","delete","showItem","hideItem","groupManager","compareItems","lt","rt","lte","rte","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","getElementAxisSize","horizontal","vertical","el","set","get","getOffsetSize","bind","getClientSize","invisibleItemQueue","createPriorityQueue","a","b","visibleItemQueue","occupiedSize","totalItemSize","all","map","id","reduce","prev","current","totalDividerSize","Object","acc","state","overflowMenuSize","item","visible","_overflowDividers_item_groupId","removeAttribute","DATA_OVERFLOWING","setAttribute","dispatchOverflowUpdate","visibleItems","invisibleItems","processOverflowItems","clear","availableSize","visibleTop","peek","invisibleTop","i","forceUpdate","debounce","observe","observedContainer","userOptions","assign","values","forEach","disconnect","DATA_OVERFLOW_GROUP","addOverflowMenu","addDivider","divider","removeOverflowMenu","removeDivider","remove"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui/priority-overflow",
3
- "version": "9.1.2",
3
+ "version": "9.1.4",
4
4
  "description": "Vanilla JS utilities to implement overflow menus",
5
5
  "main": "lib-commonjs/index.js",
6
6
  "module": "lib/index.js",