@salt-ds/lab 1.0.0-alpha.96 → 1.0.0-alpha.98

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.
Files changed (195) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/css/salt-lab.css +1 -343
  3. package/dist-cjs/common-hooks/useSelection.js +6 -3
  4. package/dist-cjs/common-hooks/useSelection.js.map +1 -1
  5. package/dist-cjs/index.js +0 -28
  6. package/dist-cjs/index.js.map +1 -1
  7. package/dist-cjs/list/useList.js +7 -1
  8. package/dist-cjs/list/useList.js.map +1 -1
  9. package/dist-es/common-hooks/useSelection.js +6 -3
  10. package/dist-es/common-hooks/useSelection.js.map +1 -1
  11. package/dist-es/index.js +0 -14
  12. package/dist-es/index.js.map +1 -1
  13. package/dist-es/list/useList.js +7 -1
  14. package/dist-es/list/useList.js.map +1 -1
  15. package/dist-types/index.d.ts +0 -2
  16. package/package.json +2 -2
  17. package/dist-cjs/mega-menu/MegaMenu.js +0 -76
  18. package/dist-cjs/mega-menu/MegaMenu.js.map +0 -1
  19. package/dist-cjs/mega-menu/MegaMenuActions.css.js +0 -6
  20. package/dist-cjs/mega-menu/MegaMenuActions.css.js.map +0 -1
  21. package/dist-cjs/mega-menu/MegaMenuActions.js +0 -33
  22. package/dist-cjs/mega-menu/MegaMenuActions.js.map +0 -1
  23. package/dist-cjs/mega-menu/MegaMenuAside.css.js +0 -6
  24. package/dist-cjs/mega-menu/MegaMenuAside.css.js.map +0 -1
  25. package/dist-cjs/mega-menu/MegaMenuAside.js +0 -33
  26. package/dist-cjs/mega-menu/MegaMenuAside.js.map +0 -1
  27. package/dist-cjs/mega-menu/MegaMenuContent.css.js +0 -6
  28. package/dist-cjs/mega-menu/MegaMenuContent.css.js.map +0 -1
  29. package/dist-cjs/mega-menu/MegaMenuContent.js +0 -25
  30. package/dist-cjs/mega-menu/MegaMenuContent.js.map +0 -1
  31. package/dist-cjs/mega-menu/MegaMenuContext.js +0 -11
  32. package/dist-cjs/mega-menu/MegaMenuContext.js.map +0 -1
  33. package/dist-cjs/mega-menu/MegaMenuGroup.css.js +0 -6
  34. package/dist-cjs/mega-menu/MegaMenuGroup.css.js.map +0 -1
  35. package/dist-cjs/mega-menu/MegaMenuGroup.js +0 -40
  36. package/dist-cjs/mega-menu/MegaMenuGroup.js.map +0 -1
  37. package/dist-cjs/mega-menu/MegaMenuGroupContext.js +0 -17
  38. package/dist-cjs/mega-menu/MegaMenuGroupContext.js.map +0 -1
  39. package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js +0 -6
  40. package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js.map +0 -1
  41. package/dist-cjs/mega-menu/MegaMenuGroupHeading.js +0 -39
  42. package/dist-cjs/mega-menu/MegaMenuGroupHeading.js.map +0 -1
  43. package/dist-cjs/mega-menu/MegaMenuGroups.css.js +0 -6
  44. package/dist-cjs/mega-menu/MegaMenuGroups.css.js.map +0 -1
  45. package/dist-cjs/mega-menu/MegaMenuGroups.js +0 -25
  46. package/dist-cjs/mega-menu/MegaMenuGroups.js.map +0 -1
  47. package/dist-cjs/mega-menu/MegaMenuList.css.js +0 -6
  48. package/dist-cjs/mega-menu/MegaMenuList.css.js.map +0 -1
  49. package/dist-cjs/mega-menu/MegaMenuList.js +0 -43
  50. package/dist-cjs/mega-menu/MegaMenuList.js.map +0 -1
  51. package/dist-cjs/mega-menu/MegaMenuListItem.css.js +0 -6
  52. package/dist-cjs/mega-menu/MegaMenuListItem.css.js.map +0 -1
  53. package/dist-cjs/mega-menu/MegaMenuListItem.js +0 -45
  54. package/dist-cjs/mega-menu/MegaMenuListItem.js.map +0 -1
  55. package/dist-cjs/mega-menu/MegaMenuPanel.css.js +0 -6
  56. package/dist-cjs/mega-menu/MegaMenuPanel.css.js.map +0 -1
  57. package/dist-cjs/mega-menu/MegaMenuPanel.js +0 -88
  58. package/dist-cjs/mega-menu/MegaMenuPanel.js.map +0 -1
  59. package/dist-cjs/mega-menu/MegaMenuTrigger.js +0 -90
  60. package/dist-cjs/mega-menu/MegaMenuTrigger.js.map +0 -1
  61. package/dist-cjs/mega-menu/useMegaMenu.js +0 -15
  62. package/dist-cjs/mega-menu/useMegaMenu.js.map +0 -1
  63. package/dist-cjs/mega-menu/useMegaMenuNavigation.js +0 -282
  64. package/dist-cjs/mega-menu/useMegaMenuNavigation.js.map +0 -1
  65. package/dist-cjs/mega-menu/usePageMargin.js +0 -22
  66. package/dist-cjs/mega-menu/usePageMargin.js.map +0 -1
  67. package/dist-cjs/toolbar-next/ToolbarContentNext.css.js +0 -6
  68. package/dist-cjs/toolbar-next/ToolbarContentNext.css.js.map +0 -1
  69. package/dist-cjs/toolbar-next/ToolbarContentNext.js +0 -32
  70. package/dist-cjs/toolbar-next/ToolbarContentNext.js.map +0 -1
  71. package/dist-cjs/toolbar-next/ToolbarNext.css.js +0 -6
  72. package/dist-cjs/toolbar-next/ToolbarNext.css.js.map +0 -1
  73. package/dist-cjs/toolbar-next/ToolbarNext.js +0 -394
  74. package/dist-cjs/toolbar-next/ToolbarNext.js.map +0 -1
  75. package/dist-cjs/toolbar-next/ToolbarNextOverflow.css.js +0 -6
  76. package/dist-cjs/toolbar-next/ToolbarNextOverflow.css.js.map +0 -1
  77. package/dist-cjs/toolbar-next/ToolbarNextOverflow.js +0 -706
  78. package/dist-cjs/toolbar-next/ToolbarNextOverflow.js.map +0 -1
  79. package/dist-cjs/toolbar-next/ToolbarNextOverflowFloatingBoundary.js +0 -165
  80. package/dist-cjs/toolbar-next/ToolbarNextOverflowFloatingBoundary.js.map +0 -1
  81. package/dist-cjs/toolbar-next/TooltrayNext.css.js +0 -6
  82. package/dist-cjs/toolbar-next/TooltrayNext.css.js.map +0 -1
  83. package/dist-cjs/toolbar-next/TooltrayNext.js +0 -55
  84. package/dist-cjs/toolbar-next/TooltrayNext.js.map +0 -1
  85. package/dist-cjs/toolbar-next/toolbarNextKeyboardUtils.js +0 -409
  86. package/dist-cjs/toolbar-next/toolbarNextKeyboardUtils.js.map +0 -1
  87. package/dist-cjs/toolbar-next/toolbarNextUtils.js +0 -215
  88. package/dist-cjs/toolbar-next/toolbarNextUtils.js.map +0 -1
  89. package/dist-cjs/toolbar-next/useToolbarNextKeyboardNavigation.js +0 -312
  90. package/dist-cjs/toolbar-next/useToolbarNextKeyboardNavigation.js.map +0 -1
  91. package/dist-cjs/toolbar-next/useToolbarNextOverflow.js +0 -745
  92. package/dist-cjs/toolbar-next/useToolbarNextOverflow.js.map +0 -1
  93. package/dist-es/mega-menu/MegaMenu.js +0 -74
  94. package/dist-es/mega-menu/MegaMenu.js.map +0 -1
  95. package/dist-es/mega-menu/MegaMenuActions.css.js +0 -4
  96. package/dist-es/mega-menu/MegaMenuActions.css.js.map +0 -1
  97. package/dist-es/mega-menu/MegaMenuActions.js +0 -31
  98. package/dist-es/mega-menu/MegaMenuActions.js.map +0 -1
  99. package/dist-es/mega-menu/MegaMenuAside.css.js +0 -4
  100. package/dist-es/mega-menu/MegaMenuAside.css.js.map +0 -1
  101. package/dist-es/mega-menu/MegaMenuAside.js +0 -31
  102. package/dist-es/mega-menu/MegaMenuAside.js.map +0 -1
  103. package/dist-es/mega-menu/MegaMenuContent.css.js +0 -4
  104. package/dist-es/mega-menu/MegaMenuContent.css.js.map +0 -1
  105. package/dist-es/mega-menu/MegaMenuContent.js +0 -23
  106. package/dist-es/mega-menu/MegaMenuContent.js.map +0 -1
  107. package/dist-es/mega-menu/MegaMenuContext.js +0 -9
  108. package/dist-es/mega-menu/MegaMenuContext.js.map +0 -1
  109. package/dist-es/mega-menu/MegaMenuGroup.css.js +0 -4
  110. package/dist-es/mega-menu/MegaMenuGroup.css.js.map +0 -1
  111. package/dist-es/mega-menu/MegaMenuGroup.js +0 -38
  112. package/dist-es/mega-menu/MegaMenuGroup.js.map +0 -1
  113. package/dist-es/mega-menu/MegaMenuGroupContext.js +0 -14
  114. package/dist-es/mega-menu/MegaMenuGroupContext.js.map +0 -1
  115. package/dist-es/mega-menu/MegaMenuGroupHeading.css.js +0 -4
  116. package/dist-es/mega-menu/MegaMenuGroupHeading.css.js.map +0 -1
  117. package/dist-es/mega-menu/MegaMenuGroupHeading.js +0 -37
  118. package/dist-es/mega-menu/MegaMenuGroupHeading.js.map +0 -1
  119. package/dist-es/mega-menu/MegaMenuGroups.css.js +0 -4
  120. package/dist-es/mega-menu/MegaMenuGroups.css.js.map +0 -1
  121. package/dist-es/mega-menu/MegaMenuGroups.js +0 -23
  122. package/dist-es/mega-menu/MegaMenuGroups.js.map +0 -1
  123. package/dist-es/mega-menu/MegaMenuList.css.js +0 -4
  124. package/dist-es/mega-menu/MegaMenuList.css.js.map +0 -1
  125. package/dist-es/mega-menu/MegaMenuList.js +0 -41
  126. package/dist-es/mega-menu/MegaMenuList.js.map +0 -1
  127. package/dist-es/mega-menu/MegaMenuListItem.css.js +0 -4
  128. package/dist-es/mega-menu/MegaMenuListItem.css.js.map +0 -1
  129. package/dist-es/mega-menu/MegaMenuListItem.js +0 -43
  130. package/dist-es/mega-menu/MegaMenuListItem.js.map +0 -1
  131. package/dist-es/mega-menu/MegaMenuPanel.css.js +0 -4
  132. package/dist-es/mega-menu/MegaMenuPanel.css.js.map +0 -1
  133. package/dist-es/mega-menu/MegaMenuPanel.js +0 -86
  134. package/dist-es/mega-menu/MegaMenuPanel.js.map +0 -1
  135. package/dist-es/mega-menu/MegaMenuTrigger.js +0 -88
  136. package/dist-es/mega-menu/MegaMenuTrigger.js.map +0 -1
  137. package/dist-es/mega-menu/useMegaMenu.js +0 -13
  138. package/dist-es/mega-menu/useMegaMenu.js.map +0 -1
  139. package/dist-es/mega-menu/useMegaMenuNavigation.js +0 -278
  140. package/dist-es/mega-menu/useMegaMenuNavigation.js.map +0 -1
  141. package/dist-es/mega-menu/usePageMargin.js +0 -20
  142. package/dist-es/mega-menu/usePageMargin.js.map +0 -1
  143. package/dist-es/toolbar-next/ToolbarContentNext.css.js +0 -4
  144. package/dist-es/toolbar-next/ToolbarContentNext.css.js.map +0 -1
  145. package/dist-es/toolbar-next/ToolbarContentNext.js +0 -30
  146. package/dist-es/toolbar-next/ToolbarContentNext.js.map +0 -1
  147. package/dist-es/toolbar-next/ToolbarNext.css.js +0 -4
  148. package/dist-es/toolbar-next/ToolbarNext.css.js.map +0 -1
  149. package/dist-es/toolbar-next/ToolbarNext.js +0 -392
  150. package/dist-es/toolbar-next/ToolbarNext.js.map +0 -1
  151. package/dist-es/toolbar-next/ToolbarNextOverflow.css.js +0 -4
  152. package/dist-es/toolbar-next/ToolbarNextOverflow.css.js.map +0 -1
  153. package/dist-es/toolbar-next/ToolbarNextOverflow.js +0 -701
  154. package/dist-es/toolbar-next/ToolbarNextOverflow.js.map +0 -1
  155. package/dist-es/toolbar-next/ToolbarNextOverflowFloatingBoundary.js +0 -159
  156. package/dist-es/toolbar-next/ToolbarNextOverflowFloatingBoundary.js.map +0 -1
  157. package/dist-es/toolbar-next/TooltrayNext.css.js +0 -4
  158. package/dist-es/toolbar-next/TooltrayNext.css.js.map +0 -1
  159. package/dist-es/toolbar-next/TooltrayNext.js +0 -53
  160. package/dist-es/toolbar-next/TooltrayNext.js.map +0 -1
  161. package/dist-es/toolbar-next/toolbarNextKeyboardUtils.js +0 -390
  162. package/dist-es/toolbar-next/toolbarNextKeyboardUtils.js.map +0 -1
  163. package/dist-es/toolbar-next/toolbarNextUtils.js +0 -211
  164. package/dist-es/toolbar-next/toolbarNextUtils.js.map +0 -1
  165. package/dist-es/toolbar-next/useToolbarNextKeyboardNavigation.js +0 -310
  166. package/dist-es/toolbar-next/useToolbarNextKeyboardNavigation.js.map +0 -1
  167. package/dist-es/toolbar-next/useToolbarNextOverflow.js +0 -743
  168. package/dist-es/toolbar-next/useToolbarNextOverflow.js.map +0 -1
  169. package/dist-types/mega-menu/MegaMenu.d.ts +0 -36
  170. package/dist-types/mega-menu/MegaMenuActions.d.ts +0 -10
  171. package/dist-types/mega-menu/MegaMenuAside.d.ts +0 -9
  172. package/dist-types/mega-menu/MegaMenuContent.d.ts +0 -9
  173. package/dist-types/mega-menu/MegaMenuContext.d.ts +0 -28
  174. package/dist-types/mega-menu/MegaMenuGroup.d.ts +0 -9
  175. package/dist-types/mega-menu/MegaMenuGroupContext.d.ts +0 -12
  176. package/dist-types/mega-menu/MegaMenuGroupHeading.d.ts +0 -13
  177. package/dist-types/mega-menu/MegaMenuGroups.d.ts +0 -8
  178. package/dist-types/mega-menu/MegaMenuList.d.ts +0 -16
  179. package/dist-types/mega-menu/MegaMenuListItem.d.ts +0 -25
  180. package/dist-types/mega-menu/MegaMenuPanel.d.ts +0 -8
  181. package/dist-types/mega-menu/MegaMenuTrigger.d.ts +0 -9
  182. package/dist-types/mega-menu/index.d.ts +0 -11
  183. package/dist-types/mega-menu/useMegaMenu.d.ts +0 -6
  184. package/dist-types/mega-menu/useMegaMenuNavigation.d.ts +0 -16
  185. package/dist-types/mega-menu/usePageMargin.d.ts +0 -6
  186. package/dist-types/toolbar-next/ToolbarContentNext.d.ts +0 -11
  187. package/dist-types/toolbar-next/ToolbarNext.d.ts +0 -12
  188. package/dist-types/toolbar-next/ToolbarNextOverflow.d.ts +0 -34
  189. package/dist-types/toolbar-next/ToolbarNextOverflowFloatingBoundary.d.ts +0 -16
  190. package/dist-types/toolbar-next/TooltrayNext.d.ts +0 -37
  191. package/dist-types/toolbar-next/index.d.ts +0 -3
  192. package/dist-types/toolbar-next/toolbarNextKeyboardUtils.d.ts +0 -39
  193. package/dist-types/toolbar-next/toolbarNextUtils.d.ts +0 -42
  194. package/dist-types/toolbar-next/useToolbarNextKeyboardNavigation.d.ts +0 -42
  195. package/dist-types/toolbar-next/useToolbarNextOverflow.d.ts +0 -37
@@ -1,743 +0,0 @@
1
- import { ownerWindow, useIsomorphicLayoutEffect } from '@salt-ds/core';
2
- import { useWindow } from '@salt-ds/window';
3
- import { useMemo, useRef, useState, useCallback, useEffect } from 'react';
4
- import { buildContentOverflowRenderSlots } from './toolbarNextUtils.js';
5
-
6
- const emptyOverflowState = {
7
- overflowGroups: [],
8
- overflowedIds: /* @__PURE__ */ new Set()
9
- };
10
- const bandPositions = ["start", "center", "end"];
11
- const WIDTH_EPSILON = 0.5;
12
- function measureWidth(element) {
13
- if (!element) {
14
- return 0;
15
- }
16
- const { width } = element.getBoundingClientRect();
17
- return width;
18
- }
19
- function isVisibleMeasurementElement(element) {
20
- if (!(element instanceof HTMLElement)) {
21
- return false;
22
- }
23
- const { width, height } = element.getBoundingClientRect();
24
- const styles = ownerWindow(element).getComputedStyle(element);
25
- return width > 0 && height > 0 && styles.display !== "none" && styles.visibility !== "hidden";
26
- }
27
- function measureOverflowItemWidth(element) {
28
- if (!element) {
29
- return 0;
30
- }
31
- const rect = element.getBoundingClientRect();
32
- let left = rect.left;
33
- let right = rect.right;
34
- for (const descendant of element.querySelectorAll("*")) {
35
- if (!isVisibleMeasurementElement(descendant)) {
36
- continue;
37
- }
38
- const descendantRect = descendant.getBoundingClientRect();
39
- left = Math.min(left, descendantRect.left);
40
- right = Math.max(right, descendantRect.right);
41
- }
42
- return Math.max(rect.width, right - left);
43
- }
44
- function exceedsAvailableWidth(measuredWidth, availableWidth) {
45
- return measuredWidth - availableWidth > WIDTH_EPSILON;
46
- }
47
- function readGap(gapValue) {
48
- return Number.parseFloat(gapValue || "0") || 0;
49
- }
50
- function sumFlexWidths(widths, gap) {
51
- if (widths.length === 0) {
52
- return 0;
53
- }
54
- return widths.reduce((total, width) => total + width, 0) + gap * (widths.length - 1);
55
- }
56
- function buildGroupDefinitions(items) {
57
- const groupMap = /* @__PURE__ */ new Map();
58
- for (const [sequence, item] of items.entries()) {
59
- if (item.overflowMode === "none") {
60
- continue;
61
- }
62
- const existing = groupMap.get(item.overflowGroupKey);
63
- if (existing) {
64
- if (!existing.named && item.overflowGroup === "shared") {
65
- continue;
66
- }
67
- if (existing.label === item.overflowGroup && item.overflowLabel) {
68
- existing.label = item.overflowLabel;
69
- }
70
- continue;
71
- }
72
- groupMap.set(item.overflowGroupKey, {
73
- id: `${item.overflowGroupKey}-${sequence}`,
74
- key: item.overflowGroupKey,
75
- label: item.overflowGroup === "shared" ? "More" : item.overflowLabel ?? item.overflowGroup,
76
- named: item.overflowGroup !== "shared",
77
- order: sequence,
78
- overflowGroup: item.overflowGroup,
79
- contentKey: item.overflowGroup === "shared" ? void 0 : item.contentKey
80
- });
81
- }
82
- return Array.from(groupMap.values()).sort(
83
- (left, right) => left.order - right.order
84
- );
85
- }
86
- function buildCollapseUnits(items) {
87
- const groupedUnits = /* @__PURE__ */ new Map();
88
- const units = [];
89
- for (const [sequence, item] of items.entries()) {
90
- if (item.overflowMode === "none") {
91
- continue;
92
- }
93
- if (item.overflowMode === "grouped" && item.overflowGroup !== "shared") {
94
- const existing = groupedUnits.get(item.overflowGroupKey);
95
- if (existing) {
96
- existing.itemIds.push(item.id);
97
- existing.order = Math.max(existing.order, sequence);
98
- existing.priority = Math.max(existing.priority, item.overflowPriority);
99
- continue;
100
- }
101
- const unit = {
102
- groupKey: item.overflowGroupKey,
103
- itemIds: [item.id],
104
- order: sequence,
105
- priority: item.overflowPriority
106
- };
107
- groupedUnits.set(item.overflowGroupKey, unit);
108
- units.push(unit);
109
- continue;
110
- }
111
- units.push({
112
- groupKey: item.overflowGroupKey,
113
- itemIds: [item.id],
114
- order: sequence,
115
- priority: item.overflowPriority
116
- });
117
- }
118
- return units.sort((left, right) => {
119
- if (left.priority !== right.priority) {
120
- return right.priority - left.priority;
121
- }
122
- return right.order - left.order;
123
- });
124
- }
125
- function areOverflowStatesEqual(previous, next) {
126
- if (previous.overflowedIds.size !== next.overflowedIds.size) {
127
- return false;
128
- }
129
- for (const itemId of previous.overflowedIds) {
130
- if (!next.overflowedIds.has(itemId)) {
131
- return false;
132
- }
133
- }
134
- if (previous.overflowGroups.length !== next.overflowGroups.length) {
135
- return false;
136
- }
137
- return previous.overflowGroups.every((group, index) => {
138
- const nextGroup = next.overflowGroups[index];
139
- if (nextGroup == null || group.id !== nextGroup.id || group.label !== nextGroup.label || group.items.length !== nextGroup.items.length) {
140
- return false;
141
- }
142
- return group.items.every((item, itemIndex) => {
143
- var _a;
144
- return item.id === ((_a = nextGroup.items[itemIndex]) == null ? void 0 : _a.id);
145
- });
146
- });
147
- }
148
- function computeToolbarNextOverflowState({
149
- bandGaps,
150
- collapseUnits,
151
- containerWidth,
152
- groupDefinitions,
153
- itemWidths,
154
- items,
155
- namedTriggerWidths,
156
- content,
157
- contentGaps,
158
- rootGap,
159
- triggerWidths
160
- }) {
161
- const hasCenteredLayout = content.some(
162
- (contentArea) => contentArea.position === "center"
163
- );
164
- const contentByPosition = bandPositions.reduce(
165
- (bands, position) => {
166
- bands[position] = content.filter(
167
- (contentArea) => contentArea.position === position
168
- );
169
- return bands;
170
- },
171
- {
172
- start: [],
173
- center: [],
174
- end: []
175
- }
176
- );
177
- const overflowedIds = /* @__PURE__ */ new Set();
178
- const activeGroups = /* @__PURE__ */ new Set();
179
- const getContentWidth = (contentArea) => {
180
- const renderSlots = buildContentOverflowRenderSlots(
181
- contentArea.items,
182
- overflowedIds,
183
- new Set(
184
- groupDefinitions.filter((group) => {
185
- return group.named && group.contentKey === contentArea.key && activeGroups.has(group.key);
186
- }).map((group) => group.key)
187
- )
188
- );
189
- const slotWidths = [];
190
- for (const slot of renderSlots) {
191
- const width = slot.triggerGroupKey != null ? namedTriggerWidths.get(slot.item.id) : itemWidths.get(slot.item.id);
192
- if (width == null || width <= 0) {
193
- return null;
194
- }
195
- slotWidths.push(width);
196
- }
197
- return sumFlexWidths(slotWidths, contentGaps.get(contentArea.key) ?? 0);
198
- };
199
- const getBandWidth = (position) => {
200
- const bandChildWidths = [];
201
- for (const contentArea of contentByPosition[position]) {
202
- const contentWidth = getContentWidth(contentArea);
203
- if (contentWidth == null) {
204
- return null;
205
- }
206
- if (contentWidth > 0) {
207
- bandChildWidths.push(contentWidth);
208
- }
209
- }
210
- if (position === "end") {
211
- for (const group of groupDefinitions) {
212
- if (!group.named && activeGroups.has(group.key)) {
213
- const width = triggerWidths.get(group.key);
214
- if (width == null || width <= 0) {
215
- return null;
216
- }
217
- bandChildWidths.push(width);
218
- }
219
- }
220
- }
221
- return sumFlexWidths(bandChildWidths, bandGaps.get(position) ?? 0);
222
- };
223
- const getTotalWidth = () => {
224
- if (hasCenteredLayout) {
225
- const startBandWidth = getBandWidth("start");
226
- const centerBandWidth = getBandWidth("center");
227
- const endBandWidth = getBandWidth("end");
228
- if (startBandWidth == null || centerBandWidth == null || endBandWidth == null) {
229
- return null;
230
- }
231
- return centerBandWidth + Math.max(startBandWidth, endBandWidth) * 2;
232
- }
233
- const visibleBandWidths = [];
234
- for (const position of bandPositions) {
235
- const bandWidth = getBandWidth(position);
236
- if (bandWidth == null) {
237
- return null;
238
- }
239
- if (bandWidth > 0) {
240
- visibleBandWidths.push(bandWidth);
241
- }
242
- }
243
- return sumFlexWidths(visibleBandWidths, rootGap);
244
- };
245
- const initialWidth = getTotalWidth();
246
- if (initialWidth == null) {
247
- return emptyOverflowState;
248
- }
249
- if (exceedsAvailableWidth(initialWidth, containerWidth)) {
250
- for (const unit of collapseUnits) {
251
- for (const itemId of unit.itemIds) {
252
- overflowedIds.add(itemId);
253
- }
254
- activeGroups.add(unit.groupKey);
255
- const nextWidth = getTotalWidth();
256
- if (nextWidth == null) {
257
- return emptyOverflowState;
258
- }
259
- if (!exceedsAvailableWidth(nextWidth, containerWidth)) {
260
- break;
261
- }
262
- }
263
- }
264
- const overflowGroups = groupDefinitions.reduce(
265
- (groups, group) => {
266
- const hiddenItems = items.filter(
267
- (item) => item.overflowGroupKey === group.key && overflowedIds.has(item.id)
268
- );
269
- if (hiddenItems.length > 0) {
270
- groups.push({
271
- id: group.id,
272
- items: hiddenItems,
273
- key: group.key,
274
- label: group.label,
275
- named: group.named,
276
- overflowGroup: group.overflowGroup,
277
- contentKey: group.contentKey
278
- });
279
- }
280
- return groups;
281
- },
282
- []
283
- );
284
- return {
285
- overflowGroups,
286
- overflowedIds
287
- };
288
- }
289
- function useToolbarNextOverflow({
290
- content
291
- }) {
292
- const targetWindow = useWindow();
293
- const items = useMemo(
294
- () => content.flatMap((contentArea) => contentArea.items),
295
- [content]
296
- );
297
- const containerRef = useRef(null);
298
- const bandRefs = useRef({
299
- start: null,
300
- center: null,
301
- end: null
302
- });
303
- const bandRefCallbacks = useRef(
304
- /* @__PURE__ */ new Map()
305
- );
306
- const contentRefs = useRef({});
307
- const contentRefCallbacks = useRef(
308
- /* @__PURE__ */ new Map()
309
- );
310
- const itemRefs = useRef({});
311
- const itemRefCallbacks = useRef(
312
- /* @__PURE__ */ new Map()
313
- );
314
- const namedTriggerRefs = useRef({});
315
- const namedTriggerRefCallbacks = useRef(
316
- /* @__PURE__ */ new Map()
317
- );
318
- const namedTriggerMeasureRefs = useRef(
319
- {}
320
- );
321
- const namedTriggerMeasureCallbacks = useRef(
322
- /* @__PURE__ */ new Map()
323
- );
324
- const triggerMeasureRefs = useRef(
325
- {}
326
- );
327
- const triggerMeasureCallbacks = useRef(
328
- /* @__PURE__ */ new Map()
329
- );
330
- const rafRef = useRef(null);
331
- const clearComputingRafRef = useRef(null);
332
- const isComputingRef = useRef(false);
333
- const pendingMeasureRef = useRef(false);
334
- const resizeObserverRef = useRef(null);
335
- const observedWidthTargetsRef = useRef(
336
- /* @__PURE__ */ new Map()
337
- );
338
- const cachedItemWidths = useRef({});
339
- const cachedNamedTriggerWidths = useRef({});
340
- const cachedSharedTriggerWidths = useRef({});
341
- const [overflowState, setOverflowState] = useState(emptyOverflowState);
342
- const namedTriggerItems = useMemo(
343
- () => items.filter((item) => {
344
- return item.overflowMode !== "none" && item.overflowGroup !== "shared";
345
- }),
346
- [items]
347
- );
348
- const groupDefinitions = useMemo(() => buildGroupDefinitions(items), [items]);
349
- const collapseUnits = useMemo(() => buildCollapseUnits(items), [items]);
350
- const computeOverflow = useCallback(() => {
351
- const container = containerRef.current;
352
- if (!container) {
353
- return emptyOverflowState;
354
- }
355
- const containerStyles = ownerWindow(container).getComputedStyle(container);
356
- const paddingLeft = Number.parseFloat(containerStyles.paddingLeft || "0") || 0;
357
- const paddingRight = Number.parseFloat(containerStyles.paddingRight || "0") || 0;
358
- const borderLeft = Number.parseFloat(containerStyles.borderLeftWidth || "0") || 0;
359
- const borderRight = Number.parseFloat(containerStyles.borderRightWidth || "0") || 0;
360
- const containerWidth = container.getBoundingClientRect().width - paddingLeft - paddingRight - borderLeft - borderRight;
361
- if (containerWidth <= 0) {
362
- return emptyOverflowState;
363
- }
364
- const rootGap = readGap(
365
- containerStyles.columnGap || containerStyles.gap || "0"
366
- );
367
- const bandGaps = /* @__PURE__ */ new Map();
368
- const contentGaps = /* @__PURE__ */ new Map();
369
- const itemWidths = /* @__PURE__ */ new Map();
370
- const namedTriggerWidths = /* @__PURE__ */ new Map();
371
- const triggerWidths = /* @__PURE__ */ new Map();
372
- for (const position of bandPositions) {
373
- const bandElement = bandRefs.current[position];
374
- if (!bandElement) {
375
- bandGaps.set(position, 0);
376
- continue;
377
- }
378
- const bandStyles = ownerWindow(bandElement).getComputedStyle(bandElement);
379
- bandGaps.set(
380
- position,
381
- readGap(bandStyles.columnGap || bandStyles.gap || "0")
382
- );
383
- }
384
- for (const contentArea of content) {
385
- const contentElement = contentRefs.current[contentArea.key];
386
- if (!contentElement) {
387
- return emptyOverflowState;
388
- }
389
- const contentStyles = ownerWindow(contentElement).getComputedStyle(contentElement);
390
- contentGaps.set(
391
- contentArea.key,
392
- readGap(contentStyles.columnGap || contentStyles.gap || "0")
393
- );
394
- }
395
- for (const item of items) {
396
- const element = itemRefs.current[item.id];
397
- if (element) {
398
- const width = measureOverflowItemWidth(element);
399
- if (width > 0) {
400
- itemWidths.set(item.id, width);
401
- cachedItemWidths.current[item.id] = width;
402
- continue;
403
- }
404
- }
405
- const cached = cachedItemWidths.current[item.id];
406
- if (cached != null && cached > 0) {
407
- itemWidths.set(item.id, cached);
408
- continue;
409
- }
410
- return emptyOverflowState;
411
- }
412
- for (const item of namedTriggerItems) {
413
- const liveWidth = measureWidth(namedTriggerRefs.current[item.id]);
414
- if (liveWidth > 0) {
415
- namedTriggerWidths.set(item.id, liveWidth);
416
- cachedNamedTriggerWidths.current[item.id] = liveWidth;
417
- continue;
418
- }
419
- const measureWidthForItem = measureWidth(
420
- namedTriggerMeasureRefs.current[item.id]
421
- );
422
- if (measureWidthForItem > 0) {
423
- namedTriggerWidths.set(item.id, measureWidthForItem);
424
- cachedNamedTriggerWidths.current[item.id] = measureWidthForItem;
425
- continue;
426
- }
427
- const cached = cachedNamedTriggerWidths.current[item.id];
428
- if (cached != null && cached > 0) {
429
- namedTriggerWidths.set(item.id, cached);
430
- continue;
431
- }
432
- return emptyOverflowState;
433
- }
434
- for (const group of groupDefinitions.filter((entry) => !entry.named)) {
435
- const width = measureWidth(triggerMeasureRefs.current[group.key]);
436
- if (width <= 0) {
437
- const cached = cachedSharedTriggerWidths.current[group.key];
438
- if (cached != null && cached > 0) {
439
- triggerWidths.set(group.key, cached);
440
- continue;
441
- }
442
- return emptyOverflowState;
443
- }
444
- triggerWidths.set(group.key, width);
445
- cachedSharedTriggerWidths.current[group.key] = width;
446
- }
447
- const nextOverflowState = computeToolbarNextOverflowState({
448
- bandGaps,
449
- collapseUnits,
450
- containerWidth,
451
- groupDefinitions,
452
- itemWidths,
453
- items,
454
- namedTriggerWidths,
455
- content,
456
- contentGaps,
457
- rootGap,
458
- triggerWidths
459
- });
460
- return nextOverflowState;
461
- }, [collapseUnits, groupDefinitions, items, namedTriggerItems, content]);
462
- const scheduleMeasureRef = useRef(() => {
463
- });
464
- const scheduleMeasure = useCallback(() => {
465
- if (!targetWindow) {
466
- return;
467
- }
468
- if (isComputingRef.current) {
469
- pendingMeasureRef.current = true;
470
- return;
471
- }
472
- if (rafRef.current != null) {
473
- targetWindow.cancelAnimationFrame(rafRef.current);
474
- }
475
- rafRef.current = targetWindow.requestAnimationFrame(() => {
476
- rafRef.current = null;
477
- isComputingRef.current = true;
478
- try {
479
- const nextState = computeOverflow();
480
- setOverflowState((previous) => {
481
- return areOverflowStatesEqual(previous, nextState) ? previous : nextState;
482
- });
483
- } finally {
484
- clearComputingRafRef.current = targetWindow.requestAnimationFrame(
485
- () => {
486
- clearComputingRafRef.current = null;
487
- isComputingRef.current = false;
488
- if (pendingMeasureRef.current) {
489
- pendingMeasureRef.current = false;
490
- scheduleMeasureRef.current();
491
- }
492
- }
493
- );
494
- }
495
- });
496
- }, [computeOverflow, targetWindow]);
497
- useIsomorphicLayoutEffect(() => {
498
- scheduleMeasureRef.current = scheduleMeasure;
499
- return () => {
500
- scheduleMeasureRef.current = () => {
501
- };
502
- };
503
- }, [scheduleMeasure]);
504
- const getCachedWidthForObservedTarget = useCallback(
505
- (target) => {
506
- switch (target.kind) {
507
- case "item":
508
- return cachedItemWidths.current[target.id];
509
- case "named-trigger":
510
- case "named-trigger-measure":
511
- return cachedNamedTriggerWidths.current[target.id];
512
- case "shared-trigger-measure":
513
- return cachedSharedTriggerWidths.current[target.groupKey];
514
- }
515
- },
516
- []
517
- );
518
- const setCachedWidthForObservedTarget = useCallback(
519
- (target, width) => {
520
- switch (target.kind) {
521
- case "item":
522
- cachedItemWidths.current[target.id] = width;
523
- return;
524
- case "named-trigger":
525
- case "named-trigger-measure":
526
- cachedNamedTriggerWidths.current[target.id] = width;
527
- return;
528
- case "shared-trigger-measure":
529
- cachedSharedTriggerWidths.current[target.groupKey] = width;
530
- return;
531
- }
532
- },
533
- []
534
- );
535
- const observeWidthTarget = useCallback(
536
- (node, target) => {
537
- var _a;
538
- if (!node) {
539
- return;
540
- }
541
- observedWidthTargetsRef.current.set(node, target);
542
- (_a = resizeObserverRef.current) == null ? void 0 : _a.observe(node);
543
- },
544
- []
545
- );
546
- const unobserveWidthTarget = useCallback((node) => {
547
- var _a;
548
- if (!node) {
549
- return;
550
- }
551
- observedWidthTargetsRef.current.delete(node);
552
- (_a = resizeObserverRef.current) == null ? void 0 : _a.unobserve(node);
553
- }, []);
554
- const updateObservedNode = useCallback(
555
- (nodes, key, node, target) => {
556
- const previous = nodes[key];
557
- if (previous === node) {
558
- return;
559
- }
560
- if (previous) {
561
- unobserveWidthTarget(previous);
562
- }
563
- nodes[key] = node;
564
- if (node) {
565
- observeWidthTarget(node, target);
566
- }
567
- },
568
- [observeWidthTarget, unobserveWidthTarget]
569
- );
570
- useIsomorphicLayoutEffect(() => {
571
- scheduleMeasure();
572
- }, [scheduleMeasure]);
573
- useEffect(() => {
574
- const container = containerRef.current;
575
- if (!container) {
576
- return;
577
- }
578
- let cancelled = false;
579
- const win = ownerWindow(container);
580
- const resizeObserver = new win.ResizeObserver((entries) => {
581
- let shouldMeasure = false;
582
- for (const entry of entries) {
583
- const target = observedWidthTargetsRef.current.get(entry.target);
584
- if (!target) {
585
- continue;
586
- }
587
- if (target.kind === "container") {
588
- shouldMeasure = true;
589
- continue;
590
- }
591
- const nextWidth = target.kind === "item" ? measureOverflowItemWidth(entry.target) : measureWidth(entry.target);
592
- if (nextWidth <= 0) {
593
- continue;
594
- }
595
- const previousWidth = getCachedWidthForObservedTarget(target);
596
- if (previousWidth !== nextWidth) {
597
- setCachedWidthForObservedTarget(target, nextWidth);
598
- shouldMeasure = true;
599
- }
600
- }
601
- if (shouldMeasure) {
602
- scheduleMeasureRef.current();
603
- }
604
- });
605
- resizeObserverRef.current = resizeObserver;
606
- observeWidthTarget(container, { kind: "container" });
607
- for (const node of observedWidthTargetsRef.current.keys()) {
608
- resizeObserver.observe(node);
609
- }
610
- if (win.document.fonts) {
611
- void win.document.fonts.ready.then(() => {
612
- if (!cancelled) {
613
- scheduleMeasureRef.current();
614
- }
615
- });
616
- }
617
- return () => {
618
- cancelled = true;
619
- resizeObserverRef.current = null;
620
- resizeObserver.disconnect();
621
- if (rafRef.current != null) {
622
- win.cancelAnimationFrame(rafRef.current);
623
- rafRef.current = null;
624
- }
625
- if (clearComputingRafRef.current != null) {
626
- win.cancelAnimationFrame(clearComputingRafRef.current);
627
- clearComputingRafRef.current = null;
628
- }
629
- isComputingRef.current = false;
630
- pendingMeasureRef.current = false;
631
- };
632
- }, [
633
- getCachedWidthForObservedTarget,
634
- observeWidthTarget,
635
- setCachedWidthForObservedTarget
636
- ]);
637
- const getItemRef = useCallback(
638
- (id) => {
639
- const existing = itemRefCallbacks.current.get(id);
640
- if (existing) {
641
- return existing;
642
- }
643
- const callback = (node) => {
644
- updateObservedNode(itemRefs.current, id, node, {
645
- id,
646
- kind: "item"
647
- });
648
- };
649
- itemRefCallbacks.current.set(id, callback);
650
- return callback;
651
- },
652
- [updateObservedNode]
653
- );
654
- const getNamedTriggerRef = useCallback(
655
- (id) => {
656
- const existing = namedTriggerRefCallbacks.current.get(id);
657
- if (existing) {
658
- return existing;
659
- }
660
- const callback = (node) => {
661
- updateObservedNode(namedTriggerRefs.current, id, node, {
662
- id,
663
- kind: "named-trigger"
664
- });
665
- };
666
- namedTriggerRefCallbacks.current.set(id, callback);
667
- return callback;
668
- },
669
- [updateObservedNode]
670
- );
671
- const getNamedTriggerMeasureRef = useCallback(
672
- (id) => {
673
- const existing = namedTriggerMeasureCallbacks.current.get(id);
674
- if (existing) {
675
- return existing;
676
- }
677
- const callback = (node) => {
678
- updateObservedNode(namedTriggerMeasureRefs.current, id, node, {
679
- id,
680
- kind: "named-trigger-measure"
681
- });
682
- };
683
- namedTriggerMeasureCallbacks.current.set(id, callback);
684
- return callback;
685
- },
686
- [updateObservedNode]
687
- );
688
- const getContentRef = useCallback((contentKey) => {
689
- const existing = contentRefCallbacks.current.get(contentKey);
690
- if (existing) {
691
- return existing;
692
- }
693
- const callback = (node) => {
694
- contentRefs.current[contentKey] = node;
695
- };
696
- contentRefCallbacks.current.set(contentKey, callback);
697
- return callback;
698
- }, []);
699
- const getBandRef = useCallback((position) => {
700
- const existing = bandRefCallbacks.current.get(position);
701
- if (existing) {
702
- return existing;
703
- }
704
- const callback = (node) => {
705
- bandRefs.current[position] = node;
706
- };
707
- bandRefCallbacks.current.set(position, callback);
708
- return callback;
709
- }, []);
710
- const getTriggerMeasureRef = useCallback(
711
- (groupKey) => {
712
- const existing = triggerMeasureCallbacks.current.get(groupKey);
713
- if (existing) {
714
- return existing;
715
- }
716
- const callback = (node) => {
717
- updateObservedNode(triggerMeasureRefs.current, groupKey, node, {
718
- groupKey,
719
- kind: "shared-trigger-measure"
720
- });
721
- };
722
- triggerMeasureCallbacks.current.set(groupKey, callback);
723
- return callback;
724
- },
725
- [updateObservedNode]
726
- );
727
- return {
728
- containerRef,
729
- getBandRef,
730
- getItemRef,
731
- getNamedTriggerMeasureRef,
732
- getNamedTriggerRef,
733
- getContentRef,
734
- getTriggerMeasureRef,
735
- isOverflowing: overflowState.overflowGroups.length > 0,
736
- overflowGroups: overflowState.overflowGroups,
737
- overflowedIds: overflowState.overflowedIds,
738
- overflowTriggerGroups: groupDefinitions
739
- };
740
- }
741
-
742
- export { useToolbarNextOverflow };
743
- //# sourceMappingURL=useToolbarNextOverflow.js.map