@dxos/react-ui-mosaic 0.8.4-main.abd8ff62ef → 0.8.4-main.bc2380dfbc

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 (50) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/{chunk-TY4RYZ3H.mjs → chunk-3BMPGIWZ.mjs} +20 -10
  3. package/dist/lib/browser/chunk-3BMPGIWZ.mjs.map +7 -0
  4. package/dist/lib/browser/index.mjs +22 -24
  5. package/dist/lib/browser/index.mjs.map +3 -3
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/playwright/index.mjs +90 -7
  8. package/dist/lib/browser/playwright/index.mjs.map +3 -3
  9. package/dist/lib/browser/testing/index.mjs +1 -4
  10. package/dist/lib/browser/testing/index.mjs.map +2 -2
  11. package/dist/lib/node-esm/{chunk-25RXZ2RH.mjs → chunk-2UCLTU76.mjs} +20 -10
  12. package/dist/lib/node-esm/chunk-2UCLTU76.mjs.map +7 -0
  13. package/dist/lib/node-esm/index.mjs +22 -24
  14. package/dist/lib/node-esm/index.mjs.map +3 -3
  15. package/dist/lib/node-esm/meta.json +1 -1
  16. package/dist/lib/node-esm/playwright/index.mjs +90 -7
  17. package/dist/lib/node-esm/playwright/index.mjs.map +3 -3
  18. package/dist/lib/node-esm/testing/index.mjs +1 -4
  19. package/dist/lib/node-esm/testing/index.mjs.map +2 -2
  20. package/dist/types/src/components/Board/Board.d.ts +1 -1
  21. package/dist/types/src/components/Board/Column.d.ts +3 -3
  22. package/dist/types/src/components/Board/Column.d.ts.map +1 -1
  23. package/dist/types/src/components/Board/Item.d.ts +1 -1
  24. package/dist/types/src/components/Board/Item.d.ts.map +1 -1
  25. package/dist/types/src/components/Mosaic/Container.d.ts +8 -0
  26. package/dist/types/src/components/Mosaic/Container.d.ts.map +1 -1
  27. package/dist/types/src/components/Mosaic/Mosaic.d.ts +1 -0
  28. package/dist/types/src/components/Mosaic/Mosaic.d.ts.map +1 -1
  29. package/dist/types/src/components/Mosaic/Placeholder.d.ts.map +1 -1
  30. package/dist/types/src/components/Mosaic/Stack.d.ts.map +1 -1
  31. package/dist/types/src/components/Mosaic/Tile.d.ts +4 -0
  32. package/dist/types/src/components/Mosaic/Tile.d.ts.map +1 -1
  33. package/dist/types/src/playwright/board-manager.d.ts +12 -2
  34. package/dist/types/src/playwright/board-manager.d.ts.map +1 -1
  35. package/dist/types/src/testing/CardContainer.d.ts.map +1 -1
  36. package/dist/types/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +31 -30
  38. package/src/components/Board/Board.stories.tsx +1 -1
  39. package/src/components/Board/Column.tsx +17 -15
  40. package/src/components/Board/Item.tsx +10 -7
  41. package/src/components/Mosaic/Container.tsx +17 -0
  42. package/src/components/Mosaic/Placeholder.tsx +6 -0
  43. package/src/components/Mosaic/Stack.tsx +5 -1
  44. package/src/components/Mosaic/Tile.tsx +8 -4
  45. package/src/hooks/useContainerDebug.tsx +1 -1
  46. package/src/playwright/board-manager.ts +138 -10
  47. package/src/playwright/smoke.spec.ts +3 -3
  48. package/src/testing/CardContainer.tsx +2 -5
  49. package/dist/lib/browser/chunk-TY4RYZ3H.mjs.map +0 -7
  50. package/dist/lib/node-esm/chunk-25RXZ2RH.mjs.map +0 -7
@@ -9,12 +9,12 @@ import {
9
9
  useMosaicRootContext,
10
10
  useMosaicTileContext,
11
11
  useVisibleItems
12
- } from "./chunk-25RXZ2RH.mjs";
12
+ } from "./chunk-2UCLTU76.mjs";
13
13
 
14
14
  // src/components/Board/Board.tsx
15
15
  import { useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
16
16
  import { createContext as createContext2 } from "@radix-ui/react-context";
17
- import React4, { forwardRef as forwardRef4, useRef as useRef4, useState as useState2 } from "react";
17
+ import React4, { forwardRef as forwardRef4, useRef as useRef3, useState as useState3 } from "react";
18
18
  import { ScrollArea as ScrollArea2 } from "@dxos/react-ui";
19
19
  import { JsonHighlighter as JsonHighlighter2 } from "@dxos/react-ui-syntax-highlighter";
20
20
  import { composable as composable2, composableProps as composableProps2, mx as mx3 } from "@dxos/ui-theme";
@@ -35,7 +35,6 @@ var useContainerDebug = (debug) => {
35
35
  }
36
36
  return [
37
37
  ({ classNames }) => /* @__PURE__ */ React.createElement("div", {
38
- role: "none",
39
38
  className: mx("overflow-hidden", classNames),
40
39
  ref: debugRef
41
40
  }),
@@ -257,7 +256,7 @@ var dropField = StateField.define({
257
256
  // src/components/Board/Column.tsx
258
257
  import { useAtomValue } from "@effect-atom/atom-react";
259
258
  import { createContext } from "@radix-ui/react-context";
260
- import React3, { forwardRef as forwardRef3, useMemo as useMemo4, useRef as useRef3, useState } from "react";
259
+ import React3, { forwardRef as forwardRef3, useMemo as useMemo4, useState as useState2 } from "react";
261
260
  import { Obj as Obj2, Ref } from "@dxos/echo";
262
261
  import { useObject } from "@dxos/react-client/echo";
263
262
  import { IconButton, ScrollArea, Toolbar as Toolbar2, useTranslation as useTranslation2 } from "@dxos/react-ui";
@@ -267,18 +266,18 @@ import { translationKey as translationKey2 } from "#translations";
267
266
 
268
267
  // src/components/Board/Item.tsx
269
268
  import { useComposedRefs } from "@radix-ui/react-compose-refs";
270
- import React2, { forwardRef as forwardRef2, useMemo as useMemo3, useRef as useRef2 } from "react";
269
+ import React2, { forwardRef as forwardRef2, useMemo as useMemo3, useRef as useRef2, useState } from "react";
271
270
  import { Obj } from "@dxos/echo";
272
271
  import { Card, Tag, Toolbar, useTranslation } from "@dxos/react-ui";
273
272
  import { Menu, createMenuAction } from "@dxos/react-ui-menu";
274
273
  import { getHashStyles } from "@dxos/ui-theme";
275
274
  import { translationKey } from "#translations";
276
275
  var BOARD_ITEM_NAME = "Board.Item";
277
- var BoardItemInner = /* @__PURE__ */ forwardRef2(({ classNames, data, location, debug }, forwardedRef) => {
276
+ var BoardItemInner = /* @__PURE__ */ forwardRef2(({ classNames, data, location, debug, draggable }, forwardedRef) => {
278
277
  const { t } = useTranslation(translationKey);
279
278
  const rootRef = useRef2(null);
280
279
  const composedRef = useComposedRefs(rootRef, forwardedRef);
281
- const dragHandleRef = useRef2(null);
280
+ const [dragHandle, setDragHandle] = useState(null);
282
281
  const { model } = useBoard(BOARD_ITEM_NAME);
283
282
  const column = useBoardColumn();
284
283
  const items = useMemo3(() => column != null && model.onItemDelete ? [
@@ -300,7 +299,8 @@ var BoardItemInner = /* @__PURE__ */ forwardRef2(({ classNames, data, location,
300
299
  return /* @__PURE__ */ React2.createElement(Menu.Root, null, /* @__PURE__ */ React2.createElement(Mosaic.Tile, {
301
300
  ref: rootRef,
302
301
  asChild: true,
303
- dragHandle: dragHandleRef.current,
302
+ draggable,
303
+ dragHandle,
304
304
  id: data.id,
305
305
  data,
306
306
  location,
@@ -313,7 +313,7 @@ var BoardItemInner = /* @__PURE__ */ forwardRef2(({ classNames, data, location,
313
313
  ref: composedRef,
314
314
  onClick: (event) => event.currentTarget.focus()
315
315
  }, /* @__PURE__ */ React2.createElement(Card.Toolbar, null, /* @__PURE__ */ React2.createElement(Card.DragHandle, {
316
- ref: dragHandleRef,
316
+ ref: setDragHandle,
317
317
  testId: "mosaicBoard.cardDragHandle"
318
318
  }), /* @__PURE__ */ React2.createElement(Card.Title, {
319
319
  "data-testid": "mosaicBoard.cardTitle"
@@ -333,7 +333,6 @@ var BoardItemInner = /* @__PURE__ */ forwardRef2(({ classNames, data, location,
333
333
  }, /* @__PURE__ */ React2.createElement(Card.Text, null, description)), /* @__PURE__ */ React2.createElement(Card.Row, {
334
334
  icon: "ph--tag--regular"
335
335
  }, label && /* @__PURE__ */ React2.createElement("div", {
336
- role: "none",
337
336
  className: "shrink-0 flex gap-1 items-center text-xs"
338
337
  }, /* @__PURE__ */ React2.createElement(Tag, {
339
338
  palette: getHashStyles(label).hue
@@ -350,17 +349,16 @@ function useBoardColumn() {
350
349
  return value?.column;
351
350
  }
352
351
  var BOARD_COLUMN_ROOT_NAME = "Board.Column.Root";
353
- var BoardColumnRootInner = composable(({ classNames, children, location, data, debug, dragHandleRef: dragHandleRefProp, ...rest }, forwardedRef) => {
352
+ var BoardColumnRootInner = composable(({ classNames, children, location, data, debug, draggable, dragHandle, ...rest }, forwardedRef) => {
354
353
  const { model } = useBoard(BOARD_COLUMN_ROOT_NAME);
355
- const internalRef = useRef3(null);
356
- const dragHandleRef = dragHandleRefProp ?? internalRef;
357
354
  return /* @__PURE__ */ React3.createElement(Mosaic.Tile, {
358
355
  asChild: true,
359
356
  location,
360
357
  id: model.getColumnId(data),
361
358
  data,
362
359
  debug,
363
- dragHandle: dragHandleRef.current
360
+ draggable,
361
+ dragHandle
364
362
  }, /* @__PURE__ */ React3.createElement(Focus.Group, {
365
363
  ...rest,
366
364
  "data-testid": "board-column",
@@ -413,7 +411,7 @@ BoardColumnHeader.displayName = BOARD_COLUMN_HEADER_NAME;
413
411
  var BOARD_COLUMN_BODY_NAME = "Board.Column.Body";
414
412
  var BoardColumnBody = composable(({ data, eventHandler, Tile = BoardItem, debug, ...props }, forwardedRef) => {
415
413
  const { model } = useBoard(BOARD_COLUMN_BODY_NAME);
416
- const [viewport, setViewport] = useState(null);
414
+ const [viewport, setViewport] = useState2(null);
417
415
  const items = useAtomValue(model.items(data));
418
416
  return /* @__PURE__ */ React3.createElement(Mosaic.Container, {
419
417
  ...composableProps(props),
@@ -459,10 +457,10 @@ var BoardColumnFooter = /* @__PURE__ */ forwardRef3(({ classNames, data, onAdd }
459
457
  });
460
458
  BoardColumnFooter.displayName = BOARD_COLUMN_FOOTER_NAME;
461
459
  var BOARD_DEFAULT_COLUMN_NAME = "Board.DefaultColumn";
462
- var DefaultBoardColumn = /* @__PURE__ */ forwardRef3(({ classNames, location, data, debug, Tile = BoardItem }, forwardedRef) => {
460
+ var DefaultBoardColumn = /* @__PURE__ */ forwardRef3(({ classNames, location, data, debug, draggable, Tile = BoardItem }, forwardedRef) => {
463
461
  const { model } = useBoard(BOARD_DEFAULT_COLUMN_NAME);
464
462
  const [DebugInfo, debugHandler] = useContainerDebug(debug);
465
- const dragHandleRef = useRef3(null);
463
+ const [dragHandle, setDragHandle] = useState2(null);
466
464
  const [column, updateColumn] = useObject(data);
467
465
  const eventHandler = useEventHandlerAdapter({
468
466
  id: model.getColumnId(data),
@@ -480,18 +478,18 @@ var DefaultBoardColumn = /* @__PURE__ */ forwardRef3(({ classNames, location, da
480
478
  classNames: mx2("group/column grid", debug ? "grid-rows-[var(--dx-rail-action)_1fr_20rem]" : "grid-rows-[var(--dx-rail-action)_1fr_var(--dx-rail-action)]", classNames),
481
479
  location,
482
480
  data,
483
- dragHandleRef,
481
+ draggable,
482
+ dragHandle,
484
483
  ref: forwardedRef
485
484
  }, /* @__PURE__ */ React3.createElement(BoardColumnHeader, {
486
485
  label: Obj2.getLabel(data) ?? data.id,
487
- dragHandleRef
486
+ dragHandleRef: setDragHandle
488
487
  }), /* @__PURE__ */ React3.createElement(BoardColumnBody, {
489
488
  data,
490
489
  eventHandler,
491
490
  debug: debugHandler,
492
491
  Tile
493
492
  }), /* @__PURE__ */ React3.createElement("div", {
494
- role: "none",
495
493
  className: "flex flex-col col-span-full"
496
494
  }, /* @__PURE__ */ React3.createElement(BoardColumnFooter, {
497
495
  data
@@ -523,7 +521,7 @@ var BOARD_CONTENT_NAME = "Board.Content";
523
521
  var BoardContentInner = composable2(({ id: _id, debug, eventHandler, Tile = DefaultBoardColumn, ...props }, forwardedRef) => {
524
522
  const { model } = useBoardContext(BOARD_CONTENT_NAME);
525
523
  const [DebugInfo, debugHandler] = useContainerDebug(debug);
526
- const [viewport, setViewport] = useState2(null);
524
+ const [viewport, setViewport] = useState3(null);
527
525
  const items = useAtomValue2(model.columns);
528
526
  return /* @__PURE__ */ React4.createElement("div", {
529
527
  ...composableProps2(props, {
@@ -569,7 +567,7 @@ BoardPlaceholder.displayName = BOARD_PLACEHOLDER_NAME;
569
567
  var BOARD_DEBUG_NAME = "Board.Debug";
570
568
  var BoardDebug = /* @__PURE__ */ forwardRef4(({ classNames }, forwardedRef) => {
571
569
  const { containers, dragging } = useMosaicRootContext(BOARD_DEBUG_NAME);
572
- const counter = useRef4(0);
570
+ const counter = useRef3(0);
573
571
  return /* @__PURE__ */ React4.createElement(JsonHighlighter2, {
574
572
  data: {
575
573
  containers,
@@ -591,11 +589,11 @@ var Board = {
591
589
  };
592
590
 
593
591
  // src/components/SearchStack/SearchStack.tsx
594
- import React5, { forwardRef as forwardRef5, useCallback, useMemo as useMemo5, useState as useState3 } from "react";
592
+ import React5, { forwardRef as forwardRef5, useCallback, useMemo as useMemo5, useState as useState4 } from "react";
595
593
  import { Card as Card2, ScrollArea as ScrollArea3 } from "@dxos/react-ui";
596
594
  import { composable as composable3, composableProps as composableProps3 } from "@dxos/ui-theme";
597
595
  var SearchStack = composable3(({ results = [], currentId, onAction, ...props }, forwardedRef) => {
598
- const [viewport, setViewport] = useState3(null);
596
+ const [viewport, setViewport] = useState4(null);
599
597
  const items = useMemo5(() => results.map((result) => ({
600
598
  result,
601
599
  onAction
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/Board/Board.tsx", "../../../src/hooks/useContainerDebug.tsx", "../../../src/hooks/useEventHandlerAdapter.ts", "../../../src/hooks/useDefaultColumnEventHandler.ts", "../../../src/components/Mosaic/extension.ts", "../../../src/components/Board/Column.tsx", "../../../src/components/Board/Item.tsx", "../../../src/components/SearchStack/SearchStack.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Atom, useAtomValue } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport React, {\n type PropsWithChildren,\n type ReactElement,\n type Ref as ReactRef,\n forwardRef,\n useRef,\n useState,\n} from 'react';\n\nimport { ScrollArea, type ThemedClassName } from '@dxos/react-ui';\nimport { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';\nimport { composable, composableProps, mx } from '@dxos/ui-theme';\n\nimport { useContainerDebug } from '../../hooks';\nimport { Focus } from '../Focus';\nimport {\n type GetId,\n Mosaic,\n type MosaicEventHandler,\n type MosaicPlaceholderProps,\n type MosaicStackProps,\n mosaicStyles,\n useMosaic,\n} from '../Mosaic';\nimport { BoardColumn, type BoardColumnProps, DefaultBoardColumn, useBoardColumn } from './Column';\nimport { BoardItem, type BoardItemProps } from './Item';\n\n//\n// Model\n//\n\nexport interface BoardModel<TColumn = any, TItem = any> {\n getColumnId: GetId<TColumn>;\n getItemId: GetId<TItem>;\n isColumn: (obj: unknown) => obj is TColumn;\n isItem: (obj: unknown) => obj is TItem;\n columns: Atom.Atom<readonly TColumn[] | TColumn[]>;\n items: (column: TColumn) => Atom.Atom<TItem[]>;\n getColumns: () => TColumn[];\n getItems: (column: TColumn) => TItem[];\n onColumnCreate?: () => Promise<TColumn>;\n onColumnDelete?: (column: TColumn) => void;\n onItemCreate?: (column: TColumn) => Promise<TItem>;\n onItemDelete?: (column: TColumn, item: TItem) => void;\n}\n\n//\n// Context\n//\n\nconst BOARD_NAME = 'Board';\n\ntype BoardContextValue<TColumn = any, TItem = any> = {\n model: BoardModel<TColumn, TItem>;\n};\n\nconst [BoardContextProvider, useBoardContext] = createContext<BoardContextValue>(BOARD_NAME);\n\n/** Hook to read the board model from context (e.g. in custom column tiles). Pass TColumn and TItem for typed model. */\nfunction useBoard<TColumn = any, TItem = any>(displayName?: string): BoardContextValue<TColumn, TItem> {\n return useBoardContext(displayName ?? BOARD_NAME) as BoardContextValue<TColumn, TItem>;\n}\n\n//\n// Root\n//\n\nconst BOARD_ROOT_NAME = 'Board.Root';\n\ntype BoardRootProps<TColumn = any, TItem = any> = PropsWithChildren<BoardContextValue<TColumn, TItem>>;\n\nconst BoardRootInner = ({ model, children }: BoardRootProps) => {\n return <BoardContextProvider model={model}>{children}</BoardContextProvider>;\n};\n\nBoardRootInner.displayName = BOARD_ROOT_NAME;\n\nconst BoardRoot = BoardRootInner as <TColumn = any, TItem = any>(props: BoardRootProps<TColumn, TItem>) => ReactElement;\n\n//\n// Content\n//\n\nconst BOARD_CONTENT_NAME = 'Board.Content';\n\ntype BoardContentProps<TColumn = any> = ThemedClassName<{\n id: string;\n debug?: boolean;\n eventHandler?: MosaicEventHandler<TColumn>;\n Tile?: MosaicStackProps<TColumn>['Tile'];\n}>;\n\nconst BoardContentInner = composable<HTMLDivElement, BoardContentProps>(\n ({ id: _id, debug, eventHandler, Tile = DefaultBoardColumn, ...props }, forwardedRef) => {\n const { model } = useBoardContext(BOARD_CONTENT_NAME);\n const [DebugInfo, debugHandler] = useContainerDebug(debug);\n const [viewport, setViewport] = useState<HTMLElement | null>(null);\n\n const items = useAtomValue(model.columns);\n\n return (\n <div {...composableProps(props, { classNames: 'dx-container' })} ref={forwardedRef}>\n <Focus.Group asChild orientation='horizontal'>\n <Mosaic.Container\n asChild\n withFocus\n orientation='horizontal'\n autoScroll={viewport}\n eventHandler={eventHandler}\n debug={debugHandler}\n >\n <ScrollArea.Root orientation='horizontal' centered padding>\n <ScrollArea.Viewport classNames='snap-mandatory snap-x md:snap-none' ref={setViewport}>\n <Mosaic.Stack items={items} getId={model.getColumnId} Tile={Tile} debug={debug} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Mosaic.Container>\n </Focus.Group>\n <DebugInfo />\n </div>\n );\n },\n);\n\nBoardContentInner.displayName = BOARD_CONTENT_NAME;\n\nconst BoardContent = BoardContentInner as <TColumn = any>(\n props: BoardContentProps<TColumn> & { ref?: ReactRef<HTMLDivElement> },\n) => ReactElement;\n\n//\n// Placeholder\n//\n\nconst BOARD_PLACEHOLDER_NAME = 'Board.Placeholder';\n\nconst BoardPlaceholder = (props: MosaicPlaceholderProps<number>) => {\n return (\n <Mosaic.Placeholder {...props} classNames={mosaicStyles.placeholder.root}>\n <div\n className={mx('flex h-full border border-dashed border-separator rounded-xs', mosaicStyles.placeholder.content)}\n />\n </Mosaic.Placeholder>\n );\n};\n\nBoardPlaceholder.displayName = BOARD_PLACEHOLDER_NAME;\n\n//\n// Debug\n//\n\nconst BOARD_DEBUG_NAME = 'Board.Debug';\n\nexport const BoardDebug = forwardRef<HTMLDivElement, ThemedClassName>(({ classNames }, forwardedRef) => {\n const { containers, dragging } = useMosaic(BOARD_DEBUG_NAME);\n const counter = useRef(0);\n return (\n <JsonHighlighter\n data={{ containers, dragging, count: counter.current++ }}\n classNames={mx('text-xs', classNames)}\n ref={forwardedRef}\n />\n );\n});\n\nBoardDebug.displayName = BOARD_DEBUG_NAME;\n\n//\n// Board\n//\n\nexport const Board = {\n Root: BoardRoot,\n Content: BoardContent,\n Column: BoardColumn,\n Item: BoardItem,\n Placeholder: BoardPlaceholder,\n Debug: BoardDebug,\n};\n\nexport { useBoard, useBoardColumn };\n\nexport type { BoardRootProps, BoardContentProps, BoardColumnProps, BoardItemProps };\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 { JsonHighlighter } 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 CONTAINER_INFO_NAME = 'ContainerInfo';\n\nconst ContainerInfo = forwardRef<HTMLDivElement, ThemedClassName>(({ classNames }, forwardedRef) => {\n const { id, state, activeLocation, scrolling } = useMosaicContainer(CONTAINER_INFO_NAME);\n const counter = useRef(0);\n return (\n <JsonHighlighter\n data={{ id, activeLocation, scrolling, state, count: counter.current++ }}\n classNames={mx('text-xs', classNames)}\n ref={forwardedRef}\n />\n );\n});\n\nContainerInfo.displayName = CONTAINER_INFO_NAME;\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 extends Obj.Unknown = Obj.Unknown> = Pick<\n MosaicEventHandler<TItem>,\n 'id' | 'canDrop'\n> & {\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.update 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 log.info('onDrop', { source, target });\n\n const mutate = (items: TItem[]) => {\n const to =\n target?.type === 'tile' || target?.type === 'placeholder'\n ? target.location\n : target?.type === 'container'\n ? items.length\n : -1;\n const from = items.findIndex((item) => getId(item) === source.id);\n const insertIndex = typeof to === 'number' && to >= 0 ? Math.floor(to) : -1;\n if (insertIndex !== -1) {\n if (from !== -1) {\n arrayMove(items, from, insertIndex);\n } else {\n // TODO(burdon): This should be the responsibility of the source container.\n items.splice(insertIndex, 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 { type Obj } from '@dxos/echo';\n\nimport { type GetId, type MosaicEventHandler } from '../components';\nimport { useEventHandlerAdapter } from './useEventHandlerAdapter';\n\n/**\n * Minimal model shape needed to build the default column handler.\n */\nexport type DefaultColumnEventHandlerModel<TColumn = unknown> = {\n getColumnId: GetId<TColumn>;\n isColumn: (obj: unknown) => obj is TColumn;\n};\n\n/**\n * Returns the default column drag/drop handler (no persistence).\n * Use this when no custom eventHandler is passed to Board.Content.\n */\nexport const useDefaultColumnEventHandler = <TColumn extends Obj.Unknown = Obj.Unknown>(\n id: string,\n model: DefaultColumnEventHandlerModel<TColumn>,\n items: TColumn[],\n): MosaicEventHandler<TColumn> =>\n useEventHandlerAdapter<TColumn, TColumn>({\n id,\n items,\n getId: model.getColumnId,\n get: (data) => data,\n make: (object) => object,\n canDrop: ({ source }) => model.isColumn(source.data),\n });\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(--color-accent-surface)';\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 2023 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport React, {\n type PropsWithChildren,\n type ReactElement,\n type Ref as ReactRef,\n type RefObject,\n forwardRef,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { Obj, Ref } from '@dxos/echo';\nimport { useObject } from '@dxos/react-client/echo';\nimport { IconButton, ScrollArea, type ThemedClassName, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { Menu, createMenuAction } from '@dxos/react-ui-menu';\nimport { composable, composableProps, mx } from '@dxos/ui-theme';\n\nimport { translationKey } from '#translations';\n\nimport { useContainerDebug, useEventHandlerAdapter } from '../../hooks';\nimport { Focus } from '../Focus';\nimport { Mosaic, type MosaicContainerProps, type MosaicStackProps, type MosaicTileProps } from '../Mosaic';\nimport { useBoard } from './Board';\nimport { BoardItem } from './Item';\n\n//\n// Column context\n//\n\nconst BOARD_COLUMN_CONTEXT_NAME = 'Board.Column';\n\nexport type BoardColumnContextValue<TColumn = unknown> = {\n column: TColumn;\n};\n\nconst [BoardColumnProvider, useBoardColumnContext] = createContext<BoardColumnContextValue | null>(\n BOARD_COLUMN_CONTEXT_NAME,\n null,\n);\n\n/** Returns the current column when rendered inside a board column (e.g., in column header or item tile). */\nexport function useBoardColumn<TColumn = unknown>(): TColumn | undefined {\n const value = useBoardColumnContext(BOARD_COLUMN_CONTEXT_NAME);\n return value?.column as TColumn | undefined;\n}\n\ntype BoardColumnProps<TColumn = any> = Pick<MosaicTileProps<TColumn>, 'classNames' | 'location' | 'data' | 'debug'>;\n\n//\n// Column Root\n//\n\nconst BOARD_COLUMN_ROOT_NAME = 'Board.Column.Root';\n\ntype BoardColumnRootProps<TColumn = any> = PropsWithChildren<BoardColumnProps<TColumn>> & {\n dragHandleRef?: RefObject<HTMLButtonElement | null>;\n};\n\nconst BoardColumnRootInner = composable<HTMLDivElement, BoardColumnRootProps>(\n ({ classNames, children, location, data, debug, dragHandleRef: dragHandleRefProp, ...rest }, forwardedRef) => {\n const { model } = useBoard(BOARD_COLUMN_ROOT_NAME);\n\n // TODO(burdon): Use merge ref hook (see react-hooks).\n const internalRef = useRef<HTMLButtonElement>(null);\n const dragHandleRef = dragHandleRefProp ?? internalRef;\n\n return (\n <Mosaic.Tile\n asChild\n location={location}\n id={model.getColumnId(data)}\n data={data}\n debug={debug}\n dragHandle={dragHandleRef.current}\n >\n <Focus.Group\n {...rest}\n data-testid='board-column'\n border\n classNames={mx(\n 'group/column',\n 'h-full w-full md:w-card-default-width snap-center bg-deck-surface',\n 'overflow-hidden',\n classNames,\n )}\n ref={forwardedRef}\n >\n <BoardColumnProvider column={data}>{children}</BoardColumnProvider>\n </Focus.Group>\n </Mosaic.Tile>\n );\n },\n);\n\nBoardColumnRootInner.displayName = BOARD_COLUMN_ROOT_NAME;\n\nconst BoardColumnRoot = BoardColumnRootInner as <TColumn = unknown>(\n props: BoardColumnRootProps<TColumn> & { ref?: ReactRef<HTMLDivElement> },\n) => ReactElement;\n\n//\n// Column Header\n//\n\nconst BOARD_COLUMN_HEADER_NAME = 'Board.Column.Header';\n\ntype BoardColumnHeaderProps = { label: string; dragHandleRef: ReactRef<HTMLButtonElement> };\n\nconst BoardColumnHeader = composable<HTMLDivElement, BoardColumnHeaderProps>(\n ({ label, dragHandleRef, ...props }, forwardedRef) => {\n const { t } = useTranslation(translationKey);\n const { model } = useBoard(BOARD_COLUMN_HEADER_NAME);\n const column = useBoardColumn();\n const columnMenuItems = useMemo(\n () =>\n column != null && model.onColumnDelete\n ? [\n createMenuAction('delete-column', () => model.onColumnDelete?.(column), {\n label: t('delete-menu.label'),\n icon: 'ph--trash--regular',\n }),\n ]\n : [],\n [column, model.onColumnDelete, t],\n );\n\n return (\n <Menu.Root>\n <Toolbar.Root {...composableProps(props)} data-testid='board-column-header' ref={forwardedRef}>\n <Toolbar.DragHandle ref={dragHandleRef} testId='mosaicBoard.columnDragHandle' />\n <Toolbar.Text data-testid='mosaicBoard.columnTitle'>{label}</Toolbar.Text>\n {/* TODO(wittjosiah): Reconcile with Card.Menu. */}\n <Menu.Trigger asChild disabled={!columnMenuItems?.length}>\n <Toolbar.IconButton\n iconOnly\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n label={t('action-menu.label')}\n />\n </Menu.Trigger>\n <Menu.Content items={columnMenuItems} />\n </Toolbar.Root>\n </Menu.Root>\n );\n },\n);\n\nBoardColumnHeader.displayName = BOARD_COLUMN_HEADER_NAME;\n\n//\n// Column Body\n//\n\nconst BOARD_COLUMN_BODY_NAME = 'Board.Column.Body';\n\ntype BoardColumnBodyProps = Pick<BoardColumnProps, 'data'> &\n Pick<MosaicContainerProps, 'eventHandler' | 'debug'> & {\n Tile?: MosaicStackProps<Obj.Unknown>['Tile'];\n };\n\nconst BoardColumnBody = composable<HTMLDivElement, BoardColumnBodyProps>(\n ({ data, eventHandler, Tile = BoardItem, debug, ...props }, forwardedRef) => {\n const { model } = useBoard(BOARD_COLUMN_BODY_NAME);\n const [viewport, setViewport] = useState<HTMLElement | null>(null);\n const items = useAtomValue(model.items(data));\n\n return (\n <Mosaic.Container\n {...composableProps(props)}\n asChild\n withFocus\n orientation='vertical'\n autoScroll={viewport}\n eventHandler={eventHandler}\n debug={debug}\n ref={forwardedRef}\n >\n <ScrollArea.Root orientation='vertical' thin centered padding>\n <ScrollArea.Viewport classNames='snap-y md:snap-none' ref={setViewport}>\n <Mosaic.Stack items={items} getId={model.getItemId} Tile={Tile} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Mosaic.Container>\n );\n },\n);\n\nBoardColumnBody.displayName = BOARD_COLUMN_BODY_NAME;\n\n//\n// Column Footer\n//\n\nconst BOARD_COLUMN_FOOTER_NAME = 'Board.Column.Footer';\n\ntype BoardColumnFooterProps = ThemedClassName & {\n data?: any;\n onAdd?: () => void;\n};\n\nconst BoardColumnFooter = forwardRef<HTMLDivElement, BoardColumnFooterProps>(\n ({ classNames, data, onAdd }, forwardedRef) => {\n const { t } = useTranslation(translationKey);\n const { model } = useBoard(BOARD_COLUMN_FOOTER_NAME);\n\n const handleAdd = onAdd ?? (model.onItemCreate && data ? () => void model.onItemCreate?.(data) : undefined);\n\n return (\n <Toolbar.Root classNames={mx('rounded-b-sm border-t border-separator', classNames)} ref={forwardedRef}>\n {handleAdd && (\n <IconButton\n data-testid='board-column-add-item'\n classNames='group-hover/column:opacity-100 md:opacity-0 transition transition-opacity duration-500'\n variant='ghost'\n icon='ph--plus--regular'\n iconOnly\n label={t('add-item.label')}\n onClick={handleAdd}\n />\n )}\n </Toolbar.Root>\n );\n },\n);\n\nBoardColumnFooter.displayName = BOARD_COLUMN_FOOTER_NAME;\n\n//\n// DefaultBoardColumn\n//\n\nconst BOARD_DEFAULT_COLUMN_NAME = 'Board.DefaultColumn';\n\ntype DefaultBoardColumnProps = BoardColumnProps & Pick<BoardColumnBodyProps, 'Tile'>;\n\nconst DefaultBoardColumn = forwardRef<HTMLDivElement, DefaultBoardColumnProps>(\n ({ classNames, location, data, debug, Tile = BoardItem }, forwardedRef) => {\n const { model } = useBoard(BOARD_DEFAULT_COLUMN_NAME);\n const [DebugInfo, debugHandler] = useContainerDebug(debug);\n const dragHandleRef = useRef<HTMLButtonElement>(null);\n const [column, updateColumn] = useObject(data);\n\n const eventHandler = useEventHandlerAdapter<Ref.Unknown>({\n id: model.getColumnId(data),\n items: column?.items ?? [],\n getId: (ref) => ref.target?.id ?? ref.dxn.toString(),\n get: (refOrObj) => (Ref.isRef(refOrObj) ? refOrObj.target! : refOrObj),\n make: (object) => Ref.make(object),\n canDrop: ({ source }) => {\n const item = Ref.isRef(source.data) ? source.data.target : source.data;\n return item != null && Obj.isObject(item) && model.isItem(item);\n },\n onChange: (mutator) => updateColumn((col) => mutator(col.items)),\n });\n\n return (\n <BoardColumnRootInner\n classNames={mx(\n 'group/column grid',\n debug\n ? 'grid-rows-[var(--dx-rail-action)_1fr_20rem]'\n : 'grid-rows-[var(--dx-rail-action)_1fr_var(--dx-rail-action)]',\n classNames,\n )}\n location={location}\n data={data}\n dragHandleRef={dragHandleRef}\n ref={forwardedRef}\n >\n <BoardColumnHeader label={Obj.getLabel(data) ?? data.id} dragHandleRef={dragHandleRef} />\n <BoardColumnBody data={data} eventHandler={eventHandler} debug={debugHandler} Tile={Tile} />\n <div role='none' className='flex flex-col col-span-full'>\n <BoardColumnFooter data={data} />\n <DebugInfo />\n </div>\n </BoardColumnRootInner>\n );\n },\n);\n\nDefaultBoardColumn.displayName = BOARD_DEFAULT_COLUMN_NAME;\n\n//\n// BoardColumn\n//\n\nexport const BoardColumn = {\n Root: BoardColumnRoot,\n Header: BoardColumnHeader,\n Body: BoardColumnBody,\n Footer: BoardColumnFooter,\n};\n\nexport { DefaultBoardColumn };\n\nexport { type BoardColumnProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport React, { type ReactElement, type Ref as ReactRef, forwardRef, useMemo, useRef } from 'react';\n\nimport { Obj } from '@dxos/echo';\nimport { Card, Tag, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { Menu, createMenuAction } from '@dxos/react-ui-menu';\nimport { getHashStyles } from '@dxos/ui-theme';\n\nimport { translationKey } from '#translations';\n\nimport { Focus } from '../Focus';\nimport { Mosaic, type MosaicTileProps } from '../Mosaic';\nimport { useBoard } from './Board';\nimport { useBoardColumn } from './Column';\n\nconst BOARD_ITEM_NAME = 'Board.Item';\n\ntype BoardItemProps<TItem extends Obj.Unknown = any> = Pick<\n MosaicTileProps<TItem>,\n 'classNames' | 'location' | 'data' | 'debug'\n>;\n\nconst BoardItemInner = forwardRef<HTMLDivElement, BoardItemProps>(\n ({ classNames, data, location, debug }, forwardedRef) => {\n const { t } = useTranslation(translationKey);\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = useComposedRefs<HTMLDivElement>(rootRef, forwardedRef);\n const dragHandleRef = useRef<HTMLButtonElement>(null);\n\n const { model } = useBoard(BOARD_ITEM_NAME);\n const column = useBoardColumn();\n const items = useMemo(\n () =>\n column != null && model.onItemDelete\n ? [\n createMenuAction('delete-item', () => model.onItemDelete?.(column, data), {\n label: t('delete-menu.label'),\n icon: 'ph--trash--regular',\n }),\n ]\n : [],\n [column, data, model.onItemDelete, t],\n );\n\n if (!data) {\n return null;\n }\n\n const label = Obj.getLabel(data);\n const description = Obj.getDescription(data);\n\n return (\n <Menu.Root>\n <Mosaic.Tile\n ref={rootRef}\n asChild\n dragHandle={dragHandleRef.current}\n id={data.id}\n data={data}\n location={location}\n debug={debug}\n >\n <Focus.Item asChild>\n <Card.Root\n classNames={classNames}\n data-testid='board-item'\n ref={composedRef}\n onClick={(event) => event.currentTarget.focus()}\n >\n <Card.Toolbar>\n <Card.DragHandle ref={dragHandleRef} testId='mosaicBoard.cardDragHandle' />\n <Card.Title data-testid='mosaicBoard.cardTitle'>{label}</Card.Title>\n {/* TODO(wittjosiah): Reconcile with Card.Menu. */}\n <Menu.Trigger asChild disabled={!items?.length}>\n <Toolbar.IconButton\n iconOnly\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n label={t('action-menu.label')}\n />\n </Menu.Trigger>\n <Menu.Content items={items} />\n </Card.Toolbar>\n {/* TODO(burdon): Replace with surface. */}\n <Card.Row icon='ph--note--regular' classNames='text-description'>\n <Card.Text>{description}</Card.Text>\n </Card.Row>\n <Card.Row icon='ph--tag--regular'>\n {label && (\n <div role='none' className='shrink-0 flex gap-1 items-center text-xs'>\n <Tag palette={getHashStyles(label).hue}>{label}</Tag>\n </div>\n )}\n </Card.Row>\n </Card.Root>\n </Focus.Item>\n </Mosaic.Tile>\n </Menu.Root>\n );\n },\n);\n\nBoardItemInner.displayName = BOARD_ITEM_NAME;\n\n/**\n * Default board tile.\n */\nconst BoardItem = BoardItemInner as <TItem extends Obj.Unknown = any>(\n props: BoardItemProps<TItem> & { ref?: ReactRef<HTMLDivElement> },\n) => ReactElement;\n\nexport { BoardItem, type BoardItemProps };\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { type KeyboardEvent, forwardRef, useCallback, useMemo, useState } from 'react';\n\nimport { Card, ScrollArea } from '@dxos/react-ui';\nimport { type SearchResult } from '@dxos/react-ui-search';\nimport { composable, composableProps } from '@dxos/ui-theme';\n\nimport { Focus, Mosaic, type MosaicTileProps, useMosaicContainer } from '../..';\n\nexport type SearchStackAction = {\n type: 'select';\n resultId: string;\n};\n\nexport type SearchStackActionHandler = (action: SearchStackAction) => void;\n\n//\n// SearchStack\n//\n\nexport type SearchStackProps = {\n id: string;\n results?: SearchResult[];\n currentId?: string;\n onAction?: SearchStackActionHandler;\n};\n\n/**\n * Card-based search result stack component using mosaic layout.\n */\nexport const SearchStack = composable<HTMLDivElement, SearchStackProps>(\n ({ results = [], currentId, onAction, ...props }, forwardedRef) => {\n const [viewport, setViewport] = useState<HTMLElement | null>(null);\n const items = useMemo(() => results.map((result) => ({ result, onAction })), [results, onAction]);\n\n const handleCurrentChange = useCallback(\n (id: string | undefined) => {\n if (id) {\n onAction?.({ type: 'select', resultId: id });\n }\n },\n [onAction],\n );\n\n const handleKeyDown = useCallback((event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n (document.activeElement as HTMLElement | null)?.click();\n }\n }, []);\n\n return (\n <Focus.Group asChild {...composableProps(props)} onKeyDown={handleKeyDown} ref={forwardedRef}>\n <Mosaic.Container asChild withFocus currentId={currentId} onCurrentChange={handleCurrentChange}>\n <ScrollArea.Root orientation='vertical' padding centered thin>\n <ScrollArea.Viewport ref={setViewport}>\n <Mosaic.VirtualStack\n Tile={SearchTile}\n classNames='my-2'\n gap={8}\n items={items}\n draggable={false}\n getId={(item) => item.result.id}\n getScrollElement={() => viewport}\n estimateSize={() => 100}\n />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Mosaic.Container>\n </Focus.Group>\n );\n },\n);\n\nSearchStack.displayName = 'SearchStack';\n\n//\n// SearchTile\n//\n\ntype SearchTileData = {\n result: SearchResult;\n onAction?: SearchStackActionHandler;\n};\n\ntype SearchTileProps = Pick<MosaicTileProps<SearchTileData>, 'location' | 'data' | 'current'>;\n\n/**\n * Default search result tile with a simple Card header.\n */\nconst SearchTile = forwardRef<HTMLDivElement, SearchTileProps>(({ data, location, current }, forwardedRef) => {\n const { result } = data;\n const { setCurrentId } = useMosaicContainer('SearchTile');\n\n const handleCurrentChange = useCallback(() => {\n setCurrentId(result.id);\n }, [result.id, setCurrentId]);\n\n // Navigation / current pattern: clicking a result navigates to its\n // detail. `dx-current` pairs with the `aria-current` attribute that\n // `Mosaic.Tile` now sets from the `current` prop. `dx-selected`\n // (master/detail option pattern) would be the wrong grammar here.\n // See `ui-theme/src/css/components/selected.md`.\n return (\n <Mosaic.Tile\n asChild\n classNames='dx-hover dx-current'\n id={result.id}\n data={data}\n location={location}\n current={current}\n >\n <Focus.Item asChild current={current} onCurrentChange={handleCurrentChange}>\n <Card.Root fullWidth ref={forwardedRef}>\n <Card.Toolbar>\n <Card.IconBlock />\n <Card.Title>{result.label}</Card.Title>\n </Card.Toolbar>\n {result.snippet && (\n <Card.Content>\n <Card.Row>\n <Card.Text variant='description'>{result.snippet}</Card.Text>\n </Card.Row>\n </Card.Content>\n )}\n </Card.Root>\n </Focus.Item>\n </Mosaic.Tile>\n );\n});\n\nSearchTile.displayName = 'SearchTile';\n"],
5
- "mappings": "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",
6
- "names": ["useAtomValue", "createContext", "React", "forwardRef", "useRef", "useState", "ScrollArea", "JsonHighlighter", "composable", "composableProps", "mx", "React", "forwardRef", "useMemo", "useRef", "createPortal", "JsonHighlighter", "mx", "useContainerDebug", "debug", "debugRef", "useRef", "useMemo", "undefined", "classNames", "div", "role", "className", "mx", "ref", "current", "createPortal", "ContainerInfo", "CONTAINER_INFO_NAME", "forwardRef", "forwardedRef", "id", "state", "activeLocation", "scrolling", "useMosaicContainer", "counter", "JsonHighlighter", "data", "count", "displayName", "useMemo", "log", "arrayMove", "props", "onTake", "source", "from", "findIndex", "item", "getId", "items", "splice", "onChange", "mutate", "data", "onDrop", "target", "to", "type", "insertIndex", "useDefaultColumnEventHandler", "id", "model", "items", "useEventHandlerAdapter", "getId", "getColumnId", "get", "data", "make", "object", "canDrop", "source", "isColumn", "StateEffect", "StateField", "Decoration", "EditorView", "ViewPlugin", "WidgetType", "dropHandler", "onDrop", "handleDrop", "views", "Set", "state", "reset", "forEach", "view", "dispatch", "effects", "setDrop", "of", "extension", "dropField", "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", "define", "create", "none", "decorations", "tr", "effect", "is", "value", "set", "widget", "toDOM", "document", "createElement", "className", "style", "borderLeft", "display", "height", "verticalAlign", "side", "range", "map", "provide", "field", "useAtomValue", "createContext", "React", "forwardRef", "useMemo", "useRef", "useState", "Obj", "Ref", "useObject", "IconButton", "ScrollArea", "Toolbar", "useTranslation", "Menu", "createMenuAction", "composable", "composableProps", "mx", "translationKey", "useComposedRefs", "React", "forwardRef", "useMemo", "useRef", "Obj", "Card", "Tag", "Toolbar", "useTranslation", "Menu", "createMenuAction", "getHashStyles", "translationKey", "BOARD_ITEM_NAME", "BoardItemInner", "forwardRef", "classNames", "data", "location", "debug", "forwardedRef", "t", "useTranslation", "translationKey", "rootRef", "useRef", "composedRef", "useComposedRefs", "dragHandleRef", "model", "useBoard", "column", "useBoardColumn", "items", "useMemo", "onItemDelete", "createMenuAction", "label", "icon", "Obj", "getLabel", "description", "getDescription", "React", "Menu", "Root", "Mosaic", "Tile", "ref", "asChild", "dragHandle", "current", "id", "Focus", "Item", "Card", "data-testid", "onClick", "event", "currentTarget", "focus", "Toolbar", "DragHandle", "testId", "Title", "Trigger", "disabled", "length", "IconButton", "iconOnly", "variant", "Content", "Row", "Text", "div", "role", "className", "Tag", "palette", "getHashStyles", "hue", "displayName", "BoardItem", "BOARD_COLUMN_CONTEXT_NAME", "BoardColumnProvider", "useBoardColumnContext", "createContext", "useBoardColumn", "value", "column", "BOARD_COLUMN_ROOT_NAME", "BoardColumnRootInner", "composable", "classNames", "children", "location", "data", "debug", "dragHandleRef", "dragHandleRefProp", "rest", "forwardedRef", "model", "useBoard", "internalRef", "useRef", "React", "Mosaic", "Tile", "asChild", "id", "getColumnId", "dragHandle", "current", "Focus", "Group", "data-testid", "border", "mx", "ref", "displayName", "BoardColumnRoot", "BOARD_COLUMN_HEADER_NAME", "BoardColumnHeader", "label", "props", "t", "useTranslation", "translationKey", "columnMenuItems", "useMemo", "onColumnDelete", "createMenuAction", "icon", "Menu", "Root", "Toolbar", "composableProps", "DragHandle", "testId", "Text", "Trigger", "disabled", "length", "IconButton", "iconOnly", "variant", "Content", "items", "BOARD_COLUMN_BODY_NAME", "BoardColumnBody", "eventHandler", "BoardItem", "viewport", "setViewport", "useState", "useAtomValue", "Container", "withFocus", "orientation", "autoScroll", "ScrollArea", "thin", "centered", "padding", "Viewport", "Stack", "getId", "getItemId", "BOARD_COLUMN_FOOTER_NAME", "BoardColumnFooter", "forwardRef", "onAdd", "handleAdd", "onItemCreate", "undefined", "onClick", "BOARD_DEFAULT_COLUMN_NAME", "DefaultBoardColumn", "DebugInfo", "debugHandler", "useContainerDebug", "updateColumn", "useObject", "useEventHandlerAdapter", "target", "dxn", "toString", "get", "refOrObj", "Ref", "isRef", "make", "object", "canDrop", "source", "item", "Obj", "isObject", "isItem", "onChange", "mutator", "col", "getLabel", "div", "role", "className", "BoardColumn", "Header", "Body", "Footer", "BOARD_NAME", "BoardContextProvider", "useBoardContext", "createContext", "useBoard", "displayName", "BOARD_ROOT_NAME", "BoardRootInner", "model", "children", "React", "BoardRoot", "BOARD_CONTENT_NAME", "BoardContentInner", "composable", "id", "_id", "debug", "eventHandler", "Tile", "DefaultBoardColumn", "props", "forwardedRef", "DebugInfo", "debugHandler", "useContainerDebug", "viewport", "setViewport", "useState", "items", "useAtomValue", "columns", "div", "composableProps", "classNames", "ref", "Focus", "Group", "asChild", "orientation", "Mosaic", "Container", "withFocus", "autoScroll", "ScrollArea", "Root", "centered", "padding", "Viewport", "Stack", "getId", "getColumnId", "BoardContent", "BOARD_PLACEHOLDER_NAME", "BoardPlaceholder", "Placeholder", "mosaicStyles", "placeholder", "root", "className", "mx", "content", "BOARD_DEBUG_NAME", "BoardDebug", "forwardRef", "containers", "dragging", "useMosaic", "counter", "useRef", "JsonHighlighter", "data", "count", "current", "Board", "Content", "Column", "BoardColumn", "Item", "BoardItem", "Debug", "React", "forwardRef", "useCallback", "useMemo", "useState", "Card", "ScrollArea", "composable", "composableProps", "SearchStack", "composable", "results", "currentId", "onAction", "props", "forwardedRef", "viewport", "setViewport", "useState", "items", "useMemo", "map", "result", "handleCurrentChange", "useCallback", "id", "type", "resultId", "handleKeyDown", "event", "key", "preventDefault", "document", "activeElement", "click", "React", "Focus", "Group", "asChild", "composableProps", "onKeyDown", "ref", "Mosaic", "Container", "withFocus", "onCurrentChange", "ScrollArea", "Root", "orientation", "padding", "centered", "thin", "Viewport", "VirtualStack", "Tile", "SearchTile", "classNames", "gap", "draggable", "getId", "item", "getScrollElement", "estimateSize", "displayName", "forwardRef", "data", "location", "current", "setCurrentId", "useMosaicContainer", "Item", "Card", "fullWidth", "Toolbar", "IconBlock", "Title", "label", "snippet", "Content", "Row", "Text", "variant"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Atom, useAtomValue } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport React, {\n type PropsWithChildren,\n type ReactElement,\n type Ref as ReactRef,\n forwardRef,\n useRef,\n useState,\n} from 'react';\n\nimport { ScrollArea, type ThemedClassName } from '@dxos/react-ui';\nimport { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';\nimport { composable, composableProps, mx } from '@dxos/ui-theme';\n\nimport { useContainerDebug } from '../../hooks';\nimport { Focus } from '../Focus';\nimport {\n type GetId,\n Mosaic,\n type MosaicEventHandler,\n type MosaicPlaceholderProps,\n type MosaicStackProps,\n mosaicStyles,\n useMosaic,\n} from '../Mosaic';\nimport { BoardColumn, type BoardColumnProps, DefaultBoardColumn, useBoardColumn } from './Column';\nimport { BoardItem, type BoardItemProps } from './Item';\n\n//\n// Model\n//\n\nexport interface BoardModel<TColumn = any, TItem = any> {\n getColumnId: GetId<TColumn>;\n getItemId: GetId<TItem>;\n isColumn: (obj: unknown) => obj is TColumn;\n isItem: (obj: unknown) => obj is TItem;\n columns: Atom.Atom<readonly TColumn[] | TColumn[]>;\n items: (column: TColumn) => Atom.Atom<TItem[]>;\n getColumns: () => TColumn[];\n getItems: (column: TColumn) => TItem[];\n onColumnCreate?: () => Promise<TColumn>;\n onColumnDelete?: (column: TColumn) => void;\n onItemCreate?: (column: TColumn) => Promise<TItem>;\n onItemDelete?: (column: TColumn, item: TItem) => void;\n}\n\n//\n// Context\n//\n\nconst BOARD_NAME = 'Board';\n\ntype BoardContextValue<TColumn = any, TItem = any> = {\n model: BoardModel<TColumn, TItem>;\n};\n\nconst [BoardContextProvider, useBoardContext] = createContext<BoardContextValue>(BOARD_NAME);\n\n/** Hook to read the board model from context (e.g. in custom column tiles). Pass TColumn and TItem for typed model. */\nfunction useBoard<TColumn = any, TItem = any>(displayName?: string): BoardContextValue<TColumn, TItem> {\n return useBoardContext(displayName ?? BOARD_NAME) as BoardContextValue<TColumn, TItem>;\n}\n\n//\n// Root\n//\n\nconst BOARD_ROOT_NAME = 'Board.Root';\n\ntype BoardRootProps<TColumn = any, TItem = any> = PropsWithChildren<BoardContextValue<TColumn, TItem>>;\n\nconst BoardRootInner = ({ model, children }: BoardRootProps) => {\n return <BoardContextProvider model={model}>{children}</BoardContextProvider>;\n};\n\nBoardRootInner.displayName = BOARD_ROOT_NAME;\n\nconst BoardRoot = BoardRootInner as <TColumn = any, TItem = any>(props: BoardRootProps<TColumn, TItem>) => ReactElement;\n\n//\n// Content\n//\n\nconst BOARD_CONTENT_NAME = 'Board.Content';\n\ntype BoardContentProps<TColumn = any> = ThemedClassName<{\n id: string;\n debug?: boolean;\n eventHandler?: MosaicEventHandler<TColumn>;\n Tile?: MosaicStackProps<TColumn>['Tile'];\n}>;\n\nconst BoardContentInner = composable<HTMLDivElement, BoardContentProps>(\n ({ id: _id, debug, eventHandler, Tile = DefaultBoardColumn, ...props }, forwardedRef) => {\n const { model } = useBoardContext(BOARD_CONTENT_NAME);\n const [DebugInfo, debugHandler] = useContainerDebug(debug);\n const [viewport, setViewport] = useState<HTMLElement | null>(null);\n\n const items = useAtomValue(model.columns);\n\n return (\n <div {...composableProps(props, { classNames: 'dx-container' })} ref={forwardedRef}>\n <Focus.Group asChild orientation='horizontal'>\n <Mosaic.Container\n asChild\n withFocus\n orientation='horizontal'\n autoScroll={viewport}\n eventHandler={eventHandler}\n debug={debugHandler}\n >\n <ScrollArea.Root orientation='horizontal' centered padding>\n <ScrollArea.Viewport classNames='snap-mandatory snap-x md:snap-none' ref={setViewport}>\n <Mosaic.Stack items={items} getId={model.getColumnId} Tile={Tile} debug={debug} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Mosaic.Container>\n </Focus.Group>\n <DebugInfo />\n </div>\n );\n },\n);\n\nBoardContentInner.displayName = BOARD_CONTENT_NAME;\n\nconst BoardContent = BoardContentInner as <TColumn = any>(\n props: BoardContentProps<TColumn> & { ref?: ReactRef<HTMLDivElement> },\n) => ReactElement;\n\n//\n// Placeholder\n//\n\nconst BOARD_PLACEHOLDER_NAME = 'Board.Placeholder';\n\nconst BoardPlaceholder = (props: MosaicPlaceholderProps<number>) => {\n return (\n <Mosaic.Placeholder {...props} classNames={mosaicStyles.placeholder.root}>\n <div\n className={mx('flex h-full border border-dashed border-separator rounded-xs', mosaicStyles.placeholder.content)}\n />\n </Mosaic.Placeholder>\n );\n};\n\nBoardPlaceholder.displayName = BOARD_PLACEHOLDER_NAME;\n\n//\n// Debug\n//\n\nconst BOARD_DEBUG_NAME = 'Board.Debug';\n\nexport const BoardDebug = forwardRef<HTMLDivElement, ThemedClassName>(({ classNames }, forwardedRef) => {\n const { containers, dragging } = useMosaic(BOARD_DEBUG_NAME);\n const counter = useRef(0);\n return (\n <JsonHighlighter\n data={{ containers, dragging, count: counter.current++ }}\n classNames={mx('text-xs', classNames)}\n ref={forwardedRef}\n />\n );\n});\n\nBoardDebug.displayName = BOARD_DEBUG_NAME;\n\n//\n// Board\n//\n\nexport const Board = {\n Root: BoardRoot,\n Content: BoardContent,\n Column: BoardColumn,\n Item: BoardItem,\n Placeholder: BoardPlaceholder,\n Debug: BoardDebug,\n};\n\nexport { useBoard, useBoardColumn };\n\nexport type { BoardRootProps, BoardContentProps, BoardColumnProps, BoardItemProps };\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 { JsonHighlighter } 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 className={mx('overflow-hidden', classNames)} ref={debugRef} />,\n () => debugRef.current && createPortal(<ContainerInfo />, debugRef.current),\n ];\n }, [debug, debugRef]);\n};\n\nconst CONTAINER_INFO_NAME = 'ContainerInfo';\n\nconst ContainerInfo = forwardRef<HTMLDivElement, ThemedClassName>(({ classNames }, forwardedRef) => {\n const { id, state, activeLocation, scrolling } = useMosaicContainer(CONTAINER_INFO_NAME);\n const counter = useRef(0);\n return (\n <JsonHighlighter\n data={{ id, activeLocation, scrolling, state, count: counter.current++ }}\n classNames={mx('text-xs', classNames)}\n ref={forwardedRef}\n />\n );\n});\n\nContainerInfo.displayName = CONTAINER_INFO_NAME;\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 extends Obj.Unknown = Obj.Unknown> = Pick<\n MosaicEventHandler<TItem>,\n 'id' | 'canDrop'\n> & {\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.update 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 log.info('onDrop', { source, target });\n\n const mutate = (items: TItem[]) => {\n const to =\n target?.type === 'tile' || target?.type === 'placeholder'\n ? target.location\n : target?.type === 'container'\n ? items.length\n : -1;\n const from = items.findIndex((item) => getId(item) === source.id);\n const insertIndex = typeof to === 'number' && to >= 0 ? Math.floor(to) : -1;\n if (insertIndex !== -1) {\n if (from !== -1) {\n arrayMove(items, from, insertIndex);\n } else {\n // TODO(burdon): This should be the responsibility of the source container.\n items.splice(insertIndex, 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 { type Obj } from '@dxos/echo';\n\nimport { type GetId, type MosaicEventHandler } from '../components';\nimport { useEventHandlerAdapter } from './useEventHandlerAdapter';\n\n/**\n * Minimal model shape needed to build the default column handler.\n */\nexport type DefaultColumnEventHandlerModel<TColumn = unknown> = {\n getColumnId: GetId<TColumn>;\n isColumn: (obj: unknown) => obj is TColumn;\n};\n\n/**\n * Returns the default column drag/drop handler (no persistence).\n * Use this when no custom eventHandler is passed to Board.Content.\n */\nexport const useDefaultColumnEventHandler = <TColumn extends Obj.Unknown = Obj.Unknown>(\n id: string,\n model: DefaultColumnEventHandlerModel<TColumn>,\n items: TColumn[],\n): MosaicEventHandler<TColumn> =>\n useEventHandlerAdapter<TColumn, TColumn>({\n id,\n items,\n getId: model.getColumnId,\n get: (data) => data,\n make: (object) => object,\n canDrop: ({ source }) => model.isColumn(source.data),\n });\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(--color-accent-surface)';\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 2023 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport React, {\n type PropsWithChildren,\n type ReactElement,\n type Ref as ReactRef,\n forwardRef,\n useMemo,\n useState,\n} from 'react';\n\nimport { Obj, Ref } from '@dxos/echo';\nimport { useObject } from '@dxos/react-client/echo';\nimport { IconButton, ScrollArea, type ThemedClassName, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { Menu, createMenuAction } from '@dxos/react-ui-menu';\nimport { composable, composableProps, mx } from '@dxos/ui-theme';\n\nimport { translationKey } from '#translations';\n\nimport { useContainerDebug, useEventHandlerAdapter } from '../../hooks';\nimport { Focus } from '../Focus';\nimport { Mosaic, type MosaicContainerProps, type MosaicStackProps, type MosaicTileProps } from '../Mosaic';\nimport { useBoard } from './Board';\nimport { BoardItem } from './Item';\n\n//\n// Column context\n//\n\nconst BOARD_COLUMN_CONTEXT_NAME = 'Board.Column';\n\nexport type BoardColumnContextValue<TColumn = unknown> = {\n column: TColumn;\n};\n\nconst [BoardColumnProvider, useBoardColumnContext] = createContext<BoardColumnContextValue | null>(\n BOARD_COLUMN_CONTEXT_NAME,\n null,\n);\n\n/** Returns the current column when rendered inside a board column (e.g., in column header or item tile). */\nexport function useBoardColumn<TColumn = unknown>(): TColumn | undefined {\n const value = useBoardColumnContext(BOARD_COLUMN_CONTEXT_NAME);\n return value?.column as TColumn | undefined;\n}\n\ntype BoardColumnProps<TColumn = any> = Pick<\n MosaicTileProps<TColumn>,\n 'classNames' | 'location' | 'data' | 'debug' | 'draggable'\n>;\n\n//\n// Column Root\n//\n\nconst BOARD_COLUMN_ROOT_NAME = 'Board.Column.Root';\n\ntype BoardColumnRootProps<TColumn = any> = PropsWithChildren<BoardColumnProps<TColumn>> & {\n // Pass the actual button element (not a ref). Refs don't trigger re-renders, so reading\n // `ref.current` at render time leaves Mosaic.Tile's `dragHandle` prop null forever.\n // Consumers should track this with `useState` and a callback ref on `Board.Column.Header`.\n dragHandle?: HTMLButtonElement | null;\n};\n\nconst BoardColumnRootInner = composable<HTMLDivElement, BoardColumnRootProps>(\n ({ classNames, children, location, data, debug, draggable, dragHandle, ...rest }, forwardedRef) => {\n const { model } = useBoard(BOARD_COLUMN_ROOT_NAME);\n\n return (\n <Mosaic.Tile\n asChild\n location={location}\n id={model.getColumnId(data)}\n data={data}\n debug={debug}\n draggable={draggable}\n dragHandle={dragHandle}\n >\n <Focus.Group\n {...rest}\n data-testid='board-column'\n border\n classNames={mx(\n 'group/column',\n 'h-full w-full md:w-card-default-width snap-center bg-deck-surface',\n 'overflow-hidden',\n classNames,\n )}\n ref={forwardedRef}\n >\n <BoardColumnProvider column={data}>{children}</BoardColumnProvider>\n </Focus.Group>\n </Mosaic.Tile>\n );\n },\n);\n\nBoardColumnRootInner.displayName = BOARD_COLUMN_ROOT_NAME;\n\nconst BoardColumnRoot = BoardColumnRootInner as <TColumn = unknown>(\n props: BoardColumnRootProps<TColumn> & { ref?: ReactRef<HTMLDivElement> },\n) => ReactElement;\n\n//\n// Column Header\n//\n\nconst BOARD_COLUMN_HEADER_NAME = 'Board.Column.Header';\n\ntype BoardColumnHeaderProps = { label: string; dragHandleRef: ReactRef<HTMLButtonElement> };\n\nconst BoardColumnHeader = composable<HTMLDivElement, BoardColumnHeaderProps>(\n ({ label, dragHandleRef, ...props }, forwardedRef) => {\n const { t } = useTranslation(translationKey);\n const { model } = useBoard(BOARD_COLUMN_HEADER_NAME);\n const column = useBoardColumn();\n const columnMenuItems = useMemo(\n () =>\n column != null && model.onColumnDelete\n ? [\n createMenuAction('delete-column', () => model.onColumnDelete?.(column), {\n label: t('delete-menu.label'),\n icon: 'ph--trash--regular',\n }),\n ]\n : [],\n [column, model.onColumnDelete, t],\n );\n\n return (\n <Menu.Root>\n <Toolbar.Root {...composableProps(props)} data-testid='board-column-header' ref={forwardedRef}>\n <Toolbar.DragHandle ref={dragHandleRef} testId='mosaicBoard.columnDragHandle' />\n <Toolbar.Text data-testid='mosaicBoard.columnTitle'>{label}</Toolbar.Text>\n {/* TODO(wittjosiah): Reconcile with Card.Menu. */}\n <Menu.Trigger asChild disabled={!columnMenuItems?.length}>\n <Toolbar.IconButton\n iconOnly\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n label={t('action-menu.label')}\n />\n </Menu.Trigger>\n <Menu.Content items={columnMenuItems} />\n </Toolbar.Root>\n </Menu.Root>\n );\n },\n);\n\nBoardColumnHeader.displayName = BOARD_COLUMN_HEADER_NAME;\n\n//\n// Column Body\n//\n\nconst BOARD_COLUMN_BODY_NAME = 'Board.Column.Body';\n\ntype BoardColumnBodyProps = Pick<BoardColumnProps, 'data'> &\n Pick<MosaicContainerProps, 'eventHandler' | 'debug'> & {\n Tile?: MosaicStackProps<Obj.Unknown>['Tile'];\n };\n\nconst BoardColumnBody = composable<HTMLDivElement, BoardColumnBodyProps>(\n ({ data, eventHandler, Tile = BoardItem, debug, ...props }, forwardedRef) => {\n const { model } = useBoard(BOARD_COLUMN_BODY_NAME);\n const [viewport, setViewport] = useState<HTMLElement | null>(null);\n const items = useAtomValue(model.items(data));\n\n return (\n <Mosaic.Container\n {...composableProps(props)}\n asChild\n withFocus\n orientation='vertical'\n autoScroll={viewport}\n eventHandler={eventHandler}\n debug={debug}\n ref={forwardedRef}\n >\n <ScrollArea.Root orientation='vertical' thin centered padding>\n <ScrollArea.Viewport classNames='snap-y md:snap-none' ref={setViewport}>\n <Mosaic.Stack items={items} getId={model.getItemId} Tile={Tile} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Mosaic.Container>\n );\n },\n);\n\nBoardColumnBody.displayName = BOARD_COLUMN_BODY_NAME;\n\n//\n// Column Footer\n//\n\nconst BOARD_COLUMN_FOOTER_NAME = 'Board.Column.Footer';\n\ntype BoardColumnFooterProps = ThemedClassName & {\n data?: any;\n onAdd?: () => void;\n};\n\nconst BoardColumnFooter = forwardRef<HTMLDivElement, BoardColumnFooterProps>(\n ({ classNames, data, onAdd }, forwardedRef) => {\n const { t } = useTranslation(translationKey);\n const { model } = useBoard(BOARD_COLUMN_FOOTER_NAME);\n\n const handleAdd = onAdd ?? (model.onItemCreate && data ? () => void model.onItemCreate?.(data) : undefined);\n\n return (\n <Toolbar.Root classNames={mx('rounded-b-sm border-t border-separator', classNames)} ref={forwardedRef}>\n {handleAdd && (\n <IconButton\n data-testid='board-column-add-item'\n classNames='group-hover/column:opacity-100 md:opacity-0 transition transition-opacity duration-500'\n variant='ghost'\n icon='ph--plus--regular'\n iconOnly\n label={t('add-item.label')}\n onClick={handleAdd}\n />\n )}\n </Toolbar.Root>\n );\n },\n);\n\nBoardColumnFooter.displayName = BOARD_COLUMN_FOOTER_NAME;\n\n//\n// DefaultBoardColumn\n//\n\nconst BOARD_DEFAULT_COLUMN_NAME = 'Board.DefaultColumn';\n\ntype DefaultBoardColumnProps = BoardColumnProps & Pick<BoardColumnBodyProps, 'Tile'>;\n\nconst DefaultBoardColumn = forwardRef<HTMLDivElement, DefaultBoardColumnProps>(\n ({ classNames, location, data, debug, draggable, Tile = BoardItem }, forwardedRef) => {\n const { model } = useBoard(BOARD_DEFAULT_COLUMN_NAME);\n const [DebugInfo, debugHandler] = useContainerDebug(debug);\n const [dragHandle, setDragHandle] = useState<HTMLButtonElement | null>(null);\n const [column, updateColumn] = useObject(data);\n\n const eventHandler = useEventHandlerAdapter<Ref.Unknown>({\n id: model.getColumnId(data),\n items: column?.items ?? [],\n getId: (ref) => ref.target?.id ?? ref.dxn.toString(),\n get: (refOrObj) => (Ref.isRef(refOrObj) ? refOrObj.target! : refOrObj),\n make: (object) => Ref.make(object),\n canDrop: ({ source }) => {\n const item = Ref.isRef(source.data) ? source.data.target : source.data;\n return item != null && Obj.isObject(item) && model.isItem(item);\n },\n onChange: (mutator) => updateColumn((col) => mutator(col.items)),\n });\n\n return (\n <BoardColumnRootInner\n classNames={mx(\n 'group/column grid',\n debug\n ? 'grid-rows-[var(--dx-rail-action)_1fr_20rem]'\n : 'grid-rows-[var(--dx-rail-action)_1fr_var(--dx-rail-action)]',\n classNames,\n )}\n location={location}\n data={data}\n draggable={draggable}\n dragHandle={dragHandle}\n ref={forwardedRef}\n >\n <BoardColumnHeader label={Obj.getLabel(data) ?? data.id} dragHandleRef={setDragHandle} />\n <BoardColumnBody data={data} eventHandler={eventHandler} debug={debugHandler} Tile={Tile} />\n <div className='flex flex-col col-span-full'>\n <BoardColumnFooter data={data} />\n <DebugInfo />\n </div>\n </BoardColumnRootInner>\n );\n },\n);\n\nDefaultBoardColumn.displayName = BOARD_DEFAULT_COLUMN_NAME;\n\n//\n// BoardColumn\n//\n\nexport const BoardColumn = {\n Root: BoardColumnRoot,\n Header: BoardColumnHeader,\n Body: BoardColumnBody,\n Footer: BoardColumnFooter,\n};\n\nexport { DefaultBoardColumn };\n\nexport { type BoardColumnProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport React, { type ReactElement, type Ref as ReactRef, forwardRef, useMemo, useRef, useState } from 'react';\n\nimport { Obj } from '@dxos/echo';\nimport { Card, Tag, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { Menu, createMenuAction } from '@dxos/react-ui-menu';\nimport { getHashStyles } from '@dxos/ui-theme';\n\nimport { translationKey } from '#translations';\n\nimport { Focus } from '../Focus';\nimport { Mosaic, type MosaicTileProps } from '../Mosaic';\nimport { useBoard } from './Board';\nimport { useBoardColumn } from './Column';\n\nconst BOARD_ITEM_NAME = 'Board.Item';\n\ntype BoardItemProps<TItem extends Obj.Unknown = any> = Pick<\n MosaicTileProps<TItem>,\n 'classNames' | 'location' | 'data' | 'debug' | 'draggable'\n>;\n\nconst BoardItemInner = forwardRef<HTMLDivElement, BoardItemProps>(\n ({ classNames, data, location, debug, draggable }, forwardedRef) => {\n const { t } = useTranslation(translationKey);\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = useComposedRefs<HTMLDivElement>(rootRef, forwardedRef);\n // Use state (callback ref) so the dragHandle prop updates when the button mounts.\n // Refs don't trigger re-renders, so reading `.current` at render time leaves the prop null.\n const [dragHandle, setDragHandle] = useState<HTMLButtonElement | null>(null);\n\n const { model } = useBoard(BOARD_ITEM_NAME);\n const column = useBoardColumn();\n const items = useMemo(\n () =>\n column != null && model.onItemDelete\n ? [\n createMenuAction('delete-item', () => model.onItemDelete?.(column, data), {\n label: t('delete-menu.label'),\n icon: 'ph--trash--regular',\n }),\n ]\n : [],\n [column, data, model.onItemDelete, t],\n );\n\n if (!data) {\n return null;\n }\n\n const label = Obj.getLabel(data);\n const description = Obj.getDescription(data);\n\n return (\n <Menu.Root>\n <Mosaic.Tile\n ref={rootRef}\n asChild\n draggable={draggable}\n dragHandle={dragHandle}\n id={data.id}\n data={data}\n location={location}\n debug={debug}\n >\n <Focus.Item asChild>\n <Card.Root\n classNames={classNames}\n data-testid='board-item'\n ref={composedRef}\n onClick={(event) => event.currentTarget.focus()}\n >\n <Card.Toolbar>\n <Card.DragHandle ref={setDragHandle} testId='mosaicBoard.cardDragHandle' />\n <Card.Title data-testid='mosaicBoard.cardTitle'>{label}</Card.Title>\n {/* TODO(wittjosiah): Reconcile with Card.Menu. */}\n <Menu.Trigger asChild disabled={!items?.length}>\n <Toolbar.IconButton\n iconOnly\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n label={t('action-menu.label')}\n />\n </Menu.Trigger>\n <Menu.Content items={items} />\n </Card.Toolbar>\n {/* TODO(burdon): Replace with surface. */}\n <Card.Row icon='ph--note--regular' classNames='text-description'>\n <Card.Text>{description}</Card.Text>\n </Card.Row>\n <Card.Row icon='ph--tag--regular'>\n {label && (\n <div className='shrink-0 flex gap-1 items-center text-xs'>\n <Tag palette={getHashStyles(label).hue}>{label}</Tag>\n </div>\n )}\n </Card.Row>\n </Card.Root>\n </Focus.Item>\n </Mosaic.Tile>\n </Menu.Root>\n );\n },\n);\n\nBoardItemInner.displayName = BOARD_ITEM_NAME;\n\n/**\n * Default board tile.\n */\nconst BoardItem = BoardItemInner as <TItem extends Obj.Unknown = any>(\n props: BoardItemProps<TItem> & { ref?: ReactRef<HTMLDivElement> },\n) => ReactElement;\n\nexport { BoardItem, type BoardItemProps };\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { type KeyboardEvent, forwardRef, useCallback, useMemo, useState } from 'react';\n\nimport { Card, ScrollArea } from '@dxos/react-ui';\nimport { type SearchResult } from '@dxos/react-ui-search';\nimport { composable, composableProps } from '@dxos/ui-theme';\n\nimport { Focus, Mosaic, type MosaicTileProps, useMosaicContainer } from '../..';\n\nexport type SearchStackAction = {\n type: 'select';\n resultId: string;\n};\n\nexport type SearchStackActionHandler = (action: SearchStackAction) => void;\n\n//\n// SearchStack\n//\n\nexport type SearchStackProps = {\n id: string;\n results?: SearchResult[];\n currentId?: string;\n onAction?: SearchStackActionHandler;\n};\n\n/**\n * Card-based search result stack component using mosaic layout.\n */\nexport const SearchStack = composable<HTMLDivElement, SearchStackProps>(\n ({ results = [], currentId, onAction, ...props }, forwardedRef) => {\n const [viewport, setViewport] = useState<HTMLElement | null>(null);\n const items = useMemo(() => results.map((result) => ({ result, onAction })), [results, onAction]);\n\n const handleCurrentChange = useCallback(\n (id: string | undefined) => {\n if (id) {\n onAction?.({ type: 'select', resultId: id });\n }\n },\n [onAction],\n );\n\n const handleKeyDown = useCallback((event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n (document.activeElement as HTMLElement | null)?.click();\n }\n }, []);\n\n return (\n <Focus.Group asChild {...composableProps(props)} onKeyDown={handleKeyDown} ref={forwardedRef}>\n <Mosaic.Container asChild withFocus currentId={currentId} onCurrentChange={handleCurrentChange}>\n <ScrollArea.Root orientation='vertical' padding centered thin>\n <ScrollArea.Viewport ref={setViewport}>\n <Mosaic.VirtualStack\n Tile={SearchTile}\n classNames='my-2'\n gap={8}\n items={items}\n draggable={false}\n getId={(item) => item.result.id}\n getScrollElement={() => viewport}\n estimateSize={() => 100}\n />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Mosaic.Container>\n </Focus.Group>\n );\n },\n);\n\nSearchStack.displayName = 'SearchStack';\n\n//\n// SearchTile\n//\n\ntype SearchTileData = {\n result: SearchResult;\n onAction?: SearchStackActionHandler;\n};\n\ntype SearchTileProps = Pick<MosaicTileProps<SearchTileData>, 'location' | 'data' | 'current'>;\n\n/**\n * Default search result tile with a simple Card header.\n */\nconst SearchTile = forwardRef<HTMLDivElement, SearchTileProps>(({ data, location, current }, forwardedRef) => {\n const { result } = data;\n const { setCurrentId } = useMosaicContainer('SearchTile');\n\n const handleCurrentChange = useCallback(() => {\n setCurrentId(result.id);\n }, [result.id, setCurrentId]);\n\n // Navigation / current pattern: clicking a result navigates to its\n // detail. `dx-current` pairs with the `aria-current` attribute that\n // `Mosaic.Tile` now sets from the `current` prop. `dx-selected`\n // (master/detail option pattern) would be the wrong grammar here.\n // See `ui-theme/src/css/components/selected.md`.\n return (\n <Mosaic.Tile\n asChild\n classNames='dx-hover dx-current'\n id={result.id}\n data={data}\n location={location}\n current={current}\n >\n <Focus.Item asChild current={current} onCurrentChange={handleCurrentChange}>\n <Card.Root fullWidth ref={forwardedRef}>\n <Card.Toolbar>\n <Card.IconBlock />\n <Card.Title>{result.label}</Card.Title>\n </Card.Toolbar>\n {result.snippet && (\n <Card.Content>\n <Card.Row>\n <Card.Text variant='description'>{result.snippet}</Card.Text>\n </Card.Row>\n </Card.Content>\n )}\n </Card.Root>\n </Focus.Item>\n </Mosaic.Tile>\n );\n});\n\nSearchTile.displayName = 'SearchTile';\n"],
5
+ "mappings": "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",
6
+ "names": ["useAtomValue", "createContext", "React", "forwardRef", "useRef", "useState", "ScrollArea", "JsonHighlighter", "composable", "composableProps", "mx", "React", "forwardRef", "useMemo", "useRef", "createPortal", "JsonHighlighter", "mx", "useContainerDebug", "debug", "debugRef", "useRef", "useMemo", "undefined", "classNames", "div", "className", "mx", "ref", "current", "createPortal", "ContainerInfo", "CONTAINER_INFO_NAME", "forwardRef", "forwardedRef", "id", "state", "activeLocation", "scrolling", "useMosaicContainer", "counter", "JsonHighlighter", "data", "count", "displayName", "useMemo", "log", "arrayMove", "props", "onTake", "source", "from", "findIndex", "item", "getId", "items", "splice", "onChange", "mutate", "data", "onDrop", "target", "to", "type", "insertIndex", "useDefaultColumnEventHandler", "id", "model", "items", "useEventHandlerAdapter", "getId", "getColumnId", "get", "data", "make", "object", "canDrop", "source", "isColumn", "StateEffect", "StateField", "Decoration", "EditorView", "ViewPlugin", "WidgetType", "dropHandler", "onDrop", "handleDrop", "views", "Set", "state", "reset", "forEach", "view", "dispatch", "effects", "setDrop", "of", "extension", "dropField", "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", "define", "create", "none", "decorations", "tr", "effect", "is", "value", "set", "widget", "toDOM", "document", "createElement", "className", "style", "borderLeft", "display", "height", "verticalAlign", "side", "range", "map", "provide", "field", "useAtomValue", "createContext", "React", "forwardRef", "useMemo", "useState", "Obj", "Ref", "useObject", "IconButton", "ScrollArea", "Toolbar", "useTranslation", "Menu", "createMenuAction", "composable", "composableProps", "mx", "translationKey", "useComposedRefs", "React", "forwardRef", "useMemo", "useRef", "useState", "Obj", "Card", "Tag", "Toolbar", "useTranslation", "Menu", "createMenuAction", "getHashStyles", "translationKey", "BOARD_ITEM_NAME", "BoardItemInner", "forwardRef", "classNames", "data", "location", "debug", "draggable", "forwardedRef", "t", "useTranslation", "translationKey", "rootRef", "useRef", "composedRef", "useComposedRefs", "dragHandle", "setDragHandle", "useState", "model", "useBoard", "column", "useBoardColumn", "items", "useMemo", "onItemDelete", "createMenuAction", "label", "icon", "Obj", "getLabel", "description", "getDescription", "React", "Menu", "Root", "Mosaic", "Tile", "ref", "asChild", "id", "Focus", "Item", "Card", "data-testid", "onClick", "event", "currentTarget", "focus", "Toolbar", "DragHandle", "testId", "Title", "Trigger", "disabled", "length", "IconButton", "iconOnly", "variant", "Content", "Row", "Text", "div", "className", "Tag", "palette", "getHashStyles", "hue", "displayName", "BoardItem", "BOARD_COLUMN_CONTEXT_NAME", "BoardColumnProvider", "useBoardColumnContext", "createContext", "useBoardColumn", "value", "column", "BOARD_COLUMN_ROOT_NAME", "BoardColumnRootInner", "composable", "classNames", "children", "location", "data", "debug", "draggable", "dragHandle", "rest", "forwardedRef", "model", "useBoard", "React", "Mosaic", "Tile", "asChild", "id", "getColumnId", "Focus", "Group", "data-testid", "border", "mx", "ref", "displayName", "BoardColumnRoot", "BOARD_COLUMN_HEADER_NAME", "BoardColumnHeader", "label", "dragHandleRef", "props", "t", "useTranslation", "translationKey", "columnMenuItems", "useMemo", "onColumnDelete", "createMenuAction", "icon", "Menu", "Root", "Toolbar", "composableProps", "DragHandle", "testId", "Text", "Trigger", "disabled", "length", "IconButton", "iconOnly", "variant", "Content", "items", "BOARD_COLUMN_BODY_NAME", "BoardColumnBody", "eventHandler", "BoardItem", "viewport", "setViewport", "useState", "useAtomValue", "Container", "withFocus", "orientation", "autoScroll", "ScrollArea", "thin", "centered", "padding", "Viewport", "Stack", "getId", "getItemId", "BOARD_COLUMN_FOOTER_NAME", "BoardColumnFooter", "forwardRef", "onAdd", "handleAdd", "onItemCreate", "undefined", "onClick", "BOARD_DEFAULT_COLUMN_NAME", "DefaultBoardColumn", "DebugInfo", "debugHandler", "useContainerDebug", "setDragHandle", "updateColumn", "useObject", "useEventHandlerAdapter", "target", "dxn", "toString", "get", "refOrObj", "Ref", "isRef", "make", "object", "canDrop", "source", "item", "Obj", "isObject", "isItem", "onChange", "mutator", "col", "getLabel", "div", "className", "BoardColumn", "Header", "Body", "Footer", "BOARD_NAME", "BoardContextProvider", "useBoardContext", "createContext", "useBoard", "displayName", "BOARD_ROOT_NAME", "BoardRootInner", "model", "children", "React", "BoardRoot", "BOARD_CONTENT_NAME", "BoardContentInner", "composable", "id", "_id", "debug", "eventHandler", "Tile", "DefaultBoardColumn", "props", "forwardedRef", "DebugInfo", "debugHandler", "useContainerDebug", "viewport", "setViewport", "useState", "items", "useAtomValue", "columns", "div", "composableProps", "classNames", "ref", "Focus", "Group", "asChild", "orientation", "Mosaic", "Container", "withFocus", "autoScroll", "ScrollArea", "Root", "centered", "padding", "Viewport", "Stack", "getId", "getColumnId", "BoardContent", "BOARD_PLACEHOLDER_NAME", "BoardPlaceholder", "Placeholder", "mosaicStyles", "placeholder", "root", "className", "mx", "content", "BOARD_DEBUG_NAME", "BoardDebug", "forwardRef", "containers", "dragging", "useMosaic", "counter", "useRef", "JsonHighlighter", "data", "count", "current", "Board", "Content", "Column", "BoardColumn", "Item", "BoardItem", "Debug", "React", "forwardRef", "useCallback", "useMemo", "useState", "Card", "ScrollArea", "composable", "composableProps", "SearchStack", "composable", "results", "currentId", "onAction", "props", "forwardedRef", "viewport", "setViewport", "useState", "items", "useMemo", "map", "result", "handleCurrentChange", "useCallback", "id", "type", "resultId", "handleKeyDown", "event", "key", "preventDefault", "document", "activeElement", "click", "React", "Focus", "Group", "asChild", "composableProps", "onKeyDown", "ref", "Mosaic", "Container", "withFocus", "onCurrentChange", "ScrollArea", "Root", "orientation", "padding", "centered", "thin", "Viewport", "VirtualStack", "Tile", "SearchTile", "classNames", "gap", "draggable", "getId", "item", "getScrollElement", "estimateSize", "displayName", "forwardRef", "data", "location", "current", "setCurrentId", "useMosaicContainer", "Item", "Card", "fullWidth", "Toolbar", "IconBlock", "Title", "label", "snippet", "Content", "Row", "Text", "variant"]
7
7
  }