@adecore/ui 0.31.12 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/dist/AccentSwatches.js +290 -13
  2. package/dist/Banner.js +90 -9
  3. package/dist/Button.js +114 -22
  4. package/dist/ButtonGroup.js +62 -8
  5. package/dist/Checkbox.js +73 -4
  6. package/dist/ChoiceCards.js +205 -11
  7. package/dist/CloseButton.js +87 -7
  8. package/dist/ColorSwatch.js +132 -15
  9. package/dist/ColorWheelPicker.js +305 -71
  10. package/dist/ColumnResizeHandle.js +43 -8
  11. package/dist/DisabledReason.js +27 -8
  12. package/dist/DockShell.js +144 -37
  13. package/dist/EmptyState.js +95 -6
  14. package/dist/ErrorBoundary.js +254 -31
  15. package/dist/Field.js +349 -31
  16. package/dist/FileIcon.js +67 -6
  17. package/dist/Icon.js +38 -6
  18. package/dist/IconButton.js +176 -20
  19. package/dist/IconPicker.js +344 -73
  20. package/dist/Input.js +233 -14
  21. package/dist/Kbd.js +150 -10
  22. package/dist/LazyBoundary.js +14 -5
  23. package/dist/ListRow.js +75 -15
  24. package/dist/Meter.js +108 -5
  25. package/dist/MiddleTruncate.js +126 -45
  26. package/dist/PanelEmpty.js +64 -5
  27. package/dist/PanelHeader.js +95 -13
  28. package/dist/Pill.js +114 -19
  29. package/dist/ProjectSwitcher.js +225 -12
  30. package/dist/PromptDialog.js +352 -37
  31. package/dist/SectionLabel.js +62 -8
  32. package/dist/SegmentBar.js +197 -36
  33. package/dist/Segmented.js +130 -23
  34. package/dist/Select.js +310 -19
  35. package/dist/SelectSearch.js +344 -29
  36. package/dist/Separator.js +35 -4
  37. package/dist/ShortcutHints.js +146 -76
  38. package/dist/Skeleton.js +31 -4
  39. package/dist/Slider.js +172 -10
  40. package/dist/SlidingColumn.js +194 -34
  41. package/dist/Spinner.js +100 -3
  42. package/dist/Stepper.js +232 -11
  43. package/dist/Surface.js +62 -8
  44. package/dist/Switch.js +60 -6
  45. package/dist/TextMenu.js +212 -17
  46. package/dist/Tile.js +149 -5
  47. package/dist/Toasts.js +391 -33
  48. package/dist/Tooltip.js +153 -16
  49. package/dist/UIProvider.js +62 -15
  50. package/dist/Waveform.js +362 -93
  51. package/dist/Wipe.js +259 -34
  52. package/dist/ZoomControls.js +356 -14
  53. package/dist/class-name.js +1 -1
  54. package/dist/clipboard.js +15 -17
  55. package/dist/context-menu/index.parts.js +1 -1
  56. package/dist/dialog/index.parts.js +1 -1
  57. package/dist/dialog/parts.js +378 -29
  58. package/dist/dialog-layer.js +51 -18
  59. package/dist/error-boundary.js +19 -19
  60. package/dist/error-message.js +1 -1
  61. package/dist/field-context.js +7 -5
  62. package/dist/file-icon.js +23 -21
  63. package/dist/file-tree/helpers.js +133 -119
  64. package/dist/file-tree/index.parts.js +3 -3
  65. package/dist/file-tree/parts.js +418 -127
  66. package/dist/file-tree/style.js +1 -1
  67. package/dist/file-tree/use-file-tree-shift.js +43 -30
  68. package/dist/file-tree/use-file-tree.js +60 -18
  69. package/dist/file-tree/use-slots.js +220 -192
  70. package/dist/floating.js +2 -2
  71. package/dist/format/datetime.js +88 -38
  72. package/dist/format/duration.js +59 -53
  73. package/dist/format/index.js +1 -1
  74. package/dist/format/locale.js +76 -56
  75. package/dist/format/number.js +77 -61
  76. package/dist/format/regions.js +4 -2
  77. package/dist/format/time-zone.js +1 -1
  78. package/dist/icon-button-size.js +12 -2
  79. package/dist/icon-picker.js +70 -61
  80. package/dist/index.js +57 -57
  81. package/dist/key-value-list/index.parts.js +1 -1
  82. package/dist/key-value-list/parts.js +256 -22
  83. package/dist/lazy-landings.js +10 -10
  84. package/dist/lazy.js +84 -71
  85. package/dist/locales/en.js +80 -80
  86. package/dist/locales/nl.js +80 -80
  87. package/dist/locales.js +10 -7
  88. package/dist/menu/index.parts.js +1 -1
  89. package/dist/menu/parts.js +882 -44
  90. package/dist/merge-refs.js +8 -9
  91. package/dist/middle-truncate.js +24 -25
  92. package/dist/modality.js +27 -19
  93. package/dist/placement.js +11 -20
  94. package/dist/platform.js +6 -6
  95. package/dist/popover/index.parts.js +1 -1
  96. package/dist/popover/parts.js +173 -11
  97. package/dist/popup-layer.js +38 -17
  98. package/dist/prefetch.js +78 -79
  99. package/dist/preview-card/index.parts.js +1 -1
  100. package/dist/project-switcher-row.js +153 -12
  101. package/dist/select-row.js +69 -5
  102. package/dist/select-shared.js +6 -6
  103. package/dist/selection.js +16 -16
  104. package/dist/seti-icons.js +413 -413
  105. package/dist/settings/ConfirmDialog.js +55 -8
  106. package/dist/settings/DetailHeader.js +72 -4
  107. package/dist/settings/MasterDetail.js +119 -7
  108. package/dist/settings/SettingsDialog.js +820 -80
  109. package/dist/settings/SettingsRow.js +205 -18
  110. package/dist/settings/SettingsSection.js +96 -6
  111. package/dist/settings/index.js +7 -7
  112. package/dist/settings/target.js +7 -2
  113. package/dist/shortcut-hints.js +73 -55
  114. package/dist/shortcut.js +140 -104
  115. package/dist/step-places.js +1 -1
  116. package/dist/tabs/index.parts.js +1 -1
  117. package/dist/tabs/overflow.js +18 -18
  118. package/dist/tabs/parts.js +780 -166
  119. package/dist/testing/dedupe.js +82 -75
  120. package/dist/testing/fake-source.js +12 -12
  121. package/dist/testing/index.js +1 -1
  122. package/dist/toast-store.js +65 -46
  123. package/dist/tree/index.parts.js +1 -1
  124. package/dist/tree/parts.js +721 -94
  125. package/dist/tree/shift.js +28 -22
  126. package/dist/tree/style.js +2 -2
  127. package/dist/tree/use-tree-shift.js +178 -117
  128. package/dist/useAsyncAction.js +23 -19
  129. package/dist/useColumnResize.js +36 -34
  130. package/dist/useContentSize.js +62 -18
  131. package/dist/useMeasuredWidth.js +14 -3
  132. package/dist/useNow.js +73 -30
  133. package/dist/wipe-split.js +14 -14
  134. package/dist/workspace/DropPreview.js +60 -7
  135. package/dist/workspace/SplitView.js +1025 -441
  136. package/dist/workspace/TabStrip.js +810 -191
  137. package/dist/workspace/Workspace.js +276 -26
  138. package/dist/workspace/context.js +8 -3
  139. package/dist/workspace/geometry.js +173 -150
  140. package/dist/workspace/model.js +313 -250
  141. package/dist/workspace/preview.js +61 -61
  142. package/dist/zoom.js +2 -2
  143. package/package.json +1 -1
  144. package/src/ErrorBoundary.tsx +1 -1
  145. package/src/Field.tsx +4 -3
  146. package/src/IconPicker.tsx +3 -3
  147. package/src/LazyBoundary.tsx +2 -0
  148. package/src/MiddleTruncate.tsx +2 -2
  149. package/src/SegmentBar.tsx +2 -2
  150. package/src/Toasts.tsx +3 -1
  151. package/src/Tooltip.tsx +7 -10
  152. package/src/Waveform.tsx +3 -3
  153. package/src/file-tree/parts.tsx +6 -9
  154. package/src/file-tree/use-file-tree-shift.tsx +6 -9
  155. package/src/lazy.tsx +4 -0
  156. package/src/locales/en.ts +4 -4
  157. package/src/locales/nl.ts +5 -5
  158. package/src/settings/SettingsDialog.tsx +1 -1
  159. package/src/tree/parts.tsx +5 -8
  160. package/src/useContentSize.ts +3 -3
  161. package/src/workspace/SplitView.tsx +2 -2
  162. package/src/workspace/TabStrip.tsx +2 -3
  163. package/src/workspace/Workspace.tsx +2 -5
@@ -1,30 +1,280 @@
1
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useMemo } from 'react';
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import 'react';
3
3
  import clsx from 'clsx';
4
4
  import { useRender } from '@base-ui/react/use-render';
5
5
  import { WorkspaceContext } from './context.js';
6
- const isPresent = (node) => node !== undefined && node !== null && node !== false;
7
- export function Workspace({ layout = 'standard', toolbar, sidebar, sidePanel, sidebarWidth = 248, sidePanelWidth = 320, sidebarOpen, sidePanelOpen, children, className, ref, render, style, ...props }) {
8
- const hasSidebar = isPresent(sidebar);
9
- const hasPanel = isPresent(sidePanel);
10
- const leftOpen = hasSidebar && (sidebarOpen ?? true);
11
- const rightOpen = hasPanel && (sidePanelOpen ?? true);
12
- const hasToolbar = isPresent(toolbar);
13
- const element = useRender({
14
- render,
15
- ref,
16
- defaultTagName: 'div',
17
- props: {
18
- ...props,
19
- className: clsx('ade-workspace', className),
20
- style,
21
- 'data-layout': layout,
22
- 'data-toolbar': hasToolbar || undefined,
23
- 'data-sidebar': leftOpen || undefined,
24
- 'data-side-panel': rightOpen || undefined,
25
- children: (_jsxs(_Fragment, { children: [hasSidebar && (_jsx("aside", { className: "ade-workspace-sidebar", "data-auto": sidebarWidth === 'auto' || undefined, style: { width: sidebarWidth }, children: sidebar })), _jsxs("div", { className: "ade-workspace-center", children: [hasToolbar && _jsx("div", { className: "ade-workspace-toolbar", children: toolbar }), _jsx("div", { className: "ade-workspace-content", children: children })] }), hasPanel && (_jsx("aside", { className: "ade-workspace-side-panel", "data-auto": sidePanelWidth === 'auto' || undefined, style: { width: sidePanelWidth }, children: sidePanel }))] }))
26
- }
6
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
7
+ const isPresent = node => node !== undefined && node !== null && node !== false;
8
+ export function Workspace(t0) {
9
+ const $ = _c(66);
10
+ let children;
11
+ let className;
12
+ let props;
13
+ let ref;
14
+ let render;
15
+ let sidePanel;
16
+ let sidePanelOpen;
17
+ let sidebar;
18
+ let sidebarOpen;
19
+ let style;
20
+ let t1;
21
+ let t2;
22
+ let t3;
23
+ let toolbar;
24
+ if ($[0] !== t0) {
25
+ ({
26
+ layout: t1,
27
+ toolbar,
28
+ sidebar,
29
+ sidePanel,
30
+ sidebarWidth: t2,
31
+ sidePanelWidth: t3,
32
+ sidebarOpen,
33
+ sidePanelOpen,
34
+ children,
35
+ className,
36
+ ref,
37
+ render,
38
+ style,
39
+ ...props
40
+ } = t0);
41
+ $[0] = t0;
42
+ $[1] = children;
43
+ $[2] = className;
44
+ $[3] = props;
45
+ $[4] = ref;
46
+ $[5] = render;
47
+ $[6] = sidePanel;
48
+ $[7] = sidePanelOpen;
49
+ $[8] = sidebar;
50
+ $[9] = sidebarOpen;
51
+ $[10] = style;
52
+ $[11] = t1;
53
+ $[12] = t2;
54
+ $[13] = t3;
55
+ $[14] = toolbar;
56
+ } else {
57
+ children = $[1];
58
+ className = $[2];
59
+ props = $[3];
60
+ ref = $[4];
61
+ render = $[5];
62
+ sidePanel = $[6];
63
+ sidePanelOpen = $[7];
64
+ sidebar = $[8];
65
+ sidebarOpen = $[9];
66
+ style = $[10];
67
+ t1 = $[11];
68
+ t2 = $[12];
69
+ t3 = $[13];
70
+ toolbar = $[14];
71
+ }
72
+ const layout = t1 === undefined ? "standard" : t1;
73
+ const sidebarWidth = t2 === undefined ? 248 : t2;
74
+ const sidePanelWidth = t3 === undefined ? 320 : t3;
75
+ let t4;
76
+ if ($[15] !== sidebar) {
77
+ t4 = isPresent(sidebar);
78
+ $[15] = sidebar;
79
+ $[16] = t4;
80
+ } else {
81
+ t4 = $[16];
82
+ }
83
+ const hasSidebar = t4;
84
+ let t5;
85
+ if ($[17] !== sidePanel) {
86
+ t5 = isPresent(sidePanel);
87
+ $[17] = sidePanel;
88
+ $[18] = t5;
89
+ } else {
90
+ t5 = $[18];
91
+ }
92
+ const hasPanel = t5;
93
+ const leftOpen = hasSidebar && (sidebarOpen ?? true);
94
+ const rightOpen = hasPanel && (sidePanelOpen ?? true);
95
+ let t6;
96
+ if ($[19] !== toolbar) {
97
+ t6 = isPresent(toolbar);
98
+ $[19] = toolbar;
99
+ $[20] = t6;
100
+ } else {
101
+ t6 = $[20];
102
+ }
103
+ const hasToolbar = t6;
104
+ let t7;
105
+ if ($[21] !== className) {
106
+ t7 = clsx("ade-workspace", className);
107
+ $[21] = className;
108
+ $[22] = t7;
109
+ } else {
110
+ t7 = $[22];
111
+ }
112
+ const t8 = hasToolbar || undefined;
113
+ const t9 = leftOpen || undefined;
114
+ const t10 = rightOpen || undefined;
115
+ let t11;
116
+ if ($[23] !== hasSidebar || $[24] !== sidebar || $[25] !== sidebarWidth) {
117
+ t11 = hasSidebar && /*#__PURE__*/_jsx("aside", {
118
+ className: "ade-workspace-sidebar",
119
+ "data-auto": sidebarWidth === "auto" || undefined,
120
+ style: {
121
+ width: sidebarWidth
122
+ },
123
+ children: sidebar
27
124
  });
28
- const context = useMemo(() => ({ layout, edges: { top: !hasToolbar, right: !rightOpen, bottom: true, left: !leftOpen } }), [layout, hasToolbar, rightOpen, leftOpen]);
29
- return _jsx(WorkspaceContext, { value: context, children: element });
30
- }
125
+ $[23] = hasSidebar;
126
+ $[24] = sidebar;
127
+ $[25] = sidebarWidth;
128
+ $[26] = t11;
129
+ } else {
130
+ t11 = $[26];
131
+ }
132
+ let t12;
133
+ if ($[27] !== hasToolbar || $[28] !== toolbar) {
134
+ t12 = hasToolbar && /*#__PURE__*/_jsx("div", {
135
+ className: "ade-workspace-toolbar",
136
+ children: toolbar
137
+ });
138
+ $[27] = hasToolbar;
139
+ $[28] = toolbar;
140
+ $[29] = t12;
141
+ } else {
142
+ t12 = $[29];
143
+ }
144
+ let t13;
145
+ if ($[30] !== children) {
146
+ t13 = /*#__PURE__*/_jsx("div", {
147
+ className: "ade-workspace-content",
148
+ children: children
149
+ });
150
+ $[30] = children;
151
+ $[31] = t13;
152
+ } else {
153
+ t13 = $[31];
154
+ }
155
+ let t14;
156
+ if ($[32] !== t12 || $[33] !== t13) {
157
+ t14 = /*#__PURE__*/_jsxs("div", {
158
+ className: "ade-workspace-center",
159
+ children: [t12, t13]
160
+ });
161
+ $[32] = t12;
162
+ $[33] = t13;
163
+ $[34] = t14;
164
+ } else {
165
+ t14 = $[34];
166
+ }
167
+ let t15;
168
+ if ($[35] !== hasPanel || $[36] !== sidePanel || $[37] !== sidePanelWidth) {
169
+ t15 = hasPanel && /*#__PURE__*/_jsx("aside", {
170
+ className: "ade-workspace-side-panel",
171
+ "data-auto": sidePanelWidth === "auto" || undefined,
172
+ style: {
173
+ width: sidePanelWidth
174
+ },
175
+ children: sidePanel
176
+ });
177
+ $[35] = hasPanel;
178
+ $[36] = sidePanel;
179
+ $[37] = sidePanelWidth;
180
+ $[38] = t15;
181
+ } else {
182
+ t15 = $[38];
183
+ }
184
+ let t16;
185
+ if ($[39] !== t11 || $[40] !== t14 || $[41] !== t15) {
186
+ t16 = /*#__PURE__*/_jsxs(_Fragment, {
187
+ children: [t11, t14, t15]
188
+ });
189
+ $[39] = t11;
190
+ $[40] = t14;
191
+ $[41] = t15;
192
+ $[42] = t16;
193
+ } else {
194
+ t16 = $[42];
195
+ }
196
+ let t17;
197
+ if ($[43] !== layout || $[44] !== props || $[45] !== style || $[46] !== t10 || $[47] !== t16 || $[48] !== t7 || $[49] !== t8 || $[50] !== t9) {
198
+ t17 = {
199
+ ...props,
200
+ className: t7,
201
+ style,
202
+ "data-layout": layout,
203
+ "data-toolbar": t8,
204
+ "data-sidebar": t9,
205
+ "data-side-panel": t10,
206
+ children: t16
207
+ };
208
+ $[43] = layout;
209
+ $[44] = props;
210
+ $[45] = style;
211
+ $[46] = t10;
212
+ $[47] = t16;
213
+ $[48] = t7;
214
+ $[49] = t8;
215
+ $[50] = t9;
216
+ $[51] = t17;
217
+ } else {
218
+ t17 = $[51];
219
+ }
220
+ let t18;
221
+ if ($[52] !== ref || $[53] !== render || $[54] !== t17) {
222
+ t18 = {
223
+ render,
224
+ ref,
225
+ defaultTagName: "div",
226
+ props: t17
227
+ };
228
+ $[52] = ref;
229
+ $[53] = render;
230
+ $[54] = t17;
231
+ $[55] = t18;
232
+ } else {
233
+ t18 = $[55];
234
+ }
235
+ const element = useRender(t18);
236
+ const t19 = !hasToolbar;
237
+ const t20 = !rightOpen;
238
+ const t21 = !leftOpen;
239
+ let t22;
240
+ if ($[56] !== t19 || $[57] !== t20 || $[58] !== t21) {
241
+ t22 = {
242
+ top: t19,
243
+ right: t20,
244
+ bottom: true,
245
+ left: t21
246
+ };
247
+ $[56] = t19;
248
+ $[57] = t20;
249
+ $[58] = t21;
250
+ $[59] = t22;
251
+ } else {
252
+ t22 = $[59];
253
+ }
254
+ let t23;
255
+ if ($[60] !== layout || $[61] !== t22) {
256
+ t23 = {
257
+ layout,
258
+ edges: t22
259
+ };
260
+ $[60] = layout;
261
+ $[61] = t22;
262
+ $[62] = t23;
263
+ } else {
264
+ t23 = $[62];
265
+ }
266
+ const context = t23;
267
+ let t24;
268
+ if ($[63] !== context || $[64] !== element) {
269
+ t24 = /*#__PURE__*/_jsx(WorkspaceContext, {
270
+ value: context,
271
+ children: element
272
+ });
273
+ $[63] = context;
274
+ $[64] = element;
275
+ $[65] = t24;
276
+ } else {
277
+ t24 = $[65];
278
+ }
279
+ return t24;
280
+ }
@@ -1,5 +1,10 @@
1
1
  import { createContext } from 'react';
2
2
  export const WorkspaceContext = createContext({
3
- layout: 'standard',
4
- edges: { top: true, right: true, bottom: true, left: true }
5
- });
3
+ layout: 'standard',
4
+ edges: {
5
+ top: true,
6
+ right: true,
7
+ bottom: true,
8
+ left: true
9
+ }
10
+ });
@@ -1,155 +1,178 @@
1
1
  import { findSplitNode } from './model.js';
2
2
  function distribute(total, weights, minimums) {
3
- const floor = minimums.reduce((sum, size) => sum + size, 0);
4
- if (floor >= total) {
5
- return minimums.map((size) => (floor ? (size * total) / floor : total / minimums.length));
3
+ const floor = minimums.reduce((sum, size) => sum + size, 0);
4
+ if (floor >= total) {
5
+ return minimums.map(size => floor ? size * total / floor : total / minimums.length);
6
+ }
7
+ const result = weights.map(() => 0);
8
+ const pending = new Set(weights.map((_, i) => i));
9
+ let remaining = total;
10
+ while (pending.size) {
11
+ const sum = [...pending].reduce((value, i) => value + weights[i], 0);
12
+ const small = [...pending].filter(i => remaining * weights[i] / sum < minimums[i]);
13
+ if (!small.length) {
14
+ pending.forEach(i => {
15
+ result[i] = remaining * weights[i] / sum;
16
+ });
17
+ break;
6
18
  }
7
- const result = weights.map(() => 0);
8
- const pending = new Set(weights.map((_, i) => i));
9
- let remaining = total;
10
- while (pending.size) {
11
- const sum = [...pending].reduce((value, i) => value + weights[i], 0);
12
- const small = [...pending].filter((i) => (remaining * weights[i]) / sum < minimums[i]);
13
- if (!small.length) {
14
- pending.forEach((i) => {
15
- result[i] = (remaining * weights[i]) / sum;
16
- });
17
- break;
18
- }
19
- small.forEach((i) => {
20
- result[i] = minimums[i];
21
- remaining -= minimums[i];
22
- pending.delete(i);
23
- });
24
- }
25
- return result;
19
+ small.forEach(i => {
20
+ result[i] = minimums[i];
21
+ remaining -= minimums[i];
22
+ pending.delete(i);
23
+ });
24
+ }
25
+ return result;
26
26
  }
27
27
  export function splitGeometry(layout, width, height, gap, minimum) {
28
- const result = { panes: [], dividers: [] };
29
- const minimums = new Map();
30
- const measure = (node) => {
31
- if (node.type === 'pane') {
32
- const value = minimum(node);
33
- const safe = {
34
- width: Math.max(0, Number.isFinite(value.width) ? value.width : 0),
35
- height: Math.max(0, Number.isFinite(value.height) ? value.height : 0)
36
- };
37
- minimums.set(node.id, safe);
38
- return safe;
39
- }
40
- const children = node.children.map(measure);
41
- const horizontal = node.axis === 'horizontal';
42
- const value = {
43
- width: horizontal
44
- ? children.reduce((sum, item) => sum + item.width, 0) + gap * (children.length - 1)
45
- : Math.max(...children.map((item) => item.width)),
46
- height: horizontal
47
- ? Math.max(...children.map((item) => item.height))
48
- : children.reduce((sum, item) => sum + item.height, 0) + gap * (children.length - 1)
49
- };
50
- minimums.set(node.id, value);
51
- return value;
28
+ const result = {
29
+ panes: [],
30
+ dividers: []
31
+ };
32
+ const minimums = new Map();
33
+ const measure = node => {
34
+ if (node.type === 'pane') {
35
+ const value = minimum(node);
36
+ const safe = {
37
+ width: Math.max(0, Number.isFinite(value.width) ? value.width : 0),
38
+ height: Math.max(0, Number.isFinite(value.height) ? value.height : 0)
39
+ };
40
+ minimums.set(node.id, safe);
41
+ return safe;
42
+ }
43
+ const children = node.children.map(measure);
44
+ const horizontal = node.axis === 'horizontal';
45
+ const value = {
46
+ width: horizontal ? children.reduce((sum, item) => sum + item.width, 0) + gap * (children.length - 1) : Math.max(...children.map(item => item.width)),
47
+ height: horizontal ? Math.max(...children.map(item => item.height)) : children.reduce((sum, item) => sum + item.height, 0) + gap * (children.length - 1)
52
48
  };
53
- const walk = (node, rect) => {
54
- if (node.type === 'pane') {
55
- result.panes.push({ ...rect, pane: node });
56
- return;
57
- }
58
- const horizontal = node.axis === 'horizontal';
59
- const axisLength = horizontal ? rect.width : rect.height;
60
- const spacing = Math.min(gap, axisLength / (node.children.length - 1));
61
- const available = Math.max(0, axisLength - spacing * (node.children.length - 1));
62
- const limits = node.children.map((child) => minimums.get(child.id)[horizontal ? 'width' : 'height']);
63
- const lengths = distribute(available, node.sizes, limits);
64
- let offset = 0;
65
- node.children.forEach((child, i) => {
66
- const end = Math.round(offset + lengths[i]);
67
- const start = Math.round(offset);
68
- walk(child, horizontal ? { ...rect, x: rect.x + start, width: end - start } : { ...rect, y: rect.y + start, height: end - start });
69
- if (i < node.children.length - 1) {
70
- result.dividers.push({
71
- ...rect,
72
- ...(horizontal ? { x: rect.x + end, width: spacing } : { y: rect.y + end, height: spacing }),
73
- splitId: node.id,
74
- index: i,
75
- axis: node.axis,
76
- lengths,
77
- minimums: limits
78
- });
79
- }
80
- offset += lengths[i] + spacing;
49
+ minimums.set(node.id, value);
50
+ return value;
51
+ };
52
+ const walk = (node, rect) => {
53
+ if (node.type === 'pane') {
54
+ result.panes.push({
55
+ ...rect,
56
+ pane: node
57
+ });
58
+ return;
59
+ }
60
+ const horizontal = node.axis === 'horizontal';
61
+ const axisLength = horizontal ? rect.width : rect.height;
62
+ const spacing = Math.min(gap, axisLength / (node.children.length - 1));
63
+ const available = Math.max(0, axisLength - spacing * (node.children.length - 1));
64
+ const limits = node.children.map(child => minimums.get(child.id)[horizontal ? 'width' : 'height']);
65
+ const lengths = distribute(available, node.sizes, limits);
66
+ let offset = 0;
67
+ node.children.forEach((child, i) => {
68
+ const end = Math.round(offset + lengths[i]);
69
+ const start = Math.round(offset);
70
+ walk(child, horizontal ? {
71
+ ...rect,
72
+ x: rect.x + start,
73
+ width: end - start
74
+ } : {
75
+ ...rect,
76
+ y: rect.y + start,
77
+ height: end - start
78
+ });
79
+ if (i < node.children.length - 1) {
80
+ result.dividers.push({
81
+ ...rect,
82
+ ...(horizontal ? {
83
+ x: rect.x + end,
84
+ width: spacing
85
+ } : {
86
+ y: rect.y + end,
87
+ height: spacing
88
+ }),
89
+ splitId: node.id,
90
+ index: i,
91
+ axis: node.axis,
92
+ lengths,
93
+ minimums: limits
81
94
  });
82
- };
83
- const root = layout.maximized ? (findSplitNode(layout.root, layout.maximized) ?? layout.root) : layout.root;
84
- measure(root);
85
- walk(root, { x: 0, y: 0, width: Math.max(0, width), height: Math.max(0, height) });
86
- return result;
95
+ }
96
+ offset += lengths[i] + spacing;
97
+ });
98
+ };
99
+ const root = layout.maximized ? findSplitNode(layout.root, layout.maximized) ?? layout.root : layout.root;
100
+ measure(root);
101
+ walk(root, {
102
+ x: 0,
103
+ y: 0,
104
+ width: Math.max(0, width),
105
+ height: Math.max(0, height)
106
+ });
107
+ return result;
87
108
  }
88
109
  export function resizeSplit(divider, delta, symmetric = false, snapDistance = 0, minimumShare = 0) {
89
- const lengths = [...divider.lengths];
90
- const { index } = divider;
91
- const total = lengths.reduce((sum, size) => sum + size, 0);
92
- if (total <= 0 || lengths.some((size) => size <= 0)) {
93
- return lengths.map(() => 1 / lengths.length);
94
- }
95
- const mirror = lengths.length - divider.index - 2;
96
- const affected = new Set([index, index + 1, ...(symmetric ? [mirror, mirror + 1] : [])]);
97
- const span = [...affected].reduce((sum, i) => sum + lengths[i], 0);
98
- const share = Number.isFinite(minimumShare) ? Math.max(0, Math.min(1 / affected.size, minimumShare)) : 0;
99
- const min = divider.minimums.map((size, i) => Math.min(lengths[i], Math.max(size, affected.has(i) ? span * share : 0)));
100
- if (symmetric && mirror !== index) {
101
- const changes = lengths.map(() => 0);
102
- changes[index]++;
103
- changes[index + 1]--;
104
- changes[mirror]--;
105
- changes[mirror + 1]++;
106
- let lower = -Infinity;
107
- let upper = Infinity;
108
- changes.forEach((coefficient, i) => {
109
- if (coefficient > 0) {
110
- lower = Math.max(lower, (min[i] - lengths[i]) / coefficient);
111
- }
112
- if (coefficient < 0) {
113
- upper = Math.min(upper, (lengths[i] - min[i]) / -coefficient);
114
- }
115
- });
116
- const change = Math.max(lower, Math.min(delta, upper));
117
- return lengths.map((size, i) => Math.max(Number.EPSILON, (size + changes[i] * change) / total));
118
- }
119
- const change = Math.max(min[index] - lengths[index], Math.min(delta, lengths[index + 1] - min[index + 1]));
120
- const pair = lengths[index] + lengths[index + 1];
121
- const middle = pair / 2;
122
- const next = lengths[index] + change;
123
- // A snap must not cross either pane's minimum, including minimums inherited from nested splits.
124
- lengths[index] = Math.abs(next - middle) <= snapDistance && middle >= min[index] && middle >= min[index + 1] ? middle : next;
125
- lengths[index + 1] = pair - lengths[index];
126
- return lengths.map((size) => Math.max(Number.EPSILON, size / total));
110
+ const lengths = [...divider.lengths];
111
+ const {
112
+ index
113
+ } = divider;
114
+ const total = lengths.reduce((sum, size) => sum + size, 0);
115
+ if (total <= 0 || lengths.some(size => size <= 0)) {
116
+ return lengths.map(() => 1 / lengths.length);
117
+ }
118
+ const mirror = lengths.length - divider.index - 2;
119
+ const affected = new Set([index, index + 1, ...(symmetric ? [mirror, mirror + 1] : [])]);
120
+ const span = [...affected].reduce((sum, i) => sum + lengths[i], 0);
121
+ const share = Number.isFinite(minimumShare) ? Math.max(0, Math.min(1 / affected.size, minimumShare)) : 0;
122
+ const min = divider.minimums.map((size, i) => Math.min(lengths[i], Math.max(size, affected.has(i) ? span * share : 0)));
123
+ if (symmetric && mirror !== index) {
124
+ const changes = lengths.map(() => 0);
125
+ changes[index]++;
126
+ changes[index + 1]--;
127
+ changes[mirror]--;
128
+ changes[mirror + 1]++;
129
+ let lower = -Infinity;
130
+ let upper = Infinity;
131
+ changes.forEach((coefficient, i) => {
132
+ if (coefficient > 0) {
133
+ lower = Math.max(lower, (min[i] - lengths[i]) / coefficient);
134
+ }
135
+ if (coefficient < 0) {
136
+ upper = Math.min(upper, (lengths[i] - min[i]) / -coefficient);
137
+ }
138
+ });
139
+ const change = Math.max(lower, Math.min(delta, upper));
140
+ return lengths.map((size, i) => Math.max(Number.EPSILON, (size + changes[i] * change) / total));
141
+ }
142
+ const change = Math.max(min[index] - lengths[index], Math.min(delta, lengths[index + 1] - min[index + 1]));
143
+ const pair = lengths[index] + lengths[index + 1];
144
+ const middle = pair / 2;
145
+ const next = lengths[index] + change;
146
+ // A snap must not cross either pane's minimum, including minimums inherited from nested splits.
147
+ lengths[index] = Math.abs(next - middle) <= snapDistance && middle >= min[index] && middle >= min[index + 1] ? middle : next;
148
+ lengths[index + 1] = pair - lengths[index];
149
+ return lengths.map(size => Math.max(Number.EPSILON, size / total));
127
150
  }
128
151
  export function paneRadius(rect, width, height, edges, radius) {
129
- const left = rect.x === 0 && edges.left;
130
- const top = rect.y === 0 && edges.top;
131
- const right = rect.x + rect.width >= width && edges.right;
132
- const bottom = rect.y + rect.height >= height && edges.bottom;
133
- return [top || left, top || right, bottom || right, bottom || left].map((flush) => `${flush ? 0 : radius}px`).join(' ');
152
+ const left = rect.x === 0 && edges.left;
153
+ const top = rect.y === 0 && edges.top;
154
+ const right = rect.x + rect.width >= width && edges.right;
155
+ const bottom = rect.y + rect.height >= height && edges.bottom;
156
+ return [top || left, top || right, bottom || right, bottom || left].map(flush => `${flush ? 0 : radius}px`).join(' ');
134
157
  }
135
158
  export function splitSideAt(rect, x, y) {
136
- const horizontal = (x - rect.x) / rect.width;
137
- const vertical = (y - rect.y) / rect.height;
138
- const nearest = Math.min(horizontal, 1 - horizontal, vertical, 1 - vertical);
139
- if (nearest > 0.25) {
140
- return undefined;
141
- }
142
- if (nearest === horizontal) {
143
- return 'left';
144
- }
145
- if (nearest === 1 - horizontal) {
146
- return 'right';
147
- }
148
- return nearest === vertical ? 'top' : 'bottom';
159
+ const horizontal = (x - rect.x) / rect.width;
160
+ const vertical = (y - rect.y) / rect.height;
161
+ const nearest = Math.min(horizontal, 1 - horizontal, vertical, 1 - vertical);
162
+ if (nearest > 0.25) {
163
+ return undefined;
164
+ }
165
+ if (nearest === horizontal) {
166
+ return 'left';
167
+ }
168
+ if (nearest === 1 - horizontal) {
169
+ return 'right';
170
+ }
171
+ return nearest === vertical ? 'top' : 'bottom';
149
172
  }
150
173
  export function tabGapAt(rects, x) {
151
- const index = rects.findIndex((rect) => x < (rect.left + rect.right) / 2);
152
- return index < 0 ? rects.length : index;
174
+ const index = rects.findIndex(rect => x < (rect.left + rect.right) / 2);
175
+ return index < 0 ? rects.length : index;
153
176
  }
154
177
  /**
155
178
  * The scrollLeft that brings a tab fully into view and clear of the edge fades, or the current one
@@ -157,16 +180,16 @@ export function tabGapAt(rects, x) {
157
180
  * only where the scroll position leaves one. A tab wider than the room between the fades shows its start.
158
181
  */
159
182
  export function tabRevealScrollLeft(view, start, width, fade) {
160
- const max = Math.max(0, view.scrollWidth - view.clientWidth);
161
- const end = start + width;
162
- const visibleStart = (left) => left + (left > 0 ? fade : 0);
163
- const visibleEnd = (left) => left + view.clientWidth - (left < max - 1 ? fade : 0);
164
- const clamp = (left) => Math.round(Math.min(max, Math.max(0, left)));
165
- if (start >= visibleStart(view.scrollLeft) && end <= visibleEnd(view.scrollLeft)) {
166
- return view.scrollLeft;
167
- }
168
- if (start < visibleStart(view.scrollLeft) || width > view.clientWidth - 2 * fade) {
169
- return clamp(start - fade);
170
- }
171
- return clamp(end + fade - view.clientWidth);
172
- }
183
+ const max = Math.max(0, view.scrollWidth - view.clientWidth);
184
+ const end = start + width;
185
+ const visibleStart = left => left + (left > 0 ? fade : 0);
186
+ const visibleEnd = left => left + view.clientWidth - (left < max - 1 ? fade : 0);
187
+ const clamp = left => Math.round(Math.min(max, Math.max(0, left)));
188
+ if (start >= visibleStart(view.scrollLeft) && end <= visibleEnd(view.scrollLeft)) {
189
+ return view.scrollLeft;
190
+ }
191
+ if (start < visibleStart(view.scrollLeft) || width > view.clientWidth - 2 * fade) {
192
+ return clamp(start - fade);
193
+ }
194
+ return clamp(end + fade - view.clientWidth);
195
+ }