@fluentui/priority-overflow 0.0.0-nightly-20230109-0423.1 → 0.0.0-nightly-20230110-0424.1

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGELOG.json CHANGED
@@ -2,9 +2,9 @@
2
2
  "name": "@fluentui/priority-overflow",
3
3
  "entries": [
4
4
  {
5
- "date": "Mon, 09 Jan 2023 04:29:56 GMT",
6
- "tag": "@fluentui/priority-overflow_v0.0.0-nightly-20230109-0423.1",
7
- "version": "0.0.0-nightly-20230109-0423.1",
5
+ "date": "Tue, 10 Jan 2023 04:30:46 GMT",
6
+ "tag": "@fluentui/priority-overflow_v0.0.0-nightly-20230110-0424.1",
7
+ "version": "0.0.0-nightly-20230110-0424.1",
8
8
  "comments": {
9
9
  "prerelease": [
10
10
  {
@@ -16,6 +16,21 @@
16
16
  ]
17
17
  }
18
18
  },
19
+ {
20
+ "date": "Mon, 09 Jan 2023 14:34:54 GMT",
21
+ "tag": "@fluentui/priority-overflow_v9.0.0-rc.2",
22
+ "version": "9.0.0-rc.2",
23
+ "comments": {
24
+ "prerelease": [
25
+ {
26
+ "author": "lingfangao@hotmail.com",
27
+ "package": "@fluentui/priority-overflow",
28
+ "commit": "2611ae5441e4bc702c4ce6404c7186f6c2de7cc3",
29
+ "comment": "fix: Minimum visible overflow items should be respected"
30
+ }
31
+ ]
32
+ }
33
+ },
19
34
  {
20
35
  "date": "Wed, 04 Jan 2023 01:40:47 GMT",
21
36
  "tag": "@fluentui/priority-overflow_v9.0.0-rc.1",
package/CHANGELOG.md CHANGED
@@ -1,18 +1,27 @@
1
1
  # Change Log - @fluentui/priority-overflow
2
2
 
3
- This log was last generated on Mon, 09 Jan 2023 04:29:56 GMT and should not be manually modified.
3
+ This log was last generated on Tue, 10 Jan 2023 04:30:46 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
- ## [0.0.0-nightly-20230109-0423.1](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v0.0.0-nightly-20230109-0423.1)
7
+ ## [0.0.0-nightly-20230110-0424.1](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v0.0.0-nightly-20230110-0424.1)
8
8
 
9
- Mon, 09 Jan 2023 04:29:56 GMT
10
- [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.0.0-rc.1..@fluentui/priority-overflow_v0.0.0-nightly-20230109-0423.1)
9
+ Tue, 10 Jan 2023 04:30:46 GMT
10
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.0.0-rc.2..@fluentui/priority-overflow_v0.0.0-nightly-20230110-0424.1)
11
11
 
12
12
  ### Changes
13
13
 
14
14
  - Release nightly v9 ([commit](https://github.com/microsoft/fluentui/commit/not available) by fluentui-internal@service.microsoft.com)
15
15
 
16
+ ## [9.0.0-rc.2](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.0.0-rc.2)
17
+
18
+ Mon, 09 Jan 2023 14:34:54 GMT
19
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.0.0-rc.1..@fluentui/priority-overflow_v9.0.0-rc.2)
20
+
21
+ ### Changes
22
+
23
+ - fix: Minimum visible overflow items should be respected ([PR #26194](https://github.com/microsoft/fluentui/pull/26194) by lingfangao@hotmail.com)
24
+
16
25
  ## [9.0.0-rc.1](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.0.0-rc.1)
17
26
 
18
27
  Thu, 17 Nov 2022 23:05:32 GMT
@@ -116,18 +116,19 @@ export function createOverflowManager() {
116
116
  const child = overflowItems[visibleItemId].element;
117
117
  return sum + getOffsetSize(child);
118
118
  }, 0);
119
- // Add items until available width is filled
119
+ // Add items until available width is filled - can result in overflow
120
120
  while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {
121
121
  currentWidth += makeItemVisible();
122
122
  }
123
- // Remove items until there's no more overlap
123
+ // Remove items until there's no more overflow
124
124
  while (currentWidth > availableSize && visibleItemQueue.size() > 0) {
125
- if (visibleItemQueue.size() === options.minimumVisible) {
125
+ if (visibleItemQueue.size() <= options.minimumVisible) {
126
126
  break;
127
127
  }
128
128
  currentWidth -= makeItemInvisible();
129
129
  }
130
- if (invisibleItemQueue.size() > 0 && currentWidth + overflowMenuOffset > availableSize) {
130
+ // make sure the overflow menu can fit
131
+ if (visibleItemQueue.size() > options.minimumVisible && invisibleItemQueue.size() > 0 && currentWidth + overflowMenuOffset > availableSize) {
131
132
  makeItemInvisible();
132
133
  }
133
134
  // only update when the state of visible/invisible items has changed
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["debounce","createPriorityQueue","createOverflowManager","container","overflowMenu","observing","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowGroups","resizeObserver","ResizeObserver","entries","update","invisibleItemQueue","a","b","itemA","itemB","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","visibleItemQueue","getOffsetSize","el","offsetWidth","offsetHeight","makeItemVisible","nextVisible","dequeue","enqueue","item","visible","groupId","invisibleItemIds","delete","id","visibleItemIds","add","makeItemInvisible","nextInvisible","width","dispatchOverflowUpdate","all","visibleItems","map","itemId","invisibleItems","groupVisibility","Object","forEach","groupState","size","processOverflowItems","availableSize","overflowMenuOffset","visibleTop","peek","invisibleTop","currentWidth","reduce","sum","visibleItemId","child","forceUpdate","observe","observedContainer","userOptions","assign","values","disconnect","addItem","Set","addOverflowMenu","removeOverflowMenu","removeItem","remove"],"sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/overflowManager.ts"],"sourcesContent":["import { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\nimport type { OverflowGroupState, OverflowItemEntry, OverflowManager, ObserveOptions } from './types';\n\n/**\n * @internal\n * @returns overflow manager instance\n */\nexport function createOverflowManager(): OverflowManager {\n let container: HTMLElement | undefined;\n let overflowMenu: HTMLElement | undefined;\n let observing = false;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowGroups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n const makeItemVisible = () => {\n const nextVisible = invisibleItemQueue.dequeue();\n visibleItemQueue.enqueue(nextVisible);\n\n const item = overflowItems[nextVisible];\n options.onUpdateItemVisibility({ item, visible: true });\n if (item.groupId) {\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n return getOffsetSize(item.element);\n };\n\n const makeItemInvisible = () => {\n const nextInvisible = visibleItemQueue.dequeue();\n invisibleItemQueue.enqueue(nextInvisible);\n\n const item = overflowItems[nextInvisible];\n const width = getOffsetSize(item.element);\n options.onUpdateItemVisibility({ item, visible: false });\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.add(item.id);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n const groupVisibility: Record<string, OverflowGroupState> = {};\n Object.entries(overflowGroups).forEach(([groupId, groupState]) => {\n if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (groupState.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n });\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const processOverflowItems = (availableSize: number) => {\n if (!container) {\n return;\n }\n\n const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n const visibleItemIds = visibleItemQueue.all();\n let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {\n const child = overflowItems[visibleItemId].element;\n return sum + getOffsetSize(child);\n }, 0);\n\n // Add items until available width is filled\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += makeItemVisible();\n }\n // Remove items until there's no more overlap\n while (currentWidth > availableSize && visibleItemQueue.size() > 0) {\n if (visibleItemQueue.size() === options.minimumVisible) {\n break;\n }\n currentWidth -= makeItemInvisible();\n }\n\n if (invisibleItemQueue.size() > 0 && currentWidth + overflowMenuOffset > availableSize) {\n makeItemInvisible();\n }\n\n // only update when the state of visible/invisible items has changed\n if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {\n dispatchOverflowUpdate();\n }\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (!container) {\n return;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n processOverflowItems(availableSize);\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));\n\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n observing = false;\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n if (overflowItems[item.id]) {\n return;\n }\n\n overflowItems[item.id] = item;\n\n // some options can affect priority which are only set on `observe`\n if (observing) {\n visibleItemQueue.enqueue(item.id);\n }\n\n if (item.groupId) {\n if (!overflowGroups[item.groupId]) {\n overflowGroups[item.groupId] = {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n }\n\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n update();\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n overflowMenu = el;\n };\n\n const removeOverflowMenu: OverflowManager['removeOverflowMenu'] = () => {\n overflowMenu = undefined;\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n if (!overflowItems[itemId]) {\n return;\n }\n\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n addOverflowMenu,\n removeOverflowMenu,\n };\n}\n"]}
1
+ {"version":3,"mappings":"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","names":["debounce","createPriorityQueue","createOverflowManager","container","overflowMenu","observing","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowGroups","resizeObserver","ResizeObserver","entries","update","invisibleItemQueue","a","b","itemA","itemB","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","visibleItemQueue","getOffsetSize","el","offsetWidth","offsetHeight","makeItemVisible","nextVisible","dequeue","enqueue","item","visible","groupId","invisibleItemIds","delete","id","visibleItemIds","add","makeItemInvisible","nextInvisible","width","dispatchOverflowUpdate","all","visibleItems","map","itemId","invisibleItems","groupVisibility","Object","forEach","groupState","size","processOverflowItems","availableSize","overflowMenuOffset","visibleTop","peek","invisibleTop","currentWidth","reduce","sum","visibleItemId","child","forceUpdate","observe","observedContainer","userOptions","assign","values","disconnect","addItem","Set","addOverflowMenu","removeOverflowMenu","removeItem","remove"],"sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/overflowManager.ts"],"sourcesContent":["import { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\nimport type { OverflowGroupState, OverflowItemEntry, OverflowManager, ObserveOptions } from './types';\n\n/**\n * @internal\n * @returns overflow manager instance\n */\nexport function createOverflowManager(): OverflowManager {\n let container: HTMLElement | undefined;\n let overflowMenu: HTMLElement | undefined;\n let observing = false;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowGroups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n const makeItemVisible = () => {\n const nextVisible = invisibleItemQueue.dequeue();\n visibleItemQueue.enqueue(nextVisible);\n\n const item = overflowItems[nextVisible];\n options.onUpdateItemVisibility({ item, visible: true });\n if (item.groupId) {\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n return getOffsetSize(item.element);\n };\n\n const makeItemInvisible = () => {\n const nextInvisible = visibleItemQueue.dequeue();\n invisibleItemQueue.enqueue(nextInvisible);\n\n const item = overflowItems[nextInvisible];\n const width = getOffsetSize(item.element);\n options.onUpdateItemVisibility({ item, visible: false });\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.add(item.id);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n const groupVisibility: Record<string, OverflowGroupState> = {};\n Object.entries(overflowGroups).forEach(([groupId, groupState]) => {\n if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (groupState.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n });\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const processOverflowItems = (availableSize: number) => {\n if (!container) {\n return;\n }\n\n const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n const visibleItemIds = visibleItemQueue.all();\n let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {\n const child = overflowItems[visibleItemId].element;\n return sum + getOffsetSize(child);\n }, 0);\n\n // Add items until available width is filled - can result in overflow\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += makeItemVisible();\n }\n\n // Remove items until there's no more overflow\n while (currentWidth > availableSize && visibleItemQueue.size() > 0) {\n if (visibleItemQueue.size() <= options.minimumVisible) {\n break;\n }\n currentWidth -= makeItemInvisible();\n }\n\n // make sure the overflow menu can fit\n if (\n visibleItemQueue.size() > options.minimumVisible &&\n invisibleItemQueue.size() > 0 &&\n currentWidth + overflowMenuOffset > availableSize\n ) {\n makeItemInvisible();\n }\n\n // only update when the state of visible/invisible items has changed\n if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {\n dispatchOverflowUpdate();\n }\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (!container) {\n return;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n processOverflowItems(availableSize);\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));\n\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n observing = false;\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n if (overflowItems[item.id]) {\n return;\n }\n\n overflowItems[item.id] = item;\n\n // some options can affect priority which are only set on `observe`\n if (observing) {\n visibleItemQueue.enqueue(item.id);\n }\n\n if (item.groupId) {\n if (!overflowGroups[item.groupId]) {\n overflowGroups[item.groupId] = {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n }\n\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n update();\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n overflowMenu = el;\n };\n\n const removeOverflowMenu: OverflowManager['removeOverflowMenu'] = () => {\n overflowMenu = undefined;\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n if (!overflowItems[itemId]) {\n return;\n }\n\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n addOverflowMenu,\n removeOverflowMenu,\n };\n}\n"]}
@@ -122,18 +122,19 @@ function createOverflowManager() {
122
122
  const child = overflowItems[visibleItemId].element;
123
123
  return sum + getOffsetSize(child);
124
124
  }, 0);
125
- // Add items until available width is filled
125
+ // Add items until available width is filled - can result in overflow
126
126
  while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {
127
127
  currentWidth += makeItemVisible();
128
128
  }
129
- // Remove items until there's no more overlap
129
+ // Remove items until there's no more overflow
130
130
  while (currentWidth > availableSize && visibleItemQueue.size() > 0) {
131
- if (visibleItemQueue.size() === options.minimumVisible) {
131
+ if (visibleItemQueue.size() <= options.minimumVisible) {
132
132
  break;
133
133
  }
134
134
  currentWidth -= makeItemInvisible();
135
135
  }
136
- if (invisibleItemQueue.size() > 0 && currentWidth + overflowMenuOffset > availableSize) {
136
+ // make sure the overflow menu can fit
137
+ if (visibleItemQueue.size() > options.minimumVisible && invisibleItemQueue.size() > 0 && currentWidth + overflowMenuOffset > availableSize) {
137
138
  makeItemInvisible();
138
139
  }
139
140
  // only update when the state of visible/invisible items has changed
@@ -1 +1 @@
1
- {"version":3,"mappings":";;;;;;AAAA;AACA;AAGA;;;;AAIA,SAAgBA,qBAAqB;EACnC,IAAIC,SAAkC;EACtC,IAAIC,YAAqC;EACzC,IAAIC,SAAS,GAAG,KAAK;EACrB,MAAMC,OAAO,GAA6B;IACxCC,OAAO,EAAE,EAAE;IACXC,YAAY,EAAE,YAAY;IAC1BC,iBAAiB,EAAE,KAAK;IACxBC,cAAc,EAAE,CAAC;IACjBC,sBAAsB,EAAE,MAAMC,SAAS;IACvCC,gBAAgB,EAAE,MAAMD;GACzB;EAED,MAAME,aAAa,GAAsC,EAAE;EAC3D,MAAMC,cAAc,GAAmF,EAAE;EACzG,MAAMC,cAAc,GAAG,IAAIC,cAAc,CAACC,OAAO,IAAG;IAClD,IAAI,CAACA,OAAO,CAAC,CAAC,CAAC,IAAI,CAACf,SAAS,EAAE;MAC7B;;IAGFgB,MAAM,EAAE;EACV,CAAC,CAAC;EAEF,MAAMC,kBAAkB,GAAGC,mCAAmB,CAAS,CAACC,CAAC,EAAEC,CAAC,KAAI;IAC9D,MAAMC,KAAK,GAAGV,aAAa,CAACQ,CAAC,CAAC;IAC9B,MAAMG,KAAK,GAAGX,aAAa,CAACS,CAAC,CAAC;IAC9B;IACA,MAAMG,QAAQ,GAAGD,KAAK,CAACC,QAAQ,GAAGF,KAAK,CAACE,QAAQ;IAChD,IAAIA,QAAQ,KAAK,CAAC,EAAE;MAClB,OAAOA,QAAQ;;IAGjB,MAAMC,iBAAiB,GACrBrB,OAAO,CAACG,iBAAiB,KAAK,KAAK,GAAGmB,IAAI,CAACC,2BAA2B,GAAGD,IAAI,CAACE,2BAA2B;IAE3G;IACA;IACA,OAAON,KAAK,CAACO,OAAO,CAACC,uBAAuB,CAACP,KAAK,CAACM,OAAO,CAAC,GAAGJ,iBAAiB,GAAG,CAAC,CAAC,GAAG,CAAC;EAC1F,CAAC,CAAC;EAEF,MAAMM,gBAAgB,GAAGZ,mCAAmB,CAAS,CAACC,CAAC,EAAEC,CAAC,KAAI;IAC5D,MAAMC,KAAK,GAAGV,aAAa,CAACQ,CAAC,CAAC;IAC9B,MAAMG,KAAK,GAAGX,aAAa,CAACS,CAAC,CAAC;IAC9B;IACA,MAAMG,QAAQ,GAAGF,KAAK,CAACE,QAAQ,GAAGD,KAAK,CAACC,QAAQ;IAEhD,IAAIA,QAAQ,KAAK,CAAC,EAAE;MAClB,OAAOA,QAAQ;;IAGjB,MAAMC,iBAAiB,GACrBrB,OAAO,CAACG,iBAAiB,KAAK,KAAK,GAAGmB,IAAI,CAACE,2BAA2B,GAAGF,IAAI,CAACC,2BAA2B;IAE3G;IACA;IACA,OAAOL,KAAK,CAACO,OAAO,CAACC,uBAAuB,CAACP,KAAK,CAACM,OAAO,CAAC,GAAGJ,iBAAiB,GAAG,CAAC,CAAC,GAAG,CAAC;EAC1F,CAAC,CAAC;EAEF,MAAMO,aAAa,GAAIC,EAAe,IAAI;IACxC,OAAO7B,OAAO,CAACE,YAAY,KAAK,YAAY,GAAG2B,EAAE,CAACC,WAAW,GAAGD,EAAE,CAACE,YAAY;EACjF,CAAC;EAED,MAAMC,eAAe,GAAG,MAAK;IAC3B,MAAMC,WAAW,GAAGnB,kBAAkB,CAACoB,OAAO,EAAE;IAChDP,gBAAgB,CAACQ,OAAO,CAACF,WAAW,CAAC;IAErC,MAAMG,IAAI,GAAG5B,aAAa,CAACyB,WAAW,CAAC;IACvCjC,OAAO,CAACK,sBAAsB,CAAC;MAAE+B,IAAI;MAAEC,OAAO,EAAE;IAAI,CAAE,CAAC;IACvD,IAAID,IAAI,CAACE,OAAO,EAAE;MAChB7B,cAAc,CAAC2B,IAAI,CAACE,OAAO,CAAC,CAACC,gBAAgB,CAACC,MAAM,CAACJ,IAAI,CAACK,EAAE,CAAC;MAC7DhC,cAAc,CAAC2B,IAAI,CAACE,OAAO,CAAC,CAACI,cAAc,CAACC,GAAG,CAACP,IAAI,CAACK,EAAE,CAAC;;IAG1D,OAAOb,aAAa,CAACQ,IAAI,CAACX,OAAO,CAAC;EACpC,CAAC;EAED,MAAMmB,iBAAiB,GAAG,MAAK;IAC7B,MAAMC,aAAa,GAAGlB,gBAAgB,CAACO,OAAO,EAAE;IAChDpB,kBAAkB,CAACqB,OAAO,CAACU,aAAa,CAAC;IAEzC,MAAMT,IAAI,GAAG5B,aAAa,CAACqC,aAAa,CAAC;IACzC,MAAMC,KAAK,GAAGlB,aAAa,CAACQ,IAAI,CAACX,OAAO,CAAC;IACzCzB,OAAO,CAACK,sBAAsB,CAAC;MAAE+B,IAAI;MAAEC,OAAO,EAAE;IAAK,CAAE,CAAC;IACxD,IAAID,IAAI,CAACE,OAAO,EAAE;MAChB7B,cAAc,CAAC2B,IAAI,CAACE,OAAO,CAAC,CAACI,cAAc,CAACF,MAAM,CAACJ,IAAI,CAACK,EAAE,CAAC;MAC3DhC,cAAc,CAAC2B,IAAI,CAACE,OAAO,CAAC,CAACC,gBAAgB,CAACI,GAAG,CAACP,IAAI,CAACK,EAAE,CAAC;;IAG5D,OAAOK,KAAK;EACd,CAAC;EAED,MAAMC,sBAAsB,GAAG,MAAK;IAClC,MAAML,cAAc,GAAGf,gBAAgB,CAACqB,GAAG,EAAE;IAC7C,MAAMT,gBAAgB,GAAGzB,kBAAkB,CAACkC,GAAG,EAAE;IAEjD,MAAMC,YAAY,GAAGP,cAAc,CAACQ,GAAG,CAACC,MAAM,IAAI3C,aAAa,CAAC2C,MAAM,CAAC,CAAC;IACxE,MAAMC,cAAc,GAAGb,gBAAgB,CAACW,GAAG,CAACC,MAAM,IAAI3C,aAAa,CAAC2C,MAAM,CAAC,CAAC;IAE5E,MAAME,eAAe,GAAuC,EAAE;IAC9DC,MAAM,CAAC1C,OAAO,CAACH,cAAc,CAAC,CAAC8C,OAAO,CAAC,CAAC,CAACjB,OAAO,EAAEkB,UAAU,CAAC,KAAI;MAC/D,IAAIA,UAAU,CAACjB,gBAAgB,CAACkB,IAAI,IAAID,UAAU,CAACd,cAAc,CAACe,IAAI,EAAE;QACtEJ,eAAe,CAACf,OAAO,CAAC,GAAG,UAAU;OACtC,MAAM,IAAIkB,UAAU,CAACd,cAAc,CAACe,IAAI,KAAK,CAAC,EAAE;QAC/CJ,eAAe,CAACf,OAAO,CAAC,GAAG,QAAQ;OACpC,MAAM;QACLe,eAAe,CAACf,OAAO,CAAC,GAAG,SAAS;;IAExC,CAAC,CAAC;IAEFtC,OAAO,CAACO,gBAAgB,CAAC;MAAE0C,YAAY;MAAEG,cAAc;MAAEC;IAAe,CAAE,CAAC;EAC7E,CAAC;EAED,MAAMK,oBAAoB,GAAIC,aAAqB,IAAI;IACrD,IAAI,CAAC9D,SAAS,EAAE;MACd;;IAGF,MAAM+D,kBAAkB,GAAG9D,YAAY,GAAG8B,aAAa,CAAC9B,YAAY,CAAC,GAAG,CAAC;IAEzE;IACA,MAAM+D,UAAU,GAAGlC,gBAAgB,CAACmC,IAAI,EAAE;IAC1C,MAAMC,YAAY,GAAGjD,kBAAkB,CAACgD,IAAI,EAAE;IAE9C,MAAMpB,cAAc,GAAGf,gBAAgB,CAACqB,GAAG,EAAE;IAC7C,IAAIgB,YAAY,GAAGtB,cAAc,CAACuB,MAAM,CAAC,CAACC,GAAG,EAAEC,aAAa,KAAI;MAC9D,MAAMC,KAAK,GAAG5D,aAAa,CAAC2D,aAAa,CAAC,CAAC1C,OAAO;MAClD,OAAOyC,GAAG,GAAGtC,aAAa,CAACwC,KAAK,CAAC;IACnC,CAAC,EAAE,CAAC,CAAC;IAEL;IACA,OAAOJ,YAAY,GAAGL,aAAa,IAAI7C,kBAAkB,CAAC2C,IAAI,EAAE,GAAG,CAAC,EAAE;MACpEO,YAAY,IAAIhC,eAAe,EAAE;;IAEnC;IACA,OAAOgC,YAAY,GAAGL,aAAa,IAAIhC,gBAAgB,CAAC8B,IAAI,EAAE,GAAG,CAAC,EAAE;MAClE,IAAI9B,gBAAgB,CAAC8B,IAAI,EAAE,KAAKzD,OAAO,CAACI,cAAc,EAAE;QACtD;;MAEF4D,YAAY,IAAIpB,iBAAiB,EAAE;;IAGrC,IAAI9B,kBAAkB,CAAC2C,IAAI,EAAE,GAAG,CAAC,IAAIO,YAAY,GAAGJ,kBAAkB,GAAGD,aAAa,EAAE;MACtFf,iBAAiB,EAAE;;IAGrB;IACA,IAAIjB,gBAAgB,CAACmC,IAAI,EAAE,KAAKD,UAAU,IAAI/C,kBAAkB,CAACgD,IAAI,EAAE,KAAKC,YAAY,EAAE;MACxFhB,sBAAsB,EAAE;;EAE5B,CAAC;EAED,MAAMsB,WAAW,GAAmC,MAAK;IACvD,IAAI,CAACxE,SAAS,EAAE;MACd;;IAGF,MAAM8D,aAAa,GAAG/B,aAAa,CAAC/B,SAAS,CAAC,GAAGG,OAAO,CAACC,OAAO;IAChEyD,oBAAoB,CAACC,aAAa,CAAC;EACrC,CAAC;EAED,MAAM9C,MAAM,GAA8ByD,mBAAQ,CAACD,WAAW,CAAC;EAE/D,MAAME,OAAO,GAA+B,CAACC,iBAAiB,EAAEC,WAAW,KAAI;IAC7EnB,MAAM,CAACoB,MAAM,CAAC1E,OAAO,EAAEyE,WAAW,CAAC;IACnC1E,SAAS,GAAG,IAAI;IAChBuD,MAAM,CAACqB,MAAM,CAACnE,aAAa,CAAC,CAAC+C,OAAO,CAACnB,IAAI,IAAIT,gBAAgB,CAACQ,OAAO,CAACC,IAAI,CAACK,EAAE,CAAC,CAAC;IAE/E5C,SAAS,GAAG2E,iBAAiB;IAC7B9D,cAAc,CAAC6D,OAAO,CAAC1E,SAAS,CAAC;EACnC,CAAC;EAED,MAAM+E,UAAU,GAAkC,MAAK;IACrD7E,SAAS,GAAG,KAAK;IACjBW,cAAc,CAACkE,UAAU,EAAE;EAC7B,CAAC;EAED,MAAMC,OAAO,GAA+BzC,IAAI,IAAG;IACjD,IAAI5B,aAAa,CAAC4B,IAAI,CAACK,EAAE,CAAC,EAAE;MAC1B;;IAGFjC,aAAa,CAAC4B,IAAI,CAACK,EAAE,CAAC,GAAGL,IAAI;IAE7B;IACA,IAAIrC,SAAS,EAAE;MACb4B,gBAAgB,CAACQ,OAAO,CAACC,IAAI,CAACK,EAAE,CAAC;;IAGnC,IAAIL,IAAI,CAACE,OAAO,EAAE;MAChB,IAAI,CAAC7B,cAAc,CAAC2B,IAAI,CAACE,OAAO,CAAC,EAAE;QACjC7B,cAAc,CAAC2B,IAAI,CAACE,OAAO,CAAC,GAAG;UAC7BI,cAAc,EAAE,IAAIoC,GAAG,EAAU;UACjCvC,gBAAgB,EAAE,IAAIuC,GAAG;SAC1B;;MAGHrE,cAAc,CAAC2B,IAAI,CAACE,OAAO,CAAC,CAACI,cAAc,CAACC,GAAG,CAACP,IAAI,CAACK,EAAE,CAAC;;IAG1D5B,MAAM,EAAE;EACV,CAAC;EAED,MAAMkE,eAAe,GAAuClD,EAAE,IAAG;IAC/D/B,YAAY,GAAG+B,EAAE;EACnB,CAAC;EAED,MAAMmD,kBAAkB,GAA0C,MAAK;IACrElF,YAAY,GAAGQ,SAAS;EAC1B,CAAC;EAED,MAAM2E,UAAU,GAAkC9B,MAAM,IAAG;IACzD,IAAI,CAAC3C,aAAa,CAAC2C,MAAM,CAAC,EAAE;MAC1B;;IAGF,MAAMf,IAAI,GAAG5B,aAAa,CAAC2C,MAAM,CAAC;IAClCxB,gBAAgB,CAACuD,MAAM,CAAC/B,MAAM,CAAC;IAC/BrC,kBAAkB,CAACoE,MAAM,CAAC/B,MAAM,CAAC;IAEjC,IAAIf,IAAI,CAACE,OAAO,EAAE;MAChB7B,cAAc,CAAC2B,IAAI,CAACE,OAAO,CAAC,CAACI,cAAc,CAACF,MAAM,CAACJ,IAAI,CAACK,EAAE,CAAC;MAC3DhC,cAAc,CAAC2B,IAAI,CAACE,OAAO,CAAC,CAACC,gBAAgB,CAACC,MAAM,CAACJ,IAAI,CAACK,EAAE,CAAC;;IAG/D,OAAOjC,aAAa,CAAC2C,MAAM,CAAC;IAC5BtC,MAAM,EAAE;EACV,CAAC;EAED,OAAO;IACLgE,OAAO;IACPD,UAAU;IACVP,WAAW;IACXE,OAAO;IACPU,UAAU;IACVpE,MAAM;IACNkE,eAAe;IACfC;GACD;AACH;AA9OAG","names":["createOverflowManager","container","overflowMenu","observing","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowGroups","resizeObserver","ResizeObserver","entries","update","invisibleItemQueue","priorityQueue_1","a","b","itemA","itemB","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","visibleItemQueue","getOffsetSize","el","offsetWidth","offsetHeight","makeItemVisible","nextVisible","dequeue","enqueue","item","visible","groupId","invisibleItemIds","delete","id","visibleItemIds","add","makeItemInvisible","nextInvisible","width","dispatchOverflowUpdate","all","visibleItems","map","itemId","invisibleItems","groupVisibility","Object","forEach","groupState","size","processOverflowItems","availableSize","overflowMenuOffset","visibleTop","peek","invisibleTop","currentWidth","reduce","sum","visibleItemId","child","forceUpdate","debounce_1","observe","observedContainer","userOptions","assign","values","disconnect","addItem","Set","addOverflowMenu","removeOverflowMenu","removeItem","remove","exports"],"sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/overflowManager.ts"],"sourcesContent":["import { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\nimport type { OverflowGroupState, OverflowItemEntry, OverflowManager, ObserveOptions } from './types';\n\n/**\n * @internal\n * @returns overflow manager instance\n */\nexport function createOverflowManager(): OverflowManager {\n let container: HTMLElement | undefined;\n let overflowMenu: HTMLElement | undefined;\n let observing = false;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowGroups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n const makeItemVisible = () => {\n const nextVisible = invisibleItemQueue.dequeue();\n visibleItemQueue.enqueue(nextVisible);\n\n const item = overflowItems[nextVisible];\n options.onUpdateItemVisibility({ item, visible: true });\n if (item.groupId) {\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n return getOffsetSize(item.element);\n };\n\n const makeItemInvisible = () => {\n const nextInvisible = visibleItemQueue.dequeue();\n invisibleItemQueue.enqueue(nextInvisible);\n\n const item = overflowItems[nextInvisible];\n const width = getOffsetSize(item.element);\n options.onUpdateItemVisibility({ item, visible: false });\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.add(item.id);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n const groupVisibility: Record<string, OverflowGroupState> = {};\n Object.entries(overflowGroups).forEach(([groupId, groupState]) => {\n if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (groupState.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n });\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const processOverflowItems = (availableSize: number) => {\n if (!container) {\n return;\n }\n\n const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n const visibleItemIds = visibleItemQueue.all();\n let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {\n const child = overflowItems[visibleItemId].element;\n return sum + getOffsetSize(child);\n }, 0);\n\n // Add items until available width is filled\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += makeItemVisible();\n }\n // Remove items until there's no more overlap\n while (currentWidth > availableSize && visibleItemQueue.size() > 0) {\n if (visibleItemQueue.size() === options.minimumVisible) {\n break;\n }\n currentWidth -= makeItemInvisible();\n }\n\n if (invisibleItemQueue.size() > 0 && currentWidth + overflowMenuOffset > availableSize) {\n makeItemInvisible();\n }\n\n // only update when the state of visible/invisible items has changed\n if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {\n dispatchOverflowUpdate();\n }\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (!container) {\n return;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n processOverflowItems(availableSize);\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));\n\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n observing = false;\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n if (overflowItems[item.id]) {\n return;\n }\n\n overflowItems[item.id] = item;\n\n // some options can affect priority which are only set on `observe`\n if (observing) {\n visibleItemQueue.enqueue(item.id);\n }\n\n if (item.groupId) {\n if (!overflowGroups[item.groupId]) {\n overflowGroups[item.groupId] = {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n }\n\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n update();\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n overflowMenu = el;\n };\n\n const removeOverflowMenu: OverflowManager['removeOverflowMenu'] = () => {\n overflowMenu = undefined;\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n if (!overflowItems[itemId]) {\n return;\n }\n\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n addOverflowMenu,\n removeOverflowMenu,\n };\n}\n"]}
1
+ {"version":3,"mappings":"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","names":["createOverflowManager","container","overflowMenu","observing","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowGroups","resizeObserver","ResizeObserver","entries","update","invisibleItemQueue","priorityQueue_1","a","b","itemA","itemB","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","visibleItemQueue","getOffsetSize","el","offsetWidth","offsetHeight","makeItemVisible","nextVisible","dequeue","enqueue","item","visible","groupId","invisibleItemIds","delete","id","visibleItemIds","add","makeItemInvisible","nextInvisible","width","dispatchOverflowUpdate","all","visibleItems","map","itemId","invisibleItems","groupVisibility","Object","forEach","groupState","size","processOverflowItems","availableSize","overflowMenuOffset","visibleTop","peek","invisibleTop","currentWidth","reduce","sum","visibleItemId","child","forceUpdate","debounce_1","observe","observedContainer","userOptions","assign","values","disconnect","addItem","Set","addOverflowMenu","removeOverflowMenu","removeItem","remove","exports"],"sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/overflowManager.ts"],"sourcesContent":["import { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\nimport type { OverflowGroupState, OverflowItemEntry, OverflowManager, ObserveOptions } from './types';\n\n/**\n * @internal\n * @returns overflow manager instance\n */\nexport function createOverflowManager(): OverflowManager {\n let container: HTMLElement | undefined;\n let overflowMenu: HTMLElement | undefined;\n let observing = false;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowGroups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n const makeItemVisible = () => {\n const nextVisible = invisibleItemQueue.dequeue();\n visibleItemQueue.enqueue(nextVisible);\n\n const item = overflowItems[nextVisible];\n options.onUpdateItemVisibility({ item, visible: true });\n if (item.groupId) {\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n return getOffsetSize(item.element);\n };\n\n const makeItemInvisible = () => {\n const nextInvisible = visibleItemQueue.dequeue();\n invisibleItemQueue.enqueue(nextInvisible);\n\n const item = overflowItems[nextInvisible];\n const width = getOffsetSize(item.element);\n options.onUpdateItemVisibility({ item, visible: false });\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.add(item.id);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n const groupVisibility: Record<string, OverflowGroupState> = {};\n Object.entries(overflowGroups).forEach(([groupId, groupState]) => {\n if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (groupState.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n });\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const processOverflowItems = (availableSize: number) => {\n if (!container) {\n return;\n }\n\n const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n const visibleItemIds = visibleItemQueue.all();\n let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {\n const child = overflowItems[visibleItemId].element;\n return sum + getOffsetSize(child);\n }, 0);\n\n // Add items until available width is filled - can result in overflow\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += makeItemVisible();\n }\n\n // Remove items until there's no more overflow\n while (currentWidth > availableSize && visibleItemQueue.size() > 0) {\n if (visibleItemQueue.size() <= options.minimumVisible) {\n break;\n }\n currentWidth -= makeItemInvisible();\n }\n\n // make sure the overflow menu can fit\n if (\n visibleItemQueue.size() > options.minimumVisible &&\n invisibleItemQueue.size() > 0 &&\n currentWidth + overflowMenuOffset > availableSize\n ) {\n makeItemInvisible();\n }\n\n // only update when the state of visible/invisible items has changed\n if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {\n dispatchOverflowUpdate();\n }\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (!container) {\n return;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n processOverflowItems(availableSize);\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));\n\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n observing = false;\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n if (overflowItems[item.id]) {\n return;\n }\n\n overflowItems[item.id] = item;\n\n // some options can affect priority which are only set on `observe`\n if (observing) {\n visibleItemQueue.enqueue(item.id);\n }\n\n if (item.groupId) {\n if (!overflowGroups[item.groupId]) {\n overflowGroups[item.groupId] = {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n }\n\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n update();\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n overflowMenu = el;\n };\n\n const removeOverflowMenu: OverflowManager['removeOverflowMenu'] = () => {\n overflowMenu = undefined;\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n if (!overflowItems[itemId]) {\n return;\n }\n\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n addOverflowMenu,\n removeOverflowMenu,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui/priority-overflow",
3
- "version": "0.0.0-nightly-20230109-0423.1",
3
+ "version": "0.0.0-nightly-20230110-0424.1",
4
4
  "description": "Vanilla JS utilities to implement overflow menus",
5
5
  "main": "lib-commonjs/index.js",
6
6
  "module": "lib/index.js",