@dxos/react-ui-mosaic 0.8.4-main.d05673bc65 → 0.8.4-main.fcc0d83b33

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 (85) hide show
  1. package/dist/lib/browser/{chunk-75KCPN67.mjs → chunk-HOLJERCP.mjs} +229 -230
  2. package/dist/lib/browser/chunk-HOLJERCP.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +51 -69
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/playwright/index.mjs +18 -8
  7. package/dist/lib/browser/playwright/index.mjs.map +3 -3
  8. package/dist/lib/browser/testing/index.mjs +14 -10
  9. package/dist/lib/browser/testing/index.mjs.map +3 -3
  10. package/dist/lib/browser/translations.mjs +18 -0
  11. package/dist/lib/browser/translations.mjs.map +7 -0
  12. package/dist/lib/node-esm/{chunk-XYWWHOXN.mjs → chunk-RNSOVDUU.mjs} +229 -230
  13. package/dist/lib/node-esm/chunk-RNSOVDUU.mjs.map +7 -0
  14. package/dist/lib/node-esm/index.mjs +51 -69
  15. package/dist/lib/node-esm/index.mjs.map +4 -4
  16. package/dist/lib/node-esm/meta.json +1 -1
  17. package/dist/lib/node-esm/playwright/index.mjs +18 -8
  18. package/dist/lib/node-esm/playwright/index.mjs.map +3 -3
  19. package/dist/lib/node-esm/testing/index.mjs +14 -10
  20. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  21. package/dist/lib/node-esm/translations.mjs +20 -0
  22. package/dist/lib/node-esm/translations.mjs.map +7 -0
  23. package/dist/types/src/components/Board/Board.d.ts +14 -7
  24. package/dist/types/src/components/Board/Board.d.ts.map +1 -1
  25. package/dist/types/src/components/Board/Board.stories.d.ts +5 -5
  26. package/dist/types/src/components/Board/Board.stories.d.ts.map +1 -1
  27. package/dist/types/src/components/Board/Column.d.ts +9 -9
  28. package/dist/types/src/components/Board/Column.d.ts.map +1 -1
  29. package/dist/types/src/components/Board/Item.d.ts +3 -0
  30. package/dist/types/src/components/Board/Item.d.ts.map +1 -1
  31. package/dist/types/src/components/Focus/Focus.d.ts +1 -25
  32. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
  33. package/dist/types/src/components/Mosaic/Container.d.ts +15 -11
  34. package/dist/types/src/components/Mosaic/Container.d.ts.map +1 -1
  35. package/dist/types/src/components/Mosaic/Mosaic.d.ts +12 -25
  36. package/dist/types/src/components/Mosaic/Mosaic.d.ts.map +1 -1
  37. package/dist/types/src/components/Mosaic/Placeholder.d.ts +8 -8
  38. package/dist/types/src/components/Mosaic/Placeholder.d.ts.map +1 -1
  39. package/dist/types/src/components/Mosaic/Root.d.ts +5 -6
  40. package/dist/types/src/components/Mosaic/Root.d.ts.map +1 -1
  41. package/dist/types/src/components/Mosaic/Stack.d.ts +13 -7
  42. package/dist/types/src/components/Mosaic/Stack.d.ts.map +1 -1
  43. package/dist/types/src/components/Mosaic/Stack.stories.d.ts +11 -0
  44. package/dist/types/src/components/Mosaic/Stack.stories.d.ts.map +1 -1
  45. package/dist/types/src/components/Mosaic/Tile.d.ts +16 -10
  46. package/dist/types/src/components/Mosaic/Tile.d.ts.map +1 -1
  47. package/dist/types/src/components/Mosaic/extension.d.ts.map +1 -1
  48. package/dist/types/src/components/Mosaic/styles.d.ts.map +1 -1
  49. package/dist/types/src/components/Mosaic/types.d.ts.map +1 -1
  50. package/dist/types/src/hooks/useContainerDebug.d.ts.map +1 -1
  51. package/dist/types/src/hooks/useDefaultColumnEventHandler.d.ts.map +1 -1
  52. package/dist/types/src/hooks/useEventHandlerAdapter.d.ts +1 -1
  53. package/dist/types/src/hooks/useEventHandlerAdapter.d.ts.map +1 -1
  54. package/dist/types/src/hooks/useVisibleItems.d.ts.map +1 -1
  55. package/dist/types/src/playwright/board-manager.d.ts.map +1 -1
  56. package/dist/types/src/playwright/playwright.config.d.ts.map +1 -1
  57. package/dist/types/src/testing/CardContainer.d.ts.map +1 -1
  58. package/dist/types/src/testing/DefaultStackTile.d.ts.map +1 -1
  59. package/dist/types/src/testing/types.d.ts +3 -3
  60. package/dist/types/src/translations.d.ts +3 -3
  61. package/dist/types/src/translations.d.ts.map +1 -1
  62. package/dist/types/tsconfig.tsbuildinfo +1 -1
  63. package/package.json +36 -37
  64. package/src/AUDIT.md +106 -0
  65. package/src/components/Board/Board.stories.tsx +23 -22
  66. package/src/components/Board/Board.tsx +6 -8
  67. package/src/components/Board/Column.tsx +43 -41
  68. package/src/components/Board/Item.tsx +25 -25
  69. package/src/components/Focus/Focus.tsx +2 -102
  70. package/src/components/Mosaic/Container.tsx +51 -23
  71. package/src/components/Mosaic/Placeholder.tsx +1 -1
  72. package/src/components/Mosaic/Root.tsx +199 -205
  73. package/src/components/Mosaic/Stack.stories.tsx +125 -69
  74. package/src/components/Mosaic/Stack.tsx +162 -52
  75. package/src/components/Mosaic/Tile.tsx +41 -34
  76. package/src/hooks/useContainerDebug.tsx +2 -2
  77. package/src/hooks/useDefaultColumnEventHandler.ts +0 -1
  78. package/src/hooks/useEventHandlerAdapter.ts +1 -1
  79. package/src/playwright/board-manager.ts +18 -13
  80. package/src/playwright/smoke.spec.ts +10 -5
  81. package/src/testing/CardContainer.tsx +2 -2
  82. package/src/testing/DefaultStackTile.tsx +23 -20
  83. package/src/translations.ts +3 -3
  84. package/dist/lib/browser/chunk-75KCPN67.mjs.map +0 -7
  85. package/dist/lib/node-esm/chunk-XYWWHOXN.mjs.map +0 -7
@@ -22,56 +22,7 @@ var useVisibleItems = ({ id, items, dragging, getId }) => {
22
22
  };
23
23
 
24
24
  // src/components/Focus/Focus.tsx
25
- import { useArrowNavigationGroup, useFocusableGroup, useMergedTabsterAttributes_unstable } from "@fluentui/react-tabster";
26
- import { useComposedRefs } from "@radix-ui/react-compose-refs";
27
- import { Primitive } from "@radix-ui/react-primitive";
28
- import { Slot } from "@radix-ui/react-slot";
29
- import React, { createContext, forwardRef, useContext, useRef, useState } from "react";
30
- import { composableProps, mx } from "@dxos/ui-theme";
31
- var FOCUS_STATE_ATTR = "focus-state";
32
- var FocusContext = /* @__PURE__ */ createContext({});
33
- var useFocus = () => useContext(FocusContext);
34
- var Group = /* @__PURE__ */ forwardRef(({ children, asChild, orientation = "vertical", ...props }, forwardedRef) => {
35
- const { className, ...rest } = composableProps(props);
36
- const Comp = asChild ? Slot : Primitive.div;
37
- const rootRef = useRef(null);
38
- const composedRef = useComposedRefs(rootRef, forwardedRef);
39
- const focusableGroupAttrs = useFocusableGroup({
40
- tabBehavior: "limited-trap-focus"
41
- });
42
- const arrowNavigationAttrs = useArrowNavigationGroup({
43
- axis: orientation,
44
- memorizeCurrent: true
45
- });
46
- const tabsterAttrs = useMergedTabsterAttributes_unstable(focusableGroupAttrs, arrowNavigationAttrs);
47
- const [state, setState] = useState();
48
- return /* @__PURE__ */ React.createElement(FocusContext.Provider, {
49
- value: {
50
- setFocus: setState
51
- }
52
- }, /* @__PURE__ */ React.createElement(Comp, {
53
- ...rest,
54
- ...tabsterAttrs,
55
- ...state && {
56
- [`data-${FOCUS_STATE_ATTR}`]: state
57
- },
58
- tabIndex: 0,
59
- className: mx([
60
- // TODO(burdon): Option for border/rounded; ring/outline vs border?
61
- "outline-hidden border border-separator md:rounded-xs",
62
- // Focus (e.g., via tabster).
63
- "focus:!border-accent-surface",
64
- // Active (e.g., drop target).
65
- "data-[focus-state=active]:border-neutral-focus-indicator",
66
- // Error
67
- "data-[focus-state=error]:border-rose-500"
68
- ], className),
69
- ref: composedRef
70
- }, children));
71
- });
72
- var Focus = {
73
- Group
74
- };
25
+ import { Focus, useFocus } from "@dxos/react-ui";
75
26
 
76
27
  // src/components/Mosaic/styles.ts
77
28
  var styles = {
@@ -109,23 +60,22 @@ var getSourceData = (source) => {
109
60
  // src/components/Mosaic/Root.tsx
110
61
  import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
111
62
  import { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
112
- import { useComposedRefs as useComposedRefs2 } from "@radix-ui/react-compose-refs";
113
- import { createContext as createContext2 } from "@radix-ui/react-context";
114
- import { Primitive as Primitive2 } from "@radix-ui/react-primitive";
115
- import { Slot as Slot2 } from "@radix-ui/react-slot";
116
- import React2, { forwardRef as forwardRef2, useCallback, useEffect, useRef as useRef2, useState as useState2 } from "react";
63
+ import { useComposedRefs } from "@radix-ui/react-compose-refs";
64
+ import { createContext } from "@radix-ui/react-context";
65
+ import { Primitive } from "@radix-ui/react-primitive";
66
+ import { Slot } from "@radix-ui/react-slot";
67
+ import React, { forwardRef, useCallback, useEffect, useRef, useState } from "react";
117
68
  import { log } from "@dxos/log";
118
- import { mx as mx2 } from "@dxos/ui-theme";
119
69
  var __dxlog_file = "/__w/dxos/dxos/packages/ui/react-ui-mosaic/src/components/Mosaic/Root.tsx";
120
- var [MosaicRootContextProvider, useMosaicRootContext] = createContext2("MosaicRoot");
70
+ var [MosaicRootContextProvider, useMosaicRootContext] = createContext("MosaicRoot");
121
71
  var MOSAIC_ROOT_NAME = "Mosaic.Root";
122
72
  var MOSAIC_ROOT_DEBUG_ATTR = "mosaic-debug";
123
- var MosaicRoot = /* @__PURE__ */ forwardRef2(({ classNames, children, asChild, debug }, forwardedRef) => {
124
- const rootRef = useRef2(null);
125
- const composedRef = useComposedRefs2(rootRef, forwardedRef);
126
- const Comp = asChild ? Slot2 : Primitive2.div;
127
- const [handlers, setHandlers] = useState2({});
128
- const [dragging, setDragging] = useState2();
73
+ var MosaicRoot = /* @__PURE__ */ forwardRef(({ children, asChild, debug }, forwardedRef) => {
74
+ const rootRef = useRef(null);
75
+ const composedRef = useComposedRefs(rootRef, forwardedRef);
76
+ const Comp = asChild ? Slot : Primitive.div;
77
+ const [handlers, setHandlers] = useState({});
78
+ const [dragging, setDragging] = useState();
129
79
  const getSourceHandler = useCallback((source) => {
130
80
  const data = source.data;
131
81
  return {
@@ -170,7 +120,7 @@ var MosaicRoot = /* @__PURE__ */ forwardRef2(({ classNames, children, asChild, d
170
120
  source: {
171
121
  data: sourceData,
172
122
  handler: handlers[sourceData.containerId],
173
- // TOOD(burdon): Check id matches.
123
+ // TODO(burdon): Check id matches.
174
124
  container: location.initial.dropTargets.find((target) => target.data.type === "container")?.element
175
125
  },
176
126
  target: targetData && {
@@ -200,12 +150,7 @@ var MosaicRoot = /* @__PURE__ */ forwardRef2(({ classNames, children, asChild, d
200
150
  log("Root.onDragStart", {
201
151
  source: source.data,
202
152
  location: location.current.dropTargets.map((target) => target.data)
203
- }, {
204
- F: __dxlog_file,
205
- L: 149,
206
- S: void 0,
207
- C: (f, a) => f(...a)
208
- });
153
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 96, S: void 0 });
209
154
  handleChange({
210
155
  source,
211
156
  location
@@ -219,12 +164,7 @@ var MosaicRoot = /* @__PURE__ */ forwardRef2(({ classNames, children, asChild, d
219
164
  log("Root.onDropTargetChange", {
220
165
  source: source.data,
221
166
  location: location.current.dropTargets.map((target) => target.data)
222
- }, {
223
- F: __dxlog_file,
224
- L: 162,
225
- S: void 0,
226
- C: (f, a) => f(...a)
227
- });
167
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 109, S: void 0 });
228
168
  if (location.current.dropTargets.length === 0) {
229
169
  noTargetTimeout = setTimeout(() => setDragging(void 0), 1e3);
230
170
  } else {
@@ -258,33 +198,18 @@ var MosaicRoot = /* @__PURE__ */ forwardRef2(({ classNames, children, asChild, d
258
198
  log.info("Root.onDrop", {
259
199
  source: source.data,
260
200
  location: location.current.dropTargets.map((target) => target.data)
261
- }, {
262
- F: __dxlog_file,
263
- L: 191,
264
- S: void 0,
265
- C: (f, a) => f(...a)
266
- });
201
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 142, S: void 0 });
267
202
  const { data: sourceData, handler: sourceHandler } = getSourceHandler(source);
268
203
  if (!sourceHandler) {
269
204
  log.warn("invalid source", {
270
205
  source: sourceData,
271
206
  handlers: Object.keys(handlers)
272
- }, {
273
- F: __dxlog_file,
274
- L: 199,
275
- S: void 0,
276
- C: (f, a) => f(...a)
277
- });
207
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 149, S: void 0 });
278
208
  return;
279
209
  }
280
210
  try {
281
211
  if (location.current.dropTargets.length === 0) {
282
- log.info("cancelled", void 0, {
283
- F: __dxlog_file,
284
- L: 214,
285
- S: void 0,
286
- C: (f, a) => f(...a)
287
- });
212
+ log.info("cancelled", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 163, S: void 0 });
288
213
  } else {
289
214
  const { data: targetData, handler: targetHandler } = getTargetHandler(location);
290
215
  if (!targetHandler) {
@@ -292,12 +217,7 @@ var MosaicRoot = /* @__PURE__ */ forwardRef2(({ classNames, children, asChild, d
292
217
  source: sourceData,
293
218
  location,
294
219
  handlers: Object.keys(handlers)
295
- }, {
296
- F: __dxlog_file,
297
- L: 219,
298
- S: void 0,
299
- C: (f, a) => f(...a)
300
- });
220
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 168, S: void 0 });
301
221
  return;
302
222
  }
303
223
  if (sourceHandler === targetHandler) {
@@ -309,12 +229,7 @@ var MosaicRoot = /* @__PURE__ */ forwardRef2(({ classNames, children, asChild, d
309
229
  if (!sourceHandler.onTake) {
310
230
  log.warn("invalid source", {
311
231
  source: sourceData
312
- }, {
313
- F: __dxlog_file,
314
- L: 235,
315
- S: void 0,
316
- C: (f, a) => f(...a)
317
- });
232
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 183, S: void 0 });
318
233
  return;
319
234
  }
320
235
  sourceHandler.onTake?.({
@@ -341,7 +256,7 @@ var MosaicRoot = /* @__PURE__ */ forwardRef2(({ classNames, children, asChild, d
341
256
  getSourceHandler,
342
257
  getTargetHandler
343
258
  ]);
344
- return /* @__PURE__ */ React2.createElement(MosaicRootContextProvider, {
259
+ return /* @__PURE__ */ React.createElement(MosaicRootContextProvider, {
345
260
  containers: handlers,
346
261
  addContainer: (container) => setHandlers((containers) => ({
347
262
  ...containers,
@@ -354,8 +269,8 @@ var MosaicRoot = /* @__PURE__ */ forwardRef2(({ classNames, children, asChild, d
354
269
  };
355
270
  }),
356
271
  dragging
357
- }, /* @__PURE__ */ React2.createElement(Comp, {
358
- className: mx2("group", classNames),
272
+ }, /* @__PURE__ */ React.createElement(Comp, {
273
+ className: "contents group",
359
274
  [`data-${MOSAIC_ROOT_DEBUG_ATTR}`]: debug,
360
275
  ref: composedRef
361
276
  }, children));
@@ -363,39 +278,52 @@ var MosaicRoot = /* @__PURE__ */ forwardRef2(({ classNames, children, asChild, d
363
278
  MosaicRoot.displayName = MOSAIC_ROOT_NAME;
364
279
 
365
280
  // src/components/Mosaic/Container.tsx
281
+ import { autoScrollForElements } from "@atlaskit/pragmatic-drag-and-drop-auto-scroll/element";
366
282
  import { combine as combine2 } from "@atlaskit/pragmatic-drag-and-drop/combine";
367
283
  import { dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
368
- import { autoScrollForElements } from "@atlaskit/pragmatic-drag-and-drop-auto-scroll/element";
369
- import { useComposedRefs as useComposedRefs3 } from "@radix-ui/react-compose-refs";
370
- import { createContext as createContext3 } from "@radix-ui/react-context";
371
- import { Primitive as Primitive3 } from "@radix-ui/react-primitive";
372
- import { Slot as Slot3 } from "@radix-ui/react-slot";
284
+ import { useComposedRefs as useComposedRefs2 } from "@radix-ui/react-compose-refs";
285
+ import { createContext as createContext2 } from "@radix-ui/react-context";
286
+ import { Primitive as Primitive2 } from "@radix-ui/react-primitive";
287
+ import { Slot as Slot2 } from "@radix-ui/react-slot";
373
288
  import { bind } from "bind-event-listener";
374
- import React3, { forwardRef as forwardRef3, useEffect as useEffect2, useMemo as useMemo2, useRef as useRef3, useState as useState3 } from "react";
375
- import { composableProps as composableProps2, mx as mx3 } from "@dxos/ui-theme";
289
+ import React2, { useCallback as useCallback2, useEffect as useEffect2, useMemo as useMemo2, useRef as useRef2, useState as useState2 } from "react";
290
+ import { composable, composableProps } from "@dxos/ui-theme";
376
291
  import { isTruthy } from "@dxos/util";
377
292
  var MOSAIC_CONTAINER_NAME = "Mosaic.Container";
378
- var [MosaicContainerContextProvider, useMosaicContainerContext] = createContext3("MosaicContainer");
293
+ var [MosaicContainerContextProvider, useMosaicContainerContext] = createContext2("MosaicContainer");
379
294
  var MOSAIC_CONTAINER_STATE_ATTR = "mosaic-container-state";
380
295
  var MOSAIC_CONTAINER_PLACEHOLDER_WIDTH = "--mosaic-placeholder-width";
381
296
  var MOSAIC_CONTAINER_PLACEHOLDER_HEIGHT = "--mosaic-placeholder-height";
382
297
  var counter = 0;
383
- var MosaicContainer = /* @__PURE__ */ forwardRef3(({ children, eventHandler: eventHandlerProp, orientation = "vertical", asChild, autoScroll: autoscrollElement, withFocus, debug, ...props }, forwardedRef) => {
384
- const { className, ...rest } = composableProps2(props);
385
- const Comp = asChild ? Slot3 : Primitive3.div;
386
- const rootRef = useRef3(null);
387
- const composedRef = useComposedRefs3(rootRef, forwardedRef);
298
+ var MosaicContainer = composable(({ children, eventHandler: eventHandlerProp, orientation = "vertical", asChild, autoScroll: autoscrollElement, withFocus, currentId, onCurrentChange, debug, ...props }, forwardedRef) => {
299
+ const Comp = asChild ? Slot2 : Primitive2.div;
300
+ const rootRef = useRef2(null);
301
+ const composedRef = useComposedRefs2(rootRef, forwardedRef);
388
302
  const eventHandler = useMemo2(() => eventHandlerProp ?? {
389
303
  id: `mosaic-container-${counter++}`
390
304
  }, [
391
305
  eventHandlerProp
392
306
  ]);
393
307
  const { dragging } = useMosaicRootContext(MOSAIC_CONTAINER_NAME);
394
- const [state, setState] = useState3({
308
+ const [state, setState] = useState2({
395
309
  type: "idle"
396
310
  });
397
- const [activeLocation, setActiveLocation] = useState3();
398
- const [scrolling, setScrolling] = useState3(false);
311
+ const [activeLocation, setActiveLocation] = useState2();
312
+ const [scrolling, setScrolling] = useState2(false);
313
+ const setCurrentId = useCallback2((id) => onCurrentChange?.(id), [
314
+ onCurrentChange
315
+ ]);
316
+ const scrollToRef = useRef2(void 0);
317
+ const registerScrollTo = useCallback2((fn) => {
318
+ scrollToRef.current = fn;
319
+ }, []);
320
+ useEffect2(() => {
321
+ if (currentId) {
322
+ scrollToRef.current?.(currentId);
323
+ }
324
+ }, [
325
+ currentId
326
+ ]);
399
327
  const { setFocus } = useFocus();
400
328
  useEffect2(() => {
401
329
  if (withFocus) {
@@ -530,7 +458,7 @@ var MosaicContainer = /* @__PURE__ */ forwardRef3(({ children, eventHandler: eve
530
458
  data,
531
459
  autoscrollElement
532
460
  ]);
533
- return /* @__PURE__ */ React3.createElement(MosaicContainerContextProvider, {
461
+ return /* @__PURE__ */ React2.createElement(MosaicContainerContextProvider, {
534
462
  id: eventHandler.id,
535
463
  eventHandler,
536
464
  orientation,
@@ -538,14 +466,18 @@ var MosaicContainer = /* @__PURE__ */ forwardRef3(({ children, eventHandler: eve
538
466
  dragging: state.type === "active" ? dragging : void 0,
539
467
  scrolling,
540
468
  activeLocation,
541
- setActiveLocation
542
- }, /* @__PURE__ */ React3.createElement(Comp, {
543
- className: mx3("h-full", className),
544
- style: {
545
- [MOSAIC_CONTAINER_PLACEHOLDER_WIDTH]: state.type === "active" && state.bounds ? `${state.bounds.width}px` : "0px",
546
- [MOSAIC_CONTAINER_PLACEHOLDER_HEIGHT]: state.type === "active" && state.bounds ? `${state.bounds.height}px` : "0px"
547
- },
548
- ...rest,
469
+ setActiveLocation,
470
+ currentId,
471
+ setCurrentId,
472
+ registerScrollTo
473
+ }, /* @__PURE__ */ React2.createElement(Comp, {
474
+ ...composableProps(props, {
475
+ classNames: "h-full",
476
+ style: {
477
+ [MOSAIC_CONTAINER_PLACEHOLDER_WIDTH]: state.type === "active" && state.bounds ? `${state.bounds.width}px` : "0px",
478
+ [MOSAIC_CONTAINER_PLACEHOLDER_HEIGHT]: state.type === "active" && state.bounds ? `${state.bounds.height}px` : "0px"
479
+ }
480
+ }),
549
481
  [`data-${MOSAIC_CONTAINER_STATE_ATTR}`]: state.type,
550
482
  ref: composedRef
551
483
  }, children), debug?.());
@@ -553,28 +485,27 @@ var MosaicContainer = /* @__PURE__ */ forwardRef3(({ children, eventHandler: eve
553
485
  MosaicContainer.displayName = MOSAIC_CONTAINER_NAME;
554
486
 
555
487
  // src/components/Mosaic/Tile.tsx
488
+ import { attachClosestEdge, extractClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
556
489
  import { combine as combine3 } from "@atlaskit/pragmatic-drag-and-drop/combine";
557
490
  import { draggable, dropTargetForElements as dropTargetForElements2 } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
558
491
  import { preserveOffsetOnSource } from "@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source";
559
492
  import { setCustomNativeDragPreview } from "@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview";
560
- import { attachClosestEdge, extractClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
561
493
  import { composeRefs } from "@radix-ui/react-compose-refs";
562
- import { createContext as createContext4 } from "@radix-ui/react-context";
563
- import { Primitive as Primitive4 } from "@radix-ui/react-primitive";
564
- import { Slot as Slot4 } from "@radix-ui/react-slot";
565
- import React4, { forwardRef as forwardRef4, useLayoutEffect, useMemo as useMemo3, useRef as useRef4, useState as useState4 } from "react";
494
+ import { createContext as createContext3 } from "@radix-ui/react-context";
495
+ import { Primitive as Primitive3 } from "@radix-ui/react-primitive";
496
+ import { Slot as Slot3 } from "@radix-ui/react-slot";
497
+ import React3, { useLayoutEffect, useMemo as useMemo3, useRef as useRef3, useState as useState3 } from "react";
566
498
  import { createPortal } from "react-dom";
567
- import { composableProps as composableProps3, mx as mx4 } from "@dxos/ui-theme";
499
+ import { composableProps as composableProps2, slottable } from "@dxos/ui-theme";
568
500
  var MOSAIC_TILE_NAME = "Mosaic.Tile";
569
- var [MosaicTileContextProvider, useMosaicTileContext] = createContext4("MosaicTile");
501
+ var [MosaicTileContextProvider, useMosaicTileContext] = createContext3("MosaicTile");
570
502
  var MOSAIC_TILE_STATE_ATTR = "mosaic-tile-state";
571
- var MosaicTile = /* @__PURE__ */ forwardRef4(({ children, asChild, dragHandle, allowedEdges: allowedEdgesProp, location, id, data: dataProp, debug: _, ...props }, forwardedRef) => {
572
- const { className, ...rest } = composableProps3(props);
573
- const Comp = asChild ? Slot4 : Primitive4.div;
574
- const rootRef = useRef4(null);
503
+ var MosaicTile = slottable(({ children, asChild, dragHandle, allowedEdges: allowedEdgesProp, location, id, data: dataProp, draggable: draggableProp, current: _current, debug: _, ...props }, forwardedRef) => {
504
+ const Comp = asChild ? Slot3 : Primitive3.div;
505
+ const rootRef = useRef3(null);
575
506
  const composedRef = composeRefs(rootRef, forwardedRef);
576
507
  const { id: containerId, eventHandler, orientation, scrolling, setActiveLocation } = useMosaicContainerContext(MOSAIC_TILE_NAME);
577
- const [state, setState] = useState4({
508
+ const [state, setState] = useState3({
578
509
  type: "idle"
579
510
  });
580
511
  const allowedEdges = useMemo3(() => allowedEdgesProp || (orientation === "vertical" ? [
@@ -600,7 +531,7 @@ var MosaicTile = /* @__PURE__ */ forwardRef4(({ children, asChild, dragHandle, a
600
531
  ]);
601
532
  useLayoutEffect(() => {
602
533
  const root = rootRef.current;
603
- if (!root || !containerId || scrolling) {
534
+ if (!draggableProp || !root || !containerId || scrolling) {
604
535
  return;
605
536
  }
606
537
  const handleChange = ({ self, source }) => {
@@ -694,6 +625,8 @@ var MosaicTile = /* @__PURE__ */ forwardRef4(({ children, asChild, dragHandle, a
694
625
  );
695
626
  }, [
696
627
  rootRef,
628
+ forwardedRef,
629
+ containerId,
697
630
  dragHandle,
698
631
  eventHandler,
699
632
  data,
@@ -701,19 +634,22 @@ var MosaicTile = /* @__PURE__ */ forwardRef4(({ children, asChild, dragHandle, a
701
634
  allowedEdges,
702
635
  setActiveLocation
703
636
  ]);
704
- return /* @__PURE__ */ React4.createElement(MosaicTileContextProvider, {
637
+ const { className, ...rest } = composableProps2(props, {
638
+ classNames: "relative outline-none"
639
+ });
640
+ return /* @__PURE__ */ React3.createElement(MosaicTileContextProvider, {
705
641
  state
706
- }, /* @__PURE__ */ React4.createElement(Comp, {
642
+ }, /* @__PURE__ */ React3.createElement(Comp, {
707
643
  ...rest,
644
+ "data-object-id": id,
708
645
  [`data-${MOSAIC_TILE_STATE_ATTR}`]: state.type,
709
646
  role: "listitem",
710
- className: mx4("relative", className),
647
+ className,
711
648
  ref: composedRef
712
- }, children), state.type === "preview" && /* @__PURE__ */ createPortal(/* @__PURE__ */ React4.createElement(Comp, {
649
+ }, children), state.type === "preview" && /* @__PURE__ */ createPortal(/* @__PURE__ */ React3.createElement(Comp, {
713
650
  // NOTE: Use to control appearance while dragging.
714
651
  [`data-${MOSAIC_TILE_STATE_ATTR}`]: state.type,
715
- // TODO(burdon): Configure drop animation.
716
- className: mx4("relative", className),
652
+ className,
717
653
  style: {
718
654
  width: `${state.rect.width}px`,
719
655
  height: `${state.rect.height}px`
@@ -723,18 +659,18 @@ var MosaicTile = /* @__PURE__ */ forwardRef4(({ children, asChild, dragHandle, a
723
659
  MosaicTile.displayName = MOSAIC_TILE_NAME;
724
660
 
725
661
  // src/components/Mosaic/Placeholder.tsx
726
- import { dropTargetForElements as dropTargetForElements3 } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
727
662
  import { DropIndicator as NaturalDropIndicator } from "@atlaskit/pragmatic-drag-and-drop-react-drop-indicator/box";
728
- import { Primitive as Primitive5 } from "@radix-ui/react-primitive";
729
- import { Slot as Slot5 } from "@radix-ui/react-slot";
730
- import React5, { useLayoutEffect as useLayoutEffect2, useMemo as useMemo4, useRef as useRef5 } from "react";
731
- import { mx as mx5 } from "@dxos/ui-theme";
663
+ import { dropTargetForElements as dropTargetForElements3 } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
664
+ import { Primitive as Primitive4 } from "@radix-ui/react-primitive";
665
+ import { Slot as Slot4 } from "@radix-ui/react-slot";
666
+ import React4, { useLayoutEffect as useLayoutEffect2, useMemo as useMemo4, useRef as useRef4 } from "react";
667
+ import { mx } from "@dxos/ui-theme";
732
668
  var MOSAIC_PLACEHOLDER_NAME = "Mosaic.Placeholder";
733
669
  var MOSAIC_PLACEHOLDER_ORIENTATION_ATTR = "mosaic-placeholder-orientation";
734
670
  var MOSAIC_PLACEHOLDER_STATE_ATTR = "mosaic-placeholder-state";
735
671
  var MosaicPlaceholder = ({ classNames, children, asChild, orientation = "vertical", location }) => {
736
- const rootRef = useRef5(null);
737
- const Comp = asChild ? Slot5 : Primitive5.div;
672
+ const rootRef = useRef4(null);
673
+ const Comp = asChild ? Slot4 : Primitive4.div;
738
674
  const { id: containerId, eventHandler, scrolling, activeLocation, setActiveLocation } = useMosaicContainerContext(MOSAIC_PLACEHOLDER_NAME);
739
675
  const data = useMemo4(() => ({
740
676
  type: "placeholder",
@@ -774,11 +710,11 @@ var MosaicPlaceholder = ({ classNames, children, asChild, orientation = "vertica
774
710
  scrolling,
775
711
  setActiveLocation
776
712
  ]);
777
- return /* @__PURE__ */ React5.createElement(Comp, {
713
+ return /* @__PURE__ */ React4.createElement(Comp, {
778
714
  [`data-${MOSAIC_PLACEHOLDER_ORIENTATION_ATTR}`]: orientation,
779
715
  [`data-${MOSAIC_PLACEHOLDER_STATE_ATTR}`]: data.location === activeLocation ? "active" : "idle",
780
716
  role: "none",
781
- className: mx5("relative", classNames),
717
+ className: mx("relative", classNames),
782
718
  ref: rootRef
783
719
  }, children);
784
720
  };
@@ -786,7 +722,7 @@ MosaicPlaceholder.displayName = MOSAIC_PLACEHOLDER_NAME;
786
722
  var DROP_INDICATOR_NAME = "Mosaic.DropIndicator";
787
723
  var MosaicDropIndicator = (props) => {
788
724
  const { state } = useMosaicTileContext(DROP_INDICATOR_NAME);
789
- return state.type === "target" && state.closestEdge ? /* @__PURE__ */ React5.createElement(NaturalDropIndicator, {
725
+ return state.type === "target" && state.closestEdge ? /* @__PURE__ */ React4.createElement(NaturalDropIndicator, {
790
726
  ...props,
791
727
  edge: state.closestEdge
792
728
  }) : null;
@@ -794,56 +730,66 @@ var MosaicDropIndicator = (props) => {
794
730
  MosaicDropIndicator.displayName = DROP_INDICATOR_NAME;
795
731
 
796
732
  // src/components/Mosaic/Stack.tsx
733
+ import { useComposedRefs as useComposedRefs3 } from "@radix-ui/react-compose-refs";
797
734
  import { useVirtualizer } from "@tanstack/react-virtual";
798
- import React6, { Fragment, forwardRef as forwardRef5 } from "react";
735
+ import React5, { forwardRef as forwardRef2, Fragment, useCallback as useCallback3, useEffect as useEffect3, useRef as useRef5 } from "react";
799
736
  import { invariant } from "@dxos/invariant";
800
- import { composableProps as composableProps4, mx as mx6 } from "@dxos/ui-theme";
737
+ import { composable as composable2, composableProps as composableProps3, mx as mx2 } from "@dxos/ui-theme";
801
738
  var __dxlog_file2 = "/__w/dxos/dxos/packages/ui/react-ui-mosaic/src/components/Mosaic/Stack.tsx";
802
739
  var MOSAIC_STACK_NAME = "MosaicStack";
803
- var MosaicStackInner = /* @__PURE__ */ forwardRef5(({ role = "list", orientation: orientationProp = "vertical", draggable: draggable2 = true, items, getId, Tile, debug, ...props }, forwardedRef) => {
804
- const { className, ...rest } = composableProps4(props);
805
- invariant(Tile, void 0, {
806
- F: __dxlog_file2,
807
- L: 63,
808
- S: void 0,
809
- A: [
810
- "Tile",
811
- ""
812
- ]
813
- });
814
- const { id, orientation = orientationProp, dragging } = useMosaicContainerContext(MOSAIC_STACK_NAME);
740
+ var MosaicStackInner = composable2(({ orientation: orientationProp = "vertical", getId, items, scrollIntoView = true, Tile, draggable: draggable2 = true, debug, ...props }, forwardedRef) => {
741
+ const { id, orientation = orientationProp, dragging, currentId, registerScrollTo } = useMosaicContainerContext(MOSAIC_STACK_NAME);
815
742
  const visibleItems = useVisibleItems({
816
743
  id,
817
744
  items,
818
745
  dragging: dragging?.source.data,
819
746
  getId
820
747
  });
821
- invariant(orientation === "vertical" || orientation === "horizontal", `Invalid orientation: ${orientation}`, {
822
- F: __dxlog_file2,
823
- L: 66,
824
- S: void 0,
825
- A: [
826
- "orientation === 'vertical' || orientation === 'horizontal'",
827
- "`Invalid orientation: ${orientation}`"
828
- ]
829
- });
830
- return /* @__PURE__ */ React6.createElement("div", {
831
- ...rest,
832
- role,
833
- className: mx6("flex", orientation === "horizontal" && "h-full [&>*]:shrink-0", orientation === "vertical" && "flex-col", className),
834
- ref: forwardedRef
835
- }, /* @__PURE__ */ React6.createElement(InternalPlaceholder, {
748
+ invariant(orientation === "vertical" || orientation === "horizontal", `Invalid orientation: ${orientation}`, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 45, S: void 0, A: ["orientation === 'vertical' || orientation === 'horizontal'", "`Invalid orientation: ${orientation}`"] });
749
+ const rootRef = useRef5(null);
750
+ const scrollToId = useCallback3((targetId) => {
751
+ if (!scrollIntoView) {
752
+ return;
753
+ }
754
+ const el = rootRef.current?.querySelector(`[data-object-id="${CSS.escape(targetId)}"]`);
755
+ el?.scrollIntoView({
756
+ block: "nearest",
757
+ behavior: "smooth"
758
+ });
759
+ }, [
760
+ scrollIntoView
761
+ ]);
762
+ useEffect3(() => {
763
+ registerScrollTo(scrollToId);
764
+ return () => registerScrollTo(void 0);
765
+ }, [
766
+ registerScrollTo,
767
+ scrollToId
768
+ ]);
769
+ const composedRef = useComposedRefs3(rootRef, forwardedRef);
770
+ return /* @__PURE__ */ React5.createElement("div", {
771
+ ...composableProps3(props, {
772
+ role: "list",
773
+ classNames: [
774
+ "flex",
775
+ orientation === "horizontal" && "h-full [&>*]:shrink-0",
776
+ orientation === "vertical" && "flex-col"
777
+ ]
778
+ }),
779
+ ref: composedRef
780
+ }, draggable2 && /* @__PURE__ */ React5.createElement(InternalPlaceholder, {
836
781
  orientation,
837
782
  location: 0.5
838
- }), visibleItems?.map((item, index) => /* @__PURE__ */ React6.createElement(Fragment, {
783
+ }), visibleItems?.map((item, index) => /* @__PURE__ */ React5.createElement(Fragment, {
839
784
  key: getId(item)
840
- }, /* @__PURE__ */ React6.createElement(Tile, {
785
+ }, /* @__PURE__ */ React5.createElement(Tile, {
841
786
  id: getId(item),
842
787
  data: item,
843
788
  location: index + 1,
844
789
  draggable: draggable2,
790
+ current: getId(item) === currentId,
845
791
  debug
846
- }), /* @__PURE__ */ React6.createElement(InternalPlaceholder, {
792
+ }), draggable2 && /* @__PURE__ */ React5.createElement(InternalPlaceholder, {
847
793
  orientation,
848
794
  location: index + 1.5
849
795
  }))));
@@ -851,36 +797,86 @@ var MosaicStackInner = /* @__PURE__ */ forwardRef5(({ role = "list", orientation
851
797
  MosaicStackInner.displayName = MOSAIC_STACK_NAME;
852
798
  var MosaicStack = MosaicStackInner;
853
799
  var MOSAIC_VIRTUAL_STACK_NAME = "MosaicVirtualStack";
854
- var MosaicVirtualStackInner = /* @__PURE__ */ forwardRef5(({ role = "list", orientation = "vertical", items, getId, Tile, estimateSize, getScrollElement, overscan = 8, onChange, debug, ...props }, forwardedRef) => {
855
- const { className, ...rest } = composableProps4(props);
856
- invariant(Tile, void 0, {
857
- F: __dxlog_file2,
858
- L: 128,
859
- S: void 0,
860
- A: [
861
- "Tile",
862
- ""
863
- ]
864
- });
865
- const { id, dragging } = useMosaicContainerContext(MOSAIC_VIRTUAL_STACK_NAME);
800
+ var MosaicVirtualStackInner = /* @__PURE__ */ forwardRef2(({ orientation = "vertical", getId, items, scrollIntoView = true, Tile, estimateSize, getScrollElement, overscan = 8, gap, onChange, draggable: draggable2 = true, debug, ...props }, forwardedRef) => {
801
+ invariant(Tile, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 101, S: void 0, A: ["Tile", ""] });
802
+ const { id, dragging, currentId, registerScrollTo } = useMosaicContainerContext(MOSAIC_VIRTUAL_STACK_NAME);
866
803
  const visibleItems = useVisibleItems({
867
804
  id,
868
805
  items,
869
806
  dragging: dragging?.source.data,
870
807
  getId
871
808
  });
809
+ const wrappedEstimateSize = draggable2 ? (index) => index % 2 === 0 ? 0 : estimateSize(Math.floor(index / 2)) : estimateSize;
872
810
  const virtualizer = useVirtualizer({
873
- count: visibleItems.length * 2 + 1,
874
- estimateSize,
811
+ // NOTE: When draggable we double the number of items to allow for placeholders.
812
+ count: draggable2 ? visibleItems.length * 2 + 1 : visibleItems.length,
813
+ estimateSize: wrappedEstimateSize,
814
+ gap,
815
+ // Key measurements by stable item ID so the size cache survives scrolling;
816
+ // without this, measurements are indexed by position and are lost when items reorder.
817
+ getItemKey: draggable2 ? (index) => index % 2 === 0 ? `ph-${index}` : getId(visibleItems[Math.floor(index / 2)]) : (index) => getId(visibleItems[index]),
875
818
  getScrollElement,
876
819
  overscan,
877
820
  onChange
878
821
  });
822
+ const scrollToId = useCallback3((targetId) => {
823
+ const itemIndex = visibleItems.findIndex((item) => getId(item) === targetId);
824
+ if (itemIndex >= 0) {
825
+ if (!scrollIntoView) {
826
+ return;
827
+ }
828
+ const virtualIndex = draggable2 ? itemIndex * 2 + 1 : itemIndex;
829
+ virtualizer.scrollToIndex(virtualIndex, {
830
+ align: "start",
831
+ behavior: "smooth"
832
+ });
833
+ }
834
+ }, [
835
+ visibleItems,
836
+ getId,
837
+ draggable2,
838
+ virtualizer,
839
+ scrollIntoView
840
+ ]);
841
+ useEffect3(() => {
842
+ registerScrollTo(scrollToId);
843
+ return () => registerScrollTo(void 0);
844
+ }, [
845
+ registerScrollTo,
846
+ scrollToId
847
+ ]);
879
848
  const virtualItems = virtualizer.getVirtualItems();
880
- return /* @__PURE__ */ React6.createElement("div", {
881
- ...rest,
882
- role,
883
- className: mx6("flex", orientation === "horizontal" && "h-full [&>*]:shrink-0", orientation === "vertical" && "flex-col", className),
849
+ const getData = (index) => {
850
+ if (draggable2) {
851
+ if (index % 2 === 0) {
852
+ return {
853
+ location: Math.floor(index / 2) + 0.5
854
+ };
855
+ } else {
856
+ return {
857
+ data: visibleItems[Math.floor(index / 2)],
858
+ location: Math.floor(index / 2) + 1
859
+ };
860
+ }
861
+ } else {
862
+ return {
863
+ data: visibleItems[index],
864
+ location: index + 1
865
+ };
866
+ }
867
+ };
868
+ return /* @__PURE__ */ React5.createElement("div", {
869
+ ...composableProps3(props, {
870
+ role: "list",
871
+ classNames: [
872
+ // shrink-0 is required: this div sets an explicit height via inline style (getTotalSize).
873
+ // Without it, a parent flex container (e.g. ScrollArea.Viewport) would shrink this div
874
+ // to the viewport height, collapsing the scroll content and causing scrollbar drift.
875
+ "flex shrink-0",
876
+ orientation === "horizontal" && "h-full [&>*]:shrink-0",
877
+ orientation === "vertical" && "flex-col"
878
+ ]
879
+ }),
884
880
  style: {
885
881
  position: "relative",
886
882
  ...orientation === "vertical" ? {
@@ -892,43 +888,46 @@ var MosaicVirtualStackInner = /* @__PURE__ */ forwardRef5(({ role = "list", orie
892
888
  }
893
889
  },
894
890
  ref: forwardedRef
895
- }, virtualItems.map((virtualItem) => {
896
- const data = visibleItems[Math.floor(virtualItem.index / 2)];
897
- return /* @__PURE__ */ React6.createElement("div", {
898
- key: virtualItem.key,
899
- "data-index": virtualItem.index,
891
+ }, virtualItems.map(({ key, index, start }) => {
892
+ const { data, location } = getData(index);
893
+ return /* @__PURE__ */ React5.createElement("div", {
894
+ key,
895
+ "data-index": index,
900
896
  style: {
901
897
  position: "absolute",
902
898
  top: 0,
903
899
  left: 0,
904
900
  ...orientation === "vertical" ? {
905
901
  width: "100%",
906
- transform: `translateY(${virtualItem.start}px)`
902
+ transform: `translateY(${start}px)`
907
903
  } : {
908
904
  height: "100%",
909
- transform: `translateX(${virtualItem.start}px)`
905
+ transform: `translateX(${start}px)`
910
906
  }
911
907
  },
912
908
  ref: virtualizer.measureElement
913
- }, virtualItem.index % 2 === 0 ? /* @__PURE__ */ React6.createElement(InternalPlaceholder, {
914
- orientation,
915
- location: Math.floor(virtualItem.index / 2) + 0.5
916
- }) : /* @__PURE__ */ React6.createElement(Tile, {
909
+ }, data ? /* @__PURE__ */ React5.createElement(Tile, {
917
910
  id: getId(data),
918
911
  data,
919
- location: Math.floor(virtualItem.index / 2) + 1,
912
+ location,
913
+ draggable: draggable2,
914
+ current: getId(data) === currentId,
920
915
  debug
916
+ }) : /* @__PURE__ */ React5.createElement(InternalPlaceholder, {
917
+ orientation,
918
+ location
921
919
  }));
922
920
  }));
923
921
  });
924
922
  MosaicVirtualStackInner.displayName = MOSAIC_VIRTUAL_STACK_NAME;
925
923
  var MosaicVirtualStack = MosaicVirtualStackInner;
924
+ MosaicVirtualStack[/* @__PURE__ */ Symbol.for("dxos.composable")] = true;
926
925
  var InternalPlaceholder = (props) => {
927
- return /* @__PURE__ */ React6.createElement(MosaicPlaceholder, {
926
+ return /* @__PURE__ */ React5.createElement(MosaicPlaceholder, {
928
927
  ...props,
929
928
  classNames: styles.placeholder.root
930
- }, /* @__PURE__ */ React6.createElement("div", {
931
- className: mx6("flex h-full bg-base-surface border border-dashed border-separator rounded-xs", styles.placeholder.content)
929
+ }, /* @__PURE__ */ React5.createElement("div", {
930
+ className: mx2("flex h-full bg-base-surface border border-dashed border-separator rounded-xs", styles.placeholder.content)
932
931
  }));
933
932
  };
934
933
  InternalPlaceholder.displayName = "InternalPlaceholder";
@@ -946,8 +945,8 @@ var Mosaic = {
946
945
 
947
946
  export {
948
947
  useVisibleItems,
949
- useFocus,
950
948
  Focus,
949
+ useFocus,
951
950
  styles,
952
951
  getSourceData,
953
952
  useMosaicRootContext,
@@ -955,4 +954,4 @@ export {
955
954
  useMosaicTileContext,
956
955
  Mosaic
957
956
  };
958
- //# sourceMappingURL=chunk-75KCPN67.mjs.map
957
+ //# sourceMappingURL=chunk-HOLJERCP.mjs.map