@dxos/react-ui-mosaic 0.8.4-main.6fa680abb7 → 0.8.4-main.74a063c4e0

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 (65) hide show
  1. package/dist/lib/browser/{chunk-75KCPN67.mjs → chunk-6R7CESWM.mjs} +209 -158
  2. package/dist/lib/browser/chunk-6R7CESWM.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +46 -42
  4. package/dist/lib/browser/index.mjs.map +3 -3
  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 +13 -9
  9. package/dist/lib/browser/testing/index.mjs.map +3 -3
  10. package/dist/lib/node-esm/{chunk-XYWWHOXN.mjs → chunk-U7G2WXDG.mjs} +209 -158
  11. package/dist/lib/node-esm/chunk-U7G2WXDG.mjs.map +7 -0
  12. package/dist/lib/node-esm/index.mjs +46 -42
  13. package/dist/lib/node-esm/index.mjs.map +3 -3
  14. package/dist/lib/node-esm/meta.json +1 -1
  15. package/dist/lib/node-esm/playwright/index.mjs +18 -8
  16. package/dist/lib/node-esm/playwright/index.mjs.map +3 -3
  17. package/dist/lib/node-esm/testing/index.mjs +13 -9
  18. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  19. package/dist/types/src/components/Board/Board.d.ts +13 -6
  20. package/dist/types/src/components/Board/Board.d.ts.map +1 -1
  21. package/dist/types/src/components/Board/Board.stories.d.ts +5 -5
  22. package/dist/types/src/components/Board/Board.stories.d.ts.map +1 -1
  23. package/dist/types/src/components/Board/Column.d.ts +16 -8
  24. package/dist/types/src/components/Board/Column.d.ts.map +1 -1
  25. package/dist/types/src/components/Board/Item.d.ts +3 -0
  26. package/dist/types/src/components/Board/Item.d.ts.map +1 -1
  27. package/dist/types/src/components/Focus/Focus.d.ts +1 -25
  28. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
  29. package/dist/types/src/components/Mosaic/Container.d.ts +17 -9
  30. package/dist/types/src/components/Mosaic/Container.d.ts.map +1 -1
  31. package/dist/types/src/components/Mosaic/Mosaic.d.ts +16 -21
  32. package/dist/types/src/components/Mosaic/Mosaic.d.ts.map +1 -1
  33. package/dist/types/src/components/Mosaic/Placeholder.d.ts.map +1 -1
  34. package/dist/types/src/components/Mosaic/Stack.d.ts +6 -6
  35. package/dist/types/src/components/Mosaic/Stack.d.ts.map +1 -1
  36. package/dist/types/src/components/Mosaic/Stack.stories.d.ts +11 -0
  37. package/dist/types/src/components/Mosaic/Stack.stories.d.ts.map +1 -1
  38. package/dist/types/src/components/Mosaic/Tile.d.ts +19 -9
  39. package/dist/types/src/components/Mosaic/Tile.d.ts.map +1 -1
  40. package/dist/types/src/hooks/useDefaultColumnEventHandler.d.ts.map +1 -1
  41. package/dist/types/src/playwright/board-manager.d.ts.map +1 -1
  42. package/dist/types/src/testing/DefaultStackTile.d.ts.map +1 -1
  43. package/dist/types/src/translations.d.ts +3 -3
  44. package/dist/types/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +26 -26
  46. package/src/AUDIT.md +106 -0
  47. package/src/components/Board/Board.stories.tsx +10 -11
  48. package/src/components/Board/Board.tsx +5 -7
  49. package/src/components/Board/Column.tsx +41 -40
  50. package/src/components/Board/Item.tsx +23 -24
  51. package/src/components/Focus/Focus.tsx +2 -102
  52. package/src/components/Mosaic/Container.tsx +46 -16
  53. package/src/components/Mosaic/Placeholder.tsx +1 -1
  54. package/src/components/Mosaic/Stack.stories.tsx +125 -69
  55. package/src/components/Mosaic/Stack.tsx +139 -50
  56. package/src/components/Mosaic/Tile.tsx +41 -34
  57. package/src/hooks/useContainerDebug.tsx +1 -1
  58. package/src/hooks/useDefaultColumnEventHandler.ts +0 -1
  59. package/src/playwright/board-manager.ts +18 -13
  60. package/src/playwright/smoke.spec.ts +10 -5
  61. package/src/testing/CardContainer.tsx +2 -2
  62. package/src/testing/DefaultStackTile.tsx +22 -19
  63. package/src/translations.ts +3 -3
  64. package/dist/lib/browser/chunk-75KCPN67.mjs.map +0 -7
  65. 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,23 @@ 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";
69
+ import { mx } from "@dxos/ui-theme";
119
70
  var __dxlog_file = "/__w/dxos/dxos/packages/ui/react-ui-mosaic/src/components/Mosaic/Root.tsx";
120
- var [MosaicRootContextProvider, useMosaicRootContext] = createContext2("MosaicRoot");
71
+ var [MosaicRootContextProvider, useMosaicRootContext] = createContext("MosaicRoot");
121
72
  var MOSAIC_ROOT_NAME = "Mosaic.Root";
122
73
  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();
74
+ var MosaicRoot = /* @__PURE__ */ forwardRef(({ classNames, children, asChild, debug }, forwardedRef) => {
75
+ const rootRef = useRef(null);
76
+ const composedRef = useComposedRefs(rootRef, forwardedRef);
77
+ const Comp = asChild ? Slot : Primitive.div;
78
+ const [handlers, setHandlers] = useState({});
79
+ const [dragging, setDragging] = useState();
129
80
  const getSourceHandler = useCallback((source) => {
130
81
  const data = source.data;
131
82
  return {
@@ -341,7 +292,7 @@ var MosaicRoot = /* @__PURE__ */ forwardRef2(({ classNames, children, asChild, d
341
292
  getSourceHandler,
342
293
  getTargetHandler
343
294
  ]);
344
- return /* @__PURE__ */ React2.createElement(MosaicRootContextProvider, {
295
+ return /* @__PURE__ */ React.createElement(MosaicRootContextProvider, {
345
296
  containers: handlers,
346
297
  addContainer: (container) => setHandlers((containers) => ({
347
298
  ...containers,
@@ -354,8 +305,8 @@ var MosaicRoot = /* @__PURE__ */ forwardRef2(({ classNames, children, asChild, d
354
305
  };
355
306
  }),
356
307
  dragging
357
- }, /* @__PURE__ */ React2.createElement(Comp, {
358
- className: mx2("group", classNames),
308
+ }, /* @__PURE__ */ React.createElement(Comp, {
309
+ className: mx("group", classNames),
359
310
  [`data-${MOSAIC_ROOT_DEBUG_ATTR}`]: debug,
360
311
  ref: composedRef
361
312
  }, children));
@@ -363,39 +314,53 @@ var MosaicRoot = /* @__PURE__ */ forwardRef2(({ classNames, children, asChild, d
363
314
  MosaicRoot.displayName = MOSAIC_ROOT_NAME;
364
315
 
365
316
  // src/components/Mosaic/Container.tsx
317
+ import { autoScrollForElements } from "@atlaskit/pragmatic-drag-and-drop-auto-scroll/element";
366
318
  import { combine as combine2 } from "@atlaskit/pragmatic-drag-and-drop/combine";
367
319
  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";
320
+ import { useComposedRefs as useComposedRefs2 } from "@radix-ui/react-compose-refs";
321
+ import { createContext as createContext2 } from "@radix-ui/react-context";
322
+ import { Primitive as Primitive2 } from "@radix-ui/react-primitive";
323
+ import { Slot as Slot2 } from "@radix-ui/react-slot";
373
324
  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";
325
+ import React2, { useCallback as useCallback2, useEffect as useEffect2, useMemo as useMemo2, useRef as useRef2, useState as useState2 } from "react";
326
+ import { composable, composableProps, mx as mx2 } from "@dxos/ui-theme";
376
327
  import { isTruthy } from "@dxos/util";
377
328
  var MOSAIC_CONTAINER_NAME = "Mosaic.Container";
378
- var [MosaicContainerContextProvider, useMosaicContainerContext] = createContext3("MosaicContainer");
329
+ var [MosaicContainerContextProvider, useMosaicContainerContext] = createContext2("MosaicContainer");
379
330
  var MOSAIC_CONTAINER_STATE_ATTR = "mosaic-container-state";
380
331
  var MOSAIC_CONTAINER_PLACEHOLDER_WIDTH = "--mosaic-placeholder-width";
381
332
  var MOSAIC_CONTAINER_PLACEHOLDER_HEIGHT = "--mosaic-placeholder-height";
382
333
  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);
334
+ var MosaicContainer = composable(({ children, eventHandler: eventHandlerProp, orientation = "vertical", asChild, autoScroll: autoscrollElement, withFocus, currentId, onCurrentChange, debug, ...props }, forwardedRef) => {
335
+ const { className, ...rest } = composableProps(props);
336
+ const Comp = asChild ? Slot2 : Primitive2.div;
337
+ const rootRef = useRef2(null);
338
+ const composedRef = useComposedRefs2(rootRef, forwardedRef);
388
339
  const eventHandler = useMemo2(() => eventHandlerProp ?? {
389
340
  id: `mosaic-container-${counter++}`
390
341
  }, [
391
342
  eventHandlerProp
392
343
  ]);
393
344
  const { dragging } = useMosaicRootContext(MOSAIC_CONTAINER_NAME);
394
- const [state, setState] = useState3({
345
+ const [state, setState] = useState2({
395
346
  type: "idle"
396
347
  });
397
- const [activeLocation, setActiveLocation] = useState3();
398
- const [scrolling, setScrolling] = useState3(false);
348
+ const [activeLocation, setActiveLocation] = useState2();
349
+ const [scrolling, setScrolling] = useState2(false);
350
+ const setCurrentId = useCallback2((id) => onCurrentChange?.(id), [
351
+ onCurrentChange
352
+ ]);
353
+ const scrollToRef = useRef2(void 0);
354
+ const registerScrollTo = useCallback2((fn) => {
355
+ scrollToRef.current = fn;
356
+ }, []);
357
+ useEffect2(() => {
358
+ if (currentId) {
359
+ scrollToRef.current?.(currentId);
360
+ }
361
+ }, [
362
+ currentId
363
+ ]);
399
364
  const { setFocus } = useFocus();
400
365
  useEffect2(() => {
401
366
  if (withFocus) {
@@ -530,7 +495,7 @@ var MosaicContainer = /* @__PURE__ */ forwardRef3(({ children, eventHandler: eve
530
495
  data,
531
496
  autoscrollElement
532
497
  ]);
533
- return /* @__PURE__ */ React3.createElement(MosaicContainerContextProvider, {
498
+ return /* @__PURE__ */ React2.createElement(MosaicContainerContextProvider, {
534
499
  id: eventHandler.id,
535
500
  eventHandler,
536
501
  orientation,
@@ -538,9 +503,12 @@ var MosaicContainer = /* @__PURE__ */ forwardRef3(({ children, eventHandler: eve
538
503
  dragging: state.type === "active" ? dragging : void 0,
539
504
  scrolling,
540
505
  activeLocation,
541
- setActiveLocation
542
- }, /* @__PURE__ */ React3.createElement(Comp, {
543
- className: mx3("h-full", className),
506
+ setActiveLocation,
507
+ currentId,
508
+ setCurrentId,
509
+ registerScrollTo
510
+ }, /* @__PURE__ */ React2.createElement(Comp, {
511
+ className: mx2("h-full", className),
544
512
  style: {
545
513
  [MOSAIC_CONTAINER_PLACEHOLDER_WIDTH]: state.type === "active" && state.bounds ? `${state.bounds.width}px` : "0px",
546
514
  [MOSAIC_CONTAINER_PLACEHOLDER_HEIGHT]: state.type === "active" && state.bounds ? `${state.bounds.height}px` : "0px"
@@ -553,28 +521,27 @@ var MosaicContainer = /* @__PURE__ */ forwardRef3(({ children, eventHandler: eve
553
521
  MosaicContainer.displayName = MOSAIC_CONTAINER_NAME;
554
522
 
555
523
  // src/components/Mosaic/Tile.tsx
524
+ import { attachClosestEdge, extractClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
556
525
  import { combine as combine3 } from "@atlaskit/pragmatic-drag-and-drop/combine";
557
526
  import { draggable, dropTargetForElements as dropTargetForElements2 } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
558
527
  import { preserveOffsetOnSource } from "@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source";
559
528
  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
529
  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";
530
+ import { createContext as createContext3 } from "@radix-ui/react-context";
531
+ import { Primitive as Primitive3 } from "@radix-ui/react-primitive";
532
+ import { Slot as Slot3 } from "@radix-ui/react-slot";
533
+ import React3, { useLayoutEffect, useMemo as useMemo3, useRef as useRef3, useState as useState3 } from "react";
566
534
  import { createPortal } from "react-dom";
567
- import { composableProps as composableProps3, mx as mx4 } from "@dxos/ui-theme";
535
+ import { composableProps as composableProps2, slottable } from "@dxos/ui-theme";
568
536
  var MOSAIC_TILE_NAME = "Mosaic.Tile";
569
- var [MosaicTileContextProvider, useMosaicTileContext] = createContext4("MosaicTile");
537
+ var [MosaicTileContextProvider, useMosaicTileContext] = createContext3("MosaicTile");
570
538
  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);
539
+ var MosaicTile = slottable(({ children, asChild, dragHandle, allowedEdges: allowedEdgesProp, location, id, data: dataProp, draggable: draggableProp, current: _current, debug: _, ...props }, forwardedRef) => {
540
+ const Comp = asChild ? Slot3 : Primitive3.div;
541
+ const rootRef = useRef3(null);
575
542
  const composedRef = composeRefs(rootRef, forwardedRef);
576
543
  const { id: containerId, eventHandler, orientation, scrolling, setActiveLocation } = useMosaicContainerContext(MOSAIC_TILE_NAME);
577
- const [state, setState] = useState4({
544
+ const [state, setState] = useState3({
578
545
  type: "idle"
579
546
  });
580
547
  const allowedEdges = useMemo3(() => allowedEdgesProp || (orientation === "vertical" ? [
@@ -600,7 +567,7 @@ var MosaicTile = /* @__PURE__ */ forwardRef4(({ children, asChild, dragHandle, a
600
567
  ]);
601
568
  useLayoutEffect(() => {
602
569
  const root = rootRef.current;
603
- if (!root || !containerId || scrolling) {
570
+ if (!draggableProp || !root || !containerId || scrolling) {
604
571
  return;
605
572
  }
606
573
  const handleChange = ({ self, source }) => {
@@ -694,6 +661,8 @@ var MosaicTile = /* @__PURE__ */ forwardRef4(({ children, asChild, dragHandle, a
694
661
  );
695
662
  }, [
696
663
  rootRef,
664
+ forwardedRef,
665
+ containerId,
697
666
  dragHandle,
698
667
  eventHandler,
699
668
  data,
@@ -701,19 +670,22 @@ var MosaicTile = /* @__PURE__ */ forwardRef4(({ children, asChild, dragHandle, a
701
670
  allowedEdges,
702
671
  setActiveLocation
703
672
  ]);
704
- return /* @__PURE__ */ React4.createElement(MosaicTileContextProvider, {
673
+ const { className, ...rest } = composableProps2(props, {
674
+ classNames: "relative outline-none"
675
+ });
676
+ return /* @__PURE__ */ React3.createElement(MosaicTileContextProvider, {
705
677
  state
706
- }, /* @__PURE__ */ React4.createElement(Comp, {
678
+ }, /* @__PURE__ */ React3.createElement(Comp, {
707
679
  ...rest,
680
+ "data-mosaic-tile-id": id,
708
681
  [`data-${MOSAIC_TILE_STATE_ATTR}`]: state.type,
709
682
  role: "listitem",
710
- className: mx4("relative", className),
683
+ className,
711
684
  ref: composedRef
712
- }, children), state.type === "preview" && /* @__PURE__ */ createPortal(/* @__PURE__ */ React4.createElement(Comp, {
685
+ }, children), state.type === "preview" && /* @__PURE__ */ createPortal(/* @__PURE__ */ React3.createElement(Comp, {
713
686
  // NOTE: Use to control appearance while dragging.
714
687
  [`data-${MOSAIC_TILE_STATE_ATTR}`]: state.type,
715
- // TODO(burdon): Configure drop animation.
716
- className: mx4("relative", className),
688
+ className,
717
689
  style: {
718
690
  width: `${state.rect.width}px`,
719
691
  height: `${state.rect.height}px`
@@ -723,18 +695,18 @@ var MosaicTile = /* @__PURE__ */ forwardRef4(({ children, asChild, dragHandle, a
723
695
  MosaicTile.displayName = MOSAIC_TILE_NAME;
724
696
 
725
697
  // src/components/Mosaic/Placeholder.tsx
726
- import { dropTargetForElements as dropTargetForElements3 } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
727
698
  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";
699
+ import { dropTargetForElements as dropTargetForElements3 } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
700
+ import { Primitive as Primitive4 } from "@radix-ui/react-primitive";
701
+ import { Slot as Slot4 } from "@radix-ui/react-slot";
702
+ import React4, { useLayoutEffect as useLayoutEffect2, useMemo as useMemo4, useRef as useRef4 } from "react";
703
+ import { mx as mx3 } from "@dxos/ui-theme";
732
704
  var MOSAIC_PLACEHOLDER_NAME = "Mosaic.Placeholder";
733
705
  var MOSAIC_PLACEHOLDER_ORIENTATION_ATTR = "mosaic-placeholder-orientation";
734
706
  var MOSAIC_PLACEHOLDER_STATE_ATTR = "mosaic-placeholder-state";
735
707
  var MosaicPlaceholder = ({ classNames, children, asChild, orientation = "vertical", location }) => {
736
- const rootRef = useRef5(null);
737
- const Comp = asChild ? Slot5 : Primitive5.div;
708
+ const rootRef = useRef4(null);
709
+ const Comp = asChild ? Slot4 : Primitive4.div;
738
710
  const { id: containerId, eventHandler, scrolling, activeLocation, setActiveLocation } = useMosaicContainerContext(MOSAIC_PLACEHOLDER_NAME);
739
711
  const data = useMemo4(() => ({
740
712
  type: "placeholder",
@@ -774,11 +746,11 @@ var MosaicPlaceholder = ({ classNames, children, asChild, orientation = "vertica
774
746
  scrolling,
775
747
  setActiveLocation
776
748
  ]);
777
- return /* @__PURE__ */ React5.createElement(Comp, {
749
+ return /* @__PURE__ */ React4.createElement(Comp, {
778
750
  [`data-${MOSAIC_PLACEHOLDER_ORIENTATION_ATTR}`]: orientation,
779
751
  [`data-${MOSAIC_PLACEHOLDER_STATE_ATTR}`]: data.location === activeLocation ? "active" : "idle",
780
752
  role: "none",
781
- className: mx5("relative", classNames),
753
+ className: mx3("relative", classNames),
782
754
  ref: rootRef
783
755
  }, children);
784
756
  };
@@ -786,7 +758,7 @@ MosaicPlaceholder.displayName = MOSAIC_PLACEHOLDER_NAME;
786
758
  var DROP_INDICATOR_NAME = "Mosaic.DropIndicator";
787
759
  var MosaicDropIndicator = (props) => {
788
760
  const { state } = useMosaicTileContext(DROP_INDICATOR_NAME);
789
- return state.type === "target" && state.closestEdge ? /* @__PURE__ */ React5.createElement(NaturalDropIndicator, {
761
+ return state.type === "target" && state.closestEdge ? /* @__PURE__ */ React4.createElement(NaturalDropIndicator, {
790
762
  ...props,
791
763
  edge: state.closestEdge
792
764
  }) : null;
@@ -794,24 +766,24 @@ var MosaicDropIndicator = (props) => {
794
766
  MosaicDropIndicator.displayName = DROP_INDICATOR_NAME;
795
767
 
796
768
  // src/components/Mosaic/Stack.tsx
769
+ import { useComposedRefs as useComposedRefs3 } from "@radix-ui/react-compose-refs";
797
770
  import { useVirtualizer } from "@tanstack/react-virtual";
798
- import React6, { Fragment, forwardRef as forwardRef5 } from "react";
771
+ import React5, { forwardRef as forwardRef2, Fragment, useCallback as useCallback3, useEffect as useEffect3, useRef as useRef5 } from "react";
799
772
  import { invariant } from "@dxos/invariant";
800
- import { composableProps as composableProps4, mx as mx6 } from "@dxos/ui-theme";
773
+ import { composable as composable2, composableProps as composableProps3, mx as mx4 } from "@dxos/ui-theme";
801
774
  var __dxlog_file2 = "/__w/dxos/dxos/packages/ui/react-ui-mosaic/src/components/Mosaic/Stack.tsx";
802
775
  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);
776
+ var MosaicStackInner = composable2(({ getId, orientation: orientationProp = "vertical", items, Tile, draggable: draggable2 = true, debug, ...props }, forwardedRef) => {
805
777
  invariant(Tile, void 0, {
806
778
  F: __dxlog_file2,
807
- L: 63,
779
+ L: 73,
808
780
  S: void 0,
809
781
  A: [
810
782
  "Tile",
811
783
  ""
812
784
  ]
813
785
  });
814
- const { id, orientation = orientationProp, dragging } = useMosaicContainerContext(MOSAIC_STACK_NAME);
786
+ const { id, orientation = orientationProp, dragging, currentId, registerScrollTo } = useMosaicContainerContext(MOSAIC_STACK_NAME);
815
787
  const visibleItems = useVisibleItems({
816
788
  id,
817
789
  items,
@@ -820,30 +792,52 @@ var MosaicStackInner = /* @__PURE__ */ forwardRef5(({ role = "list", orientation
820
792
  });
821
793
  invariant(orientation === "vertical" || orientation === "horizontal", `Invalid orientation: ${orientation}`, {
822
794
  F: __dxlog_file2,
823
- L: 66,
795
+ L: 82,
824
796
  S: void 0,
825
797
  A: [
826
798
  "orientation === 'vertical' || orientation === 'horizontal'",
827
799
  "`Invalid orientation: ${orientation}`"
828
800
  ]
829
801
  });
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, {
802
+ const rootRef = useRef5(null);
803
+ const scrollToId = useCallback3((targetId) => {
804
+ const el = rootRef.current?.querySelector(`[data-mosaic-tile-id="${CSS.escape(targetId)}"]`);
805
+ el?.scrollIntoView({
806
+ block: "nearest",
807
+ behavior: "smooth"
808
+ });
809
+ }, []);
810
+ useEffect3(() => {
811
+ registerScrollTo(scrollToId);
812
+ return () => registerScrollTo(void 0);
813
+ }, [
814
+ registerScrollTo,
815
+ scrollToId
816
+ ]);
817
+ const composedRef = useComposedRefs3(rootRef, forwardedRef);
818
+ return /* @__PURE__ */ React5.createElement("div", {
819
+ ...composableProps3(props, {
820
+ role: "list",
821
+ classNames: [
822
+ "flex",
823
+ orientation === "horizontal" && "h-full [&>*]:shrink-0",
824
+ orientation === "vertical" && "flex-col"
825
+ ]
826
+ }),
827
+ ref: composedRef
828
+ }, draggable2 && /* @__PURE__ */ React5.createElement(InternalPlaceholder, {
836
829
  orientation,
837
830
  location: 0.5
838
- }), visibleItems?.map((item, index) => /* @__PURE__ */ React6.createElement(Fragment, {
831
+ }), visibleItems?.map((item, index) => /* @__PURE__ */ React5.createElement(Fragment, {
839
832
  key: getId(item)
840
- }, /* @__PURE__ */ React6.createElement(Tile, {
833
+ }, /* @__PURE__ */ React5.createElement(Tile, {
841
834
  id: getId(item),
842
835
  data: item,
843
836
  location: index + 1,
844
837
  draggable: draggable2,
838
+ current: getId(item) === currentId,
845
839
  debug
846
- }), /* @__PURE__ */ React6.createElement(InternalPlaceholder, {
840
+ }), draggable2 && /* @__PURE__ */ React5.createElement(InternalPlaceholder, {
847
841
  orientation,
848
842
  location: index + 1.5
849
843
  }))));
@@ -851,36 +845,90 @@ var MosaicStackInner = /* @__PURE__ */ forwardRef5(({ role = "list", orientation
851
845
  MosaicStackInner.displayName = MOSAIC_STACK_NAME;
852
846
  var MosaicStack = MosaicStackInner;
853
847
  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);
848
+ var MosaicVirtualStackInner = /* @__PURE__ */ forwardRef2(({ orientation = "vertical", items, getId, Tile, estimateSize, getScrollElement, overscan = 8, gap, onChange, draggable: draggable2 = true, debug, ...props }, forwardedRef) => {
856
849
  invariant(Tile, void 0, {
857
850
  F: __dxlog_file2,
858
- L: 128,
851
+ L: 163,
859
852
  S: void 0,
860
853
  A: [
861
854
  "Tile",
862
855
  ""
863
856
  ]
864
857
  });
865
- const { id, dragging } = useMosaicContainerContext(MOSAIC_VIRTUAL_STACK_NAME);
858
+ const { id, dragging, currentId, registerScrollTo } = useMosaicContainerContext(MOSAIC_VIRTUAL_STACK_NAME);
866
859
  const visibleItems = useVisibleItems({
867
860
  id,
868
861
  items,
869
862
  dragging: dragging?.source.data,
870
863
  getId
871
864
  });
865
+ const wrappedEstimateSize = draggable2 ? (index) => index % 2 === 0 ? 0 : estimateSize(Math.floor(index / 2)) : estimateSize;
872
866
  const virtualizer = useVirtualizer({
873
- count: visibleItems.length * 2 + 1,
874
- estimateSize,
867
+ // NOTE: When draggable we double the number of items to allow for placeholders.
868
+ count: draggable2 ? visibleItems.length * 2 + 1 : visibleItems.length,
869
+ estimateSize: wrappedEstimateSize,
870
+ gap,
871
+ // Key measurements by stable item ID so the size cache survives scrolling;
872
+ // without this, measurements are indexed by position and are lost when items reorder.
873
+ getItemKey: draggable2 ? (index) => index % 2 === 0 ? `ph-${index}` : getId(visibleItems[Math.floor(index / 2)]) : (index) => getId(visibleItems[index]),
875
874
  getScrollElement,
876
875
  overscan,
877
876
  onChange
878
877
  });
878
+ const scrollToId = useCallback3((targetId) => {
879
+ const itemIndex = visibleItems.findIndex((item) => getId(item) === targetId);
880
+ if (itemIndex >= 0) {
881
+ const virtualIndex = draggable2 ? itemIndex * 2 + 1 : itemIndex;
882
+ virtualizer.scrollToIndex(virtualIndex, {
883
+ align: "start",
884
+ behavior: "smooth"
885
+ });
886
+ }
887
+ }, [
888
+ visibleItems,
889
+ getId,
890
+ draggable2,
891
+ virtualizer
892
+ ]);
893
+ useEffect3(() => {
894
+ registerScrollTo(scrollToId);
895
+ return () => registerScrollTo(void 0);
896
+ }, [
897
+ registerScrollTo,
898
+ scrollToId
899
+ ]);
879
900
  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),
901
+ const getData = (index) => {
902
+ if (draggable2) {
903
+ if (index % 2 === 0) {
904
+ return {
905
+ location: Math.floor(index / 2) + 0.5
906
+ };
907
+ } else {
908
+ return {
909
+ data: visibleItems[Math.floor(index / 2)],
910
+ location: Math.floor(index / 2) + 1
911
+ };
912
+ }
913
+ } else {
914
+ return {
915
+ data: visibleItems[index],
916
+ location: index + 1
917
+ };
918
+ }
919
+ };
920
+ return /* @__PURE__ */ React5.createElement("div", {
921
+ ...composableProps3(props, {
922
+ role: "list",
923
+ classNames: [
924
+ // shrink-0 is required: this div sets an explicit height via inline style (getTotalSize).
925
+ // Without it, a parent flex container (e.g. ScrollArea.Viewport) would shrink this div
926
+ // to the viewport height, collapsing the scroll content and causing scrollbar drift.
927
+ "flex shrink-0",
928
+ orientation === "horizontal" && "h-full [&>*]:shrink-0",
929
+ orientation === "vertical" && "flex-col"
930
+ ]
931
+ }),
884
932
  style: {
885
933
  position: "relative",
886
934
  ...orientation === "vertical" ? {
@@ -892,43 +940,46 @@ var MosaicVirtualStackInner = /* @__PURE__ */ forwardRef5(({ role = "list", orie
892
940
  }
893
941
  },
894
942
  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,
943
+ }, virtualItems.map(({ key, index, start }) => {
944
+ const { data, location } = getData(index);
945
+ return /* @__PURE__ */ React5.createElement("div", {
946
+ key,
947
+ "data-index": index,
900
948
  style: {
901
949
  position: "absolute",
902
950
  top: 0,
903
951
  left: 0,
904
952
  ...orientation === "vertical" ? {
905
953
  width: "100%",
906
- transform: `translateY(${virtualItem.start}px)`
954
+ transform: `translateY(${start}px)`
907
955
  } : {
908
956
  height: "100%",
909
- transform: `translateX(${virtualItem.start}px)`
957
+ transform: `translateX(${start}px)`
910
958
  }
911
959
  },
912
960
  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, {
961
+ }, data ? /* @__PURE__ */ React5.createElement(Tile, {
917
962
  id: getId(data),
918
963
  data,
919
- location: Math.floor(virtualItem.index / 2) + 1,
964
+ location,
965
+ draggable: draggable2,
966
+ current: getId(data) === currentId,
920
967
  debug
968
+ }) : /* @__PURE__ */ React5.createElement(InternalPlaceholder, {
969
+ orientation,
970
+ location
921
971
  }));
922
972
  }));
923
973
  });
924
974
  MosaicVirtualStackInner.displayName = MOSAIC_VIRTUAL_STACK_NAME;
925
975
  var MosaicVirtualStack = MosaicVirtualStackInner;
976
+ MosaicVirtualStack[/* @__PURE__ */ Symbol.for("dxos.composable")] = true;
926
977
  var InternalPlaceholder = (props) => {
927
- return /* @__PURE__ */ React6.createElement(MosaicPlaceholder, {
978
+ return /* @__PURE__ */ React5.createElement(MosaicPlaceholder, {
928
979
  ...props,
929
980
  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)
981
+ }, /* @__PURE__ */ React5.createElement("div", {
982
+ className: mx4("flex h-full bg-base-surface border border-dashed border-separator rounded-xs", styles.placeholder.content)
932
983
  }));
933
984
  };
934
985
  InternalPlaceholder.displayName = "InternalPlaceholder";
@@ -946,8 +997,8 @@ var Mosaic = {
946
997
 
947
998
  export {
948
999
  useVisibleItems,
949
- useFocus,
950
1000
  Focus,
1001
+ useFocus,
951
1002
  styles,
952
1003
  getSourceData,
953
1004
  useMosaicRootContext,
@@ -955,4 +1006,4 @@ export {
955
1006
  useMosaicTileContext,
956
1007
  Mosaic
957
1008
  };
958
- //# sourceMappingURL=chunk-75KCPN67.mjs.map
1009
+ //# sourceMappingURL=chunk-6R7CESWM.mjs.map