@fluentui/priority-overflow 9.1.16 → 9.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,12 +1,21 @@
1
1
  # Change Log - @fluentui/priority-overflow
2
2
 
3
- This log was last generated on Mon, 08 Sep 2025 12:42:22 GMT and should not be manually modified.
3
+ This log was last generated on Thu, 02 Oct 2025 15:07:00 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## [9.2.0](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.2.0)
8
+
9
+ Thu, 02 Oct 2025 15:07:00 GMT
10
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.1.16..@fluentui/priority-overflow_v9.2.0)
11
+
12
+ ### Minor changes
13
+
14
+ - fix: overflowMenuSize is included in occupiedSize ([PR #35090](https://github.com/microsoft/fluentui/pull/35090) by vkozlova@microsoft.com)
15
+
7
16
  ## [9.1.16](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.1.16)
8
17
 
9
- Mon, 08 Sep 2025 12:42:22 GMT
18
+ Mon, 08 Sep 2025 12:51:42 GMT
10
19
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.1.15..@fluentui/priority-overflow_v9.1.16)
11
20
 
12
21
  ### Patches
package/dist/index.d.ts CHANGED
@@ -34,6 +34,11 @@ export declare interface ObserveOptions {
34
34
  * Callback when item visibility is updated
35
35
  */
36
36
  onUpdateOverflow: OnUpdateOverflow;
37
+ /**
38
+ * When true, the overflow menu has default hidden items
39
+ * @default false
40
+ */
41
+ hasHiddenItems?: boolean;
37
42
  }
38
43
 
39
44
  export declare type OnUpdateItemVisibility = (data: OnUpdateItemVisibilityPayload) => void;
@@ -22,7 +22,8 @@ import { createPriorityQueue } from './priorityQueue';
22
22
  overflowDirection: 'end',
23
23
  minimumVisible: 0,
24
24
  onUpdateItemVisibility: ()=>undefined,
25
- onUpdateOverflow: ()=>undefined
25
+ onUpdateOverflow: ()=>undefined,
26
+ hasHiddenItems: false
26
27
  };
27
28
  const overflowItems = {};
28
29
  const overflowDividers = {};
@@ -64,7 +65,7 @@ import { createPriorityQueue } from './priorityQueue';
64
65
  function occupiedSize() {
65
66
  const totalItemSize = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);
66
67
  const totalDividerSize = Object.entries(groupManager.groupVisibility()).reduce((acc, [id, state])=>acc + (state !== 'hidden' && overflowDividers[id] ? getOffsetSize(overflowDividers[id].element) : 0), 0);
67
- const overflowMenuSize = invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;
68
+ const overflowMenuSize = (invisibleItemQueue.size() > 0 || options.hasHiddenItems) && overflowMenu ? getOffsetSize(overflowMenu) : 0;
68
69
  return totalItemSize + totalDividerSize + overflowMenuSize;
69
70
  }
70
71
  const showItem = ()=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/overflowManager.ts"],"sourcesContent":["import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP } from './consts';\nimport { observeResize } from './createResizeObserver';\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 let disposeResizeObserver: () => void = () => null;\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 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 disposeResizeObserver = observeResize(container, entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\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 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 update();\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n disposeResizeObserver();\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\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\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","observeResize","debounce","createPriorityQueue","createOverflowManager","sizeCache","Map","container","overflowMenu","observing","forceDispatch","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowDividers","disposeResizeObserver","getNextItem","queueToDequeue","queueToEnqueue","nextItem","dequeue","enqueue","groupManager","createGroupManager","compareItems","lt","rt","lte","rte","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","getElementAxisSize","horizontal","vertical","el","has","set","get","getOffsetSize","bind","getClientSize","invisibleItemQueue","a","b","visibleItemQueue","occupiedSize","totalItemSize","all","map","id","reduce","prev","current","totalDividerSize","Object","entries","groupVisibility","acc","state","overflowMenuSize","size","showItem","item","visible","groupId","isSingleItemVisible","removeAttribute","hideItem","setAttribute","dispatchOverflowUpdate","visibleItemIds","invisibleItemIds","visibleItems","itemId","invisibleItems","processOverflowItems","clear","availableSize","visibleTop","peek","invisibleTop","i","forceUpdate","update","observe","observedContainer","userOptions","assign","values","forEach","addItem","addOverflowMenu","addDivider","divider","removeOverflowMenu","removeDivider","removeItem","remove","delete","disconnect","keys","dividerId","groups","updateGroupVisibility","group","isGroupVisible","Set","add"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/overflowManager.ts"],"sourcesContent":["import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP } from './consts';\nimport { observeResize } from './createResizeObserver';\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 hasHiddenItems: false,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowDividers: Record<string, OverflowDividerEntry> = {};\n let disposeResizeObserver: () => void = () => null;\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 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 =\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 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 disposeResizeObserver = observeResize(container, entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\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 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 update();\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n disposeResizeObserver();\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\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\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","observeResize","debounce","createPriorityQueue","createOverflowManager","sizeCache","Map","container","overflowMenu","observing","forceDispatch","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","hasHiddenItems","overflowItems","overflowDividers","disposeResizeObserver","getNextItem","queueToDequeue","queueToEnqueue","nextItem","dequeue","enqueue","groupManager","createGroupManager","compareItems","lt","rt","lte","rte","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","getElementAxisSize","horizontal","vertical","el","has","set","get","getOffsetSize","bind","getClientSize","invisibleItemQueue","a","b","visibleItemQueue","occupiedSize","totalItemSize","all","map","id","reduce","prev","current","totalDividerSize","Object","entries","groupVisibility","acc","state","overflowMenuSize","size","showItem","item","visible","groupId","isSingleItemVisible","removeAttribute","hideItem","setAttribute","dispatchOverflowUpdate","visibleItemIds","invisibleItemIds","visibleItems","itemId","invisibleItems","processOverflowItems","clear","availableSize","visibleTop","peek","invisibleTop","i","forceUpdate","update","observe","observedContainer","userOptions","assign","values","forEach","addItem","addOverflowMenu","addDivider","divider","removeOverflowMenu","removeDivider","removeItem","remove","delete","disconnect","keys","dividerId","groups","updateGroupVisibility","group","isGroupVisible","Set","add"],"mappings":"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"}
package/lib/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["export type OverflowDirection = 'start' | 'end';\nexport type OverflowAxis = 'horizontal' | 'vertical';\nexport type OverflowGroupState = 'visible' | 'hidden' | 'overflow';\nexport interface OverflowItemEntry {\n /**\n * HTML element that will be disappear when overflowed\n */\n element: HTMLElement;\n /**\n * Lower priority items are invisible first when the container is overflowed\n * @default 0\n */\n priority: number;\n /**\n * Specific id, used to track visibility and provide updates to consumers\n */\n id: string;\n\n groupId?: string;\n}\n\nexport interface OverflowDividerEntry {\n /**\n * HTML element that will be disappear when overflowed\n */\n element: HTMLElement;\n\n groupId: string;\n}\n\n/**\n * signature similar to standard event listeners, but typed to handle the custom event\n */\nexport type OnUpdateOverflow = (data: OverflowEventPayload) => void;\n\nexport type OnUpdateItemVisibility = (data: OnUpdateItemVisibilityPayload) => void;\n\n/**\n * Payload of the custom DOM event for overflow updates\n */\nexport interface OverflowEventPayload {\n visibleItems: OverflowItemEntry[];\n invisibleItems: OverflowItemEntry[];\n groupVisibility: Record<string, OverflowGroupState>;\n}\n\nexport interface OnUpdateItemVisibilityPayload {\n item: OverflowItemEntry;\n visible: boolean;\n}\n\nexport interface ObserveOptions {\n /**\n * Padding (in px) at the end of the container before overflow occurs\n * Useful to account for extra elements (i.e. dropdown menu)\n * or to account for any kinds of margins between items which are hard to measure with JS\n * @default 10\n */\n padding?: number;\n /**\n * Direction where items are removed when overflow occurs\n * @default end\n */\n overflowDirection?: OverflowDirection;\n\n /**\n * Horizontal or vertical overflow\n * @default horizontal\n */\n overflowAxis?: OverflowAxis;\n\n /**\n * The minimum number of visible items\n */\n minimumVisible?: number;\n\n /**\n * Callback when item visibility is updated\n */\n onUpdateItemVisibility: OnUpdateItemVisibility;\n\n /**\n * Callback when item visibility is updated\n */\n onUpdateOverflow: OnUpdateOverflow;\n}\n\n/**\n * @internal\n */\nexport interface OverflowManager {\n /**\n * Starts observing the container and managing the overflow state\n */\n observe: (container: HTMLElement, options: ObserveOptions) => void;\n /**\n * Stops observing the container\n */\n disconnect: () => void;\n /**\n * Add overflow items\n */\n addItem: (items: OverflowItemEntry) => void;\n /**\n * Remove overflow item\n */\n removeItem: (itemId: string) => void;\n /**\n * Manually update the overflow, updates are batched and async\n */\n update: () => void;\n /**\n * Manually update the overflow sync\n */\n forceUpdate: () => void;\n\n /**\n * Adds an element that opens an overflow menu. This is used to calculate\n * available space and check if additional items need to overflow\n */\n addOverflowMenu: (element: HTMLElement) => void;\n\n /**\n * Add overflow divider\n */\n addDivider: (divider: OverflowDividerEntry) => void;\n\n /**\n * Remove overflow divider\n */\n removeDivider: (groupId: string) => void;\n\n /**\n * Unsets the overflow menu element\n */\n removeOverflowMenu: () => void;\n}\n"],"names":[],"mappings":"AAuFA;;CAEC,GACD,WA8CC"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["export type OverflowDirection = 'start' | 'end';\nexport type OverflowAxis = 'horizontal' | 'vertical';\nexport type OverflowGroupState = 'visible' | 'hidden' | 'overflow';\nexport interface OverflowItemEntry {\n /**\n * HTML element that will be disappear when overflowed\n */\n element: HTMLElement;\n /**\n * Lower priority items are invisible first when the container is overflowed\n * @default 0\n */\n priority: number;\n /**\n * Specific id, used to track visibility and provide updates to consumers\n */\n id: string;\n\n groupId?: string;\n}\n\nexport interface OverflowDividerEntry {\n /**\n * HTML element that will be disappear when overflowed\n */\n element: HTMLElement;\n\n groupId: string;\n}\n\n/**\n * signature similar to standard event listeners, but typed to handle the custom event\n */\nexport type OnUpdateOverflow = (data: OverflowEventPayload) => void;\n\nexport type OnUpdateItemVisibility = (data: OnUpdateItemVisibilityPayload) => void;\n\n/**\n * Payload of the custom DOM event for overflow updates\n */\nexport interface OverflowEventPayload {\n visibleItems: OverflowItemEntry[];\n invisibleItems: OverflowItemEntry[];\n groupVisibility: Record<string, OverflowGroupState>;\n}\n\nexport interface OnUpdateItemVisibilityPayload {\n item: OverflowItemEntry;\n visible: boolean;\n}\n\nexport interface ObserveOptions {\n /**\n * Padding (in px) at the end of the container before overflow occurs\n * Useful to account for extra elements (i.e. dropdown menu)\n * or to account for any kinds of margins between items which are hard to measure with JS\n * @default 10\n */\n padding?: number;\n /**\n * Direction where items are removed when overflow occurs\n * @default end\n */\n overflowDirection?: OverflowDirection;\n\n /**\n * Horizontal or vertical overflow\n * @default horizontal\n */\n overflowAxis?: OverflowAxis;\n\n /**\n * The minimum number of visible items\n */\n minimumVisible?: number;\n\n /**\n * Callback when item visibility is updated\n */\n onUpdateItemVisibility: OnUpdateItemVisibility;\n\n /**\n * Callback when item visibility is updated\n */\n onUpdateOverflow: OnUpdateOverflow;\n\n /**\n * When true, the overflow menu has default hidden items\n * @default false\n */\n hasHiddenItems?: boolean;\n}\n\n/**\n * @internal\n */\nexport interface OverflowManager {\n /**\n * Starts observing the container and managing the overflow state\n */\n observe: (container: HTMLElement, options: ObserveOptions) => void;\n /**\n * Stops observing the container\n */\n disconnect: () => void;\n /**\n * Add overflow items\n */\n addItem: (items: OverflowItemEntry) => void;\n /**\n * Remove overflow item\n */\n removeItem: (itemId: string) => void;\n /**\n * Manually update the overflow, updates are batched and async\n */\n update: () => void;\n /**\n * Manually update the overflow sync\n */\n forceUpdate: () => void;\n\n /**\n * Adds an element that opens an overflow menu. This is used to calculate\n * available space and check if additional items need to overflow\n */\n addOverflowMenu: (element: HTMLElement) => void;\n\n /**\n * Add overflow divider\n */\n addDivider: (divider: OverflowDividerEntry) => void;\n\n /**\n * Remove overflow divider\n */\n removeDivider: (groupId: string) => void;\n\n /**\n * Unsets the overflow menu element\n */\n removeOverflowMenu: () => void;\n}\n"],"names":[],"mappings":"AA6FA;;CAEC,GACD,WA8CC"}
@@ -29,7 +29,8 @@ function createOverflowManager() {
29
29
  overflowDirection: 'end',
30
30
  minimumVisible: 0,
31
31
  onUpdateItemVisibility: ()=>undefined,
32
- onUpdateOverflow: ()=>undefined
32
+ onUpdateOverflow: ()=>undefined,
33
+ hasHiddenItems: false
33
34
  };
34
35
  const overflowItems = {};
35
36
  const overflowDividers = {};
@@ -71,7 +72,7 @@ function createOverflowManager() {
71
72
  function occupiedSize() {
72
73
  const totalItemSize = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);
73
74
  const totalDividerSize = Object.entries(groupManager.groupVisibility()).reduce((acc, [id, state])=>acc + (state !== 'hidden' && overflowDividers[id] ? getOffsetSize(overflowDividers[id].element) : 0), 0);
74
- const overflowMenuSize = invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;
75
+ const overflowMenuSize = (invisibleItemQueue.size() > 0 || options.hasHiddenItems) && overflowMenu ? getOffsetSize(overflowMenu) : 0;
75
76
  return totalItemSize + totalDividerSize + overflowMenuSize;
76
77
  }
77
78
  const showItem = ()=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/overflowManager.ts"],"sourcesContent":["import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP } from './consts';\nimport { observeResize } from './createResizeObserver';\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 let disposeResizeObserver: () => void = () => null;\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 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 disposeResizeObserver = observeResize(container, entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\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 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 update();\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n disposeResizeObserver();\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\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\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","sizeCache","Map","container","overflowMenu","observing","forceDispatch","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowDividers","disposeResizeObserver","getNextItem","queueToDequeue","queueToEnqueue","nextItem","dequeue","enqueue","groupManager","createGroupManager","compareItems","lt","rt","lte","rte","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","getElementAxisSize","horizontal","vertical","el","has","set","get","getOffsetSize","bind","getClientSize","invisibleItemQueue","createPriorityQueue","a","b","visibleItemQueue","occupiedSize","totalItemSize","all","map","id","reduce","prev","current","totalDividerSize","Object","entries","groupVisibility","acc","state","overflowMenuSize","size","showItem","item","visible","groupId","isSingleItemVisible","removeAttribute","DATA_OVERFLOWING","hideItem","setAttribute","dispatchOverflowUpdate","visibleItemIds","invisibleItemIds","visibleItems","itemId","invisibleItems","processOverflowItems","clear","availableSize","visibleTop","peek","invisibleTop","i","forceUpdate","update","debounce","observe","observedContainer","userOptions","assign","values","forEach","observeResize","addItem","DATA_OVERFLOW_GROUP","addOverflowMenu","addDivider","divider","removeOverflowMenu","removeDivider","removeItem","remove","delete","disconnect","keys","dividerId","groups","updateGroupVisibility","group","isGroupVisible","Set","add"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/overflowManager.ts"],"sourcesContent":["import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP } from './consts';\nimport { observeResize } from './createResizeObserver';\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 hasHiddenItems: false,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowDividers: Record<string, OverflowDividerEntry> = {};\n let disposeResizeObserver: () => void = () => null;\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 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 =\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 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 disposeResizeObserver = observeResize(container, entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\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 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 update();\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n disposeResizeObserver();\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\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\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","sizeCache","Map","container","overflowMenu","observing","forceDispatch","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","hasHiddenItems","overflowItems","overflowDividers","disposeResizeObserver","getNextItem","queueToDequeue","queueToEnqueue","nextItem","dequeue","enqueue","groupManager","createGroupManager","compareItems","lt","rt","lte","rte","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","getElementAxisSize","horizontal","vertical","el","has","set","get","getOffsetSize","bind","getClientSize","invisibleItemQueue","createPriorityQueue","a","b","visibleItemQueue","occupiedSize","totalItemSize","all","map","id","reduce","prev","current","totalDividerSize","Object","entries","groupVisibility","acc","state","overflowMenuSize","size","showItem","item","visible","groupId","isSingleItemVisible","removeAttribute","DATA_OVERFLOWING","hideItem","setAttribute","dispatchOverflowUpdate","visibleItemIds","invisibleItemIds","visibleItems","itemId","invisibleItems","processOverflowItems","clear","availableSize","visibleTop","peek","invisibleTop","i","forceUpdate","update","debounce","observe","observedContainer","userOptions","assign","values","forEach","observeResize","addItem","DATA_OVERFLOW_GROUP","addOverflowMenu","addDivider","divider","removeOverflowMenu","removeDivider","removeItem","remove","delete","disconnect","keys","dividerId","groups","updateGroupVisibility","group","isGroupVisible","Set","add"],"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.16",
3
+ "version": "9.2.0",
4
4
  "description": "Vanilla JS utilities to implement overflow menus",
5
5
  "main": "lib-commonjs/index.js",
6
6
  "module": "lib/index.js",