@fluentui/priority-overflow 9.4.2 → 9.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,12 +1,22 @@
1
1
  # Change Log - @fluentui/priority-overflow
2
2
 
3
- <!-- This log was last generated on Tue, 11 Aug 2026 17:16:03 GMT and should not be manually modified. -->
3
+ <!-- This log was last generated on Mon, 24 Aug 2026 08:15:11 GMT and should not be manually modified. -->
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## [9.4.3](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.4.3)
8
+
9
+ Mon, 24 Aug 2026 08:15:11 GMT
10
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.4.2..@fluentui/priority-overflow_v9.4.3)
11
+
12
+ ### Patches
13
+
14
+ - fix: synchronously measure overflowing managers when the overflow menu attaches ([PR #36588](https://github.com/microsoft/fluentui/pull/36588) by bernardo.sunderhus@gmail.com)
15
+ - fix: avoid redundant overflow recomputation after conditional menu removal ([PR #36602](https://github.com/microsoft/fluentui/pull/36602) by bsunderhus@microsoft.com)
16
+
7
17
  ## [9.4.2](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.4.2)
8
18
 
9
- Tue, 11 Aug 2026 17:16:03 GMT
19
+ Tue, 11 Aug 2026 17:20:14 GMT
10
20
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.4.1..@fluentui/priority-overflow_v9.4.2)
11
21
 
12
22
  ### Patches
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/debounce.ts"],"sourcesContent":["/**\n * Microtask debouncer\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide\n * @param fn - Function to debounce\n * @returns debounced function\n */\nexport function debounce(fn: Function): () => void {\n let pending: boolean;\n\n // React testing platforms will often output errors when state updates happen outside `act`\n // Since there is nothing obvious to wait for we just avoid debouncing in unit test environments\n if (process.env.NODE_ENV === 'test') {\n return fn as () => void;\n }\n\n return () => {\n if (!pending) {\n pending = true;\n queueMicrotask(() => {\n // Need to set pending to `false` before the debounced function is run.\n // React can actually interrupt the function while it's running!\n pending = false;\n fn();\n });\n }\n };\n}\n"],"names":["debounce","fn","pending","process","env","NODE_ENV","queueMicrotask"],"mappings":"AAAA;;;;;CAKC,GACD,OAAO,SAASA,SAASC,EAAY;IACnC,IAAIC;IAEJ,2FAA2F;IAC3F,gGAAgG;IAChG,IAAIC,QAAQC,GAAG,CAACC,QAAQ,KAAK,QAAQ;QACnC,OAAOJ;IACT;IAEA,OAAO;QACL,IAAI,CAACC,SAAS;YACZA,UAAU;YACVI,eAAe;gBACb,uEAAuE;gBACvE,gEAAgE;gBAChEJ,UAAU;gBACVD;YACF;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["../src/debounce.ts"],"sourcesContent":["/**\n * Microtask debouncer\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide\n * @param fn - Function to debounce\n * @returns debounced function\n */\nexport function debounce(fn: () => void): () => void {\n let pending: boolean;\n\n // React testing platforms will often output errors when state updates happen outside `act`\n // Since there is nothing obvious to wait for we just avoid debouncing in unit test environments\n if (process.env.NODE_ENV === 'test') {\n return fn;\n }\n\n return () => {\n if (!pending) {\n pending = true;\n queueMicrotask(() => {\n // Need to set pending to `false` before the debounced function is run.\n // React can actually interrupt the function while it's running!\n pending = false;\n fn();\n });\n }\n };\n}\n"],"names":["debounce","fn","pending","process","env","NODE_ENV","queueMicrotask"],"mappings":"AAAA;;;;;CAKC,GACD,OAAO,SAASA,SAASC,EAAc;IACrC,IAAIC;IAEJ,2FAA2F;IAC3F,gGAAgG;IAChG,IAAIC,QAAQC,GAAG,CAACC,QAAQ,KAAK,QAAQ;QACnC,OAAOJ;IACT;IAEA,OAAO;QACL,IAAI,CAACC,SAAS;YACZA,UAAU;YACVI,eAAe;gBACb,uEAAuE;gBACvE,gEAAgE;gBAChEJ,UAAU;gBACVD;YACF;QACF;IACF;AACF"}
@@ -260,10 +260,17 @@ const DEFAULT_OPTIONS = {
260
260
  }
261
261
  };
262
262
  const addOverflowMenu = (el)=>{
263
+ if (overflowMenu === el) {
264
+ return;
265
+ }
263
266
  overflowMenu = el;
264
267
  if (observing) {
265
268
  forceDispatch = true;
266
- update();
269
+ if (invisibleItemQueue.size() > 0) {
270
+ forceUpdate();
271
+ } else {
272
+ update();
273
+ }
267
274
  }
268
275
  };
269
276
  const addDivider = (divider)=>{
@@ -274,8 +281,12 @@ const DEFAULT_OPTIONS = {
274
281
  overflowDividers[divider.groupId] = divider;
275
282
  };
276
283
  const removeOverflowMenu = ()=>{
284
+ if (!overflowMenu) {
285
+ return;
286
+ }
287
+ const hasInvisibleItems = invisibleItemQueue.size() > 0;
277
288
  overflowMenu = undefined;
278
- if (observing) {
289
+ if (observing && hasInvisibleItems) {
279
290
  forceDispatch = true;
280
291
  update();
281
292
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/overflowManager.ts"],"sourcesContent":["import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP, EMPTY_SNAPSHOT } from './consts';\nimport { observeResize } from './createResizeObserver';\nimport { debounce } from './debounce';\nimport type { PriorityQueue } from './priorityQueue';\nimport { createPriorityQueue } from './priorityQueue';\nimport type {\n OverflowGroupState,\n OverflowItemEntry,\n OverflowManager,\n OverflowOptions,\n OverflowDividerEntry,\n OverflowSnapshot,\n} from './types';\n\nconst DEFAULT_OPTIONS: Required<OverflowOptions> = {\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n padding: 10,\n minimumVisible: 0,\n hasHiddenItems: false,\n onUpdateItemVisibility: () => {\n /* noop */\n },\n onUpdateOverflow: () => {\n /* noop */\n },\n};\n\n/**\n * Creates an overflow manager instance for a single container.\n *\n * @internal\n * @param initialOptions - Initial observe options. Missing values are filled with defaults.\n * @returns overflow manager instance\n */\nexport function createOverflowManager(initialOptions: Partial<OverflowOptions> = {}): 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<OverflowOptions> = { ...DEFAULT_OPTIONS, ...initialOptions };\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowDividers: Record<string, OverflowDividerEntry> = {};\n const listeners = new Set<() => void>();\n let disposeResizeObserver: () => void = () => {\n /* noop */\n };\n\n let snapshot: OverflowSnapshot = EMPTY_SNAPSHOT;\n const takeSnapshot = (nextSnapshot: OverflowSnapshot) => {\n snapshot = nextSnapshot;\n listeners.forEach(listener => listener());\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 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 // TODO this should not happen but there have been reports of one of these items being undefined\n // Try to find a consistent repro for this\n if (!lte || !rte) {\n return lte ? 1 : -1;\n }\n\n // Pinned items have \"infinite\" priority - they should never be hidden\n if (lte.pinned !== rte.pinned) {\n return lte.pinned ? 1 : -1;\n }\n\n if (lte.priority !== rte.priority) {\n return lte.priority > rte.priority ? 1 : -1;\n }\n\n // Node.DOCUMENT_POSITION_FOLLOWING = 4, Node.DOCUMENT_POSITION_PRECEDING = 2\n const positionStatusBit = options.overflowDirection === 'end' ? 4 : 2;\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 let totalItemSize = 0;\n for (const id of visibleItemQueue) {\n totalItemSize += getOffsetSize(overflowItems[id].element);\n }\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 =\n (invisibleItemQueue.size() > 0 || options.hasHiddenItems) && 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 groupVisibility = groupManager.groupVisibility();\n\n // Build the legacy ordered-entry arrays and the snapshot's id -> visible map in a single pass\n // over each queue.\n const itemVisibility: Record<string, boolean> = {};\n const visibleItems: OverflowItemEntry[] = [];\n const invisibleItems: OverflowItemEntry[] = [];\n\n for (const itemId of visibleItemQueue) {\n itemVisibility[itemId] = true;\n visibleItems.push(overflowItems[itemId]);\n }\n for (const itemId of invisibleItemQueue) {\n itemVisibility[itemId] = false;\n invisibleItems.push(overflowItems[itemId]);\n }\n\n // Set the snapshot first so `getSnapshot()` is current for both subscribers and any\n // `onUpdateOverflow` consumer that reads it.\n takeSnapshot({\n itemVisibility,\n groupVisibility,\n invisibleItemCount: invisibleItems.length,\n });\n\n // Legacy event payload: ordered item entries for `onUpdateOverflow` consumers.\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const getSnapshot: OverflowManager['getSnapshot'] = () => snapshot;\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 const nextItemId = visibleItemQueue.peek();\n\n // Never hide pinned items - they should always remain visible\n if (nextItemId && overflowItems[nextItemId]?.pinned) {\n break;\n }\n\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 setOptions: OverflowManager['setOptions'] = nextOptions => {\n if (options === nextOptions) {\n return;\n }\n\n const shouldTriggerUpdate =\n (nextOptions.overflowAxis && options.overflowAxis !== nextOptions.overflowAxis) ||\n (nextOptions.overflowDirection && options.overflowDirection !== nextOptions.overflowDirection) ||\n (nextOptions.padding && options.padding !== nextOptions.padding) ||\n (nextOptions.minimumVisible && options.minimumVisible !== nextOptions.minimumVisible) ||\n (nextOptions.hasHiddenItems && options.hasHiddenItems !== nextOptions.hasHiddenItems);\n\n Object.assign(options, nextOptions);\n\n if (shouldTriggerUpdate) {\n forceDispatch = true;\n update();\n }\n };\n\n const observe: OverflowManager['observe'] = (observedContainer, observeOptions) => {\n const { forceUpdate: shouldForceUpdate, ...userOptions } = observeOptions ?? {};\n Object.assign(options, userOptions);\n\n Object.values(overflowItems).forEach(item => {\n if (!visibleItemQueue.contains(item.id) && !invisibleItemQueue.contains(item.id)) {\n visibleItemQueue.enqueue(item.id);\n }\n });\n\n container = observedContainer;\n observing = true;\n disposeResizeObserver = observeResize(container, entries => {\n if (!entries[0] || !container) {\n return;\n }\n update();\n });\n\n if (shouldForceUpdate && getClientSize(observedContainer) > 0) {\n forceUpdate();\n }\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n disposeResizeObserver();\n disposeResizeObserver = () => {\n /* noop */\n };\n\n // reset flags\n container = undefined;\n observing = false;\n forceDispatch = true;\n\n // clear all entries\n Object.keys(overflowItems).forEach(itemId => removeItem(itemId));\n Object.keys(overflowDividers).forEach(dividerId => removeDivider(dividerId));\n removeOverflowMenu();\n sizeCache.clear();\n\n // Reset the snapshot during teardown, but do not broadcast a final update.\n // Consumers unsubscribe as part of unmount, and a disconnect-time notification can race\n // those cleanups and dispatch into already-unmounting React listeners.\n snapshot = EMPTY_SNAPSHOT;\n };\n\n const addItem: OverflowManager['addItem'] = items => {\n if (overflowItems[items.id]) {\n return;\n }\n\n overflowItems[items.id] = items;\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(items.id);\n update();\n }\n\n if (items.groupId) {\n groupManager.addItem(items.id, items.groupId);\n items.element.setAttribute(DATA_OVERFLOW_GROUP, items.groupId);\n }\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n overflowMenu = el;\n\n if (observing) {\n forceDispatch = true;\n update();\n }\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 if (observing) {\n forceDispatch = true;\n update();\n }\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 if (observing) {\n // We might be removing an item in an overflow which would not affect the tops,\n // but we need to update anyway to update the overflow menu state\n forceDispatch = true;\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 if (observing) {\n update();\n }\n };\n\n const subscribe: OverflowManager['subscribe'] = listener => {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\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 setOptions,\n getSnapshot,\n subscribe,\n };\n}\n\nconst 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"],"names":["DATA_OVERFLOWING","DATA_OVERFLOW_GROUP","EMPTY_SNAPSHOT","observeResize","debounce","createPriorityQueue","DEFAULT_OPTIONS","overflowAxis","overflowDirection","padding","minimumVisible","hasHiddenItems","onUpdateItemVisibility","onUpdateOverflow","createOverflowManager","initialOptions","sizeCache","Map","container","overflowMenu","observing","forceDispatch","options","overflowItems","overflowDividers","listeners","Set","disposeResizeObserver","snapshot","takeSnapshot","nextSnapshot","forEach","listener","getNextItem","queueToDequeue","queueToEnqueue","nextItem","dequeue","enqueue","groupManager","createGroupManager","compareItems","lt","rt","lte","rte","pinned","priority","positionStatusBit","element","compareDocumentPosition","getElementAxisSize","horizontal","vertical","el","has","set","get","getOffsetSize","bind","getClientSize","invisibleItemQueue","a","b","visibleItemQueue","occupiedSize","totalItemSize","id","totalDividerSize","Object","entries","groupVisibility","reduce","acc","state","overflowMenuSize","size","showItem","item","visible","groupId","isSingleItemVisible","removeAttribute","hideItem","setAttribute","dispatchOverflowUpdate","itemVisibility","visibleItems","invisibleItems","itemId","push","invisibleItemCount","length","getSnapshot","processOverflowItems","clear","availableSize","visibleTop","peek","invisibleTop","i","nextItemId","forceUpdate","update","setOptions","nextOptions","shouldTriggerUpdate","assign","observe","observedContainer","observeOptions","shouldForceUpdate","userOptions","values","contains","disconnect","undefined","keys","removeItem","dividerId","removeDivider","removeOverflowMenu","addItem","items","addOverflowMenu","addDivider","divider","remove","delete","subscribe","add","groups","updateGroupVisibility","group","invisibleItemIds","visibleItemIds","isGroupVisible"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/overflowManager.ts"],"sourcesContent":["import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP, EMPTY_SNAPSHOT } from './consts';\nimport { observeResize } from './createResizeObserver';\nimport { debounce } from './debounce';\nimport type { PriorityQueue } from './priorityQueue';\nimport { createPriorityQueue } from './priorityQueue';\nimport type {\n OverflowGroupState,\n OverflowItemEntry,\n OverflowManager,\n OverflowOptions,\n OverflowDividerEntry,\n OverflowSnapshot,\n} from './types';\n\nconst DEFAULT_OPTIONS: Required<OverflowOptions> = {\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n padding: 10,\n minimumVisible: 0,\n hasHiddenItems: false,\n onUpdateItemVisibility: () => {\n /* noop */\n },\n onUpdateOverflow: () => {\n /* noop */\n },\n};\n\n/**\n * Creates an overflow manager instance for a single container.\n *\n * @internal\n * @param initialOptions - Initial observe options. Missing values are filled with defaults.\n * @returns overflow manager instance\n */\nexport function createOverflowManager(initialOptions: Partial<OverflowOptions> = {}): 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<OverflowOptions> = { ...DEFAULT_OPTIONS, ...initialOptions };\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowDividers: Record<string, OverflowDividerEntry> = {};\n const listeners = new Set<() => void>();\n let disposeResizeObserver: () => void = () => {\n /* noop */\n };\n\n let snapshot: OverflowSnapshot = EMPTY_SNAPSHOT;\n const takeSnapshot = (nextSnapshot: OverflowSnapshot) => {\n snapshot = nextSnapshot;\n listeners.forEach(listener => listener());\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 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 // TODO this should not happen but there have been reports of one of these items being undefined\n // Try to find a consistent repro for this\n if (!lte || !rte) {\n return lte ? 1 : -1;\n }\n\n // Pinned items have \"infinite\" priority - they should never be hidden\n if (lte.pinned !== rte.pinned) {\n return lte.pinned ? 1 : -1;\n }\n\n if (lte.priority !== rte.priority) {\n return lte.priority > rte.priority ? 1 : -1;\n }\n\n // Node.DOCUMENT_POSITION_FOLLOWING = 4, Node.DOCUMENT_POSITION_PRECEDING = 2\n const positionStatusBit = options.overflowDirection === 'end' ? 4 : 2;\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 let totalItemSize = 0;\n for (const id of visibleItemQueue) {\n totalItemSize += getOffsetSize(overflowItems[id].element);\n }\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 =\n (invisibleItemQueue.size() > 0 || options.hasHiddenItems) && 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 groupVisibility = groupManager.groupVisibility();\n\n // Build the legacy ordered-entry arrays and the snapshot's id -> visible map in a single pass\n // over each queue.\n const itemVisibility: Record<string, boolean> = {};\n const visibleItems: OverflowItemEntry[] = [];\n const invisibleItems: OverflowItemEntry[] = [];\n\n for (const itemId of visibleItemQueue) {\n itemVisibility[itemId] = true;\n visibleItems.push(overflowItems[itemId]);\n }\n for (const itemId of invisibleItemQueue) {\n itemVisibility[itemId] = false;\n invisibleItems.push(overflowItems[itemId]);\n }\n\n // Set the snapshot first so `getSnapshot()` is current for both subscribers and any\n // `onUpdateOverflow` consumer that reads it.\n takeSnapshot({\n itemVisibility,\n groupVisibility,\n invisibleItemCount: invisibleItems.length,\n });\n\n // Legacy event payload: ordered item entries for `onUpdateOverflow` consumers.\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const getSnapshot: OverflowManager['getSnapshot'] = () => snapshot;\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 const nextItemId = visibleItemQueue.peek();\n\n // Never hide pinned items - they should always remain visible\n if (nextItemId && overflowItems[nextItemId]?.pinned) {\n break;\n }\n\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 setOptions: OverflowManager['setOptions'] = nextOptions => {\n if (options === nextOptions) {\n return;\n }\n\n const shouldTriggerUpdate =\n (nextOptions.overflowAxis && options.overflowAxis !== nextOptions.overflowAxis) ||\n (nextOptions.overflowDirection && options.overflowDirection !== nextOptions.overflowDirection) ||\n (nextOptions.padding && options.padding !== nextOptions.padding) ||\n (nextOptions.minimumVisible && options.minimumVisible !== nextOptions.minimumVisible) ||\n (nextOptions.hasHiddenItems && options.hasHiddenItems !== nextOptions.hasHiddenItems);\n\n Object.assign(options, nextOptions);\n\n if (shouldTriggerUpdate) {\n forceDispatch = true;\n update();\n }\n };\n\n const observe: OverflowManager['observe'] = (observedContainer, observeOptions) => {\n const { forceUpdate: shouldForceUpdate, ...userOptions } = observeOptions ?? {};\n Object.assign(options, userOptions);\n\n Object.values(overflowItems).forEach(item => {\n if (!visibleItemQueue.contains(item.id) && !invisibleItemQueue.contains(item.id)) {\n visibleItemQueue.enqueue(item.id);\n }\n });\n\n container = observedContainer;\n observing = true;\n disposeResizeObserver = observeResize(container, entries => {\n if (!entries[0] || !container) {\n return;\n }\n update();\n });\n\n if (shouldForceUpdate && getClientSize(observedContainer) > 0) {\n forceUpdate();\n }\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n disposeResizeObserver();\n disposeResizeObserver = () => {\n /* noop */\n };\n\n // reset flags\n container = undefined;\n observing = false;\n forceDispatch = true;\n\n // clear all entries\n Object.keys(overflowItems).forEach(itemId => removeItem(itemId));\n Object.keys(overflowDividers).forEach(dividerId => removeDivider(dividerId));\n removeOverflowMenu();\n sizeCache.clear();\n\n // Reset the snapshot during teardown, but do not broadcast a final update.\n // Consumers unsubscribe as part of unmount, and a disconnect-time notification can race\n // those cleanups and dispatch into already-unmounting React listeners.\n snapshot = EMPTY_SNAPSHOT;\n };\n\n const addItem: OverflowManager['addItem'] = items => {\n if (overflowItems[items.id]) {\n return;\n }\n\n overflowItems[items.id] = items;\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(items.id);\n update();\n }\n\n if (items.groupId) {\n groupManager.addItem(items.id, items.groupId);\n items.element.setAttribute(DATA_OVERFLOW_GROUP, items.groupId);\n }\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n if (overflowMenu === el) {\n return;\n }\n\n overflowMenu = el;\n\n if (observing) {\n forceDispatch = true;\n if (invisibleItemQueue.size() > 0) {\n forceUpdate();\n } else {\n update();\n }\n }\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 if (!overflowMenu) {\n return;\n }\n\n const hasInvisibleItems = invisibleItemQueue.size() > 0;\n overflowMenu = undefined;\n\n if (observing && hasInvisibleItems) {\n forceDispatch = true;\n update();\n }\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 if (observing) {\n // We might be removing an item in an overflow which would not affect the tops,\n // but we need to update anyway to update the overflow menu state\n forceDispatch = true;\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 if (observing) {\n update();\n }\n };\n\n const subscribe: OverflowManager['subscribe'] = listener => {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\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 setOptions,\n getSnapshot,\n subscribe,\n };\n}\n\nconst 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"],"names":["DATA_OVERFLOWING","DATA_OVERFLOW_GROUP","EMPTY_SNAPSHOT","observeResize","debounce","createPriorityQueue","DEFAULT_OPTIONS","overflowAxis","overflowDirection","padding","minimumVisible","hasHiddenItems","onUpdateItemVisibility","onUpdateOverflow","createOverflowManager","initialOptions","sizeCache","Map","container","overflowMenu","observing","forceDispatch","options","overflowItems","overflowDividers","listeners","Set","disposeResizeObserver","snapshot","takeSnapshot","nextSnapshot","forEach","listener","getNextItem","queueToDequeue","queueToEnqueue","nextItem","dequeue","enqueue","groupManager","createGroupManager","compareItems","lt","rt","lte","rte","pinned","priority","positionStatusBit","element","compareDocumentPosition","getElementAxisSize","horizontal","vertical","el","has","set","get","getOffsetSize","bind","getClientSize","invisibleItemQueue","a","b","visibleItemQueue","occupiedSize","totalItemSize","id","totalDividerSize","Object","entries","groupVisibility","reduce","acc","state","overflowMenuSize","size","showItem","item","visible","groupId","isSingleItemVisible","removeAttribute","hideItem","setAttribute","dispatchOverflowUpdate","itemVisibility","visibleItems","invisibleItems","itemId","push","invisibleItemCount","length","getSnapshot","processOverflowItems","clear","availableSize","visibleTop","peek","invisibleTop","i","nextItemId","forceUpdate","update","setOptions","nextOptions","shouldTriggerUpdate","assign","observe","observedContainer","observeOptions","shouldForceUpdate","userOptions","values","contains","disconnect","undefined","keys","removeItem","dividerId","removeDivider","removeOverflowMenu","addItem","items","addOverflowMenu","addDivider","divider","hasInvisibleItems","remove","delete","subscribe","add","groups","updateGroupVisibility","group","invisibleItemIds","visibleItemIds","isGroupVisible"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/debounce.ts"],"sourcesContent":["/**\n * Microtask debouncer\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide\n * @param fn - Function to debounce\n * @returns debounced function\n */\nexport function debounce(fn: Function): () => void {\n let pending: boolean;\n\n // React testing platforms will often output errors when state updates happen outside `act`\n // Since there is nothing obvious to wait for we just avoid debouncing in unit test environments\n if (process.env.NODE_ENV === 'test') {\n return fn as () => void;\n }\n\n return () => {\n if (!pending) {\n pending = true;\n queueMicrotask(() => {\n // Need to set pending to `false` before the debounced function is run.\n // React can actually interrupt the function while it's running!\n pending = false;\n fn();\n });\n }\n };\n}\n"],"names":["debounce","fn","pending","process","env","NODE_ENV","queueMicrotask"],"mappings":"AAAA;;;;;CAKC;;;;+BACeA;;;eAAAA;;;AAAT,SAASA,SAASC,EAAY;IACnC,IAAIC;IAEJ,2FAA2F;IAC3F,gGAAgG;IAChG,IAAIC,QAAQC,GAAG,CAACC,QAAQ,KAAK,QAAQ;QACnC,OAAOJ;IACT;IAEA,OAAO;QACL,IAAI,CAACC,SAAS;YACZA,UAAU;YACVI,eAAe;gBACb,uEAAuE;gBACvE,gEAAgE;gBAChEJ,UAAU;gBACVD;YACF;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["../src/debounce.ts"],"sourcesContent":["/**\n * Microtask debouncer\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide\n * @param fn - Function to debounce\n * @returns debounced function\n */\nexport function debounce(fn: () => void): () => void {\n let pending: boolean;\n\n // React testing platforms will often output errors when state updates happen outside `act`\n // Since there is nothing obvious to wait for we just avoid debouncing in unit test environments\n if (process.env.NODE_ENV === 'test') {\n return fn;\n }\n\n return () => {\n if (!pending) {\n pending = true;\n queueMicrotask(() => {\n // Need to set pending to `false` before the debounced function is run.\n // React can actually interrupt the function while it's running!\n pending = false;\n fn();\n });\n }\n };\n}\n"],"names":["debounce","fn","pending","process","env","NODE_ENV","queueMicrotask"],"mappings":"AAAA;;;;;CAKC;;;;+BACeA;;;eAAAA;;;AAAT,SAASA,SAASC,EAAc;IACrC,IAAIC;IAEJ,2FAA2F;IAC3F,gGAAgG;IAChG,IAAIC,QAAQC,GAAG,CAACC,QAAQ,KAAK,QAAQ;QACnC,OAAOJ;IACT;IAEA,OAAO;QACL,IAAI,CAACC,SAAS;YACZA,UAAU;YACVI,eAAe;gBACb,uEAAuE;gBACvE,gEAAgE;gBAChEJ,UAAU;gBACVD;YACF;QACF;IACF;AACF"}
@@ -264,10 +264,17 @@ function createOverflowManager(initialOptions = {}) {
264
264
  }
265
265
  };
266
266
  const addOverflowMenu = (el)=>{
267
+ if (overflowMenu === el) {
268
+ return;
269
+ }
267
270
  overflowMenu = el;
268
271
  if (observing) {
269
272
  forceDispatch = true;
270
- update();
273
+ if (invisibleItemQueue.size() > 0) {
274
+ forceUpdate();
275
+ } else {
276
+ update();
277
+ }
271
278
  }
272
279
  };
273
280
  const addDivider = (divider)=>{
@@ -278,8 +285,12 @@ function createOverflowManager(initialOptions = {}) {
278
285
  overflowDividers[divider.groupId] = divider;
279
286
  };
280
287
  const removeOverflowMenu = ()=>{
288
+ if (!overflowMenu) {
289
+ return;
290
+ }
291
+ const hasInvisibleItems = invisibleItemQueue.size() > 0;
281
292
  overflowMenu = undefined;
282
- if (observing) {
293
+ if (observing && hasInvisibleItems) {
283
294
  forceDispatch = true;
284
295
  update();
285
296
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/overflowManager.ts"],"sourcesContent":["import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP, EMPTY_SNAPSHOT } from './consts';\nimport { observeResize } from './createResizeObserver';\nimport { debounce } from './debounce';\nimport type { PriorityQueue } from './priorityQueue';\nimport { createPriorityQueue } from './priorityQueue';\nimport type {\n OverflowGroupState,\n OverflowItemEntry,\n OverflowManager,\n OverflowOptions,\n OverflowDividerEntry,\n OverflowSnapshot,\n} from './types';\n\nconst DEFAULT_OPTIONS: Required<OverflowOptions> = {\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n padding: 10,\n minimumVisible: 0,\n hasHiddenItems: false,\n onUpdateItemVisibility: () => {\n /* noop */\n },\n onUpdateOverflow: () => {\n /* noop */\n },\n};\n\n/**\n * Creates an overflow manager instance for a single container.\n *\n * @internal\n * @param initialOptions - Initial observe options. Missing values are filled with defaults.\n * @returns overflow manager instance\n */\nexport function createOverflowManager(initialOptions: Partial<OverflowOptions> = {}): 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<OverflowOptions> = { ...DEFAULT_OPTIONS, ...initialOptions };\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowDividers: Record<string, OverflowDividerEntry> = {};\n const listeners = new Set<() => void>();\n let disposeResizeObserver: () => void = () => {\n /* noop */\n };\n\n let snapshot: OverflowSnapshot = EMPTY_SNAPSHOT;\n const takeSnapshot = (nextSnapshot: OverflowSnapshot) => {\n snapshot = nextSnapshot;\n listeners.forEach(listener => listener());\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 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 // TODO this should not happen but there have been reports of one of these items being undefined\n // Try to find a consistent repro for this\n if (!lte || !rte) {\n return lte ? 1 : -1;\n }\n\n // Pinned items have \"infinite\" priority - they should never be hidden\n if (lte.pinned !== rte.pinned) {\n return lte.pinned ? 1 : -1;\n }\n\n if (lte.priority !== rte.priority) {\n return lte.priority > rte.priority ? 1 : -1;\n }\n\n // Node.DOCUMENT_POSITION_FOLLOWING = 4, Node.DOCUMENT_POSITION_PRECEDING = 2\n const positionStatusBit = options.overflowDirection === 'end' ? 4 : 2;\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 let totalItemSize = 0;\n for (const id of visibleItemQueue) {\n totalItemSize += getOffsetSize(overflowItems[id].element);\n }\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 =\n (invisibleItemQueue.size() > 0 || options.hasHiddenItems) && 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 groupVisibility = groupManager.groupVisibility();\n\n // Build the legacy ordered-entry arrays and the snapshot's id -> visible map in a single pass\n // over each queue.\n const itemVisibility: Record<string, boolean> = {};\n const visibleItems: OverflowItemEntry[] = [];\n const invisibleItems: OverflowItemEntry[] = [];\n\n for (const itemId of visibleItemQueue) {\n itemVisibility[itemId] = true;\n visibleItems.push(overflowItems[itemId]);\n }\n for (const itemId of invisibleItemQueue) {\n itemVisibility[itemId] = false;\n invisibleItems.push(overflowItems[itemId]);\n }\n\n // Set the snapshot first so `getSnapshot()` is current for both subscribers and any\n // `onUpdateOverflow` consumer that reads it.\n takeSnapshot({\n itemVisibility,\n groupVisibility,\n invisibleItemCount: invisibleItems.length,\n });\n\n // Legacy event payload: ordered item entries for `onUpdateOverflow` consumers.\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const getSnapshot: OverflowManager['getSnapshot'] = () => snapshot;\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 const nextItemId = visibleItemQueue.peek();\n\n // Never hide pinned items - they should always remain visible\n if (nextItemId && overflowItems[nextItemId]?.pinned) {\n break;\n }\n\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 setOptions: OverflowManager['setOptions'] = nextOptions => {\n if (options === nextOptions) {\n return;\n }\n\n const shouldTriggerUpdate =\n (nextOptions.overflowAxis && options.overflowAxis !== nextOptions.overflowAxis) ||\n (nextOptions.overflowDirection && options.overflowDirection !== nextOptions.overflowDirection) ||\n (nextOptions.padding && options.padding !== nextOptions.padding) ||\n (nextOptions.minimumVisible && options.minimumVisible !== nextOptions.minimumVisible) ||\n (nextOptions.hasHiddenItems && options.hasHiddenItems !== nextOptions.hasHiddenItems);\n\n Object.assign(options, nextOptions);\n\n if (shouldTriggerUpdate) {\n forceDispatch = true;\n update();\n }\n };\n\n const observe: OverflowManager['observe'] = (observedContainer, observeOptions) => {\n const { forceUpdate: shouldForceUpdate, ...userOptions } = observeOptions ?? {};\n Object.assign(options, userOptions);\n\n Object.values(overflowItems).forEach(item => {\n if (!visibleItemQueue.contains(item.id) && !invisibleItemQueue.contains(item.id)) {\n visibleItemQueue.enqueue(item.id);\n }\n });\n\n container = observedContainer;\n observing = true;\n disposeResizeObserver = observeResize(container, entries => {\n if (!entries[0] || !container) {\n return;\n }\n update();\n });\n\n if (shouldForceUpdate && getClientSize(observedContainer) > 0) {\n forceUpdate();\n }\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n disposeResizeObserver();\n disposeResizeObserver = () => {\n /* noop */\n };\n\n // reset flags\n container = undefined;\n observing = false;\n forceDispatch = true;\n\n // clear all entries\n Object.keys(overflowItems).forEach(itemId => removeItem(itemId));\n Object.keys(overflowDividers).forEach(dividerId => removeDivider(dividerId));\n removeOverflowMenu();\n sizeCache.clear();\n\n // Reset the snapshot during teardown, but do not broadcast a final update.\n // Consumers unsubscribe as part of unmount, and a disconnect-time notification can race\n // those cleanups and dispatch into already-unmounting React listeners.\n snapshot = EMPTY_SNAPSHOT;\n };\n\n const addItem: OverflowManager['addItem'] = items => {\n if (overflowItems[items.id]) {\n return;\n }\n\n overflowItems[items.id] = items;\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(items.id);\n update();\n }\n\n if (items.groupId) {\n groupManager.addItem(items.id, items.groupId);\n items.element.setAttribute(DATA_OVERFLOW_GROUP, items.groupId);\n }\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n overflowMenu = el;\n\n if (observing) {\n forceDispatch = true;\n update();\n }\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 if (observing) {\n forceDispatch = true;\n update();\n }\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 if (observing) {\n // We might be removing an item in an overflow which would not affect the tops,\n // but we need to update anyway to update the overflow menu state\n forceDispatch = true;\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 if (observing) {\n update();\n }\n };\n\n const subscribe: OverflowManager['subscribe'] = listener => {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\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 setOptions,\n getSnapshot,\n subscribe,\n };\n}\n\nconst 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"],"names":["createOverflowManager","DEFAULT_OPTIONS","overflowAxis","overflowDirection","padding","minimumVisible","hasHiddenItems","onUpdateItemVisibility","onUpdateOverflow","initialOptions","sizeCache","Map","container","overflowMenu","observing","forceDispatch","options","overflowItems","overflowDividers","listeners","Set","disposeResizeObserver","snapshot","EMPTY_SNAPSHOT","takeSnapshot","nextSnapshot","forEach","listener","getNextItem","queueToDequeue","queueToEnqueue","nextItem","dequeue","enqueue","groupManager","createGroupManager","compareItems","lt","rt","lte","rte","pinned","priority","positionStatusBit","element","compareDocumentPosition","getElementAxisSize","horizontal","vertical","el","has","set","get","getOffsetSize","bind","getClientSize","invisibleItemQueue","createPriorityQueue","a","b","visibleItemQueue","occupiedSize","totalItemSize","id","totalDividerSize","Object","entries","groupVisibility","reduce","acc","state","overflowMenuSize","size","showItem","item","visible","groupId","isSingleItemVisible","removeAttribute","DATA_OVERFLOWING","hideItem","setAttribute","dispatchOverflowUpdate","itemVisibility","visibleItems","invisibleItems","itemId","push","invisibleItemCount","length","getSnapshot","processOverflowItems","clear","availableSize","visibleTop","peek","invisibleTop","i","nextItemId","forceUpdate","update","debounce","setOptions","nextOptions","shouldTriggerUpdate","assign","observe","observedContainer","observeOptions","shouldForceUpdate","userOptions","values","contains","observeResize","disconnect","undefined","keys","removeItem","dividerId","removeDivider","removeOverflowMenu","addItem","items","DATA_OVERFLOW_GROUP","addOverflowMenu","addDivider","divider","remove","delete","subscribe","add","groups","updateGroupVisibility","group","invisibleItemIds","visibleItemIds","isGroupVisible"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/overflowManager.ts"],"sourcesContent":["import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP, EMPTY_SNAPSHOT } from './consts';\nimport { observeResize } from './createResizeObserver';\nimport { debounce } from './debounce';\nimport type { PriorityQueue } from './priorityQueue';\nimport { createPriorityQueue } from './priorityQueue';\nimport type {\n OverflowGroupState,\n OverflowItemEntry,\n OverflowManager,\n OverflowOptions,\n OverflowDividerEntry,\n OverflowSnapshot,\n} from './types';\n\nconst DEFAULT_OPTIONS: Required<OverflowOptions> = {\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n padding: 10,\n minimumVisible: 0,\n hasHiddenItems: false,\n onUpdateItemVisibility: () => {\n /* noop */\n },\n onUpdateOverflow: () => {\n /* noop */\n },\n};\n\n/**\n * Creates an overflow manager instance for a single container.\n *\n * @internal\n * @param initialOptions - Initial observe options. Missing values are filled with defaults.\n * @returns overflow manager instance\n */\nexport function createOverflowManager(initialOptions: Partial<OverflowOptions> = {}): 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<OverflowOptions> = { ...DEFAULT_OPTIONS, ...initialOptions };\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowDividers: Record<string, OverflowDividerEntry> = {};\n const listeners = new Set<() => void>();\n let disposeResizeObserver: () => void = () => {\n /* noop */\n };\n\n let snapshot: OverflowSnapshot = EMPTY_SNAPSHOT;\n const takeSnapshot = (nextSnapshot: OverflowSnapshot) => {\n snapshot = nextSnapshot;\n listeners.forEach(listener => listener());\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 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 // TODO this should not happen but there have been reports of one of these items being undefined\n // Try to find a consistent repro for this\n if (!lte || !rte) {\n return lte ? 1 : -1;\n }\n\n // Pinned items have \"infinite\" priority - they should never be hidden\n if (lte.pinned !== rte.pinned) {\n return lte.pinned ? 1 : -1;\n }\n\n if (lte.priority !== rte.priority) {\n return lte.priority > rte.priority ? 1 : -1;\n }\n\n // Node.DOCUMENT_POSITION_FOLLOWING = 4, Node.DOCUMENT_POSITION_PRECEDING = 2\n const positionStatusBit = options.overflowDirection === 'end' ? 4 : 2;\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 let totalItemSize = 0;\n for (const id of visibleItemQueue) {\n totalItemSize += getOffsetSize(overflowItems[id].element);\n }\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 =\n (invisibleItemQueue.size() > 0 || options.hasHiddenItems) && 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 groupVisibility = groupManager.groupVisibility();\n\n // Build the legacy ordered-entry arrays and the snapshot's id -> visible map in a single pass\n // over each queue.\n const itemVisibility: Record<string, boolean> = {};\n const visibleItems: OverflowItemEntry[] = [];\n const invisibleItems: OverflowItemEntry[] = [];\n\n for (const itemId of visibleItemQueue) {\n itemVisibility[itemId] = true;\n visibleItems.push(overflowItems[itemId]);\n }\n for (const itemId of invisibleItemQueue) {\n itemVisibility[itemId] = false;\n invisibleItems.push(overflowItems[itemId]);\n }\n\n // Set the snapshot first so `getSnapshot()` is current for both subscribers and any\n // `onUpdateOverflow` consumer that reads it.\n takeSnapshot({\n itemVisibility,\n groupVisibility,\n invisibleItemCount: invisibleItems.length,\n });\n\n // Legacy event payload: ordered item entries for `onUpdateOverflow` consumers.\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const getSnapshot: OverflowManager['getSnapshot'] = () => snapshot;\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 const nextItemId = visibleItemQueue.peek();\n\n // Never hide pinned items - they should always remain visible\n if (nextItemId && overflowItems[nextItemId]?.pinned) {\n break;\n }\n\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 setOptions: OverflowManager['setOptions'] = nextOptions => {\n if (options === nextOptions) {\n return;\n }\n\n const shouldTriggerUpdate =\n (nextOptions.overflowAxis && options.overflowAxis !== nextOptions.overflowAxis) ||\n (nextOptions.overflowDirection && options.overflowDirection !== nextOptions.overflowDirection) ||\n (nextOptions.padding && options.padding !== nextOptions.padding) ||\n (nextOptions.minimumVisible && options.minimumVisible !== nextOptions.minimumVisible) ||\n (nextOptions.hasHiddenItems && options.hasHiddenItems !== nextOptions.hasHiddenItems);\n\n Object.assign(options, nextOptions);\n\n if (shouldTriggerUpdate) {\n forceDispatch = true;\n update();\n }\n };\n\n const observe: OverflowManager['observe'] = (observedContainer, observeOptions) => {\n const { forceUpdate: shouldForceUpdate, ...userOptions } = observeOptions ?? {};\n Object.assign(options, userOptions);\n\n Object.values(overflowItems).forEach(item => {\n if (!visibleItemQueue.contains(item.id) && !invisibleItemQueue.contains(item.id)) {\n visibleItemQueue.enqueue(item.id);\n }\n });\n\n container = observedContainer;\n observing = true;\n disposeResizeObserver = observeResize(container, entries => {\n if (!entries[0] || !container) {\n return;\n }\n update();\n });\n\n if (shouldForceUpdate && getClientSize(observedContainer) > 0) {\n forceUpdate();\n }\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n disposeResizeObserver();\n disposeResizeObserver = () => {\n /* noop */\n };\n\n // reset flags\n container = undefined;\n observing = false;\n forceDispatch = true;\n\n // clear all entries\n Object.keys(overflowItems).forEach(itemId => removeItem(itemId));\n Object.keys(overflowDividers).forEach(dividerId => removeDivider(dividerId));\n removeOverflowMenu();\n sizeCache.clear();\n\n // Reset the snapshot during teardown, but do not broadcast a final update.\n // Consumers unsubscribe as part of unmount, and a disconnect-time notification can race\n // those cleanups and dispatch into already-unmounting React listeners.\n snapshot = EMPTY_SNAPSHOT;\n };\n\n const addItem: OverflowManager['addItem'] = items => {\n if (overflowItems[items.id]) {\n return;\n }\n\n overflowItems[items.id] = items;\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(items.id);\n update();\n }\n\n if (items.groupId) {\n groupManager.addItem(items.id, items.groupId);\n items.element.setAttribute(DATA_OVERFLOW_GROUP, items.groupId);\n }\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n if (overflowMenu === el) {\n return;\n }\n\n overflowMenu = el;\n\n if (observing) {\n forceDispatch = true;\n if (invisibleItemQueue.size() > 0) {\n forceUpdate();\n } else {\n update();\n }\n }\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 if (!overflowMenu) {\n return;\n }\n\n const hasInvisibleItems = invisibleItemQueue.size() > 0;\n overflowMenu = undefined;\n\n if (observing && hasInvisibleItems) {\n forceDispatch = true;\n update();\n }\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 if (observing) {\n // We might be removing an item in an overflow which would not affect the tops,\n // but we need to update anyway to update the overflow menu state\n forceDispatch = true;\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 if (observing) {\n update();\n }\n };\n\n const subscribe: OverflowManager['subscribe'] = listener => {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\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 setOptions,\n getSnapshot,\n subscribe,\n };\n}\n\nconst 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"],"names":["createOverflowManager","DEFAULT_OPTIONS","overflowAxis","overflowDirection","padding","minimumVisible","hasHiddenItems","onUpdateItemVisibility","onUpdateOverflow","initialOptions","sizeCache","Map","container","overflowMenu","observing","forceDispatch","options","overflowItems","overflowDividers","listeners","Set","disposeResizeObserver","snapshot","EMPTY_SNAPSHOT","takeSnapshot","nextSnapshot","forEach","listener","getNextItem","queueToDequeue","queueToEnqueue","nextItem","dequeue","enqueue","groupManager","createGroupManager","compareItems","lt","rt","lte","rte","pinned","priority","positionStatusBit","element","compareDocumentPosition","getElementAxisSize","horizontal","vertical","el","has","set","get","getOffsetSize","bind","getClientSize","invisibleItemQueue","createPriorityQueue","a","b","visibleItemQueue","occupiedSize","totalItemSize","id","totalDividerSize","Object","entries","groupVisibility","reduce","acc","state","overflowMenuSize","size","showItem","item","visible","groupId","isSingleItemVisible","removeAttribute","DATA_OVERFLOWING","hideItem","setAttribute","dispatchOverflowUpdate","itemVisibility","visibleItems","invisibleItems","itemId","push","invisibleItemCount","length","getSnapshot","processOverflowItems","clear","availableSize","visibleTop","peek","invisibleTop","i","nextItemId","forceUpdate","update","debounce","setOptions","nextOptions","shouldTriggerUpdate","assign","observe","observedContainer","observeOptions","shouldForceUpdate","userOptions","values","contains","observeResize","disconnect","undefined","keys","removeItem","dividerId","removeDivider","removeOverflowMenu","addItem","items","DATA_OVERFLOW_GROUP","addOverflowMenu","addDivider","divider","hasInvisibleItems","remove","delete","subscribe","add","groups","updateGroupVisibility","group","invisibleItemIds","visibleItemIds","isGroupVisible"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui/priority-overflow",
3
- "version": "9.4.2",
3
+ "version": "9.4.3",
4
4
  "description": "Vanilla JS utilities to implement overflow menus",
5
5
  "main": "lib-commonjs/index.cjs",
6
6
  "module": "lib/index.js",