@dxos/react-ui-mosaic 0.6.4 → 0.6.5-staging.42fccfe

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.
@@ -17,7 +17,7 @@ var MosaicContainerContext = /* @__PURE__ */ createContext({
17
17
  type: DEFAULT_TYPE,
18
18
  Component: DEFAULT_COMPONENT
19
19
  });
20
- var MosaicContainer = ({ children, id, debug, type = DEFAULT_TYPE, Component: Component2 = DEFAULT_COMPONENT, transitionDuration = DEFAULT_TRANSITION, modifier, getOverlayProps, getOverlayStyle, onOver, onDrop }) => {
20
+ var MosaicContainer = ({ children, id, debug, type = DEFAULT_TYPE, Component: Component2 = DEFAULT_COMPONENT, transitionDuration = DEFAULT_TRANSITION, modifier, getOverlayProps, getOverlayStyle, onOver, onDrop, onMove, onDragEnd }) => {
21
21
  const mosaic = useMosaic();
22
22
  const container = {
23
23
  id,
@@ -29,7 +29,9 @@ var MosaicContainer = ({ children, id, debug, type = DEFAULT_TYPE, Component: Co
29
29
  getOverlayProps,
30
30
  getOverlayStyle,
31
31
  onOver,
32
- onDrop
32
+ onDrop,
33
+ onMove,
34
+ onDragEnd
33
35
  };
34
36
  useEffect(() => {
35
37
  mosaic.setContainer(container.id, container);
@@ -78,7 +80,7 @@ var swapItems = (items, from, to) => {
78
80
  };
79
81
 
80
82
  // packages/ui/react-ui-mosaic/src/mosaic/util/path.ts
81
- var SEPARATOR = "/";
83
+ var SEPARATOR = "~";
82
84
  var Path = {
83
85
  create: (...args) => args.join(SEPARATOR),
84
86
  parts: (path) => path.split(SEPARATOR),
@@ -119,6 +121,9 @@ DefaultComponent.displayName = "DefaultComponent";
119
121
  // packages/ui/react-ui-mosaic/src/mosaic/Root.tsx
120
122
  var DEFAULT_COMPONENT_ID = "__default";
121
123
  var MosaicContext = /* @__PURE__ */ createContext2(void 0);
124
+ var defaultDropAnimation = {
125
+ duration: 0
126
+ };
122
127
  var MosaicRoot = ({ Component: Component2 = DefaultComponent, debug, children }) => {
123
128
  const [containers, setContainers] = useState({
124
129
  [DEFAULT_COMPONENT_ID]: {
@@ -142,6 +147,8 @@ var MosaicRoot = ({ Component: Component2 = DefaultComponent, debug, children })
142
147
  const [activeItem, setActiveItem] = useState();
143
148
  const [overItem, setOverItem] = useState();
144
149
  const [operation, setOperation] = useState("reject");
150
+ const [moveDetails, setMoveDetails] = useState();
151
+ const [dropAnimation, setDropAnimation] = useState(defaultDropAnimation);
145
152
  const collisionDetection = (args) => {
146
153
  const pointerCollisions = pointerWithin(args);
147
154
  if (pointerCollisions.length > 0) {
@@ -174,27 +181,53 @@ var MosaicRoot = ({ Component: Component2 = DefaultComponent, debug, children })
174
181
  setActiveItem(pick(event.active.data.current, "path", "type", "item", "position"));
175
182
  };
176
183
  const handleDragMove = (event) => {
184
+ const nextOverItem = pick(event.over?.data.current, "path", "type", "item", "position");
185
+ const nextOverContainer = nextOverItem && nextOverItem?.path ? containers[Path.first(nextOverItem.path)] : void 0;
186
+ if (!event.over || !nextOverItem || !nextOverContainer) {
187
+ setOperation("reject");
188
+ setOverItem(void 0);
189
+ return;
190
+ }
191
+ if (overItem !== nextOverItem) {
192
+ setOverItem(nextOverItem);
193
+ }
194
+ if (activeItem && nextOverItem && nextOverContainer?.onMove) {
195
+ const { operation: nextOperation, details: nextDetails } = nextOverContainer.onMove({
196
+ active: activeItem,
197
+ over: nextOverItem,
198
+ details: {
199
+ delta: event.delta
200
+ }
201
+ });
202
+ setOperation(nextOperation);
203
+ if (
204
+ // always set falsy symbols
205
+ !nextDetails || // always set if details become truthy
206
+ !moveDetails && nextDetails || // only update if details change
207
+ Object.entries(nextDetails).find(([key, value]) => !(key in moveDetails) || moveDetails[key] !== value)
208
+ ) {
209
+ setMoveDetails(nextDetails);
210
+ }
211
+ }
177
212
  };
178
213
  const handleDragOver = (event) => {
179
214
  const overItem2 = pick(event.over?.data.current, "path", "type", "item", "position");
180
- if (overItem2?.item?.id === activeItem?.item.id) {
181
- setOverItem(overItem2);
215
+ const overContainer = overItem2 && overItem2?.path ? containers[Path.first(overItem2.path)] : void 0;
216
+ if (overContainer?.onMove) {
182
217
  return;
183
218
  }
184
219
  const activeContainer = activeItem && containers[Path.first(activeItem.path)];
185
- const overContainer = overItem2?.path && containers[Path.first(overItem2.path)];
186
220
  if (!event.over || !overItem2 || !overContainer || !activeItem || !activeContainer) {
187
221
  setOperation("reject");
188
222
  setOverItem(void 0);
189
223
  return;
190
224
  }
191
225
  let operation2 = "reject";
192
- if (Path.parent(activeItem.path) === Path.parent(overItem2.path)) {
193
- operation2 = "rearrange";
194
- } else if (overContainer.onOver) {
226
+ if (overContainer.onOver) {
195
227
  operation2 = overContainer.onOver({
196
228
  active: activeItem,
197
- over: overItem2
229
+ over: overItem2,
230
+ details: moveDetails
198
231
  });
199
232
  }
200
233
  setOperation(operation2);
@@ -207,23 +240,28 @@ var MosaicRoot = ({ Component: Component2 = DefaultComponent, debug, children })
207
240
  };
208
241
  const handleDragEnd = (event) => {
209
242
  const overContainer = overItem && containers[Path.first(overItem.path)];
210
- if (operation !== "reject" && activeItem && overItem && (activeItem.path !== overItem.path || activeItem.position !== overItem.position)) {
243
+ if (operation !== "reject" && activeItem && overItem) {
244
+ let nextDropAnimation = defaultDropAnimation;
211
245
  const activeContainer = containers[Path.first(activeItem.path)];
212
246
  if (activeContainer) {
213
- activeContainer.onDrop?.({
247
+ nextDropAnimation = activeContainer.onDrop?.({
214
248
  operation,
215
249
  active: activeItem,
216
- over: overItem
250
+ over: overItem,
251
+ details: moveDetails
217
252
  });
218
253
  if (overContainer && overContainer !== activeContainer) {
219
- overContainer.onDrop?.({
254
+ nextDropAnimation = overContainer.onDrop?.({
220
255
  operation,
221
256
  active: activeItem,
222
- over: overItem
257
+ over: overItem,
258
+ details: moveDetails
223
259
  });
224
260
  }
225
261
  }
262
+ setDropAnimation(nextDropAnimation);
226
263
  }
264
+ Object.values(containers).forEach((container) => container?.onDragEnd?.(event));
227
265
  setTimeout(() => {
228
266
  setOperation("reject");
229
267
  setOverItem(void 0);
@@ -236,7 +274,9 @@ var MosaicRoot = ({ Component: Component2 = DefaultComponent, debug, children })
236
274
  setContainer: handleSetContainer,
237
275
  activeItem,
238
276
  overItem,
239
- operation
277
+ operation,
278
+ moveDetails,
279
+ dropAnimation
240
280
  }
241
281
  }, /* @__PURE__ */ React4.createElement(DndContext, {
242
282
  collisionDetection,
@@ -290,7 +330,7 @@ var useItemsWithPreview = ({ path, items }) => {
290
330
  const overParent = (
291
331
  // If over the sortable context itself & active item is foreign, then treat self as the parent.
292
332
  // This allows items to be appended to the end of the sortable.
293
- overItem?.path === path && activeItem && Path.parent(activeItem.path) !== overItem.path ? path : overItem && Path.parent(overItem.path)
333
+ overItem?.path === path && activeItem && Path.parent(activeItem.path) !== overItem.path ? path : overItem && !!overItem.path && Path.parent(overItem.path)
294
334
  );
295
335
  const [lastOverParent, setLastOverParent] = useState2(overParent);
296
336
  useEffect2(() => {
@@ -373,7 +413,7 @@ import React5, { Component, useEffect as useEffect3, useRef, useState as useStat
373
413
  import { log } from "@dxos/log";
374
414
  var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-mosaic/src/mosaic/DragOverlay.tsx";
375
415
  var MosaicDragOverlay = ({ delay = 200, debug = false, ...overlayProps }) => {
376
- const { containers, operation, activeItem, overItem } = useMosaic();
416
+ const { containers, operation, activeItem, overItem, dropAnimation } = useMosaic();
377
417
  const [state, setState] = useState3({});
378
418
  const timer = useRef();
379
419
  useEffect3(() => {
@@ -408,6 +448,7 @@ var MosaicDragOverlay = ({ delay = 200, debug = false, ...overlayProps }) => {
408
448
  /* @__PURE__ */ React5.createElement(DragOverlay, {
409
449
  adjustScale: false,
410
450
  ...overlayProps,
451
+ dropAnimation,
411
452
  style: {
412
453
  ...container?.getOverlayStyle?.()
413
454
  }
@@ -457,7 +498,7 @@ var OverlayErrorBoundary = class extends Component {
457
498
  info
458
499
  }, {
459
500
  F: __dxlog_file,
460
- L: 135,
501
+ L: 140,
461
502
  S: this,
462
503
  C: (f, a) => f(...a)
463
504
  });
@@ -480,7 +521,7 @@ var MosaicSortableContext = ({ id, items = [], direction = "vertical", children
480
521
  const Sortable = direction === "vertical" ? Column : Row;
481
522
  const ids = items.map((item) => {
482
523
  const path = Path.create(contextId, item.id);
483
- const isPreview = activeItem && activeItem.item.id === item.id && overItem && (Path.siblings(overItem.path, path) || Path.hasChild(overItem.path, path)) && operation !== "reject";
524
+ const isPreview = activeItem && activeItem.item.id === item.id && overItem && overItem.path && (Path.siblings(overItem.path, path) || Path.hasChild(overItem.path, path)) && operation !== "reject";
484
525
  return isPreview ? activeItem.path : path;
485
526
  });
486
527
  return /* @__PURE__ */ React6.createElement(Sortable, {
@@ -570,7 +611,7 @@ var SortableTile = ({ path: parentPath, type = DEFAULT_TYPE, item, Component: Ov
570
611
  const { operation, activeItem, overItem } = useMosaic();
571
612
  const { transitionDuration, Component: ContainerComponent } = useContainer();
572
613
  const path = Path.create(parentPath, item.id);
573
- const isPreview = activeItem && activeItem.item.id === item.id && overItem && !Path.siblings(activeItem.path, overItem.path) && (Path.siblings(overItem.path, path) || Path.hasChild(overItem.path, path)) && operation !== "reject";
614
+ const isPreview = activeItem && activeItem.item.id === item.id && overItem && activeItem.path && overItem.path && !Path.siblings(activeItem.path, overItem.path) && (Path.siblings(overItem.path, path) || Path.hasChild(overItem.path, path)) && operation !== "reject";
574
615
  const { setNodeRef, attributes, listeners, transform, isDragging, isOver } = useSortable({
575
616
  id: isPreview ? activeItem.path : path,
576
617
  data: {
@@ -588,7 +629,7 @@ var SortableTile = ({ path: parentPath, type = DEFAULT_TYPE, item, Component: Ov
588
629
  if (isDragging) {
589
630
  if (operation === "rearrange" || operation === "reject") {
590
631
  active = "rearrange";
591
- } else if (activeItem && Path.parent(activeItem.path) !== parentPath) {
632
+ } else if (activeItem && activeItem.path && Path.parent(activeItem.path) !== parentPath) {
592
633
  active = "destination";
593
634
  } else {
594
635
  active = "origin";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mosaic/hooks/useContainer.ts", "../../../src/mosaic/Container.tsx", "../../../src/mosaic/hooks/useItemsWithPreview.ts", "../../../src/mosaic/hooks/useMosaic.ts", "../../../src/mosaic/Root.tsx", "../../../src/mosaic/Debug.tsx", "../../../src/mosaic/DefaultComponent.tsx", "../../../src/mosaic/util/data.ts", "../../../src/mosaic/util/path.ts", "../../../src/mosaic/util/props.ts", "../../../src/mosaic/util/styles.ts", "../../../src/mosaic/hooks/useItemsWithOrigin.ts", "../../../src/mosaic/DragOverlay.tsx", "../../../src/mosaic/SortableContext.tsx", "../../../src/mosaic/Tile.tsx", "../../../src/mosaic/Mosaic.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { useContext } from 'react';\n\nimport { MosaicContainerContext, type MosaicContainerContextType } from '../Container';\nimport { type MosaicDataItem } from '../types';\n\nexport const useContainer = <\n TData extends MosaicDataItem = MosaicDataItem,\n TPosition = unknown,\n>(): MosaicContainerContextType<TData, TPosition> => useContext(MosaicContainerContext);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Modifier } from '@dnd-kit/core';\nimport React, {\n createContext,\n useEffect,\n type CSSProperties,\n type HTMLAttributes,\n type PropsWithChildren,\n forwardRef,\n} from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { type MosaicTileComponent } from './Tile';\nimport { useMosaic } from './hooks';\nimport { type MosaicDataItem, type MosaicDraggedItem } from './types';\n\n// TODO(wittjosiah): Factor out.\ntype WithRequiredProperty<Type, Key extends keyof Type> = Type & {\n [Property in Key]-?: Type[Property];\n};\n\nexport const DEFAULT_TRANSITION = 200;\nexport const DEFAULT_TYPE = 'unknown';\nexport const DEFAULT_COMPONENT = forwardRef(() => <>missing component</>);\n\nexport type MosaicTileOverlayProps = {\n grow?: boolean;\n debug?: boolean;\n itemContext?: Record<string, unknown>;\n};\n\n/**\n * Possible operations when dropping a tile:\n * - `transfer` - Remove the tile from it's current path and move to a new path.\n * - `copy` - Add a clone of the tile at a new path.\n * - `rearrange` - Change the order of the tile within it's current path.\n * - `reject` - The tile is not allowed where it was dropped.\n */\n// TODO(wittjosiah): Add 'delete'. Consider adding 'swap'.\nexport const MosaicOperations = ['transfer', 'copy', 'rearrange', 'reject'] as const;\nexport type MosaicOperation = (typeof MosaicOperations)[number];\n\nexport type MosaicMoveEvent<TPosition = unknown> = {\n active: MosaicDraggedItem<TPosition>;\n over: MosaicDraggedItem<TPosition>;\n};\n\nexport type MosaicDropEvent<TPosition = unknown> = MosaicMoveEvent<TPosition> & {\n operation: MosaicOperation;\n};\n\nexport type MosaicContainerProps<TData extends MosaicDataItem = MosaicDataItem, TPosition = unknown> = ThemedClassName<\n Omit<HTMLAttributes<HTMLElement>, 'onDrop' | 'onSelect'>\n> &\n PropsWithChildren<{\n id: string;\n\n // TODO(wittjosiah): Don't expose externally.\n debug?: boolean;\n\n /**\n * Default component used to render tiles.\n */\n Component?: MosaicTileComponent<TData, any>;\n\n /**\n * Default type of tiles.\n */\n type?: string;\n\n /**\n * Length of transition when moving tiles in milliseconds.\n *\n * @default 200\n */\n transitionDuration?: number;\n\n /**\n * Adapter to transform properties while dragging (e.g., constraint axes).\n * https://github.com/clauderic/dnd-kit/blob/master/packages/core/src/modifiers/types.ts\n */\n modifier?: (activeItem: MosaicDraggedItem, ...modifierArgs: Parameters<Modifier>) => ReturnType<Modifier>;\n\n /**\n * Property overrides for the default overlay.\n */\n getOverlayProps?: () => MosaicTileOverlayProps;\n\n /**\n * Style property overrides for the default overlay.\n */\n getOverlayStyle?: () => CSSProperties;\n\n /**\n * Called when a tile is dragged over the container.\n * Returns true if the tile can be dropped.\n */\n onOver?: (event: MosaicMoveEvent<TPosition>) => MosaicOperation;\n\n /**\n * Called when a tile is dropped on the container.\n */\n onDrop?: (event: MosaicDropEvent<TPosition>) => void;\n }>;\n\nexport type MosaicContainerContextType<\n TData extends MosaicDataItem = MosaicDataItem,\n TPosition = unknown,\n> = WithRequiredProperty<Omit<MosaicContainerProps<TData, TPosition>, 'children'>, 'type' | 'Component'>;\n\nexport const MosaicContainerContext = createContext<MosaicContainerContextType<any>>({\n id: 'never',\n type: DEFAULT_TYPE,\n Component: DEFAULT_COMPONENT,\n});\n\n/**\n * Root Container that manages the layout of tiles.\n */\nexport const MosaicContainer = ({\n children,\n id,\n debug,\n type = DEFAULT_TYPE,\n Component = DEFAULT_COMPONENT,\n transitionDuration = DEFAULT_TRANSITION,\n modifier,\n getOverlayProps,\n getOverlayStyle,\n onOver,\n onDrop,\n}: MosaicContainerProps) => {\n const mosaic = useMosaic();\n const container = {\n id,\n debug,\n type,\n Component,\n transitionDuration,\n modifier,\n getOverlayProps,\n getOverlayStyle,\n onOver,\n onDrop,\n };\n\n useEffect(() => {\n mosaic.setContainer(container.id, container);\n return () => {\n // TODO(burdon): The overlay unregisters the container after the tile has re-rendered (removing it).\n // mosaic.setContainer(container.id);\n };\n }, Object.values(container));\n\n return <MosaicContainerContext.Provider value={container}>{children}</MosaicContainerContext.Provider>;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { useMosaic } from './useMosaic';\nimport { type MosaicDataItem } from '../types';\nimport { Path } from '../util';\n\n/**\n * Returns a spliced collection of items including a placeholder if items that could drop,\n * and removing any item that is currently being dragged out.\n */\nexport const useItemsWithPreview = <T extends MosaicDataItem>({ path, items }: { path: string; items: T[] }): T[] => {\n const { operation, activeItem, overItem } = useMosaic();\n const [itemsWithPreview, setItemsWithPreview] = useState(items);\n const overParent =\n // If over the sortable context itself & active item is foreign, then treat self as the parent.\n // This allows items to be appended to the end of the sortable.\n overItem?.path === path && activeItem && Path.parent(activeItem.path) !== overItem.path\n ? path\n : overItem && Path.parent(overItem.path);\n const [lastOverParent, setLastOverParent] = useState(overParent);\n\n useEffect(() => {\n if (!activeItem || !overItem) {\n setLastOverParent(undefined);\n setItemsWithPreview(items);\n return;\n }\n\n if (lastOverParent === overParent) {\n return;\n }\n\n const activeIsChild = Path.hasChild(path, activeItem.path);\n const overIsChild = Path.hasChild(path, overItem.path);\n const overSelf = overItem.path === path;\n\n if (operation === 'reject' || operation === 'rearrange') {\n setLastOverParent(undefined);\n setItemsWithPreview(items);\n return;\n } else {\n setLastOverParent(overParent);\n }\n if (!activeIsChild && overIsChild) {\n // Insert item into sortable.\n setItemsWithPreview((items) => {\n const position = overItem.position as number;\n return [...items.slice(0, position), activeItem.item as T, ...items.slice(position)];\n });\n } else if (!activeIsChild && overSelf) {\n // Append item to end of sortable.\n setItemsWithPreview((items) => [...items, activeItem.item as T]);\n } else if (activeIsChild && !overIsChild) {\n // Remove item being dragged out.\n setItemsWithPreview((items) => items.filter((item) => item.id !== activeItem.item.id));\n } else {\n // Reset items.\n setItemsWithPreview(items);\n }\n }, [operation, activeItem, overItem, overParent, lastOverParent, path, items]);\n\n // In order to avoid render glitching, rather than waiting for the effect to run,\n // immediately return the new items after dropping an item into a new path.\n return items.length === itemsWithPreview.length ? items : itemsWithPreview;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useContext } from 'react';\n\nimport { raise } from '@dxos/debug';\n\nimport { MosaicContext } from '../Root';\n\nexport const useMosaic = () => useContext(MosaicContext) ?? raise(new Error('Missing MosaicContext'));\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport {\n type CollisionDetection,\n DndContext,\n type DragCancelEvent,\n type DragEndEvent,\n type DragMoveEvent,\n type DragOverEvent,\n type DragStartEvent,\n KeyboardSensor,\n type Modifier,\n MouseSensor,\n pointerWithin,\n rectIntersection,\n TouchSensor,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport { sortableKeyboardCoordinates } from '@dnd-kit/sortable';\nimport pick from 'lodash.pick';\nimport React, { createContext, type FC, type PropsWithChildren, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { DEFAULT_TRANSITION, type MosaicContainerProps, type MosaicOperation } from './Container';\nimport { Debug } from './Debug';\nimport { DefaultComponent } from './DefaultComponent';\nimport { type MosaicTileComponent } from './Tile';\nimport { type MosaicDraggedItem } from './types';\nimport { Path } from './util';\n\nconst DEFAULT_COMPONENT_ID = '__default';\n\nexport type MosaicContextType = {\n containers: Record<string, MosaicContainerProps<any> | undefined>;\n setContainer: (id: string, container?: MosaicContainerProps<any>) => void;\n activeItem: MosaicDraggedItem | undefined;\n overItem: MosaicDraggedItem | undefined;\n operation: MosaicOperation;\n};\n\nexport const MosaicContext = createContext<MosaicContextType | undefined>(undefined);\n\nexport type MosaicRootProps = PropsWithChildren<{\n /**\n * Default component.\n */\n Component?: MosaicTileComponent<any>;\n debug?: boolean;\n}>;\n\n/**\n * Root context provider.\n */\nexport const MosaicRoot: FC<MosaicRootProps> = ({ Component = DefaultComponent, debug, children }) => {\n const [containers, setContainers] = useState<MosaicContextType['containers']>({\n [DEFAULT_COMPONENT_ID]: { id: DEFAULT_COMPONENT_ID, Component },\n });\n\n const handleSetContainer = (id: string, container?: MosaicContainerProps<any>) => {\n setContainers((containers) => {\n if (container) {\n return { ...containers, [id]: container };\n } else {\n const { [id]: _, ...rest } = containers;\n return rest;\n }\n });\n };\n\n const [activeItem, setActiveItem] = useState<MosaicDraggedItem>();\n const [overItem, setOverItem] = useState<MosaicDraggedItem>();\n const [operation, setOperation] = useState<MosaicOperation>('reject');\n\n //\n // DndKit Defaults\n //\n\n /**\n * See: https://docs.dndkit.com/api-documentation/context-provider/collision-detection-algorithms#custom-collision-detection-algorithms\n * See: https://github.com/clauderic/dnd-kit/tree/master/packages/core/src/utilities/algorithms\n */\n // TODO(burdon): Flickering: should not change while animation is happening.\n const collisionDetection: CollisionDetection = (args) => {\n // pointerWithin is the most accurate (since we're using drag handles), but only works with pointer sensors.\n const pointerCollisions = pointerWithin(args);\n if (pointerCollisions.length > 0) {\n return pointerCollisions;\n }\n\n // If there are no collisions with the pointer, return rectangle intersections.\n return rectIntersection(args);\n };\n\n /**\n * Dragging transformation modifiers adaptable by container.\n * See: https://github.com/clauderic/dnd-kit/tree/master/packages/core/src/modifiers\n */\n const modifiers: Modifier = (props) => {\n const { transform } = props;\n if (activeItem) {\n const container = containers[Path.first(activeItem.path)];\n return container?.modifier?.(activeItem, props) ?? transform;\n } else {\n return transform;\n }\n };\n\n /**\n * See: https://github.com/clauderic/dnd-kit/tree/master/packages/core/src/sensors\n */\n const sensors = useSensors(\n useSensor(MouseSensor, {\n activationConstraint: {\n distance: 10,\n },\n }),\n useSensor(TouchSensor, {\n activationConstraint: {\n delay: 200,\n tolerance: 5,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n //\n // Events\n //\n\n const handleDragStart = (event: DragStartEvent) => {\n setActiveItem(pick(event.active.data.current as MosaicDraggedItem, 'path', 'type', 'item', 'position'));\n };\n\n const handleDragMove = (event: DragMoveEvent) => {};\n\n const handleDragOver = (event: DragOverEvent) => {\n const overItem = pick(event.over?.data.current as MosaicDraggedItem, 'path', 'type', 'item', 'position');\n\n // If the over item is the same as the active item, do nothing.\n // This happens when moving between containers where a placeholder of itself is rendered where it will be dropped.\n if (overItem?.item?.id === activeItem?.item.id) {\n setOverItem(overItem);\n return;\n }\n\n const activeContainer = activeItem && containers[Path.first(activeItem.path)];\n const overContainer = overItem?.path && containers[Path.first(overItem.path)];\n if (!event.over || !overItem || !overContainer || !activeItem || !activeContainer) {\n setOperation('reject');\n setOverItem(undefined);\n return;\n }\n\n let operation: MosaicOperation = 'reject' as const;\n if (Path.parent(activeItem.path) === Path.parent(overItem.path)) {\n operation = 'rearrange' as const;\n } else if (overContainer.onOver) {\n operation = overContainer.onOver({ active: activeItem, over: overItem });\n }\n\n setOperation(operation);\n setOverItem(overItem);\n };\n\n const handleDragCancel = (event: DragCancelEvent) => {\n setOperation('reject');\n setActiveItem(undefined);\n setOverItem(undefined);\n };\n\n const handleDragEnd = (event: DragEndEvent) => {\n const overContainer = overItem && containers[Path.first(overItem.path)];\n\n if (\n operation !== 'reject' &&\n activeItem &&\n overItem &&\n (activeItem.path !== overItem.path || activeItem.position !== overItem.position)\n ) {\n const activeContainer = containers[Path.first(activeItem.path)];\n if (activeContainer) {\n activeContainer.onDrop?.({ operation, active: activeItem, over: overItem });\n\n if (overContainer && overContainer !== activeContainer) {\n overContainer.onDrop?.({ operation, active: activeItem, over: overItem });\n }\n }\n }\n\n setTimeout(() => {\n setOperation('reject');\n setOverItem(undefined);\n setActiveItem(undefined);\n }, overContainer?.transitionDuration ?? DEFAULT_TRANSITION);\n };\n\n return (\n <MosaicContext.Provider value={{ containers, setContainer: handleSetContainer, activeItem, overItem, operation }}>\n <DndContext\n collisionDetection={collisionDetection}\n modifiers={[modifiers]}\n sensors={sensors}\n // TODO(burdon): Allow container to veto drop.\n cancelDrop={(event) => false}\n onDragStart={handleDragStart}\n onDragMove={handleDragMove}\n onDragOver={handleDragOver}\n onDragCancel={handleDragCancel}\n onDragEnd={handleDragEnd}\n >\n {children}\n {debug &&\n createPortal(\n <MosaicDebug containers={containers} operation={operation} activeItem={activeItem} overItem={overItem} />,\n document.body,\n )}\n </DndContext>\n </MosaicContext.Provider>\n );\n};\n\nconst MosaicDebug: FC<{\n containers: MosaicContextType['containers'];\n operation: MosaicOperation;\n activeItem?: MosaicDraggedItem;\n overItem?: MosaicDraggedItem;\n}> = ({ containers, operation, activeItem, overItem }) => {\n return (\n <Debug\n position='bottom-right'\n data={{\n containers: Object.keys(containers).map((id) => id),\n operation,\n active: {\n id: activeItem?.item?.id.slice(0, 16),\n path: activeItem?.path && Path.create(...Path.parts(activeItem.path).map((part) => part.slice(0, 16))),\n type: activeItem?.type,\n position: activeItem?.position,\n },\n over: {\n id: overItem?.item?.id.slice(0, 16),\n path: overItem?.path && Path.create(...Path.parts(overItem.path).map((part) => part.slice(0, 16))),\n type: overItem?.type,\n position: overItem?.position,\n },\n }}\n />\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type FC } from 'react';\n\nimport { mx } from '@dxos/react-ui-theme';\n\ntype Position = 'bottom-left' | 'bottom-right';\n\nexport type DebugProps = { data: any; position?: Position };\n\nexport const Debug: FC<DebugProps> = ({ data, position }) => (\n <pre\n className={mx(\n 'font-mono text-xs overflow-hidden m-2 p-1 z-[100]',\n 'bg-neutral-50 dark:bg-neutral-700 border border-neutral-300 rounded',\n position === 'bottom-left' && 'fixed left-0 bottom-0',\n position === 'bottom-right' && 'fixed right-0 bottom-0',\n )}\n >\n {JSON.stringify(data, undefined, 1)}\n </pre>\n);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { forwardRef } from 'react';\n\nimport { Card } from '@dxos/react-ui-card';\n\nimport { type MosaicTileComponent } from './Tile';\nimport { type MosaicDataItem } from './types';\nimport { Path } from './util';\n\nexport const DefaultComponent: MosaicTileComponent<MosaicDataItem> = forwardRef(\n ({ draggableStyle, draggableProps, item: { id }, path }, forwardRef) => {\n return (\n <Card.Root ref={forwardRef} style={draggableStyle}>\n <Card.Header>\n <Card.DragHandle {...draggableProps} />\n <Card.Title title={Path.create(path, id)} classNames='truncate font-mono text-xs' />\n </Card.Header>\n </Card.Root>\n );\n },\n);\n\nDefaultComponent.displayName = 'DefaultComponent';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { arrayMove } from '@dxos/util';\n\nimport { type MosaicDataItem } from '../types';\n\n// TODO(wittjosiah): Generalize and expand rearrange utilities.\n\nexport const swapItems = <TItem extends MosaicDataItem, TValue extends MosaicDataItem>(\n items: TItem[],\n from: TValue,\n to: TValue,\n): TItem[] => {\n const fromIndex = items.findIndex((item) => item.id === from.id);\n const toIndex = items.findIndex((item) => item.id === to.id);\n return fromIndex !== -1 && toIndex !== -1 ? arrayMove(items, fromIndex, toIndex) : items;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nconst SEPARATOR = '/';\n\nexport const Path = {\n create: (...args: string[]) => args.join(SEPARATOR),\n\n parts: (path: string) => path.split(SEPARATOR),\n length: (path: string) => path.split(SEPARATOR).length,\n first: (path: string) => path.split(SEPARATOR)[0] ?? path,\n last: (path: string) => path.split(SEPARATOR).at(-1) ?? path,\n parent: (path: string) => path.split(SEPARATOR).slice(0, -1).join(SEPARATOR),\n\n hasRoot: (path: string, id: string) => Path.first(path) === id,\n hasChild: (path: string, compare: string) => Path.parent(compare) === path,\n hasDescendent: (path: string, compare: string) => compare !== path && compare.startsWith(path),\n siblings: (path: string, compare: string) => Path.parent(path) === Path.parent(compare),\n onPath: (path: string, id: string) => Path.parts(path).includes(id),\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { MosaicOperations } from '../Container';\nimport { type MosaicTileComponentProps, type MosaicTileProps } from '../Tile';\n\nexport const isTileProps = (props: Record<string, unknown>): props is MosaicTileProps =>\n typeof props.path === 'string' && typeof props.item === 'object' && props.item\n ? 'id' in props.item && typeof props.item.id === 'string'\n : false;\n\nexport const isTileComponentProps = (props: Record<string, unknown>): props is MosaicTileComponentProps =>\n isTileProps(props) && typeof props.operation === 'string' && MosaicOperations.includes(props.operation);\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// https://docs.dndkit.com/api-documentation/draggable/usedraggable#transform\n\nimport { CSS, type Transform } from '@dnd-kit/utilities';\n\nexport const getTransformCSS = (transform: Transform | null) =>\n transform ? CSS.Transform.toString(Object.assign(transform, { scaleX: 1, scaleY: 1 })) : undefined;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useMosaic } from './useMosaic';\nimport { type MosaicDataItem } from '../types';\nimport { Path } from '../util';\n\n// TODO(thure): Harmonize this hook signature with its sibling’s.\nexport const useItemsWithOrigin = <T extends MosaicDataItem>(path: string, items: T[]) => {\n const { operation, activeItem, overItem } = useMosaic();\n\n if (!activeItem || !overItem) {\n return items;\n }\n\n const activeIsChild = Path.hasChild(path, activeItem.path);\n const overIsChild = Path.hasChild(path, overItem.path);\n\n if (activeIsChild && !overIsChild && operation !== 'rearrange') {\n // Change the dnd-id of the origin item that may move to a foreign destination\n return items.map((item) => {\n if (item.id === activeItem.item.id) {\n return { ...item, id: `${item.id}--origin` };\n } else {\n return item;\n }\n });\n } else {\n // Reset items.\n return items;\n }\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { DragOverlay } from '@dnd-kit/core';\nimport React, {\n Component,\n type ComponentProps,\n type PropsWithChildren,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { log } from '@dxos/log';\n\nimport { type MosaicContainerProps } from './Container';\nimport { DefaultComponent } from './DefaultComponent';\nimport { type MosaicTileComponent } from './Tile';\nimport { useMosaic } from './hooks';\nimport { Path } from './util';\n\nexport type MosaicDragOverlayProps = { delay?: number; debug?: boolean } & Omit<\n ComponentProps<typeof DragOverlay>,\n 'children'\n>;\n\n/**\n * Render the currently dragged item of the Mosaic.\n */\nexport const MosaicDragOverlay = ({ delay = 200, debug = false, ...overlayProps }: MosaicDragOverlayProps) => {\n const { containers, operation, activeItem, overItem } = useMosaic();\n\n // Get the overlay component from the over container, otherwise default to the original.\n const [state, setState] = useState<{\n container?: MosaicContainerProps<any>;\n OverlayComponent?: MosaicTileComponent<any>;\n }>({});\n\n const timer = useRef<ReturnType<typeof setTimeout>>();\n\n useEffect(() => {\n // Only attempt to resolve a foreign overlay tile if the operation is not rejected, since droppables *should* reject\n // items they don’t recognize and therefore wouldn’t be able to render a tile for. See dxos/dxos#5082.\n if (activeItem && operation !== 'reject') {\n let container: MosaicContainerProps<any> | undefined;\n let OverlayComponent: MosaicTileComponent<any> | undefined;\n if (overItem?.path) {\n container = containers[Path.first(overItem.path)];\n OverlayComponent = container?.Component;\n }\n\n if (!OverlayComponent) {\n container = containers[Path.first(activeItem.path)];\n OverlayComponent = container?.Component ?? DefaultComponent;\n }\n\n // Prevent jitter when transitioning across containers.\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setState({ container, OverlayComponent }), timer.current ? delay : 0);\n } else {\n setState({});\n }\n }, [activeItem, overItem]);\n\n // Ensure the overlay is rendered as soon as there's an active item, then use local state.\n const container = state.container ?? (activeItem && containers[Path.first(activeItem.path)]);\n const OverlayComponent = state.OverlayComponent ?? container?.Component;\n // Fallback is always to the active (origin) container.\n const FallbackComponent = (activeItem && containers[Path.first(activeItem.path)])?.Component ?? DefaultComponent;\n\n // NOTE: The DragOverlay wrapper element must always be mounted to support animations. Conditionally render the content.\n return (\n // TODO(burdon): Set custom animations (e.g., in/out/around).\n <DragOverlay adjustScale={false} {...overlayProps} style={{ ...container?.getOverlayStyle?.() }}>\n {/* TODO(burdon): Configure density via getOverlayProps. */}\n {activeItem?.path && container && OverlayComponent && (\n <OverlayErrorBoundary\n fallback={\n <FallbackComponent\n {...container.getOverlayProps?.()}\n item={activeItem.item}\n path={activeItem.path}\n operation={operation}\n active='overlay'\n />\n }\n >\n <OverlayComponent\n {...container.getOverlayProps?.()}\n item={activeItem.item}\n path={activeItem.path}\n type={activeItem.type}\n operation={operation}\n active='overlay'\n />\n {debug && (\n <div className='flex flex-wrap mt-1 p-1 bg-neutral-50 dark:bg-neutral-700 text-xs border rounded overflow-hidden gap-1'>\n <span className='truncate'>\n <span className='text-neutral-400'>container </span>\n {container.id}\n </span>\n <span className='truncate'>\n <span className='text-neutral-400'>item </span>\n {activeItem.item.id.slice(0, 8)}\n </span>\n </div>\n )}\n </OverlayErrorBoundary>\n )}\n </DragOverlay>\n );\n};\n\ntype OverlayErrorBoundaryProps = PropsWithChildren<{ fallback?: ReactNode }>;\n\nclass OverlayErrorBoundary extends Component<OverlayErrorBoundaryProps> {\n private readonly fallback: ReactNode;\n\n constructor(props: OverlayErrorBoundaryProps) {\n super(props);\n this.fallback = props.fallback ?? <p>ERROR: ${String(this.state.error)}</p>;\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n override state = {\n error: null,\n };\n\n override componentDidCatch(error: any, info: any) {\n log.catch(error, { info });\n }\n\n override render() {\n if (this.state.error) {\n return this.fallback;\n }\n\n return this.props.children;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SortableContext, horizontalListSortingStrategy, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport React, { type PropsWithChildren } from 'react';\n\nimport { useContainer, useMosaic } from './hooks';\nimport { type MosaicDataItem } from './types';\nimport { Path } from './util';\n\ntype Direction = 'horizontal' | 'vertical';\n\nexport type MosaicSortableProps<TData extends MosaicDataItem = MosaicDataItem> = PropsWithChildren<{\n id?: string;\n items?: TData[];\n direction?: Direction;\n}>;\n\n/**\n * Mosaic convenience wrapper for dnd-kit SortableContext.\n */\n// TODO(burdon): Remove since just obfuscates SortableContext unless more deeply integrated with useSortableItem.\n// Otherwise accept same props as SortableContext (e.g., verticalListSortingStrategy).\nexport const MosaicSortableContext = ({ id, items = [], direction = 'vertical', children }: MosaicSortableProps) => {\n const { operation, activeItem, overItem } = useMosaic();\n const container = useContainer();\n const contextId = id ?? container.id;\n const Sortable = direction === 'vertical' ? Column : Row;\n\n const ids = items.map((item) => {\n const path = Path.create(contextId, item.id);\n // TODO(wittjosiah): Copied from Tile.tsx. Consider factoring out to ensure logic is consistent.\n const isPreview =\n activeItem &&\n activeItem.item.id === item.id &&\n overItem &&\n (Path.siblings(overItem.path, path) || Path.hasChild(overItem.path, path)) &&\n operation !== 'reject';\n return isPreview ? activeItem.path : path;\n });\n\n return (\n <Sortable id={contextId} items={ids}>\n {children}\n </Sortable>\n );\n};\n\nconst Column = ({ children, id, items }: PropsWithChildren<{ id: string; items: string[] }>) => (\n <SortableContext id={id} items={items} strategy={verticalListSortingStrategy}>\n {children}\n </SortableContext>\n);\n\nconst Row = ({ children, id, items }: PropsWithChildren<{ id: string; items: string[] }>) => (\n <SortableContext id={id} items={items} strategy={horizontalListSortingStrategy}>\n {children}\n </SortableContext>\n);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type DraggableAttributes, useDraggable, useDroppable } from '@dnd-kit/core';\nimport { defaultAnimateLayoutChanges, useSortable } from '@dnd-kit/sortable';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport React, { forwardRef } from 'react';\nimport type { CSSProperties, ForwardRefExoticComponent, HTMLAttributes, RefAttributes } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { DEFAULT_TYPE, type MosaicOperation, type MosaicTileOverlayProps } from './Container';\nimport { DefaultComponent } from './DefaultComponent';\nimport { useContainer, useMosaic } from './hooks';\nimport type { MosaicDataItem, MosaicDraggedItem } from './types';\nimport { getTransformCSS, Path } from './util';\n\nexport type MosaicActiveType = 'overlay' | 'rearrange' | 'origin' | 'destination';\n\n// TODO(wittjosiah): `id` should be `path` and `data` should be a `MosaicDataItem`.\nexport type MosaicTileAction = { id: string; action: string; data?: any };\n\n/**\n * Props passed to mosaic tile.\n */\nexport type MosaicTileProps<TData extends MosaicDataItem = MosaicDataItem, TPosition = unknown> = ThemedClassName<{}> &\n MosaicTileOverlayProps & {\n path: string;\n item: TData;\n Component?: MosaicTileComponent<TData, any>;\n position?: TPosition;\n type?: string;\n operation?: MosaicOperation;\n active?: MosaicActiveType; // TODO(burdon): Rename state?\n\n // DndKit props.\n isDragging?: boolean;\n isOver?: boolean;\n draggableStyle?: CSSProperties;\n draggableProps?: DraggableAttributes &\n // TODO(wittjosiah): SyntheticListenerMap.\n HTMLAttributes<HTMLElement>;\n\n // TODO(burdon): Generalize events via onAction?\n onSelect?: () => void;\n onDelete?: (force?: boolean) => void;\n onNavigate?: () => void;\n onAddBefore?: () => void;\n onAddAfter?: () => void;\n onAction?: (action: MosaicTileAction) => void;\n };\n\nexport type MosaicTileComponentProps<TData extends MosaicDataItem = MosaicDataItem> = Omit<\n MosaicTileProps<TData>,\n 'Component' | 'operation'\n> & { operation: MosaicOperation };\n\n/**\n * Mosaic Tile component.\n */\nexport type MosaicTileComponent<\n TData extends MosaicDataItem = MosaicDataItem,\n TElement extends HTMLElement = HTMLDivElement,\n TProps = {},\n> = ForwardRefExoticComponent<RefAttributes<TElement> & MosaicTileComponentProps<TData> & TProps>;\n\n/**\n * Basic draggable mosaic tile.\n */\nexport const DraggableTile = ({\n path: parentPath,\n type = DEFAULT_TYPE,\n item,\n Component = DefaultComponent,\n position,\n draggableStyle,\n ...props\n}: MosaicTileProps<any>) => {\n const { operation } = useMosaic();\n const path = Path.create(parentPath, item.id);\n const { setNodeRef, attributes, listeners, /* transform, */ isDragging } = useDraggable({\n id: path,\n data: { path, type, item, position } satisfies MosaicDraggedItem,\n });\n\n return (\n <Component\n ref={setNodeRef}\n item={item}\n path={path}\n type={type}\n position={position}\n operation={operation}\n isDragging={isDragging}\n draggableStyle={{\n // TODO(burdon): Override by container?\n // transform: getTransformCSS(transform),\n ...draggableStyle,\n }}\n draggableProps={{ ...attributes, ...listeners }}\n {...props}\n />\n );\n};\n\n/**\n * Basic droppable mosaic tile.\n */\nexport const DroppableTile = forwardRef<HTMLDivElement | null, MosaicTileProps<any>>(\n ({ path: parentPath, type = DEFAULT_TYPE, item, Component = DefaultComponent, position, ...props }, forwardedRef) => {\n const { operation } = useMosaic();\n const path =\n parentPath === item.id\n ? parentPath // If the path is the same as the item id, then this is the root tile.\n : Path.create(parentPath, item.id);\n const { setNodeRef, isOver } = useDroppable({\n id: path,\n data: { path, type, item, position } satisfies MosaicDraggedItem,\n });\n\n const ref = useComposedRefs<HTMLDivElement | null>(setNodeRef, forwardedRef);\n\n return (\n <Component\n item={item}\n path={path}\n type={type}\n position={position}\n operation={operation}\n isOver={isOver}\n {...props}\n ref={ref}\n />\n );\n },\n);\n\n/**\n * Mosaic tile that can be sorted.\n */\nexport const SortableTile = ({\n path: parentPath,\n type = DEFAULT_TYPE,\n item,\n Component: OverrideComponent,\n position,\n draggableStyle,\n ...props\n}: MosaicTileProps<any, number>) => {\n const { operation, activeItem, overItem } = useMosaic();\n const { transitionDuration, Component: ContainerComponent } = useContainer();\n\n const path = Path.create(parentPath, item.id);\n // Re-use the active path if it's the same item and the item is a preview.\n // This helps dndkit understand that the item is being moved and animate it appropriately.\n const isPreview =\n activeItem &&\n activeItem.item.id === item.id &&\n overItem &&\n !Path.siblings(activeItem.path, overItem.path) &&\n (Path.siblings(overItem.path, path) || Path.hasChild(overItem.path, path)) &&\n operation !== 'reject';\n\n const { setNodeRef, attributes, listeners, transform, isDragging, isOver } = useSortable({\n id: isPreview ? activeItem.path : path,\n data: { path, type, item, position } satisfies MosaicDraggedItem,\n animateLayoutChanges: (args) =>\n defaultAnimateLayoutChanges({ ...args, wasDragging: item.id !== activeItem?.item.id }),\n });\n\n let active: MosaicActiveType | undefined;\n if (isDragging) {\n if (operation === 'rearrange' || operation === 'reject') {\n active = 'rearrange';\n } else if (activeItem && Path.parent(activeItem.path) !== parentPath) {\n active = 'destination';\n } else {\n active = 'origin';\n }\n }\n\n const Component = OverrideComponent ?? ContainerComponent ?? DefaultComponent;\n\n return (\n <Component\n ref={setNodeRef}\n item={item}\n path={path}\n type={type}\n position={position}\n operation={operation}\n active={active}\n isDragging={isDragging}\n isOver={isOver}\n draggableStyle={{\n transform: getTransformCSS(transform),\n transition: transform ? `transform ${transitionDuration}ms ease` : 'none',\n ...draggableStyle,\n }}\n draggableProps={{ ...attributes, ...listeners }}\n {...props}\n />\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type FC, type RefAttributes } from 'react';\n\nimport {\n MosaicContainer,\n type MosaicContainerProps as NaturalMosaicContainerProps,\n type MosaicMoveEvent as NaturalMosaicMoveEvent,\n type MosaicDropEvent as NaturalMosaicDropEvent,\n type MosaicOperation as NaturalMosaicOperation,\n} from './Container';\nimport { Debug, type DebugProps } from './Debug';\nimport { DefaultComponent } from './DefaultComponent';\nimport { MosaicDragOverlay, type MosaicDragOverlayProps } from './DragOverlay';\nimport { MosaicRoot, type MosaicRootProps as NaturalMosaicRootProps } from './Root';\nimport { MosaicSortableContext, type MosaicSortableProps as NaturalMosaicSortableProps } from './SortableContext';\nimport {\n DraggableTile,\n DroppableTile,\n SortableTile,\n type MosaicTileAction as NaturalMosaicTileAction,\n type MosaicTileProps as NaturalMosaicTileProps,\n type MosaicTileComponent as NaturalMosaicTileComponent,\n type MosaicActiveType as NaturalMosaicActiveType,\n type MosaicTileComponentProps as NaturalMosaicTileComponentProps,\n} from './Tile';\nimport { type MosaicDataItem } from './types';\n\nexport const Mosaic = {\n Root: MosaicRoot,\n Container: MosaicContainer,\n DragOverlay: MosaicDragOverlay,\n SortableContext: MosaicSortableContext,\n DraggableTile,\n DroppableTile,\n SortableTile,\n\n // TODO(wittjosiah): Consider factoring out or using inline styles instead depending on DXOS UI theme/tailwind.\n DefaultComponent,\n // TODO(burdon): Don't export; move to util.\n Debug,\n} as {\n Root: FC<MosaicRootProps>;\n Container: FC<MosaicContainerProps<any, any>>;\n DragOverlay: FC<MosaicOverlayProps>;\n SortableContext: FC<MosaicSortableProps>;\n DraggableTile: FC<MosaicTileProps<any, any>>;\n DroppableTile: FC<RefAttributes<HTMLDivElement> & MosaicTileProps<any, any>>;\n SortableTile: FC<MosaicTileProps<any, number>>;\n\n DefaultComponent: MosaicTileComponent;\n Debug: FC<MosaicDebugProps>;\n};\n\nexport type MosaicRootProps = NaturalMosaicRootProps;\n\nexport type MosaicContainerProps<\n TData extends MosaicDataItem = MosaicDataItem,\n TPosition = unknown,\n> = NaturalMosaicContainerProps<TData, TPosition>;\n\nexport type MosaicOverlayProps = MosaicDragOverlayProps;\n\nexport type MosaicSortableProps = NaturalMosaicSortableProps;\n\nexport type MosaicTileAction = NaturalMosaicTileAction;\n\nexport type MosaicTileProps<\n TData extends MosaicDataItem = MosaicDataItem,\n TPosition = unknown,\n> = NaturalMosaicTileProps<TData, TPosition>;\n\nexport type MosaicTileComponent<\n TData extends MosaicDataItem = MosaicDataItem,\n TElement extends HTMLElement = HTMLDivElement,\n TProps = {},\n> = NaturalMosaicTileComponent<TData, TElement, TProps>;\n\nexport type MosaicTileComponentProps<TData extends MosaicDataItem = MosaicDataItem> =\n NaturalMosaicTileComponentProps<TData>;\n\nexport type MosaicMoveEvent<TPosition = unknown> = NaturalMosaicMoveEvent<TPosition>;\nexport type MosaicDropEvent<TPosition = unknown> = NaturalMosaicDropEvent<TPosition>;\nexport type MosaicOperation = NaturalMosaicOperation;\nexport type MosaicActiveType = NaturalMosaicActiveType;\n\n// TODO(burdon): Remove.\nexport type MosaicDebugProps = DebugProps;\n"],
5
- "mappings": "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",
6
- "names": ["useContext", "React", "createContext", "useEffect", "forwardRef", "DEFAULT_TRANSITION", "DEFAULT_TYPE", "DEFAULT_COMPONENT", "forwardRef", "MosaicOperations", "MosaicContainerContext", "createContext", "id", "type", "Component", "MosaicContainer", "children", "debug", "transitionDuration", "modifier", "getOverlayProps", "getOverlayStyle", "onOver", "onDrop", "mosaic", "useMosaic", "container", "useEffect", "setContainer", "Object", "values", "Provider", "value", "useContainer", "useContext", "MosaicContainerContext", "useEffect", "useState", "useContext", "raise", "DndContext", "KeyboardSensor", "MouseSensor", "pointerWithin", "rectIntersection", "TouchSensor", "useSensor", "useSensors", "sortableKeyboardCoordinates", "pick", "React", "createContext", "useState", "createPortal", "React", "mx", "Debug", "data", "position", "React", "pre", "className", "mx", "JSON", "stringify", "undefined", "React", "forwardRef", "Card", "arrayMove", "swapItems", "items", "from", "to", "fromIndex", "findIndex", "item", "id", "toIndex", "arrayMove", "SEPARATOR", "Path", "create", "args", "join", "parts", "path", "split", "length", "first", "last", "at", "parent", "slice", "hasRoot", "id", "hasChild", "compare", "hasDescendent", "startsWith", "siblings", "onPath", "includes", "isTileProps", "props", "path", "item", "id", "isTileComponentProps", "operation", "MosaicOperations", "includes", "CSS", "getTransformCSS", "transform", "CSS", "Transform", "toString", "Object", "assign", "scaleX", "scaleY", "undefined", "DefaultComponent", "forwardRef", "draggableStyle", "draggableProps", "item", "id", "path", "React", "Card", "Root", "ref", "style", "Header", "DragHandle", "Title", "title", "Path", "create", "classNames", "displayName", "DEFAULT_COMPONENT_ID", "MosaicContext", "createContext", "undefined", "MosaicRoot", "Component", "DefaultComponent", "debug", "children", "containers", "setContainers", "useState", "id", "handleSetContainer", "container", "_", "rest", "activeItem", "setActiveItem", "overItem", "setOverItem", "operation", "setOperation", "collisionDetection", "args", "pointerCollisions", "pointerWithin", "length", "rectIntersection", "modifiers", "props", "transform", "Path", "first", "path", "modifier", "sensors", "useSensors", "useSensor", "MouseSensor", "activationConstraint", "distance", "TouchSensor", "delay", "tolerance", "KeyboardSensor", "coordinateGetter", "sortableKeyboardCoordinates", "handleDragStart", "event", "pick", "active", "data", "current", "handleDragMove", "handleDragOver", "over", "item", "activeContainer", "overContainer", "parent", "onOver", "handleDragCancel", "handleDragEnd", "position", "onDrop", "setTimeout", "transitionDuration", "DEFAULT_TRANSITION", "React", "Provider", "value", "setContainer", "DndContext", "cancelDrop", "onDragStart", "onDragMove", "onDragOver", "onDragCancel", "onDragEnd", "createPortal", "MosaicDebug", "document", "body", "Debug", "Object", "keys", "map", "slice", "create", "parts", "part", "type", "useMosaic", "useContext", "MosaicContext", "raise", "Error", "useItemsWithPreview", "path", "items", "operation", "activeItem", "overItem", "useMosaic", "itemsWithPreview", "setItemsWithPreview", "useState", "overParent", "Path", "parent", "lastOverParent", "setLastOverParent", "useEffect", "undefined", "activeIsChild", "hasChild", "overIsChild", "overSelf", "position", "slice", "item", "filter", "id", "length", "useItemsWithOrigin", "path", "items", "operation", "activeItem", "overItem", "useMosaic", "activeIsChild", "Path", "hasChild", "overIsChild", "map", "item", "id", "DragOverlay", "React", "Component", "useEffect", "useRef", "useState", "log", "MosaicDragOverlay", "delay", "debug", "overlayProps", "containers", "operation", "activeItem", "overItem", "useMosaic", "state", "setState", "useState", "timer", "useRef", "useEffect", "container", "OverlayComponent", "path", "Path", "first", "Component", "DefaultComponent", "clearTimeout", "current", "setTimeout", "FallbackComponent", "React", "DragOverlay", "adjustScale", "style", "getOverlayStyle", "OverlayErrorBoundary", "fallback", "getOverlayProps", "item", "active", "type", "div", "className", "span", "id", "slice", "constructor", "props", "error", "p", "String", "getDerivedStateFromError", "componentDidCatch", "info", "log", "catch", "render", "children", "SortableContext", "horizontalListSortingStrategy", "verticalListSortingStrategy", "React", "MosaicSortableContext", "id", "items", "direction", "children", "operation", "activeItem", "overItem", "useMosaic", "container", "useContainer", "contextId", "Sortable", "Column", "Row", "ids", "map", "item", "path", "Path", "create", "isPreview", "siblings", "hasChild", "React", "SortableContext", "strategy", "verticalListSortingStrategy", "horizontalListSortingStrategy", "useDraggable", "useDroppable", "defaultAnimateLayoutChanges", "useSortable", "useComposedRefs", "React", "forwardRef", "DraggableTile", "path", "parentPath", "type", "DEFAULT_TYPE", "item", "Component", "DefaultComponent", "position", "draggableStyle", "props", "operation", "useMosaic", "Path", "create", "id", "setNodeRef", "attributes", "listeners", "isDragging", "useDraggable", "data", "React", "ref", "draggableProps", "DroppableTile", "forwardRef", "forwardedRef", "isOver", "useDroppable", "useComposedRefs", "SortableTile", "OverrideComponent", "activeItem", "overItem", "transitionDuration", "ContainerComponent", "useContainer", "isPreview", "siblings", "hasChild", "transform", "useSortable", "animateLayoutChanges", "args", "defaultAnimateLayoutChanges", "wasDragging", "active", "parent", "getTransformCSS", "transition", "Mosaic", "Root", "MosaicRoot", "Container", "MosaicContainer", "DragOverlay", "MosaicDragOverlay", "SortableContext", "MosaicSortableContext", "DraggableTile", "DroppableTile", "SortableTile", "DefaultComponent", "Debug"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { useContext } from 'react';\n\nimport { MosaicContainerContext, type MosaicContainerContextType } from '../Container';\nimport { type MosaicDataItem } from '../types';\n\nexport const useContainer = <\n TData extends MosaicDataItem = MosaicDataItem,\n TPosition = unknown,\n>(): MosaicContainerContextType<TData, TPosition> => useContext(MosaicContainerContext);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Modifier, type DragEndEvent, type DragMoveEvent } from '@dnd-kit/core';\nimport React, {\n createContext,\n useEffect,\n type CSSProperties,\n type HTMLAttributes,\n type PropsWithChildren,\n forwardRef,\n} from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { type MosaicDropAnimation } from './Root';\nimport { type MosaicTileComponent } from './Tile';\nimport { useMosaic } from './hooks';\nimport { type MosaicDataItem, type MosaicDraggedItem } from './types';\n\n// TODO(wittjosiah): Factor out.\ntype WithRequiredProperty<Type, Key extends keyof Type> = Type & {\n [Property in Key]-?: Type[Property];\n};\n\nexport const DEFAULT_TRANSITION = 200;\nexport const DEFAULT_TYPE = 'unknown';\nexport const DEFAULT_COMPONENT: MosaicTileComponent = forwardRef(() => <>missing component</>);\n\nexport type MosaicTileOverlayProps = {\n grow?: boolean;\n debug?: boolean;\n itemContext?: Record<string, unknown>;\n};\n\n/**\n * Possible operations when dropping a tile:\n * - `transfer` - Remove the tile from it's current path and move to a new path.\n * - `copy` - Add a clone of the tile at a new path.\n * - `rearrange` - Change the order of the tile within it's current path.\n * - `reject` - The tile is not allowed where it was dropped.\n */\n// TODO(wittjosiah): Add 'delete'. Consider adding 'swap'.\nexport const MosaicOperations = ['transfer', 'copy', 'rearrange', 'reject'] as const;\nexport type MosaicOperation = (typeof MosaicOperations)[number];\n\n// TODO(wittjosiah): Unify w/ Position.\nexport type DefaultMoveDetails = Pick<DragMoveEvent, 'delta'>;\n\nexport type MosaicMoveEvent<TPosition = unknown, TMoveDetails = DefaultMoveDetails> = {\n active: MosaicDraggedItem<TPosition>;\n over: MosaicDraggedItem<TPosition>;\n details?: TMoveDetails;\n};\n\nexport type MosaicDropEvent<TPosition = unknown, TMoveDetails = DefaultMoveDetails> = MosaicMoveEvent<\n TPosition,\n TMoveDetails\n> & {\n operation: MosaicOperation;\n};\n\nexport type MosaicContainerProps<\n TData extends MosaicDataItem = MosaicDataItem,\n TPosition = unknown,\n TMoveDetails = DefaultMoveDetails,\n TTileElement extends HTMLElement = HTMLDivElement,\n TTileProps = {},\n> = ThemedClassName<Omit<HTMLAttributes<TTileElement>, 'onDrop' | 'onSelect'>> &\n PropsWithChildren<{\n id: string;\n\n // TODO(wittjosiah): Don't expose externally.\n debug?: boolean;\n\n /**\n * Default component used to render tiles.\n */\n Component?: MosaicTileComponent<TData, TTileElement, TTileProps>;\n\n /**\n * Default type of tiles.\n */\n type?: string;\n\n /**\n * Length of transition when moving tiles in milliseconds.\n *\n * @default 200\n */\n transitionDuration?: number;\n\n /**\n * Adapter to transform properties while dragging (e.g., constraint axes).\n * https://github.com/clauderic/dnd-kit/blob/master/packages/core/src/modifiers/types.ts\n */\n modifier?: (activeItem: MosaicDraggedItem, ...modifierArgs: Parameters<Modifier>) => ReturnType<Modifier>;\n\n /**\n * Property overrides for the default overlay.\n */\n getOverlayProps?: () => MosaicTileOverlayProps;\n\n /**\n * Style property overrides for the default overlay.\n */\n getOverlayStyle?: () => CSSProperties;\n\n /**\n * Called when a tile is dragged over the container.\n * Returns true if the tile can be dropped.\n */\n onOver?: (event: MosaicMoveEvent<TPosition, TMoveDetails>) => MosaicOperation;\n\n /**\n * Called when a tile is dropped on the container.\n */\n onDrop?: (event: MosaicDropEvent<TPosition, TMoveDetails>) => MosaicDropAnimation;\n\n /**\n * Always called when drag ends, no matter what, unlike the other handlers which are only called when relevant.\n */\n onDragEnd?: (event: DragEndEvent) => void;\n\n /**\n * Called on `dragmove` when over the container.\n */\n onMove?: (event: MosaicMoveEvent<TPosition, TMoveDetails>) => {\n operation: MosaicOperation;\n details?: TMoveDetails;\n };\n }>;\n\nexport type MosaicContainerContextType<\n TData extends MosaicDataItem = MosaicDataItem,\n TPosition = unknown,\n TMoveDetails = DefaultMoveDetails,\n> = WithRequiredProperty<Omit<MosaicContainerProps<TData, TPosition, TMoveDetails>, 'children'>, 'type' | 'Component'>;\n\nexport const MosaicContainerContext = createContext<MosaicContainerContextType<any>>({\n id: 'never',\n type: DEFAULT_TYPE,\n Component: DEFAULT_COMPONENT,\n});\n\n/**\n * Root Container that manages the layout of tiles.\n */\nexport const MosaicContainer = ({\n children,\n id,\n debug,\n type = DEFAULT_TYPE,\n Component = DEFAULT_COMPONENT,\n transitionDuration = DEFAULT_TRANSITION,\n modifier,\n getOverlayProps,\n getOverlayStyle,\n onOver,\n onDrop,\n onMove,\n onDragEnd,\n}: MosaicContainerProps) => {\n const mosaic = useMosaic();\n const container = {\n id,\n debug,\n type,\n Component,\n transitionDuration,\n modifier,\n getOverlayProps,\n getOverlayStyle,\n onOver,\n onDrop,\n onMove,\n onDragEnd,\n };\n\n useEffect(() => {\n mosaic.setContainer(container.id, container);\n return () => {\n // TODO(burdon): The overlay unregisters the container after the tile has re-rendered (removing it).\n // mosaic.setContainer(container.id);\n };\n }, Object.values(container));\n\n return <MosaicContainerContext.Provider value={container}>{children}</MosaicContainerContext.Provider>;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { useMosaic } from './useMosaic';\nimport { type MosaicDataItem } from '../types';\nimport { Path } from '../util';\n\n/**\n * Returns a spliced collection of items including a placeholder if items that could drop,\n * and removing any item that is currently being dragged out.\n */\nexport const useItemsWithPreview = <T extends MosaicDataItem>({ path, items }: { path: string; items: T[] }): T[] => {\n const { operation, activeItem, overItem } = useMosaic();\n const [itemsWithPreview, setItemsWithPreview] = useState(items);\n const overParent =\n // If over the sortable context itself & active item is foreign, then treat self as the parent.\n // This allows items to be appended to the end of the sortable.\n overItem?.path === path && activeItem && Path.parent(activeItem.path) !== overItem.path\n ? path\n : overItem && !!overItem.path && Path.parent(overItem.path);\n const [lastOverParent, setLastOverParent] = useState(overParent);\n\n useEffect(() => {\n if (!activeItem || !overItem) {\n setLastOverParent(undefined);\n setItemsWithPreview(items);\n return;\n }\n\n if (lastOverParent === overParent) {\n return;\n }\n\n const activeIsChild = Path.hasChild(path, activeItem.path);\n const overIsChild = Path.hasChild(path, overItem.path);\n const overSelf = overItem.path === path;\n\n if (operation === 'reject' || operation === 'rearrange') {\n setLastOverParent(undefined);\n setItemsWithPreview(items);\n return;\n } else {\n setLastOverParent(overParent);\n }\n if (!activeIsChild && overIsChild) {\n // Insert item into sortable.\n setItemsWithPreview((items) => {\n const position = overItem.position as number;\n return [...items.slice(0, position), activeItem.item as T, ...items.slice(position)];\n });\n } else if (!activeIsChild && overSelf) {\n // Append item to end of sortable.\n setItemsWithPreview((items) => [...items, activeItem.item as T]);\n } else if (activeIsChild && !overIsChild) {\n // Remove item being dragged out.\n setItemsWithPreview((items) => items.filter((item) => item.id !== activeItem.item.id));\n } else {\n // Reset items.\n setItemsWithPreview(items);\n }\n }, [operation, activeItem, overItem, overParent, lastOverParent, path, items]);\n\n // In order to avoid render glitching, rather than waiting for the effect to run,\n // immediately return the new items after dropping an item into a new path.\n return items.length === itemsWithPreview.length ? items : itemsWithPreview;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useContext } from 'react';\n\nimport { raise } from '@dxos/debug';\n\nimport { MosaicContext } from '../Root';\n\nexport const useMosaic = () => useContext(MosaicContext) ?? raise(new Error('Missing MosaicContext'));\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport {\n type CollisionDetection,\n DndContext,\n type DragCancelEvent,\n type DragEndEvent,\n type DragMoveEvent,\n type DragOverEvent,\n type DragStartEvent,\n KeyboardSensor,\n type Modifier,\n type DropAnimation,\n MouseSensor,\n pointerWithin,\n rectIntersection,\n TouchSensor,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport { sortableKeyboardCoordinates } from '@dnd-kit/sortable';\nimport pick from 'lodash.pick';\nimport React, { createContext, type FC, type PropsWithChildren, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport {\n DEFAULT_TRANSITION,\n type DefaultMoveDetails,\n type MosaicContainerProps,\n type MosaicOperation,\n} from './Container';\nimport { Debug } from './Debug';\nimport { DefaultComponent } from './DefaultComponent';\nimport { type MosaicTileComponent } from './Tile';\nimport { type MosaicDraggedItem } from './types';\nimport { Path } from './util';\n\nconst DEFAULT_COMPONENT_ID = '__default';\n\nexport type MosaicDropAnimation = DropAnimation | null | undefined | void;\n\nexport type MosaicContextType = {\n containers: Record<string, MosaicContainerProps<any> | undefined>;\n setContainer: (id: string, container?: MosaicContainerProps<any>) => void;\n activeItem: MosaicDraggedItem | undefined;\n overItem: MosaicDraggedItem | undefined;\n operation: MosaicOperation;\n moveDetails?: Record<string, unknown>;\n dropAnimation?: MosaicDropAnimation;\n};\n\nexport const MosaicContext = createContext<MosaicContextType | undefined>(undefined);\n\nexport type MosaicRootProps = PropsWithChildren<{\n /**\n * Default component.\n */\n Component?: MosaicTileComponent<any>;\n debug?: boolean;\n}>;\n\nconst defaultDropAnimation: MosaicDropAnimation = { duration: 0 };\n\n/**\n * Root context provider.\n */\nexport const MosaicRoot: FC<MosaicRootProps> = ({ Component = DefaultComponent, debug, children }) => {\n const [containers, setContainers] = useState<MosaicContextType['containers']>({\n [DEFAULT_COMPONENT_ID]: { id: DEFAULT_COMPONENT_ID, Component },\n });\n\n const handleSetContainer = (id: string, container?: MosaicContainerProps<any>) => {\n setContainers((containers) => {\n if (container) {\n return { ...containers, [id]: container };\n } else {\n const { [id]: _, ...rest } = containers;\n return rest;\n }\n });\n };\n\n const [activeItem, setActiveItem] = useState<MosaicDraggedItem>();\n const [overItem, setOverItem] = useState<MosaicDraggedItem>();\n const [operation, setOperation] = useState<MosaicOperation>('reject');\n const [moveDetails, setMoveDetails] = useState<(DefaultMoveDetails & Record<string, any>) | undefined>();\n const [dropAnimation, setDropAnimation] = useState<MosaicDropAnimation>(defaultDropAnimation);\n\n //\n // DndKit Defaults\n //\n\n /**\n * See: https://docs.dndkit.com/api-documentation/context-provider/collision-detection-algorithms#custom-collision-detection-algorithms\n * See: https://github.com/clauderic/dnd-kit/tree/master/packages/core/src/utilities/algorithms\n */\n // TODO(burdon): Flickering: should not change while animation is happening.\n const collisionDetection: CollisionDetection = (args) => {\n // pointerWithin is the most accurate (since we're using drag handles), but only works with pointer sensors.\n const pointerCollisions = pointerWithin(args);\n if (pointerCollisions.length > 0) {\n return pointerCollisions;\n }\n\n // If there are no collisions with the pointer, return rectangle intersections.\n return rectIntersection(args);\n };\n\n /**\n * Dragging transformation modifiers adaptable by container.\n * See: https://github.com/clauderic/dnd-kit/tree/master/packages/core/src/modifiers\n */\n const modifiers: Modifier = (props) => {\n const { transform } = props;\n if (activeItem) {\n const container = containers[Path.first(activeItem.path)];\n return container?.modifier?.(activeItem, props) ?? transform;\n } else {\n return transform;\n }\n };\n\n /**\n * See: https://github.com/clauderic/dnd-kit/tree/master/packages/core/src/sensors\n */\n const sensors = useSensors(\n useSensor(MouseSensor, {\n activationConstraint: {\n distance: 10,\n },\n }),\n useSensor(TouchSensor, {\n activationConstraint: {\n delay: 200,\n tolerance: 5,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n //\n // Events\n //\n\n const handleDragStart = (event: DragStartEvent) => {\n setActiveItem(pick(event.active.data.current as MosaicDraggedItem, 'path', 'type', 'item', 'position'));\n };\n\n const handleDragMove = (event: DragMoveEvent) => {\n const nextOverItem = pick(event.over?.data.current as MosaicDraggedItem, 'path', 'type', 'item', 'position');\n const nextOverContainer =\n nextOverItem && nextOverItem?.path ? containers[Path.first(nextOverItem.path)] : undefined;\n if (!event.over || !nextOverItem || !nextOverContainer) {\n setOperation('reject');\n setOverItem(undefined);\n return;\n }\n\n if (overItem !== nextOverItem) {\n setOverItem(nextOverItem);\n }\n\n if (activeItem && nextOverItem && nextOverContainer?.onMove) {\n const { operation: nextOperation, details: nextDetails } = nextOverContainer.onMove({\n active: activeItem,\n over: nextOverItem,\n details: { delta: event.delta },\n });\n setOperation(nextOperation);\n if (\n // always set falsy symbols\n !nextDetails ||\n // always set if details become truthy\n (!moveDetails && nextDetails) ||\n // only update if details change\n Object.entries(nextDetails).find(([key, value]) => !(key in moveDetails!) || moveDetails![key] !== value)\n ) {\n setMoveDetails(nextDetails);\n }\n }\n };\n\n const handleDragOver = (event: DragOverEvent) => {\n const overItem = pick(event.over?.data.current as MosaicDraggedItem, 'path', 'type', 'item', 'position');\n const overContainer = overItem && overItem?.path ? containers[Path.first(overItem.path)] : undefined;\n // TODO(wittjosiah): This is over-prescriptive.\n if (overContainer?.onMove) {\n // The over container will have handled this in its move handler.\n return;\n }\n\n const activeContainer = activeItem && containers[Path.first(activeItem.path)];\n if (!event.over || !overItem || !overContainer || !activeItem || !activeContainer) {\n setOperation('reject');\n setOverItem(undefined);\n return;\n }\n\n let operation: MosaicOperation = 'reject' as const;\n if (overContainer.onOver) {\n operation = overContainer.onOver({\n active: activeItem,\n over: overItem,\n details: moveDetails,\n });\n }\n\n setOperation(operation);\n setOverItem(overItem);\n };\n\n const handleDragCancel = (event: DragCancelEvent) => {\n setOperation('reject');\n setActiveItem(undefined);\n setOverItem(undefined);\n };\n\n const handleDragEnd = (event: DragEndEvent) => {\n const overContainer = overItem && containers[Path.first(overItem.path)];\n\n if (operation !== 'reject' && activeItem && overItem) {\n let nextDropAnimation: MosaicDropAnimation = defaultDropAnimation;\n const activeContainer = containers[Path.first(activeItem.path)];\n if (activeContainer) {\n nextDropAnimation = activeContainer.onDrop?.({\n operation,\n active: activeItem,\n over: overItem,\n details: moveDetails,\n });\n\n if (overContainer && overContainer !== activeContainer) {\n nextDropAnimation = overContainer.onDrop?.({\n operation,\n active: activeItem,\n over: overItem,\n details: moveDetails,\n });\n }\n }\n setDropAnimation(nextDropAnimation);\n }\n\n Object.values(containers).forEach((container) => container?.onDragEnd?.(event));\n\n setTimeout(() => {\n setOperation('reject');\n setOverItem(undefined);\n setActiveItem(undefined);\n }, overContainer?.transitionDuration ?? DEFAULT_TRANSITION);\n };\n\n return (\n <MosaicContext.Provider\n value={{\n containers,\n setContainer: handleSetContainer,\n activeItem,\n overItem,\n operation,\n moveDetails,\n dropAnimation,\n }}\n >\n <DndContext\n collisionDetection={collisionDetection}\n modifiers={[modifiers]}\n sensors={sensors}\n // TODO(burdon): Allow container to veto drop.\n cancelDrop={(event) => false}\n onDragStart={handleDragStart}\n onDragMove={handleDragMove}\n onDragOver={handleDragOver}\n onDragCancel={handleDragCancel}\n onDragEnd={handleDragEnd}\n >\n {children}\n {debug &&\n createPortal(\n <MosaicDebug containers={containers} operation={operation} activeItem={activeItem} overItem={overItem} />,\n document.body,\n )}\n </DndContext>\n </MosaicContext.Provider>\n );\n};\n\nconst MosaicDebug: FC<{\n containers: MosaicContextType['containers'];\n operation: MosaicOperation;\n activeItem?: MosaicDraggedItem;\n overItem?: MosaicDraggedItem;\n}> = ({ containers, operation, activeItem, overItem }) => {\n return (\n <Debug\n position='bottom-right'\n data={{\n containers: Object.keys(containers).map((id) => id),\n operation,\n active: {\n id: activeItem?.item?.id.slice(0, 16),\n path: activeItem?.path && Path.create(...Path.parts(activeItem.path).map((part) => part.slice(0, 16))),\n type: activeItem?.type,\n position: activeItem?.position,\n },\n over: {\n id: overItem?.item?.id.slice(0, 16),\n path: overItem?.path && Path.create(...Path.parts(overItem.path).map((part) => part.slice(0, 16))),\n type: overItem?.type,\n position: overItem?.position,\n },\n }}\n />\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type FC } from 'react';\n\nimport { mx } from '@dxos/react-ui-theme';\n\ntype Position = 'bottom-left' | 'bottom-right';\n\nexport type DebugProps = { data: any; position?: Position };\n\nexport const Debug: FC<DebugProps> = ({ data, position }) => (\n <pre\n className={mx(\n 'font-mono text-xs overflow-hidden m-2 p-1 z-[100]',\n 'bg-neutral-50 dark:bg-neutral-700 border border-neutral-300 rounded',\n position === 'bottom-left' && 'fixed left-0 bottom-0',\n position === 'bottom-right' && 'fixed right-0 bottom-0',\n )}\n >\n {JSON.stringify(data, undefined, 1)}\n </pre>\n);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { forwardRef } from 'react';\n\nimport { Card } from '@dxos/react-ui-card';\n\nimport { type MosaicTileComponent } from './Tile';\nimport { type MosaicDataItem } from './types';\nimport { Path } from './util';\n\nexport const DefaultComponent: MosaicTileComponent<MosaicDataItem> = forwardRef(\n ({ draggableStyle, draggableProps, item: { id }, path }, forwardRef) => {\n return (\n <Card.Root ref={forwardRef} style={draggableStyle}>\n <Card.Header>\n <Card.DragHandle {...draggableProps} />\n <Card.Title title={Path.create(path, id)} classNames='truncate font-mono text-xs' />\n </Card.Header>\n </Card.Root>\n );\n },\n);\n\nDefaultComponent.displayName = 'DefaultComponent';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { arrayMove } from '@dxos/util';\n\nimport { type MosaicDataItem } from '../types';\n\n// TODO(wittjosiah): Generalize and expand rearrange utilities.\n\nexport const swapItems = <TItem extends MosaicDataItem, TValue extends MosaicDataItem>(\n items: TItem[],\n from: TValue,\n to: TValue,\n): TItem[] => {\n const fromIndex = items.findIndex((item) => item.id === from.id);\n const toIndex = items.findIndex((item) => item.id === to.id);\n return fromIndex !== -1 && toIndex !== -1 ? arrayMove(items, fromIndex, toIndex) : items;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nconst SEPARATOR = '~';\n\nexport const Path = {\n create: (...args: string[]) => args.join(SEPARATOR),\n\n parts: (path: string) => path.split(SEPARATOR),\n length: (path: string) => path.split(SEPARATOR).length,\n first: (path: string) => path.split(SEPARATOR)[0] ?? path,\n last: (path: string) => path.split(SEPARATOR).at(-1) ?? path,\n parent: (path: string) => path.split(SEPARATOR).slice(0, -1).join(SEPARATOR),\n\n hasRoot: (path: string, id: string) => Path.first(path) === id,\n hasChild: (path: string, compare: string) => Path.parent(compare) === path,\n hasDescendent: (path: string, compare: string) => compare !== path && compare.startsWith(path),\n siblings: (path: string, compare: string) => Path.parent(path) === Path.parent(compare),\n onPath: (path: string, id: string) => Path.parts(path).includes(id),\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { MosaicOperations } from '../Container';\nimport { type MosaicTileComponentProps, type MosaicTileProps } from '../Tile';\n\nexport const isTileProps = (props: Record<string, unknown>): props is MosaicTileProps =>\n typeof props.path === 'string' && typeof props.item === 'object' && props.item\n ? 'id' in props.item && typeof props.item.id === 'string'\n : false;\n\nexport const isTileComponentProps = (props: Record<string, unknown>): props is MosaicTileComponentProps =>\n isTileProps(props) && typeof props.operation === 'string' && MosaicOperations.includes(props.operation);\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// https://docs.dndkit.com/api-documentation/draggable/usedraggable#transform\n\nimport { CSS, type Transform } from '@dnd-kit/utilities';\n\nexport const getTransformCSS = (transform: Transform | null) =>\n transform ? CSS.Transform.toString(Object.assign(transform, { scaleX: 1, scaleY: 1 })) : undefined;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useMosaic } from './useMosaic';\nimport { type MosaicDataItem } from '../types';\nimport { Path } from '../util';\n\n// TODO(thure): Harmonize this hook signature with its sibling’s.\nexport const useItemsWithOrigin = <T extends MosaicDataItem>(path: string, items: T[]) => {\n const { operation, activeItem, overItem } = useMosaic();\n\n if (!activeItem || !overItem) {\n return items;\n }\n\n const activeIsChild = Path.hasChild(path, activeItem.path);\n const overIsChild = Path.hasChild(path, overItem.path);\n\n if (activeIsChild && !overIsChild && operation !== 'rearrange') {\n // Change the dnd-id of the origin item that may move to a foreign destination\n return items.map((item) => {\n if (item.id === activeItem.item.id) {\n return { ...item, id: `${item.id}--origin` };\n } else {\n return item;\n }\n });\n } else {\n // Reset items.\n return items;\n }\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { DragOverlay, type DropAnimation } from '@dnd-kit/core';\nimport React, {\n Component,\n type ComponentProps,\n type PropsWithChildren,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { log } from '@dxos/log';\n\nimport { type MosaicContainerProps } from './Container';\nimport { DefaultComponent } from './DefaultComponent';\nimport { type MosaicTileComponent } from './Tile';\nimport { useMosaic } from './hooks';\nimport { Path } from './util';\n\nexport type MosaicDragOverlayProps = { delay?: number; debug?: boolean } & Omit<\n ComponentProps<typeof DragOverlay>,\n 'children'\n>;\n\n/**\n * Render the currently dragged item of the Mosaic.\n */\nexport const MosaicDragOverlay = ({ delay = 200, debug = false, ...overlayProps }: MosaicDragOverlayProps) => {\n const { containers, operation, activeItem, overItem, dropAnimation } = useMosaic();\n\n // Get the overlay component from the over container, otherwise default to the original.\n const [state, setState] = useState<{\n container?: MosaicContainerProps<any>;\n OverlayComponent?: MosaicTileComponent<any>;\n }>({});\n\n const timer = useRef<ReturnType<typeof setTimeout>>();\n\n useEffect(() => {\n // Only attempt to resolve a foreign overlay tile if the operation is not rejected, since droppables *should* reject\n // items they don’t recognize and therefore wouldn’t be able to render a tile for. See dxos/dxos#5082.\n if (activeItem && operation !== 'reject') {\n let container: MosaicContainerProps<any> | undefined;\n let OverlayComponent: MosaicTileComponent<any> | undefined;\n if (overItem?.path) {\n container = containers[Path.first(overItem.path)];\n OverlayComponent = container?.Component;\n }\n\n if (!OverlayComponent) {\n container = containers[Path.first(activeItem.path)];\n OverlayComponent = container?.Component ?? DefaultComponent;\n }\n\n // Prevent jitter when transitioning across containers.\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setState({ container, OverlayComponent }), timer.current ? delay : 0);\n } else {\n setState({});\n }\n }, [activeItem, overItem]);\n\n // Ensure the overlay is rendered as soon as there's an active item, then use local state.\n const container = state.container ?? (activeItem && containers[Path.first(activeItem.path)]);\n const OverlayComponent = state.OverlayComponent ?? container?.Component;\n // Fallback is always to the active (origin) container.\n const FallbackComponent = (activeItem && containers[Path.first(activeItem.path)])?.Component ?? DefaultComponent;\n\n // NOTE: The DragOverlay wrapper element must always be mounted to support animations. Conditionally render the content.\n return (\n // TODO(burdon): Set custom animations (e.g., in/out/around).\n <DragOverlay\n adjustScale={false}\n {...overlayProps}\n dropAnimation={dropAnimation as DropAnimation}\n style={{ ...container?.getOverlayStyle?.() }}\n >\n {/* TODO(burdon): Configure density via getOverlayProps. */}\n {activeItem?.path && container && OverlayComponent && (\n <OverlayErrorBoundary\n fallback={\n <FallbackComponent\n {...container.getOverlayProps?.()}\n item={activeItem.item}\n path={activeItem.path}\n operation={operation}\n active='overlay'\n />\n }\n >\n <OverlayComponent\n {...container.getOverlayProps?.()}\n item={activeItem.item}\n path={activeItem.path}\n type={activeItem.type}\n operation={operation}\n active='overlay'\n />\n {debug && (\n <div className='flex flex-wrap mt-1 p-1 bg-neutral-50 dark:bg-neutral-700 text-xs border rounded overflow-hidden gap-1'>\n <span className='truncate'>\n <span className='text-neutral-400'>container </span>\n {container.id}\n </span>\n <span className='truncate'>\n <span className='text-neutral-400'>item </span>\n {activeItem.item.id.slice(0, 8)}\n </span>\n </div>\n )}\n </OverlayErrorBoundary>\n )}\n </DragOverlay>\n );\n};\n\ntype OverlayErrorBoundaryProps = PropsWithChildren<{ fallback?: ReactNode }>;\n\nclass OverlayErrorBoundary extends Component<OverlayErrorBoundaryProps> {\n private readonly fallback: ReactNode;\n\n constructor(props: OverlayErrorBoundaryProps) {\n super(props);\n this.fallback = props.fallback ?? <p>ERROR: ${String(this.state.error)}</p>;\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n override state = {\n error: null,\n };\n\n override componentDidCatch(error: any, info: any) {\n log.catch(error, { info });\n }\n\n override render() {\n if (this.state.error) {\n return this.fallback;\n }\n\n return this.props.children;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SortableContext, horizontalListSortingStrategy, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport React, { type PropsWithChildren } from 'react';\n\nimport { useContainer, useMosaic } from './hooks';\nimport { type MosaicDataItem } from './types';\nimport { Path } from './util';\n\ntype Direction = 'horizontal' | 'vertical';\n\nexport type MosaicSortableProps<TData extends MosaicDataItem = MosaicDataItem> = PropsWithChildren<{\n id?: string;\n items?: TData[];\n direction?: Direction;\n}>;\n\n/**\n * Mosaic convenience wrapper for dnd-kit SortableContext.\n */\n// TODO(burdon): Remove since just obfuscates SortableContext unless more deeply integrated with useSortableItem.\n// Otherwise accept same props as SortableContext (e.g., verticalListSortingStrategy).\nexport const MosaicSortableContext = ({ id, items = [], direction = 'vertical', children }: MosaicSortableProps) => {\n const { operation, activeItem, overItem } = useMosaic();\n const container = useContainer();\n const contextId = id ?? container.id;\n const Sortable = direction === 'vertical' ? Column : Row;\n\n const ids = items.map((item) => {\n const path = Path.create(contextId, item.id);\n // TODO(wittjosiah): Copied from Tile.tsx. Consider factoring out to ensure logic is consistent.\n const isPreview =\n activeItem &&\n activeItem.item.id === item.id &&\n overItem &&\n overItem.path &&\n (Path.siblings(overItem.path, path) || Path.hasChild(overItem.path, path)) &&\n operation !== 'reject';\n return isPreview ? activeItem.path : path;\n });\n\n return (\n <Sortable id={contextId} items={ids}>\n {children}\n </Sortable>\n );\n};\n\nconst Column = ({ children, id, items }: PropsWithChildren<{ id: string; items: string[] }>) => (\n <SortableContext id={id} items={items} strategy={verticalListSortingStrategy}>\n {children}\n </SortableContext>\n);\n\nconst Row = ({ children, id, items }: PropsWithChildren<{ id: string; items: string[] }>) => (\n <SortableContext id={id} items={items} strategy={horizontalListSortingStrategy}>\n {children}\n </SortableContext>\n);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type DraggableAttributes, useDraggable, useDroppable } from '@dnd-kit/core';\nimport { defaultAnimateLayoutChanges, useSortable } from '@dnd-kit/sortable';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport React, { forwardRef } from 'react';\nimport type { CSSProperties, ForwardRefExoticComponent, HTMLAttributes, RefAttributes } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { DEFAULT_TYPE, type MosaicOperation, type MosaicTileOverlayProps } from './Container';\nimport { DefaultComponent } from './DefaultComponent';\nimport { useContainer, useMosaic } from './hooks';\nimport type { MosaicDataItem, MosaicDraggedItem } from './types';\nimport { getTransformCSS, Path } from './util';\n\nexport type MosaicActiveType = 'overlay' | 'rearrange' | 'origin' | 'destination';\n\n// TODO(wittjosiah): `id` should be `path` and `data` should be a `MosaicDataItem`.\nexport type MosaicTileAction = { id: string; action: string; data?: any };\n\n/**\n * Props passed to mosaic tile.\n */\nexport type MosaicTileProps<TData extends MosaicDataItem = MosaicDataItem, TPosition = unknown> = ThemedClassName<{}> &\n MosaicTileOverlayProps & {\n path: string;\n item: TData;\n Component?: MosaicTileComponent<TData, any>;\n position?: TPosition;\n type?: string;\n operation?: MosaicOperation;\n active?: MosaicActiveType; // TODO(burdon): Rename state?\n\n // DndKit props.\n isDragging?: boolean;\n isOver?: boolean;\n draggableStyle?: CSSProperties;\n draggableProps?: DraggableAttributes &\n // TODO(wittjosiah): SyntheticListenerMap.\n HTMLAttributes<HTMLElement>;\n\n // TODO(burdon): Generalize events via onAction?\n onSelect?: () => void;\n onDelete?: (force?: boolean) => void;\n onNavigate?: () => void;\n onAddBefore?: () => void;\n onAddAfter?: () => void;\n onAction?: (action: MosaicTileAction) => void;\n };\n\nexport type MosaicTileComponentProps<TData extends MosaicDataItem = MosaicDataItem> = Omit<\n MosaicTileProps<TData>,\n 'Component' | 'operation'\n> & { operation: MosaicOperation };\n\n/**\n * Mosaic Tile component.\n */\nexport type MosaicTileComponent<\n TData extends MosaicDataItem = MosaicDataItem,\n TElement extends HTMLElement = HTMLDivElement,\n TProps = {},\n> = ForwardRefExoticComponent<RefAttributes<TElement> & MosaicTileComponentProps<TData> & TProps>;\n\n/**\n * Basic draggable mosaic tile.\n */\nexport const DraggableTile = ({\n path: parentPath,\n type = DEFAULT_TYPE,\n item,\n Component = DefaultComponent,\n position,\n draggableStyle,\n ...props\n}: MosaicTileProps<any>) => {\n const { operation } = useMosaic();\n const path = Path.create(parentPath, item.id);\n const { setNodeRef, attributes, listeners, /* transform, */ isDragging } = useDraggable({\n id: path,\n data: { path, type, item, position } satisfies MosaicDraggedItem,\n });\n\n return (\n <Component\n ref={setNodeRef}\n item={item}\n path={path}\n type={type}\n position={position}\n operation={operation}\n isDragging={isDragging}\n draggableStyle={{\n // TODO(burdon): Override by container?\n // transform: getTransformCSS(transform),\n ...draggableStyle,\n }}\n draggableProps={{ ...attributes, ...listeners }}\n {...props}\n />\n );\n};\n\n/**\n * Basic droppable mosaic tile.\n */\nexport const DroppableTile = forwardRef<HTMLDivElement | null, MosaicTileProps<any>>(\n ({ path: parentPath, type = DEFAULT_TYPE, item, Component = DefaultComponent, position, ...props }, forwardedRef) => {\n const { operation } = useMosaic();\n const path =\n parentPath === item.id\n ? parentPath // If the path is the same as the item id, then this is the root tile.\n : Path.create(parentPath, item.id);\n const { setNodeRef, isOver } = useDroppable({\n id: path,\n data: { path, type, item, position } satisfies MosaicDraggedItem,\n });\n\n const ref = useComposedRefs<HTMLDivElement | null>(setNodeRef, forwardedRef);\n\n return (\n <Component\n item={item}\n path={path}\n type={type}\n position={position}\n operation={operation}\n isOver={isOver}\n {...props}\n ref={ref}\n />\n );\n },\n);\n\n/**\n * Mosaic tile that can be sorted.\n */\nexport const SortableTile = ({\n path: parentPath,\n type = DEFAULT_TYPE,\n item,\n Component: OverrideComponent,\n position,\n draggableStyle,\n ...props\n}: MosaicTileProps<any, number>) => {\n const { operation, activeItem, overItem } = useMosaic();\n const { transitionDuration, Component: ContainerComponent } = useContainer();\n\n const path = Path.create(parentPath, item.id);\n // Re-use the active path if it's the same item and the item is a preview.\n // This helps dndkit understand that the item is being moved and animate it appropriately.\n const isPreview =\n activeItem &&\n activeItem.item.id === item.id &&\n overItem &&\n activeItem.path &&\n overItem.path &&\n !Path.siblings(activeItem.path, overItem.path) &&\n (Path.siblings(overItem.path, path) || Path.hasChild(overItem.path, path)) &&\n operation !== 'reject';\n\n const { setNodeRef, attributes, listeners, transform, isDragging, isOver } = useSortable({\n id: isPreview ? activeItem.path : path,\n data: { path, type, item, position } satisfies MosaicDraggedItem,\n animateLayoutChanges: (args) =>\n defaultAnimateLayoutChanges({ ...args, wasDragging: item.id !== activeItem?.item.id }),\n });\n\n let active: MosaicActiveType | undefined;\n if (isDragging) {\n if (operation === 'rearrange' || operation === 'reject') {\n active = 'rearrange';\n } else if (activeItem && activeItem.path && Path.parent(activeItem.path) !== parentPath) {\n active = 'destination';\n } else {\n active = 'origin';\n }\n }\n\n const Component = OverrideComponent ?? ContainerComponent ?? DefaultComponent;\n\n return (\n <Component\n ref={setNodeRef}\n item={item}\n path={path}\n type={type}\n position={position}\n operation={operation}\n active={active}\n isDragging={isDragging}\n isOver={isOver}\n draggableStyle={{\n transform: getTransformCSS(transform),\n transition: transform ? `transform ${transitionDuration}ms ease` : 'none',\n ...draggableStyle,\n }}\n draggableProps={{ ...attributes, ...listeners }}\n {...props}\n />\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type FC, type RefAttributes } from 'react';\n\nimport {\n MosaicContainer,\n type MosaicContainerProps as NaturalMosaicContainerProps,\n type MosaicMoveEvent as NaturalMosaicMoveEvent,\n type MosaicDropEvent as NaturalMosaicDropEvent,\n type MosaicOperation as NaturalMosaicOperation,\n} from './Container';\nimport { Debug, type DebugProps } from './Debug';\nimport { DefaultComponent } from './DefaultComponent';\nimport { MosaicDragOverlay, type MosaicDragOverlayProps } from './DragOverlay';\nimport { MosaicRoot, type MosaicRootProps as NaturalMosaicRootProps } from './Root';\nimport { MosaicSortableContext, type MosaicSortableProps as NaturalMosaicSortableProps } from './SortableContext';\nimport {\n DraggableTile,\n DroppableTile,\n SortableTile,\n type MosaicTileAction as NaturalMosaicTileAction,\n type MosaicTileProps as NaturalMosaicTileProps,\n type MosaicTileComponent as NaturalMosaicTileComponent,\n type MosaicActiveType as NaturalMosaicActiveType,\n type MosaicTileComponentProps as NaturalMosaicTileComponentProps,\n} from './Tile';\nimport { type MosaicDataItem } from './types';\n\nexport { type DefaultMoveDetails } from './Container';\n\nexport const Mosaic = {\n Root: MosaicRoot,\n Container: MosaicContainer,\n DragOverlay: MosaicDragOverlay,\n SortableContext: MosaicSortableContext,\n DraggableTile,\n DroppableTile,\n SortableTile,\n\n // TODO(wittjosiah): Consider factoring out or using inline styles instead depending on DXOS UI theme/tailwind.\n DefaultComponent,\n // TODO(burdon): Don't export; move to util.\n Debug,\n} as {\n Root: FC<MosaicRootProps>;\n Container: FC<MosaicContainerProps<any, any>>;\n DragOverlay: FC<MosaicOverlayProps>;\n SortableContext: FC<MosaicSortableProps>;\n DraggableTile: FC<MosaicTileProps<any, any>>;\n DroppableTile: FC<RefAttributes<HTMLDivElement> & MosaicTileProps<any, any>>;\n SortableTile: FC<MosaicTileProps<any, number>>;\n\n DefaultComponent: MosaicTileComponent;\n Debug: FC<MosaicDebugProps>;\n};\n\nexport type MosaicRootProps = NaturalMosaicRootProps;\n\nexport type MosaicContainerProps<\n TData extends MosaicDataItem = MosaicDataItem,\n TPosition = unknown,\n TMoveDetails = Record<string, unknown>,\n TTileElement extends HTMLElement = HTMLDivElement,\n TTileProps = {},\n> = NaturalMosaicContainerProps<TData, TPosition, TMoveDetails, TTileElement, TTileProps>;\n\nexport type MosaicOverlayProps = MosaicDragOverlayProps;\n\nexport type MosaicSortableProps = NaturalMosaicSortableProps;\n\nexport type MosaicTileAction = NaturalMosaicTileAction;\n\nexport type MosaicTileProps<\n TData extends MosaicDataItem = MosaicDataItem,\n TPosition = unknown,\n> = NaturalMosaicTileProps<TData, TPosition>;\n\nexport type MosaicTileComponent<\n TData extends MosaicDataItem = MosaicDataItem,\n TElement extends HTMLElement = HTMLDivElement,\n TProps = {},\n> = NaturalMosaicTileComponent<TData, TElement, TProps>;\n\nexport type MosaicTileComponentProps<TData extends MosaicDataItem = MosaicDataItem> =\n NaturalMosaicTileComponentProps<TData>;\n\nexport type MosaicMoveEvent<TPosition = unknown, TMoveDetails = Record<string, unknown>> = NaturalMosaicMoveEvent<\n TPosition,\n TMoveDetails\n>;\nexport type MosaicDropEvent<TPosition = unknown, TMoveDetails = Record<string, unknown>> = NaturalMosaicDropEvent<\n TPosition,\n TMoveDetails\n>;\nexport type MosaicOperation = NaturalMosaicOperation;\nexport type MosaicActiveType = NaturalMosaicActiveType;\n\n// TODO(burdon): Remove.\nexport type MosaicDebugProps = DebugProps;\n"],
5
+ "mappings": "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",
6
+ "names": ["useContext", "React", "createContext", "useEffect", "forwardRef", "DEFAULT_TRANSITION", "DEFAULT_TYPE", "DEFAULT_COMPONENT", "forwardRef", "MosaicOperations", "MosaicContainerContext", "createContext", "id", "type", "Component", "MosaicContainer", "children", "debug", "transitionDuration", "modifier", "getOverlayProps", "getOverlayStyle", "onOver", "onDrop", "onMove", "onDragEnd", "mosaic", "useMosaic", "container", "useEffect", "setContainer", "Object", "values", "Provider", "value", "useContainer", "useContext", "MosaicContainerContext", "useEffect", "useState", "useContext", "raise", "DndContext", "KeyboardSensor", "MouseSensor", "pointerWithin", "rectIntersection", "TouchSensor", "useSensor", "useSensors", "sortableKeyboardCoordinates", "pick", "React", "createContext", "useState", "createPortal", "React", "mx", "Debug", "data", "position", "React", "pre", "className", "mx", "JSON", "stringify", "undefined", "React", "forwardRef", "Card", "arrayMove", "swapItems", "items", "from", "to", "fromIndex", "findIndex", "item", "id", "toIndex", "arrayMove", "SEPARATOR", "Path", "create", "args", "join", "parts", "path", "split", "length", "first", "last", "at", "parent", "slice", "hasRoot", "id", "hasChild", "compare", "hasDescendent", "startsWith", "siblings", "onPath", "includes", "isTileProps", "props", "path", "item", "id", "isTileComponentProps", "operation", "MosaicOperations", "includes", "CSS", "getTransformCSS", "transform", "CSS", "Transform", "toString", "Object", "assign", "scaleX", "scaleY", "undefined", "DefaultComponent", "forwardRef", "draggableStyle", "draggableProps", "item", "id", "path", "React", "Card", "Root", "ref", "style", "Header", "DragHandle", "Title", "title", "Path", "create", "classNames", "displayName", "DEFAULT_COMPONENT_ID", "MosaicContext", "createContext", "undefined", "defaultDropAnimation", "duration", "MosaicRoot", "Component", "DefaultComponent", "debug", "children", "containers", "setContainers", "useState", "id", "handleSetContainer", "container", "_", "rest", "activeItem", "setActiveItem", "overItem", "setOverItem", "operation", "setOperation", "moveDetails", "setMoveDetails", "dropAnimation", "setDropAnimation", "collisionDetection", "args", "pointerCollisions", "pointerWithin", "length", "rectIntersection", "modifiers", "props", "transform", "Path", "first", "path", "modifier", "sensors", "useSensors", "useSensor", "MouseSensor", "activationConstraint", "distance", "TouchSensor", "delay", "tolerance", "KeyboardSensor", "coordinateGetter", "sortableKeyboardCoordinates", "handleDragStart", "event", "pick", "active", "data", "current", "handleDragMove", "nextOverItem", "over", "nextOverContainer", "onMove", "nextOperation", "details", "nextDetails", "delta", "Object", "entries", "find", "key", "value", "handleDragOver", "overContainer", "activeContainer", "onOver", "handleDragCancel", "handleDragEnd", "nextDropAnimation", "onDrop", "values", "forEach", "onDragEnd", "setTimeout", "transitionDuration", "DEFAULT_TRANSITION", "React", "Provider", "setContainer", "DndContext", "cancelDrop", "onDragStart", "onDragMove", "onDragOver", "onDragCancel", "createPortal", "MosaicDebug", "document", "body", "Debug", "position", "keys", "map", "item", "slice", "create", "parts", "part", "type", "useMosaic", "useContext", "MosaicContext", "raise", "Error", "useItemsWithPreview", "path", "items", "operation", "activeItem", "overItem", "useMosaic", "itemsWithPreview", "setItemsWithPreview", "useState", "overParent", "Path", "parent", "lastOverParent", "setLastOverParent", "useEffect", "undefined", "activeIsChild", "hasChild", "overIsChild", "overSelf", "position", "slice", "item", "filter", "id", "length", "useItemsWithOrigin", "path", "items", "operation", "activeItem", "overItem", "useMosaic", "activeIsChild", "Path", "hasChild", "overIsChild", "map", "item", "id", "DragOverlay", "React", "Component", "useEffect", "useRef", "useState", "log", "MosaicDragOverlay", "delay", "debug", "overlayProps", "containers", "operation", "activeItem", "overItem", "dropAnimation", "useMosaic", "state", "setState", "useState", "timer", "useRef", "useEffect", "container", "OverlayComponent", "path", "Path", "first", "Component", "DefaultComponent", "clearTimeout", "current", "setTimeout", "FallbackComponent", "React", "DragOverlay", "adjustScale", "style", "getOverlayStyle", "OverlayErrorBoundary", "fallback", "getOverlayProps", "item", "active", "type", "div", "className", "span", "id", "slice", "constructor", "props", "error", "p", "String", "getDerivedStateFromError", "componentDidCatch", "info", "log", "catch", "render", "children", "SortableContext", "horizontalListSortingStrategy", "verticalListSortingStrategy", "React", "MosaicSortableContext", "id", "items", "direction", "children", "operation", "activeItem", "overItem", "useMosaic", "container", "useContainer", "contextId", "Sortable", "Column", "Row", "ids", "map", "item", "path", "Path", "create", "isPreview", "siblings", "hasChild", "React", "SortableContext", "strategy", "verticalListSortingStrategy", "horizontalListSortingStrategy", "useDraggable", "useDroppable", "defaultAnimateLayoutChanges", "useSortable", "useComposedRefs", "React", "forwardRef", "DraggableTile", "path", "parentPath", "type", "DEFAULT_TYPE", "item", "Component", "DefaultComponent", "position", "draggableStyle", "props", "operation", "useMosaic", "Path", "create", "id", "setNodeRef", "attributes", "listeners", "isDragging", "useDraggable", "data", "React", "ref", "draggableProps", "DroppableTile", "forwardRef", "forwardedRef", "isOver", "useDroppable", "useComposedRefs", "SortableTile", "OverrideComponent", "activeItem", "overItem", "transitionDuration", "ContainerComponent", "useContainer", "isPreview", "siblings", "hasChild", "transform", "useSortable", "animateLayoutChanges", "args", "defaultAnimateLayoutChanges", "wasDragging", "active", "parent", "getTransformCSS", "transition", "Mosaic", "Root", "MosaicRoot", "Container", "MosaicContainer", "DragOverlay", "MosaicDragOverlay", "SortableContext", "MosaicSortableContext", "DraggableTile", "DroppableTile", "SortableTile", "DefaultComponent", "Debug"]
7
7
  }