@dxos/react-ui-mosaic 0.8.4-main.dfabb4ec29 → 0.8.4-main.effb148878

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/{chunk-RUQB4JIG.mjs → chunk-ZVSUYUQC.mjs} +23 -14
  3. package/dist/lib/browser/chunk-ZVSUYUQC.mjs.map +7 -0
  4. package/dist/lib/browser/index.mjs +9 -7
  5. package/dist/lib/browser/index.mjs.map +3 -3
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/testing/index.mjs +6 -12
  8. package/dist/lib/browser/testing/index.mjs.map +3 -3
  9. package/dist/lib/node-esm/{chunk-MYDCPSNY.mjs → chunk-RIPWJZIY.mjs} +23 -14
  10. package/dist/lib/node-esm/chunk-RIPWJZIY.mjs.map +7 -0
  11. package/dist/lib/node-esm/index.mjs +9 -7
  12. package/dist/lib/node-esm/index.mjs.map +3 -3
  13. package/dist/lib/node-esm/meta.json +1 -1
  14. package/dist/lib/node-esm/testing/index.mjs +6 -12
  15. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  16. package/dist/types/src/components/Board/Board.d.ts.map +1 -1
  17. package/dist/types/src/components/Board/Column.d.ts.map +1 -1
  18. package/dist/types/src/components/Mosaic/Container.d.ts +8 -0
  19. package/dist/types/src/components/Mosaic/Container.d.ts.map +1 -1
  20. package/dist/types/src/components/Mosaic/Mosaic.d.ts +1 -0
  21. package/dist/types/src/components/Mosaic/Mosaic.d.ts.map +1 -1
  22. package/dist/types/src/components/Mosaic/Stack.d.ts.map +1 -1
  23. package/dist/types/src/components/Mosaic/Tile.d.ts +4 -0
  24. package/dist/types/src/components/Mosaic/Tile.d.ts.map +1 -1
  25. package/dist/types/src/components/SearchStack/SearchStack.d.ts.map +1 -1
  26. package/dist/types/src/testing/types.d.ts +4 -6
  27. package/dist/types/src/testing/types.d.ts.map +1 -1
  28. package/dist/types/tsconfig.tsbuildinfo +1 -1
  29. package/package.json +31 -31
  30. package/src/components/Board/Board.tsx +2 -1
  31. package/src/components/Board/Column.tsx +3 -2
  32. package/src/components/Board/Item.tsx +2 -2
  33. package/src/components/Mosaic/Container.tsx +18 -1
  34. package/src/components/Mosaic/Stack.tsx +7 -2
  35. package/src/components/Mosaic/Tile.tsx +9 -5
  36. package/src/components/SearchStack/SearchStack.tsx +5 -5
  37. package/src/testing/DefaultStackTile.tsx +3 -3
  38. package/src/testing/types.ts +5 -15
  39. package/dist/lib/browser/chunk-RUQB4JIG.mjs.map +0 -7
  40. package/dist/lib/node-esm/chunk-MYDCPSNY.mjs.map +0 -7
package/LICENSE CHANGED
@@ -1,8 +1,105 @@
1
- MIT License
2
- Copyright (c) 2022 DXOS
1
+ # Functional Source License, Version 1.1, ALv2 Future License
3
2
 
4
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
3
+ ## Abbreviation
5
4
 
6
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
5
+ FSL-1.1-Apache-2.0
7
6
 
8
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
7
+ ## Notice
8
+
9
+ Copyright 2026 DXOS
10
+
11
+ ## Terms and Conditions
12
+
13
+ ### Licensor ("We")
14
+
15
+ The party offering the Software under these Terms and Conditions.
16
+
17
+ ### The Software
18
+
19
+ The "Software" is each version of the software that we make available under
20
+ these Terms and Conditions, as indicated by our inclusion of these Terms and
21
+ Conditions with the Software.
22
+
23
+ ### License Grant
24
+
25
+ Subject to your compliance with this License Grant and the Patents,
26
+ Redistribution and Trademark clauses below, we hereby grant you the right to
27
+ use, copy, modify, create derivative works, publicly perform, publicly display
28
+ and redistribute the Software for any Permitted Purpose identified below.
29
+
30
+ ### Permitted Purpose
31
+
32
+ A Permitted Purpose is any purpose other than a Competing Use. A Competing Use
33
+ means making the Software available to others in a commercial product or
34
+ service that:
35
+
36
+ 1. substitutes for the Software;
37
+
38
+ 2. substitutes for any other product or service we offer using the Software
39
+ that exists as of the date we make the Software available; or
40
+
41
+ 3. offers the same or substantially similar functionality as the Software.
42
+
43
+ Permitted Purposes specifically include using the Software:
44
+
45
+ 1. for your internal use and access;
46
+
47
+ 2. for non-commercial education;
48
+
49
+ 3. for non-commercial research; and
50
+
51
+ 4. in connection with professional services that you provide to a licensee
52
+ using the Software in accordance with these Terms and Conditions.
53
+
54
+ ### Patents
55
+
56
+ To the extent your use for a Permitted Purpose would necessarily infringe our
57
+ patents, the license grant above includes a license under our patents. If you
58
+ make a claim against any party that the Software infringes or contributes to
59
+ the infringement of any patent, then your patent license to the Software ends
60
+ immediately.
61
+
62
+ ### Redistribution
63
+
64
+ The Terms and Conditions apply to all copies, modifications and derivatives of
65
+ the Software.
66
+
67
+ If you redistribute any copies, modifications or derivatives of the Software,
68
+ you must include a copy of or a link to these Terms and Conditions and not
69
+ remove any copyright notices provided in or with the Software.
70
+
71
+ ### Disclaimer
72
+
73
+ THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR
74
+ IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR
75
+ PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.
76
+
77
+ IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE
78
+ SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
79
+ EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.
80
+
81
+ ### Trademarks
82
+
83
+ Except for displaying the License Details and identifying us as the origin of
84
+ the Software, you have no right under these Terms and Conditions to use our
85
+ trademarks, trade names, service marks or product names.
86
+
87
+ ## Grant of Future License
88
+
89
+ We hereby irrevocably grant you an additional license to use the Software under
90
+ the Apache License, Version 2.0 that is effective on the second anniversary of
91
+ the date we make the Software available. On or after that date, you may use the
92
+ Software under the Apache License, Version 2.0, in which case the following
93
+ will apply:
94
+
95
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
96
+ this file except in compliance with the License.
97
+
98
+ You may obtain a copy of the License at
99
+
100
+ http://www.apache.org/licenses/LICENSE-2.0
101
+
102
+ Unless required by applicable law or agreed to in writing, software distributed
103
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
104
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
105
+ specific language governing permissions and limitations under the License.
@@ -287,7 +287,7 @@ import { Primitive as Primitive2 } from "@radix-ui/react-primitive";
287
287
  import { Slot as Slot2 } from "@radix-ui/react-slot";
288
288
  import { bind } from "bind-event-listener";
289
289
  import React2, { useCallback as useCallback2, useEffect as useEffect2, useMemo as useMemo2, useRef as useRef2, useState as useState2 } from "react";
290
- import { composable, composableProps } from "@dxos/ui-theme";
290
+ import { composable, composableProps } from "@dxos/react-ui";
291
291
  import { isTruthy } from "@dxos/util";
292
292
  var MOSAIC_CONTAINER_NAME = "Mosaic.Container";
293
293
  var [MosaicContainerContextProvider, useMosaicContainerContext] = createContext2("MosaicContainer");
@@ -295,7 +295,7 @@ var MOSAIC_CONTAINER_STATE_ATTR = "mosaic-container-state";
295
295
  var MOSAIC_CONTAINER_PLACEHOLDER_WIDTH = "--mosaic-placeholder-width";
296
296
  var MOSAIC_CONTAINER_PLACEHOLDER_HEIGHT = "--mosaic-placeholder-height";
297
297
  var counter = 0;
298
- var MosaicContainer = composable(({ children, eventHandler: eventHandlerProp, orientation = "vertical", asChild, autoScroll: autoscrollElement, withFocus, currentId, onCurrentChange, debug, ...props }, forwardedRef) => {
298
+ var MosaicContainer = composable(({ children, eventHandler: eventHandlerProp, orientation = "vertical", asChild, autoScroll: autoscrollElement, withFocus, currentId, onCurrentChange, selectedIds, onSelectionChange, debug, ...props }, forwardedRef) => {
299
299
  const Comp = asChild ? Slot2 : Primitive2.div;
300
300
  const rootRef = useRef2(null);
301
301
  const composedRef = useComposedRefs2(rootRef, forwardedRef);
@@ -313,6 +313,9 @@ var MosaicContainer = composable(({ children, eventHandler: eventHandlerProp, or
313
313
  const setCurrentId = useCallback2((id) => onCurrentChange?.(id), [
314
314
  onCurrentChange
315
315
  ]);
316
+ const setSelected = useCallback2((id, selected) => onSelectionChange?.(id, selected), [
317
+ onSelectionChange
318
+ ]);
316
319
  const scrollToRef = useRef2(void 0);
317
320
  const registerScrollTo = useCallback2((fn) => {
318
321
  scrollToRef.current = fn;
@@ -469,6 +472,8 @@ var MosaicContainer = composable(({ children, eventHandler: eventHandlerProp, or
469
472
  setActiveLocation,
470
473
  currentId,
471
474
  setCurrentId,
475
+ selectedIds,
476
+ setSelected,
472
477
  registerScrollTo
473
478
  }, /* @__PURE__ */ React2.createElement(Comp, {
474
479
  ...composableProps(props, {
@@ -496,11 +501,11 @@ import { Primitive as Primitive3 } from "@radix-ui/react-primitive";
496
501
  import { Slot as Slot3 } from "@radix-ui/react-slot";
497
502
  import React3, { useLayoutEffect, useMemo as useMemo3, useRef as useRef3, useState as useState3 } from "react";
498
503
  import { createPortal } from "react-dom";
499
- import { composableProps as composableProps2, slottable } from "@dxos/ui-theme";
504
+ import { composableProps as composableProps2, slottable } from "@dxos/react-ui";
500
505
  var MOSAIC_TILE_NAME = "Mosaic.Tile";
501
506
  var [MosaicTileContextProvider, useMosaicTileContext] = createContext3("MosaicTile");
502
507
  var MOSAIC_TILE_STATE_ATTR = "mosaic-tile-state";
503
- var MosaicTile = slottable(({ children, asChild, dragHandle, allowedEdges: allowedEdgesProp, location, id, data: dataProp, draggable: draggableProp, current, debug: _, ...props }, forwardedRef) => {
508
+ var MosaicTile = slottable(({ children, asChild, dragHandle, allowedEdges: allowedEdgesProp, location, id, data: dataProp, draggable: draggableProp, current, selected, debug: _, ...props }, forwardedRef) => {
504
509
  const Comp = asChild ? Slot3 : Primitive3.div;
505
510
  const rootRef = useRef3(null);
506
511
  const composedRef = composeRefs(rootRef, forwardedRef);
@@ -644,11 +649,12 @@ var MosaicTile = slottable(({ children, asChild, dragHandle, allowedEdges: allow
644
649
  "data-object-id": id,
645
650
  [`data-${MOSAIC_TILE_STATE_ATTR}`]: state.type,
646
651
  role: "listitem",
647
- // Pair `current` prop with `aria-current="true"` so the
648
- // `dx-current` utility (which keys off `aria-[current=true]:`)
649
- // actually fires. Without this the prop is purely advisory and
650
- // any `dx-current` styling on the tile would silently no-op.
652
+ // Pair `current` / `selected` props with `aria-current` / `aria-selected`
653
+ // so the `dx-current` / `dx-selected` / `dx-hover` utilities (which key
654
+ // off those attributes) actually fire. Without this the props are purely
655
+ // advisory and the corresponding styling silently no-ops.
651
656
  "aria-current": current ? "true" : void 0,
657
+ "aria-selected": selected ? "true" : void 0,
652
658
  className,
653
659
  ref: composedRef
654
660
  }, children), state.type === "preview" && /* @__PURE__ */ createPortal(/* @__PURE__ */ React3.createElement(Comp, {
@@ -741,18 +747,19 @@ import { useComposedRefs as useComposedRefs3 } from "@radix-ui/react-compose-ref
741
747
  import { useVirtualizer } from "@tanstack/react-virtual";
742
748
  import React5, { forwardRef as forwardRef2, Fragment, useCallback as useCallback3, useEffect as useEffect3, useRef as useRef5 } from "react";
743
749
  import { invariant } from "@dxos/invariant";
744
- import { composable as composable2, composableProps as composableProps3, mx as mx2 } from "@dxos/ui-theme";
750
+ import { composable as composable2, composableProps as composableProps3 } from "@dxos/react-ui";
751
+ import { mx as mx2 } from "@dxos/ui-theme";
745
752
  var __dxlog_file2 = "/__w/dxos/dxos/packages/ui/react-ui-mosaic/src/components/Mosaic/Stack.tsx";
746
753
  var MOSAIC_STACK_NAME = "MosaicStack";
747
754
  var MosaicStackInner = composable2(({ orientation: orientationProp = "vertical", getId, items, scrollIntoView = true, Tile, draggable: draggable2 = true, debug, ...props }, forwardedRef) => {
748
- const { id, orientation = orientationProp, dragging, currentId, registerScrollTo } = useMosaicContainerContext(MOSAIC_STACK_NAME);
755
+ const { id, orientation = orientationProp, dragging, currentId, selectedIds, registerScrollTo } = useMosaicContainerContext(MOSAIC_STACK_NAME);
749
756
  const visibleItems = useVisibleItems({
750
757
  id,
751
758
  items,
752
759
  dragging: dragging?.source.data,
753
760
  getId
754
761
  });
755
- invariant(orientation === "vertical" || orientation === "horizontal", `Invalid orientation: ${orientation}`, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 45, S: void 0, A: ["orientation === 'vertical' || orientation === 'horizontal'", "`Invalid orientation: ${orientation}`"] });
762
+ invariant(orientation === "vertical" || orientation === "horizontal", `Invalid orientation: ${orientation}`, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 46, S: void 0, A: ["orientation === 'vertical' || orientation === 'horizontal'", "`Invalid orientation: ${orientation}`"] });
756
763
  const rootRef = useRef5(null);
757
764
  const scrollToId = useCallback3((targetId) => {
758
765
  if (!scrollIntoView) {
@@ -795,6 +802,7 @@ var MosaicStackInner = composable2(({ orientation: orientationProp = "vertical",
795
802
  location: index + 1,
796
803
  draggable: draggable2,
797
804
  current: getId(item) === currentId,
805
+ selected: selectedIds?.has(getId(item)),
798
806
  debug
799
807
  }), draggable2 && /* @__PURE__ */ React5.createElement(InternalPlaceholder, {
800
808
  orientation,
@@ -805,8 +813,8 @@ MosaicStackInner.displayName = MOSAIC_STACK_NAME;
805
813
  var MosaicStack = MosaicStackInner;
806
814
  var MOSAIC_VIRTUAL_STACK_NAME = "MosaicVirtualStack";
807
815
  var MosaicVirtualStackInner = /* @__PURE__ */ forwardRef2(({ orientation = "vertical", getId, items, scrollIntoView = true, Tile, estimateSize, getScrollElement, overscan = 8, gap, onChange, draggable: draggable2 = true, debug, ...props }, forwardedRef) => {
808
- invariant(Tile, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 101, S: void 0, A: ["Tile", ""] });
809
- const { id, dragging, currentId, registerScrollTo } = useMosaicContainerContext(MOSAIC_VIRTUAL_STACK_NAME);
816
+ invariant(Tile, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 103, S: void 0, A: ["Tile", ""] });
817
+ const { id, dragging, currentId, selectedIds, registerScrollTo } = useMosaicContainerContext(MOSAIC_VIRTUAL_STACK_NAME);
810
818
  const visibleItems = useVisibleItems({
811
819
  id,
812
820
  items,
@@ -919,6 +927,7 @@ var MosaicVirtualStackInner = /* @__PURE__ */ forwardRef2(({ orientation = "vert
919
927
  location,
920
928
  draggable: draggable2,
921
929
  current: getId(data) === currentId,
930
+ selected: selectedIds?.has(getId(data)),
922
931
  debug
923
932
  }) : /* @__PURE__ */ React5.createElement(InternalPlaceholder, {
924
933
  orientation,
@@ -961,4 +970,4 @@ export {
961
970
  useMosaicTileContext,
962
971
  Mosaic
963
972
  };
964
- //# sourceMappingURL=chunk-RUQB4JIG.mjs.map
973
+ //# sourceMappingURL=chunk-ZVSUYUQC.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/hooks/useVisibleItems.ts", "../../../src/components/Focus/Focus.tsx", "../../../src/components/Mosaic/styles.ts", "../../../src/components/Mosaic/types.ts", "../../../src/components/Mosaic/Root.tsx", "../../../src/components/Mosaic/Container.tsx", "../../../src/components/Mosaic/Tile.tsx", "../../../src/components/Mosaic/Placeholder.tsx", "../../../src/components/Mosaic/Stack.tsx", "../../../src/components/Mosaic/Mosaic.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { type GetId, type MosaicTileData } from '../components';\n\nexport type UseVisibleItemsProps<TItem = any> = {\n /** Container id. */\n id: string;\n\n /** Current items. */\n items?: readonly TItem[] | TItem[];\n\n /** Currently dragging item. */\n dragging: MosaicTileData<TItem> | undefined;\n\n /** ID getter */\n getId: GetId<TItem>;\n};\n\n/**\n * Returns items with the dragging item removed.\n */\nexport const useVisibleItems = <TItem = any>({\n id,\n items,\n dragging,\n getId,\n}: UseVisibleItemsProps<TItem>): readonly TItem[] | TItem[] => {\n const visibleItems = useMemo(() => {\n if (!items || !dragging || id !== dragging.containerId) {\n return items ?? [];\n }\n\n const idx = items.findIndex((item) => getId(item) === dragging.id);\n if (idx === -1) {\n return items;\n }\n\n const visibleItems = items.slice();\n visibleItems.splice(idx, 1);\n return visibleItems;\n }, [id, items, dragging, getId]);\n\n return visibleItems;\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// Re-export from @dxos/react-ui.\nexport { Focus, useFocus, type FocusGroupProps, type FocusItemProps } from '@dxos/react-ui';\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { type ClassNameValue } from '@dxos/react-ui';\n\nexport const styles = {\n placeholder: {\n root: [\n 'group opacity-0',\n 'group-data-[mosaic-debug=\"true\"]:opacity-100',\n 'group-data-[mosaic-debug=\"true\"]:bg-orange-500',\n 'data-[mosaic-placeholder-state=active]:opacity-100',\n 'data-[mosaic-placeholder-orientation=vertical]:snap-start', // TODO(burdon): Option.\n 'data-[mosaic-placeholder-orientation=vertical]:py-1',\n 'data-[mosaic-placeholder-orientation=vertical]:data-[mosaic-placeholder-state=active]:py-2.5',\n 'data-[mosaic-placeholder-orientation=horizontal]:px-1',\n 'data-[mosaic-placeholder-orientation=horizontal]:data-[mosaic-placeholder-state=active]:px-2.5',\n ],\n content: [\n 'transition-all duration-0',\n // TODO(burdon): Don't animate open if placeholder is the source.\n // TODO(burdon): Flickers when start to drag since source is removed and then the placeholder shows up.\n // - Use absolute positioning?\n // 'group-data-[mosaic-placeholder-state=active]:duration-200',\n 'group-data-[mosaic-placeholder-orientation=vertical]:h-0',\n 'group-data-[mosaic-placeholder-orientation=vertical]:group-data-[mosaic-placeholder-state=active]:h-[var(--mosaic-placeholder-height)]',\n 'group-data-[mosaic-placeholder-orientation=horizontal]:w-0',\n 'group-data-[mosaic-placeholder-orientation=horizontal]:group-data-[mosaic-placeholder-state=active]:w-[var(--mosaic-placeholder-width)]',\n ],\n },\n} satisfies Record<string, Record<string, ClassNameValue>>;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ElementDragPayload } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\n\nexport type GetId<TData = any> = (data: TData) => string;\n\n/**\n * NOTE: Must implement value equivalence.\n */\nexport type LocationType = string | number;\n\n/**\n * Get the source data from the drag payload.\n */\nexport const getSourceData = <TData = any, TLocation = any>(\n source: ElementDragPayload,\n): MosaicTileData<TData, TLocation> | null => {\n return source.data.type === 'tile' ? (source.data as MosaicTileData<TData, TLocation>) : null;\n};\n\n/**\n * Draggable item.\n * Tiles may contain arbitrary data (which may not be an ECHO object; e.g., search result).\n */\nexport type MosaicTileData<TData = any, TLocation = any> = {\n type: 'tile';\n containerId: string;\n id: string;\n data: TData;\n location: TLocation;\n bounds?: DOMRect;\n};\n\n/**\n * Drop target placeholder.\n */\nexport type MosaicPlaceholderData<TLocation = any> = {\n type: 'placeholder';\n containerId: string;\n location: TLocation;\n};\n\n/**\n * Drop target container.\n */\nexport type MosaicContainerData = {\n type: 'container';\n id: string;\n};\n\nexport type MosaicData = MosaicTileData | MosaicPlaceholderData | MosaicContainerData;\n\nexport type MosaicTargetData = MosaicTileData | MosaicPlaceholderData;\n\n/**\n * Handler implemented by drop containers.\n */\nexport interface MosaicEventHandler<TData = any, TObject = any> {\n /**\n * Container identifier.\n */\n id: string;\n\n /**\n * Determine if the item can be dropped into this container.\n * NOTE: This is continuously called while dragging (doesn't require mouse movement).\n */\n canDrop?: (props: { source: MosaicTileData<TData> }) => boolean;\n\n /**\n * Called during drag for custom visualization.\n */\n onDrag?: (props: { source: MosaicTileData<TData>; position: { x: number; y: number } }) => void;\n\n /**\n * Insert/rearrange the item at the given location.\n */\n onDrop?: (props: { source: MosaicTileData<TData>; target?: MosaicData }) => void;\n\n /**\n * Request the object to be dropped.\n * This allows the source container to clone/mutate/swap the object before it is dropped.\n * If the callback returns true, then the callback may decide to remove the item from the source container,\n * completing the transfer.\n */\n onTake?: (props: { source: MosaicTileData<TData> }, cb: (object: TObject) => Promise<boolean>) => void;\n\n /**\n * Dragging ended.\n */\n onCancel?: () => void;\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';\nimport { type ElementDragPayload, monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { type DragLocationHistory } from '@atlaskit/pragmatic-drag-and-drop/types';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { createContext } from '@radix-ui/react-context';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Slot } from '@radix-ui/react-slot';\nimport React, { type PropsWithChildren, forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { log } from '@dxos/log';\n\nimport { type MosaicData, type MosaicEventHandler, type MosaicTileData } from './types';\n\n//\n// Context\n//\n\ntype MosaicDraggingSource = {\n data: MosaicTileData;\n handler?: MosaicEventHandler;\n container?: Element;\n};\n\ntype MosaicDraggingTarget = {\n data: MosaicData;\n handler?: MosaicEventHandler;\n};\n\ntype MosaicDraggingState = {\n source: MosaicDraggingSource;\n target?: MosaicDraggingTarget;\n};\n\ntype MosaicRootContextValue = {\n containers: Record<string, MosaicEventHandler>;\n addContainer: (container: MosaicEventHandler) => void;\n removeContainer: (id: string) => void;\n dragging?: MosaicDraggingState;\n};\n\nconst [MosaicRootContextProvider, useMosaicRootContext] = createContext<MosaicRootContextValue>('MosaicRoot');\n\n//\n// Root\n//\n\nconst MOSAIC_ROOT_NAME = 'Mosaic.Root';\n\n// State attribute: [&:has(>_[data-mosaic-debug=true])]\nconst MOSAIC_ROOT_DEBUG_ATTR = 'mosaic-debug';\n\ntype MosaicRootProps = PropsWithChildren<{\n asChild?: boolean;\n debug?: boolean;\n}>;\n\nconst MosaicRoot = forwardRef<HTMLDivElement, MosaicRootProps>(({ children, asChild, debug }, forwardedRef) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = useComposedRefs<HTMLDivElement>(rootRef, forwardedRef);\n const Comp = asChild ? Slot : Primitive.div;\n\n const [handlers, setHandlers] = useState<Record<string, MosaicEventHandler>>({});\n const [dragging, setDragging] = useState<MosaicDraggingState | undefined>();\n\n const getSourceHandler = useCallback(\n (source: ElementDragPayload): { data: MosaicTileData; handler?: MosaicEventHandler } => {\n const data = source.data as MosaicTileData;\n return { data, handler: handlers[data.containerId] };\n },\n [handlers],\n );\n\n const getTargetHandler = useCallback(\n (location: DragLocationHistory): { data?: MosaicData; handler?: MosaicEventHandler } => {\n for (const target of location.current.dropTargets) {\n const data = target.data as MosaicData;\n let containerId: string;\n switch (data.type) {\n case 'tile':\n case 'placeholder':\n containerId = data.containerId;\n break;\n case 'container':\n containerId = data.id;\n break;\n }\n\n const handler = handlers[containerId];\n if (handler) {\n return { data, handler };\n }\n }\n\n return {};\n },\n [handlers],\n );\n\n useEffect(() => {\n const handleChange = ({ source, location }: { source: ElementDragPayload; location: DragLocationHistory }) => {\n const { data: sourceData } = getSourceHandler(source);\n const { data: targetData, handler } = getTargetHandler(location);\n setDragging((dragging) => {\n dragging?.target?.handler?.onCancel?.();\n return {\n source: {\n data: sourceData,\n handler: handlers[sourceData.containerId],\n // TODO(burdon): Check id matches.\n container: location.initial.dropTargets.find((target) => target.data.type === 'container')?.element,\n },\n target: targetData && {\n data: targetData,\n handler,\n },\n };\n });\n };\n\n const handleCancel = () => {\n setDragging((dragging) => {\n requestAnimationFrame(() => {\n dragging?.target?.handler?.onCancel?.();\n dragging?.source?.container?.dispatchEvent(new CustomEvent('dnd:cancel', { bubbles: true }));\n });\n\n return undefined;\n });\n };\n\n let noTargetTimeout: NodeJS.Timeout;\n\n // Main controller.\n return combine(\n monitorForElements({\n /**\n * Dragging started within any container.\n */\n onDragStart: ({ source, location }) => {\n log('Root.onDragStart', {\n source: source.data,\n location: location.current.dropTargets.map((target) => target.data),\n });\n\n handleChange({ source, location });\n },\n\n /**\n * Dragging entered a new container.\n */\n onDropTargetChange: ({ source, location }) => {\n clearTimeout(noTargetTimeout);\n log('Root.onDropTargetChange', {\n source: source.data,\n location: location.current.dropTargets.map((target) => target.data),\n });\n\n // Stop dragging if there are no drop targets (or we are cancelling).\n if (location.current.dropTargets.length === 0) {\n noTargetTimeout = setTimeout(() => setDragging(undefined), 1_000);\n } else {\n handleChange({ source, location });\n }\n },\n\n /**\n * Dragging within any container.\n */\n onDrag: ({ source, location }) => {\n const { data } = getSourceHandler(source);\n const { handler } = getTargetHandler(location);\n if (handler) {\n const { clientX: x, clientY: y } = location.current.input;\n handler.onDrag?.({ source: data, position: { x, y } });\n }\n },\n\n /**\n * Dragging ended.\n */\n onDrop: ({ source, location }) => {\n log.info('Root.onDrop', {\n source: source.data,\n location: location.current.dropTargets.map((target) => target.data),\n });\n\n // Get the source container.\n const { data: sourceData, handler: sourceHandler } = getSourceHandler(source);\n if (!sourceHandler) {\n log.warn('invalid source', {\n source: sourceData,\n handlers: Object.keys(handlers),\n });\n return;\n }\n\n // NOTE: When dragging is cancelled (e.g., user presses ESC) onDrop is only called after a subsequent event.\n // NOTE: pDND blocks ESC event propagation while dragging.\n // - ESC only flips internal state.\n // - Completion happens on the next processed input event.\n // - This avoids reentrancy and keeps pointer/keyboard behavior consistent.\n // - We set dragging to undefined in onDropTargetChange after a delay if there are no drop targets.\n try {\n if (location.current.dropTargets.length === 0) {\n log.info('cancelled');\n } else {\n // Get the target container.\n const { data: targetData, handler: targetHandler } = getTargetHandler(location);\n if (!targetHandler) {\n log.warn('invalid target', {\n source: sourceData,\n location,\n handlers: Object.keys(handlers),\n });\n return;\n }\n\n // TODO(burdon): Check object doesn't already exist in the collection.\n if (sourceHandler === targetHandler) {\n targetHandler.onDrop?.({\n source: sourceData,\n target: targetData,\n });\n } else {\n if (!sourceHandler.onTake) {\n log.warn('invalid source', { source: sourceData });\n return;\n }\n\n sourceHandler.onTake?.({ source: sourceData }, async (object) => {\n targetHandler.onDrop?.({\n source: { ...sourceData, data: object },\n target: targetData,\n });\n\n return true;\n });\n }\n }\n } finally {\n handleCancel();\n }\n },\n }),\n );\n }, [handlers, getSourceHandler, getTargetHandler]);\n\n return (\n <MosaicRootContextProvider\n containers={handlers}\n addContainer={(container) =>\n setHandlers((containers) => ({\n ...containers,\n [container.id]: container,\n }))\n }\n removeContainer={(id) =>\n setHandlers((containers) => {\n delete containers[id];\n return { ...containers };\n })\n }\n dragging={dragging}\n >\n <Comp\n className='contents group'\n {...{\n [`data-${MOSAIC_ROOT_DEBUG_ATTR}`]: debug,\n }}\n ref={composedRef}\n >\n {children}\n </Comp>\n </MosaicRootContextProvider>\n );\n});\n\nMosaicRoot.displayName = MOSAIC_ROOT_NAME;\n\nexport { MosaicRoot, useMosaicRootContext };\n\nexport type { MosaicRootProps, MosaicDraggingState };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { autoScrollForElements } from '@atlaskit/pragmatic-drag-and-drop-auto-scroll/element';\nimport { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';\nimport { dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { createContext } from '@radix-ui/react-context';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Slot } from '@radix-ui/react-slot';\nimport { bind } from 'bind-event-listener';\nimport React, {\n type CSSProperties,\n type PropsWithChildren,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { type AllowedAxis } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { isTruthy } from '@dxos/util';\n\nimport { useFocus } from '../Focus';\nimport { type MosaicDraggingState, useMosaicRootContext } from './Root';\nimport {\n type LocationType,\n type MosaicContainerData,\n type MosaicEventHandler,\n type MosaicTileData,\n getSourceData,\n} from './types';\n\n//\n// Container\n//\n\nconst MOSAIC_CONTAINER_NAME = 'Mosaic.Container';\n\ntype MosaicContainerState = { type: 'idle' } | { type: 'active'; bounds?: DOMRect };\n\ntype MosaicContainerContextValue<TData = any, Location = LocationType> = {\n id: string;\n eventHandler: MosaicEventHandler<TData>;\n orientation?: AllowedAxis;\n dragging?: MosaicDraggingState;\n scrolling?: boolean;\n state: MosaicContainerState;\n\n /** Active drop location. */\n activeLocation?: Location;\n setActiveLocation: (location: Location | undefined) => void;\n\n /** ID of the current (aria-current) item. */\n currentId?: string;\n /** Set the current item by ID. */\n setCurrentId: (id: string | undefined) => void;\n\n /** IDs of selected (aria-selected) items. */\n selectedIds?: ReadonlySet<string>;\n /** Request to set or unset selection on an item by ID. */\n setSelected: (id: string, selected: boolean) => void;\n\n /** Register a scroll-to-item callback (provided by Stack/VirtualStack). */\n registerScrollTo: (fn: ((id: string) => void) | undefined) => void;\n};\n\nconst [MosaicContainerContextProvider, useMosaicContainerContext] =\n createContext<MosaicContainerContextValue>('MosaicContainer');\n\n// State attribute: [&:has(>_[data-mosaic-container-state=active])]\nconst MOSAIC_CONTAINER_STATE_ATTR = 'mosaic-container-state';\n\n// CSS variables: [var(--mosaic-placeholder-xxx)]\nconst MOSAIC_CONTAINER_PLACEHOLDER_WIDTH = '--mosaic-placeholder-width';\nconst MOSAIC_CONTAINER_PLACEHOLDER_HEIGHT = '--mosaic-placeholder-height';\n\nlet counter = 0;\n\ntype MosaicContainerProps = PropsWithChildren<\n Partial<Pick<MosaicContainerContextValue, 'eventHandler' | 'orientation'>> & {\n asChild?: boolean;\n /** Support autoscrolling container when dragging. */\n autoScroll?: HTMLElement | null;\n withFocus?: boolean;\n /** Controlled current-item ID. */\n currentId?: string;\n /** Called when a tile requests to become current. */\n onCurrentChange?: (id: string | undefined) => void;\n /** Controlled set of selected item IDs. */\n selectedIds?: ReadonlySet<string>;\n /** Called when a tile requests to toggle selection. */\n onSelectionChange?: (id: string, selected: boolean) => void;\n debug?: () => ReactNode;\n }\n>;\n\n// TODO(burdon): Make generic.\nconst MosaicContainer = composable<HTMLDivElement, MosaicContainerProps>(\n (\n {\n children,\n eventHandler: eventHandlerProp,\n orientation = 'vertical',\n asChild,\n autoScroll: autoscrollElement,\n withFocus,\n currentId,\n onCurrentChange,\n selectedIds,\n onSelectionChange,\n debug,\n ...props\n },\n forwardedRef,\n ) => {\n const Comp = asChild ? Slot : Primitive.div;\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = useComposedRefs<HTMLDivElement>(rootRef, forwardedRef);\n\n // Handler.\n const eventHandler = useMemo(\n () =>\n eventHandlerProp ?? {\n id: `mosaic-container-${counter++}`,\n },\n [eventHandlerProp],\n );\n\n // State.\n const { dragging } = useMosaicRootContext(MOSAIC_CONTAINER_NAME);\n const [state, setState] = useState<MosaicContainerState>({ type: 'idle' });\n const [activeLocation, setActiveLocation] = useState<LocationType | undefined>();\n const [scrolling, setScrolling] = useState(false);\n const setCurrentId = useCallback((id: string | undefined) => onCurrentChange?.(id), [onCurrentChange]);\n const setSelected = useCallback(\n (id: string, selected: boolean) => onSelectionChange?.(id, selected),\n [onSelectionChange],\n );\n\n // Scroll-to-item: Stack/VirtualStack registers its implementation.\n const scrollToRef = useRef<((id: string) => void) | undefined>(undefined);\n const registerScrollTo = useCallback((fn: ((id: string) => void) | undefined) => {\n scrollToRef.current = fn;\n }, []);\n\n // When currentId changes, scroll the matching item into view.\n useEffect(() => {\n if (currentId) {\n scrollToRef.current?.(currentId);\n }\n }, [currentId]);\n\n // Focus container.\n const { setFocus } = useFocus();\n useEffect(() => {\n if (withFocus) {\n setFocus?.(state.type === 'active' ? 'active' : undefined);\n }\n }, [setFocus, withFocus, state]);\n\n // Register handler.\n const { addContainer, removeContainer } = useMosaicRootContext(eventHandler.id);\n useEffect(() => {\n addContainer(eventHandler);\n return () => removeContainer(eventHandler.id);\n }, [eventHandler]);\n\n const data = useMemo<MosaicContainerData>(\n () =>\n ({\n type: 'container',\n id: eventHandler.id,\n }) satisfies MosaicContainerData,\n [eventHandler.id],\n );\n\n useEffect(() => {\n if (!rootRef.current) {\n return;\n }\n\n // Determine if scrolling (pause drag/drop handlers).\n let timeout: ReturnType<typeof setTimeout>;\n const handleScroll = () => {\n setScrolling(true);\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n setScrolling(false);\n }, 500);\n };\n\n return combine(\n ...[\n /**\n * Custom event for dragging cancellation.\n */\n bind(rootRef.current, {\n type: 'dnd:cancel',\n listener: () => {\n setState({ type: 'idle' });\n },\n }),\n\n // Target.\n dropTargetForElements({\n element: rootRef.current,\n getData: () => data,\n\n /**\n * Test if permitted to drop here.\n * NOTE: Contained Tile and Placeholder elements do the same.\n */\n canDrop: ({ source }) => {\n const data = getSourceData(source);\n return (data && eventHandler.canDrop?.({ source: data })) || false;\n },\n\n // TODO(burdon): Provide semantic intent to onDrop.\n // getDropEffect: () => {\n // return 'move';\n // },\n\n /**\n * Dragging started in this container.\n */\n onDragStart: ({ source }) => {\n const sourceData = source.data as MosaicTileData;\n setState({ type: 'active', bounds: sourceData.bounds });\n },\n /**\n * Dragging entered this container.\n */\n onDragEnter: ({ source }) => {\n const sourceData = source.data as MosaicTileData;\n setState({ type: 'active', bounds: sourceData.bounds });\n },\n /**\n * Dragging left this container.\n * NOTE: If the container isn't full-height, then when the dragged item is temporarily removed the container will shrink,\n * triggering `onDragLeave`, which then causes the item to be added and removed continually (flickering).\n */\n onDragLeave: ({ source }) => {\n const sourceData = source.data as MosaicTileData;\n if (sourceData.containerId !== eventHandler.id) {\n setState({ type: 'idle' });\n }\n },\n /**\n * Dropped in this container.\n */\n onDrop: () => {\n setState({ type: 'idle' });\n },\n }),\n\n // Autoscroll.\n // NOTE: When used with Scrollable we get a spurious warning (in dev mode).\n // \"Auto scrolling has been attached to an element that appears not to be scrollable.\"\n autoscrollElement && [\n autoScrollForElements({\n element: autoscrollElement,\n // canScroll: ({ element: _ }) => {\n // return true;\n // },\n getAllowedAxis: () => orientation,\n getConfiguration: () => ({\n maxScrollSpeed: 'fast',\n }),\n }),\n\n bind(autoscrollElement, {\n type: 'scroll',\n listener: handleScroll,\n }),\n\n () => setScrolling(false),\n ],\n ]\n .filter(isTruthy)\n .flatMap((x) => x),\n );\n }, [rootRef, eventHandler, data, autoscrollElement]);\n\n return (\n <MosaicContainerContextProvider\n id={eventHandler.id}\n eventHandler={eventHandler}\n orientation={orientation}\n state={state}\n dragging={state.type === 'active' ? dragging : undefined}\n scrolling={scrolling}\n activeLocation={activeLocation}\n setActiveLocation={setActiveLocation}\n currentId={currentId}\n setCurrentId={setCurrentId}\n selectedIds={selectedIds}\n setSelected={setSelected}\n registerScrollTo={registerScrollTo}\n >\n <Comp\n {...composableProps(props, {\n classNames: 'h-full',\n style: {\n [MOSAIC_CONTAINER_PLACEHOLDER_WIDTH]:\n state.type === 'active' && state.bounds ? `${state.bounds.width}px` : '0px',\n [MOSAIC_CONTAINER_PLACEHOLDER_HEIGHT]:\n state.type === 'active' && state.bounds ? `${state.bounds.height}px` : '0px',\n } as CSSProperties,\n })}\n {...{\n [`data-${MOSAIC_CONTAINER_STATE_ATTR}`]: state.type,\n }}\n ref={composedRef}\n >\n {children}\n </Comp>\n {debug?.()}\n </MosaicContainerContextProvider>\n );\n },\n);\n\nMosaicContainer.displayName = MOSAIC_CONTAINER_NAME;\n\nexport { MosaicContainer, useMosaicContainerContext };\n\nexport type { MosaicContainerProps, MosaicContainerState };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport {\n type Edge,\n attachClosestEdge,\n extractClosestEdge,\n} from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';\nimport { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';\nimport {\n type ElementDragPayload,\n draggable,\n dropTargetForElements,\n} from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { preserveOffsetOnSource } from '@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source';\nimport { setCustomNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview';\nimport { type DropTargetRecord } from '@atlaskit/pragmatic-drag-and-drop/types';\nimport { composeRefs } from '@radix-ui/react-compose-refs';\nimport { createContext } from '@radix-ui/react-context';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Slot } from '@radix-ui/react-slot';\nimport React, { type PropsWithChildren, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { composableProps, slottable } from '@dxos/react-ui';\n\nimport { useMosaicContainerContext } from './Container';\nimport { type LocationType, type MosaicTileData, getSourceData } from './types';\n\n//\n// Tile\n//\n\nconst MOSAIC_TILE_NAME = 'Mosaic.Tile';\n\ntype MosaicTileState =\n | { type: 'idle' }\n | { type: 'preview'; container: HTMLElement; rect: DOMRect }\n | { type: 'dragging' }\n | { type: 'target'; closestEdge: Edge | null };\n\ntype MosaicTileContextValue = {\n state: MosaicTileState;\n};\n\nconst [MosaicTileContextProvider, useMosaicTileContext] = createContext<MosaicTileContextValue>('MosaicTile');\n\n// State attribute: data-[mosaic-tile-state=dragging]\nconst MOSAIC_TILE_STATE_ATTR = 'mosaic-tile-state';\n\ntype MosaicTileProps<TData = any, TLocation = LocationType> = ThemedClassName<\n PropsWithChildren<{\n className?: string;\n dragHandle?: HTMLElement | null;\n allowedEdges?: Edge[];\n id: string;\n data: TData;\n location: TLocation;\n draggable?: boolean;\n /** Whether this tile is the current (aria-current) item. */\n current?: boolean;\n /** Whether this tile is selected (aria-selected). */\n selected?: boolean;\n debug?: boolean;\n }>\n>;\n\nconst MosaicTile = slottable<HTMLDivElement, MosaicTileProps>(\n (\n {\n children,\n asChild,\n dragHandle,\n allowedEdges: allowedEdgesProp,\n location,\n id,\n data: dataProp,\n draggable: draggableProp,\n current,\n selected,\n debug: _,\n ...props\n },\n forwardedRef,\n ) => {\n const Comp = asChild ? Slot : Primitive.div;\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = composeRefs<HTMLDivElement>(rootRef, forwardedRef);\n\n // State.\n const {\n id: containerId,\n eventHandler,\n orientation,\n scrolling,\n setActiveLocation,\n } = useMosaicContainerContext(MOSAIC_TILE_NAME);\n const [state, setState] = useState<MosaicTileState>({ type: 'idle' });\n\n const allowedEdges = useMemo<Edge[]>(\n () => allowedEdgesProp || (orientation === 'vertical' ? ['top', 'bottom'] : ['left', 'right']),\n [allowedEdgesProp, orientation],\n );\n\n const data = useMemo<MosaicTileData>(\n () =>\n ({\n type: 'tile',\n id,\n containerId,\n data: dataProp,\n location,\n }) satisfies MosaicTileData,\n [containerId, location, dataProp],\n );\n\n useLayoutEffect(() => {\n const root = rootRef.current;\n if (!draggableProp || !root || !containerId || scrolling) {\n return;\n }\n\n const handleChange = ({ self, source }: { self: DropTargetRecord; source: ElementDragPayload }) => {\n if (source.data.id !== dataProp.id) {\n const closestEdge = extractClosestEdge(self.data);\n const location = data.location + (closestEdge === 'top' || closestEdge === 'left' ? -0.5 : 0.5);\n setActiveLocation(location);\n setState({ type: 'target', closestEdge });\n }\n };\n\n return combine(\n // Source.\n draggable({\n element: root,\n dragHandle: dragHandle && state.type !== 'preview' ? dragHandle : undefined,\n canDrag: () => true,\n getInitialData: () => data,\n onGenerateDragPreview: ({ location, nativeSetDragImage }) => {\n setCustomNativeDragPreview({\n nativeSetDragImage,\n getOffset: preserveOffsetOnSource({\n element: root,\n input: location.current.input,\n }),\n render: ({ container }) => {\n data.bounds = root.getBoundingClientRect();\n setState({\n type: 'preview',\n container,\n rect: root.getBoundingClientRect(),\n });\n return () => setState({ type: 'dragging' });\n },\n });\n },\n\n onDragStart: () => {\n setState({ type: 'dragging' });\n },\n onDrop: () => {\n setState({ type: 'idle' });\n },\n }),\n\n // Target.\n dropTargetForElements({\n element: root,\n getData: ({ input, element }) => attachClosestEdge(data, { input, element, allowedEdges }),\n canDrop: ({ source }) => {\n const data = getSourceData(source);\n return (data && eventHandler.canDrop?.({ source: data })) || false;\n },\n onDragEnter: ({ self, source }) => {\n handleChange({ self, source });\n },\n onDragLeave: () => {\n setState({ type: 'idle' });\n setActiveLocation(undefined);\n },\n onDrag: ({ self, source }) => {\n handleChange({ self, source });\n },\n onDrop: () => {\n setState({ type: 'idle' });\n setActiveLocation(undefined);\n },\n }),\n );\n }, [\n rootRef,\n forwardedRef,\n containerId,\n dragHandle,\n eventHandler,\n data,\n scrolling,\n allowedEdges,\n setActiveLocation,\n ]);\n\n const { className, ...rest } = composableProps(props, { classNames: 'relative outline-none' });\n\n // NOTE: Ensure no gaps between cells (prevent drop indicators flickering).\n // NOTE: Ensure padding doesn't change position of cursor when dragging (no margins).\n return (\n <MosaicTileContextProvider state={state}>\n <Comp\n {...rest}\n {...{\n 'data-object-id': id,\n [`data-${MOSAIC_TILE_STATE_ATTR}`]: state.type,\n }}\n role='listitem'\n // Pair `current` / `selected` props with `aria-current` / `aria-selected`\n // so the `dx-current` / `dx-selected` / `dx-hover` utilities (which key\n // off those attributes) actually fire. Without this the props are purely\n // advisory and the corresponding styling silently no-ops.\n aria-current={current ? 'true' : undefined}\n aria-selected={selected ? 'true' : undefined}\n className={className}\n ref={composedRef}\n >\n {children}\n </Comp>\n\n {/* Dragging preview. */}\n {state.type === 'preview' &&\n createPortal(\n <Comp\n {...{\n // NOTE: Use to control appearance while dragging.\n [`data-${MOSAIC_TILE_STATE_ATTR}`]: state.type,\n }}\n className={className}\n style={{\n width: `${state.rect.width}px`,\n height: `${state.rect.height}px`,\n }}\n >\n {children}\n </Comp>,\n state.container,\n )}\n </MosaicTileContextProvider>\n );\n },\n);\n\nMosaicTile.displayName = MOSAIC_TILE_NAME;\n\nexport { MosaicTile, useMosaicTileContext };\n\nexport type { MosaicTileProps, MosaicTileState };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport {\n DropIndicator as NaturalDropIndicator,\n type DropIndicatorProps as NaturalDropIndicatorProps,\n} from '@atlaskit/pragmatic-drag-and-drop-react-drop-indicator/box';\nimport { dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Slot } from '@radix-ui/react-slot';\nimport React, { type PropsWithChildren, useLayoutEffect, useMemo, useRef } from 'react';\n\nimport { type Axis, type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport { useMosaicContainerContext } from './Container';\nimport { useMosaicTileContext } from './Tile';\nimport { type LocationType, type MosaicPlaceholderData, getSourceData } from './types';\n\n//\n// Placeholder\n//\n\nconst MOSAIC_PLACEHOLDER_NAME = 'Mosaic.Placeholder';\n\n// Orientation: data-[mosaic-placeholder-orientation=vertical]\nconst MOSAIC_PLACEHOLDER_ORIENTATION_ATTR = 'mosaic-placeholder-orientation';\n\n// State attribute: data-[mosaic-placeholder-state=active]\nconst MOSAIC_PLACEHOLDER_STATE_ATTR = 'mosaic-placeholder-state';\n\n// Location attribute: data-[mosaic-placeholder-location=0.5]. Identifies the\n// placeholder's slot in its container (0.5, 1.5, 2.5, …) so tests can target\n// a specific gap unambiguously without relying on layout-dependent indices.\nconst MOSAIC_PLACEHOLDER_LOCATION_ATTR = 'mosaic-placeholder-location';\n\ntype MosaicPlaceholderProps<Location = LocationType> = ThemedClassName<\n PropsWithChildren<{\n asChild?: boolean;\n orientation?: Axis;\n location: Location;\n }>\n>;\n\nconst MosaicPlaceholder = <Location extends LocationType = LocationType>({\n classNames,\n children,\n asChild,\n orientation = 'vertical',\n location,\n}: MosaicPlaceholderProps<Location>) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const Comp = asChild ? Slot : Primitive.div;\n const {\n id: containerId,\n eventHandler,\n scrolling,\n activeLocation,\n setActiveLocation,\n } = useMosaicContainerContext(MOSAIC_PLACEHOLDER_NAME);\n const data = useMemo<MosaicPlaceholderData<Location>>(\n () =>\n ({\n type: 'placeholder',\n containerId,\n location,\n }) satisfies MosaicPlaceholderData<Location>,\n [containerId, location],\n );\n\n useLayoutEffect(() => {\n const root = rootRef.current;\n if (!root || scrolling) {\n return;\n }\n\n return dropTargetForElements({\n element: root,\n getData: () => data,\n canDrop: ({ source }) => {\n const data = getSourceData(source);\n return (data && eventHandler.canDrop?.({ source: data })) || false;\n },\n onDragEnter: () => {\n setActiveLocation(data.location);\n },\n onDragLeave: () => {\n setActiveLocation(undefined);\n },\n onDrop: () => {\n setActiveLocation(undefined);\n },\n });\n }, [rootRef, data, scrolling, setActiveLocation]);\n\n return (\n <Comp\n {...{\n [`data-${MOSAIC_PLACEHOLDER_ORIENTATION_ATTR}`]: orientation,\n [`data-${MOSAIC_PLACEHOLDER_STATE_ATTR}`]: data.location === activeLocation ? 'active' : 'idle',\n [`data-${MOSAIC_PLACEHOLDER_LOCATION_ATTR}`]: String(location),\n }}\n role='none'\n className={mx('relative', classNames)}\n ref={rootRef}\n >\n {children}\n </Comp>\n );\n};\n\nMosaicPlaceholder.displayName = MOSAIC_PLACEHOLDER_NAME;\n\n//\n// DropIndicator\n// TODO(burdon): Support DropIndicator or Placeholder variants.\n//\n\nconst DROP_INDICATOR_NAME = 'Mosaic.DropIndicator';\n\ntype MosaicDropIndicatorProps = Omit<NaturalDropIndicatorProps, 'edge'>;\n\nconst MosaicDropIndicator = (props: MosaicDropIndicatorProps) => {\n const { state } = useMosaicTileContext(DROP_INDICATOR_NAME);\n return state.type === 'target' && state.closestEdge ? (\n <NaturalDropIndicator {...props} edge={state.closestEdge} />\n ) : null;\n};\n\nMosaicDropIndicator.displayName = DROP_INDICATOR_NAME;\n\n//\n// Exports\n//\n\nexport { MosaicPlaceholder, MosaicDropIndicator };\n\nexport type { MosaicPlaceholderProps, MosaicDropIndicatorProps };\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { type ReactVirtualizerOptions, useVirtualizer } from '@tanstack/react-virtual';\nimport React, {\n type FC,\n forwardRef,\n Fragment,\n type ReactElement,\n type Ref,\n useCallback,\n useEffect,\n useRef,\n} from 'react';\n\nimport { invariant } from '@dxos/invariant';\nimport { type Axis, type ThemedClassName } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport { useVisibleItems } from '../../hooks';\nimport { useMosaicContainerContext } from './Container';\nimport { MosaicPlaceholder, type MosaicPlaceholderProps } from './Placeholder';\nimport { styles } from './styles';\nimport { type MosaicTileProps } from './Tile';\nimport { type GetId } from './types';\n\n//\n// Mosaic Drag-and-drop\n//\n// Drop targets:\n// - Placeholders exist to allow gaps but prevent deadspace when dragging within a container.\n// - When dragging over a Tile, the placeholder next to the closest edge is activated.\n// - Placeholders expand when active; event handlers are disabled while the container is scrolling.\n//\n// [Container]\n// - [Placeholder 0.5]\n// - [Tile 1 ]\n// - [Placeholder 1.5]\n// - [Tile 2 ]\n// - [Placeholder 2.5]\n// - [Tile 3 ]\n// - [Placeholder 3.5]\n//\n// Implementation Notes\n// - We use [Radix composition](https://www.radix-ui.com/primitives/docs/guides/composition) to factor out composible aspects (e.g., Focus, Mosaic, etc.)\n// - NOTE: Use Slottable only if needed to disambiguate; otherwise a suspected Radix bug causes compositional problems.\n\nconst MOSAIC_STACK_NAME = 'MosaicStack';\n\ntype MosaicStackTileComponent<TData = any> = FC<MosaicTileProps<TData>>;\n\ntype MosaicStackProps<TData = any> = ThemedClassName<\n {\n role?: string;\n orientation?: Axis;\n getId: GetId<TData>;\n items?: readonly TData[];\n scrollIntoView?: boolean;\n Tile: MosaicStackTileComponent<TData>;\n } & Pick<MosaicTileProps<TData>, 'draggable' | 'debug'>\n>;\n\n/**\n * Linear layout of Mosaic tiles.\n * NOTE: This is a low-level component and should be wrapped by a scrollable container.\n */\nconst MosaicStackInner = composable<HTMLDivElement, MosaicStackProps>(\n (\n {\n orientation: orientationProp = 'vertical',\n getId,\n items,\n scrollIntoView = true,\n Tile,\n draggable = true,\n debug,\n ...props\n },\n forwardedRef,\n ) => {\n const {\n id,\n orientation = orientationProp,\n dragging,\n currentId,\n selectedIds,\n registerScrollTo,\n } = useMosaicContainerContext(MOSAIC_STACK_NAME);\n const visibleItems = useVisibleItems({ id, items, dragging: dragging?.source.data, getId });\n invariant(orientation === 'vertical' || orientation === 'horizontal', `Invalid orientation: ${orientation}`);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const scrollToId = useCallback(\n (targetId: string) => {\n if (!scrollIntoView) {\n return;\n }\n\n const el = rootRef.current?.querySelector<HTMLElement>(`[data-object-id=\"${CSS.escape(targetId)}\"]`);\n el?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n },\n [scrollIntoView],\n );\n\n useEffect(() => {\n registerScrollTo(scrollToId);\n return () => registerScrollTo(undefined);\n }, [registerScrollTo, scrollToId]);\n\n const composedRef = useComposedRefs(rootRef, forwardedRef);\n return (\n <div\n {...composableProps(props, {\n role: 'list',\n classNames: [\n 'flex',\n orientation === 'horizontal' && 'h-full [&>*]:shrink-0',\n orientation === 'vertical' && 'flex-col',\n ],\n })}\n ref={composedRef}\n >\n {draggable && <InternalPlaceholder orientation={orientation} location={0.5} />}\n {visibleItems?.map((item, index) => (\n <Fragment key={getId(item)}>\n <Tile\n id={getId(item)}\n data={item}\n location={index + 1}\n draggable={draggable}\n current={getId(item) === currentId}\n selected={selectedIds?.has(getId(item))}\n debug={debug}\n />\n {draggable && <InternalPlaceholder orientation={orientation} location={index + 1.5} />}\n </Fragment>\n ))}\n </div>\n );\n },\n);\n\nMosaicStackInner.displayName = MOSAIC_STACK_NAME;\n\nconst MosaicStack = MosaicStackInner as <TData = any>(\n props: MosaicStackProps<TData> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement;\n\n//\n// VirtualStack\n//\n\nconst MOSAIC_VIRTUAL_STACK_NAME = 'MosaicVirtualStack';\n\ntype MosaicVirtualStackProps<TData = any> = MosaicStackProps<TData> &\n Pick<\n ReactVirtualizerOptions<HTMLElement, HTMLDivElement>,\n 'estimateSize' | 'gap' | 'getScrollElement' | 'overscan' | 'onChange'\n >;\n\nconst MosaicVirtualStackInner = forwardRef<HTMLDivElement, MosaicVirtualStackProps>(\n (\n {\n orientation = 'vertical',\n getId,\n items,\n scrollIntoView = true,\n Tile,\n estimateSize,\n getScrollElement,\n overscan = 8,\n gap,\n onChange,\n draggable = true,\n debug,\n ...props\n },\n forwardedRef,\n ) => {\n invariant(Tile);\n const { id, dragging, currentId, selectedIds, registerScrollTo } =\n useMosaicContainerContext(MOSAIC_VIRTUAL_STACK_NAME);\n const visibleItems = useVisibleItems({ id, items, dragging: dragging?.source.data, getId });\n // In draggable mode virtual indices alternate: even=placeholder, odd=tile.\n // Wrap estimateSize so placeholders get 0 (their actual negligible height) and\n // tile slots receive the caller's estimate at the correct tile index.\n // This keeps getTotalSize() stable as items are measured → no scrollbar drift.\n const wrappedEstimateSize = draggable\n ? (index: number) => (index % 2 === 0 ? 0 : estimateSize(Math.floor(index / 2)))\n : estimateSize;\n\n const virtualizer = useVirtualizer({\n // NOTE: When draggable we double the number of items to allow for placeholders.\n count: draggable ? visibleItems.length * 2 + 1 : visibleItems.length,\n estimateSize: wrappedEstimateSize,\n gap,\n // Key measurements by stable item ID so the size cache survives scrolling;\n // without this, measurements are indexed by position and are lost when items reorder.\n getItemKey: draggable\n ? (index) => (index % 2 === 0 ? `ph-${index}` : getId(visibleItems![Math.floor(index / 2)]))\n : (index) => getId(visibleItems![index]),\n getScrollElement,\n overscan,\n onChange,\n });\n\n // Register scroll-to-item via virtualizer index lookup.\n const scrollToId = useCallback(\n (targetId: string) => {\n const itemIndex = visibleItems.findIndex((item) => getId(item) === targetId);\n if (itemIndex >= 0) {\n if (!scrollIntoView) {\n return;\n }\n\n const virtualIndex = draggable ? itemIndex * 2 + 1 : itemIndex;\n virtualizer.scrollToIndex(virtualIndex, { align: 'start', behavior: 'smooth' });\n }\n },\n [visibleItems, getId, draggable, virtualizer, scrollIntoView],\n );\n\n useEffect(() => {\n registerScrollTo(scrollToId);\n return () => registerScrollTo(undefined);\n }, [registerScrollTo, scrollToId]);\n\n const virtualItems = virtualizer.getVirtualItems();\n const getData = (index: number): { data?: any; location: number } => {\n if (draggable) {\n if (index % 2 === 0) {\n return { location: Math.floor(index / 2) + 0.5 };\n } else {\n return { data: visibleItems![Math.floor(index / 2)], location: Math.floor(index / 2) + 1 };\n }\n } else {\n return { data: visibleItems![index], location: index + 1 };\n }\n };\n\n return (\n <div\n {...composableProps(props, {\n role: 'list',\n classNames: [\n // shrink-0 is required: this div sets an explicit height via inline style (getTotalSize).\n // Without it, a parent flex container (e.g. ScrollArea.Viewport) would shrink this div\n // to the viewport height, collapsing the scroll content and causing scrollbar drift.\n 'flex shrink-0',\n orientation === 'horizontal' && 'h-full [&>*]:shrink-0',\n orientation === 'vertical' && 'flex-col',\n ],\n })}\n style={{\n position: 'relative',\n ...(orientation === 'vertical'\n ? {\n width: '100%',\n height: virtualizer.getTotalSize(),\n }\n : {\n width: virtualizer.getTotalSize(),\n height: '100%',\n }),\n }}\n ref={forwardedRef}\n >\n {virtualItems.map(({ key, index, start }) => {\n const { data, location } = getData(index);\n return (\n <div\n key={key}\n data-index={index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n ...(orientation === 'vertical'\n ? {\n width: '100%',\n transform: `translateY(${start}px)`,\n }\n : {\n height: '100%',\n transform: `translateX(${start}px)`,\n }),\n }}\n ref={virtualizer.measureElement}\n >\n {data ? (\n <Tile\n id={getId(data)}\n data={data}\n location={location}\n draggable={draggable}\n current={getId(data) === currentId}\n selected={selectedIds?.has(getId(data))}\n debug={debug}\n />\n ) : (\n <InternalPlaceholder orientation={orientation} location={location} />\n )}\n </div>\n );\n })}\n </div>\n );\n },\n);\n\nMosaicVirtualStackInner.displayName = MOSAIC_VIRTUAL_STACK_NAME;\n\nconst MosaicVirtualStack = MosaicVirtualStackInner as <TData = any>(\n props: MosaicVirtualStackProps<TData> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement;\n(MosaicVirtualStack as any)[Symbol.for('dxos.composable')] = true;\n\n//\n// InternalPlaceholder\n//\n\nconst InternalPlaceholder = (props: MosaicPlaceholderProps<number>) => {\n return (\n <MosaicPlaceholder {...props} classNames={styles.placeholder.root}>\n <div\n className={mx(\n 'flex h-full bg-base-surface border border-dashed border-separator rounded-xs',\n styles.placeholder.content,\n )}\n />\n </MosaicPlaceholder>\n );\n};\n\nInternalPlaceholder.displayName = 'InternalPlaceholder';\n\n//\n// Exports\n//\n\nexport { MosaicStack, MosaicVirtualStack };\n\nexport type { MosaicStackTileComponent, MosaicStackProps, MosaicVirtualStackProps };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport {\n MosaicContainer,\n type MosaicContainerProps,\n type MosaicContainerState,\n useMosaicContainerContext,\n} from './Container';\nimport {\n MosaicDropIndicator,\n type MosaicDropIndicatorProps,\n MosaicPlaceholder,\n type MosaicPlaceholderProps,\n} from './Placeholder';\nimport { MosaicRoot, type MosaicRootProps, useMosaicRootContext } from './Root';\nimport { MosaicStack, type MosaicStackProps, type MosaicStackTileComponent, MosaicVirtualStack } from './Stack';\nimport { MosaicTile, type MosaicTileProps, type MosaicTileState, useMosaicTileContext } from './Tile';\n\n//\n// Mosaic\n//\n\nexport const Mosaic = {\n Root: MosaicRoot,\n Container: MosaicContainer,\n Tile: MosaicTile,\n Placeholder: MosaicPlaceholder,\n DropIndicator: MosaicDropIndicator,\n Stack: MosaicStack,\n VirtualStack: MosaicVirtualStack,\n};\n\nexport type {\n MosaicRootProps,\n MosaicContainerProps,\n MosaicContainerState,\n MosaicTileProps,\n MosaicTileState,\n MosaicPlaceholderProps,\n MosaicDropIndicatorProps,\n MosaicStackProps,\n MosaicStackTileComponent,\n};\n\nexport {\n useMosaicRootContext as useMosaic,\n useMosaicContainerContext as useMosaicContainer,\n useMosaicTileContext as useMosaicTile,\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["useMemo", "useVisibleItems", "id", "items", "dragging", "getId", "visibleItems", "containerId", "idx", "findIndex", "item", "slice", "splice", "Focus", "useFocus", "styles", "placeholder", "root", "content", "getSourceData", "source", "data", "type", "combine", "monitorForElements", "useComposedRefs", "createContext", "Primitive", "Slot", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "log", "MosaicRootContextProvider", "MOSAIC_ROOT_DEBUG_ATTR", "rootRef", "forwardedRef", "Comp", "asChild", "setHandlers", "dragging", "setDragging", "getSourceHandler", "source", "data", "handler", "handlers", "target", "containerId", "type", "targetData", "getTargetHandler", "onCancel", "container", "location", "dropTargets", "find", "requestAnimationFrame", "bubbles", "noTargetTimeout", "current", "handleChange", "clientX", "onDrag", "position", "x", "y", "sourceData", "sourceHandler", "warn", "object", "targetHandler", "handleCancel", "removeContainer", "containers", "className", "debug", "ref", "composedRef", "children", "MosaicRoot", "displayName", "autoScrollForElements", "combine", "dropTargetForElements", "useComposedRefs", "createContext", "Primitive", "Slot", "bind", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "composable", "composableProps", "isTruthy", "MOSAIC_CONTAINER_NAME", "MosaicContainerContextProvider", "useMosaicContainerContext", "createContext", "MOSAIC_CONTAINER_STATE_ATTR", "MOSAIC_CONTAINER_PLACEHOLDER_WIDTH", "MOSAIC_CONTAINER_PLACEHOLDER_HEIGHT", "counter", "MosaicContainer", "composable", "children", "eventHandler", "eventHandlerProp", "orientation", "asChild", "autoScroll", "autoscrollElement", "withFocus", "currentId", "onCurrentChange", "selectedIds", "onSelectionChange", "debug", "props", "forwardedRef", "Comp", "Slot", "Primitive", "div", "rootRef", "useRef", "composedRef", "useComposedRefs", "useMemo", "id", "dragging", "useMosaicRootContext", "state", "setState", "useState", "type", "activeLocation", "setActiveLocation", "scrolling", "setScrolling", "setCurrentId", "useCallback", "setSelected", "selected", "scrollToRef", "undefined", "registerScrollTo", "fn", "current", "useEffect", "setFocus", "useFocus", "addContainer", "removeContainer", "data", "timeout", "handleScroll", "clearTimeout", "setTimeout", "combine", "bind", "listener", "dropTargetForElements", "element", "getData", "canDrop", "source", "getSourceData", "onDragStart", "sourceData", "bounds", "onDragEnter", "onDragLeave", "containerId", "onDrop", "autoScrollForElements", "getAllowedAxis", "getConfiguration", "maxScrollSpeed", "filter", "isTruthy", "flatMap", "x", "React", "composableProps", "classNames", "style", "width", "height", "ref", "displayName", "attachClosestEdge", "extractClosestEdge", "combine", "draggable", "dropTargetForElements", "preserveOffsetOnSource", "setCustomNativeDragPreview", "composeRefs", "createContext", "Primitive", "Slot", "React", "useLayoutEffect", "useMemo", "useRef", "useState", "createPortal", "composableProps", "slottable", "MOSAIC_TILE_NAME", "MosaicTileContextProvider", "useMosaicTileContext", "createContext", "MOSAIC_TILE_STATE_ATTR", "MosaicTile", "slottable", "children", "asChild", "dragHandle", "allowedEdges", "allowedEdgesProp", "location", "id", "data", "dataProp", "draggable", "draggableProp", "current", "selected", "debug", "_", "props", "forwardedRef", "Comp", "Slot", "Primitive", "div", "rootRef", "useRef", "composedRef", "composeRefs", "containerId", "eventHandler", "orientation", "scrolling", "setActiveLocation", "useMosaicContainerContext", "state", "setState", "useState", "type", "useMemo", "useLayoutEffect", "root", "handleChange", "self", "source", "closestEdge", "extractClosestEdge", "combine", "element", "undefined", "canDrag", "getInitialData", "onGenerateDragPreview", "nativeSetDragImage", "setCustomNativeDragPreview", "getOffset", "preserveOffsetOnSource", "input", "render", "container", "bounds", "getBoundingClientRect", "rect", "onDragStart", "onDrop", "dropTargetForElements", "getData", "attachClosestEdge", "canDrop", "getSourceData", "onDragEnter", "onDragLeave", "onDrag", "className", "rest", "composableProps", "classNames", "React", "role", "aria-current", "aria-selected", "ref", "createPortal", "style", "width", "height", "displayName", "DropIndicator", "NaturalDropIndicator", "dropTargetForElements", "Primitive", "Slot", "React", "useLayoutEffect", "useMemo", "useRef", "mx", "MOSAIC_PLACEHOLDER_NAME", "MOSAIC_PLACEHOLDER_ORIENTATION_ATTR", "MOSAIC_PLACEHOLDER_STATE_ATTR", "MOSAIC_PLACEHOLDER_LOCATION_ATTR", "MosaicPlaceholder", "classNames", "children", "asChild", "orientation", "location", "rootRef", "useRef", "Comp", "Slot", "Primitive", "div", "id", "containerId", "eventHandler", "scrolling", "activeLocation", "setActiveLocation", "useMosaicContainerContext", "data", "useMemo", "type", "useLayoutEffect", "root", "current", "dropTargetForElements", "element", "getData", "canDrop", "source", "getSourceData", "onDragEnter", "onDragLeave", "undefined", "onDrop", "React", "String", "role", "className", "mx", "ref", "displayName", "DROP_INDICATOR_NAME", "MosaicDropIndicator", "props", "state", "useMosaicTileContext", "closestEdge", "NaturalDropIndicator", "edge", "useComposedRefs", "useVirtualizer", "React", "forwardRef", "Fragment", "useCallback", "useEffect", "useRef", "invariant", "composable", "composableProps", "mx", "__dxlog_file", "visibleItems", "useVisibleItems", "draggable", "id", "items", "dragging", "getId", "invariant", "scrollToId", "useCallback", "targetId", "scrollIntoView", "el", "block", "behavior", "useEffect", "registerScrollTo", "composableProps", "React", "orientation", "ref", "Tile", "item", "location", "index", "current", "selected", "selectedIds", "debug", "MosaicStackInner", "useMosaicContainerContext", "MOSAIC_VIRTUAL_STACK_NAME", "count", "gap", "overscan", "onChange", "itemIndex", "virtualizer", "align", "Math", "style", "width", "getTotalSize", "height", "virtualItems", "div", "key", "top", "left", "start", "transform", "data", "InternalPlaceholder", "MosaicVirtualStackInner", "MosaicVirtualStack", "Symbol", "styles", "placeholder", "className", "mx", "Mosaic", "Root", "MosaicRoot", "Container", "MosaicContainer", "Tile", "MosaicTile", "Placeholder", "MosaicPlaceholder", "DropIndicator", "MosaicDropIndicator", "Stack", "MosaicStack", "VirtualStack", "MosaicVirtualStack"]
7
+ }
@@ -8,15 +8,16 @@ import {
8
8
  useMosaicRootContext,
9
9
  useMosaicTileContext,
10
10
  useVisibleItems
11
- } from "./chunk-RUQB4JIG.mjs";
11
+ } from "./chunk-ZVSUYUQC.mjs";
12
12
 
13
13
  // src/components/Board/Board.tsx
14
14
  import { useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
15
15
  import { createContext as createContext2 } from "@radix-ui/react-context";
16
16
  import React4, { forwardRef as forwardRef4, useRef as useRef3, useState as useState3 } from "react";
17
17
  import { ScrollArea as ScrollArea2 } from "@dxos/react-ui";
18
+ import { composable as composable2, composableProps as composableProps2 } from "@dxos/react-ui";
18
19
  import { JsonHighlighter as JsonHighlighter2 } from "@dxos/react-ui-syntax-highlighter";
19
- import { composable as composable2, composableProps as composableProps2, mx as mx3 } from "@dxos/ui-theme";
20
+ import { mx as mx3 } from "@dxos/ui-theme";
20
21
 
21
22
  // src/hooks/useContainerDebug.tsx
22
23
  import React, { forwardRef, useMemo, useRef } from "react";
@@ -259,8 +260,9 @@ import React3, { forwardRef as forwardRef3, useMemo as useMemo4, useState as use
259
260
  import { Obj as Obj2, Ref } from "@dxos/echo";
260
261
  import { useObject } from "@dxos/react-client/echo";
261
262
  import { IconButton, ScrollArea, Toolbar as Toolbar2, useTranslation as useTranslation2 } from "@dxos/react-ui";
263
+ import { composable, composableProps } from "@dxos/react-ui";
262
264
  import { Menu as Menu2, createMenuAction as createMenuAction2 } from "@dxos/react-ui-menu";
263
- import { composable, composableProps, mx as mx2 } from "@dxos/ui-theme";
265
+ import { mx as mx2 } from "@dxos/ui-theme";
264
266
  import { translationKey as translationKey2 } from "#translations";
265
267
 
266
268
  // src/components/Board/Item.tsx
@@ -311,7 +313,7 @@ var BoardItemInner = /* @__PURE__ */ forwardRef2(({ classNames, data, location,
311
313
  "data-testid": "board-item",
312
314
  ref: composedRef,
313
315
  onClick: (event) => event.currentTarget.focus()
314
- }, /* @__PURE__ */ React2.createElement(Card.Toolbar, null, /* @__PURE__ */ React2.createElement(Card.DragHandle, {
316
+ }, /* @__PURE__ */ React2.createElement(Card.Header, null, /* @__PURE__ */ React2.createElement(Card.DragHandle, {
315
317
  ref: setDragHandle,
316
318
  testId: "mosaicBoard.cardDragHandle"
317
319
  }), /* @__PURE__ */ React2.createElement(Card.Title, {
@@ -464,7 +466,7 @@ var DefaultBoardColumn = /* @__PURE__ */ forwardRef3(({ classNames, location, da
464
466
  const eventHandler = useEventHandlerAdapter({
465
467
  id: model.getColumnId(data),
466
468
  items: column?.items ?? [],
467
- getId: (ref) => ref.target?.id ?? ref.dxn.toString(),
469
+ getId: (ref) => ref.target?.id ?? ref.uri,
468
470
  get: (refOrObj) => Ref.isRef(refOrObj) ? refOrObj.target : refOrObj,
469
471
  make: (object) => Ref.make(object),
470
472
  canDrop: ({ source }) => {
@@ -590,7 +592,7 @@ var Board = {
590
592
  // src/components/SearchStack/SearchStack.tsx
591
593
  import React5, { forwardRef as forwardRef5, useCallback, useMemo as useMemo5, useState as useState4 } from "react";
592
594
  import { Card as Card2, ScrollArea as ScrollArea3 } from "@dxos/react-ui";
593
- import { composable as composable3, composableProps as composableProps3 } from "@dxos/ui-theme";
595
+ import { composable as composable3, composableProps as composableProps3 } from "@dxos/react-ui";
594
596
  var SearchStack = composable3(({ results = [], currentId, onAction, ...props }, forwardedRef) => {
595
597
  const [viewport, setViewport] = useState4(null);
596
598
  const items = useMemo5(() => results.map((result) => ({
@@ -668,7 +670,7 @@ var SearchTile = /* @__PURE__ */ forwardRef5(({ data, location, current }, forwa
668
670
  }, /* @__PURE__ */ React5.createElement(Card2.Root, {
669
671
  fullWidth: true,
670
672
  ref: forwardedRef
671
- }, /* @__PURE__ */ React5.createElement(Card2.Toolbar, null, /* @__PURE__ */ React5.createElement(Card2.IconBlock, null), /* @__PURE__ */ React5.createElement(Card2.Title, null, result.label)), result.snippet && /* @__PURE__ */ React5.createElement(Card2.Content, null, /* @__PURE__ */ React5.createElement(Card2.Row, null, /* @__PURE__ */ React5.createElement(Card2.Text, {
673
+ }, /* @__PURE__ */ React5.createElement(Card2.Header, null, /* @__PURE__ */ React5.createElement(Card2.IconBlock, null), /* @__PURE__ */ React5.createElement(Card2.Title, null, result.label)), result.snippet && /* @__PURE__ */ React5.createElement(Card2.Body, null, /* @__PURE__ */ React5.createElement(Card2.Row, null, /* @__PURE__ */ React5.createElement(Card2.Text, {
672
674
  variant: "description"
673
675
  }, result.snippet))))));
674
676
  });