@fluentui/priority-overflow 0.0.0-nightly-20230223-2115.1 → 0.0.0-nightly-20230227-0424.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.json CHANGED
@@ -2,9 +2,9 @@
2
2
  "name": "@fluentui/priority-overflow",
3
3
  "entries": [
4
4
  {
5
- "date": "Thu, 23 Feb 2023 21:23:04 GMT",
6
- "tag": "@fluentui/priority-overflow_v0.0.0-nightly-20230223-2115.1",
7
- "version": "0.0.0-nightly-20230223-2115.1",
5
+ "date": "Mon, 27 Feb 2023 04:31:35 GMT",
6
+ "tag": "@fluentui/priority-overflow_v0.0.0-nightly-20230227-0424.1",
7
+ "version": "0.0.0-nightly-20230227-0424.1",
8
8
  "comments": {
9
9
  "prerelease": [
10
10
  {
package/CHANGELOG.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # Change Log - @fluentui/priority-overflow
2
2
 
3
- This log was last generated on Thu, 23 Feb 2023 21:23:04 GMT and should not be manually modified.
3
+ This log was last generated on Mon, 27 Feb 2023 04:31:35 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
- ## [0.0.0-nightly-20230223-2115.1](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v0.0.0-nightly-20230223-2115.1)
7
+ ## [0.0.0-nightly-20230227-0424.1](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v0.0.0-nightly-20230227-0424.1)
8
8
 
9
- Thu, 23 Feb 2023 21:23:04 GMT
10
- [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.0.1..@fluentui/priority-overflow_v0.0.0-nightly-20230223-2115.1)
9
+ Mon, 27 Feb 2023 04:31:35 GMT
10
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.0.1..@fluentui/priority-overflow_v0.0.0-nightly-20230227-0424.1)
11
11
 
12
12
  ### Changes
13
13
 
package/lib/debounce.js CHANGED
@@ -3,7 +3,8 @@
3
3
  * https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide
4
4
  * @param fn - Function to debounce
5
5
  * @returns debounced function
6
- */export function debounce(fn) {
6
+ */
7
+ export function debounce(fn) {
7
8
  let pending;
8
9
  return () => {
9
10
  if (!pending) {
@@ -1 +1 @@
1
- {"version":3,"mappings":"AAAA;;;;;GAMA,OAAO,SAASA,SAASC,EAAY,EAAE;EACrC,IAAIC;EACJ,OAAO,MAAM;IACX,IAAI,CAACA,SAAS;MACZA,UAAU,IAAI;MACdC,eAAe,MAAM;QACnB;QACA;QACAD,UAAU,KAAK;QACfD;MACF;IACF;EACF;AACF","names":["debounce","fn","pending","queueMicrotask"],"sources":["../src/debounce.ts"],"sourcesContent":["/**\n * Microtask debouncer\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide\n * @param fn - Function to debounce\n * @returns debounced function\n */\nexport function debounce(fn: Function) {\n let pending: boolean;\n return () => {\n if (!pending) {\n pending = true;\n queueMicrotask(() => {\n // Need to set pending to `false` before the debounced function is run.\n // React can actually interrupt the function while it's running!\n pending = false;\n fn();\n });\n }\n };\n}\n"]}
1
+ {"version":3,"mappings":"AAAA;;;;;;AAMA,OAAM,SAAUA,QAAQ,CAACC,EAAY;EACnC,IAAIC,OAAgB;EACpB,OAAO,MAAK;IACV,IAAI,CAACA,OAAO,EAAE;MACZA,OAAO,GAAG,IAAI;MACdC,cAAc,CAAC,MAAK;QAClB;QACA;QACAD,OAAO,GAAG,KAAK;QACfD,EAAE,EAAE;MACN,CAAC,CAAC;;EAEN,CAAC;AACH","names":["debounce","fn","pending","queueMicrotask"],"sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/debounce.ts"],"sourcesContent":["/**\n * Microtask debouncer\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide\n * @param fn - Function to debounce\n * @returns debounced function\n */\nexport function debounce(fn: Function) {\n let pending: boolean;\n return () => {\n if (!pending) {\n pending = true;\n queueMicrotask(() => {\n // Need to set pending to `false` before the debounced function is run.\n // React can actually interrupt the function while it's running!\n pending = false;\n fn();\n });\n }\n };\n}\n"]}
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"mappings":"AAAA,SAASA,qBAAqB,QAAQ","names":["createOverflowManager"],"sources":["../src/index.ts"],"sourcesContent":["export { createOverflowManager } from './overflowManager';\nexport type {\n ObserveOptions,\n OnUpdateItemVisibility,\n OnUpdateItemVisibilityPayload,\n OnUpdateOverflow,\n OverflowAxis,\n OverflowDirection,\n OverflowEventPayload,\n OverflowGroupState,\n OverflowItemEntry,\n OverflowManager,\n} from './types';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC","sourcesContent":["export { createOverflowManager } from './overflowManager';\nexport type {\n ObserveOptions,\n OnUpdateItemVisibility,\n OnUpdateItemVisibilityPayload,\n OnUpdateOverflow,\n OverflowAxis,\n OverflowDirection,\n OverflowEventPayload,\n OverflowGroupState,\n OverflowItemEntry,\n OverflowManager,\n} from './types';\n"]}
@@ -91,8 +91,7 @@ export function createOverflowManager() {
91
91
  const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);
92
92
  const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);
93
93
  const groupVisibility = {};
94
- Object.entries(overflowGroups).forEach(param => {
95
- let [groupId, groupState] = param;
94
+ Object.entries(overflowGroups).forEach(([groupId, groupState]) => {
96
95
  if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {
97
96
  groupVisibility[groupId] = 'overflow';
98
97
  } else if (groupState.visibleItemIds.size === 0) {
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["debounce","createPriorityQueue","createOverflowManager","container","overflowMenu","observing","forceDispatch","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowGroups","resizeObserver","ResizeObserver","entries","update","invisibleItemQueue","a","b","itemA","itemB","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","visibleItemQueue","getOffsetSize","el","offsetWidth","offsetHeight","makeItemVisible","nextVisible","dequeue","enqueue","item","visible","groupId","invisibleItemIds","delete","id","visibleItemIds","add","makeItemInvisible","nextInvisible","width","dispatchOverflowUpdate","all","visibleItems","map","itemId","invisibleItems","groupVisibility","Object","forEach","param","groupState","size","processOverflowItems","availableSize","overflowMenuOffset","visibleTop","peek","invisibleTop","currentWidth","reduce","sum","visibleItemId","child","forceUpdate","observe","observedContainer","userOptions","assign","values","disconnect","addItem","Set","addOverflowMenu","removeOverflowMenu","removeItem","remove"],"sources":["../src/overflowManager.ts"],"sourcesContent":["import { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\nimport type { OverflowGroupState, OverflowItemEntry, OverflowManager, ObserveOptions } from './types';\n\n/**\n * @internal\n * @returns overflow manager instance\n */\nexport function createOverflowManager(): OverflowManager {\n let container: HTMLElement | undefined;\n let overflowMenu: HTMLElement | undefined;\n // Set as true when resize observer is observing\n let observing = false;\n // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change\n let forceDispatch = false;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowGroups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n const makeItemVisible = () => {\n const nextVisible = invisibleItemQueue.dequeue();\n visibleItemQueue.enqueue(nextVisible);\n\n const item = overflowItems[nextVisible];\n options.onUpdateItemVisibility({ item, visible: true });\n if (item.groupId) {\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n return getOffsetSize(item.element);\n };\n\n const makeItemInvisible = () => {\n const nextInvisible = visibleItemQueue.dequeue();\n invisibleItemQueue.enqueue(nextInvisible);\n\n const item = overflowItems[nextInvisible];\n const width = getOffsetSize(item.element);\n options.onUpdateItemVisibility({ item, visible: false });\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.add(item.id);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n const groupVisibility: Record<string, OverflowGroupState> = {};\n Object.entries(overflowGroups).forEach(([groupId, groupState]) => {\n if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (groupState.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n });\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const processOverflowItems = (): boolean => {\n if (!container) {\n return false;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n const visibleItemIds = visibleItemQueue.all();\n let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {\n const child = overflowItems[visibleItemId].element;\n return sum + getOffsetSize(child);\n }, 0);\n\n // Add items until available width is filled - can result in overflow\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += makeItemVisible();\n }\n\n // Remove items until there's no more overflow\n while (currentWidth > availableSize && visibleItemQueue.size() > 0) {\n if (visibleItemQueue.size() <= options.minimumVisible) {\n break;\n }\n currentWidth -= makeItemInvisible();\n }\n\n // make sure the overflow menu can fit\n if (\n visibleItemQueue.size() > options.minimumVisible &&\n invisibleItemQueue.size() > 0 &&\n currentWidth + overflowMenuOffset > availableSize\n ) {\n makeItemInvisible();\n }\n\n // only update when the state of visible/invisible items has changed\n if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {\n return true;\n }\n\n return false;\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (processOverflowItems() || forceDispatch) {\n forceDispatch = false;\n dispatchOverflowUpdate();\n }\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));\n\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n observing = false;\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n if (overflowItems[item.id]) {\n return;\n }\n\n overflowItems[item.id] = item;\n\n // some options can affect priority which are only set on `observe`\n if (observing) {\n // Updates to elements might not change the queue tops\n // i.e. new element is enqueued but the top of the queue stays the same\n // force a dispatch on the next batched update\n forceDispatch = true;\n visibleItemQueue.enqueue(item.id);\n }\n\n if (item.groupId) {\n if (!overflowGroups[item.groupId]) {\n overflowGroups[item.groupId] = {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n }\n\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n update();\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n overflowMenu = el;\n };\n\n const removeOverflowMenu: OverflowManager['removeOverflowMenu'] = () => {\n overflowMenu = undefined;\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n if (!overflowItems[itemId]) {\n return;\n }\n\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n addOverflowMenu,\n removeOverflowMenu,\n };\n}\n"]}
1
+ {"version":3,"mappings":"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","names":["debounce","createPriorityQueue","createOverflowManager","container","overflowMenu","observing","forceDispatch","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowGroups","resizeObserver","ResizeObserver","entries","update","invisibleItemQueue","a","b","itemA","itemB","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","visibleItemQueue","getOffsetSize","el","offsetWidth","offsetHeight","makeItemVisible","nextVisible","dequeue","enqueue","item","visible","groupId","invisibleItemIds","delete","id","visibleItemIds","add","makeItemInvisible","nextInvisible","width","dispatchOverflowUpdate","all","visibleItems","map","itemId","invisibleItems","groupVisibility","Object","forEach","groupState","size","processOverflowItems","availableSize","overflowMenuOffset","visibleTop","peek","invisibleTop","currentWidth","reduce","sum","visibleItemId","child","forceUpdate","observe","observedContainer","userOptions","assign","values","disconnect","addItem","Set","addOverflowMenu","removeOverflowMenu","removeItem","remove"],"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 // Set as true when resize observer is observing\n let observing = false;\n // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change\n let forceDispatch = false;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowGroups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n const makeItemVisible = () => {\n const nextVisible = invisibleItemQueue.dequeue();\n visibleItemQueue.enqueue(nextVisible);\n\n const item = overflowItems[nextVisible];\n options.onUpdateItemVisibility({ item, visible: true });\n if (item.groupId) {\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n return getOffsetSize(item.element);\n };\n\n const makeItemInvisible = () => {\n const nextInvisible = visibleItemQueue.dequeue();\n invisibleItemQueue.enqueue(nextInvisible);\n\n const item = overflowItems[nextInvisible];\n const width = getOffsetSize(item.element);\n options.onUpdateItemVisibility({ item, visible: false });\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.add(item.id);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n const groupVisibility: Record<string, OverflowGroupState> = {};\n Object.entries(overflowGroups).forEach(([groupId, groupState]) => {\n if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (groupState.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n });\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const processOverflowItems = (): boolean => {\n if (!container) {\n return false;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n const visibleItemIds = visibleItemQueue.all();\n let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {\n const child = overflowItems[visibleItemId].element;\n return sum + getOffsetSize(child);\n }, 0);\n\n // Add items until available width is filled - can result in overflow\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += makeItemVisible();\n }\n\n // Remove items until there's no more overflow\n while (currentWidth > availableSize && visibleItemQueue.size() > 0) {\n if (visibleItemQueue.size() <= options.minimumVisible) {\n break;\n }\n currentWidth -= makeItemInvisible();\n }\n\n // make sure the overflow menu can fit\n if (\n visibleItemQueue.size() > options.minimumVisible &&\n invisibleItemQueue.size() > 0 &&\n currentWidth + overflowMenuOffset > availableSize\n ) {\n makeItemInvisible();\n }\n\n // only update when the state of visible/invisible items has changed\n if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {\n return true;\n }\n\n return false;\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (processOverflowItems() || forceDispatch) {\n forceDispatch = false;\n dispatchOverflowUpdate();\n }\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));\n\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n observing = false;\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n if (overflowItems[item.id]) {\n return;\n }\n\n overflowItems[item.id] = item;\n\n // some options can affect priority which are only set on `observe`\n if (observing) {\n // Updates to elements might not change the queue tops\n // i.e. new element is enqueued but the top of the queue stays the same\n // force a dispatch on the next batched update\n forceDispatch = true;\n visibleItemQueue.enqueue(item.id);\n }\n\n if (item.groupId) {\n if (!overflowGroups[item.groupId]) {\n overflowGroups[item.groupId] = {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n }\n\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n update();\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n overflowMenu = el;\n };\n\n const removeOverflowMenu: OverflowManager['removeOverflowMenu'] = () => {\n overflowMenu = undefined;\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n if (!overflowItems[itemId]) {\n return;\n }\n\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n addOverflowMenu,\n removeOverflowMenu,\n };\n}\n"]}
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * @param compare - comparison function for items
3
3
  * @returns Priority queue implemented with a min heap
4
- */export function createPriorityQueue(compare) {
4
+ */
5
+ export function createPriorityQueue(compare) {
5
6
  const arr = [];
6
7
  let size = 0;
7
8
  const left = i => {
@@ -1 +1 @@
1
- {"version":3,"mappings":"AAaA;;;GAIA,OAAO,SAASA,oBAAuBC,OAAkC,EAAoB;EAC3F,MAAMC,MAAW,EAAE;EACnB,IAAIC,OAAO;EAEX,MAAMC,OAAQC,KAAc;IAC1B,OAAO,IAAIA,IAAI;EACjB;EAEA,MAAMC,QAASD,KAAc;IAC3B,OAAO,IAAIA,IAAI;EACjB;EAEA,MAAME,SAAUF,KAAc;IAC5B,OAAOG,KAAKC,KAAK,CAAC,CAACJ,IAAI,KAAK;EAC9B;EAEA,MAAMK,OAAO,CAACC,GAAWC,MAAc;IACrC,MAAMC,MAAMX,GAAG,CAACS,EAAE;IAClBT,GAAG,CAACS,EAAE,GAAGT,GAAG,CAACU,EAAE;IACfV,GAAG,CAACU,EAAE,GAAGC;EACX;EAEA,MAAMC,UAAWT,KAAc;IAC7B,IAAIU,WAAWV;IACf,MAAMW,IAAIZ,KAAKC;IACf,MAAMY,IAAIX,MAAMD;IAEhB,IAAIW,IAAIb,QAAQF,QAAQC,GAAG,CAACc,EAAE,EAAEd,GAAG,CAACa,SAAS,IAAI,GAAG;MAClDA,WAAWC;IACb;IAEA,IAAIC,IAAId,QAAQF,QAAQC,GAAG,CAACe,EAAE,EAAEf,GAAG,CAACa,SAAS,IAAI,GAAG;MAClDA,WAAWE;IACb;IAEA,IAAIF,aAAaV,GAAG;MAClBK,KAAKK,UAAUV;MACfS,QAAQC;IACV;EACF;EAEA,MAAMG,UAAU,MAAM;IACpB,IAAIf,SAAS,GAAG;MACd,MAAM,IAAIgB,MAAM;IAClB;IAEA,MAAMC,MAAMlB,GAAG,CAAC,EAAE;IAClBA,GAAG,CAAC,EAAE,GAAGA,GAAG,CAAC,EAAEC,KAAK;IACpBW,QAAQ;IAER,OAAOM;EACT;EAEA,MAAMC,OAAO,MAAM;IACjB,IAAIlB,SAAS,GAAG;MACd,OAAO,IAAI;IACb;IAEA,OAAOD,GAAG,CAAC,EAAE;EACf;EAEA,MAAMoB,UAAWC,QAAY;IAC3BrB,GAAG,CAACC,OAAO,GAAGoB;IACd,IAAIlB,IAAIF,OAAO;IACf,IAAIqB,IAAIjB,OAAOF;IACf,OAAOA,IAAI,KAAKJ,QAAQC,GAAG,CAACsB,EAAE,EAAEtB,GAAG,CAACG,EAAE,IAAI,GAAG;MAC3CK,KAAKc,GAAGnB;MACRA,IAAImB;MACJA,IAAIjB,OAAOF;IACb;EACF;EAEA,MAAMoB,WAAYF,QAAY;IAC5B,MAAMG,QAAQxB,IAAIyB,OAAO,CAACJ;IAC1B,OAAOG,SAAS,KAAKA,QAAQvB;EAC/B;EAEA,MAAMyB,SAAUL,QAAY;IAC1B,MAAMlB,IAAIH,IAAIyB,OAAO,CAACJ;IAEtB,IAAIlB,MAAM,CAAC,KAAKA,KAAKF,MAAM;MACzB;IACF;IAEAD,GAAG,CAACG,EAAE,GAAGH,GAAG,CAAC,EAAEC,KAAK;IACpBW,QAAQT;EACV;EAEA,MAAMwB,QAAQ,MAAM;IAClB1B,OAAO;EACT;EAEA,MAAM2B,MAAM,MAAM;IAChB,OAAO5B,IAAI6B,KAAK,CAAC,GAAG5B;EACtB;EAEA,OAAO;IACL2B;IACAD;IACAJ;IACAP;IACAI;IACAD;IACAO;IACAzB,MAAM,MAAMA;EACd;AACF","names":["createPriorityQueue","compare","arr","size","left","i","right","parent","Math","floor","swap","a","b","tmp","heapify","smallest","l","r","dequeue","Error","res","peek","enqueue","item","p","contains","index","indexOf","remove","clear","all","slice"],"sources":["../src/priorityQueue.ts"],"sourcesContent":["export type PriorityQueueCompareFn<T> = (a: T, b: T) => number;\n\nexport interface PriorityQueue<T> {\n all: () => T[];\n clear: () => void;\n contains: (item: T) => boolean;\n dequeue: () => T;\n enqueue: (item: T) => void;\n peek: () => T | null;\n remove: (item: T) => void;\n size: () => number;\n}\n\n/**\n * @param compare - comparison function for items\n * @returns Priority queue implemented with a min heap\n */\nexport function createPriorityQueue<T>(compare: PriorityQueueCompareFn<T>): PriorityQueue<T> {\n const arr: T[] = [];\n let size = 0;\n\n const left = (i: number) => {\n return 2 * i + 1;\n };\n\n const right = (i: number) => {\n return 2 * i + 2;\n };\n\n const parent = (i: number) => {\n return Math.floor((i - 1) / 2);\n };\n\n const swap = (a: number, b: number) => {\n const tmp = arr[a];\n arr[a] = arr[b];\n arr[b] = tmp;\n };\n\n const heapify = (i: number) => {\n let smallest = i;\n const l = left(i);\n const r = right(i);\n\n if (l < size && compare(arr[l], arr[smallest]) < 0) {\n smallest = l;\n }\n\n if (r < size && compare(arr[r], arr[smallest]) < 0) {\n smallest = r;\n }\n\n if (smallest !== i) {\n swap(smallest, i);\n heapify(smallest);\n }\n };\n\n const dequeue = () => {\n if (size === 0) {\n throw new Error('Priority queue empty');\n }\n\n const res = arr[0];\n arr[0] = arr[--size];\n heapify(0);\n\n return res;\n };\n\n const peek = () => {\n if (size === 0) {\n return null;\n }\n\n return arr[0];\n };\n\n const enqueue = (item: T) => {\n arr[size++] = item;\n let i = size - 1;\n let p = parent(i);\n while (i > 0 && compare(arr[p], arr[i]) > 0) {\n swap(p, i);\n i = p;\n p = parent(i);\n }\n };\n\n const contains = (item: T) => {\n const index = arr.indexOf(item);\n return index >= 0 && index < size;\n };\n\n const remove = (item: T) => {\n const i = arr.indexOf(item);\n\n if (i === -1 || i >= size) {\n return;\n }\n\n arr[i] = arr[--size];\n heapify(i);\n };\n\n const clear = () => {\n size = 0;\n };\n\n const all = () => {\n return arr.slice(0, size);\n };\n\n return {\n all,\n clear,\n contains,\n dequeue,\n enqueue,\n peek,\n remove,\n size: () => size,\n };\n}\n"]}
1
+ {"version":3,"mappings":"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","names":["createPriorityQueue","compare","arr","size","left","i","right","parent","Math","floor","swap","a","b","tmp","heapify","smallest","l","r","dequeue","Error","res","peek","enqueue","item","p","contains","index","indexOf","remove","clear","all","slice"],"sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/priorityQueue.ts"],"sourcesContent":["export type PriorityQueueCompareFn<T> = (a: T, b: T) => number;\n\nexport interface PriorityQueue<T> {\n all: () => T[];\n clear: () => void;\n contains: (item: T) => boolean;\n dequeue: () => T;\n enqueue: (item: T) => void;\n peek: () => T | null;\n remove: (item: T) => void;\n size: () => number;\n}\n\n/**\n * @param compare - comparison function for items\n * @returns Priority queue implemented with a min heap\n */\nexport function createPriorityQueue<T>(compare: PriorityQueueCompareFn<T>): PriorityQueue<T> {\n const arr: T[] = [];\n let size = 0;\n\n const left = (i: number) => {\n return 2 * i + 1;\n };\n\n const right = (i: number) => {\n return 2 * i + 2;\n };\n\n const parent = (i: number) => {\n return Math.floor((i - 1) / 2);\n };\n\n const swap = (a: number, b: number) => {\n const tmp = arr[a];\n arr[a] = arr[b];\n arr[b] = tmp;\n };\n\n const heapify = (i: number) => {\n let smallest = i;\n const l = left(i);\n const r = right(i);\n\n if (l < size && compare(arr[l], arr[smallest]) < 0) {\n smallest = l;\n }\n\n if (r < size && compare(arr[r], arr[smallest]) < 0) {\n smallest = r;\n }\n\n if (smallest !== i) {\n swap(smallest, i);\n heapify(smallest);\n }\n };\n\n const dequeue = () => {\n if (size === 0) {\n throw new Error('Priority queue empty');\n }\n\n const res = arr[0];\n arr[0] = arr[--size];\n heapify(0);\n\n return res;\n };\n\n const peek = () => {\n if (size === 0) {\n return null;\n }\n\n return arr[0];\n };\n\n const enqueue = (item: T) => {\n arr[size++] = item;\n let i = size - 1;\n let p = parent(i);\n while (i > 0 && compare(arr[p], arr[i]) > 0) {\n swap(p, i);\n i = p;\n p = parent(i);\n }\n };\n\n const contains = (item: T) => {\n const index = arr.indexOf(item);\n return index >= 0 && index < size;\n };\n\n const remove = (item: T) => {\n const i = arr.indexOf(item);\n\n if (i === -1 || i >= size) {\n return;\n }\n\n arr[i] = arr[--size];\n heapify(i);\n };\n\n const clear = () => {\n size = 0;\n };\n\n const all = () => {\n return arr.slice(0, size);\n };\n\n return {\n all,\n clear,\n contains,\n dequeue,\n enqueue,\n peek,\n remove,\n size: () => size,\n };\n}\n"]}
package/lib/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"mappings":"AAAA","names":[],"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\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 * Unsets the overflow menu element\n */\n removeOverflowMenu: () => void;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/types.ts"],"names":[],"mappings":"","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\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 * Unsets the overflow menu element\n */\n removeOverflowMenu: () => void;\n}\n"]}
@@ -1,29 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.debounce = void 0;
1
7
  /**
2
8
  * Microtask debouncer
3
9
  * https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide
4
10
  * @param fn - Function to debounce
5
11
  * @returns debounced function
6
- */ "use strict";
7
- Object.defineProperty(exports, "__esModule", {
8
- value: true
9
- });
10
- Object.defineProperty(exports, "debounce", {
11
- enumerable: true,
12
- get: ()=>debounce
13
- });
12
+ */
14
13
  function debounce(fn) {
15
- let pending;
16
- return ()=>{
17
- if (!pending) {
18
- pending = true;
19
- queueMicrotask(()=>{
20
- // Need to set pending to `false` before the debounced function is run.
21
- // React can actually interrupt the function while it's running!
22
- pending = false;
23
- fn();
24
- });
25
- }
26
- };
27
- } //# sourceMappingURL=debounce.js.map
28
-
14
+ let pending;
15
+ return () => {
16
+ if (!pending) {
17
+ pending = true;
18
+ queueMicrotask(() => {
19
+ // Need to set pending to `false` before the debounced function is run.
20
+ // React can actually interrupt the function while it's running!
21
+ pending = false;
22
+ fn();
23
+ });
24
+ }
25
+ };
26
+ }
27
+ exports.debounce = debounce;
29
28
  //# sourceMappingURL=debounce.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../lib/debounce.js"],"sourcesContent":["/**\n * Microtask debouncer\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide\n * @param fn - Function to debounce\n * @returns debounced function\n */export function debounce(fn) {\n let pending;\n return () => {\n if (!pending) {\n pending = true;\n queueMicrotask(() => {\n // Need to set pending to `false` before the debounced function is run.\n // React can actually interrupt the function while it's running!\n pending = false;\n fn();\n });\n }\n };\n}\n//# sourceMappingURL=debounce.js.map"],"names":["debounce","fn","pending","queueMicrotask"],"mappings":"AAAA;;;;;CAKC;;;;+BAAkBA;;aAAAA;;AAAT,SAASA,SAASC,EAAE,EAAE;IAC9B,IAAIC;IACJ,OAAO,IAAM;QACX,IAAI,CAACA,SAAS;YACZA,UAAU,IAAI;YACdC,eAAe,IAAM;gBACnB,uEAAuE;gBACvE,gEAAgE;gBAChED,UAAU,KAAK;gBACfD;YACF;QACF,CAAC;IACH;AACF,EACA,oCAAoC"}
1
+ {"version":3,"mappings":";;;;;;AAAA;;;;;;AAMA,SAAgBA,QAAQ,CAACC,EAAY;EACnC,IAAIC,OAAgB;EACpB,OAAO,MAAK;IACV,IAAI,CAACA,OAAO,EAAE;MACZA,OAAO,GAAG,IAAI;MACdC,cAAc,CAAC,MAAK;QAClB;QACA;QACAD,OAAO,GAAG,KAAK;QACfD,EAAE,EAAE;MACN,CAAC,CAAC;;EAEN,CAAC;AACH;AAbAG","names":["debounce","fn","pending","queueMicrotask","exports"],"sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/debounce.ts"],"sourcesContent":["/**\n * Microtask debouncer\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide\n * @param fn - Function to debounce\n * @returns debounced function\n */\nexport function debounce(fn: Function) {\n let pending: boolean;\n return () => {\n if (!pending) {\n pending = true;\n queueMicrotask(() => {\n // Need to set pending to `false` before the debounced function is run.\n // React can actually interrupt the function while it's running!\n pending = false;\n fn();\n });\n }\n };\n}\n"]}
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
+
2
3
  Object.defineProperty(exports, "__esModule", {
3
- value: true
4
+ value: true
4
5
  });
6
+ exports.createOverflowManager = void 0;
7
+ var overflowManager_1 = /*#__PURE__*/require("./overflowManager");
5
8
  Object.defineProperty(exports, "createOverflowManager", {
6
- enumerable: true,
7
- get: ()=>_overflowManager.createOverflowManager
9
+ enumerable: true,
10
+ get: function () {
11
+ return overflowManager_1.createOverflowManager;
12
+ }
8
13
  });
9
- const _overflowManager = require("./overflowManager");
10
- //# sourceMappingURL=index.js.map
11
-
12
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../lib/index.js"],"sourcesContent":["export { createOverflowManager } from './overflowManager';\n//# sourceMappingURL=index.js.map"],"names":["createOverflowManager"],"mappings":";;;;+BAASA;;aAAAA,sCAAqB;;iCAAQ;CACtC,iCAAiC"}
1
+ {"version":3,"mappings":";;;;;;AAAA;AAASA;EAAAC;EAAAC;IAAA,8CAAqB;EAAA;AAAA","names":["Object","enumerable","get"],"sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/index.ts"],"sourcesContent":["export { createOverflowManager } from './overflowManager';\nexport type {\n ObserveOptions,\n OnUpdateItemVisibility,\n OnUpdateItemVisibilityPayload,\n OnUpdateOverflow,\n OverflowAxis,\n OverflowDirection,\n OverflowEventPayload,\n OverflowGroupState,\n OverflowItemEntry,\n OverflowManager,\n} from './types';\n"]}
@@ -1,223 +1,224 @@
1
1
  "use strict";
2
+
2
3
  Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "createOverflowManager", {
6
- enumerable: true,
7
- get: ()=>createOverflowManager
4
+ value: true
8
5
  });
9
- const _debounce = require("./debounce");
10
- const _priorityQueue = require("./priorityQueue");
6
+ exports.createOverflowManager = void 0;
7
+ const debounce_1 = /*#__PURE__*/require("./debounce");
8
+ const priorityQueue_1 = /*#__PURE__*/require("./priorityQueue");
9
+ /**
10
+ * @internal
11
+ * @returns overflow manager instance
12
+ */
11
13
  function createOverflowManager() {
12
- let container;
13
- let overflowMenu;
14
- // Set as true when resize observer is observing
15
- let observing = false;
16
- // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change
17
- let forceDispatch = false;
18
- const options = {
19
- padding: 10,
20
- overflowAxis: 'horizontal',
21
- overflowDirection: 'end',
22
- minimumVisible: 0,
23
- onUpdateItemVisibility: ()=>undefined,
24
- onUpdateOverflow: ()=>undefined
25
- };
26
- const overflowItems = {};
27
- const overflowGroups = {};
28
- const resizeObserver = new ResizeObserver((entries)=>{
29
- if (!entries[0] || !container) {
30
- return;
31
- }
32
- update();
14
+ let container;
15
+ let overflowMenu;
16
+ // Set as true when resize observer is observing
17
+ let observing = false;
18
+ // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change
19
+ let forceDispatch = false;
20
+ const options = {
21
+ padding: 10,
22
+ overflowAxis: 'horizontal',
23
+ overflowDirection: 'end',
24
+ minimumVisible: 0,
25
+ onUpdateItemVisibility: () => undefined,
26
+ onUpdateOverflow: () => undefined
27
+ };
28
+ const overflowItems = {};
29
+ const overflowGroups = {};
30
+ const resizeObserver = new ResizeObserver(entries => {
31
+ if (!entries[0] || !container) {
32
+ return;
33
+ }
34
+ update();
35
+ });
36
+ const invisibleItemQueue = priorityQueue_1.createPriorityQueue((a, b) => {
37
+ const itemA = overflowItems[a];
38
+ const itemB = overflowItems[b];
39
+ // Higher priority at the top of the queue
40
+ const priority = itemB.priority - itemA.priority;
41
+ if (priority !== 0) {
42
+ return priority;
43
+ }
44
+ const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
45
+ // equal priority, use DOM order
46
+ // eslint-disable-next-line no-bitwise
47
+ return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
48
+ });
49
+ const visibleItemQueue = priorityQueue_1.createPriorityQueue((a, b) => {
50
+ const itemA = overflowItems[a];
51
+ const itemB = overflowItems[b];
52
+ // Lower priority at the top of the queue
53
+ const priority = itemA.priority - itemB.priority;
54
+ if (priority !== 0) {
55
+ return priority;
56
+ }
57
+ const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;
58
+ // equal priority, use DOM order
59
+ // eslint-disable-next-line no-bitwise
60
+ return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
61
+ });
62
+ const getOffsetSize = el => {
63
+ return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;
64
+ };
65
+ const makeItemVisible = () => {
66
+ const nextVisible = invisibleItemQueue.dequeue();
67
+ visibleItemQueue.enqueue(nextVisible);
68
+ const item = overflowItems[nextVisible];
69
+ options.onUpdateItemVisibility({
70
+ item,
71
+ visible: true
33
72
  });
34
- const invisibleItemQueue = (0, _priorityQueue.createPriorityQueue)((a, b)=>{
35
- const itemA = overflowItems[a];
36
- const itemB = overflowItems[b];
37
- // Higher priority at the top of the queue
38
- const priority = itemB.priority - itemA.priority;
39
- if (priority !== 0) {
40
- return priority;
41
- }
42
- const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
43
- // equal priority, use DOM order
44
- // eslint-disable-next-line no-bitwise
45
- return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
73
+ if (item.groupId) {
74
+ overflowGroups[item.groupId].invisibleItemIds.delete(item.id);
75
+ overflowGroups[item.groupId].visibleItemIds.add(item.id);
76
+ }
77
+ return getOffsetSize(item.element);
78
+ };
79
+ const makeItemInvisible = () => {
80
+ const nextInvisible = visibleItemQueue.dequeue();
81
+ invisibleItemQueue.enqueue(nextInvisible);
82
+ const item = overflowItems[nextInvisible];
83
+ const width = getOffsetSize(item.element);
84
+ options.onUpdateItemVisibility({
85
+ item,
86
+ visible: false
46
87
  });
47
- const visibleItemQueue = (0, _priorityQueue.createPriorityQueue)((a, b)=>{
48
- const itemA = overflowItems[a];
49
- const itemB = overflowItems[b];
50
- // Lower priority at the top of the queue
51
- const priority = itemA.priority - itemB.priority;
52
- if (priority !== 0) {
53
- return priority;
54
- }
55
- const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;
56
- // equal priority, use DOM order
57
- // eslint-disable-next-line no-bitwise
58
- return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
88
+ if (item.groupId) {
89
+ overflowGroups[item.groupId].visibleItemIds.delete(item.id);
90
+ overflowGroups[item.groupId].invisibleItemIds.add(item.id);
91
+ }
92
+ return width;
93
+ };
94
+ const dispatchOverflowUpdate = () => {
95
+ const visibleItemIds = visibleItemQueue.all();
96
+ const invisibleItemIds = invisibleItemQueue.all();
97
+ const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);
98
+ const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);
99
+ const groupVisibility = {};
100
+ Object.entries(overflowGroups).forEach(([groupId, groupState]) => {
101
+ if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {
102
+ groupVisibility[groupId] = 'overflow';
103
+ } else if (groupState.visibleItemIds.size === 0) {
104
+ groupVisibility[groupId] = 'hidden';
105
+ } else {
106
+ groupVisibility[groupId] = 'visible';
107
+ }
59
108
  });
60
- const getOffsetSize = (el)=>{
61
- return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;
62
- };
63
- const makeItemVisible = ()=>{
64
- const nextVisible = invisibleItemQueue.dequeue();
65
- visibleItemQueue.enqueue(nextVisible);
66
- const item = overflowItems[nextVisible];
67
- options.onUpdateItemVisibility({
68
- item,
69
- visible: true
70
- });
71
- if (item.groupId) {
72
- overflowGroups[item.groupId].invisibleItemIds.delete(item.id);
73
- overflowGroups[item.groupId].visibleItemIds.add(item.id);
74
- }
75
- return getOffsetSize(item.element);
76
- };
77
- const makeItemInvisible = ()=>{
78
- const nextInvisible = visibleItemQueue.dequeue();
79
- invisibleItemQueue.enqueue(nextInvisible);
80
- const item = overflowItems[nextInvisible];
81
- const width = getOffsetSize(item.element);
82
- options.onUpdateItemVisibility({
83
- item,
84
- visible: false
85
- });
86
- if (item.groupId) {
87
- overflowGroups[item.groupId].visibleItemIds.delete(item.id);
88
- overflowGroups[item.groupId].invisibleItemIds.add(item.id);
89
- }
90
- return width;
91
- };
92
- const dispatchOverflowUpdate = ()=>{
93
- const visibleItemIds = visibleItemQueue.all();
94
- const invisibleItemIds = invisibleItemQueue.all();
95
- const visibleItems = visibleItemIds.map((itemId)=>overflowItems[itemId]);
96
- const invisibleItems = invisibleItemIds.map((itemId)=>overflowItems[itemId]);
97
- const groupVisibility = {};
98
- Object.entries(overflowGroups).forEach((param)=>{
99
- let [groupId, groupState] = param;
100
- if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {
101
- groupVisibility[groupId] = 'overflow';
102
- } else if (groupState.visibleItemIds.size === 0) {
103
- groupVisibility[groupId] = 'hidden';
104
- } else {
105
- groupVisibility[groupId] = 'visible';
106
- }
107
- });
108
- options.onUpdateOverflow({
109
- visibleItems,
110
- invisibleItems,
111
- groupVisibility
112
- });
113
- };
114
- const processOverflowItems = ()=>{
115
- if (!container) {
116
- return false;
117
- }
118
- const availableSize = getOffsetSize(container) - options.padding;
119
- const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;
120
- // Snapshot of the visible/invisible state to compare for updates
121
- const visibleTop = visibleItemQueue.peek();
122
- const invisibleTop = invisibleItemQueue.peek();
123
- const visibleItemIds = visibleItemQueue.all();
124
- let currentWidth = visibleItemIds.reduce((sum, visibleItemId)=>{
125
- const child = overflowItems[visibleItemId].element;
126
- return sum + getOffsetSize(child);
127
- }, 0);
128
- // Add items until available width is filled - can result in overflow
129
- while(currentWidth < availableSize && invisibleItemQueue.size() > 0){
130
- currentWidth += makeItemVisible();
131
- }
132
- // Remove items until there's no more overflow
133
- while(currentWidth > availableSize && visibleItemQueue.size() > 0){
134
- if (visibleItemQueue.size() <= options.minimumVisible) {
135
- break;
136
- }
137
- currentWidth -= makeItemInvisible();
138
- }
139
- // make sure the overflow menu can fit
140
- if (visibleItemQueue.size() > options.minimumVisible && invisibleItemQueue.size() > 0 && currentWidth + overflowMenuOffset > availableSize) {
141
- makeItemInvisible();
142
- }
143
- // only update when the state of visible/invisible items has changed
144
- if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {
145
- return true;
146
- }
147
- return false;
148
- };
149
- const forceUpdate = ()=>{
150
- if (processOverflowItems() || forceDispatch) {
151
- forceDispatch = false;
152
- dispatchOverflowUpdate();
153
- }
154
- };
155
- const update = (0, _debounce.debounce)(forceUpdate);
156
- const observe = (observedContainer, userOptions)=>{
157
- Object.assign(options, userOptions);
158
- observing = true;
159
- Object.values(overflowItems).forEach((item)=>visibleItemQueue.enqueue(item.id));
160
- container = observedContainer;
161
- resizeObserver.observe(container);
162
- };
163
- const disconnect = ()=>{
164
- observing = false;
165
- resizeObserver.disconnect();
166
- };
167
- const addItem = (item)=>{
168
- if (overflowItems[item.id]) {
169
- return;
170
- }
171
- overflowItems[item.id] = item;
172
- // some options can affect priority which are only set on `observe`
173
- if (observing) {
174
- // Updates to elements might not change the queue tops
175
- // i.e. new element is enqueued but the top of the queue stays the same
176
- // force a dispatch on the next batched update
177
- forceDispatch = true;
178
- visibleItemQueue.enqueue(item.id);
179
- }
180
- if (item.groupId) {
181
- if (!overflowGroups[item.groupId]) {
182
- overflowGroups[item.groupId] = {
183
- visibleItemIds: new Set(),
184
- invisibleItemIds: new Set()
185
- };
186
- }
187
- overflowGroups[item.groupId].visibleItemIds.add(item.id);
188
- }
189
- update();
190
- };
191
- const addOverflowMenu = (el)=>{
192
- overflowMenu = el;
193
- };
194
- const removeOverflowMenu = ()=>{
195
- overflowMenu = undefined;
196
- };
197
- const removeItem = (itemId)=>{
198
- if (!overflowItems[itemId]) {
199
- return;
200
- }
201
- const item = overflowItems[itemId];
202
- visibleItemQueue.remove(itemId);
203
- invisibleItemQueue.remove(itemId);
204
- if (item.groupId) {
205
- overflowGroups[item.groupId].visibleItemIds.delete(item.id);
206
- overflowGroups[item.groupId].invisibleItemIds.delete(item.id);
207
- }
208
- delete overflowItems[itemId];
209
- update();
210
- };
211
- return {
212
- addItem,
213
- disconnect,
214
- forceUpdate,
215
- observe,
216
- removeItem,
217
- update,
218
- addOverflowMenu,
219
- removeOverflowMenu
220
- };
221
- } //# sourceMappingURL=overflowManager.js.map
222
-
109
+ options.onUpdateOverflow({
110
+ visibleItems,
111
+ invisibleItems,
112
+ groupVisibility
113
+ });
114
+ };
115
+ const processOverflowItems = () => {
116
+ if (!container) {
117
+ return false;
118
+ }
119
+ const availableSize = getOffsetSize(container) - options.padding;
120
+ const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;
121
+ // Snapshot of the visible/invisible state to compare for updates
122
+ const visibleTop = visibleItemQueue.peek();
123
+ const invisibleTop = invisibleItemQueue.peek();
124
+ const visibleItemIds = visibleItemQueue.all();
125
+ let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {
126
+ const child = overflowItems[visibleItemId].element;
127
+ return sum + getOffsetSize(child);
128
+ }, 0);
129
+ // Add items until available width is filled - can result in overflow
130
+ while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {
131
+ currentWidth += makeItemVisible();
132
+ }
133
+ // Remove items until there's no more overflow
134
+ while (currentWidth > availableSize && visibleItemQueue.size() > 0) {
135
+ if (visibleItemQueue.size() <= options.minimumVisible) {
136
+ break;
137
+ }
138
+ currentWidth -= makeItemInvisible();
139
+ }
140
+ // make sure the overflow menu can fit
141
+ if (visibleItemQueue.size() > options.minimumVisible && invisibleItemQueue.size() > 0 && currentWidth + overflowMenuOffset > availableSize) {
142
+ makeItemInvisible();
143
+ }
144
+ // only update when the state of visible/invisible items has changed
145
+ if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {
146
+ return true;
147
+ }
148
+ return false;
149
+ };
150
+ const forceUpdate = () => {
151
+ if (processOverflowItems() || forceDispatch) {
152
+ forceDispatch = false;
153
+ dispatchOverflowUpdate();
154
+ }
155
+ };
156
+ const update = debounce_1.debounce(forceUpdate);
157
+ const observe = (observedContainer, userOptions) => {
158
+ Object.assign(options, userOptions);
159
+ observing = true;
160
+ Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));
161
+ container = observedContainer;
162
+ resizeObserver.observe(container);
163
+ };
164
+ const disconnect = () => {
165
+ observing = false;
166
+ resizeObserver.disconnect();
167
+ };
168
+ const addItem = item => {
169
+ if (overflowItems[item.id]) {
170
+ return;
171
+ }
172
+ overflowItems[item.id] = item;
173
+ // some options can affect priority which are only set on `observe`
174
+ if (observing) {
175
+ // Updates to elements might not change the queue tops
176
+ // i.e. new element is enqueued but the top of the queue stays the same
177
+ // force a dispatch on the next batched update
178
+ forceDispatch = true;
179
+ visibleItemQueue.enqueue(item.id);
180
+ }
181
+ if (item.groupId) {
182
+ if (!overflowGroups[item.groupId]) {
183
+ overflowGroups[item.groupId] = {
184
+ visibleItemIds: new Set(),
185
+ invisibleItemIds: new Set()
186
+ };
187
+ }
188
+ overflowGroups[item.groupId].visibleItemIds.add(item.id);
189
+ }
190
+ update();
191
+ };
192
+ const addOverflowMenu = el => {
193
+ overflowMenu = el;
194
+ };
195
+ const removeOverflowMenu = () => {
196
+ overflowMenu = undefined;
197
+ };
198
+ const removeItem = itemId => {
199
+ if (!overflowItems[itemId]) {
200
+ return;
201
+ }
202
+ const item = overflowItems[itemId];
203
+ visibleItemQueue.remove(itemId);
204
+ invisibleItemQueue.remove(itemId);
205
+ if (item.groupId) {
206
+ overflowGroups[item.groupId].visibleItemIds.delete(item.id);
207
+ overflowGroups[item.groupId].invisibleItemIds.delete(item.id);
208
+ }
209
+ delete overflowItems[itemId];
210
+ update();
211
+ };
212
+ return {
213
+ addItem,
214
+ disconnect,
215
+ forceUpdate,
216
+ observe,
217
+ removeItem,
218
+ update,
219
+ addOverflowMenu,
220
+ removeOverflowMenu
221
+ };
222
+ }
223
+ exports.createOverflowManager = createOverflowManager;
223
224
  //# sourceMappingURL=overflowManager.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../lib/overflowManager.js"],"sourcesContent":["import { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\n/**\n * @internal\n * @returns overflow manager instance\n */\nexport function createOverflowManager() {\n let container;\n let overflowMenu;\n // Set as true when resize observer is observing\n let observing = false;\n // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change\n let forceDispatch = false;\n const options = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined\n };\n const overflowItems = {};\n const overflowGroups = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n update();\n });\n const invisibleItemQueue = createPriorityQueue((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n const visibleItemQueue = createPriorityQueue((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n if (priority !== 0) {\n return priority;\n }\n const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n const getOffsetSize = el => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n const makeItemVisible = () => {\n const nextVisible = invisibleItemQueue.dequeue();\n visibleItemQueue.enqueue(nextVisible);\n const item = overflowItems[nextVisible];\n options.onUpdateItemVisibility({\n item,\n visible: true\n });\n if (item.groupId) {\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n return getOffsetSize(item.element);\n };\n const makeItemInvisible = () => {\n const nextInvisible = visibleItemQueue.dequeue();\n invisibleItemQueue.enqueue(nextInvisible);\n const item = overflowItems[nextInvisible];\n const width = getOffsetSize(item.element);\n options.onUpdateItemVisibility({\n item,\n visible: false\n });\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.add(item.id);\n }\n return width;\n };\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n const groupVisibility = {};\n Object.entries(overflowGroups).forEach(param => {\n let [groupId, groupState] = param;\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 options.onUpdateOverflow({\n visibleItems,\n invisibleItems,\n groupVisibility\n });\n };\n const processOverflowItems = () => {\n if (!container) {\n return false;\n }\n const availableSize = getOffsetSize(container) - options.padding;\n const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\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 // Add items until available width is filled - can result in overflow\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += makeItemVisible();\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 // make sure the overflow menu can fit\n if (visibleItemQueue.size() > options.minimumVisible && invisibleItemQueue.size() > 0 && currentWidth + overflowMenuOffset > availableSize) {\n makeItemInvisible();\n }\n // only update when the state of visible/invisible items has changed\n if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {\n return true;\n }\n return false;\n };\n const forceUpdate = () => {\n if (processOverflowItems() || forceDispatch) {\n forceDispatch = false;\n dispatchOverflowUpdate();\n }\n };\n const update = debounce(forceUpdate);\n const observe = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));\n container = observedContainer;\n resizeObserver.observe(container);\n };\n const disconnect = () => {\n observing = false;\n resizeObserver.disconnect();\n };\n const addItem = item => {\n if (overflowItems[item.id]) {\n return;\n }\n overflowItems[item.id] = item;\n // some options can affect priority which are only set on `observe`\n if (observing) {\n // Updates to elements might not change the queue tops\n // i.e. new element is enqueued but the top of the queue stays the same\n // force a dispatch on the next batched update\n forceDispatch = true;\n visibleItemQueue.enqueue(item.id);\n }\n if (item.groupId) {\n if (!overflowGroups[item.groupId]) {\n overflowGroups[item.groupId] = {\n visibleItemIds: new Set(),\n invisibleItemIds: new Set()\n };\n }\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n update();\n };\n const addOverflowMenu = el => {\n overflowMenu = el;\n };\n const removeOverflowMenu = () => {\n overflowMenu = undefined;\n };\n const removeItem = itemId => {\n if (!overflowItems[itemId]) {\n return;\n }\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n }\n delete overflowItems[itemId];\n update();\n };\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n addOverflowMenu,\n removeOverflowMenu\n };\n}\n//# sourceMappingURL=overflowManager.js.map"],"names":["createOverflowManager","container","overflowMenu","observing","forceDispatch","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowGroups","resizeObserver","ResizeObserver","entries","update","invisibleItemQueue","createPriorityQueue","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","param","groupState","size","processOverflowItems","availableSize","overflowMenuOffset","visibleTop","peek","invisibleTop","currentWidth","reduce","sum","visibleItemId","child","forceUpdate","debounce","observe","observedContainer","userOptions","assign","values","disconnect","addItem","Set","addOverflowMenu","removeOverflowMenu","removeItem","remove"],"mappings":"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"}
1
+ {"version":3,"mappings":"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","names":["createOverflowManager","container","overflowMenu","observing","forceDispatch","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 // Set as true when resize observer is observing\n let observing = false;\n // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change\n let forceDispatch = false;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowGroups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n const makeItemVisible = () => {\n const nextVisible = invisibleItemQueue.dequeue();\n visibleItemQueue.enqueue(nextVisible);\n\n const item = overflowItems[nextVisible];\n options.onUpdateItemVisibility({ item, visible: true });\n if (item.groupId) {\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n return getOffsetSize(item.element);\n };\n\n const makeItemInvisible = () => {\n const nextInvisible = visibleItemQueue.dequeue();\n invisibleItemQueue.enqueue(nextInvisible);\n\n const item = overflowItems[nextInvisible];\n const width = getOffsetSize(item.element);\n options.onUpdateItemVisibility({ item, visible: false });\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.add(item.id);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n const groupVisibility: Record<string, OverflowGroupState> = {};\n Object.entries(overflowGroups).forEach(([groupId, groupState]) => {\n if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (groupState.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n });\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const processOverflowItems = (): boolean => {\n if (!container) {\n return false;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n const visibleItemIds = visibleItemQueue.all();\n let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {\n const child = overflowItems[visibleItemId].element;\n return sum + getOffsetSize(child);\n }, 0);\n\n // Add items until available width is filled - can result in overflow\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += makeItemVisible();\n }\n\n // Remove items until there's no more overflow\n while (currentWidth > availableSize && visibleItemQueue.size() > 0) {\n if (visibleItemQueue.size() <= options.minimumVisible) {\n break;\n }\n currentWidth -= makeItemInvisible();\n }\n\n // make sure the overflow menu can fit\n if (\n visibleItemQueue.size() > options.minimumVisible &&\n invisibleItemQueue.size() > 0 &&\n currentWidth + overflowMenuOffset > availableSize\n ) {\n makeItemInvisible();\n }\n\n // only update when the state of visible/invisible items has changed\n if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {\n return true;\n }\n\n return false;\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (processOverflowItems() || forceDispatch) {\n forceDispatch = false;\n dispatchOverflowUpdate();\n }\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));\n\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n observing = false;\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n if (overflowItems[item.id]) {\n return;\n }\n\n overflowItems[item.id] = item;\n\n // some options can affect priority which are only set on `observe`\n if (observing) {\n // Updates to elements might not change the queue tops\n // i.e. new element is enqueued but the top of the queue stays the same\n // force a dispatch on the next batched update\n forceDispatch = true;\n visibleItemQueue.enqueue(item.id);\n }\n\n if (item.groupId) {\n if (!overflowGroups[item.groupId]) {\n overflowGroups[item.groupId] = {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n }\n\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n update();\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n overflowMenu = el;\n };\n\n const removeOverflowMenu: OverflowManager['removeOverflowMenu'] = () => {\n overflowMenu = undefined;\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n if (!overflowItems[itemId]) {\n return;\n }\n\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n addOverflowMenu,\n removeOverflowMenu,\n };\n}\n"]}
@@ -1,99 +1,98 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createPriorityQueue = void 0;
1
7
  /**
2
8
  * @param compare - comparison function for items
3
9
  * @returns Priority queue implemented with a min heap
4
- */ "use strict";
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- Object.defineProperty(exports, "createPriorityQueue", {
9
- enumerable: true,
10
- get: ()=>createPriorityQueue
11
- });
10
+ */
12
11
  function createPriorityQueue(compare) {
13
- const arr = [];
14
- let size = 0;
15
- const left = (i)=>{
16
- return 2 * i + 1;
17
- };
18
- const right = (i)=>{
19
- return 2 * i + 2;
20
- };
21
- const parent = (i)=>{
22
- return Math.floor((i - 1) / 2);
23
- };
24
- const swap = (a, b)=>{
25
- const tmp = arr[a];
26
- arr[a] = arr[b];
27
- arr[b] = tmp;
28
- };
29
- const heapify = (i)=>{
30
- let smallest = i;
31
- const l = left(i);
32
- const r = right(i);
33
- if (l < size && compare(arr[l], arr[smallest]) < 0) {
34
- smallest = l;
35
- }
36
- if (r < size && compare(arr[r], arr[smallest]) < 0) {
37
- smallest = r;
38
- }
39
- if (smallest !== i) {
40
- swap(smallest, i);
41
- heapify(smallest);
42
- }
43
- };
44
- const dequeue = ()=>{
45
- if (size === 0) {
46
- throw new Error('Priority queue empty');
47
- }
48
- const res = arr[0];
49
- arr[0] = arr[--size];
50
- heapify(0);
51
- return res;
52
- };
53
- const peek = ()=>{
54
- if (size === 0) {
55
- return null;
56
- }
57
- return arr[0];
58
- };
59
- const enqueue = (item)=>{
60
- arr[size++] = item;
61
- let i = size - 1;
62
- let p = parent(i);
63
- while(i > 0 && compare(arr[p], arr[i]) > 0){
64
- swap(p, i);
65
- i = p;
66
- p = parent(i);
67
- }
68
- };
69
- const contains = (item)=>{
70
- const index = arr.indexOf(item);
71
- return index >= 0 && index < size;
72
- };
73
- const remove = (item)=>{
74
- const i = arr.indexOf(item);
75
- if (i === -1 || i >= size) {
76
- return;
77
- }
78
- arr[i] = arr[--size];
79
- heapify(i);
80
- };
81
- const clear = ()=>{
82
- size = 0;
83
- };
84
- const all = ()=>{
85
- return arr.slice(0, size);
86
- };
87
- return {
88
- all,
89
- clear,
90
- contains,
91
- dequeue,
92
- enqueue,
93
- peek,
94
- remove,
95
- size: ()=>size
96
- };
97
- } //# sourceMappingURL=priorityQueue.js.map
98
-
12
+ const arr = [];
13
+ let size = 0;
14
+ const left = i => {
15
+ return 2 * i + 1;
16
+ };
17
+ const right = i => {
18
+ return 2 * i + 2;
19
+ };
20
+ const parent = i => {
21
+ return Math.floor((i - 1) / 2);
22
+ };
23
+ const swap = (a, b) => {
24
+ const tmp = arr[a];
25
+ arr[a] = arr[b];
26
+ arr[b] = tmp;
27
+ };
28
+ const heapify = i => {
29
+ let smallest = i;
30
+ const l = left(i);
31
+ const r = right(i);
32
+ if (l < size && compare(arr[l], arr[smallest]) < 0) {
33
+ smallest = l;
34
+ }
35
+ if (r < size && compare(arr[r], arr[smallest]) < 0) {
36
+ smallest = r;
37
+ }
38
+ if (smallest !== i) {
39
+ swap(smallest, i);
40
+ heapify(smallest);
41
+ }
42
+ };
43
+ const dequeue = () => {
44
+ if (size === 0) {
45
+ throw new Error('Priority queue empty');
46
+ }
47
+ const res = arr[0];
48
+ arr[0] = arr[--size];
49
+ heapify(0);
50
+ return res;
51
+ };
52
+ const peek = () => {
53
+ if (size === 0) {
54
+ return null;
55
+ }
56
+ return arr[0];
57
+ };
58
+ const enqueue = item => {
59
+ arr[size++] = item;
60
+ let i = size - 1;
61
+ let p = parent(i);
62
+ while (i > 0 && compare(arr[p], arr[i]) > 0) {
63
+ swap(p, i);
64
+ i = p;
65
+ p = parent(i);
66
+ }
67
+ };
68
+ const contains = item => {
69
+ const index = arr.indexOf(item);
70
+ return index >= 0 && index < size;
71
+ };
72
+ const remove = item => {
73
+ const i = arr.indexOf(item);
74
+ if (i === -1 || i >= size) {
75
+ return;
76
+ }
77
+ arr[i] = arr[--size];
78
+ heapify(i);
79
+ };
80
+ const clear = () => {
81
+ size = 0;
82
+ };
83
+ const all = () => {
84
+ return arr.slice(0, size);
85
+ };
86
+ return {
87
+ all,
88
+ clear,
89
+ contains,
90
+ dequeue,
91
+ enqueue,
92
+ peek,
93
+ remove,
94
+ size: () => size
95
+ };
96
+ }
97
+ exports.createPriorityQueue = createPriorityQueue;
99
98
  //# sourceMappingURL=priorityQueue.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../lib/priorityQueue.js"],"sourcesContent":["/**\n * @param compare - comparison function for items\n * @returns Priority queue implemented with a min heap\n */export function createPriorityQueue(compare) {\n const arr = [];\n let size = 0;\n const left = i => {\n return 2 * i + 1;\n };\n const right = i => {\n return 2 * i + 2;\n };\n const parent = i => {\n return Math.floor((i - 1) / 2);\n };\n const swap = (a, b) => {\n const tmp = arr[a];\n arr[a] = arr[b];\n arr[b] = tmp;\n };\n const heapify = i => {\n let smallest = i;\n const l = left(i);\n const r = right(i);\n if (l < size && compare(arr[l], arr[smallest]) < 0) {\n smallest = l;\n }\n if (r < size && compare(arr[r], arr[smallest]) < 0) {\n smallest = r;\n }\n if (smallest !== i) {\n swap(smallest, i);\n heapify(smallest);\n }\n };\n const dequeue = () => {\n if (size === 0) {\n throw new Error('Priority queue empty');\n }\n const res = arr[0];\n arr[0] = arr[--size];\n heapify(0);\n return res;\n };\n const peek = () => {\n if (size === 0) {\n return null;\n }\n return arr[0];\n };\n const enqueue = item => {\n arr[size++] = item;\n let i = size - 1;\n let p = parent(i);\n while (i > 0 && compare(arr[p], arr[i]) > 0) {\n swap(p, i);\n i = p;\n p = parent(i);\n }\n };\n const contains = item => {\n const index = arr.indexOf(item);\n return index >= 0 && index < size;\n };\n const remove = item => {\n const i = arr.indexOf(item);\n if (i === -1 || i >= size) {\n return;\n }\n arr[i] = arr[--size];\n heapify(i);\n };\n const clear = () => {\n size = 0;\n };\n const all = () => {\n return arr.slice(0, size);\n };\n return {\n all,\n clear,\n contains,\n dequeue,\n enqueue,\n peek,\n remove,\n size: () => size\n };\n}\n//# sourceMappingURL=priorityQueue.js.map"],"names":["createPriorityQueue","compare","arr","size","left","i","right","parent","Math","floor","swap","a","b","tmp","heapify","smallest","l","r","dequeue","Error","res","peek","enqueue","item","p","contains","index","indexOf","remove","clear","all","slice"],"mappings":"AAAA;;;CAGC;;;;+BAAkBA;;aAAAA;;AAAT,SAASA,oBAAoBC,OAAO,EAAE;IAC9C,MAAMC,MAAM,EAAE;IACd,IAAIC,OAAO;IACX,MAAMC,OAAOC,CAAAA,IAAK;QAChB,OAAO,IAAIA,IAAI;IACjB;IACA,MAAMC,QAAQD,CAAAA,IAAK;QACjB,OAAO,IAAIA,IAAI;IACjB;IACA,MAAME,SAASF,CAAAA,IAAK;QAClB,OAAOG,KAAKC,KAAK,CAAC,AAACJ,CAAAA,IAAI,CAAA,IAAK;IAC9B;IACA,MAAMK,OAAO,CAACC,GAAGC,IAAM;QACrB,MAAMC,MAAMX,GAAG,CAACS,EAAE;QAClBT,GAAG,CAACS,EAAE,GAAGT,GAAG,CAACU,EAAE;QACfV,GAAG,CAACU,EAAE,GAAGC;IACX;IACA,MAAMC,UAAUT,CAAAA,IAAK;QACnB,IAAIU,WAAWV;QACf,MAAMW,IAAIZ,KAAKC;QACf,MAAMY,IAAIX,MAAMD;QAChB,IAAIW,IAAIb,QAAQF,QAAQC,GAAG,CAACc,EAAE,EAAEd,GAAG,CAACa,SAAS,IAAI,GAAG;YAClDA,WAAWC;QACb,CAAC;QACD,IAAIC,IAAId,QAAQF,QAAQC,GAAG,CAACe,EAAE,EAAEf,GAAG,CAACa,SAAS,IAAI,GAAG;YAClDA,WAAWE;QACb,CAAC;QACD,IAAIF,aAAaV,GAAG;YAClBK,KAAKK,UAAUV;YACfS,QAAQC;QACV,CAAC;IACH;IACA,MAAMG,UAAU,IAAM;QACpB,IAAIf,SAAS,GAAG;YACd,MAAM,IAAIgB,MAAM,wBAAwB;QAC1C,CAAC;QACD,MAAMC,MAAMlB,GAAG,CAAC,EAAE;QAClBA,GAAG,CAAC,EAAE,GAAGA,GAAG,CAAC,EAAEC,KAAK;QACpBW,QAAQ;QACR,OAAOM;IACT;IACA,MAAMC,OAAO,IAAM;QACjB,IAAIlB,SAAS,GAAG;YACd,OAAO,IAAI;QACb,CAAC;QACD,OAAOD,GAAG,CAAC,EAAE;IACf;IACA,MAAMoB,UAAUC,CAAAA,OAAQ;QACtBrB,GAAG,CAACC,OAAO,GAAGoB;QACd,IAAIlB,IAAIF,OAAO;QACf,IAAIqB,IAAIjB,OAAOF;QACf,MAAOA,IAAI,KAAKJ,QAAQC,GAAG,CAACsB,EAAE,EAAEtB,GAAG,CAACG,EAAE,IAAI,EAAG;YAC3CK,KAAKc,GAAGnB;YACRA,IAAImB;YACJA,IAAIjB,OAAOF;QACb;IACF;IACA,MAAMoB,WAAWF,CAAAA,OAAQ;QACvB,MAAMG,QAAQxB,IAAIyB,OAAO,CAACJ;QAC1B,OAAOG,SAAS,KAAKA,QAAQvB;IAC/B;IACA,MAAMyB,SAASL,CAAAA,OAAQ;QACrB,MAAMlB,IAAIH,IAAIyB,OAAO,CAACJ;QACtB,IAAIlB,MAAM,CAAC,KAAKA,KAAKF,MAAM;YACzB;QACF,CAAC;QACDD,GAAG,CAACG,EAAE,GAAGH,GAAG,CAAC,EAAEC,KAAK;QACpBW,QAAQT;IACV;IACA,MAAMwB,QAAQ,IAAM;QAClB1B,OAAO;IACT;IACA,MAAM2B,MAAM,IAAM;QAChB,OAAO5B,IAAI6B,KAAK,CAAC,GAAG5B;IACtB;IACA,OAAO;QACL2B;QACAD;QACAJ;QACAP;QACAI;QACAD;QACAO;QACAzB,MAAM,IAAMA;IACd;AACF,EACA,yCAAyC"}
1
+ {"version":3,"mappings":"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","names":["createPriorityQueue","compare","arr","size","left","i","right","parent","Math","floor","swap","a","b","tmp","heapify","smallest","l","r","dequeue","Error","res","peek","enqueue","item","p","contains","index","indexOf","remove","clear","all","slice","exports"],"sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/priorityQueue.ts"],"sourcesContent":["export type PriorityQueueCompareFn<T> = (a: T, b: T) => number;\n\nexport interface PriorityQueue<T> {\n all: () => T[];\n clear: () => void;\n contains: (item: T) => boolean;\n dequeue: () => T;\n enqueue: (item: T) => void;\n peek: () => T | null;\n remove: (item: T) => void;\n size: () => number;\n}\n\n/**\n * @param compare - comparison function for items\n * @returns Priority queue implemented with a min heap\n */\nexport function createPriorityQueue<T>(compare: PriorityQueueCompareFn<T>): PriorityQueue<T> {\n const arr: T[] = [];\n let size = 0;\n\n const left = (i: number) => {\n return 2 * i + 1;\n };\n\n const right = (i: number) => {\n return 2 * i + 2;\n };\n\n const parent = (i: number) => {\n return Math.floor((i - 1) / 2);\n };\n\n const swap = (a: number, b: number) => {\n const tmp = arr[a];\n arr[a] = arr[b];\n arr[b] = tmp;\n };\n\n const heapify = (i: number) => {\n let smallest = i;\n const l = left(i);\n const r = right(i);\n\n if (l < size && compare(arr[l], arr[smallest]) < 0) {\n smallest = l;\n }\n\n if (r < size && compare(arr[r], arr[smallest]) < 0) {\n smallest = r;\n }\n\n if (smallest !== i) {\n swap(smallest, i);\n heapify(smallest);\n }\n };\n\n const dequeue = () => {\n if (size === 0) {\n throw new Error('Priority queue empty');\n }\n\n const res = arr[0];\n arr[0] = arr[--size];\n heapify(0);\n\n return res;\n };\n\n const peek = () => {\n if (size === 0) {\n return null;\n }\n\n return arr[0];\n };\n\n const enqueue = (item: T) => {\n arr[size++] = item;\n let i = size - 1;\n let p = parent(i);\n while (i > 0 && compare(arr[p], arr[i]) > 0) {\n swap(p, i);\n i = p;\n p = parent(i);\n }\n };\n\n const contains = (item: T) => {\n const index = arr.indexOf(item);\n return index >= 0 && index < size;\n };\n\n const remove = (item: T) => {\n const i = arr.indexOf(item);\n\n if (i === -1 || i >= size) {\n return;\n }\n\n arr[i] = arr[--size];\n heapify(i);\n };\n\n const clear = () => {\n size = 0;\n };\n\n const all = () => {\n return arr.slice(0, size);\n };\n\n return {\n all,\n clear,\n contains,\n dequeue,\n enqueue,\n peek,\n remove,\n size: () => size,\n };\n}\n"]}
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
+
2
3
  Object.defineProperty(exports, "__esModule", {
3
- value: true
4
+ value: true
4
5
  });
5
- //# sourceMappingURL=types.js.map
6
-
7
6
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../lib/types.js"],"sourcesContent":["export {};\n//# sourceMappingURL=types.js.map"],"names":[],"mappings":";;;;CACA,iCAAiC"}
1
+ {"version":3,"mappings":"","names":[],"sourceRoot":"","sources":[],"sourcesContent":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui/priority-overflow",
3
- "version": "0.0.0-nightly-20230223-2115.1",
3
+ "version": "0.0.0-nightly-20230227-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",
@@ -20,7 +20,7 @@
20
20
  "lint": "just-scripts lint",
21
21
  "test": "jest --passWithNoTests",
22
22
  "type-check": "tsc -b tsconfig.json",
23
- "generate-api": "just-scripts generate-api"
23
+ "generate-api": "tsc -p ./tsconfig.lib.json --emitDeclarationOnly && just-scripts api-extractor"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@fluentui/eslint-plugin": "*",
@@ -28,7 +28,7 @@
28
28
  "@fluentui/scripts-tasks": "*"
29
29
  },
30
30
  "dependencies": {
31
- "@swc/helpers": "^0.4.14"
31
+ "tslib": "^2.1.0"
32
32
  },
33
33
  "beachball": {},
34
34
  "exports": {
package/.swcrc DELETED
@@ -1,33 +0,0 @@
1
- {
2
- "$schema": "https://json.schemastore.org/swcrc",
3
- "env": {
4
- "targets": {
5
- "chrome": "84",
6
- "edge": "84",
7
- "firefox": "75",
8
- "opera": "73",
9
- "safari": "14.1"
10
- }
11
- },
12
- "exclude": [
13
- "/testing",
14
- "/**/*.cy.ts",
15
- "/**/*.cy.tsx",
16
- "/**/*.spec.ts",
17
- "/**/*.spec.tsx",
18
- "/**/*.test.ts",
19
- "/**/*.test.tsx"
20
- ],
21
- "jsc": {
22
- "parser": {
23
- "syntax": "typescript",
24
- "tsx": true,
25
- "decorators": false,
26
- "dynamicImport": false
27
- },
28
- "target": "es2019",
29
- "externalHelpers": true
30
- },
31
- "minify": false,
32
- "sourceMaps": true
33
- }