@dxos/react-ui-mosaic 0.8.4-main.fcc0d83b33 → 0.8.4-staging.60fe92afc8
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.
- package/LICENSE +102 -5
- package/dist/lib/browser/{chunk-HOLJERCP.mjs → chunk-I3M5WM6C.mjs} +38 -15
- package/dist/lib/browser/chunk-I3M5WM6C.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +115 -27
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/playwright/index.mjs +118 -10
- package/dist/lib/browser/playwright/index.mjs.map +3 -3
- package/dist/lib/browser/testing/index.mjs +8 -17
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/{chunk-RNSOVDUU.mjs → chunk-DVJLDZLE.mjs} +38 -15
- package/dist/lib/node-esm/chunk-DVJLDZLE.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +115 -27
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/playwright/index.mjs +118 -10
- package/dist/lib/node-esm/playwright/index.mjs.map +3 -3
- package/dist/lib/node-esm/testing/index.mjs +8 -17
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/types/src/components/Board/Board.d.ts +1 -1
- package/dist/types/src/components/Board/Board.d.ts.map +1 -1
- package/dist/types/src/components/Board/Board.stories.d.ts.map +1 -1
- package/dist/types/src/components/Board/Column.d.ts +3 -3
- package/dist/types/src/components/Board/Column.d.ts.map +1 -1
- package/dist/types/src/components/Board/Item.d.ts +1 -1
- package/dist/types/src/components/Board/Item.d.ts.map +1 -1
- package/dist/types/src/components/Mosaic/Container.d.ts +8 -0
- package/dist/types/src/components/Mosaic/Container.d.ts.map +1 -1
- package/dist/types/src/components/Mosaic/Mosaic.d.ts +1 -0
- package/dist/types/src/components/Mosaic/Mosaic.d.ts.map +1 -1
- package/dist/types/src/components/Mosaic/Placeholder.d.ts.map +1 -1
- package/dist/types/src/components/Mosaic/Stack.d.ts.map +1 -1
- package/dist/types/src/components/Mosaic/Tile.d.ts +4 -0
- package/dist/types/src/components/Mosaic/Tile.d.ts.map +1 -1
- package/dist/types/src/components/SearchStack/SearchStack.d.ts +20 -0
- package/dist/types/src/components/SearchStack/SearchStack.d.ts.map +1 -0
- package/dist/types/src/components/SearchStack/SearchStack.stories.d.ts +10 -0
- package/dist/types/src/components/SearchStack/SearchStack.stories.d.ts.map +1 -0
- package/dist/types/src/components/SearchStack/index.d.ts +2 -0
- package/dist/types/src/components/SearchStack/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/playwright/board-manager.d.ts +20 -5
- package/dist/types/src/playwright/board-manager.d.ts.map +1 -1
- package/dist/types/src/testing/CardContainer.d.ts.map +1 -1
- package/dist/types/src/testing/DefaultStackTile.d.ts.map +1 -1
- package/dist/types/src/testing/types.d.ts +4 -6
- package/dist/types/src/testing/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +33 -30
- package/src/components/Board/Board.stories.tsx +4 -6
- package/src/components/Board/Board.tsx +2 -1
- package/src/components/Board/Column.tsx +20 -17
- package/src/components/Board/Item.tsx +12 -9
- package/src/components/Mosaic/Container.tsx +18 -2
- package/src/components/Mosaic/Placeholder.tsx +6 -0
- package/src/components/Mosaic/Stack.tsx +20 -5
- package/src/components/Mosaic/Tile.tsx +11 -2
- package/src/components/Mosaic/extension.ts +1 -1
- package/src/components/SearchStack/SearchStack.stories.tsx +47 -0
- package/src/components/SearchStack/SearchStack.tsx +135 -0
- package/src/components/SearchStack/index.ts +5 -0
- package/src/components/index.ts +1 -0
- package/src/hooks/useContainerDebug.tsx +1 -1
- package/src/playwright/board-manager.ts +168 -13
- package/src/playwright/smoke.spec.ts +3 -3
- package/src/testing/CardContainer.tsx +2 -5
- package/src/testing/DefaultStackTile.tsx +9 -3
- package/src/testing/types.ts +7 -17
- package/dist/lib/browser/chunk-HOLJERCP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-RNSOVDUU.mjs.map +0 -7
package/LICENSE
CHANGED
|
@@ -1,8 +1,105 @@
|
|
|
1
|
-
|
|
2
|
-
Copyright (c) 2022 DXOS
|
|
1
|
+
# Functional Source License, Version 1.1, ALv2 Future License
|
|
3
2
|
|
|
4
|
-
|
|
3
|
+
## Abbreviation
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
FSL-1.1-Apache-2.0
|
|
7
6
|
|
|
8
|
-
|
|
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
|
|
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
|
|
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
|
|
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,6 +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",
|
|
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.
|
|
656
|
+
"aria-current": current ? "true" : void 0,
|
|
657
|
+
"aria-selected": selected ? "true" : void 0,
|
|
647
658
|
className,
|
|
648
659
|
ref: composedRef
|
|
649
660
|
}, children), state.type === "preview" && /* @__PURE__ */ createPortal(/* @__PURE__ */ React3.createElement(Comp, {
|
|
@@ -668,6 +679,7 @@ import { mx } from "@dxos/ui-theme";
|
|
|
668
679
|
var MOSAIC_PLACEHOLDER_NAME = "Mosaic.Placeholder";
|
|
669
680
|
var MOSAIC_PLACEHOLDER_ORIENTATION_ATTR = "mosaic-placeholder-orientation";
|
|
670
681
|
var MOSAIC_PLACEHOLDER_STATE_ATTR = "mosaic-placeholder-state";
|
|
682
|
+
var MOSAIC_PLACEHOLDER_LOCATION_ATTR = "mosaic-placeholder-location";
|
|
671
683
|
var MosaicPlaceholder = ({ classNames, children, asChild, orientation = "vertical", location }) => {
|
|
672
684
|
const rootRef = useRef4(null);
|
|
673
685
|
const Comp = asChild ? Slot4 : Primitive4.div;
|
|
@@ -713,6 +725,7 @@ var MosaicPlaceholder = ({ classNames, children, asChild, orientation = "vertica
|
|
|
713
725
|
return /* @__PURE__ */ React4.createElement(Comp, {
|
|
714
726
|
[`data-${MOSAIC_PLACEHOLDER_ORIENTATION_ATTR}`]: orientation,
|
|
715
727
|
[`data-${MOSAIC_PLACEHOLDER_STATE_ATTR}`]: data.location === activeLocation ? "active" : "idle",
|
|
728
|
+
[`data-${MOSAIC_PLACEHOLDER_LOCATION_ATTR}`]: String(location),
|
|
716
729
|
role: "none",
|
|
717
730
|
className: mx("relative", classNames),
|
|
718
731
|
ref: rootRef
|
|
@@ -734,18 +747,19 @@ import { useComposedRefs as useComposedRefs3 } from "@radix-ui/react-compose-ref
|
|
|
734
747
|
import { useVirtualizer } from "@tanstack/react-virtual";
|
|
735
748
|
import React5, { forwardRef as forwardRef2, Fragment, useCallback as useCallback3, useEffect as useEffect3, useRef as useRef5 } from "react";
|
|
736
749
|
import { invariant } from "@dxos/invariant";
|
|
737
|
-
import { composable as composable2, composableProps as composableProps3
|
|
750
|
+
import { composable as composable2, composableProps as composableProps3 } from "@dxos/react-ui";
|
|
751
|
+
import { mx as mx2 } from "@dxos/ui-theme";
|
|
738
752
|
var __dxlog_file2 = "/__w/dxos/dxos/packages/ui/react-ui-mosaic/src/components/Mosaic/Stack.tsx";
|
|
739
753
|
var MOSAIC_STACK_NAME = "MosaicStack";
|
|
740
754
|
var MosaicStackInner = composable2(({ orientation: orientationProp = "vertical", getId, items, scrollIntoView = true, Tile, draggable: draggable2 = true, debug, ...props }, forwardedRef) => {
|
|
741
|
-
const { id, orientation = orientationProp, dragging, currentId, registerScrollTo } = useMosaicContainerContext(MOSAIC_STACK_NAME);
|
|
755
|
+
const { id, orientation = orientationProp, dragging, currentId, selectedIds, registerScrollTo } = useMosaicContainerContext(MOSAIC_STACK_NAME);
|
|
742
756
|
const visibleItems = useVisibleItems({
|
|
743
757
|
id,
|
|
744
758
|
items,
|
|
745
759
|
dragging: dragging?.source.data,
|
|
746
760
|
getId
|
|
747
761
|
});
|
|
748
|
-
invariant(orientation === "vertical" || orientation === "horizontal", `Invalid orientation: ${orientation}`, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L:
|
|
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}`"] });
|
|
749
763
|
const rootRef = useRef5(null);
|
|
750
764
|
const scrollToId = useCallback3((targetId) => {
|
|
751
765
|
if (!scrollIntoView) {
|
|
@@ -788,6 +802,7 @@ var MosaicStackInner = composable2(({ orientation: orientationProp = "vertical",
|
|
|
788
802
|
location: index + 1,
|
|
789
803
|
draggable: draggable2,
|
|
790
804
|
current: getId(item) === currentId,
|
|
805
|
+
selected: selectedIds?.has(getId(item)),
|
|
791
806
|
debug
|
|
792
807
|
}), draggable2 && /* @__PURE__ */ React5.createElement(InternalPlaceholder, {
|
|
793
808
|
orientation,
|
|
@@ -798,8 +813,8 @@ MosaicStackInner.displayName = MOSAIC_STACK_NAME;
|
|
|
798
813
|
var MosaicStack = MosaicStackInner;
|
|
799
814
|
var MOSAIC_VIRTUAL_STACK_NAME = "MosaicVirtualStack";
|
|
800
815
|
var MosaicVirtualStackInner = /* @__PURE__ */ forwardRef2(({ orientation = "vertical", getId, items, scrollIntoView = true, Tile, estimateSize, getScrollElement, overscan = 8, gap, onChange, draggable: draggable2 = true, debug, ...props }, forwardedRef) => {
|
|
801
|
-
invariant(Tile, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L:
|
|
802
|
-
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);
|
|
803
818
|
const visibleItems = useVisibleItems({
|
|
804
819
|
id,
|
|
805
820
|
items,
|
|
@@ -812,6 +827,10 @@ var MosaicVirtualStackInner = /* @__PURE__ */ forwardRef2(({ orientation = "vert
|
|
|
812
827
|
count: draggable2 ? visibleItems.length * 2 + 1 : visibleItems.length,
|
|
813
828
|
estimateSize: wrappedEstimateSize,
|
|
814
829
|
gap,
|
|
830
|
+
// Inset the stack from both ends by `gap` (matching the inter-item spacing). The virtualizer
|
|
831
|
+
// folds this into item offsets, getTotalSize(), and scrollToIndex, so no manual compensation.
|
|
832
|
+
paddingStart: gap,
|
|
833
|
+
paddingEnd: gap,
|
|
815
834
|
// Key measurements by stable item ID so the size cache survives scrolling;
|
|
816
835
|
// without this, measurements are indexed by position and are lost when items reorder.
|
|
817
836
|
getItemKey: draggable2 ? (index) => index % 2 === 0 ? `ph-${index}` : getId(visibleItems[Math.floor(index / 2)]) : (index) => getId(visibleItems[index]),
|
|
@@ -826,17 +845,20 @@ var MosaicVirtualStackInner = /* @__PURE__ */ forwardRef2(({ orientation = "vert
|
|
|
826
845
|
return;
|
|
827
846
|
}
|
|
828
847
|
const virtualIndex = draggable2 ? itemIndex * 2 + 1 : itemIndex;
|
|
829
|
-
virtualizer.
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
848
|
+
const [offset] = virtualizer.getOffsetForIndex(virtualIndex, "start") ?? [];
|
|
849
|
+
if (offset != null) {
|
|
850
|
+
virtualizer.scrollToOffset(Math.max(0, offset - (gap ?? 0)), {
|
|
851
|
+
behavior: "smooth"
|
|
852
|
+
});
|
|
853
|
+
}
|
|
833
854
|
}
|
|
834
855
|
}, [
|
|
835
856
|
visibleItems,
|
|
836
857
|
getId,
|
|
837
858
|
draggable2,
|
|
838
859
|
virtualizer,
|
|
839
|
-
scrollIntoView
|
|
860
|
+
scrollIntoView,
|
|
861
|
+
gap
|
|
840
862
|
]);
|
|
841
863
|
useEffect3(() => {
|
|
842
864
|
registerScrollTo(scrollToId);
|
|
@@ -912,6 +934,7 @@ var MosaicVirtualStackInner = /* @__PURE__ */ forwardRef2(({ orientation = "vert
|
|
|
912
934
|
location,
|
|
913
935
|
draggable: draggable2,
|
|
914
936
|
current: getId(data) === currentId,
|
|
937
|
+
selected: selectedIds?.has(getId(data)),
|
|
915
938
|
debug
|
|
916
939
|
}) : /* @__PURE__ */ React5.createElement(InternalPlaceholder, {
|
|
917
940
|
orientation,
|
|
@@ -954,4 +977,4 @@ export {
|
|
|
954
977
|
useMosaicTileContext,
|
|
955
978
|
Mosaic
|
|
956
979
|
};
|
|
957
|
-
//# sourceMappingURL=chunk-
|
|
980
|
+
//# sourceMappingURL=chunk-I3M5WM6C.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, 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, 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 // Inset the stack from both ends by `gap` (matching the inter-item spacing). The virtualizer\n // folds this into item offsets, getTotalSize(), and scrollToIndex, so no manual compensation.\n paddingStart: gap,\n paddingEnd: 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 // Align to the item's start, but offset by the inter-item `gap` so the tile lands\n // one gap below the viewport edge rather than flush against it (a plain\n // `scrollToIndex({ align: 'start' })` scrolls the preceding gap out of view).\n const [offset] = virtualizer.getOffsetForIndex(virtualIndex, 'start') ?? [];\n if (offset != null) {\n virtualizer.scrollToOffset(Math.max(0, offset - (gap ?? 0)), { behavior: 'smooth' });\n }\n }\n },\n [visibleItems, getId, draggable, virtualizer, scrollIntoView, gap],\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\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": ";AAIA,SAASA,eAAe;AAqBjB,IAAMC,kBAAkB,CAAc,EAC3CC,IACAC,OACAC,UACAC,MAAK,MACuB;AAC5B,QAAMC,eAAeN,QAAQ,MAAA;AAC3B,QAAI,CAACG,SAAS,CAACC,YAAYF,OAAOE,SAASG,aAAa;AACtD,aAAOJ,SAAS,CAAA;IAClB;AAEA,UAAMK,MAAML,MAAMM,UAAU,CAACC,SAASL,MAAMK,IAAAA,MAAUN,SAASF,EAAE;AACjE,QAAIM,QAAQ,IAAI;AACd,aAAOL;IACT;AAEA,UAAMG,gBAAeH,MAAMQ,MAAK;AAChCL,IAAAA,cAAaM,OAAOJ,KAAK,CAAA;AACzB,WAAOF;EACT,GAAG;IAACJ;IAAIC;IAAOC;IAAUC;GAAM;AAE/B,SAAOC;AACT;;;AC1CA,SAASO,OAAOC,gBAA2D;;;ACCpE,IAAMC,SAAS;EACpBC,aAAa;IACXC,MAAM;MACJ;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;IAEFC,SAAS;MACP;;;;;MAKA;MACA;MACA;MACA;;EAEJ;AACF;;;ACfO,IAAMC,gBAAgB,CAC3BC,WAAAA;AAEA,SAAOA,OAAOC,KAAKC,SAAS,SAAUF,OAAOC,OAA4C;AAC3F;;;AChBA,SAASE,eAAe;AACxB,SAAkCC,0BAA0B;AAE5D,SAASC,uBAAuB;AAChC,SAASC,qBAAqB;AAC9B,SAASC,iBAAiB;AAC1B,SAASC,YAAY;AACrB,OAAOC,SAAiCC,YAAYC,aAAaC,WAAWC,QAAQC,gBAAgB;AAEpG,SAASC,WAAW;AA+BpB,IAAA,eAAOC;AAGP,IAAA,CAAO,2BAAA,oBAAA,IAAA,cAAA,YAAA;AAMP,IAAMC,mBAAAA;IAQJ,yBAAuC;IACvC,aAAoBZ,2BAAgCa,CAAAA,EAAAA,UAASC,SAAAA,MAAAA,GAAAA,iBAAAA;AAC7D,QAAMC,UAAOC,OAAUb,IAAAA;AAEvB,QAAM,cAAWc,gBAAeR,SAA8C,YAAA;AAC9E,QAAM,OAACS,UAAUC,OAAY,UAAGV;AAEhC,QAAMW,CAAAA,UAAAA,WAAmBd,IAAAA,SACtBe,CAAAA,CAAAA;QACC,CAAA,UAAaA,WAAW,IAAA,SAAA;QACxB,mBAAO,YAAA,CAAA,WAAA;UAAEC,OAAAA,OAAAA;WAAMC;MAAoC;MAErD,SAAA,SAAA,KAAA,WAAA;IAACC;KAAS;IAGZ;;2BAGmBC,YAAW,CAAA,aAAA;eACpBC,UAAAA,SAAAA,QAAAA,aAAAA;AACJ,YAAA,OAAaC,OAAI;UACf;cACA,KAAK,MAAA;aACHD;aACA;AACF,wBAAK,KAAA;AACHA;aACA;AACJ,wBAAA,KAAA;AAEMH;MACN;YACE,UAAO,SAAA,WAAA;mBAAED;eAAMC;UAAQ;UACzB;QACF;MAEA;IAEF;AAACC,WAAAA,CAAAA;KAAS;IAGZjB;;YAEI,MAAM;UACN,eAAcqB,CAAAA,EAAAA,QAAYL,SAAS,MAAGM;AACtCV,YAAAA,EAAAA,MAAaD,WAAAA,IAAAA,iBAAAA,MAAAA;YACXA,EAAAA,MAAUO,YAAQF,QAASO,IAAAA,iBAAAA,QAAAA;kBACpB,CAAAZ,cAAA;mBACLG,QAAQ,SAAA,WAAA;;kBAENE;YACA,MAAA;YACAQ,SAAAA,SAAWC,WAAiBC,WAAYC;;YAE1CT,WAAQG,SAAc,QAAA,YAAA,KAAA,CAAA,WAAA,OAAA,KAAA,SAAA,WAAA,GAAA;;kBAEpBL,cAAAA;YACF,MAAA;YACF;UACF;QACF;MAEA,CAAA;;yBAEIY,MAAAA;kBACEjB,CAAAA,cAAUO;8BACQM,MAAAA;qBAAyDK,QAAS,SAAA,WAAA;AAAK,UAAAlB,WAAA,QAAA,WAAA,cAAA,IAAA,YAAA,cAAA;YAC3F,SAAA;UAEA,CAAA,CAAA;QACF,CAAA;AACF,eAAA;MAEImB,CAAAA;IAEJ;AACA,QAAA;;;;;mBAOQhB,CAAAA,EAAQA,QAAOC,SAAI,MAAA;YACnBU,oBAAmBM;UACrB,QAAA,OAAA;UAEAC,UAAa,SAAA,QAAA,YAAA,IAAA,CAAA,WAAA,OAAA,IAAA;yBAAElB,YAAAA,GAAAA,cAAAA,GAAAA,IAAAA,GAAAA,OAAAA,CAAAA;qBAAQW;UAAS;UAClC;QAEA,CAAA;;;;;0BAKM,CAAA,EAAA,QAAA,SAA2B,MAAA;qBACrBX,eAAW;YACnBW,2BAA2BC;UAC7B,QAAA,OAAA;UAEA,UAAA,SAAA,QAAA,YAAA,IAAA,CAAA,WAAA,OAAA,IAAA;QACA,GAAA,EAAA,YAAaK,YAAQL,GAAAA,cAAkB,GAAA,KAAK,GAAG,OAAA,CAAA;AAE/C,YAAA,SAAO,QAAA,YAAA,WAAA,GAAA;AACLM,4BAAa,WAAA,MAAA,YAAA,MAAA,GAAA,GAAA;;uBAAUP;YAAS;YAClC;UACF,CAAA;QAEA;;;;;cAKE,CAAA,EAAM,QAAS,SAAKH,MAAAA;AACpB,cAAIN,EAAAA,KAAS,IAAA,iBAAA,MAAA;cACX,EAAA,QAAQiB,IAAAA,iBAAwB,QAAGR;YACnCT,SAAQkB;gBAAWpB,EAAAA,SAAQC,GAAAA,SAAAA,EAAAA,IAAAA,SAAAA,QAAAA;kBAAMoB,SAAU;oBAAEC;sBAAGC;cAAE;cAAE;YACtD;UACF,CAAA;QAEA;;;;;cAKIvB,CAAAA,EAAAA,QAAQA,SAAW,MAAA;YACnBW,KAAAA,eAAmBM;UACrB,QAAA,OAAA;UAEA,UAAA,SAAA,QAA4B,YAAA,IAAA,CAAA,WAAA,OAAA,IAAA;QAC5B,GAAA,EAAA,YAAcO,YAAU,GAAEtB,cAASuB,GAAAA,KAAAA,GAAa,OAAE,CAAG1B;cAEnDV,EAAIqC,MAAK,YAAA,SAAkB,cAAA,IAAA,iBAAA,MAAA;4BACjBF;cACRrB,KAAAA,kBAAsBA;YACxB,QAAA;YACA,UAAA,OAAA,KAAA,QAAA;UACF,GAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,KAAA,GAAA,OAAA,CAAA;AAEA;QACA;;AAQE,cAAA,SAAO,QAAA,YAAA,WAAA,GAAA;AACL,gBAAA,KAAA,aAAA,QAA4B,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,KAAA,GAAA,OAAA,CAAA;iBAC5B;kBAEEd,EAAIqC,MAAK,YAAA,SAAkB,cAAA,IAAA,iBAAA,QAAA;gCACjBF;kBACRb,KAAAA,kBAAAA;gBACAR,QAAAA;gBACF;gBACA,UAAA,OAAA,KAAA,QAAA;cACF,GAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,KAAA,GAAA,OAAA,CAAA;AAEA;YACA;kCAEYqB,eAAAA;4BACAjB,SAAAA;gBACV,QAAA;gBACK,QAAA;cACL,CAAA;;iCACuCiB,QAAAA;AAAW,oBAAA,KAAA,kBAAA;kBAChD,QAAA;gBACF,GAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,KAAA,GAAA,OAAA,CAAA;AAEAC;;AAA4C,4BAAUE,SAAAA;gBACpDC,QAAAA;wBACE5B,WAAQ;8BAAKwB,SAAU;0BAAEvB;oBAAa,GAAA;oBACtCG,MAAQG;kBACV;kBAEA,QAAO;gBACT,CAAA;AACF,uBAAA;cACF,CAAA;YACF;UACEsB;QACF,UAAA;AACF,uBAAA;QACF;MAED;IAAC1B,CAAAA,CAAAA;;IAA4BK;IAAiB;IAEjD;;SAGmBE,sBAAAA,cACbd,2BAA6B;gBAC3B;kBACCc,CAAAA,cAAa,YAAEA,CAAAA,gBAAAA;MAClB,GAAA;MAEFoB,CAAAA,UACElC,EAAAA,GAAAA;IACE,EAAA;qBACO,CAAA,OAAA,YAAA,CAAA,eAAA;aAAKmC,WAAU,EAAA;AAAC,aAAA;QACzB,GAAA;MAEFlC;;IAGEmC;KAEWzC,sBAAAA,cAAwB,MAAG0C;IAEtCC,WAAKC;IAEJC,CAAAA,QAAAA,sBAAAA,EAAAA,GAAAA;IAIT,KAAA;EAEAC,GAAAA,QAAWC,CAAAA;AAEX,CAAA;;;;ACvRA,SAASC,6BAA6B;AACtC,SAASC,WAAAA,gBAAe;AACxB,SAASC,6BAA6B;AACtC,SAASC,mBAAAA,wBAAuB;AAChC,SAASC,iBAAAA,sBAAqB;AAC9B,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,QAAAA,aAAY;AACrB,SAASC,YAAY;AACrB,OAAOC,UAILC,eAAAA,cACAC,aAAAA,YACAC,WAAAA,UACAC,UAAAA,SACAC,YAAAA,iBACK;AAEP,SAA2BC,YAAYC,uBAAuB;AAC9D,SAASC,gBAAgB;AAgBzB,IAAMC,wBAAwB;AA8B9B,IAAM,CAACC,gCAAgCC,yBAAAA,IACrCC,eAA2C,iBAAA;AAG7C,IAAMC,8BAA8B;AAGpC,IAAMC,qCAAqC;AAC3C,IAAMC,sCAAsC;AAE5C,IAAIC,UAAU;AAqBd,IAAMC,kBAAkBC,WACtB,CACE,EACEC,UACAC,cAAcC,kBACdC,cAAc,YACdC,SACAC,YAAYC,mBACZC,WACAC,WACAC,iBACAC,aACAC,mBACAC,OACA,GAAGC,MAAAA,GAELC,iBAAAA;AAEA,QAAMC,OAAOX,UAAUY,QAAOC,WAAUC;AACxC,QAAMC,UAAUC,QAAuB,IAAA;AACvC,QAAMC,cAAcC,iBAAgCH,SAASL,YAAAA;AAG7D,QAAMb,eAAesB,SACnB,MACErB,oBAAoB;IAClBsB,IAAI,oBAAoB3B,SAAAA;EAC1B,GACF;IAACK;GAAiB;AAIpB,QAAM,EAAEuB,SAAQ,IAAKC,qBAAqBpC,qBAAAA;AAC1C,QAAM,CAACqC,OAAOC,QAAAA,IAAYC,UAA+B;IAAEC,MAAM;EAAO,CAAA;AACxE,QAAM,CAACC,gBAAgBC,iBAAAA,IAAqBH,UAAAA;AAC5C,QAAM,CAACI,WAAWC,YAAAA,IAAgBL,UAAS,KAAA;AAC3C,QAAMM,eAAeC,aAAY,CAACZ,OAA2Bf,kBAAkBe,EAAAA,GAAK;IAACf;GAAgB;AACrG,QAAM4B,cAAcD,aAClB,CAACZ,IAAYc,aAAsB3B,oBAAoBa,IAAIc,QAAAA,GAC3D;IAAC3B;GAAkB;AAIrB,QAAM4B,cAAcnB,QAA2CoB,MAAAA;AAC/D,QAAMC,mBAAmBL,aAAY,CAACM,OAAAA;AACpCH,gBAAYI,UAAUD;EACxB,GAAG,CAAA,CAAE;AAGLE,EAAAA,WAAU,MAAA;AACR,QAAIpC,WAAW;AACb+B,kBAAYI,UAAUnC,SAAAA;IACxB;EACF,GAAG;IAACA;GAAU;AAGd,QAAM,EAAEqC,SAAQ,IAAKC,SAAAA;AACrBF,EAAAA,WAAU,MAAA;AACR,QAAIrC,WAAW;AACbsC,iBAAWlB,MAAMG,SAAS,WAAW,WAAWU,MAAAA;IAClD;EACF,GAAG;IAACK;IAAUtC;IAAWoB;GAAM;AAG/B,QAAM,EAAEoB,cAAcC,gBAAe,IAAKtB,qBAAqBzB,aAAauB,EAAE;AAC9EoB,EAAAA,WAAU,MAAA;AACRG,iBAAa9C,YAAAA;AACb,WAAO,MAAM+C,gBAAgB/C,aAAauB,EAAE;EAC9C,GAAG;IAACvB;GAAa;AAEjB,QAAMgD,OAAO1B,SACX,OACG;IACCO,MAAM;IACNN,IAAIvB,aAAauB;EACnB,IACF;IAACvB,aAAauB;GAAG;AAGnBoB,EAAAA,WAAU,MAAA;AACR,QAAI,CAACzB,QAAQwB,SAAS;AACpB;IACF;AAGA,QAAIO;AACJ,UAAMC,eAAe,MAAA;AACnBjB,mBAAa,IAAA;AACbkB,mBAAaF,OAAAA;AACbA,gBAAUG,WAAW,MAAA;AACnBnB,qBAAa,KAAA;MACf,GAAG,GAAA;IACL;AAEA,WAAOoB,SAAAA,GACF;;;;MAIDC,KAAKpC,QAAQwB,SAAS;QACpBb,MAAM;QACN0B,UAAU,MAAA;AACR5B,mBAAS;YAAEE,MAAM;UAAO,CAAA;QAC1B;MACF,CAAA;;MAGA2B,sBAAsB;QACpBC,SAASvC,QAAQwB;QACjBgB,SAAS,MAAMV;;;;;QAMfW,SAAS,CAAC,EAAEC,OAAM,MAAE;AAClB,gBAAMZ,QAAOa,cAAcD,MAAAA;AAC3B,iBAAQZ,SAAQhD,aAAa2D,UAAU;YAAEC,QAAQZ;UAAK,CAAA,KAAO;QAC/D;;;;;;;;QAUAc,aAAa,CAAC,EAAEF,OAAM,MAAE;AACtB,gBAAMG,aAAaH,OAAOZ;AAC1BrB,mBAAS;YAAEE,MAAM;YAAUmC,QAAQD,WAAWC;UAAO,CAAA;QACvD;;;;QAIAC,aAAa,CAAC,EAAEL,OAAM,MAAE;AACtB,gBAAMG,aAAaH,OAAOZ;AAC1BrB,mBAAS;YAAEE,MAAM;YAAUmC,QAAQD,WAAWC;UAAO,CAAA;QACvD;;;;;;QAMAE,aAAa,CAAC,EAAEN,OAAM,MAAE;AACtB,gBAAMG,aAAaH,OAAOZ;AAC1B,cAAIe,WAAWI,gBAAgBnE,aAAauB,IAAI;AAC9CI,qBAAS;cAAEE,MAAM;YAAO,CAAA;UAC1B;QACF;;;;QAIAuC,QAAQ,MAAA;AACNzC,mBAAS;YAAEE,MAAM;UAAO,CAAA;QAC1B;MACF,CAAA;;;;MAKAxB,qBAAqB;QACnBgE,sBAAsB;UACpBZ,SAASpD;;;;UAITiE,gBAAgB,MAAMpE;UACtBqE,kBAAkB,OAAO;YACvBC,gBAAgB;UAClB;QACF,CAAA;QAEAlB,KAAKjD,mBAAmB;UACtBwB,MAAM;UACN0B,UAAUL;QACZ,CAAA;QAEA,MAAMjB,aAAa,KAAA;;MAGpBwC,OAAOC,QAAAA,EACPC,QAAQ,CAACC,MAAMA,CAAAA,CAAAA;EAEtB,GAAG;IAAC1D;IAASlB;IAAcgD;IAAM3C;GAAkB;AAEnD,SACE,gBAAAwE,OAAA,cAACvF,gCAAAA;IACCiC,IAAIvB,aAAauB;IACjBvB;IACAE;IACAwB;IACAF,UAAUE,MAAMG,SAAS,WAAWL,WAAWe;IAC/CP;IACAF;IACAC;IACAxB;IACA2B;IACAzB;IACA2B;IACAI;KAEA,gBAAAqC,OAAA,cAAC/D,MAAAA;IACE,GAAGgE,gBAAgBlE,OAAO;MACzBmE,YAAY;MACZC,OAAO;QACL,CAACtF,kCAAAA,GACCgC,MAAMG,SAAS,YAAYH,MAAMsC,SAAS,GAAGtC,MAAMsC,OAAOiB,KAAK,OAAO;QACxE,CAACtF,mCAAAA,GACC+B,MAAMG,SAAS,YAAYH,MAAMsC,SAAS,GAAGtC,MAAMsC,OAAOkB,MAAM,OAAO;MAC3E;IACF,CAAA;IAEE,CAAC,QAAQzF,2BAAAA,EAA6B,GAAGiC,MAAMG;IAEjDsD,KAAK/D;KAEJrB,QAAAA,GAEFY,QAAAA,CAAAA;AAGP,CAAA;AAGFd,gBAAgBuF,cAAc/F;;;AClU9B,SAEEgG,mBACAC,0BACK;AACP,SAASC,WAAAA,gBAAe;AACxB,SAEEC,WACAC,yBAAAA,8BACK;AACP,SAASC,8BAA8B;AACvC,SAASC,kCAAkC;AAE3C,SAASC,mBAAmB;AAC5B,SAASC,iBAAAA,sBAAqB;AAC9B,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,QAAAA,aAAY;AACrB,OAAOC,UAAiCC,iBAAiBC,WAAAA,UAASC,UAAAA,SAAQC,YAAAA,iBAAgB;AAC1F,SAASC,oBAAoB;AAG7B,SAASC,mBAAAA,kBAAiBC,iBAAiB;AAS3C,IAAMC,mBAAmB;AAYzB,IAAM,CAACC,2BAA2BC,oBAAAA,IAAwBC,eAAsC,YAAA;AAGhG,IAAMC,yBAAyB;AAmB/B,IAAMC,aAAaC,UACjB,CACE,EACEC,UACAC,SACAC,YACAC,cAAcC,kBACdC,UACAC,IACAC,MAAMC,UACNC,WAAWC,eACXC,SACAC,UACAC,OAAOC,GACP,GAAGC,MAAAA,GAELC,iBAAAA;AAEA,QAAMC,OAAOhB,UAAUiB,QAAOC,WAAUC;AACxC,QAAMC,UAAUC,QAAuB,IAAA;AACvC,QAAMC,cAAcC,YAA4BH,SAASL,YAAAA;AAGzD,QAAM,EACJV,IAAImB,aACJC,cACAC,aACAC,WACAC,kBAAiB,IACfC,0BAA0BrC,gBAAAA;AAC9B,QAAM,CAACsC,OAAOC,QAAAA,IAAYC,UAA0B;IAAEC,MAAM;EAAO,CAAA;AAEnE,QAAM/B,eAAegC,SACnB,MAAM/B,qBAAqBuB,gBAAgB,aAAa;IAAC;IAAO;MAAY;IAAC;IAAQ;MACrF;IAACvB;IAAkBuB;GAAY;AAGjC,QAAMpB,OAAO4B,SACX,OACG;IACCD,MAAM;IACN5B;IACAmB;IACAlB,MAAMC;IACNH;EACF,IACF;IAACoB;IAAapB;IAAUG;GAAS;AAGnC4B,kBAAgB,MAAA;AACd,UAAMC,OAAOhB,QAAQV;AACrB,QAAI,CAACD,iBAAiB,CAAC2B,QAAQ,CAACZ,eAAeG,WAAW;AACxD;IACF;AAEA,UAAMU,eAAe,CAAC,EAAEC,MAAMC,OAAM,MAA0D;AAC5F,UAAIA,OAAOjC,KAAKD,OAAOE,SAASF,IAAI;AAClC,cAAMmC,cAAcC,mBAAmBH,KAAKhC,IAAI;AAChD,cAAMF,YAAWE,KAAKF,YAAYoC,gBAAgB,SAASA,gBAAgB,SAAS,OAAO;AAC3FZ,0BAAkBxB,SAAAA;AAClB2B,iBAAS;UAAEE,MAAM;UAAUO;QAAY,CAAA;MACzC;IACF;AAEA,WAAOE;;MAELlC,UAAU;QACRmC,SAASP;QACTnC,YAAYA,cAAc6B,MAAMG,SAAS,YAAYhC,aAAa2C;QAClEC,SAAS,MAAM;QACfC,gBAAgB,MAAMxC;QACtByC,uBAAuB,CAAC,EAAE3C,UAAAA,WAAU4C,mBAAkB,MAAE;AACtDC,qCAA2B;YACzBD;YACAE,WAAWC,uBAAuB;cAChCR,SAASP;cACTgB,OAAOhD,UAASM,QAAQ0C;YAC1B,CAAA;YACAC,QAAQ,CAAC,EAAEC,UAAS,MAAE;AACpBhD,mBAAKiD,SAASnB,KAAKoB,sBAAqB;AACxCzB,uBAAS;gBACPE,MAAM;gBACNqB;gBACAG,MAAMrB,KAAKoB,sBAAqB;cAClC,CAAA;AACA,qBAAO,MAAMzB,SAAS;gBAAEE,MAAM;cAAW,CAAA;YAC3C;UACF,CAAA;QACF;QAEAyB,aAAa,MAAA;AACX3B,mBAAS;YAAEE,MAAM;UAAW,CAAA;QAC9B;QACA0B,QAAQ,MAAA;AACN5B,mBAAS;YAAEE,MAAM;UAAO,CAAA;QAC1B;MACF,CAAA;;MAGA2B,uBAAsB;QACpBjB,SAASP;QACTyB,SAAS,CAAC,EAAET,OAAOT,QAAO,MAAOmB,kBAAkBxD,MAAM;UAAE8C;UAAOT;UAASzC;QAAa,CAAA;QACxF6D,SAAS,CAAC,EAAExB,OAAM,MAAE;AAClB,gBAAMjC,QAAO0D,cAAczB,MAAAA;AAC3B,iBAAQjC,SAAQmB,aAAasC,UAAU;YAAExB,QAAQjC;UAAK,CAAA,KAAO;QAC/D;QACA2D,aAAa,CAAC,EAAE3B,MAAMC,OAAM,MAAE;AAC5BF,uBAAa;YAAEC;YAAMC;UAAO,CAAA;QAC9B;QACA2B,aAAa,MAAA;AACXnC,mBAAS;YAAEE,MAAM;UAAO,CAAA;AACxBL,4BAAkBgB,MAAAA;QACpB;QACAuB,QAAQ,CAAC,EAAE7B,MAAMC,OAAM,MAAE;AACvBF,uBAAa;YAAEC;YAAMC;UAAO,CAAA;QAC9B;QACAoB,QAAQ,MAAA;AACN5B,mBAAS;YAAEE,MAAM;UAAO,CAAA;AACxBL,4BAAkBgB,MAAAA;QACpB;MACF,CAAA;IAAA;EAEJ,GAAG;IACDxB;IACAL;IACAS;IACAvB;IACAwB;IACAnB;IACAqB;IACAzB;IACA0B;GACD;AAED,QAAM,EAAEwC,WAAW,GAAGC,KAAAA,IAASC,iBAAgBxD,OAAO;IAAEyD,YAAY;EAAwB,CAAA;AAI5F,SACE,gBAAAC,OAAA,cAAC/E,2BAAAA;IAA0BqC;KACzB,gBAAA0C,OAAA,cAACxD,MAAAA;IACE,GAAGqD;IAEF,kBAAkBhE;IAClB,CAAC,QAAQT,sBAAAA,EAAwB,GAAGkC,MAAMG;IAE5CwC,MAAK;;;;;IAKLC,gBAAchE,UAAU,SAASkC;IACjC+B,iBAAehE,WAAW,SAASiC;IACnCwB;IACAQ,KAAKtD;KAEJvB,QAAAA,GAIF+B,MAAMG,SAAS,aACd4C,6BACE,gBAAAL,OAAA,cAACxD,MAAAA;;IAGG,CAAC,QAAQpB,sBAAAA,EAAwB,GAAGkC,MAAMG;IAE5CmC;IACAU,OAAO;MACLC,OAAO,GAAGjD,MAAM2B,KAAKsB,KAAK;MAC1BC,QAAQ,GAAGlD,MAAM2B,KAAKuB,MAAM;IAC9B;KAECjF,QAAAA,GAEH+B,MAAMwB,SAAS,CAAA;AAIzB,CAAA;AAGFzD,WAAWoF,cAAczF;;;ACvPzB,SACE0F,iBAAiBC,4BAEZ;AACP,SAASC,yBAAAA,8BAA6B;AACtC,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,QAAAA,aAAY;AACrB,OAAOC,UAAiCC,mBAAAA,kBAAiBC,WAAAA,UAASC,UAAAA,eAAc;AAGhF,SAASC,UAAU;AAUnB,IAAMC,0BAA0B;AAGhC,IAAMC,sCAAsC;AAG5C,IAAMC,gCAAgC;AAKtC,IAAMC,mCAAmC;AAUzC,IAAMC,oBAAoB,CAA+C,EACvEC,YACAC,UACAC,SACAC,cAAc,YACdC,SAAQ,MACyB;AACjC,QAAMC,UAAUC,QAAuB,IAAA;AACvC,QAAMC,OAAOL,UAAUM,QAAOC,WAAUC;AACxC,QAAM,EACJC,IAAIC,aACJC,cACAC,WACAC,gBACAC,kBAAiB,IACfC,0BAA0BtB,uBAAAA;AAC9B,QAAMuB,OAAOC,SACX,OACG;IACCC,MAAM;IACNR;IACAR;EACF,IACF;IAACQ;IAAaR;GAAS;AAGzBiB,EAAAA,iBAAgB,MAAA;AACd,UAAMC,OAAOjB,QAAQkB;AACrB,QAAI,CAACD,QAAQR,WAAW;AACtB;IACF;AAEA,WAAOU,uBAAsB;MAC3BC,SAASH;MACTI,SAAS,MAAMR;MACfS,SAAS,CAAC,EAAEC,OAAM,MAAE;AAClB,cAAMV,QAAOW,cAAcD,MAAAA;AAC3B,eAAQV,SAAQL,aAAac,UAAU;UAAEC,QAAQV;QAAK,CAAA,KAAO;MAC/D;MACAY,aAAa,MAAA;AACXd,0BAAkBE,KAAKd,QAAQ;MACjC;MACA2B,aAAa,MAAA;AACXf,0BAAkBgB,MAAAA;MACpB;MACAC,QAAQ,MAAA;AACNjB,0BAAkBgB,MAAAA;MACpB;IACF,CAAA;EACF,GAAG;IAAC3B;IAASa;IAAMJ;IAAWE;GAAkB;AAEhD,SACE,gBAAAkB,OAAA,cAAC3B,MAAAA;IAEG,CAAC,QAAQX,mCAAAA,EAAqC,GAAGO;IACjD,CAAC,QAAQN,6BAAAA,EAA+B,GAAGqB,KAAKd,aAAaW,iBAAiB,WAAW;IACzF,CAAC,QAAQjB,gCAAAA,EAAkC,GAAGqC,OAAO/B,QAAAA;IAEvDgC,MAAK;IACLC,WAAWC,GAAG,YAAYtC,UAAAA;IAC1BuC,KAAKlC;KAEJJ,QAAAA;AAGP;AAEAF,kBAAkByC,cAAc7C;AAOhC,IAAM8C,sBAAsB;AAI5B,IAAMC,sBAAsB,CAACC,UAAAA;AAC3B,QAAM,EAAEC,MAAK,IAAKC,qBAAqBJ,mBAAAA;AACvC,SAAOG,MAAMxB,SAAS,YAAYwB,MAAME,cACtC,gBAAAZ,OAAA,cAACa,sBAAAA;IAAsB,GAAGJ;IAAOK,MAAMJ,MAAME;OAC3C;AACN;AAEAJ,oBAAoBF,cAAcC;;;AC9HlC,SAASQ,mBAAAA,wBAAuB;AAChC,SAAuCC,sBAAsB;AAC7D,OAAOC,UAELC,cAAAA,aACAC,UAGAC,eAAAA,cACAC,aAAAA,YACAC,UAAAA,eACK;AAEP,SAASC,iBAAiB;AAC1B,SAA0CC,cAAAA,aAAYC,mBAAAA,wBAAuB;AAC7E,SAASC,MAAAA,WAAU;AASnB,IAAEC,gBAAA;;AA8DE,IAAMC,mBAAeC,YAAAA,CAAgB,EAAA,aAAA,kBAAA,YAAA,OAAA,OAAA,iBAAA,MAAA,MAAA,WAAAC,aAAA,MAAA,OAAA,GAAA,MAAA,GAAA,iBAAA;QAAEC,EAAAA,IAAAA,cAAAA,iBAAAA,UAAAA,WAAAA,aAAAA,iBAAAA,IAAAA,0BAAAA,iBAAAA;QAAIC,eAAAA,gBAAAA;IAAOC;IAAiCC;IAAM,UAAA,UAAA,OAAA;IACzFC;EAEA,CAAA;AACA,YAAMC,gBAAaC,cAChBC,gBAAAA,cAAAA,wBAAAA,WAAAA,IAAAA,EAAAA,YAAAA,YAAAA,GAAAA,eAAAA,GAAAA,IAAAA,GAAAA,QAAAA,GAAAA,CAAAA,8DAAAA,uCAAAA,EAAAA,CAAAA;QACC,UAAKC,QAAAA,IAAgB;qBACnBF,aAAA,CAAA,aAAA;AACF,QAAA,CAAA,gBAAA;AAEA;IACAG;UAAqBC,KAAO,QAAA,SAAA,cAAA,oBAAA,IAAA,OAAA,QAAA,CAAA,IAAA;QAAWC,eAAU;MAAS,OAAA;MAE5D,UAAA;IAACH,CAAAA;KAAe;IAGlBI;;aAEE,MAAO;AACN,qBAAA,UAAA;AAACC,WAAAA,MAAAA,iBAAAA,MAAAA;;IAA6B;IAEjC;EACA,CAAA;QAEK,cAAGC,iBAAuB,SAAA,YAAA;SACnB,gBAAAC,OAAA,cAAA,OAAA;wBACM,OAAA;YACV;kBACAC;QACAA;QACD,gBAAA,gBAAA;QACD,gBAAA,cAAA;MACFC;IAEClB,CAAAA;IAAkCiB,KAAAA;mBAAoC,gBAAAD,OAAA,cAAA,qBAAA;IACtElB;cACgBM;wBACb,CAAA,MAAA,UAACe,gBAAAA,OAAAA,cAAAA,UAAAA;IACClB,KAAIG,MAAMgB,IAAAA;KACJA,gBAAAA,OAAAA,cAAAA,MAAAA;IACNC,IAAAA,MAAUC,IAAAA;IACVtB,MAAAA;IACAuB,UAASnB,QAAMgB;IACfI,WAAUC;IACVC,SAAOA,MAAAA,IAAAA,MAAAA;IAER1B,UAAAA,aAAAA,IAAa,MAAA,IAAA,CAAA;IAAqBiB;MAA0BI,cAAkB,gBAAAL,OAAA,cAAA,qBAAA;;IAKzF,UAAA,QAAA;EAGFW,CAAAA,CAAAA,CAAAA,CAAAA;AAEA,CAAA;AAIA,iBAAE,cAAA;AACF,IAAA,cAAe;IA8BXtB,4BAAUc;IACV,0BAAiCM,gBAAAA,YAAaX,CAAAA,EAAAA,cAC5Cc,YAAAA,OAAAA,OAA0BC,iBAAAA,MAAAA,MAAAA,cAAAA,kBAAAA,WAAAA,GAAAA,KAAAA,UAAAA,WAAAA,aAAAA,MAAAA,OAAAA,GAAAA,MAAAA,GAAAA,iBAAAA;AAC5B,YAAM/B,MAAAA,QAAeC,EAAAA,YAAAA,YAAgB,GAAAF,eAAA,GAAA,KAAA,GAAA,QAAA,GAAA,CAAA,QAAA,EAAA,EAAA,CAAA;QAAEI,EAAAA,IAAAA,UAAAA,WAAAA,aAAAA,iBAAAA,IAAAA,0BAAAA,yBAAAA;QAAIC,eAAAA,gBAAAA;IAAOC;IAAiCC;IAAM,UAAA,UAAA,OAAA;IACzF;EACA,CAAA;QAQE,sBAAAJ,aAAA,CAAA,UAAA,QAAA,MAAA,IAAA,IAAA,aAAgF,KAAA,MAAA,QAAA,CAAA,CAAA,IAAA;QAChF8B,cAAO9B,eAAYF;;IAEnBiC,OAAAA,aAAAA,aAAAA,SAAAA,IAAAA,IAAAA,aAAAA;IACA,cAAA;IACA;;;IAGA,cAAA;IACA,YAAA;;;IAKAC,YAAAA,aAAAA,CAAAA,UAAAA,QAAAA,MAAAA,IAAAA,MAAAA,KAAAA,KAAAA,MAAAA,aAAAA,KAAAA,MAAAA,QAAAA,CAAAA,CAAAA,CAAAA,IAAAA,CAAAA,UAAAA,MAAAA,aAAAA,KAAAA,CAAAA;IACAC;IACF;IAEA;EACA,CAAA;QAGI,aAAIC,aAAgB,CAAA,aAAA;UAClB,YAAKzB,aAAgB,UAAA,CAAA,SAAA,MAAA,IAAA,MAAA,QAAA;qBACnB,GAAA;AACF,UAAA,CAAA,gBAAA;AAEA;MACA;AACA,YAAA,eAAAT,aAAA,YAAA,IAAA,IAAA;YAIEmC,CAAAA,MAAAA,IAAYC,YAAAA,kBAA2BC,cAAiB,OAAK,KAAA,CAAA;oBAAEzB,MAAU;AAAS,oBAAA,eAAA,KAAA,IAAA,GAAA,UAAA,OAAA,EAAA,GAAA;UACpF,UAAA;QACF,CAAA;MAEF;IAACd;;IAAqBE;IAAWmC;IAAa1B;IAAgBsB;IAAI;IAGpElB;;aAEE,MAAO;AACN,qBAAA,UAAA;AAACC,WAAAA,MAAAA,iBAAAA,MAAAA;;IAA6B;IAEjC;EACA,CAAA;QACE,eAAe,YAAA,gBAAA;kBACTQ,CAAAA,UAAQ;oBACH;kBAAED,MAAUiB,GAAAA;AAA4B,eAAA;UAC1C,UAAA,KAAA,MAAA,QAAA,CAAA,IAAA;QACL;;eAAqDjB;UAAoC,MAAA,aAAA,KAAA,MAAA,QAAA,CAAA,CAAA;UAC3F,UAAA,KAAA,MAAA,QAAA,CAAA,IAAA;QACK;MACL;;aAAqCA;QAAoB,MAAA,aAAA,KAAA;QAC3D,UAAA,QAAA;MACF;IAEA;;SAGY,gBAAAL,OAAA,cAAA,OAAA;wBACM,OAAA;YACV;kBACA;;;;QAIAC;QACD,gBAAA,gBAAA;QACD,gBAAA,cAAA;MACFsB;;WAEMtB;gBAEEuB;yBACQL,aAAYM;QAEtB,OAAA;QACED,QAAOL,YAAYM,aAAY;UAC/BC;QACD,OAAA,YAAA,aAAA;QACP,QAAA;MACAxB;IAECyB;IACC,KAAA;kBACA,IAAA,CAAA,EAAA,KACE,OAAA,MAAA,MAACC;UACCC,EAAAA,MAAKA,SAAAA,IAAAA,QAAAA,KAAAA;WACOvB,gBAAAA,OAAAA,cAAAA,OAAAA;MACZiB;oBACY;aACVO;QACAC,UAAM;QACN,KAAI9B;cAEEuB;2BACY,aAAaQ;UAE3B,OAAA;UACEN,WAAQ,cAAA,KAAA;YACRO;UACD,QAAA;UACP,WAAA,cAAA,KAAA;QACA/B;MAECgC;MAEGjD,KAAIG,YAAM8C;cACJA,gBAAAA,OAAAA,cAAAA,MAAAA;MACN7B,IAAAA,MAAUA,IAAAA;MACVrB;MACAuB;MACAC,WAAUC;MACVC,SAAOA,MAAAA,IAAAA,MAAAA;6BAGT,IAAA,MAAA,IAACyB,CAAAA;MAAoBlC;SAAoCI,gBAAAA,OAAAA,cAAAA,qBAAAA;;MAIjE;IAGN,CAAA,CAAA;EAGF+B,CAAAA,CAAAA;AAEA,CAAA;AAICC,wBAA2BC,cAAW;AAEvC,IAAE,qBAAA;AACF,mBAAA,uBAAsB,IAAA,iBAAA,CAAA,IAAA;0BAKU,CAAA,UAAA;SAAcC,gBAAAA,OAAOC,cAAgB,mBAAA;;IAE7DC,YAAWC,OACT,YAAA;;IAMV,WAAAA,IAAA,gFAAA,OAAA,YAAA,OAAA;EAEAP,CAAAA,CAAAA;AAEA;AACA,oBAAU,cAAA;;;ACtUH,IAAMQ,SAAS;EACpBC,MAAMC;EACNC,WAAWC;EACXC,MAAMC;EACNC,aAAaC;EACbC,eAAeC;EACfC,OAAOC;EACPC,cAAcC;AAChB;",
|
|
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", "scrollToOffset", "offset", "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
|
+
}
|