@salt-ds/core 1.73.0 → 1.75.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 (127) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/css/salt-core.css +283 -50
  3. package/dist-cjs/dialog/Dialog.css.js +1 -1
  4. package/dist-cjs/drawer/Drawer.css.js +1 -1
  5. package/dist-cjs/drawer/Drawer.js +54 -6
  6. package/dist-cjs/drawer/Drawer.js.map +1 -1
  7. package/dist-cjs/drawer/DrawerContext.js +2 -0
  8. package/dist-cjs/drawer/DrawerContext.js.map +1 -1
  9. package/dist-cjs/drawer/DrawerFooter.css.js +1 -1
  10. package/dist-cjs/drawer/DrawerHeader.css.js +1 -1
  11. package/dist-cjs/drawer/DrawerHeader.js +6 -3
  12. package/dist-cjs/drawer/DrawerHeader.js.map +1 -1
  13. package/dist-cjs/drawer/internal/DrawerResizeGuide.css.js +6 -0
  14. package/dist-cjs/drawer/internal/DrawerResizeGuide.css.js.map +1 -0
  15. package/dist-cjs/drawer/internal/DrawerResizeGuide.js +44 -0
  16. package/dist-cjs/drawer/internal/DrawerResizeGuide.js.map +1 -0
  17. package/dist-cjs/drawer/internal/DrawerResizeHandle.css.js +6 -0
  18. package/dist-cjs/drawer/internal/DrawerResizeHandle.css.js.map +1 -0
  19. package/dist-cjs/drawer/internal/DrawerResizeHandle.js +43 -0
  20. package/dist-cjs/drawer/internal/DrawerResizeHandle.js.map +1 -0
  21. package/dist-cjs/drawer/internal/useDrawerResize.js +519 -0
  22. package/dist-cjs/drawer/internal/useDrawerResize.js.map +1 -0
  23. package/dist-cjs/interactable-card/InteractableCard.js +2 -1
  24. package/dist-cjs/interactable-card/InteractableCard.js.map +1 -1
  25. package/dist-cjs/link-button/LinkButton.css.js +1 -1
  26. package/dist-cjs/mega-menu/useMegaMenuNavigation.js +11 -20
  27. package/dist-cjs/mega-menu/useMegaMenuNavigation.js.map +1 -1
  28. package/dist-cjs/menu/MenuAlignmentContext.js +55 -0
  29. package/dist-cjs/menu/MenuAlignmentContext.js.map +1 -0
  30. package/dist-cjs/menu/MenuBase.js +9 -3
  31. package/dist-cjs/menu/MenuBase.js.map +1 -1
  32. package/dist-cjs/menu/MenuGroup.js +42 -3
  33. package/dist-cjs/menu/MenuGroup.js.map +1 -1
  34. package/dist-cjs/menu/MenuGroupContext.js +27 -0
  35. package/dist-cjs/menu/MenuGroupContext.js.map +1 -0
  36. package/dist-cjs/menu/MenuItem.css.js +1 -1
  37. package/dist-cjs/menu/MenuItem.js +176 -50
  38. package/dist-cjs/menu/MenuItem.js.map +1 -1
  39. package/dist-cjs/menu/MenuPanel.js +12 -3
  40. package/dist-cjs/menu/MenuPanel.js.map +1 -1
  41. package/dist-cjs/menu/MenuPanelContext.js +3 -1
  42. package/dist-cjs/menu/MenuPanelContext.js.map +1 -1
  43. package/dist-cjs/pill-input/PillInput.css.js +1 -1
  44. package/dist-cjs/semantic-icon-provider/SemanticIconProvider.js +2 -2
  45. package/dist-cjs/semantic-icon-provider/SemanticIconProvider.js.map +1 -1
  46. package/dist-cjs/stepper/Step.js +12 -1
  47. package/dist-cjs/stepper/Step.js.map +1 -1
  48. package/dist-cjs/stepper/internal/StepConnector.css.js +1 -1
  49. package/dist-cjs/stepper/internal/StepText.css.js +1 -1
  50. package/dist-cjs/stepper/internal/StepText.js +4 -1
  51. package/dist-cjs/stepper/internal/StepText.js.map +1 -1
  52. package/dist-cjs/stepper/internal/hasActiveStep.js +12 -0
  53. package/dist-cjs/stepper/internal/hasActiveStep.js.map +1 -0
  54. package/dist-cjs/toggle-button/ToggleButton.css.js +1 -1
  55. package/dist-cjs/tree/TreeNodeTrigger.css.js +1 -1
  56. package/dist-cjs/tree/TreeNodeTrigger.js +1 -2
  57. package/dist-cjs/tree/TreeNodeTrigger.js.map +1 -1
  58. package/dist-es/dialog/Dialog.css.js +1 -1
  59. package/dist-es/drawer/Drawer.css.js +1 -1
  60. package/dist-es/drawer/Drawer.js +54 -6
  61. package/dist-es/drawer/Drawer.js.map +1 -1
  62. package/dist-es/drawer/DrawerContext.js +2 -0
  63. package/dist-es/drawer/DrawerContext.js.map +1 -1
  64. package/dist-es/drawer/DrawerFooter.css.js +1 -1
  65. package/dist-es/drawer/DrawerHeader.css.js +1 -1
  66. package/dist-es/drawer/DrawerHeader.js +6 -3
  67. package/dist-es/drawer/DrawerHeader.js.map +1 -1
  68. package/dist-es/drawer/internal/DrawerResizeGuide.css.js +4 -0
  69. package/dist-es/drawer/internal/DrawerResizeGuide.css.js.map +1 -0
  70. package/dist-es/drawer/internal/DrawerResizeGuide.js +42 -0
  71. package/dist-es/drawer/internal/DrawerResizeGuide.js.map +1 -0
  72. package/dist-es/drawer/internal/DrawerResizeHandle.css.js +4 -0
  73. package/dist-es/drawer/internal/DrawerResizeHandle.css.js.map +1 -0
  74. package/dist-es/drawer/internal/DrawerResizeHandle.js +41 -0
  75. package/dist-es/drawer/internal/DrawerResizeHandle.js.map +1 -0
  76. package/dist-es/drawer/internal/useDrawerResize.js +517 -0
  77. package/dist-es/drawer/internal/useDrawerResize.js.map +1 -0
  78. package/dist-es/interactable-card/InteractableCard.js +2 -1
  79. package/dist-es/interactable-card/InteractableCard.js.map +1 -1
  80. package/dist-es/link-button/LinkButton.css.js +1 -1
  81. package/dist-es/mega-menu/useMegaMenuNavigation.js +11 -20
  82. package/dist-es/mega-menu/useMegaMenuNavigation.js.map +1 -1
  83. package/dist-es/menu/MenuAlignmentContext.js +50 -0
  84. package/dist-es/menu/MenuAlignmentContext.js.map +1 -0
  85. package/dist-es/menu/MenuBase.js +9 -3
  86. package/dist-es/menu/MenuBase.js.map +1 -1
  87. package/dist-es/menu/MenuGroup.js +44 -5
  88. package/dist-es/menu/MenuGroup.js.map +1 -1
  89. package/dist-es/menu/MenuGroupContext.js +23 -0
  90. package/dist-es/menu/MenuGroupContext.js.map +1 -0
  91. package/dist-es/menu/MenuItem.css.js +1 -1
  92. package/dist-es/menu/MenuItem.js +177 -51
  93. package/dist-es/menu/MenuItem.js.map +1 -1
  94. package/dist-es/menu/MenuPanel.js +12 -3
  95. package/dist-es/menu/MenuPanel.js.map +1 -1
  96. package/dist-es/menu/MenuPanelContext.js +3 -1
  97. package/dist-es/menu/MenuPanelContext.js.map +1 -1
  98. package/dist-es/pill-input/PillInput.css.js +1 -1
  99. package/dist-es/semantic-icon-provider/SemanticIconProvider.js +3 -3
  100. package/dist-es/semantic-icon-provider/SemanticIconProvider.js.map +1 -1
  101. package/dist-es/stepper/Step.js +12 -1
  102. package/dist-es/stepper/Step.js.map +1 -1
  103. package/dist-es/stepper/internal/StepConnector.css.js +1 -1
  104. package/dist-es/stepper/internal/StepText.css.js +1 -1
  105. package/dist-es/stepper/internal/StepText.js +4 -1
  106. package/dist-es/stepper/internal/StepText.js.map +1 -1
  107. package/dist-es/stepper/internal/hasActiveStep.js +10 -0
  108. package/dist-es/stepper/internal/hasActiveStep.js.map +1 -0
  109. package/dist-es/toggle-button/ToggleButton.css.js +1 -1
  110. package/dist-es/tree/TreeNodeTrigger.css.js +1 -1
  111. package/dist-es/tree/TreeNodeTrigger.js +1 -2
  112. package/dist-es/tree/TreeNodeTrigger.js.map +1 -1
  113. package/dist-types/drawer/Drawer.d.ts +6 -0
  114. package/dist-types/drawer/DrawerContext.d.ts +3 -0
  115. package/dist-types/drawer/DrawerHeader.d.ts +1 -1
  116. package/dist-types/drawer/internal/DrawerResizeGuide.d.ts +7 -0
  117. package/dist-types/drawer/internal/DrawerResizeHandle.d.ts +8 -0
  118. package/dist-types/drawer/internal/index.d.ts +3 -0
  119. package/dist-types/drawer/internal/useDrawerResize.d.ts +34 -0
  120. package/dist-types/menu/MenuAlignmentContext.d.ts +14 -0
  121. package/dist-types/menu/MenuGroup.d.ts +26 -4
  122. package/dist-types/menu/MenuGroupContext.d.ts +10 -0
  123. package/dist-types/menu/MenuItem.d.ts +4 -0
  124. package/dist-types/menu/MenuPanelContext.d.ts +2 -0
  125. package/dist-types/stepper/internal/StepText.d.ts +1 -1
  126. package/dist-types/stepper/internal/hasActiveStep.d.ts +2 -0
  127. package/package.json +2 -2
@@ -0,0 +1,519 @@
1
+ 'use strict';
2
+
3
+ var window = require('@salt-ds/window');
4
+ var React = require('react');
5
+ require('clsx');
6
+ require('react/jsx-runtime');
7
+ var useEventCallback = require('../../utils/useEventCallback.js');
8
+ require('../../utils/useFloatingUI/useFloatingUI.js');
9
+ require('../../utils/useId.js');
10
+ var useIsomorphicLayoutEffect = require('../../utils/useIsomorphicLayoutEffect.js');
11
+ require('../../salt-provider/SaltProvider.js');
12
+ require('../../viewport/ViewportProvider.js');
13
+
14
+ const KEYBOARD_STEP = 8;
15
+ const PROBE_SIZE = 1e6;
16
+ const CLICK_THRESHOLD = 4;
17
+ const isElement = (target) => target !== null && target.nodeType === 1;
18
+ const focusWithoutRing = (element) => element == null ? void 0 : element.focus({
19
+ preventScroll: true,
20
+ focusVisible: false
21
+ });
22
+ const setDocumentCursor = (ownerDocument, cursor) => {
23
+ const view = ownerDocument.defaultView;
24
+ if (!view || !ownerDocument.adoptedStyleSheets) return void 0;
25
+ const sheet = new view.CSSStyleSheet();
26
+ sheet.replaceSync(`*, *:hover { cursor: ${cursor} !important; }`);
27
+ ownerDocument.adoptedStyleSheets = [
28
+ ...ownerDocument.adoptedStyleSheets,
29
+ sheet
30
+ ];
31
+ return () => {
32
+ ownerDocument.adoptedStyleSheets = ownerDocument.adoptedStyleSheets.filter(
33
+ (adopted) => adopted !== sheet
34
+ );
35
+ };
36
+ };
37
+ const isHorizontal = (position) => position === "left" || position === "right";
38
+ const growsWithCoordinate = (position) => position === "left" || position === "top";
39
+ const measure = (element, horizontal) => {
40
+ const { width, height } = element.getBoundingClientRect();
41
+ return horizontal ? width : height;
42
+ };
43
+ const restoreStyle = (style, property, value, priority) => {
44
+ if (value) {
45
+ style.setProperty(property, value, priority);
46
+ } else {
47
+ style.removeProperty(property);
48
+ }
49
+ };
50
+ const probeBounds = (element, horizontal) => {
51
+ const property = horizontal ? "width" : "height";
52
+ const { style } = element;
53
+ const previousValue = style.getPropertyValue(property);
54
+ const previousPriority = style.getPropertyPriority(property);
55
+ const previousTransition = style.getPropertyValue("transition-property");
56
+ const previousTransitionPriority = style.getPropertyPriority(
57
+ "transition-property"
58
+ );
59
+ style.setProperty("transition-property", "none", "important");
60
+ style.setProperty(property, "0px", "important");
61
+ const min = measure(element, horizontal);
62
+ style.setProperty(property, `${PROBE_SIZE}px`, "important");
63
+ const max = measure(element, horizontal);
64
+ restoreStyle(style, property, previousValue, previousPriority);
65
+ measure(element, horizontal);
66
+ restoreStyle(
67
+ style,
68
+ "transition-property",
69
+ previousTransition,
70
+ previousTransitionPriority
71
+ );
72
+ return { min, max: Math.max(min, max) };
73
+ };
74
+ const clamp = (value, { min, max }) => Math.min(Math.max(value, min), max);
75
+ const sizeFromPoint = (rect, position, { clientX: x, clientY: y }) => {
76
+ switch (position) {
77
+ case "left":
78
+ return x - rect.left;
79
+ case "right":
80
+ return rect.right - x;
81
+ case "top":
82
+ return y - rect.top;
83
+ case "bottom":
84
+ return rect.bottom - y;
85
+ }
86
+ };
87
+ const edgeFromSize = (rect, position, size) => {
88
+ switch (position) {
89
+ case "left":
90
+ return rect.left + size;
91
+ case "right":
92
+ return rect.right - size;
93
+ case "top":
94
+ return rect.top + size;
95
+ case "bottom":
96
+ return rect.bottom - size;
97
+ }
98
+ };
99
+ function useDrawerResize({
100
+ enabled,
101
+ position,
102
+ element
103
+ }) {
104
+ const horizontal = isHorizontal(position);
105
+ const targetWindow = window.useWindow();
106
+ const [sizeState, setSizeState] = React.useState(void 0);
107
+ const [sizeAxisHorizontal, setSizeAxisHorizontal] = React.useState(horizontal);
108
+ const size = enabled && sizeAxisHorizontal === horizontal ? sizeState : void 0;
109
+ const [interaction, setInteraction] = React.useState("inactive");
110
+ const [metrics, setMetrics] = React.useState(
111
+ null
112
+ );
113
+ const dragRef = React.useRef(null);
114
+ const placingRef = React.useRef(null);
115
+ const handleRef = React.useRef(null);
116
+ const guideRef = React.useRef(null);
117
+ const cancelResizeEventRef = React.useRef(null);
118
+ const restoreSizeRef = React.useRef(null);
119
+ const initialSizeRef = React.useRef(null);
120
+ const axisRef = React.useRef(horizontal);
121
+ const boundsRef = React.useRef(null);
122
+ const readMetrics = useEventCallback.useEventCallback((reuseBounds = false) => {
123
+ if (!element) return null;
124
+ const bounds = reuseBounds && boundsRef.current ? boundsRef.current : probeBounds(element, horizontal);
125
+ boundsRef.current = bounds;
126
+ const current = clamp(measure(element, horizontal), bounds);
127
+ const next = { ...bounds, current };
128
+ setMetrics(next);
129
+ return next;
130
+ });
131
+ const applySize = (nextSize) => {
132
+ setSizeState(nextSize);
133
+ setSizeAxisHorizontal(horizontal);
134
+ };
135
+ const isOverHandle = ({
136
+ clientX: x,
137
+ clientY: y
138
+ }) => {
139
+ var _a;
140
+ const rect = (_a = handleRef.current) == null ? void 0 : _a.getBoundingClientRect();
141
+ return rect !== void 0 && x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;
142
+ };
143
+ const isHandle = useEventCallback.useEventCallback(
144
+ (target) => {
145
+ var _a;
146
+ return enabled && isElement(target) && ((_a = handleRef.current) == null ? void 0 : _a.contains(target)) === true;
147
+ }
148
+ );
149
+ const startDrag = useEventCallback.useEventCallback((event) => {
150
+ const current = readMetrics();
151
+ if (!current) return;
152
+ event.preventDefault();
153
+ dragRef.current = {
154
+ pointerId: event.pointerId,
155
+ startX: event.clientX,
156
+ startY: event.clientY,
157
+ originSize: current.current,
158
+ previousSize: current.current,
159
+ cancelSize: size,
160
+ min: current.min,
161
+ max: current.max,
162
+ moved: false
163
+ };
164
+ focusWithoutRing(handleRef.current);
165
+ setInteraction("active");
166
+ });
167
+ const moveDrag = useEventCallback.useEventCallback((event, drag) => {
168
+ var _a;
169
+ if (!drag.moved) {
170
+ if (Math.hypot(event.clientX - drag.startX, event.clientY - drag.startY) < CLICK_THRESHOLD) {
171
+ return;
172
+ }
173
+ drag.moved = true;
174
+ try {
175
+ (_a = handleRef.current) == null ? void 0 : _a.setPointerCapture(event.pointerId);
176
+ } catch {
177
+ }
178
+ }
179
+ const coordinate = horizontal ? event.clientX : event.clientY;
180
+ const origin = horizontal ? drag.startX : drag.startY;
181
+ const direction = growsWithCoordinate(position) ? 1 : -1;
182
+ const nextSize = clamp(
183
+ drag.originSize + (coordinate - origin) * direction,
184
+ drag
185
+ );
186
+ if (nextSize !== drag.previousSize) {
187
+ drag.previousSize = nextSize;
188
+ applySize(nextSize);
189
+ }
190
+ });
191
+ const moveGuide = (offset) => {
192
+ var _a;
193
+ const placing = placingRef.current;
194
+ if (!placing) return;
195
+ placing.guideOffset = offset;
196
+ (_a = guideRef.current) == null ? void 0 : _a.style.setProperty(
197
+ "--drawerResizeGuide-offset",
198
+ `${offset}px`
199
+ );
200
+ };
201
+ const setGuide = React.useCallback((node) => {
202
+ guideRef.current = node;
203
+ const placing = placingRef.current;
204
+ if (node && placing) {
205
+ node.style.setProperty(
206
+ "--drawerResizeGuide-offset",
207
+ `${placing.guideOffset}px`
208
+ );
209
+ }
210
+ }, []);
211
+ const startPlacing = useEventCallback.useEventCallback((drag) => {
212
+ if (!element) return;
213
+ placingRef.current = {
214
+ min: drag.min,
215
+ max: drag.max,
216
+ guideOffset: edgeFromSize(
217
+ element.getBoundingClientRect(),
218
+ position,
219
+ drag.originSize
220
+ ),
221
+ pressed: false
222
+ };
223
+ setInteraction("placing");
224
+ });
225
+ const stopPlacing = useEventCallback.useEventCallback(() => {
226
+ if (!placingRef.current) return;
227
+ placingRef.current = null;
228
+ setInteraction("inactive");
229
+ });
230
+ const endDrag = useEventCallback.useEventCallback((event) => {
231
+ var _a;
232
+ const drag = dragRef.current;
233
+ if (!drag) return;
234
+ dragRef.current = null;
235
+ const pointer = event;
236
+ const stillHovered = "pointerType" in event && pointer.pointerType !== "touch" && isHandle(
237
+ ((_a = handleRef.current) == null ? void 0 : _a.ownerDocument.elementFromPoint(
238
+ pointer.clientX,
239
+ pointer.clientY
240
+ )) ?? null
241
+ );
242
+ setInteraction(stillHovered ? "hover" : "inactive");
243
+ });
244
+ const cancelDrag = useEventCallback.useEventCallback((event) => {
245
+ const drag = dragRef.current;
246
+ if (!drag) return;
247
+ const handle = handleRef.current;
248
+ if (handle == null ? void 0 : handle.hasPointerCapture(drag.pointerId)) {
249
+ handle.releasePointerCapture(drag.pointerId);
250
+ }
251
+ setSizeState(drag.cancelSize);
252
+ endDrag(event);
253
+ });
254
+ const sizeToPlace = (target, rect, point, bounds) => clamp(
255
+ isOverHandle(point) ? measure(target, horizontal) : sizeFromPoint(rect, position, point),
256
+ bounds
257
+ );
258
+ const moveGuideToPointer = (event) => {
259
+ const placing = placingRef.current;
260
+ if (!placing || !element) return;
261
+ const rect = element.getBoundingClientRect();
262
+ moveGuide(
263
+ edgeFromSize(rect, position, sizeToPlace(element, rect, event, placing))
264
+ );
265
+ };
266
+ const onGuidePointerDown = useEventCallback.useEventCallback(
267
+ (event) => {
268
+ const placing = placingRef.current;
269
+ if (!placing) return;
270
+ if (event.pointerType === "mouse" && event.button > 0) {
271
+ stopPlacing();
272
+ return;
273
+ }
274
+ event.preventDefault();
275
+ event.stopPropagation();
276
+ placing.pressed = true;
277
+ moveGuideToPointer(event);
278
+ }
279
+ );
280
+ const onGuidePointerMove = useEventCallback.useEventCallback(
281
+ (event) => {
282
+ moveGuideToPointer(event);
283
+ }
284
+ );
285
+ const onGuideClick = useEventCallback.useEventCallback(
286
+ (event) => {
287
+ const placing = placingRef.current;
288
+ if (!(placing == null ? void 0 : placing.pressed) || !element) return;
289
+ event.stopPropagation();
290
+ stopPlacing();
291
+ const rect = element.getBoundingClientRect();
292
+ const nextSize = sizeToPlace(element, rect, event, placing);
293
+ const current = clamp(measure(element, horizontal), placing);
294
+ if (nextSize !== current) {
295
+ applySize(nextSize);
296
+ }
297
+ focusWithoutRing(handleRef.current);
298
+ }
299
+ );
300
+ React.useEffect(() => {
301
+ if (!enabled || !element || !targetWindow) return;
302
+ const ownerDocument = targetWindow.document;
303
+ const onPointerDown = (event) => {
304
+ if (event.defaultPrevented || !event.isPrimary) return;
305
+ if (event.pointerType === "mouse" && event.button > 0) return;
306
+ if (placingRef.current || dragRef.current || !isHandle(event.target)) {
307
+ return;
308
+ }
309
+ startDrag(event);
310
+ };
311
+ const onPointerMove = (event) => {
312
+ if (event.defaultPrevented) return;
313
+ if (placingRef.current) return;
314
+ const drag = dragRef.current;
315
+ if (!drag) {
316
+ if (event.pointerType !== "touch") {
317
+ setInteraction(isHandle(event.target) ? "hover" : "inactive");
318
+ }
319
+ return;
320
+ }
321
+ if (event.pointerId !== drag.pointerId) return;
322
+ if (event.buttons === 0) {
323
+ endDrag(event);
324
+ return;
325
+ }
326
+ moveDrag(event, drag);
327
+ };
328
+ const onPointerUp = (event) => {
329
+ if (event.defaultPrevented) return;
330
+ if (event.pointerType === "mouse" && event.button > 0) return;
331
+ const drag = dragRef.current;
332
+ if ((drag == null ? void 0 : drag.pointerId) !== event.pointerId) return;
333
+ event.preventDefault();
334
+ if (!drag.moved) {
335
+ dragRef.current = null;
336
+ startPlacing(drag);
337
+ return;
338
+ }
339
+ endDrag(event);
340
+ };
341
+ const onPointerCancel = (event) => {
342
+ var _a;
343
+ if (((_a = dragRef.current) == null ? void 0 : _a.pointerId) === event.pointerId) endDrag(event);
344
+ };
345
+ const onContextMenu = (event) => {
346
+ if (!event.defaultPrevented) endDrag(event);
347
+ };
348
+ const onKeyDown2 = (event) => {
349
+ if (event.key !== "Escape" || !dragRef.current) return;
350
+ event.preventDefault();
351
+ cancelResizeEventRef.current = event;
352
+ cancelDrag(event);
353
+ };
354
+ const onBlur = (event) => {
355
+ endDrag(event);
356
+ stopPlacing();
357
+ };
358
+ const onPointerOut = (event) => {
359
+ if (!dragRef.current && isElement(event.relatedTarget) && event.relatedTarget.tagName === "IFRAME") {
360
+ setInteraction("inactive");
361
+ }
362
+ };
363
+ ownerDocument.addEventListener("pointerdown", onPointerDown, true);
364
+ ownerDocument.addEventListener("pointermove", onPointerMove);
365
+ ownerDocument.addEventListener("pointerup", onPointerUp, true);
366
+ ownerDocument.addEventListener("pointercancel", onPointerCancel);
367
+ ownerDocument.addEventListener("contextmenu", onContextMenu, true);
368
+ ownerDocument.addEventListener("keydown", onKeyDown2, true);
369
+ ownerDocument.addEventListener("pointerout", onPointerOut);
370
+ targetWindow.addEventListener("blur", onBlur);
371
+ return () => {
372
+ ownerDocument.removeEventListener("pointerdown", onPointerDown, true);
373
+ ownerDocument.removeEventListener("pointermove", onPointerMove);
374
+ ownerDocument.removeEventListener("pointerup", onPointerUp, true);
375
+ ownerDocument.removeEventListener("pointercancel", onPointerCancel);
376
+ ownerDocument.removeEventListener("contextmenu", onContextMenu, true);
377
+ ownerDocument.removeEventListener("keydown", onKeyDown2, true);
378
+ ownerDocument.removeEventListener("pointerout", onPointerOut);
379
+ targetWindow.removeEventListener("blur", onBlur);
380
+ dragRef.current = null;
381
+ placingRef.current = null;
382
+ setInteraction("inactive");
383
+ };
384
+ }, [
385
+ enabled,
386
+ element,
387
+ targetWindow,
388
+ isHandle,
389
+ startDrag,
390
+ moveDrag,
391
+ endDrag,
392
+ cancelDrag,
393
+ startPlacing,
394
+ stopPlacing
395
+ ]);
396
+ const showResizeCursor = interaction !== "inactive";
397
+ React.useEffect(() => {
398
+ if (!showResizeCursor || !targetWindow) return;
399
+ return setDocumentCursor(
400
+ targetWindow.document,
401
+ horizontal ? "var(--salt-cursor-drag-ew, ew-resize)" : "var(--salt-cursor-drag-ns, ns-resize)"
402
+ );
403
+ }, [showResizeCursor, targetWindow, horizontal]);
404
+ const onKeyDown = useEventCallback.useEventCallback(
405
+ (event) => {
406
+ const { key } = event;
407
+ if (placingRef.current) {
408
+ stopPlacing();
409
+ if (key === "Escape") {
410
+ event.preventDefault();
411
+ cancelResizeEventRef.current = event.nativeEvent;
412
+ return;
413
+ }
414
+ }
415
+ const resizeKeys = horizontal ? ["ArrowLeft", "ArrowRight"] : ["ArrowUp", "ArrowDown"];
416
+ if (!resizeKeys.includes(key) && key !== "Home" && key !== "End" && key !== "Enter") {
417
+ return;
418
+ }
419
+ const current = readMetrics(true);
420
+ if (!current) return;
421
+ event.preventDefault();
422
+ const collapsed = current.current <= current.min + 1;
423
+ let nextSize;
424
+ if (key === "Home") {
425
+ if (!collapsed) {
426
+ restoreSizeRef.current = current.current;
427
+ }
428
+ nextSize = current.min;
429
+ } else if (key === "End") {
430
+ nextSize = current.max;
431
+ } else if (key === "Enter") {
432
+ if (collapsed) {
433
+ nextSize = restoreSizeRef.current ?? initialSizeRef.current ?? current.max;
434
+ } else {
435
+ restoreSizeRef.current = current.current;
436
+ nextSize = current.min;
437
+ }
438
+ } else {
439
+ const towardsHigherCoordinate = key === "ArrowRight" || key === "ArrowDown";
440
+ const direction = towardsHigherCoordinate === growsWithCoordinate(position) ? 1 : -1;
441
+ nextSize = current.current + KEYBOARD_STEP * direction;
442
+ }
443
+ nextSize = clamp(nextSize, current);
444
+ if (nextSize === current.current) return;
445
+ applySize(nextSize);
446
+ }
447
+ );
448
+ const isCancelResizeEvent = React.useCallback(
449
+ (event) => event !== void 0 && event === cancelResizeEventRef.current,
450
+ []
451
+ );
452
+ const onFocus = React.useCallback(() => {
453
+ if (!dragRef.current) readMetrics();
454
+ }, [readMetrics]);
455
+ const setHandle = React.useCallback((node) => {
456
+ handleRef.current = node;
457
+ }, []);
458
+ React.useEffect(() => {
459
+ if (!enabled) {
460
+ setSizeState(void 0);
461
+ setMetrics(null);
462
+ restoreSizeRef.current = null;
463
+ initialSizeRef.current = null;
464
+ }
465
+ }, [enabled]);
466
+ useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(() => {
467
+ if (!enabled || !element) return;
468
+ if (axisRef.current !== horizontal) {
469
+ axisRef.current = horizontal;
470
+ restoreSizeRef.current = null;
471
+ initialSizeRef.current = null;
472
+ }
473
+ const next = readMetrics();
474
+ if (next && initialSizeRef.current === null) {
475
+ initialSizeRef.current = next.current;
476
+ }
477
+ }, [enabled, element, horizontal, readMetrics]);
478
+ useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(() => {
479
+ if (!enabled || !element) return;
480
+ readMetrics(true);
481
+ }, [enabled, element, size, readMetrics]);
482
+ React.useEffect(() => {
483
+ if (!enabled || !element || !targetWindow) return;
484
+ const onResize = () => {
485
+ stopPlacing();
486
+ readMetrics();
487
+ };
488
+ targetWindow.addEventListener("resize", onResize);
489
+ return () => targetWindow.removeEventListener("resize", onResize);
490
+ }, [enabled, element, targetWindow, readMetrics, stopPlacing]);
491
+ return {
492
+ sizeStyle: size !== void 0 ? { [horizontal ? "width" : "height"]: size } : void 0,
493
+ isResizing: interaction === "active" || interaction === "placing",
494
+ isHovered: interaction === "hover",
495
+ isPlacing: interaction === "placing",
496
+ isCancelResizeEvent,
497
+ separatorProps: {
498
+ role: "separator",
499
+ tabIndex: 0,
500
+ ref: setHandle,
501
+ "aria-orientation": horizontal ? "vertical" : "horizontal",
502
+ "aria-valuenow": metrics ? Math.round(metrics.current) : void 0,
503
+ "aria-valuemin": metrics ? Math.round(metrics.min) : void 0,
504
+ "aria-valuemax": metrics ? Math.round(metrics.max) : void 0,
505
+ onKeyDown,
506
+ onFocus
507
+ },
508
+ guideProps: {
509
+ ref: setGuide,
510
+ onPointerDown: onGuidePointerDown,
511
+ onPointerMove: onGuidePointerMove,
512
+ onClick: onGuideClick,
513
+ onContextMenu: stopPlacing
514
+ }
515
+ };
516
+ }
517
+
518
+ exports.useDrawerResize = useDrawerResize;
519
+ //# sourceMappingURL=useDrawerResize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDrawerResize.js","sources":["../src/drawer/internal/useDrawerResize.ts"],"sourcesContent":["import { useWindow } from \"@salt-ds/window\";\nimport type {\n AriaAttributes,\n CSSProperties,\n KeyboardEvent as ReactKeyboardEvent,\n MouseEvent as ReactMouseEvent,\n PointerEvent as ReactPointerEvent,\n} from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useEventCallback, useIsomorphicLayoutEffect } from \"../../utils\";\nimport type { DrawerProps } from \"../Drawer\";\n\ntype DrawerPosition = NonNullable<DrawerProps[\"position\"]>;\n\ninterface Bounds {\n min: number;\n max: number;\n}\n\ninterface DragState extends Bounds {\n pointerId: number;\n startX: number;\n startY: number;\n originSize: number;\n previousSize: number;\n cancelSize: number | undefined;\n moved: boolean;\n}\n\n/** Click-to-place resizing */\ninterface PlacingState extends Bounds {\n /** In viewport coordinates. */\n guideOffset: number;\n /** The placing press started on the guide layer. */\n pressed: boolean;\n}\n\ntype Interaction = \"inactive\" | \"hover\" | \"active\" | \"placing\";\n\nexport interface SeparatorProps\n extends Pick<\n AriaAttributes,\n \"aria-orientation\" | \"aria-valuenow\" | \"aria-valuemin\" | \"aria-valuemax\"\n > {\n role: \"separator\";\n tabIndex: number;\n ref: (element: HTMLElement | null) => void;\n onKeyDown: (event: ReactKeyboardEvent<HTMLElement>) => void;\n onFocus: () => void;\n}\n\nexport interface GuideProps {\n ref: (element: HTMLElement | null) => void;\n onPointerDown: (event: ReactPointerEvent<HTMLElement>) => void;\n onPointerMove: (event: ReactPointerEvent<HTMLElement>) => void;\n onClick: (event: ReactMouseEvent<HTMLElement>) => void;\n onContextMenu: () => void;\n}\n\nexport interface UseDrawerResizeProps {\n enabled: boolean;\n position: DrawerPosition;\n element: HTMLElement | null | undefined;\n}\n\nexport interface UseDrawerResizeResult {\n sizeStyle: CSSProperties | undefined;\n isResizing: boolean;\n isHovered: boolean;\n isPlacing: boolean;\n /** Whether the event is the Escape that cancelled a resize, so it shouldn't close the drawer. */\n isCancelResizeEvent: (event?: Event) => boolean;\n separatorProps: SeparatorProps;\n guideProps: GuideProps;\n}\n\nconst KEYBOARD_STEP = 8;\nconst PROBE_SIZE = 1e6;\n// A press that moves less than this is a click on the handle, not a drag.\nconst CLICK_THRESHOLD = 4;\n\nconst isElement = (target: EventTarget | null): target is Element =>\n target !== null && (target as Node).nodeType === 1;\n\nconst focusWithoutRing = (element: HTMLElement | null) =>\n element?.focus({\n preventScroll: true,\n focusVisible: false,\n } as FocusOptions);\n\n/** Shows the cursor everywhere in the document, over any element's own cursor. */\nconst setDocumentCursor = (ownerDocument: Document, cursor: string) => {\n const view = ownerDocument.defaultView as (Window & typeof globalThis) | null;\n if (!view || !ownerDocument.adoptedStyleSheets) return undefined;\n const sheet = new view.CSSStyleSheet();\n sheet.replaceSync(`*, *:hover { cursor: ${cursor} !important; }`);\n ownerDocument.adoptedStyleSheets = [\n ...ownerDocument.adoptedStyleSheets,\n sheet,\n ];\n return () => {\n ownerDocument.adoptedStyleSheets = ownerDocument.adoptedStyleSheets.filter(\n (adopted) => adopted !== sheet,\n );\n };\n};\n\nconst isHorizontal = (position: DrawerPosition) =>\n position === \"left\" || position === \"right\";\n\nconst growsWithCoordinate = (position: DrawerPosition) =>\n position === \"left\" || position === \"top\";\n\nconst measure = (element: HTMLElement, horizontal: boolean) => {\n const { width, height } = element.getBoundingClientRect();\n return horizontal ? width : height;\n};\n\nconst restoreStyle = (\n style: CSSStyleDeclaration,\n property: string,\n value: string,\n priority: string,\n) => {\n if (value) {\n style.setProperty(property, value, priority);\n } else {\n style.removeProperty(property);\n }\n};\n\n/** Resolves the drawer's CSS min/max size by briefly forcing it to both extremes. */\nconst probeBounds = (element: HTMLElement, horizontal: boolean): Bounds => {\n const property = horizontal ? \"width\" : \"height\";\n const { style } = element;\n const previousValue = style.getPropertyValue(property);\n const previousPriority = style.getPropertyPriority(property);\n const previousTransition = style.getPropertyValue(\"transition-property\");\n const previousTransitionPriority = style.getPropertyPriority(\n \"transition-property\",\n );\n\n // A transition would report the current size at both extremes.\n style.setProperty(\"transition-property\", \"none\", \"important\");\n style.setProperty(property, \"0px\", \"important\");\n const min = measure(element, horizontal);\n style.setProperty(property, `${PROBE_SIZE}px`, \"important\");\n const max = measure(element, horizontal);\n\n restoreStyle(style, property, previousValue, previousPriority);\n // Applies the restored size before transitions return, so it doesn't animate.\n measure(element, horizontal);\n restoreStyle(\n style,\n \"transition-property\",\n previousTransition,\n previousTransitionPriority,\n );\n\n return { min, max: Math.max(min, max) };\n};\n\nconst clamp = (value: number, { min, max }: Bounds) =>\n Math.min(Math.max(value, min), max);\n\n/** Size the drawer needs for its moving edge to sit at the given point. */\nconst sizeFromPoint = (\n rect: DOMRect,\n position: DrawerPosition,\n { clientX: x, clientY: y }: Pick<MouseEvent, \"clientX\" | \"clientY\">,\n) => {\n switch (position) {\n case \"left\":\n return x - rect.left;\n case \"right\":\n return rect.right - x;\n case \"top\":\n return y - rect.top;\n case \"bottom\":\n return rect.bottom - y;\n }\n};\n\n/** Viewport coordinate of the moving edge for a given size. */\nconst edgeFromSize = (\n rect: DOMRect,\n position: DrawerPosition,\n size: number,\n) => {\n switch (position) {\n case \"left\":\n return rect.left + size;\n case \"right\":\n return rect.right - size;\n case \"top\":\n return rect.top + size;\n case \"bottom\":\n return rect.bottom - size;\n }\n};\n\nexport function useDrawerResize({\n enabled,\n position,\n element,\n}: UseDrawerResizeProps): UseDrawerResizeResult {\n const horizontal = isHorizontal(position);\n const targetWindow = useWindow();\n\n // Unset until the user resizes, so the drawer keeps its CSS size.\n const [sizeState, setSizeState] = useState<number | undefined>(undefined);\n // Drop the size when `position` switches axis.\n const [sizeAxisHorizontal, setSizeAxisHorizontal] = useState(horizontal);\n const size =\n enabled && sizeAxisHorizontal === horizontal ? sizeState : undefined;\n\n const [interaction, setInteraction] = useState<Interaction>(\"inactive\");\n const [metrics, setMetrics] = useState<(Bounds & { current: number }) | null>(\n null,\n );\n const dragRef = useRef<DragState | null>(null);\n const placingRef = useRef<PlacingState | null>(null);\n const handleRef = useRef<HTMLElement | null>(null);\n const guideRef = useRef<HTMLElement | null>(null);\n const cancelResizeEventRef = useRef<Event | null>(null);\n const restoreSizeRef = useRef<number | null>(null);\n const initialSizeRef = useRef<number | null>(null);\n const axisRef = useRef(horizontal);\n\n // Probing forces layout, so key presses reuse the last bounds.\n const boundsRef = useRef<Bounds | null>(null);\n\n const readMetrics = useEventCallback((reuseBounds = false) => {\n if (!element) return null;\n const bounds =\n reuseBounds && boundsRef.current\n ? boundsRef.current\n : probeBounds(element, horizontal);\n boundsRef.current = bounds;\n const current = clamp(measure(element, horizontal), bounds);\n const next = { ...bounds, current };\n setMetrics(next);\n return next;\n });\n\n const applySize = (nextSize: number) => {\n setSizeState(nextSize);\n setSizeAxisHorizontal(horizontal);\n };\n\n const isOverHandle = ({\n clientX: x,\n clientY: y,\n }: Pick<MouseEvent, \"clientX\" | \"clientY\">) => {\n const rect = handleRef.current?.getBoundingClientRect();\n return (\n rect !== undefined &&\n x >= rect.left &&\n x <= rect.right &&\n y >= rect.top &&\n y <= rect.bottom\n );\n };\n\n const isHandle = useEventCallback(\n (target: EventTarget | null) =>\n enabled &&\n isElement(target) &&\n handleRef.current?.contains(target) === true,\n );\n\n const startDrag = useEventCallback((event: PointerEvent) => {\n const current = readMetrics();\n if (!current) return;\n\n event.preventDefault();\n dragRef.current = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n originSize: current.current,\n previousSize: current.current,\n cancelSize: size,\n min: current.min,\n max: current.max,\n moved: false,\n };\n focusWithoutRing(handleRef.current);\n setInteraction(\"active\");\n });\n\n const moveDrag = useEventCallback((event: PointerEvent, drag: DragState) => {\n // Small movement keeps the press a click, so it can start placing the edge by click.\n if (!drag.moved) {\n if (\n Math.hypot(event.clientX - drag.startX, event.clientY - drag.startY) <\n CLICK_THRESHOLD\n ) {\n return;\n }\n drag.moved = true;\n try {\n handleRef.current?.setPointerCapture(event.pointerId);\n } catch {\n // The pointer is no longer active.\n }\n }\n\n const coordinate = horizontal ? event.clientX : event.clientY;\n const origin = horizontal ? drag.startX : drag.startY;\n const direction = growsWithCoordinate(position) ? 1 : -1;\n const nextSize = clamp(\n drag.originSize + (coordinate - origin) * direction,\n drag,\n );\n if (nextSize !== drag.previousSize) {\n drag.previousSize = nextSize;\n applySize(nextSize);\n }\n });\n\n // Set directly, to avoid a re-render on every pointer move.\n const moveGuide = (offset: number) => {\n const placing = placingRef.current;\n if (!placing) return;\n placing.guideOffset = offset;\n guideRef.current?.style.setProperty(\n \"--drawerResizeGuide-offset\",\n `${offset}px`,\n );\n };\n\n const setGuide = useCallback((node: HTMLElement | null) => {\n guideRef.current = node;\n const placing = placingRef.current;\n if (node && placing) {\n node.style.setProperty(\n \"--drawerResizeGuide-offset\",\n `${placing.guideOffset}px`,\n );\n }\n }, []);\n\n const startPlacing = useEventCallback((drag: DragState) => {\n if (!element) return;\n placingRef.current = {\n min: drag.min,\n max: drag.max,\n guideOffset: edgeFromSize(\n element.getBoundingClientRect(),\n position,\n drag.originSize,\n ),\n pressed: false,\n };\n setInteraction(\"placing\");\n });\n\n const stopPlacing = useEventCallback(() => {\n if (!placingRef.current) return;\n placingRef.current = null;\n setInteraction(\"inactive\");\n });\n\n const endDrag = useEventCallback((event: Event) => {\n const drag = dragRef.current;\n if (!drag) return;\n dragRef.current = null;\n // Pointer capture retargets the release to the handle.\n const pointer = event as PointerEvent;\n const stillHovered =\n \"pointerType\" in event &&\n pointer.pointerType !== \"touch\" &&\n isHandle(\n handleRef.current?.ownerDocument.elementFromPoint(\n pointer.clientX,\n pointer.clientY,\n ) ?? null,\n );\n setInteraction(stillHovered ? \"hover\" : \"inactive\");\n });\n\n const cancelDrag = useEventCallback((event: KeyboardEvent) => {\n const drag = dragRef.current;\n if (!drag) return;\n const handle = handleRef.current;\n if (handle?.hasPointerCapture(drag.pointerId)) {\n handle.releasePointerCapture(drag.pointerId);\n }\n setSizeState(drag.cancelSize);\n endDrag(event);\n });\n\n const sizeToPlace = (\n target: HTMLElement,\n rect: DOMRect,\n point: Pick<MouseEvent, \"clientX\" | \"clientY\">,\n bounds: Bounds,\n ) =>\n clamp(\n isOverHandle(point)\n ? measure(target, horizontal)\n : sizeFromPoint(rect, position, point),\n bounds,\n );\n\n const moveGuideToPointer = (\n event: Pick<MouseEvent, \"clientX\" | \"clientY\">,\n ) => {\n const placing = placingRef.current;\n if (!placing || !element) return;\n const rect = element.getBoundingClientRect();\n moveGuide(\n edgeFromSize(rect, position, sizeToPlace(element, rect, event, placing)),\n );\n };\n\n const onGuidePointerDown = useEventCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n const placing = placingRef.current;\n if (!placing) return;\n if (event.pointerType === \"mouse\" && event.button > 0) {\n stopPlacing();\n return;\n }\n // Keeps focus on the handle.\n event.preventDefault();\n // React bubbles events from the portal up to the drawer.\n event.stopPropagation();\n placing.pressed = true;\n moveGuideToPointer(event);\n },\n );\n\n const onGuidePointerMove = useEventCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n moveGuideToPointer(event);\n },\n );\n\n const onGuideClick = useEventCallback(\n (event: ReactMouseEvent<HTMLElement>) => {\n const placing = placingRef.current;\n // Ignores the click that started placing.\n if (!placing?.pressed || !element) return;\n event.stopPropagation();\n stopPlacing();\n // The drawer may have moved since placing started, e.g. while sliding in.\n const rect = element.getBoundingClientRect();\n const nextSize = sizeToPlace(element, rect, event, placing);\n const current = clamp(measure(element, horizontal), placing);\n if (nextSize !== current) {\n applySize(nextSize);\n }\n focusWithoutRing(handleRef.current);\n },\n );\n\n useEffect(() => {\n if (!enabled || !element || !targetWindow) return;\n const ownerDocument = targetWindow.document;\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.defaultPrevented || !event.isPrimary) return;\n if (event.pointerType === \"mouse\" && event.button > 0) return;\n if (placingRef.current || dragRef.current || !isHandle(event.target)) {\n return;\n }\n startDrag(event);\n };\n\n const onPointerMove = (event: PointerEvent) => {\n if (event.defaultPrevented) return;\n if (placingRef.current) return;\n const drag = dragRef.current;\n if (!drag) {\n // Touch has no hover, so it would leave the hover state behind.\n if (event.pointerType !== \"touch\") {\n setInteraction(isHandle(event.target) ? \"hover\" : \"inactive\");\n }\n return;\n }\n if (event.pointerId !== drag.pointerId) return;\n // No buttons pressed means the release was missed, e.g. over an iframe.\n if (event.buttons === 0) {\n endDrag(event);\n return;\n }\n moveDrag(event, drag);\n };\n\n const onPointerUp = (event: PointerEvent) => {\n if (event.defaultPrevented) return;\n if (event.pointerType === \"mouse\" && event.button > 0) return;\n const drag = dragRef.current;\n if (drag?.pointerId !== event.pointerId) return;\n event.preventDefault();\n if (!drag.moved) {\n dragRef.current = null;\n startPlacing(drag);\n return;\n }\n endDrag(event);\n };\n\n const onPointerCancel = (event: PointerEvent) => {\n if (dragRef.current?.pointerId === event.pointerId) endDrag(event);\n };\n\n const onContextMenu = (event: MouseEvent) => {\n if (!event.defaultPrevented) endDrag(event);\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || !dragRef.current) return;\n event.preventDefault();\n cancelResizeEventRef.current = event;\n cancelDrag(event);\n };\n\n const onBlur = (event: FocusEvent) => {\n endDrag(event);\n stopPlacing();\n };\n\n // \"pointerout\" doesn't fire when the pointer moves into an iframe, so hover would stick.\n const onPointerOut = (event: PointerEvent) => {\n if (\n !dragRef.current &&\n isElement(event.relatedTarget) &&\n event.relatedTarget.tagName === \"IFRAME\"\n ) {\n setInteraction(\"inactive\");\n }\n };\n\n ownerDocument.addEventListener(\"pointerdown\", onPointerDown, true);\n ownerDocument.addEventListener(\"pointermove\", onPointerMove);\n ownerDocument.addEventListener(\"pointerup\", onPointerUp, true);\n ownerDocument.addEventListener(\"pointercancel\", onPointerCancel);\n ownerDocument.addEventListener(\"contextmenu\", onContextMenu, true);\n // Capture, to run before the drawer closes on Escape.\n ownerDocument.addEventListener(\"keydown\", onKeyDown, true);\n ownerDocument.addEventListener(\"pointerout\", onPointerOut);\n targetWindow.addEventListener(\"blur\", onBlur);\n return () => {\n ownerDocument.removeEventListener(\"pointerdown\", onPointerDown, true);\n ownerDocument.removeEventListener(\"pointermove\", onPointerMove);\n ownerDocument.removeEventListener(\"pointerup\", onPointerUp, true);\n ownerDocument.removeEventListener(\"pointercancel\", onPointerCancel);\n ownerDocument.removeEventListener(\"contextmenu\", onContextMenu, true);\n ownerDocument.removeEventListener(\"keydown\", onKeyDown, true);\n ownerDocument.removeEventListener(\"pointerout\", onPointerOut);\n targetWindow.removeEventListener(\"blur\", onBlur);\n dragRef.current = null;\n placingRef.current = null;\n setInteraction(\"inactive\");\n };\n }, [\n enabled,\n element,\n targetWindow,\n isHandle,\n startDrag,\n moveDrag,\n endDrag,\n cancelDrag,\n startPlacing,\n stopPlacing,\n ]);\n\n const showResizeCursor = interaction !== \"inactive\";\n useEffect(() => {\n if (!showResizeCursor || !targetWindow) return;\n return setDocumentCursor(\n targetWindow.document,\n horizontal\n ? \"var(--salt-cursor-drag-ew, ew-resize)\"\n : \"var(--salt-cursor-drag-ns, ns-resize)\",\n );\n }, [showResizeCursor, targetWindow, horizontal]);\n\n const onKeyDown = useEventCallback(\n (event: ReactKeyboardEvent<HTMLElement>) => {\n const { key } = event;\n if (placingRef.current) {\n stopPlacing();\n if (key === \"Escape\") {\n event.preventDefault();\n cancelResizeEventRef.current = event.nativeEvent;\n return;\n }\n }\n const resizeKeys = horizontal\n ? [\"ArrowLeft\", \"ArrowRight\"]\n : [\"ArrowUp\", \"ArrowDown\"];\n if (\n !resizeKeys.includes(key) &&\n key !== \"Home\" &&\n key !== \"End\" &&\n key !== \"Enter\"\n ) {\n return;\n }\n\n const current = readMetrics(true);\n if (!current) return;\n\n event.preventDefault();\n\n const collapsed = current.current <= current.min + 1;\n let nextSize: number;\n if (key === \"Home\") {\n if (!collapsed) {\n restoreSizeRef.current = current.current;\n }\n nextSize = current.min;\n } else if (key === \"End\") {\n nextSize = current.max;\n } else if (key === \"Enter\") {\n if (collapsed) {\n nextSize =\n restoreSizeRef.current ?? initialSizeRef.current ?? current.max;\n } else {\n restoreSizeRef.current = current.current;\n nextSize = current.min;\n }\n } else {\n const towardsHigherCoordinate =\n key === \"ArrowRight\" || key === \"ArrowDown\";\n const direction =\n towardsHigherCoordinate === growsWithCoordinate(position) ? 1 : -1;\n nextSize = current.current + KEYBOARD_STEP * direction;\n }\n\n nextSize = clamp(nextSize, current);\n if (nextSize === current.current) return;\n applySize(nextSize);\n },\n );\n\n const isCancelResizeEvent = useCallback(\n (event?: Event) =>\n event !== undefined && event === cancelResizeEventRef.current,\n [],\n );\n\n const onFocus = useCallback(() => {\n if (!dragRef.current) readMetrics();\n }, [readMetrics]);\n\n const setHandle = useCallback((node: HTMLElement | null) => {\n handleRef.current = node;\n }, []);\n\n useEffect(() => {\n if (!enabled) {\n setSizeState(undefined);\n setMetrics(null);\n restoreSizeRef.current = null;\n initialSizeRef.current = null;\n }\n }, [enabled]);\n\n useIsomorphicLayoutEffect(() => {\n if (!enabled || !element) return;\n if (axisRef.current !== horizontal) {\n axisRef.current = horizontal;\n restoreSizeRef.current = null;\n initialSizeRef.current = null;\n }\n const next = readMetrics();\n if (next && initialSizeRef.current === null) {\n initialSizeRef.current = next.current;\n }\n }, [enabled, element, horizontal, readMetrics]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-syncs the separator's aria values whenever the size changes.\n useIsomorphicLayoutEffect(() => {\n if (!enabled || !element) return;\n readMetrics(true);\n }, [enabled, element, size, readMetrics]);\n\n useEffect(() => {\n if (!enabled || !element || !targetWindow) return;\n const onResize = () => {\n // The size limits stored for placing are stale after the window resizes.\n stopPlacing();\n readMetrics();\n };\n targetWindow.addEventListener(\"resize\", onResize);\n return () => targetWindow.removeEventListener(\"resize\", onResize);\n }, [enabled, element, targetWindow, readMetrics, stopPlacing]);\n\n return {\n sizeStyle:\n size !== undefined\n ? { [horizontal ? \"width\" : \"height\"]: size }\n : undefined,\n isResizing: interaction === \"active\" || interaction === \"placing\",\n isHovered: interaction === \"hover\",\n isPlacing: interaction === \"placing\",\n isCancelResizeEvent,\n separatorProps: {\n role: \"separator\",\n tabIndex: 0,\n ref: setHandle,\n \"aria-orientation\": horizontal ? \"vertical\" : \"horizontal\",\n \"aria-valuenow\": metrics ? Math.round(metrics.current) : undefined,\n \"aria-valuemin\": metrics ? Math.round(metrics.min) : undefined,\n \"aria-valuemax\": metrics ? Math.round(metrics.max) : undefined,\n onKeyDown,\n onFocus,\n },\n guideProps: {\n ref: setGuide,\n onPointerDown: onGuidePointerDown,\n onPointerMove: onGuidePointerMove,\n onClick: onGuideClick,\n onContextMenu: stopPlacing,\n },\n };\n}\n"],"names":["useWindow","useState","useRef","useEventCallback","useCallback","useEffect","onKeyDown","useIsomorphicLayoutEffect"],"mappings":"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"}
@@ -36,6 +36,7 @@ const InteractableCard = React.forwardRef(function InteractableCard2(props, ref)
36
36
  onClick,
37
37
  onKeyUp,
38
38
  onKeyDown,
39
+ tabIndex: tabIndexProp,
39
40
  ...rest
40
41
  } = props;
41
42
  const targetWindow = window.useWindow();
@@ -130,7 +131,7 @@ const InteractableCard = React.forwardRef(function InteractableCard2(props, ref)
130
131
  ...rest,
131
132
  onClick: handleClick,
132
133
  ref: handleRef,
133
- tabIndex,
134
+ tabIndex: tabIndexProp ?? tabIndex,
134
135
  children
135
136
  }
136
137
  )