@fluentui/priority-overflow 9.0.1 → 9.0.2
Sign up to get free protection for your applications and to get access to all the features.
- package/.swcrc +30 -0
- package/CHANGELOG.json +22 -1
- package/CHANGELOG.md +12 -2
- package/lib/debounce.js +1 -2
- package/lib/debounce.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/overflowManager.js.map +1 -1
- package/lib/priorityQueue.js +1 -2
- package/lib/priorityQueue.js.map +1 -1
- package/lib/types.js.map +1 -1
- package/lib-commonjs/debounce.js +22 -21
- package/lib-commonjs/debounce.js.map +1 -1
- package/lib-commonjs/index.js +6 -8
- package/lib-commonjs/index.js.map +1 -1
- package/lib-commonjs/overflowManager.js +214 -216
- package/lib-commonjs/overflowManager.js.map +1 -1
- package/lib-commonjs/priorityQueue.js +94 -93
- package/lib-commonjs/priorityQueue.js.map +1 -1
- package/lib-commonjs/types.js +3 -2
- package/lib-commonjs/types.js.map +1 -1
- package/package.json +4 -3
- package/lib-amd/debounce.js +0 -27
- package/lib-amd/debounce.js.map +0 -1
- package/lib-amd/index.js +0 -7
- package/lib-amd/index.js.map +0 -1
- package/lib-amd/overflowManager.js +0 -216
- package/lib-amd/overflowManager.js.map +0 -1
- package/lib-amd/priorityQueue.js +0 -97
- package/lib-amd/priorityQueue.js.map +0 -1
- package/lib-amd/types.js +0 -5
- package/lib-amd/types.js.map +0 -1
@@ -1,98 +1,99 @@
|
|
1
|
-
"use strict";
|
2
|
-
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
4
|
-
value: true
|
5
|
-
});
|
6
|
-
exports.createPriorityQueue = void 0;
|
7
1
|
/**
|
8
2
|
* @param compare - comparison function for items
|
9
3
|
* @returns Priority queue implemented with a min heap
|
10
|
-
*/
|
4
|
+
*/ "use strict";
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
6
|
+
value: true
|
7
|
+
});
|
8
|
+
Object.defineProperty(exports, "createPriorityQueue", {
|
9
|
+
enumerable: true,
|
10
|
+
get: ()=>createPriorityQueue
|
11
|
+
});
|
11
12
|
function createPriorityQueue(compare) {
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
}
|
97
|
-
|
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
|
+
|
98
99
|
//# sourceMappingURL=priorityQueue.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"
|
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"}
|
package/lib-commonjs/types.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"
|
1
|
+
{"version":3,"sources":["../lib/types.js"],"sourcesContent":["export {};\n//# sourceMappingURL=types.js.map"],"names":[],"mappings":";;;;CACA,iCAAiC"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@fluentui/priority-overflow",
|
3
|
-
"version": "9.0.
|
3
|
+
"version": "9.0.2",
|
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": "
|
23
|
+
"generate-api": "just-scripts generate-api"
|
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
|
-
"
|
31
|
+
"@swc/helpers": "^0.4.14"
|
32
32
|
},
|
33
33
|
"beachball": {
|
34
34
|
"disallowedChangeTypes": [
|
@@ -39,6 +39,7 @@
|
|
39
39
|
"exports": {
|
40
40
|
".": {
|
41
41
|
"types": "./dist/index.d.ts",
|
42
|
+
"node": "./lib-commonjs/index.js",
|
42
43
|
"import": "./lib/index.js",
|
43
44
|
"require": "./lib-commonjs/index.js"
|
44
45
|
},
|
package/lib-amd/debounce.js
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
define(["require", "exports"], function (require, exports) {
|
2
|
-
"use strict";
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
4
|
-
exports.debounce = void 0;
|
5
|
-
/**
|
6
|
-
* Microtask debouncer
|
7
|
-
* https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide
|
8
|
-
* @param fn - Function to debounce
|
9
|
-
* @returns debounced function
|
10
|
-
*/
|
11
|
-
function debounce(fn) {
|
12
|
-
var pending;
|
13
|
-
return function () {
|
14
|
-
if (!pending) {
|
15
|
-
pending = true;
|
16
|
-
queueMicrotask(function () {
|
17
|
-
// Need to set pending to `false` before the debounced function is run.
|
18
|
-
// React can actually interrupt the function while it's running!
|
19
|
-
pending = false;
|
20
|
-
fn();
|
21
|
-
});
|
22
|
-
}
|
23
|
-
};
|
24
|
-
}
|
25
|
-
exports.debounce = debounce;
|
26
|
-
});
|
27
|
-
//# sourceMappingURL=debounce.js.map
|
package/lib-amd/debounce.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"debounce.js","sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/debounce.ts"],"names":[],"mappings":";;;;IAAA;;;;;OAKG;IACH,SAAgB,QAAQ,CAAC,EAAY;QACnC,IAAI,OAAgB,CAAC;QACrB,OAAO;YACL,IAAI,CAAC,OAAO,EAAE;gBACZ,OAAO,GAAG,IAAI,CAAC;gBACf,cAAc,CAAC;oBACb,uEAAuE;oBACvE,gEAAgE;oBAChE,OAAO,GAAG,KAAK,CAAC;oBAChB,EAAE,EAAE,CAAC;gBACP,CAAC,CAAC,CAAC;aACJ;QACH,CAAC,CAAC;IACJ,CAAC;IAbD,4BAaC","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-amd/index.js
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
define(["require", "exports", "./overflowManager"], function (require, exports, overflowManager_1) {
|
2
|
-
"use strict";
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
4
|
-
exports.createOverflowManager = void 0;
|
5
|
-
Object.defineProperty(exports, "createOverflowManager", { enumerable: true, get: function () { return overflowManager_1.createOverflowManager; } });
|
6
|
-
});
|
7
|
-
//# sourceMappingURL=index.js.map
|
package/lib-amd/index.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/index.ts"],"names":[],"mappings":";;;;IAAS,wHAAA,qBAAqB,OAAA","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,216 +0,0 @@
|
|
1
|
-
define(["require", "exports", "./debounce", "./priorityQueue"], function (require, exports, debounce_1, priorityQueue_1) {
|
2
|
-
"use strict";
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
4
|
-
exports.createOverflowManager = void 0;
|
5
|
-
/**
|
6
|
-
* @internal
|
7
|
-
* @returns overflow manager instance
|
8
|
-
*/
|
9
|
-
function createOverflowManager() {
|
10
|
-
var container;
|
11
|
-
var overflowMenu;
|
12
|
-
// Set as true when resize observer is observing
|
13
|
-
var observing = false;
|
14
|
-
// If true, next update will dispatch to onUpdateOverflow even if queue top states don't change
|
15
|
-
var forceDispatch = false;
|
16
|
-
var options = {
|
17
|
-
padding: 10,
|
18
|
-
overflowAxis: 'horizontal',
|
19
|
-
overflowDirection: 'end',
|
20
|
-
minimumVisible: 0,
|
21
|
-
onUpdateItemVisibility: function () { return undefined; },
|
22
|
-
onUpdateOverflow: function () { return undefined; },
|
23
|
-
};
|
24
|
-
var overflowItems = {};
|
25
|
-
var overflowGroups = {};
|
26
|
-
var resizeObserver = new ResizeObserver(function (entries) {
|
27
|
-
if (!entries[0] || !container) {
|
28
|
-
return;
|
29
|
-
}
|
30
|
-
update();
|
31
|
-
});
|
32
|
-
var invisibleItemQueue = priorityQueue_1.createPriorityQueue(function (a, b) {
|
33
|
-
var itemA = overflowItems[a];
|
34
|
-
var itemB = overflowItems[b];
|
35
|
-
// Higher priority at the top of the queue
|
36
|
-
var priority = itemB.priority - itemA.priority;
|
37
|
-
if (priority !== 0) {
|
38
|
-
return priority;
|
39
|
-
}
|
40
|
-
var positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
|
41
|
-
// equal priority, use DOM order
|
42
|
-
// eslint-disable-next-line no-bitwise
|
43
|
-
return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
|
44
|
-
});
|
45
|
-
var visibleItemQueue = priorityQueue_1.createPriorityQueue(function (a, b) {
|
46
|
-
var itemA = overflowItems[a];
|
47
|
-
var itemB = overflowItems[b];
|
48
|
-
// Lower priority at the top of the queue
|
49
|
-
var priority = itemA.priority - itemB.priority;
|
50
|
-
if (priority !== 0) {
|
51
|
-
return priority;
|
52
|
-
}
|
53
|
-
var positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;
|
54
|
-
// equal priority, use DOM order
|
55
|
-
// eslint-disable-next-line no-bitwise
|
56
|
-
return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
|
57
|
-
});
|
58
|
-
var getOffsetSize = function (el) {
|
59
|
-
return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;
|
60
|
-
};
|
61
|
-
var makeItemVisible = function () {
|
62
|
-
var nextVisible = invisibleItemQueue.dequeue();
|
63
|
-
visibleItemQueue.enqueue(nextVisible);
|
64
|
-
var item = overflowItems[nextVisible];
|
65
|
-
options.onUpdateItemVisibility({ item: item, visible: true });
|
66
|
-
if (item.groupId) {
|
67
|
-
overflowGroups[item.groupId].invisibleItemIds.delete(item.id);
|
68
|
-
overflowGroups[item.groupId].visibleItemIds.add(item.id);
|
69
|
-
}
|
70
|
-
return getOffsetSize(item.element);
|
71
|
-
};
|
72
|
-
var makeItemInvisible = function () {
|
73
|
-
var nextInvisible = visibleItemQueue.dequeue();
|
74
|
-
invisibleItemQueue.enqueue(nextInvisible);
|
75
|
-
var item = overflowItems[nextInvisible];
|
76
|
-
var width = getOffsetSize(item.element);
|
77
|
-
options.onUpdateItemVisibility({ item: item, visible: false });
|
78
|
-
if (item.groupId) {
|
79
|
-
overflowGroups[item.groupId].visibleItemIds.delete(item.id);
|
80
|
-
overflowGroups[item.groupId].invisibleItemIds.add(item.id);
|
81
|
-
}
|
82
|
-
return width;
|
83
|
-
};
|
84
|
-
var dispatchOverflowUpdate = function () {
|
85
|
-
var visibleItemIds = visibleItemQueue.all();
|
86
|
-
var invisibleItemIds = invisibleItemQueue.all();
|
87
|
-
var visibleItems = visibleItemIds.map(function (itemId) { return overflowItems[itemId]; });
|
88
|
-
var invisibleItems = invisibleItemIds.map(function (itemId) { return overflowItems[itemId]; });
|
89
|
-
var groupVisibility = {};
|
90
|
-
Object.entries(overflowGroups).forEach(function (_a) {
|
91
|
-
var groupId = _a[0], groupState = _a[1];
|
92
|
-
if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {
|
93
|
-
groupVisibility[groupId] = 'overflow';
|
94
|
-
}
|
95
|
-
else if (groupState.visibleItemIds.size === 0) {
|
96
|
-
groupVisibility[groupId] = 'hidden';
|
97
|
-
}
|
98
|
-
else {
|
99
|
-
groupVisibility[groupId] = 'visible';
|
100
|
-
}
|
101
|
-
});
|
102
|
-
options.onUpdateOverflow({ visibleItems: visibleItems, invisibleItems: invisibleItems, groupVisibility: groupVisibility });
|
103
|
-
};
|
104
|
-
var processOverflowItems = function () {
|
105
|
-
if (!container) {
|
106
|
-
return false;
|
107
|
-
}
|
108
|
-
var availableSize = getOffsetSize(container) - options.padding;
|
109
|
-
var overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;
|
110
|
-
// Snapshot of the visible/invisible state to compare for updates
|
111
|
-
var visibleTop = visibleItemQueue.peek();
|
112
|
-
var invisibleTop = invisibleItemQueue.peek();
|
113
|
-
var visibleItemIds = visibleItemQueue.all();
|
114
|
-
var currentWidth = visibleItemIds.reduce(function (sum, visibleItemId) {
|
115
|
-
var child = overflowItems[visibleItemId].element;
|
116
|
-
return sum + getOffsetSize(child);
|
117
|
-
}, 0);
|
118
|
-
// Add items until available width is filled - can result in overflow
|
119
|
-
while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {
|
120
|
-
currentWidth += makeItemVisible();
|
121
|
-
}
|
122
|
-
// Remove items until there's no more overflow
|
123
|
-
while (currentWidth > availableSize && visibleItemQueue.size() > 0) {
|
124
|
-
if (visibleItemQueue.size() <= options.minimumVisible) {
|
125
|
-
break;
|
126
|
-
}
|
127
|
-
currentWidth -= makeItemInvisible();
|
128
|
-
}
|
129
|
-
// make sure the overflow menu can fit
|
130
|
-
if (visibleItemQueue.size() > options.minimumVisible &&
|
131
|
-
invisibleItemQueue.size() > 0 &&
|
132
|
-
currentWidth + overflowMenuOffset > availableSize) {
|
133
|
-
makeItemInvisible();
|
134
|
-
}
|
135
|
-
// only update when the state of visible/invisible items has changed
|
136
|
-
if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {
|
137
|
-
return true;
|
138
|
-
}
|
139
|
-
return false;
|
140
|
-
};
|
141
|
-
var forceUpdate = function () {
|
142
|
-
if (processOverflowItems() || forceDispatch) {
|
143
|
-
forceDispatch = false;
|
144
|
-
dispatchOverflowUpdate();
|
145
|
-
}
|
146
|
-
};
|
147
|
-
var update = debounce_1.debounce(forceUpdate);
|
148
|
-
var observe = function (observedContainer, userOptions) {
|
149
|
-
Object.assign(options, userOptions);
|
150
|
-
observing = true;
|
151
|
-
Object.values(overflowItems).forEach(function (item) { return visibleItemQueue.enqueue(item.id); });
|
152
|
-
container = observedContainer;
|
153
|
-
resizeObserver.observe(container);
|
154
|
-
};
|
155
|
-
var disconnect = function () {
|
156
|
-
observing = false;
|
157
|
-
resizeObserver.disconnect();
|
158
|
-
};
|
159
|
-
var addItem = function (item) {
|
160
|
-
if (overflowItems[item.id]) {
|
161
|
-
return;
|
162
|
-
}
|
163
|
-
overflowItems[item.id] = item;
|
164
|
-
// some options can affect priority which are only set on `observe`
|
165
|
-
if (observing) {
|
166
|
-
// Updates to elements might not change the queue tops
|
167
|
-
// i.e. new element is enqueued but the top of the queue stays the same
|
168
|
-
// force a dispatch on the next batched update
|
169
|
-
forceDispatch = true;
|
170
|
-
visibleItemQueue.enqueue(item.id);
|
171
|
-
}
|
172
|
-
if (item.groupId) {
|
173
|
-
if (!overflowGroups[item.groupId]) {
|
174
|
-
overflowGroups[item.groupId] = {
|
175
|
-
visibleItemIds: new Set(),
|
176
|
-
invisibleItemIds: new Set(),
|
177
|
-
};
|
178
|
-
}
|
179
|
-
overflowGroups[item.groupId].visibleItemIds.add(item.id);
|
180
|
-
}
|
181
|
-
update();
|
182
|
-
};
|
183
|
-
var addOverflowMenu = function (el) {
|
184
|
-
overflowMenu = el;
|
185
|
-
};
|
186
|
-
var removeOverflowMenu = function () {
|
187
|
-
overflowMenu = undefined;
|
188
|
-
};
|
189
|
-
var removeItem = function (itemId) {
|
190
|
-
if (!overflowItems[itemId]) {
|
191
|
-
return;
|
192
|
-
}
|
193
|
-
var item = overflowItems[itemId];
|
194
|
-
visibleItemQueue.remove(itemId);
|
195
|
-
invisibleItemQueue.remove(itemId);
|
196
|
-
if (item.groupId) {
|
197
|
-
overflowGroups[item.groupId].visibleItemIds.delete(item.id);
|
198
|
-
overflowGroups[item.groupId].invisibleItemIds.delete(item.id);
|
199
|
-
}
|
200
|
-
delete overflowItems[itemId];
|
201
|
-
update();
|
202
|
-
};
|
203
|
-
return {
|
204
|
-
addItem: addItem,
|
205
|
-
disconnect: disconnect,
|
206
|
-
forceUpdate: forceUpdate,
|
207
|
-
observe: observe,
|
208
|
-
removeItem: removeItem,
|
209
|
-
update: update,
|
210
|
-
addOverflowMenu: addOverflowMenu,
|
211
|
-
removeOverflowMenu: removeOverflowMenu,
|
212
|
-
};
|
213
|
-
}
|
214
|
-
exports.createOverflowManager = createOverflowManager;
|
215
|
-
});
|
216
|
-
//# sourceMappingURL=overflowManager.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"overflowManager.js","sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/overflowManager.ts"],"names":[],"mappings":";;;;IAIA;;;OAGG;IACH,SAAgB,qBAAqB;QACnC,IAAI,SAAkC,CAAC;QACvC,IAAI,YAAqC,CAAC;QAC1C,gDAAgD;QAChD,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,+FAA+F;QAC/F,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAM,OAAO,GAA6B;YACxC,OAAO,EAAE,EAAE;YACX,YAAY,EAAE,YAAY;YAC1B,iBAAiB,EAAE,KAAK;YACxB,cAAc,EAAE,CAAC;YACjB,sBAAsB,EAAE,cAAM,OAAA,SAAS,EAAT,CAAS;YACvC,gBAAgB,EAAE,cAAM,OAAA,SAAS,EAAT,CAAS;SAClC,CAAC;QAEF,IAAM,aAAa,GAAsC,EAAE,CAAC;QAC5D,IAAM,cAAc,GAAmF,EAAE,CAAC;QAC1G,IAAM,cAAc,GAAG,IAAI,cAAc,CAAC,UAAA,OAAO;YAC/C,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE;gBAC7B,OAAO;aACR;YAED,MAAM,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,IAAM,kBAAkB,GAAG,mCAAmB,CAAS,UAAC,CAAC,EAAE,CAAC;YAC1D,IAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC/B,0CAA0C;YAC1C,IAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YACjD,IAAI,QAAQ,KAAK,CAAC,EAAE;gBAClB,OAAO,QAAQ,CAAC;aACjB;YAED,IAAM,iBAAiB,GACrB,OAAO,CAAC,iBAAiB,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC;YAE5G,gCAAgC;YAChC,sCAAsC;YACtC,OAAO,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;QAEH,IAAM,gBAAgB,GAAG,mCAAmB,CAAS,UAAC,CAAC,EAAE,CAAC;YACxD,IAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC/B,yCAAyC;YACzC,IAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAEjD,IAAI,QAAQ,KAAK,CAAC,EAAE;gBAClB,OAAO,QAAQ,CAAC;aACjB;YAED,IAAM,iBAAiB,GACrB,OAAO,CAAC,iBAAiB,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC;YAE5G,gCAAgC;YAChC,sCAAsC;YACtC,OAAO,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;QAEH,IAAM,aAAa,GAAG,UAAC,EAAe;YACpC,OAAO,OAAO,CAAC,YAAY,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC;QAClF,CAAC,CAAC;QAEF,IAAM,eAAe,GAAG;YACtB,IAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,EAAE,CAAC;YACjD,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAEtC,IAAM,IAAI,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;YACxC,OAAO,CAAC,sBAAsB,CAAC,EAAE,IAAI,MAAA,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,IAAI,IAAI,CAAC,OAAO,EAAE;gBAChB,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC9D,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC1D;YAED,OAAO,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC,CAAC;QAEF,IAAM,iBAAiB,GAAG;YACxB,IAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC;YACjD,kBAAkB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAE1C,IAAM,IAAI,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;YAC1C,IAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO,CAAC,sBAAsB,CAAC,EAAE,IAAI,MAAA,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACzD,IAAI,IAAI,CAAC,OAAO,EAAE;gBAChB,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5D,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC5D;YAED,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,IAAM,sBAAsB,GAAG;YAC7B,IAAM,cAAc,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC;YAC9C,IAAM,gBAAgB,GAAG,kBAAkB,CAAC,GAAG,EAAE,CAAC;YAElD,IAAM,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,UAAA,MAAM,IAAI,OAAA,aAAa,CAAC,MAAM,CAAC,EAArB,CAAqB,CAAC,CAAC;YACzE,IAAM,cAAc,GAAG,gBAAgB,CAAC,GAAG,CAAC,UAAA,MAAM,IAAI,OAAA,aAAa,CAAC,MAAM,CAAC,EAArB,CAAqB,CAAC,CAAC;YAE7E,IAAM,eAAe,GAAuC,EAAE,CAAC;YAC/D,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,UAAC,EAAqB;oBAApB,OAAO,QAAA,EAAE,UAAU,QAAA;gBAC1D,IAAI,UAAU,CAAC,gBAAgB,CAAC,IAAI,IAAI,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE;oBACtE,eAAe,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;iBACvC;qBAAM,IAAI,UAAU,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,EAAE;oBAC/C,eAAe,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;iBACrC;qBAAM;oBACL,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;iBACtC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,gBAAgB,CAAC,EAAE,YAAY,cAAA,EAAE,cAAc,gBAAA,EAAE,eAAe,iBAAA,EAAE,CAAC,CAAC;QAC9E,CAAC,CAAC;QAEF,IAAM,oBAAoB,GAAG;YAC3B,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO,KAAK,CAAC;aACd;YAED,IAAM,aAAa,GAAG,aAAa,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;YACjE,IAAM,kBAAkB,GAAG,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAE1E,iEAAiE;YACjE,IAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC;YAE/C,IAAM,cAAc,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC;YAC9C,IAAI,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,aAAa;gBAC1D,IAAM,KAAK,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC;gBACnD,OAAO,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC,EAAE,CAAC,CAAC,CAAC;YAEN,qEAAqE;YACrE,OAAO,YAAY,GAAG,aAAa,IAAI,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;gBACpE,YAAY,IAAI,eAAe,EAAE,CAAC;aACnC;YAED,8CAA8C;YAC9C,OAAO,YAAY,GAAG,aAAa,IAAI,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;gBAClE,IAAI,gBAAgB,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,cAAc,EAAE;oBACrD,MAAM;iBACP;gBACD,YAAY,IAAI,iBAAiB,EAAE,CAAC;aACrC;YAED,sCAAsC;YACtC,IACE,gBAAgB,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,cAAc;gBAChD,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC;gBAC7B,YAAY,GAAG,kBAAkB,GAAG,aAAa,EACjD;gBACA,iBAAiB,EAAE,CAAC;aACrB;YAED,oEAAoE;YACpE,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,UAAU,IAAI,kBAAkB,CAAC,IAAI,EAAE,KAAK,YAAY,EAAE;gBACxF,OAAO,IAAI,CAAC;aACb;YAED,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,IAAM,WAAW,GAAmC;YAClD,IAAI,oBAAoB,EAAE,IAAI,aAAa,EAAE;gBAC3C,aAAa,GAAG,KAAK,CAAC;gBACtB,sBAAsB,EAAE,CAAC;aAC1B;QACH,CAAC,CAAC;QAEF,IAAM,MAAM,GAA8B,mBAAQ,CAAC,WAAW,CAAC,CAAC;QAEhE,IAAM,OAAO,GAA+B,UAAC,iBAAiB,EAAE,WAAW;YACzE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACpC,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,UAAA,IAAI,IAAI,OAAA,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAjC,CAAiC,CAAC,CAAC;YAEhF,SAAS,GAAG,iBAAiB,CAAC;YAC9B,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC,CAAC;QAEF,IAAM,UAAU,GAAkC;YAChD,SAAS,GAAG,KAAK,CAAC;YAClB,cAAc,CAAC,UAAU,EAAE,CAAC;QAC9B,CAAC,CAAC;QAEF,IAAM,OAAO,GAA+B,UAAA,IAAI;YAC9C,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAC1B,OAAO;aACR;YAED,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;YAE9B,mEAAmE;YACnE,IAAI,SAAS,EAAE;gBACb,sDAAsD;gBACtD,uEAAuE;gBACvE,8CAA8C;gBAC9C,aAAa,GAAG,IAAI,CAAC;gBACrB,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aACnC;YAED,IAAI,IAAI,CAAC,OAAO,EAAE;gBAChB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBACjC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG;wBAC7B,cAAc,EAAE,IAAI,GAAG,EAAU;wBACjC,gBAAgB,EAAE,IAAI,GAAG,EAAU;qBACpC,CAAC;iBACH;gBAED,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC1D;YAED,MAAM,EAAE,CAAC;QACX,CAAC,CAAC;QAEF,IAAM,eAAe,GAAuC,UAAA,EAAE;YAC5D,YAAY,GAAG,EAAE,CAAC;QACpB,CAAC,CAAC;QAEF,IAAM,kBAAkB,GAA0C;YAChE,YAAY,GAAG,SAAS,CAAC;QAC3B,CAAC,CAAC;QAEF,IAAM,UAAU,GAAkC,UAAA,MAAM;YACtD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE;gBAC1B,OAAO;aACR;YAED,IAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACnC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAElC,IAAI,IAAI,CAAC,OAAO,EAAE;gBAChB,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5D,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC/D;YAED,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;YAC7B,MAAM,EAAE,CAAC;QACX,CAAC,CAAC;QAEF,OAAO;YACL,OAAO,SAAA;YACP,UAAU,YAAA;YACV,WAAW,aAAA;YACX,OAAO,SAAA;YACP,UAAU,YAAA;YACV,MAAM,QAAA;YACN,eAAe,iBAAA;YACf,kBAAkB,oBAAA;SACnB,CAAC;IACJ,CAAC;IA5PD,sDA4PC","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"]}
|