@dxos/react-ui-mosaic 0.8.4-main.69d29f4 → 0.8.4-main.9735255

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 (37) hide show
  1. package/dist/lib/browser/{chunk-4VDZJ3HV.mjs → chunk-UMBPEG4F.mjs} +47 -49
  2. package/dist/lib/browser/chunk-UMBPEG4F.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +1 -1
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/testing/index.mjs +16 -14
  6. package/dist/lib/browser/testing/index.mjs.map +3 -3
  7. package/dist/lib/node-esm/{chunk-KONKDEUD.mjs → chunk-X6GV7SMK.mjs} +47 -49
  8. package/dist/lib/node-esm/chunk-X6GV7SMK.mjs.map +7 -0
  9. package/dist/lib/node-esm/index.mjs +1 -1
  10. package/dist/lib/node-esm/meta.json +1 -1
  11. package/dist/lib/node-esm/testing/index.mjs +16 -14
  12. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  13. package/dist/types/src/components/Card/Card.d.ts +2 -1
  14. package/dist/types/src/components/Card/Card.d.ts.map +1 -1
  15. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
  16. package/dist/types/src/components/Mosaic/Mosaic.d.ts +8 -1
  17. package/dist/types/src/components/Mosaic/Mosaic.d.ts.map +1 -1
  18. package/dist/types/src/components/Scrollable/Scrollable.d.ts +11 -4
  19. package/dist/types/src/components/Scrollable/Scrollable.d.ts.map +1 -1
  20. package/dist/types/src/components/Scrollable/Scrollable.stories.d.ts +6 -4
  21. package/dist/types/src/components/Scrollable/Scrollable.stories.d.ts.map +1 -1
  22. package/dist/types/src/components/Stack/Stack.d.ts +4 -6
  23. package/dist/types/src/components/Stack/Stack.d.ts.map +1 -1
  24. package/dist/types/src/testing/Board.d.ts.map +1 -1
  25. package/dist/types/tsconfig.tsbuildinfo +1 -1
  26. package/package.json +22 -22
  27. package/src/components/Card/Card.tsx +25 -2
  28. package/src/components/Focus/Focus.tsx +2 -0
  29. package/src/components/Mosaic/Mosaic.tsx +32 -33
  30. package/src/components/Scrollable/Scrollable.stories.tsx +34 -8
  31. package/src/components/Scrollable/Scrollable.tsx +7 -18
  32. package/src/components/Stack/Stack.stories.tsx +8 -8
  33. package/src/components/Stack/Stack.tsx +10 -10
  34. package/src/testing/Board.tsx +11 -11
  35. package/src/testing/Virtualizer.stories.tsx +3 -3
  36. package/dist/lib/browser/chunk-4VDZJ3HV.mjs.map +0 -7
  37. package/dist/lib/node-esm/chunk-KONKDEUD.mjs.map +0 -7
@@ -374,11 +374,15 @@ var CardLink = ({ label, href }) => {
374
374
  icon: "ph--arrow-square-out--regular"
375
375
  })));
376
376
  };
377
- var CardIcon = ({ toolbar, ...props }) => {
377
+ var CardIconBlock = ({ classNames, children, role = "none", ...props }) => {
378
378
  return /* @__PURE__ */ React2.createElement("div", {
379
- role: "none",
380
- className: "grid bs-[var(--rail-item)] is-[var(--rail-item)] place-items-center"
381
- }, /* @__PURE__ */ React2.createElement(Icon, {
379
+ ...props,
380
+ role,
381
+ className: mx2("grid bs-[var(--rail-item)] is-[var(--rail-item)] place-items-center", classNames)
382
+ }, children);
383
+ };
384
+ var CardIcon = ({ toolbar, ...props }) => {
385
+ return /* @__PURE__ */ React2.createElement(CardIconBlock, null, /* @__PURE__ */ React2.createElement(Icon, {
382
386
  ...props,
383
387
  size: toolbar ? 5 : 4
384
388
  }));
@@ -395,6 +399,7 @@ var Card = {
395
399
  Close: CardClose,
396
400
  Menu: CardMenu,
397
401
  Icon: CardIcon,
402
+ IconBlock: CardIconBlock,
398
403
  // Content
399
404
  Content: CardContent,
400
405
  Row: CardRow,
@@ -646,7 +651,7 @@ import { isTruthy } from "@dxos/util";
646
651
 
647
652
  // src/components/Scrollable/Scrollable.tsx
648
653
  import { OverlayScrollbarsComponent } from "overlayscrollbars-react";
649
- import React4, { forwardRef as forwardRef3, useEffect, useMemo, useRef as useRef3 } from "react";
654
+ import React4, { forwardRef as forwardRef3, useEffect, useImperativeHandle, useMemo, useRef as useRef3 } from "react";
650
655
  import { mx as mx4 } from "@dxos/ui-theme";
651
656
  import "overlayscrollbars/styles/overlayscrollbars.css";
652
657
  var defaultOptions = {
@@ -673,20 +678,13 @@ var Scrollable = /* @__PURE__ */ forwardRef3(({ classNames, axis = "vertical", p
673
678
  axis,
674
679
  optionsProp
675
680
  ]);
676
- useEffect(() => {
677
- const hostElement = osRef.current?.getElement();
678
- if (forwardedRef) {
679
- if (typeof forwardedRef === "function") {
680
- forwardedRef(hostElement ?? null);
681
- } else {
682
- forwardedRef.current = hostElement ?? null;
683
- }
684
- }
685
- });
681
+ useImperativeHandle(forwardedRef, () => osRef.current?.getElement(), [
682
+ osRef
683
+ ]);
686
684
  useEffect(() => {
687
685
  const instance = osRef.current?.osInstance();
688
686
  if (viewportRef) {
689
- viewportRef.current = instance?.elements().viewport ?? null;
687
+ viewportRef(instance?.elements().viewport ?? null);
690
688
  }
691
689
  }, [
692
690
  osRef,
@@ -706,7 +704,7 @@ var Scrollable = /* @__PURE__ */ forwardRef3(({ classNames, axis = "vertical", p
706
704
  ]);
707
705
  return /* @__PURE__ */ React4.createElement(OverlayScrollbarsComponent, {
708
706
  ...props,
709
- className: mx4(padding && axis === "vertical" ? "pli-3" : "pbe-3", classNames),
707
+ className: mx4(padding && (axis === "vertical" ? "pli-3" : "pbe-3"), classNames),
710
708
  options,
711
709
  events,
712
710
  ref: osRef
@@ -1137,7 +1135,6 @@ var Root = /* @__PURE__ */ forwardRef5(({ classNames, children, asChild, debug }
1137
1135
  source: sourceData
1138
1136
  }, async (object) => {
1139
1137
  targetHandler.onDrop?.({
1140
- // TODO(burdon): Change source!!!
1141
1138
  source: {
1142
1139
  ...sourceData,
1143
1140
  data: object
@@ -1233,25 +1230,17 @@ var Container = /* @__PURE__ */ forwardRef5(({ className, classNames, children,
1233
1230
  }, 500);
1234
1231
  };
1235
1232
  return combine(...[
1236
- // Autoscroll.
1237
- // TODO(burdon): Autoscroll doesn't work well horizontally.
1238
- autoscrollElement && [
1239
- autoScrollForElements({
1240
- element: autoscrollElement,
1241
- canScroll: ({ element: _ }) => {
1242
- return true;
1243
- },
1244
- getAllowedAxis: () => axis,
1245
- getConfiguration: () => ({
1246
- maxScrollSpeed: "fast"
1247
- })
1248
- }),
1249
- bind(autoscrollElement, {
1250
- type: "scroll",
1251
- listener: handleScroll
1252
- }),
1253
- () => setScrolling(false)
1254
- ],
1233
+ /**
1234
+ * Custom event for dragging cancellation.
1235
+ */
1236
+ bind(rootRef.current, {
1237
+ type: "dnd:cancel",
1238
+ listener: () => {
1239
+ setState({
1240
+ type: "idle"
1241
+ });
1242
+ }
1243
+ }),
1255
1244
  // Target.
1256
1245
  dropTargetForElements({
1257
1246
  element: rootRef.current,
@@ -1312,17 +1301,26 @@ var Container = /* @__PURE__ */ forwardRef5(({ className, classNames, children,
1312
1301
  });
1313
1302
  }
1314
1303
  }),
1315
- /**
1316
- * Custom event for dragging cancellation.
1317
- */
1318
- bind(rootRef.current, {
1319
- type: "dnd:cancel",
1320
- listener: () => {
1321
- setState({
1322
- type: "idle"
1323
- });
1324
- }
1325
- })
1304
+ // Autoscroll.
1305
+ // NOTE: When used with Scrollable we get a spurious warning (in dev mode).
1306
+ // "Auto scrolling has been attached to an element that appears not to be scrollable."
1307
+ autoscrollElement && [
1308
+ autoScrollForElements({
1309
+ element: autoscrollElement,
1310
+ // canScroll: ({ element: _ }) => {
1311
+ // return true;
1312
+ // },
1313
+ getAllowedAxis: () => axis,
1314
+ getConfiguration: () => ({
1315
+ maxScrollSpeed: "fast"
1316
+ })
1317
+ }),
1318
+ bind(autoscrollElement, {
1319
+ type: "scroll",
1320
+ listener: handleScroll
1321
+ }),
1322
+ () => setScrolling(false)
1323
+ ]
1326
1324
  ].filter(isTruthy).flatMap((x) => x));
1327
1325
  }, [
1328
1326
  rootRef,
@@ -1636,4 +1634,4 @@ export {
1636
1634
  useTileContext,
1637
1635
  Mosaic
1638
1636
  };
1639
- //# sourceMappingURL=chunk-4VDZJ3HV.mjs.map
1637
+ //# sourceMappingURL=chunk-UMBPEG4F.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/Card/styles.ts", "../../../src/components/Image/Image.tsx", "../../../src/components/Card/Card.tsx", "../../../src/translations.ts", "../../../src/components/Focus/styles.ts", "../../../src/components/Focus/Focus.tsx", "../../../src/components/Mosaic/styles.ts", "../../../src/components/Mosaic/extension.ts", "../../../src/hooks/useContainerDebug.tsx", "../../../src/components/Mosaic/Mosaic.tsx", "../../../src/components/Scrollable/Scrollable.tsx", "../../../src/components/Stack/Stack.tsx", "../../../src/hooks/useEventHandlerAdapter.ts", "../../../src/hooks/useVisibleItems.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ClassNameValue } from '@dxos/react-ui';\n\nexport const styles = {\n root: 'group/card relative min-bs-[--rail-item] overflow-hidden is-full card-min-width __card-max-width',\n border:\n 'bg-cardSurface border border-separator dark:border-subduedSeparator rounded-sm dx-focus-ring-group-y-indicator',\n\n /**\n * Row grid.\n * NOTE: Rows should provide their own line padding (since they may need to encapsulate buttons, etc.)\n */\n grid_3: 'grid grid-cols-[var(--rail-item)_minmax(0,1fr)_var(--rail-item)] gap-x-1',\n grid_2: 'grid grid-cols-[var(--rail-item)_minmax(0,1fr)] gap-x-1',\n\n // TODO(burdon): Address density.\n grid_3_coarse: 'grid grid-cols-[var(--l0-avatar-size)_minmax(0,1fr)_var(--rail-item)] gap-x-1',\n\n poster: 'max-bs-[200px]',\n} satisfies Record<string, ClassNameValue>;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type SyntheticEvent, useCallback, useRef, useState } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nconst cache = new Map<string, string>();\n\nexport type ImageProps = ThemedClassName<\n {\n src: string;\n alt?: string;\n crossOrigin?: 'anonymous' | 'use-credentials' | '';\n } & ColorOptions\n>;\n\n// TODO(burdon): Option for neutral background color.\nexport const Image = ({\n classNames,\n src,\n alt = '',\n crossOrigin = 'anonymous',\n sampleSize = 64,\n contrast = 0.9,\n}: ImageProps) => {\n const [crossOriginState, setCrossOriginState] = useState<ImageProps['crossOrigin']>(crossOrigin);\n const [dominantColor, setDominantColor] = useState<string | undefined>(undefined);\n const [imageLoaded, setImageLoaded] = useState<boolean>(false);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n // CORS not supported by server.\n const handleImageError = (): void => {\n setCrossOriginState(undefined);\n };\n\n const handleImageLoad = useCallback(\n ({ target }: SyntheticEvent<HTMLImageElement>): void => {\n const rgb = cache.get(src);\n if (rgb) {\n setDominantColor(rgb);\n setImageLoaded(true);\n return;\n }\n\n const img = target as HTMLImageElement;\n if (!canvasRef.current) {\n return;\n }\n\n try {\n const color = extractDominantColor(canvasRef.current, img, { sampleSize, contrast });\n if (color) {\n const rgb = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;\n cache.set(src, rgb);\n setDominantColor(rgb);\n }\n } catch {\n setCrossOriginState(undefined);\n }\n\n setImageLoaded(true);\n },\n [sampleSize, contrast, src],\n );\n\n return (\n <div\n className={mx(`relative flex is-full justify-center overflow-hidden transition-all duration-700`, classNames)}\n style={{\n backgroundColor: dominantColor,\n }}\n >\n {/* Hidden canvas for color extraction. */}\n <canvas ref={canvasRef} style={{ display: 'none' }} aria-hidden='true' />\n\n {/* Background gradient overlay for smooth transition. */}\n <div\n className='absolute inset-0 pointer-events-none'\n style={{\n background: dominantColor\n ? `radial-gradient(circle at center, transparent 30%, ${dominantColor} 100%)`\n : undefined,\n transition: 'opacity 0.7s ease-in-out',\n opacity: 0.5,\n }}\n />\n\n <img\n src={src}\n alt={alt}\n crossOrigin={crossOriginState}\n onError={handleImageError}\n onLoad={handleImageLoad}\n className={mx('z-10 object-contain transition-opacity duration-500', classNames)}\n style={{\n opacity: imageLoaded ? 1 : 0,\n }}\n />\n </div>\n );\n};\n\ntype ColorOptions = {\n sampleSize?: number;\n contrast?: number;\n};\n\n/**\n * Get dominant color from image (esp. from corners).\n */\nconst extractDominantColor = (\n canvas: HTMLCanvasElement,\n img: HTMLImageElement,\n { sampleSize = 64, contrast = 0.95 }: ColorOptions,\n): [number, number, number] | null => {\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return null;\n }\n\n // Draw the image scaled down.\n canvas.width = sampleSize;\n canvas.height = sampleSize;\n ctx.drawImage(img, 0, 0, sampleSize, sampleSize);\n\n // Get image data.\n const imageData = ctx.getImageData(0, 0, sampleSize, sampleSize);\n const pixels = imageData.data;\n\n // Check for transparent background.\n if (isTransparent(pixels, sampleSize)) {\n return null;\n }\n\n let r = 0;\n let g = 0;\n let b = 0;\n let totalWeight = 0;\n\n // Define corner sampling areas (e.g., 25% of each dimension from each corner).\n const cornerSize = Math.floor(sampleSize * 0.125);\n\n // Sample only pixels in corner areas.\n for (let y = 0; y < sampleSize; y++) {\n for (let x = 0; x < sampleSize; x++) {\n // Check if pixel is in any corner area.\n const isInTopLeft = x < cornerSize && y < cornerSize;\n const isInTopRight = x >= sampleSize - cornerSize && y < cornerSize;\n const isInBottomLeft = x < cornerSize && y >= sampleSize - cornerSize;\n const isInBottomRight = x >= sampleSize - cornerSize && y >= sampleSize - cornerSize;\n if (!isInTopLeft && !isInTopRight && !isInBottomLeft && !isInBottomRight) {\n continue; // Skip pixels not in corner areas.\n }\n\n const i = (y * sampleSize + x) * 4;\n const red = pixels[i];\n const green = pixels[i + 1];\n const blue = pixels[i + 2];\n const alpha = pixels[i + 3];\n\n // Skip transparent pixels.\n if (alpha === 0) continue;\n\n // Calculate saturation to weight vibrant colors more.\n const max = Math.max(red, green, blue);\n const min = Math.min(red, green, blue);\n const saturation = max === 0 ? 0 : (max - min) / max;\n const weight = 1 + saturation * 2;\n\n r += red * weight;\n g += green * weight;\n b += blue * weight;\n totalWeight += weight;\n }\n }\n\n if (totalWeight > 0) {\n // Slightly darken the color for better contrast.\n r = Math.round(Math.round(r / totalWeight) * contrast);\n g = Math.round(Math.round(g / totalWeight) * contrast);\n b = Math.round(Math.round(b / totalWeight) * contrast);\n return [r, g, b];\n }\n\n return null;\n};\n\n/**\n * Detects if an image has a transparent background by examining edge pixels.\n * @param pixels - Image pixel data from canvas\n * @param sampleSize - Size of the sampled image\n * @param threshold - Percentage threshold for considering background transparent (default: 0.5)\n * @returns True if the image has a transparent background\n */\nconst isTransparent = (pixels: Uint8ClampedArray, sampleSize: number, threshold: number = 0.5): boolean => {\n let edgeTransparentPixels = 0;\n const edgePixels = sampleSize * 4 - 4; // Perimeter minus corners counted twice.\n\n for (let x = 0; x < sampleSize; x++) {\n // Top edge.\n const topIndex = x * 4;\n if (pixels[topIndex + 3] === 0) edgeTransparentPixels++;\n\n // Bottom edge.\n const bottomIndex = ((sampleSize - 1) * sampleSize + x) * 4;\n if (pixels[bottomIndex + 3] === 0) edgeTransparentPixels++;\n }\n\n for (let y = 1; y < sampleSize - 1; y++) {\n // Left edge.\n const leftIndex = y * sampleSize * 4;\n if (pixels[leftIndex + 3] === 0) edgeTransparentPixels++;\n\n // Right edge.\n const rightIndex = (y * sampleSize + sampleSize - 1) * 4;\n if (pixels[rightIndex + 3] === 0) edgeTransparentPixels++;\n }\n\n return edgeTransparentPixels / edgePixels > threshold;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Slot } from '@radix-ui/react-slot';\nimport React, {\n type ComponentPropsWithoutRef,\n type HTMLAttributes,\n type PropsWithChildren,\n createContext,\n forwardRef,\n useContext,\n} from 'react';\n\nimport {\n Button,\n type Density,\n DropdownMenu,\n Icon,\n type IconProps,\n type ThemedClassName,\n Toolbar,\n type ToolbarRootProps,\n useTranslation,\n} from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport { translationKey } from '../../translations';\nimport { Image } from '../Image';\n\nimport { styles } from './styles';\n\ntype CardSharedProps = ThemedClassName<ComponentPropsWithoutRef<'div'>> & {\n asChild?: boolean;\n className?: string;\n};\n\n//\n// Context\n//\n\ntype CardContextValue = {\n menuItems?: CardMenuItem<any>[];\n};\n\n/** @deprecated Create context for menus. */\nconst CardContext = createContext<CardContextValue>({});\n\n//\n// Root\n//\n\ntype CardRootProps = CardSharedProps & {\n id?: string;\n border?: boolean;\n fullWidth?: boolean;\n};\n\nconst CardRoot = forwardRef<HTMLDivElement, CardRootProps>(\n (\n { children, classNames, className, id, asChild, role = 'group', border = true, fullWidth, ...props },\n forwardedRef,\n ) => {\n const Root = asChild ? Slot : 'div';\n\n return (\n <Root\n {...(id && { 'data-object-id': id })}\n {...props}\n role={role}\n className={mx(styles.root, border && styles.border, fullWidth && '!max-is-none', className, classNames)}\n ref={forwardedRef}\n >\n {children}\n </Root>\n );\n },\n);\n\n//\n// Toolbar\n//\n\ntype CardToolbarProps = ToolbarRootProps & {\n // TODO(burdon): Generalize: 1. systematic across theme; 2. should affect rows, etc.\n density?: Density;\n};\n\nconst CardToolbar = forwardRef<HTMLDivElement, CardToolbarProps>(\n ({ children, classNames, density = 'fine', ...props }, forwardedRef) => {\n return (\n <Toolbar.Root\n {...props}\n classNames={[\n 'density-fine bg-transparent',\n density === 'fine' ? styles.grid_3 : styles.grid_3_coarse,\n classNames,\n ]}\n ref={forwardedRef}\n >\n {children}\n </Toolbar.Root>\n );\n },\n);\n\nconst CardToolbarIconButton = Toolbar.IconButton;\nconst CardToolbarSeparator = Toolbar.Separator;\n\n//\n// DragHandle\n//\n\ntype CardDragHandleProps = {};\n\nconst CardDragHandle = forwardRef<HTMLButtonElement, CardDragHandleProps>((_, forwardedRef) => {\n const { t } = useTranslation(translationKey);\n\n return (\n <Toolbar.IconButton\n data-testid='card-drag-handle'\n noTooltip\n iconOnly\n icon='ph--dots-six-vertical--regular'\n variant='ghost'\n label={t('drag handle label')}\n classNames='cursor-pointer'\n size={5}\n disabled={!forwardedRef}\n ref={forwardedRef}\n />\n );\n});\n\n//\n// Close\n//\n\ntype CardCloseProps = { onClick?: () => void };\n\nconst CardClose = forwardRef<HTMLButtonElement, CardCloseProps>(({ onClick }, forwardedRef) => {\n const { t } = useTranslation(translationKey);\n\n return (\n <Toolbar.IconButton\n iconOnly\n icon='ph--x--regular'\n variant='ghost'\n label={t('card close label')}\n classNames='cursor-pointer'\n size={5}\n onClick={onClick}\n ref={forwardedRef}\n />\n );\n});\n\n//\n// Menu\n//\n\ntype CardMenuItem<T extends any | void = void> = {\n label: string;\n onClick: (context: T) => void;\n};\n\ntype CardMenuProps<T extends any | void = void> = {\n context?: T;\n items?: CardMenuItem<T>[];\n};\n\nconst CardMenu = <T extends any | void = void>({ context, items }: CardMenuProps<T>) => {\n const { t } = useTranslation(translationKey);\n const { menuItems } = useContext(CardContext) ?? {};\n const combinedItems = [...(items ?? []), ...((menuItems as CardMenuItem<T>[]) ?? [])];\n\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger disabled={!combinedItems.length} asChild>\n <Card.ToolbarIconButton\n iconOnly\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n label={t('action menu label')}\n />\n </DropdownMenu.Trigger>\n {(combinedItems?.length ?? 0) > 0 && (\n <DropdownMenu.Portal>\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\n {combinedItems?.map(({ label, onClick: onSelect }, i) => (\n <DropdownMenu.Item key={i} onSelect={() => onSelect(context as T)}>\n {label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n )}\n </DropdownMenu.Root>\n );\n};\n\n//\n// Title\n//\n\ntype CardTitleProps = CardSharedProps;\n\nconst CardTitle = forwardRef<HTMLDivElement, CardTitleProps>(\n ({ children, classNames, className, asChild, role = 'heading', ...props }, forwardedRef) => {\n const Root = asChild ? Slot : 'div';\n\n return (\n <Root {...props} role={role} className={mx('grow truncate', classNames, className)} ref={forwardedRef}>\n {children}\n </Root>\n );\n },\n);\n\n//\n// Content\n// TODO(burdon): Root for card--content role (possibly multiple).\n// - Able to add menu options/set title, etc. via context.\n// TODO(burdon): Consider collapsible sections (surfaces).\n//\n\ntype CardContentProps = PropsWithChildren;\n\nconst CardContent = forwardRef<HTMLDivElement, CardContentProps>(({ children, ...props }, forwardedRef) => {\n return (\n <div role='none' className='contents [&>:last-child]:pbe-1' {...props} ref={forwardedRef}>\n {children}\n </div>\n );\n});\n\n//\n// Row\n//\n\ntype CardRowProps = CardSharedProps & { icon?: string };\n\nconst CardRow = forwardRef<HTMLDivElement, CardRowProps>(\n ({ children, classNames, className, role = 'none', icon, ...props }, forwardedRef) => {\n return (\n <div {...props} role={role} className={mx(styles.grid_2, 'pli-1', classNames, className)} ref={forwardedRef}>\n {(icon && <CardIcon classNames='text-subdued' icon={icon} />) || <div />}\n {children}\n </div>\n );\n },\n);\n\n//\n// Heading\n//\n\ntype CardHeadingProps = CardSharedProps & { variant?: 'default' | 'subtitle' };\n\nconst CardHeading = forwardRef<HTMLDivElement, CardHeadingProps>(\n ({ children, classNames, className, asChild, role = 'heading', variant = 'default', ...props }, forwardedRef) => {\n const Root = asChild ? Slot : 'div';\n // NOTE: Padding align first line of text with center of icon.\n const variantClassNames: Record<string, string> = {\n default: 'plb-1',\n subtitle: 'plb-2 text-xs text-description font-medium uppercase',\n };\n\n return (\n <Root {...props} role={role} className={mx(variantClassNames[variant], classNames, className)} ref={forwardedRef}>\n {children}\n </Root>\n );\n },\n);\n\n//\n// Text\n//\n\ntype CardTextProps = CardSharedProps & { truncate?: boolean; variant?: 'default' | 'description' };\n\nconst CardText = forwardRef<HTMLDivElement, CardTextProps>(\n (\n { children, classNames, className, asChild, role = 'none', truncate, variant = 'default', ...props },\n forwardedRef,\n ) => {\n const Root = asChild ? Slot : 'div';\n // NOTE: Padding align first line of text with center of icon.\n const variantClassNames: Record<string, { root: string; span?: string }> = {\n default: {\n root: 'plb-1',\n },\n description: {\n root: 'plb-1.5',\n span: 'text-sm text-description line-clamp-3',\n },\n };\n\n return (\n <Root\n {...props}\n role={role}\n className={mx('flex overflow-hidden', variantClassNames[variant].root, classNames, className)}\n ref={forwardedRef}\n >\n <span className={mx(variantClassNames[variant].span, truncate && 'truncate')}>{children}</span>\n </Root>\n );\n },\n);\n\n//\n// Poster\n//\n\ntype CardPosterProps = ThemedClassName<\n {\n alt: string;\n aspect?: 'video' | 'auto';\n } & Partial<{ image: string; icon: string }>\n>;\n\nconst CardPoster = (props: CardPosterProps) => {\n const aspect = props.aspect === 'auto' ? 'aspect-auto' : 'aspect-video';\n if (props.image) {\n return (\n <div role='none' className='mbe-1'>\n <Image classNames={[styles.poster, aspect, props.classNames]} src={props.image} alt={props.alt} />\n </div>\n );\n }\n\n if (props.icon) {\n return (\n <div\n role='image'\n className={mx('grid place-items-center bg-inputSurface text-subdued', styles.poster, aspect, props.classNames)}\n aria-label={props.alt}\n >\n <Icon icon={props.icon} size={10} />\n </div>\n );\n }\n};\n\n//\n// Action\n//\n\ntype CardActionProps = { icon?: string; label: string; actionIcon?: string; onClick?: () => void };\n\nconst CardAction = ({ icon, actionIcon = 'ph--arrow-right--regular', label, onClick }: CardActionProps) => {\n return (\n <div role='none' className='is-full pli-1'>\n <Button\n variant='ghost'\n classNames={mx(styles.grid_3, '!p-0 is-full text-start overflow-hidden')}\n onClick={onClick}\n >\n {icon ? <CardIcon classNames='text-subdued' icon={icon} /> : <div />}\n <span className={mx('min-is-0 flex-1 truncate', !actionIcon && 'col-span-2')}>{label}</span>\n {actionIcon && <CardIcon icon={actionIcon} />}\n </Button>\n </div>\n );\n};\n\n//\n// Link\n//\n\ntype CardLinkProps = { label: string; href: string };\n\nconst CardLink = ({ label, href }: CardLinkProps) => {\n return (\n <div role='none' className='is-full pli-1'>\n <a\n className={mx(styles.grid_3, 'group !p-0 dx-button dx-focus-ring !min-bs-1')}\n data-variant='ghost'\n href={href}\n target='_blank'\n rel='noreferrer'\n >\n <CardIcon classNames='text-subdued' icon='ph--link--regular' />\n <span className={mx('min-is-0 flex-1 truncate')}>{label}</span>\n <CardIcon classNames='invisible group-hover:visible' icon='ph--arrow-square-out--regular' />\n </a>\n </div>\n );\n};\n\n//\n// IconBlock\n//\n\nconst CardIconBlock = ({\n classNames,\n children,\n role = 'none',\n ...props\n}: ThemedClassName<PropsWithChildren<HTMLAttributes<HTMLDivElement>>>) => {\n return (\n <div\n {...props}\n role={role}\n className={mx('grid bs-[var(--rail-item)] is-[var(--rail-item)] place-items-center', classNames)}\n >\n {children}\n </div>\n );\n};\n\n//\n// Icon\n//\n\nconst CardIcon = ({ toolbar, ...props }: IconProps & { toolbar?: boolean }) => {\n return (\n <CardIconBlock>\n <Icon {...props} size={toolbar ? 5 : 4} />\n </CardIconBlock>\n );\n};\n\n//\n// Card\n//\n\nexport const Card = {\n Context: CardContext,\n Root: CardRoot,\n\n // Toolbar\n Toolbar: CardToolbar,\n ToolbarIconButton: CardToolbarIconButton,\n ToolbarSeparator: CardToolbarSeparator,\n DragHandle: CardDragHandle,\n Title: CardTitle,\n Close: CardClose,\n Menu: CardMenu,\n Icon: CardIcon,\n IconBlock: CardIconBlock,\n\n // Content\n Content: CardContent,\n Row: CardRow,\n Heading: CardHeading,\n Text: CardText,\n Poster: CardPoster,\n Action: CardAction,\n Link: CardLink,\n};\n\nexport type { CardContextValue, CardRootProps, CardToolbarProps, CardMenuProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nexport const translationKey = '@dxos/react-ui-mosaic';\n\nexport const translations = [\n {\n 'en-US': {\n [translationKey]: {},\n },\n },\n] as const satisfies Resource[];\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { type ClassNameValue } from '@dxos/react-ui';\n\n// TODO(burdon): Theme?\nexport const styles = {\n container: {\n // TODO(burdon): Handle selection (aria-current?)\n // TODO(burdon): Use ring instead of border?\n root: [\n 'outline-none border border-separator rounded-sm',\n // Focus (e.g., via tabster).\n // TODO(burdon): Why is ! required?\n 'focus:!border-accentSurface',\n // Active (e.g., drop target).\n 'data-[focus-state=active]:border-neutralFocusIndicator',\n // Error\n // TODO(burdon): Error token.\n 'data-[focus-state=error]:border-rose-500',\n ],\n },\n} satisfies Record<string, Record<string, ClassNameValue>>;\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport {\n type UseArrowNavigationGroupOptions,\n useArrowNavigationGroup,\n useFocusableGroup,\n useMergedTabsterAttributes_unstable,\n} from '@fluentui/react-tabster';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Slot } from '@radix-ui/react-slot';\nimport React, { type PropsWithChildren, createContext, forwardRef, useContext, useRef, useState } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport { styles } from './styles';\n\n//\n// Context\n//\n\ntype FocusState = 'active' | 'error';\n\nconst FOCUS_STATE_ATTR = 'focus-state';\n\ntype ContextValue = {\n setFocus?: (state: FocusState | undefined) => void;\n};\n\nconst FocusContext = createContext<ContextValue>({});\n\nconst useFocus = () => useContext(FocusContext);\n\n//\n// Group\n//\n\ntype GroupProps = ThemedClassName<\n PropsWithChildren<\n {\n asChild?: boolean;\n } & Pick<UseArrowNavigationGroupOptions, 'axis'>\n >\n> & { className?: string };\n\n// TODO(wittjosiah): Consider how this could integrate with with react-ui-attention.\n// Perhaps react-ui-attention comes under the mosaic umbrella as it supports selection?\nconst Group = forwardRef<HTMLDivElement, GroupProps>(\n ({ classNames, className, children, asChild, axis = 'vertical', ...props }: GroupProps, forwardedRef) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = useComposedRefs<HTMLDivElement>(rootRef, forwardedRef);\n const Root = asChild ? Slot : Primitive.div;\n\n // TODO(burdon): Configure.\n const focusableGroupAttrs = useFocusableGroup({\n tabBehavior: 'limited-trap-focus',\n });\n const arrowNavigationAttrs = useArrowNavigationGroup({\n axis,\n memorizeCurrent: true,\n });\n const tabsterAttrs = useMergedTabsterAttributes_unstable(focusableGroupAttrs, arrowNavigationAttrs);\n const [state, setState] = useState<FocusState | undefined>();\n\n return (\n <FocusContext.Provider value={{ setFocus: setState }}>\n <Root\n tabIndex={0}\n className={mx(styles.container.root, className, classNames)}\n {...tabsterAttrs}\n {...(state && {\n [`data-${FOCUS_STATE_ATTR}`]: state,\n })}\n {...props}\n ref={composedRef}\n >\n {children}\n </Root>\n </FocusContext.Provider>\n );\n },\n);\n\n//\n// Focus\n//\n\nexport const Focus = {\n Group,\n};\n\nexport type { GroupProps as FocusGroupProps };\n\nexport { useFocus };\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-axis=vertical]:plb-1',\n 'data-[mosaic-placeholder-axis=vertical]:data-[mosaic-placeholder-state=active]:plb-2.5',\n 'data-[mosaic-placeholder-axis=horizontal]:pli-1',\n 'data-[mosaic-placeholder-axis=horizontal]:data-[mosaic-placeholder-state=active]:pli-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-axis=vertical]:bs-0',\n 'group-data-[mosaic-placeholder-axis=horizontal]:is-0',\n 'group-data-[mosaic-placeholder-axis=vertical]:group-data-[mosaic-placeholder-state=active]:bs-[var(--mosaic-placeholder-height)]',\n 'group-data-[mosaic-placeholder-axis=horizontal]:group-data-[mosaic-placeholder-state=active]:is-[var(--mosaic-placeholder-width)]',\n ],\n },\n} satisfies Record<string, Record<string, ClassNameValue>>;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Extension, StateEffect, StateField } from '@codemirror/state';\nimport { Decoration, type DecorationSet, EditorView, ViewPlugin, WidgetType } from '@codemirror/view';\n\nexport type DropHandlerEvent = {\n text: string;\n url: string;\n};\n\nexport type DropHandlerOptions = {\n onDrop?: (view: EditorView, pos: number, event: DropHandlerEvent) => void;\n};\n\nexport type DropHandler = {\n extension: Extension;\n update: (position: { x: number; y: number } | null) => void;\n cancel: () => void;\n drop: (event: DropHandlerEvent) => void;\n};\n\nexport const dropHandler = ({ onDrop = handleDrop }: DropHandlerOptions = {}): DropHandler => {\n const views = new Set<EditorView>();\n let state: { view: EditorView; pos: number } | null = null;\n\n const reset = () => {\n views.forEach((view) => view.dispatch({ effects: setDrop.of(null) }));\n state = null;\n };\n\n const extension: Extension = [\n dropField,\n ViewPlugin.fromClass(\n class {\n constructor(readonly _view: EditorView) {\n views.add(_view);\n }\n\n destroy() {\n views.delete(this._view);\n }\n },\n ),\n ];\n\n return {\n extension,\n update: (position: { x: number; y: number } | null) => {\n if (!position) {\n reset();\n return;\n }\n\n views.forEach((view) => {\n const rect = view.dom.getBoundingClientRect();\n if (\n position.x >= rect.left &&\n position.x <= rect.right &&\n position.y >= rect.top &&\n position.y <= rect.bottom\n ) {\n let pos = view.posAtCoords(position);\n if (pos !== null) {\n const word = view.state.wordAt(pos);\n if (word) {\n const startDist = Math.abs(pos - word.from);\n const endDist = Math.abs(pos - word.to);\n pos = startDist < endDist ? word.from : word.to;\n }\n\n view.dispatch({ effects: setDrop.of(pos) });\n state = { view, pos };\n return;\n }\n }\n\n view.dispatch({ effects: setDrop.of(null) });\n });\n },\n cancel: () => {\n reset();\n },\n drop: ({ text, url }) => {\n if (state) {\n onDrop(state.view, state.pos, { text, url });\n }\n\n reset();\n },\n } satisfies DropHandler;\n};\n\nconst handleDrop = (view: EditorView, pos: number, event: DropHandlerEvent) => {\n const line = view.state.doc.lineAt(pos);\n if (line.text.trim() === '') {\n view.dispatch({\n changes: { from: pos, insert: `\\n![${event.text}](${event.url})\\n` },\n effects: setDrop.of(null),\n });\n } else {\n view.dispatch({\n changes: { from: pos, insert: ` [${event.text}](${event.url})` },\n effects: setDrop.of(null),\n });\n }\n};\n\nconst setDrop = StateEffect.define<number | null>();\n\nconst dropField = StateField.define<DecorationSet>({\n create: () => Decoration.none,\n update: (decorations, tr) => {\n for (const effect of tr.effects) {\n if (effect.is(setDrop)) {\n if (effect.value === null) {\n return Decoration.none;\n }\n return Decoration.set([\n Decoration.widget({\n widget: new (class extends WidgetType {\n toDOM() {\n const dom = document.createElement('span');\n dom.className = 'cm-drop-cursor';\n dom.style.borderLeft = '2px solid var(--dx-accentSurface)';\n dom.style.display = 'inline-block';\n dom.style.height = '1em';\n dom.style.verticalAlign = 'middle';\n return dom;\n }\n })(),\n side: 0,\n }).range(effect.value),\n ]);\n }\n }\n return decorations.map(tr.changes);\n },\n provide: (field) => EditorView.decorations.from(field),\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type FC, type ReactNode, forwardRef, useMemo, useRef } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { Json } from '@dxos/react-ui-syntax-highlighter';\nimport { mx } from '@dxos/ui-theme';\n\nimport { useMosaicContainer } from '../components';\n\nexport type UseContainerDebug = [FC<ThemedClassName>, (() => ReactNode) | undefined];\n\n/**\n * Hook that returns a component to be rendered in the container's viewport (within the context),\n * and a component that creates a portal in the container's debug area.\n */\nexport const useContainerDebug = (debug?: boolean): UseContainerDebug => {\n const debugRef = useRef<HTMLDivElement | null>(null);\n return useMemo(() => {\n if (!debug) {\n return [() => null, undefined];\n }\n\n return [\n ({ classNames }) => <div role='none' className={mx('overflow-hidden', classNames)} ref={debugRef} />,\n () => debugRef.current && createPortal(<ContainerInfo />, debugRef.current),\n ];\n }, [debug, debugRef]);\n};\n\nconst ContainerInfo = forwardRef<HTMLDivElement, ThemedClassName>(({ classNames }, forwardedRef) => {\n const { id, state, activeLocation, scrolling } = useMosaicContainer(ContainerInfo.displayName!);\n const counter = useRef(0);\n return (\n <Json\n data={{ id, activeLocation, scrolling, state, count: counter.current++ }}\n classNames={mx('text-xs', classNames)}\n ref={forwardedRef}\n />\n );\n});\n\nContainerInfo.displayName = 'ContainerInfo';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';\nimport {\n type ElementDragPayload,\n draggable,\n dropTargetForElements,\n monitorForElements,\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 DragLocationHistory, type DropTargetRecord } from '@atlaskit/pragmatic-drag-and-drop/types';\nimport { autoScrollForElements } from '@atlaskit/pragmatic-drag-and-drop-auto-scroll/element';\nimport {\n type Edge,\n attachClosestEdge,\n extractClosestEdge,\n} from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';\nimport {\n DropIndicator as NativeDropIndicator,\n type DropIndicatorProps as NativeDropIndicatorProps,\n} from '@atlaskit/pragmatic-drag-and-drop-react-drop-indicator/box';\nimport { composeRefs, 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 forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { log } from '@dxos/log';\nimport { type SlottableClassName, type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\nimport { isTruthy } from '@dxos/util';\n\nimport { useFocus } from '../Focus';\nimport { Scrollable, type ScrollableProps } from '../Scrollable';\nimport { Stack, type StackProps, VirtualStack } from '../Stack';\n\nimport {\n type AllowedAxis,\n type Axis,\n type MosaicContainerData,\n type MosaicData,\n type MosaicEventHandler,\n type MosaicPlaceholderData,\n type MosaicTileData,\n} 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\n//\n// Types\n//\n\nconst 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// Context\n//\n\ntype DraggingSource = {\n data: MosaicTileData;\n handler?: MosaicEventHandler;\n container?: Element;\n};\n\ntype DraggingTarget = {\n data: MosaicData;\n handler?: MosaicEventHandler;\n};\n\ntype DraggingState = {\n source: DraggingSource;\n target?: DraggingTarget;\n};\n\ntype RootContextValue = {\n containers: Record<string, MosaicEventHandler>;\n addContainer: (container: MosaicEventHandler) => void;\n removeContainer: (id: string) => void;\n dragging?: DraggingState;\n};\n\nconst [RootContextProvider, useRootContext] = createContext<RootContextValue>('MosaicRoot');\n\n//\n// Root\n//\n\n// State attribute: [&:has(>_[data-mosaic-debug=true])]\nconst ROOT_DEBUG_ATTR = 'mosaic-debug';\n\ntype RootProps = ThemedClassName<PropsWithChildren<{ asChild?: boolean; debug?: boolean }>>;\n\nconst Root = forwardRef<HTMLDivElement, RootProps>(({ classNames, children, asChild, debug }, forwardedRef) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = useComposedRefs<HTMLDivElement>(rootRef, forwardedRef);\n const Root = asChild ? Slot : Primitive.div;\n\n const [handlers, setHandlers] = useState<Record<string, MosaicEventHandler>>({});\n const [dragging, setDragging] = useState<DraggingState | 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 // TOOD(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 <RootContextProvider\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 <Root\n className={mx('group overflow-hidden', classNames)}\n {...{\n [`data-${ROOT_DEBUG_ATTR}`]: debug,\n }}\n ref={composedRef}\n >\n {children}\n </Root>\n </RootContextProvider>\n );\n});\n\n//\n// Container\n//\n\ntype ContainerState = { type: 'idle' } | { type: 'active'; bounds?: DOMRect };\n\ntype ContainerContextValue<TData = any, Location = LocationType> = {\n id: string;\n eventHandler: MosaicEventHandler<TData>;\n axis?: AllowedAxis;\n dragging?: DraggingState;\n scrolling?: boolean;\n state: ContainerState;\n\n /** Active drop location. */\n activeLocation?: Location;\n setActiveLocation: (location: Location | undefined) => void;\n};\n\nconst [ContainerContextProvider, useContainerContext] = createContext<ContainerContextValue>('MosaicContainer');\n\n// State attribute: [&:has(>_[data-mosaic-container-state=active])]\nconst CONTAINER_STATE_ATTR = 'mosaic-container-state';\n\n// CSS variables: [var(--mosaic-placeholder-xxx)]\nconst CONTAINER_PLACEHOLDER_WIDTH = '--mosaic-placeholder-width';\nconst CONTAINER_PLACEHOLDER_HEIGHT = '--mosaic-placeholder-height';\n\ntype ContainerProps = SlottableClassName<\n PropsWithChildren<\n Partial<Pick<ContainerContextValue, 'eventHandler' | 'axis'>> & {\n asChild?: boolean;\n autoScroll?: HTMLElement | null;\n withFocus?: boolean;\n debug?: () => ReactNode;\n }\n >\n>;\n\nlet counter = 0;\n\n// TODO(burdon): Make generic.\nconst Container = forwardRef<HTMLDivElement, ContainerProps>(\n (\n {\n className,\n classNames,\n children,\n eventHandler: eventHandlerProp,\n axis = 'vertical',\n asChild,\n autoScroll: autoscrollElement,\n withFocus,\n debug,\n ...props\n }: ContainerProps,\n forwardedRef,\n ) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = useComposedRefs<HTMLDivElement>(rootRef, forwardedRef);\n const Root = asChild ? Slot : Primitive.div;\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 } = useRootContext(Container.displayName!);\n const [state, setState] = useState<ContainerState>({ type: 'idle' });\n const [activeLocation, setActiveLocation] = useState<LocationType | undefined>();\n const [scrolling, setScrolling] = useState(false);\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 } = useRootContext(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: () => axis,\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 <ContainerContextProvider\n id={eventHandler.id}\n eventHandler={eventHandler}\n axis={axis}\n state={state}\n dragging={state.type === 'active' ? dragging : undefined}\n scrolling={scrolling}\n activeLocation={activeLocation}\n setActiveLocation={setActiveLocation}\n >\n <Root\n className={mx('bs-full', className, classNames)}\n style={\n {\n [CONTAINER_PLACEHOLDER_WIDTH]:\n state.type === 'active' && state.bounds ? `${state.bounds.width}px` : '0px',\n [CONTAINER_PLACEHOLDER_HEIGHT]:\n state.type === 'active' && state.bounds ? `${state.bounds.height}px` : '0px',\n } as CSSProperties\n }\n {...props}\n {...{\n [`data-${CONTAINER_STATE_ATTR}`]: state.type,\n }}\n ref={composedRef}\n >\n {children}\n </Root>\n {debug?.()}\n </ContainerContextProvider>\n );\n },\n);\n\nContainer.displayName = 'MosaicContainer';\n\n//\n// Tile\n//\n\n/** Must implement value equivalence. */\ntype LocationType = string | number;\n\ntype TileState =\n | { type: 'idle' }\n | { type: 'preview'; container: HTMLElement; rect: DOMRect }\n | { type: 'dragging' }\n | { type: 'target'; closestEdge: Edge | null };\n\ntype TileContextValue = {\n state: TileState;\n};\n\nconst [TileContextProvider, useTileContext] = createContext<TileContextValue>('MosaicTile');\n\n// State attribute: data-[mosaic-tile-state=dragging]\nconst TILE_STATE_ATTR = 'mosaic-tile-state';\n\ntype TileProps<TData = any, TLocation = LocationType> = SlottableClassName<\n PropsWithChildren<{\n asChild?: boolean;\n dragHandle?: HTMLElement | null;\n allowedEdges?: Edge[];\n id: string;\n data: TData;\n location: TLocation;\n draggable?: boolean; // TODO(burdon): Not currently implemented.\n debug?: boolean;\n }>\n>;\n\nconst Tile = forwardRef<HTMLDivElement, TileProps>(\n (\n {\n className,\n classNames,\n children,\n asChild,\n dragHandle,\n allowedEdges: allowedEdgesProp,\n location,\n id,\n data: dataProp,\n debug: _,\n }: TileProps,\n forwardedRef,\n ) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = composeRefs<HTMLDivElement>(rootRef, forwardedRef);\n const Root = asChild ? Slot : Primitive.div;\n\n // State.\n const {\n id: containerId,\n eventHandler,\n axis,\n scrolling,\n setActiveLocation,\n } = useContainerContext(Tile.displayName!);\n const [state, setState] = useState<TileState>({ type: 'idle' });\n\n const allowedEdges = useMemo<Edge[]>(\n () => allowedEdgesProp || (axis === 'vertical' ? ['top', 'bottom'] : ['left', 'right']),\n [allowedEdgesProp, axis],\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 (!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 }, [rootRef, dragHandle, eventHandler, data, scrolling, allowedEdges, setActiveLocation]);\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 <TileContextProvider state={state}>\n <Root\n {...{\n [`data-${TILE_STATE_ATTR}`]: state.type,\n }}\n role='listitem'\n className={mx('relative', className, classNames)}\n ref={composedRef}\n >\n {children}\n </Root>\n\n {state.type === 'preview' &&\n createPortal(\n <Root\n {...{\n // NOTE: Use to control appearance while dragging.\n [`data-${TILE_STATE_ATTR}`]: state.type,\n }}\n // TODO(burdon): Configure drop animation.\n className={mx('relative', className, classNames)}\n style={\n {\n width: `${state.rect.width}px`,\n height: `${state.rect.height}px`,\n } as CSSProperties\n }\n >\n {children}\n </Root>,\n state.container,\n )}\n </TileContextProvider>\n );\n },\n);\n\nTile.displayName = 'MosaicTile';\n\n//\n// Placeholder\n//\n\n// Axis: data-[mosaic-placeholder-axis=vertical]\nconst PLACEHOLDER_AXIS_ATTR = 'mosaic-placeholder-axis';\n\n// State attribute: data-[mosaic-placeholder-state=active]\nconst PLACEHOLDER_STATE_ATTR = 'mosaic-placeholder-state';\n\ntype PlaceholderProps<Location = LocationType> = ThemedClassName<\n PropsWithChildren<{\n asChild?: boolean;\n axis?: Axis;\n location: Location;\n }>\n>;\n\nconst Placeholder = <Location extends LocationType = LocationType>({\n classNames,\n children,\n asChild,\n axis = 'vertical',\n location,\n}: PlaceholderProps<Location>) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const Root = asChild ? Slot : Primitive.div;\n const {\n id: containerId,\n eventHandler,\n scrolling,\n activeLocation,\n setActiveLocation,\n } = useContainerContext(Placeholder.displayName!);\n\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 <Root\n {...{\n [`data-${PLACEHOLDER_AXIS_ATTR}`]: axis,\n [`data-${PLACEHOLDER_STATE_ATTR}`]: data.location === activeLocation ? 'active' : 'idle',\n }}\n role='none'\n className={mx('relative', classNames)}\n ref={rootRef}\n >\n {children}\n </Root>\n );\n};\n\nPlaceholder.displayName = 'MosaicPlaceholder';\n\n//\n// DropIndicator\n// TODO(burdon): Support DropIndicator or Placeholder variants.\n//\n\ntype DropIndicatorProps = Omit<NativeDropIndicatorProps, 'edge'>;\n\nconst DropIndicator = (props: DropIndicatorProps) => {\n const { state } = useTileContext(DropIndicator.displayName!);\n return state.type === 'target' && state.closestEdge ? (\n <NativeDropIndicator {...props} edge={state.closestEdge} />\n ) : null;\n};\n\nDropIndicator.displayName = 'MosaicDropIndicator';\n\n//\n// Mosaic\n//\n\nexport const Mosaic = {\n Root,\n Container,\n Tile,\n Placeholder,\n DropIndicator,\n\n // TODO(burdon): Move out of Mosaic namespace?\n Viewport: Scrollable,\n Stack,\n VirtualStack,\n};\n\nexport type {\n RootProps as MosaicRootProps,\n ContainerProps as MosaicContainerProps,\n TileProps as MosaicTileProps,\n PlaceholderProps as MosiacPlaceholderProps,\n DropIndicatorProps as MosaicDropIndicatorProps,\n\n // TODO(burdon): Move out of Mosaic namespace?\n ScrollableProps as MosaicViewportProps,\n StackProps as MosaicStackProps,\n};\n\nexport { useRootContext as useMosaic, useContainerContext as useMosaicContainer, useTileContext as useMosaicTile };\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { type EventListeners } from 'overlayscrollbars';\nimport {\n OverlayScrollbarsComponent,\n type OverlayScrollbarsComponentProps,\n type OverlayScrollbarsComponentRef,\n} from 'overlayscrollbars-react';\nimport React, { type RefCallback, forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport { type Axis } from '../Mosaic';\n\nimport 'overlayscrollbars/styles/overlayscrollbars.css';\nimport './scrollable.css';\n\nconst defaultOptions: ScrollableProps['options'] = {\n scrollbars: {\n autoHide: 'leave',\n autoHideDelay: 1_000,\n autoHideSuspend: true,\n },\n};\n\nexport type ScrollableProps = ThemedClassName<Omit<OverlayScrollbarsComponentProps, 'ref'>> & {\n axis?: Axis;\n padding?: boolean;\n onScroll?: (event: Event) => void;\n viewportRef?: RefCallback<HTMLElement | null>;\n};\n\n/**\n * https://www.npmjs.com/package/overlayscrollbars-react\n */\nexport const Scrollable = forwardRef<HTMLDivElement, ScrollableProps>(\n (\n { classNames, axis = 'vertical', padding, options: optionsProp = defaultOptions, onScroll, viewportRef, ...props },\n forwardedRef,\n ) => {\n const osRef = useRef<OverlayScrollbarsComponentRef>(null);\n const options = useMemo(() => {\n const options = { ...optionsProp };\n if (axis) {\n options.overflow = {\n x: axis === 'horizontal' ? 'scroll' : 'hidden',\n y: axis === 'vertical' ? 'scroll' : 'hidden',\n };\n }\n\n return options;\n }, [axis, optionsProp]);\n\n useImperativeHandle(forwardedRef, () => osRef.current?.getElement() as HTMLDivElement, [osRef]);\n\n useEffect(() => {\n const instance = osRef.current?.osInstance();\n if (viewportRef) {\n viewportRef(instance?.elements().viewport ?? null);\n }\n }, [osRef, viewportRef]);\n\n const events = useMemo<EventListeners | null>(() => {\n if (!onScroll) {\n return null;\n }\n\n return {\n scroll: (_, event: Event) => {\n onScroll(event);\n },\n } satisfies EventListeners;\n }, [onScroll]);\n\n return (\n <OverlayScrollbarsComponent\n {...props}\n className={mx(padding && (axis === 'vertical' ? 'pli-3' : 'pbe-3'), classNames)}\n options={options}\n events={events}\n ref={osRef}\n />\n );\n },\n);\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { type ReactVirtualizerOptions, useVirtualizer } from '@tanstack/react-virtual';\nimport React, { type FC, Fragment, type ReactElement, type Ref, forwardRef } from 'react';\n\nimport { invariant } from '@dxos/invariant';\nimport { type SlottableClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport { useVisibleItems } from '../../hooks';\nimport {\n type Axis,\n type GetId,\n Mosaic,\n type MosaicTileProps,\n type MosiacPlaceholderProps,\n useMosaicContainer,\n} from '../Mosaic';\nimport { mosaicStyles } from '../Mosaic';\n\ntype StackTileComponent<TData = any> = FC<MosaicTileProps<TData>>;\n\ntype StackProps<TData = any> = SlottableClassName<\n {\n Tile: StackTileComponent<TData>;\n getId: GetId<TData>;\n role?: string;\n axis?: Axis;\n items?: 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 StackInner = forwardRef<HTMLDivElement, StackProps>(\n (\n { className, classNames, role = 'list', axis = 'vertical', draggable = true, items, getId, Tile, debug, ...props },\n forwardedRef,\n ) => {\n invariant(Tile);\n const { id, dragging } = useMosaicContainer(StackInner.displayName!);\n const visibleItems = useVisibleItems({ id, items, dragging: dragging?.source.data, getId });\n\n return (\n <div\n {...props}\n role={role}\n className={mx(\n 'flex',\n axis === 'horizontal' && 'bs-full [&>*]:shrink-0',\n axis === 'vertical' && 'flex-col',\n classNames,\n className,\n )}\n ref={forwardedRef}\n >\n <Placeholder axis={axis} location={0.5} />\n {visibleItems?.map((item, index) => (\n <Fragment key={getId(item)}>\n <Tile id={getId(item)} data={item} location={index + 1} draggable={draggable} debug={debug} />\n <Placeholder axis={axis} location={index + 1.5} />\n </Fragment>\n ))}\n </div>\n );\n },\n);\n\nStackInner.displayName = 'Stack';\n\nconst Stack = StackInner as <TData = any>(props: StackProps<TData> & { ref?: Ref<HTMLDivElement> }) => ReactElement;\n\n//\n// VirtualStack\n//\n\ntype VirtualStackProps<TData = any> = StackProps<TData> &\n Pick<\n ReactVirtualizerOptions<HTMLElement, HTMLDivElement>,\n 'estimateSize' | 'getScrollElement' | 'overscan' | 'onChange'\n >;\n\nconst VirtualStackInner = forwardRef<HTMLDivElement, VirtualStackProps>(\n (\n {\n className,\n classNames,\n role = 'list',\n axis = 'vertical',\n items,\n getId,\n Tile,\n estimateSize,\n getScrollElement,\n overscan = 8,\n onChange,\n debug,\n ...props\n },\n forwardedRef,\n ) => {\n invariant(Tile);\n const { id, dragging } = useMosaicContainer(VirtualStackInner.displayName!);\n const visibleItems = useVisibleItems({ id, items, dragging: dragging?.source.data, getId });\n const virtualizer = useVirtualizer({\n count: visibleItems.length * 2 + 1,\n estimateSize,\n getScrollElement,\n overscan,\n onChange,\n });\n\n const virtualItems = virtualizer.getVirtualItems();\n\n return (\n <div\n {...props}\n role={role}\n className={mx(\n 'flex',\n axis === 'horizontal' && 'bs-full [&>*]:shrink-0',\n axis === 'vertical' && 'flex-col',\n classNames,\n className,\n )}\n style={{\n position: 'relative',\n ...(axis === '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((virtualItem) => {\n const data = visibleItems![Math.floor(virtualItem.index / 2)];\n return (\n <div\n key={virtualItem.key}\n data-index={virtualItem.index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n ...(axis === 'vertical'\n ? {\n width: '100%',\n transform: `translateY(${virtualItem.start}px)`,\n }\n : {\n height: '100%',\n transform: `translateX(${virtualItem.start}px)`,\n }),\n }}\n ref={virtualizer.measureElement}\n >\n {virtualItem.index % 2 === 0 ? (\n <Placeholder axis={axis} location={Math.floor(virtualItem.index / 2) + 0.5} />\n ) : (\n <Tile id={getId(data)} data={data} location={Math.floor(virtualItem.index / 2) + 1} debug={debug} />\n )}\n </div>\n );\n })}\n </div>\n );\n },\n);\n\nVirtualStackInner.displayName = 'VirtualStackInner';\n\nconst VirtualStack = VirtualStackInner as <TData = any>(\n props: VirtualStackProps<TData> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement;\n\n//\n// Placeholder\n//\n\nconst Placeholder = (props: MosiacPlaceholderProps<number>) => {\n return (\n <Mosaic.Placeholder {...props} classNames={mosaicStyles.placeholder.root}>\n <div\n className={mx(\n 'flex bs-full bg-baseSurface border border-dashed border-separator rounded-sm',\n mosaicStyles.placeholder.content,\n )}\n />\n </Mosaic.Placeholder>\n );\n};\n\nPlaceholder.displayName = 'Placeholder';\n\n//\n// Stack\n//\n\nexport { Stack, VirtualStack };\n\nexport type { StackTileComponent, StackProps, VirtualStackProps };\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { type Obj } from '@dxos/echo';\nimport { log } from '@dxos/log';\nimport { arrayMove } from '@dxos/util';\n\nimport { type GetId, type MosaicEventHandler } from '../components';\n\nexport type UseEventHandlerProps<TItem = any, TObject = any> = Pick<MosaicEventHandler<TItem>, 'id' | 'canDrop'> & {\n /**\n * The items to manage.\n */\n items: TItem[];\n\n /**\n * ID getter.\n */\n getId: GetId<TItem>;\n\n /**\n * Extracts the object from an item.\n */\n get: (item: TItem) => TObject;\n\n /**\n * Creates a new item from the dragged object.\n */\n make: (object: TObject) => TItem;\n\n /**\n * Optional change callback for wrapping mutations in Obj.change style.\n * When provided, all array mutations will be wrapped in this callback.\n * When not provided, mutations happen directly on the items array.\n */\n onChange?: (mutator: (items: TItem[]) => void) => void;\n};\n\n/**\n * Returns a handler for the given items.\n * NOTE: This supports arrays of objects, or arrays of refs to objects.\n */\nexport const useEventHandlerAdapter = <TItem = any, TObject extends Obj.Unknown = Obj.Unknown>({\n items,\n getId,\n get,\n make,\n onChange,\n ...props\n}: UseEventHandlerProps<TItem, TObject>): MosaicEventHandler<TItem> => {\n return useMemo<MosaicEventHandler<TItem>>(\n () => ({\n ...props,\n onTake: ({ source }, cb) => {\n log.info('onTake', { source });\n const mutate = (items: TItem[]) => {\n const from = items.findIndex((item) => getId(item) === source.id);\n if (from !== -1) {\n items.splice(from, 1);\n }\n };\n\n if (onChange) {\n onChange(mutate);\n } else {\n mutate(items);\n }\n\n void cb(source.data);\n },\n onDrop: ({ source, target }) => {\n const to = target?.type === 'tile' || target?.type === 'placeholder' ? target.location : -1;\n log.info('onDrop', { source, target, to });\n\n const mutate = (items: TItem[]) => {\n const from = items.findIndex((item) => getId(item) === source.id);\n if (to !== -1) {\n if (from !== -1) {\n arrayMove(items, from, to);\n } else {\n // TODO(burdon): This should be the responsibility of the source container.\n items.splice(to, 0, make(get(source.data)));\n }\n }\n };\n\n if (onChange) {\n onChange(mutate);\n } else {\n mutate(items);\n }\n },\n }),\n [items, onChange],\n );\n};\n", "//\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?: 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>({ id, items, dragging, getId }: UseVisibleItemsProps<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"],
5
+ "mappings": "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",
6
+ "names": ["styles", "root", "border", "grid_3", "grid_2", "grid_3_coarse", "poster", "React", "useCallback", "useRef", "useState", "mx", "cache", "Map", "Image", "classNames", "src", "alt", "crossOrigin", "sampleSize", "contrast", "crossOriginState", "setCrossOriginState", "useState", "dominantColor", "setDominantColor", "undefined", "imageLoaded", "setImageLoaded", "canvasRef", "useRef", "handleImageError", "handleImageLoad", "useCallback", "target", "rgb", "get", "img", "current", "color", "extractDominantColor", "set", "div", "className", "mx", "style", "backgroundColor", "canvas", "ref", "display", "aria-hidden", "background", "transition", "opacity", "onError", "onLoad", "ctx", "getContext", "width", "height", "drawImage", "imageData", "getImageData", "pixels", "data", "isTransparent", "r", "g", "b", "totalWeight", "cornerSize", "Math", "floor", "y", "x", "isInTopLeft", "isInTopRight", "isInBottomLeft", "isInBottomRight", "i", "red", "green", "blue", "alpha", "max", "min", "saturation", "weight", "round", "threshold", "edgeTransparentPixels", "edgePixels", "topIndex", "bottomIndex", "leftIndex", "rightIndex", "Slot", "React", "createContext", "forwardRef", "useContext", "Button", "DropdownMenu", "Icon", "Toolbar", "useTranslation", "mx", "translationKey", "translations", "CardContext", "createContext", "CardRoot", "forwardRef", "children", "classNames", "className", "id", "asChild", "role", "border", "fullWidth", "props", "forwardedRef", "Root", "Slot", "React", "mx", "styles", "root", "ref", "CardToolbar", "density", "Toolbar", "grid_3", "grid_3_coarse", "CardToolbarIconButton", "IconButton", "CardToolbarSeparator", "Separator", "CardDragHandle", "_", "t", "useTranslation", "translationKey", "data-testid", "noTooltip", "iconOnly", "icon", "variant", "label", "size", "disabled", "CardClose", "onClick", "CardMenu", "context", "items", "menuItems", "useContext", "combinedItems", "DropdownMenu", "Trigger", "length", "Card", "ToolbarIconButton", "Portal", "Content", "Viewport", "map", "onSelect", "i", "Item", "key", "Arrow", "CardTitle", "CardContent", "div", "CardRow", "grid_2", "CardIcon", "CardHeading", "variantClassNames", "default", "subtitle", "CardText", "truncate", "description", "span", "CardPoster", "aspect", "image", "Image", "poster", "src", "alt", "aria-label", "Icon", "CardAction", "actionIcon", "Button", "CardLink", "href", "a", "data-variant", "target", "rel", "CardIconBlock", "toolbar", "Context", "ToolbarSeparator", "DragHandle", "Title", "Close", "Menu", "IconBlock", "Row", "Heading", "Text", "Poster", "Action", "Link", "styles", "container", "root", "useArrowNavigationGroup", "useFocusableGroup", "useMergedTabsterAttributes_unstable", "useComposedRefs", "Primitive", "Slot", "React", "createContext", "forwardRef", "useContext", "useRef", "useState", "mx", "FOCUS_STATE_ATTR", "FocusContext", "createContext", "useFocus", "useContext", "Group", "forwardRef", "classNames", "className", "children", "asChild", "axis", "props", "forwardedRef", "rootRef", "useRef", "composedRef", "useComposedRefs", "Root", "Slot", "Primitive", "div", "focusableGroupAttrs", "useFocusableGroup", "tabBehavior", "arrowNavigationAttrs", "useArrowNavigationGroup", "memorizeCurrent", "tabsterAttrs", "useMergedTabsterAttributes_unstable", "state", "setState", "useState", "React", "Provider", "value", "setFocus", "tabIndex", "mx", "styles", "container", "root", "ref", "Focus", "styles", "placeholder", "root", "content", "StateEffect", "StateField", "Decoration", "EditorView", "ViewPlugin", "WidgetType", "dropHandler", "onDrop", "handleDrop", "views", "Set", "state", "reset", "forEach", "view", "dispatch", "effects", "setDrop", "of", "extension", "dropField", "ViewPlugin", "fromClass", "_view", "add", "destroy", "delete", "update", "position", "rect", "dom", "getBoundingClientRect", "x", "left", "right", "y", "top", "bottom", "pos", "posAtCoords", "word", "wordAt", "startDist", "Math", "abs", "from", "endDist", "to", "cancel", "drop", "text", "url", "event", "line", "doc", "lineAt", "trim", "changes", "insert", "StateEffect", "define", "StateField", "create", "Decoration", "none", "decorations", "tr", "effect", "is", "value", "set", "widget", "WidgetType", "toDOM", "document", "createElement", "className", "style", "borderLeft", "display", "height", "verticalAlign", "side", "range", "map", "provide", "field", "EditorView", "React", "forwardRef", "useMemo", "useRef", "createPortal", "Json", "mx", "combine", "draggable", "dropTargetForElements", "monitorForElements", "preserveOffsetOnSource", "setCustomNativeDragPreview", "autoScrollForElements", "attachClosestEdge", "extractClosestEdge", "DropIndicator", "NativeDropIndicator", "composeRefs", "useComposedRefs", "createContext", "Primitive", "Slot", "bind", "React", "forwardRef", "useCallback", "useEffect", "useLayoutEffect", "useMemo", "useRef", "useState", "createPortal", "log", "mx", "isTruthy", "OverlayScrollbarsComponent", "React", "forwardRef", "useEffect", "useImperativeHandle", "useMemo", "useRef", "mx", "defaultOptions", "scrollbars", "autoHide", "autoHideDelay", "autoHideSuspend", "Scrollable", "forwardRef", "classNames", "axis", "padding", "options", "optionsProp", "onScroll", "viewportRef", "props", "forwardedRef", "osRef", "useRef", "useMemo", "overflow", "x", "y", "useImperativeHandle", "current", "getElement", "useEffect", "instance", "osInstance", "elements", "viewport", "events", "scroll", "_", "event", "React", "OverlayScrollbarsComponent", "className", "mx", "ref", "useVirtualizer", "React", "Fragment", "forwardRef", "invariant", "mx", "useMemo", "log", "arrayMove", "useEventHandlerAdapter", "items", "getId", "get", "make", "onChange", "props", "onTake", "source", "cb", "info", "mutate", "from", "findIndex", "item", "id", "splice", "data", "onDrop", "target", "to", "type", "location", "useMemo", "useVisibleItems", "id", "items", "dragging", "getId", "visibleItems", "useMemo", "containerId", "idx", "findIndex", "item", "slice", "splice", "StackInner", "forwardRef", "className", "classNames", "role", "axis", "draggable", "items", "getId", "Tile", "debug", "props", "forwardedRef", "invariant", "id", "dragging", "useMosaicContainer", "displayName", "visibleItems", "useVisibleItems", "source", "data", "React", "div", "mx", "ref", "Placeholder", "location", "map", "item", "index", "Fragment", "key", "Stack", "VirtualStackInner", "estimateSize", "getScrollElement", "overscan", "onChange", "virtualizer", "useVirtualizer", "count", "length", "virtualItems", "getVirtualItems", "style", "position", "width", "height", "getTotalSize", "virtualItem", "Math", "floor", "data-index", "top", "left", "transform", "start", "measureElement", "VirtualStack", "Mosaic", "mosaicStyles", "placeholder", "root", "content", "getSourceData", "source", "data", "type", "RootContextProvider", "useRootContext", "createContext", "ROOT_DEBUG_ATTR", "Root", "forwardRef", "classNames", "children", "asChild", "debug", "forwardedRef", "rootRef", "useRef", "composedRef", "useComposedRefs", "Slot", "Primitive", "div", "handlers", "setHandlers", "useState", "dragging", "setDragging", "getSourceHandler", "useCallback", "handler", "containerId", "getTargetHandler", "location", "target", "current", "dropTargets", "id", "useEffect", "handleChange", "sourceData", "targetData", "onCancel", "container", "initial", "find", "element", "handleCancel", "requestAnimationFrame", "dispatchEvent", "CustomEvent", "bubbles", "undefined", "noTargetTimeout", "combine", "monitorForElements", "onDragStart", "log", "map", "onDropTargetChange", "clearTimeout", "length", "setTimeout", "onDrag", "clientX", "x", "clientY", "y", "input", "position", "onDrop", "info", "sourceHandler", "warn", "Object", "keys", "targetHandler", "onTake", "object", "React", "containers", "addContainer", "removeContainer", "className", "mx", "ref", "ContainerContextProvider", "useContainerContext", "CONTAINER_STATE_ATTR", "CONTAINER_PLACEHOLDER_WIDTH", "CONTAINER_PLACEHOLDER_HEIGHT", "counter", "Container", "eventHandler", "eventHandlerProp", "axis", "autoScroll", "autoscrollElement", "withFocus", "props", "useMemo", "displayName", "state", "setState", "activeLocation", "setActiveLocation", "scrolling", "setScrolling", "setFocus", "useFocus", "timeout", "handleScroll", "bind", "listener", "dropTargetForElements", "getData", "canDrop", "bounds", "onDragEnter", "onDragLeave", "autoScrollForElements", "getAllowedAxis", "getConfiguration", "maxScrollSpeed", "filter", "isTruthy", "flatMap", "style", "width", "height", "TileContextProvider", "useTileContext", "TILE_STATE_ATTR", "Tile", "dragHandle", "allowedEdges", "allowedEdgesProp", "dataProp", "_", "composeRefs", "useLayoutEffect", "root", "self", "closestEdge", "extractClosestEdge", "draggable", "canDrag", "getInitialData", "onGenerateDragPreview", "nativeSetDragImage", "setCustomNativeDragPreview", "getOffset", "preserveOffsetOnSource", "render", "getBoundingClientRect", "rect", "attachClosestEdge", "role", "createPortal", "PLACEHOLDER_AXIS_ATTR", "PLACEHOLDER_STATE_ATTR", "Placeholder", "DropIndicator", "NativeDropIndicator", "edge", "Mosaic", "Viewport", "Scrollable", "Stack", "VirtualStack", "useContainerDebug", "debug", "debugRef", "useRef", "useMemo", "undefined", "classNames", "React", "div", "role", "className", "mx", "ref", "current", "createPortal", "ContainerInfo", "forwardRef", "forwardedRef", "id", "state", "activeLocation", "scrolling", "useMosaicContainer", "displayName", "counter", "Json", "data", "count"]
7
+ }
@@ -16,7 +16,7 @@ import {
16
16
  useRootContext,
17
17
  useTileContext,
18
18
  useVisibleItems
19
- } from "./chunk-4VDZJ3HV.mjs";
19
+ } from "./chunk-UMBPEG4F.mjs";
20
20
 
21
21
  // src/components/Card/CardDragPreview.tsx
22
22
  import React from "react";