@dxos/react-ui-mosaic 0.9.1-main.c7dcc2e112 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{chunk-DZ5WMCI2.mjs → chunk-OBVIYZLR.mjs} +177 -41
- package/dist/lib/browser/chunk-OBVIYZLR.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +2 -2
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +7 -5
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/{chunk-4IOJ5T6K.mjs → chunk-4IEMCMIV.mjs} +177 -41
- package/dist/lib/node-esm/chunk-4IEMCMIV.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +2 -2
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +7 -5
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/types/src/components/Board/Board.d.ts +1 -1
- package/dist/types/src/components/Board/Board.d.ts.map +1 -1
- package/dist/types/src/components/Board/Board.stories.d.ts +2 -2
- package/dist/types/src/components/Board/Board.stories.d.ts.map +1 -1
- package/dist/types/src/components/Focus/Focus.d.ts +1 -1
- package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
- package/dist/types/src/components/Mosaic/Container.d.ts.map +1 -1
- package/dist/types/src/components/Mosaic/DragHandle.d.ts +28 -0
- package/dist/types/src/components/Mosaic/DragHandle.d.ts.map +1 -0
- package/dist/types/src/components/Mosaic/Mosaic.d.ts +17 -1
- package/dist/types/src/components/Mosaic/Mosaic.d.ts.map +1 -1
- package/dist/types/src/components/Mosaic/Placeholder.d.ts +2 -2
- package/dist/types/src/components/Mosaic/Placeholder.d.ts.map +1 -1
- package/dist/types/src/components/Mosaic/ResizeHandle.d.ts +14 -0
- package/dist/types/src/components/Mosaic/ResizeHandle.d.ts.map +1 -0
- package/dist/types/src/components/Mosaic/ResizeHandle.stories.d.ts +12 -0
- package/dist/types/src/components/Mosaic/ResizeHandle.stories.d.ts.map +1 -0
- package/dist/types/src/components/Mosaic/Root.d.ts +1 -1
- package/dist/types/src/components/Mosaic/Root.d.ts.map +1 -1
- package/dist/types/src/components/Mosaic/Stack.d.ts +1 -1
- package/dist/types/src/components/Mosaic/Stack.d.ts.map +1 -1
- package/dist/types/src/components/Mosaic/Tile.d.ts +34 -0
- package/dist/types/src/components/Mosaic/Tile.d.ts.map +1 -1
- package/dist/types/src/components/Mosaic/styles.d.ts.map +1 -1
- package/dist/types/src/testing/types.d.ts +10 -12
- package/dist/types/src/testing/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +33 -33
- package/src/components/Board/Board.stories.tsx +3 -3
- package/src/components/Board/Board.tsx +1 -1
- package/src/components/Board/Item.tsx +1 -1
- package/src/components/Focus/Focus.tsx +1 -1
- package/src/components/Mosaic/Container.tsx +5 -7
- package/src/components/Mosaic/DragHandle.tsx +75 -0
- package/src/components/Mosaic/Mosaic.tsx +11 -5
- package/src/components/Mosaic/Placeholder.tsx +4 -2
- package/src/components/Mosaic/ResizeHandle.stories.tsx +119 -0
- package/src/components/Mosaic/ResizeHandle.tsx +56 -0
- package/src/components/Mosaic/Root.tsx +3 -1
- package/src/components/Mosaic/Stack.tsx +23 -2
- package/src/components/Mosaic/Tile.tsx +82 -4
- package/src/components/Mosaic/styles.ts +4 -3
- package/src/testing/types.ts +14 -14
- package/dist/lib/browser/chunk-DZ5WMCI2.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-4IOJ5T6K.mjs.map +0 -7
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/hooks/useVisibleItems.ts", "../../../src/components/Focus/Focus.tsx", "../../../src/components/Mosaic/styles.ts", "../../../src/components/Mosaic/types.ts", "../../../src/components/Mosaic/Root.tsx", "../../../src/components/Mosaic/Container.tsx", "../../../src/components/Mosaic/Tile.tsx", "../../../src/components/Mosaic/DragHandle.tsx", "../../../src/components/Mosaic/Placeholder.tsx", "../../../src/components/Mosaic/ResizeHandle.tsx", "../../../src/components/Mosaic/Stack.tsx", "../../../src/components/Mosaic/Mosaic.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { type GetId, type MosaicTileData } from '../components';\n\nexport type UseVisibleItemsProps<TItem = any> = {\n /** Container id. */\n id: string;\n\n /** Current items. */\n items?: readonly TItem[] | TItem[];\n\n /** Currently dragging item. */\n dragging: MosaicTileData<TItem> | undefined;\n\n /** ID getter */\n getId: GetId<TItem>;\n};\n\n/**\n * Returns items with the dragging item removed.\n */\nexport const useVisibleItems = <TItem = any>({\n id,\n items,\n dragging,\n getId,\n}: UseVisibleItemsProps<TItem>): readonly TItem[] | TItem[] => {\n const visibleItems = useMemo(() => {\n if (!items || !dragging || id !== dragging.containerId) {\n return items ?? [];\n }\n\n const idx = items.findIndex((item) => getId(item) === dragging.id);\n if (idx === -1) {\n return items;\n }\n\n const visibleItems = items.slice();\n visibleItems.splice(idx, 1);\n return visibleItems;\n }, [id, items, dragging, getId]);\n\n return visibleItems;\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// Re-export from @dxos/react-ui.\nexport { Focus, type FocusGroupProps, type FocusItemProps, useFocus } from '@dxos/react-ui';\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { type ClassNameValue } from '@dxos/react-ui';\n\nexport const styles = {\n placeholder: {\n root: [\n 'group opacity-0',\n 'group-data-[mosaic-debug=\"true\"]:opacity-100',\n 'group-data-[mosaic-debug=\"true\"]:bg-orange-500',\n 'data-[mosaic-placeholder-state=active]:opacity-100',\n 'data-[mosaic-placeholder-orientation=vertical]:snap-start', // TODO(burdon): Option.\n 'data-[mosaic-placeholder-orientation=vertical]:py-1',\n 'data-[mosaic-placeholder-orientation=vertical]:data-[mosaic-placeholder-state=active]:py-2.5',\n 'data-[mosaic-placeholder-orientation=horizontal]:px-1',\n 'data-[mosaic-placeholder-orientation=horizontal]:data-[mosaic-placeholder-state=active]:px-2.5',\n ],\n content: [\n 'transition-all duration-0',\n // Placeholders open instantly (`duration-0`). The source slot is reserved on drag start by\n // activating its placeholder (see Stack.tsx), so the stack no longer collapses/flickers when the\n // dragged item is removed. NOTE: if the open animation below is ever enabled, exempt the source\n // placeholder — animating its reserved gap from 0 would reintroduce the start-of-drag flicker.\n // 'group-data-[mosaic-placeholder-state=active]:duration-200',\n 'group-data-[mosaic-placeholder-orientation=vertical]:h-0',\n 'group-data-[mosaic-placeholder-orientation=vertical]:group-data-[mosaic-placeholder-state=active]:h-[var(--mosaic-placeholder-height)]',\n 'group-data-[mosaic-placeholder-orientation=horizontal]:w-0',\n 'group-data-[mosaic-placeholder-orientation=horizontal]:group-data-[mosaic-placeholder-state=active]:w-[var(--mosaic-placeholder-width)]',\n ],\n },\n} satisfies Record<string, Record<string, ClassNameValue>>;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ElementDragPayload } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\n\nexport type GetId<TData = any> = (data: TData) => string;\n\n/**\n * NOTE: Must implement value equivalence.\n */\nexport type LocationType = string | number;\n\n/**\n * Get the source data from the drag payload.\n */\nexport const getSourceData = <TData = any, TLocation = any>(\n source: ElementDragPayload,\n): MosaicTileData<TData, TLocation> | null => {\n return source.data.type === 'tile' ? (source.data as MosaicTileData<TData, TLocation>) : null;\n};\n\n/**\n * Draggable item.\n * Tiles may contain arbitrary data (which may not be an ECHO object; e.g., search result).\n */\nexport type MosaicTileData<TData = any, TLocation = any> = {\n type: 'tile';\n containerId: string;\n id: string;\n data: TData;\n location: TLocation;\n bounds?: DOMRect;\n};\n\n/**\n * Drop target placeholder.\n */\nexport type MosaicPlaceholderData<TLocation = any> = {\n type: 'placeholder';\n containerId: string;\n location: TLocation;\n};\n\n/**\n * Drop target container.\n */\nexport type MosaicContainerData = {\n type: 'container';\n id: string;\n};\n\nexport type MosaicData = MosaicTileData | MosaicPlaceholderData | MosaicContainerData;\n\nexport type MosaicTargetData = MosaicTileData | MosaicPlaceholderData;\n\n/**\n * Handler implemented by drop containers.\n */\nexport interface MosaicEventHandler<TData = any, TObject = any> {\n /**\n * Container identifier.\n */\n id: string;\n\n /**\n * Determine if the item can be dropped into this container.\n * NOTE: This is continuously called while dragging (doesn't require mouse movement).\n */\n canDrop?: (props: { source: MosaicTileData<TData> }) => boolean;\n\n /**\n * Called during drag for custom visualization.\n */\n onDrag?: (props: { source: MosaicTileData<TData>; position: { x: number; y: number } }) => void;\n\n /**\n * Insert/rearrange the item at the given location.\n */\n onDrop?: (props: { source: MosaicTileData<TData>; target?: MosaicData }) => void;\n\n /**\n * Request the object to be dropped.\n * This allows the source container to clone/mutate/swap the object before it is dropped.\n * If the callback returns true, then the callback may decide to remove the item from the source container,\n * completing the transfer.\n */\n onTake?: (props: { source: MosaicTileData<TData> }, cb: (object: TObject) => Promise<boolean>) => void;\n\n /**\n * Dragging ended.\n */\n onCancel?: () => void;\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';\nimport { type ElementDragPayload, monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { type DragLocationHistory } from '@atlaskit/pragmatic-drag-and-drop/types';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { createContext } from '@radix-ui/react-context';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Slot } from '@radix-ui/react-slot';\nimport React, { type PropsWithChildren, forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { log } from '@dxos/log';\n\nimport { type MosaicData, type MosaicEventHandler, type MosaicTileData } from './types';\n\n//\n// Context\n//\n\ntype MosaicDraggingSource = {\n data: MosaicTileData;\n handler?: MosaicEventHandler;\n container?: Element;\n};\n\ntype MosaicDraggingTarget = {\n data: MosaicData;\n handler?: MosaicEventHandler;\n};\n\ntype MosaicDraggingState = {\n source: MosaicDraggingSource;\n target?: MosaicDraggingTarget;\n};\n\ntype MosaicRootContextValue = {\n containers: Record<string, MosaicEventHandler>;\n addContainer: (container: MosaicEventHandler) => void;\n removeContainer: (id: string) => void;\n dragging?: MosaicDraggingState;\n};\n\nconst [MosaicRootContextProvider, useMosaicRootContext] = createContext<MosaicRootContextValue>('MosaicRoot');\n\n//\n// Root\n//\n\nconst MOSAIC_ROOT_NAME = 'Mosaic.Root';\n\n// State attribute: [&:has(>_[data-mosaic-debug=true])]\nconst MOSAIC_ROOT_DEBUG_ATTR = 'mosaic-debug';\n\ntype MosaicRootProps = PropsWithChildren<{\n asChild?: boolean;\n debug?: boolean;\n}>;\n\nconst MosaicRoot = forwardRef<HTMLDivElement, MosaicRootProps>(({ children, asChild, debug }, forwardedRef) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = useComposedRefs<HTMLDivElement>(rootRef, forwardedRef);\n const Comp = asChild ? Slot : Primitive.div;\n\n const [handlers, setHandlers] = useState<Record<string, MosaicEventHandler>>({});\n const [dragging, setDragging] = useState<MosaicDraggingState | undefined>();\n\n const getSourceHandler = useCallback(\n (source: ElementDragPayload): { data: MosaicTileData; handler?: MosaicEventHandler } => {\n const data = source.data as MosaicTileData;\n return { data, handler: handlers[data.containerId] };\n },\n [handlers],\n );\n\n const getTargetHandler = useCallback(\n (location: DragLocationHistory): { data?: MosaicData; handler?: MosaicEventHandler } => {\n for (const target of location.current.dropTargets) {\n const data = target.data as MosaicData;\n let containerId: string;\n switch (data.type) {\n case 'tile':\n case 'placeholder':\n containerId = data.containerId;\n break;\n case 'container':\n containerId = data.id;\n break;\n }\n\n const handler = handlers[containerId];\n if (handler) {\n return { data, handler };\n }\n }\n\n return {};\n },\n [handlers],\n );\n\n useEffect(() => {\n const handleChange = ({ source, location }: { source: ElementDragPayload; location: DragLocationHistory }) => {\n const { data: sourceData } = getSourceHandler(source);\n const { data: targetData, handler } = getTargetHandler(location);\n setDragging((dragging) => {\n dragging?.target?.handler?.onCancel?.();\n return {\n source: {\n data: sourceData,\n handler: handlers[sourceData.containerId],\n // TODO(burdon): Check id matches.\n container: location.initial.dropTargets.find((target) => target.data.type === 'container')?.element,\n },\n target: targetData && {\n data: targetData,\n handler,\n },\n };\n });\n };\n\n const handleCancel = () => {\n setDragging((dragging) => {\n requestAnimationFrame(() => {\n dragging?.target?.handler?.onCancel?.();\n dragging?.source?.container?.dispatchEvent(new CustomEvent('dnd:cancel', { bubbles: true }));\n });\n\n return undefined;\n });\n };\n\n let noTargetTimeout: NodeJS.Timeout;\n\n // Main controller.\n return combine(\n monitorForElements({\n // Only monitor Mosaic tile drags; other pragmatic-dnd sources under this root are not ours to handle.\n canMonitor: ({ source }) => source.data.type === 'tile',\n /**\n * Dragging started within any container.\n */\n onDragStart: ({ source, location }) => {\n log('Root.onDragStart', {\n source: source.data,\n location: location.current.dropTargets.map((target) => target.data),\n });\n\n handleChange({ source, location });\n },\n\n /**\n * Dragging entered a new container.\n */\n onDropTargetChange: ({ source, location }) => {\n clearTimeout(noTargetTimeout);\n log('Root.onDropTargetChange', {\n source: source.data,\n location: location.current.dropTargets.map((target) => target.data),\n });\n\n // Stop dragging if there are no drop targets (or we are cancelling).\n if (location.current.dropTargets.length === 0) {\n noTargetTimeout = setTimeout(() => setDragging(undefined), 1_000);\n } else {\n handleChange({ source, location });\n }\n },\n\n /**\n * Dragging within any container.\n */\n onDrag: ({ source, location }) => {\n const { data } = getSourceHandler(source);\n const { handler } = getTargetHandler(location);\n if (handler) {\n const { clientX: x, clientY: y } = location.current.input;\n handler.onDrag?.({ source: data, position: { x, y } });\n }\n },\n\n /**\n * Dragging ended.\n */\n onDrop: ({ source, location }) => {\n log.info('Root.onDrop', {\n source: source.data,\n location: location.current.dropTargets.map((target) => target.data),\n });\n\n // Get the source container.\n const { data: sourceData, handler: sourceHandler } = getSourceHandler(source);\n if (!sourceHandler) {\n log.warn('invalid source', {\n source: sourceData,\n handlers: Object.keys(handlers),\n });\n return;\n }\n\n // NOTE: When dragging is cancelled (e.g., user presses ESC) onDrop is only called after a subsequent event.\n // NOTE: pDND blocks ESC event propagation while dragging.\n // - ESC only flips internal state.\n // - Completion happens on the next processed input event.\n // - This avoids reentrancy and keeps pointer/keyboard behavior consistent.\n // - We set dragging to undefined in onDropTargetChange after a delay if there are no drop targets.\n try {\n if (location.current.dropTargets.length === 0) {\n log.info('cancelled');\n } else {\n // Get the target container.\n const { data: targetData, handler: targetHandler } = getTargetHandler(location);\n if (!targetHandler) {\n log.warn('invalid target', {\n source: sourceData,\n location,\n handlers: Object.keys(handlers),\n });\n return;\n }\n\n // TODO(burdon): Check object doesn't already exist in the collection.\n if (sourceHandler === targetHandler) {\n targetHandler.onDrop?.({\n source: sourceData,\n target: targetData,\n });\n } else {\n if (!sourceHandler.onTake) {\n log.warn('invalid source', { source: sourceData });\n return;\n }\n\n sourceHandler.onTake?.({ source: sourceData }, async (object) => {\n targetHandler.onDrop?.({\n source: { ...sourceData, data: object },\n target: targetData,\n });\n\n return true;\n });\n }\n }\n } finally {\n handleCancel();\n }\n },\n }),\n );\n }, [handlers, getSourceHandler, getTargetHandler]);\n\n return (\n <MosaicRootContextProvider\n containers={handlers}\n addContainer={(container) =>\n setHandlers((containers) => ({\n ...containers,\n [container.id]: container,\n }))\n }\n removeContainer={(id) =>\n setHandlers((containers) => {\n delete containers[id];\n return { ...containers };\n })\n }\n dragging={dragging}\n >\n <Comp\n className='contents group'\n {...{\n [`data-${MOSAIC_ROOT_DEBUG_ATTR}`]: debug,\n }}\n ref={composedRef}\n >\n {children}\n </Comp>\n </MosaicRootContextProvider>\n );\n});\n\nMosaicRoot.displayName = MOSAIC_ROOT_NAME;\n\nexport { MosaicRoot, useMosaicRootContext };\n\nexport type { MosaicDraggingState, MosaicRootProps };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { autoScrollForElements } from '@atlaskit/pragmatic-drag-and-drop-auto-scroll/element';\nimport { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';\nimport { dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { createContext } from '@radix-ui/react-context';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Slot } from '@radix-ui/react-slot';\nimport { bind } from 'bind-event-listener';\nimport React, {\n type CSSProperties,\n type PropsWithChildren,\n type ReactNode,\n type Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { type AllowedAxis, composable, composableProps } from '@dxos/react-ui';\nimport { isTruthy } from '@dxos/util';\n\nimport { useFocus } from '../Focus';\nimport { type MosaicDraggingState, useMosaicRootContext } from './Root';\nimport {\n type LocationType,\n type MosaicContainerData,\n type MosaicEventHandler,\n type MosaicTileData,\n getSourceData,\n} from './types';\n\n//\n// Container\n//\n\nconst MOSAIC_CONTAINER_NAME = 'Mosaic.Container';\n\ntype MosaicContainerState = { type: 'idle' } | { type: 'active'; bounds?: DOMRect };\n\ntype MosaicContainerContextValue<TData = any, Location = LocationType> = {\n id: string;\n eventHandler: MosaicEventHandler<TData>;\n orientation?: AllowedAxis;\n dragging?: MosaicDraggingState;\n scrolling?: boolean;\n state: MosaicContainerState;\n\n /** Active drop location. */\n activeLocation?: Location;\n setActiveLocation: (location: Location | undefined) => void;\n\n /** ID of the current (aria-current) item. */\n currentId?: string;\n /** Set the current item by ID. */\n setCurrentId: (id: string | undefined) => void;\n\n /** IDs of selected (aria-selected) items. */\n selectedIds?: ReadonlySet<string>;\n /** Request to set or unset selection on an item by ID. */\n setSelected: (id: string, selected: boolean) => void;\n\n /** Register a scroll-to-item callback (provided by Stack/VirtualStack). */\n registerScrollTo: (fn: ((id: string) => void) | undefined) => void;\n};\n\nconst [MosaicContainerContextProvider, useMosaicContainerContext] =\n createContext<MosaicContainerContextValue>('MosaicContainer');\n\n// State attribute: [&:has(>_[data-mosaic-container-state=active])]\nconst MOSAIC_CONTAINER_STATE_ATTR = 'mosaic-container-state';\n\n// CSS variables: [var(--mosaic-placeholder-xxx)]\nconst MOSAIC_CONTAINER_PLACEHOLDER_WIDTH = '--mosaic-placeholder-width';\nconst MOSAIC_CONTAINER_PLACEHOLDER_HEIGHT = '--mosaic-placeholder-height';\n\nlet counter = 0;\n\n/** Imperative handle for scrolling a stack to an item without changing the current/selected item. */\nexport type MosaicScrollController = {\n scrollToItem: (id: string) => void;\n};\n\ntype MosaicContainerProps = PropsWithChildren<\n Partial<Pick<MosaicContainerContextValue, 'eventHandler' | 'orientation'>> & {\n asChild?: boolean;\n /** Support autoscrolling container when dragging. */\n autoScroll?: HTMLElement | null;\n withFocus?: boolean;\n /** Imperative handle to scroll the stack to an item (decoupled from selection). */\n controllerRef?: Ref<MosaicScrollController>;\n /** Controlled current-item ID. */\n currentId?: string;\n /** Called when a tile requests to become current. */\n onCurrentChange?: (id: string | undefined) => void;\n /** Controlled set of selected item IDs. */\n selectedIds?: ReadonlySet<string>;\n /** Called when a tile requests to toggle selection. */\n onSelectionChange?: (id: string, selected: boolean) => void;\n debug?: () => ReactNode;\n }\n>;\n\n/**\n * Container for a Mosaic layout.\n */\n// TODO(burdon): Make generic.\nconst MosaicContainer = composable<HTMLDivElement, MosaicContainerProps>(\n (\n {\n children,\n eventHandler: eventHandlerProp,\n orientation = 'vertical',\n asChild,\n autoScroll: autoscrollElement,\n withFocus,\n controllerRef,\n currentId,\n onCurrentChange,\n selectedIds,\n onSelectionChange,\n debug,\n ...props\n },\n forwardedRef,\n ) => {\n const Comp = asChild ? Slot : Primitive.div;\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = useComposedRefs<HTMLDivElement>(rootRef, forwardedRef);\n\n // Handler.\n const eventHandler = useMemo(\n () =>\n eventHandlerProp ?? {\n id: `mosaic-container-${counter++}`,\n },\n [eventHandlerProp],\n );\n\n // State.\n const { dragging } = useMosaicRootContext(MOSAIC_CONTAINER_NAME);\n const [state, setState] = useState<MosaicContainerState>({ type: 'idle' });\n const [activeLocation, setActiveLocation] = useState<LocationType | undefined>();\n const [scrolling, setScrolling] = useState(false);\n const setCurrentId = useCallback((id: string | undefined) => onCurrentChange?.(id), [onCurrentChange]);\n const setSelected = useCallback(\n (id: string, selected: boolean) => onSelectionChange?.(id, selected),\n [onSelectionChange],\n );\n\n // Scroll-to-item: Stack/VirtualStack registers its implementation.\n const scrollToRef = useRef<((id: string) => void) | undefined>(undefined);\n const registerScrollTo = useCallback((fn: ((id: string) => void) | undefined) => {\n scrollToRef.current = fn;\n }, []);\n\n // Imperative scroll-to-item, decoupled from selection (e.g. a calendar scrolling the stack to a day).\n useImperativeHandle(controllerRef, () => ({ scrollToItem: (id: string) => scrollToRef.current?.(id) }), []);\n\n // When currentId changes, scroll the matching item into view.\n useEffect(() => {\n if (currentId) {\n scrollToRef.current?.(currentId);\n }\n }, [currentId]);\n\n // Focus container.\n const { setFocus } = useFocus();\n useEffect(() => {\n if (withFocus) {\n setFocus?.(state.type === 'active' ? 'active' : undefined);\n }\n }, [setFocus, withFocus, state]);\n\n // Register handler.\n const { addContainer, removeContainer } = useMosaicRootContext(eventHandler.id);\n useEffect(() => {\n addContainer(eventHandler);\n return () => removeContainer(eventHandler.id);\n }, [eventHandler]);\n\n const data = useMemo<MosaicContainerData>(\n () =>\n ({\n type: 'container',\n id: eventHandler.id,\n }) satisfies MosaicContainerData,\n [eventHandler.id],\n );\n\n useEffect(() => {\n if (!rootRef.current) {\n return;\n }\n\n // Determine if scrolling (pause drag/drop handlers).\n let timeout: ReturnType<typeof setTimeout>;\n const handleScroll = () => {\n setScrolling(true);\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n setScrolling(false);\n }, 500);\n };\n\n return combine(\n ...[\n /**\n * Custom event for dragging cancellation.\n */\n bind(rootRef.current, {\n type: 'dnd:cancel',\n listener: () => {\n setState({ type: 'idle' });\n },\n }),\n\n // Target.\n dropTargetForElements({\n element: rootRef.current,\n getData: () => data,\n\n /**\n * Test if permitted to drop here.\n * NOTE: Contained Tile and Placeholder elements do the same.\n */\n canDrop: ({ source }) => {\n const data = getSourceData(source);\n return (data && eventHandler.canDrop?.({ source: data })) || false;\n },\n\n // Reorder is a move, not a copy — otherwise the browser shows the green \"+\" copy cursor.\n getDropEffect: () => 'move',\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 // Only autoscroll for tile (reorder) drags. Resize-handle drags carry no tile data, so\n // resizing a tile near a viewport edge must not scroll the container.\n canScroll: ({ source }) => getSourceData(source) != null,\n getAllowedAxis: () => orientation,\n getConfiguration: () => ({\n maxScrollSpeed: 'fast',\n }),\n }),\n\n bind(autoscrollElement, {\n type: 'scroll',\n listener: handleScroll,\n }),\n\n () => setScrolling(false),\n ],\n ]\n .filter(isTruthy)\n .flatMap((x) => x),\n );\n }, [rootRef, eventHandler, data, autoscrollElement]);\n\n return (\n <MosaicContainerContextProvider\n id={eventHandler.id}\n eventHandler={eventHandler}\n orientation={orientation}\n state={state}\n dragging={state.type === 'active' ? dragging : undefined}\n scrolling={scrolling}\n activeLocation={activeLocation}\n setActiveLocation={setActiveLocation}\n currentId={currentId}\n setCurrentId={setCurrentId}\n selectedIds={selectedIds}\n setSelected={setSelected}\n registerScrollTo={registerScrollTo}\n >\n <Comp\n {...composableProps(props, {\n classNames: 'h-full',\n style: {\n [MOSAIC_CONTAINER_PLACEHOLDER_WIDTH]:\n state.type === 'active' && state.bounds ? `${state.bounds.width}px` : '0px',\n [MOSAIC_CONTAINER_PLACEHOLDER_HEIGHT]:\n state.type === 'active' && state.bounds ? `${state.bounds.height}px` : '0px',\n } as CSSProperties,\n })}\n {...{\n [`data-${MOSAIC_CONTAINER_STATE_ATTR}`]: state.type,\n }}\n ref={composedRef}\n >\n {children}\n </Comp>\n {debug?.()}\n </MosaicContainerContextProvider>\n );\n },\n);\n\nMosaicContainer.displayName = MOSAIC_CONTAINER_NAME;\n\nexport { MosaicContainer, useMosaicContainerContext };\n\nexport type { MosaicContainerProps, MosaicContainerState };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport {\n type Edge,\n attachClosestEdge,\n extractClosestEdge,\n} from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';\nimport { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';\nimport {\n type ElementDragPayload,\n draggable,\n dropTargetForElements,\n} from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { preserveOffsetOnSource } from '@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source';\nimport { setCustomNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview';\nimport { type DropTargetRecord } from '@atlaskit/pragmatic-drag-and-drop/types';\nimport { composeRefs } from '@radix-ui/react-compose-refs';\nimport { createContext } from '@radix-ui/react-context';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Slot } from '@radix-ui/react-slot';\nimport React, { type PropsWithChildren, useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { composableProps, slottable } from '@dxos/react-ui';\nimport { type Size, resizeAttributes, sizeStyle } from '@dxos/react-ui-dnd';\n\nimport { useMosaicContainerContext } from './Container';\nimport { type LocationType, type MosaicTileData, getSourceData } from './types';\n\n//\n// Tile\n//\n\nconst MOSAIC_TILE_NAME = 'Mosaic.Tile';\n\ntype MosaicTileState =\n | { type: 'idle' }\n | { type: 'preview'; container: HTMLElement; rect: DOMRect }\n | { type: 'dragging' }\n | { type: 'target'; closestEdge: Edge | null };\n\ntype MosaicTileContextValue = {\n state: MosaicTileState;\n /** Register the element that initiates dragging; set by a child `Mosaic.DragHandle`. */\n setDragHandle: (element: HTMLElement | null) => void;\n /** Current extent (rem) during/after resize; undefined when the tile is not sized. */\n size?: Size;\n /** Update the tile extent. A `commit` (drop) propagates to the consumer's `onSizeChange`. */\n setSize: (size: Size, commit?: boolean) => void;\n /** Resize bounds (rem) declared by the tile; consumed by `Mosaic.ResizeHandle`. */\n minSize?: number;\n maxSize?: number;\n};\n\nconst [MosaicTileContextProvider, useMosaicTileContext] = createContext<MosaicTileContextValue>('MosaicTile');\n\n// State attribute: data-[mosaic-tile-state=dragging]\nconst MOSAIC_TILE_STATE_ATTR = 'mosaic-tile-state';\n\ntype MosaicTileProps<TData = any, TLocation = LocationType> = ThemedClassName<\n PropsWithChildren<{\n className?: string;\n dragHandle?: HTMLElement | null;\n allowedEdges?: Edge[];\n id: string;\n data: TData;\n location: TLocation;\n draggable?: boolean;\n /** Whether this tile is the current (aria-current) item. */\n current?: boolean;\n /** Whether this tile is selected (aria-selected). */\n selected?: boolean;\n /**\n * Initial extent in rem (width when the container is horizontal, height when vertical).\n * Pair with a child `Mosaic.ResizeHandle` to make the tile user-resizable; the consumer\n * persists committed sizes via {@link MosaicTileProps.onSizeChange}.\n */\n size?: Size;\n /** Called when the user commits a resize (on drop). */\n onSizeChange?: (size: Size) => void;\n /** Lower bound for the resizable extent in rem; enforced during drag and as a CSS min constraint. */\n minSize?: number;\n /** Upper bound for the resizable extent in rem; enforced during drag and as a CSS max constraint. */\n maxSize?: number;\n debug?: boolean;\n }>\n>;\n\nconst MosaicTile = slottable<HTMLDivElement, MosaicTileProps>(\n (\n {\n children,\n asChild,\n dragHandle: dragHandleProp,\n allowedEdges: allowedEdgesProp,\n location,\n id,\n data: dataProp,\n draggable: draggableProp,\n current,\n selected,\n size: sizeProp,\n onSizeChange,\n minSize,\n maxSize,\n debug: _,\n ...props\n },\n forwardedRef,\n ) => {\n const Comp = asChild ? Slot : Primitive.div;\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = composeRefs<HTMLDivElement>(rootRef, forwardedRef);\n\n // State.\n const {\n id: containerId,\n eventHandler,\n orientation,\n scrolling,\n setActiveLocation,\n } = useMosaicContainerContext(MOSAIC_TILE_NAME);\n const [state, setState] = useState<MosaicTileState>({ type: 'idle' });\n\n // A child `Mosaic.DragHandle` registers its element here; an explicit `dragHandle` prop wins.\n const [registeredDragHandle, setRegisteredDragHandle] = useState<HTMLElement | null>(null);\n const dragHandle = dragHandleProp ?? registeredDragHandle;\n\n // Live extent during a resize drag. Seeded from the prop; the consumer persists committed\n // sizes via `onSizeChange` and feeds the result back as `size` on the next render.\n const [size, setInternalSize] = useState<Size | undefined>(sizeProp);\n const setSize = useCallback(\n (nextSize: Size, commit?: boolean) => {\n setInternalSize(nextSize);\n if (commit) {\n onSizeChange?.(nextSize);\n }\n },\n [onSizeChange],\n );\n\n const allowedEdges = useMemo<Edge[]>(\n () => allowedEdgesProp || (orientation === 'vertical' ? ['top', 'bottom'] : ['left', 'right']),\n [allowedEdgesProp, orientation],\n );\n\n const data = useMemo<MosaicTileData>(\n () =>\n ({\n type: 'tile',\n id,\n containerId,\n data: dataProp,\n location,\n }) satisfies MosaicTileData,\n [containerId, location, dataProp],\n );\n\n useLayoutEffect(() => {\n const root = rootRef.current;\n if (!draggableProp || !root || !containerId || scrolling) {\n return;\n }\n\n const handleChange = ({ self, source }: { self: DropTargetRecord; source: ElementDragPayload }) => {\n if (source.data.id !== dataProp.id) {\n const closestEdge = extractClosestEdge(self.data);\n const location = data.location + (closestEdge === 'top' || closestEdge === 'left' ? -0.5 : 0.5);\n setActiveLocation(location);\n setState({ type: 'target', closestEdge });\n }\n };\n\n // Mark the drag as a move at the native level. pragmatic-drag-and-drop only sets `dropEffect` (on\n // dragover via `getDropEffect`), never `effectAllowed`, so the first dragstart frame shows the\n // browser's default green \"+\" copy cursor until the first drop target is entered.\n const handleNativeDragStart = (event: DragEvent) => {\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n }\n };\n root.addEventListener('dragstart', handleNativeDragStart);\n\n return combine(\n () => root.removeEventListener('dragstart', handleNativeDragStart),\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 // Reorder is a move, not a copy — otherwise the browser shows the green \"+\" copy cursor.\n getDropEffect: () => 'move',\n onDragEnter: ({ self, source }) => {\n handleChange({ self, source });\n },\n onDragLeave: () => {\n setState({ type: 'idle' });\n setActiveLocation(undefined);\n },\n onDrag: ({ self, source }) => {\n handleChange({ self, source });\n },\n onDrop: () => {\n setState({ type: 'idle' });\n setActiveLocation(undefined);\n },\n }),\n );\n }, [\n rootRef,\n forwardedRef,\n containerId,\n dragHandle,\n eventHandler,\n data,\n scrolling,\n allowedEdges,\n setActiveLocation,\n ]);\n\n const { className, ...rest } = composableProps(props, { classNames: 'relative outline-none' });\n\n // Apply the resize subject marker + explicit extent/bounds only when sized or bounded, so plain\n // tiles keep their intrinsic layout. The axis follows the container orientation (width vs height).\n const vertical = orientation === 'vertical';\n const sized = size != null;\n const bounded = sized || minSize != null || maxSize != null;\n const sizeStyles = {\n ...(sized && sizeStyle(size, vertical ? 'vertical' : 'horizontal')),\n ...(minSize != null && { [vertical ? 'minBlockSize' : 'minInlineSize']: `${minSize}rem` }),\n ...(maxSize != null && { [vertical ? 'maxBlockSize' : 'maxInlineSize']: `${maxSize}rem` }),\n };\n\n // NOTE: Ensure no gaps between cells (prevent drop indicators flickering).\n // NOTE: Ensure padding doesn't change position of cursor when dragging (no margins).\n return (\n <MosaicTileContextProvider\n state={state}\n setDragHandle={setRegisteredDragHandle}\n size={size}\n setSize={setSize}\n minSize={minSize}\n maxSize={maxSize}\n >\n <Comp\n {...rest}\n {...(bounded && resizeAttributes)}\n {...(bounded && { style: { ...rest.style, ...sizeStyles } })}\n {...{\n 'data-object-id': id,\n [`data-${MOSAIC_TILE_STATE_ATTR}`]: state.type,\n }}\n role='listitem'\n // Pair `current` / `selected` props with `aria-current` / `aria-selected`\n // so the `dx-current` / `dx-selected` / `dx-hover` utilities (which key\n // off those attributes) actually fire. Without this the props are purely\n // advisory and the corresponding styling silently no-ops.\n aria-current={current ? 'true' : undefined}\n aria-selected={selected ? 'true' : undefined}\n className={className}\n ref={composedRef}\n >\n {children}\n </Comp>\n\n {/* Dragging preview. Cloned at the source size; the live tile is removed from the list while\n dragging, so this clone is what the user sees following the cursor. NOTE: external SVG sprite\n `<use>` icons do not rasterize here — use inline SVG (see Mosaic.DragHandle) for drag affordances. */}\n {state.type === 'preview' &&\n createPortal(\n <Comp\n {...{\n // NOTE: Use to control appearance while dragging.\n [`data-${MOSAIC_TILE_STATE_ATTR}`]: state.type,\n }}\n className={className}\n style={{\n width: `${state.rect.width}px`,\n height: `${state.rect.height}px`,\n }}\n >\n {children}\n </Comp>,\n state.container,\n )}\n </MosaicTileContextProvider>\n );\n },\n);\n\nMosaicTile.displayName = MOSAIC_TILE_NAME;\n\nexport { MosaicTile, useMosaicTileContext };\n\nexport type { MosaicTileProps, MosaicTileState };\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { composeRefs } from '@radix-ui/react-compose-refs';\nimport React, { type ReactNode, forwardRef } from 'react';\n\nimport { Button, IconButton, type IconButtonProps, type ThemedClassName, useTranslation } from '@dxos/react-ui';\n\nimport { useMosaicTileContext } from './Tile';\n\nconst MOSAIC_DRAG_HANDLE_NAME = 'Mosaic.DragHandle';\n\nconst REACT_UI_TRANSLATION_KEY = '@dxos/react-ui';\n\nexport type MosaicDragHandleProps = ThemedClassName<\n Partial<Pick<IconButtonProps, 'icon' | 'label' | 'variant'>> & {\n testId?: string;\n /**\n * Inline glyph rendered in place of the sprite icon. The browser does not rasterize external SVG\n * sprite `<use>` icons into a native drag image, so a tile that appears in its own drag preview\n * (the clone follows the cursor) must use an inline-SVG handle here to stay visible while dragging.\n */\n children?: ReactNode;\n }\n>;\n\n/**\n * Affordance that initiates dragging the enclosing {@link MosaicTile}. Renders a button and\n * registers itself with the tile (via context), so consumers only need to drop it inside a\n * `Mosaic.Tile` — no `dragHandle` ref plumbing required.\n */\nexport const MosaicDragHandle = forwardRef<HTMLButtonElement, MosaicDragHandleProps>(\n (\n { icon = 'ph--dots-six-vertical--regular', label, variant = 'ghost', classNames, testId, children },\n forwardedRef,\n ) => {\n const { t } = useTranslation(REACT_UI_TRANSLATION_KEY);\n const { setDragHandle } = useMosaicTileContext(MOSAIC_DRAG_HANDLE_NAME);\n const ref = composeRefs(forwardedRef, setDragHandle);\n const testIdProps = testId ? { 'data-testid': testId } : {};\n\n // Inline-glyph variant: stays visible in the tile's own native drag image (sprite icons do not).\n if (children) {\n return (\n <Button\n ref={ref}\n variant={variant}\n tabIndex={-1}\n classNames={['grid place-items-center cursor-grab', classNames]}\n {...testIdProps}\n >\n {children}\n <span className='sr-only'>{label ?? t('toolbar-drag-handle.label')}</span>\n </Button>\n );\n }\n\n return (\n <IconButton\n ref={ref}\n iconOnly\n noTooltip\n tabIndex={-1}\n variant={variant}\n icon={icon}\n label={label ?? t('toolbar-drag-handle.label')}\n classNames={['cursor-grab', classNames]}\n {...testIdProps}\n />\n );\n },\n);\n\nMosaicDragHandle.displayName = MOSAIC_DRAG_HANDLE_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport {\n DropIndicator as NaturalDropIndicator,\n type DropIndicatorProps as NaturalDropIndicatorProps,\n} from '@atlaskit/pragmatic-drag-and-drop-react-drop-indicator/box';\nimport { dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Slot } from '@radix-ui/react-slot';\nimport React, { type PropsWithChildren, useLayoutEffect, useMemo, useRef } from 'react';\n\nimport { type Axis, type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport { useMosaicContainerContext } from './Container';\nimport { useMosaicTileContext } from './Tile';\nimport { type LocationType, type MosaicPlaceholderData, getSourceData } from './types';\n\n//\n// Placeholder\n//\n\nconst MOSAIC_PLACEHOLDER_NAME = 'Mosaic.Placeholder';\n\n// Orientation: data-[mosaic-placeholder-orientation=vertical]\nconst MOSAIC_PLACEHOLDER_ORIENTATION_ATTR = 'mosaic-placeholder-orientation';\n\n// State attribute: data-[mosaic-placeholder-state=active]\nconst MOSAIC_PLACEHOLDER_STATE_ATTR = 'mosaic-placeholder-state';\n\n// Location attribute: data-[mosaic-placeholder-location=0.5]. Identifies the\n// placeholder's slot in its container (0.5, 1.5, 2.5, …) so tests can target\n// a specific gap unambiguously without relying on layout-dependent indices.\nconst MOSAIC_PLACEHOLDER_LOCATION_ATTR = 'mosaic-placeholder-location';\n\ntype MosaicPlaceholderProps<Location = LocationType> = ThemedClassName<\n PropsWithChildren<{\n asChild?: boolean;\n orientation?: Axis;\n location: Location;\n }>\n>;\n\nconst MosaicPlaceholder = <Location extends LocationType = LocationType>({\n classNames,\n children,\n asChild,\n orientation = 'vertical',\n location,\n}: MosaicPlaceholderProps<Location>) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const Comp = asChild ? Slot : Primitive.div;\n const {\n id: containerId,\n eventHandler,\n scrolling,\n activeLocation,\n setActiveLocation,\n } = useMosaicContainerContext(MOSAIC_PLACEHOLDER_NAME);\n const data = useMemo<MosaicPlaceholderData<Location>>(\n () =>\n ({\n type: 'placeholder',\n containerId,\n location,\n }) satisfies MosaicPlaceholderData<Location>,\n [containerId, location],\n );\n\n useLayoutEffect(() => {\n const root = rootRef.current;\n if (!root || scrolling) {\n return;\n }\n\n return dropTargetForElements({\n element: root,\n getData: () => data,\n canDrop: ({ source }) => {\n const data = getSourceData(source);\n return (data && eventHandler.canDrop?.({ source: data })) || false;\n },\n // Reorder is a move, not a copy — otherwise the browser shows the green \"+\" copy cursor.\n getDropEffect: () => 'move',\n onDragEnter: () => {\n setActiveLocation(data.location);\n },\n onDragLeave: () => {\n setActiveLocation(undefined);\n },\n onDrop: () => {\n setActiveLocation(undefined);\n },\n });\n }, [rootRef, data, scrolling, setActiveLocation]);\n\n return (\n <Comp\n {...{\n [`data-${MOSAIC_PLACEHOLDER_ORIENTATION_ATTR}`]: orientation,\n [`data-${MOSAIC_PLACEHOLDER_STATE_ATTR}`]: data.location === activeLocation ? 'active' : 'idle',\n [`data-${MOSAIC_PLACEHOLDER_LOCATION_ATTR}`]: String(location),\n }}\n role='none'\n className={mx('relative', classNames)}\n ref={rootRef}\n >\n {children}\n </Comp>\n );\n};\n\nMosaicPlaceholder.displayName = MOSAIC_PLACEHOLDER_NAME;\n\n//\n// DropIndicator\n// TODO(burdon): Support DropIndicator or Placeholder variants.\n//\n\nconst DROP_INDICATOR_NAME = 'Mosaic.DropIndicator';\n\ntype MosaicDropIndicatorProps = Omit<NaturalDropIndicatorProps, 'edge'>;\n\nconst MosaicDropIndicator = (props: MosaicDropIndicatorProps) => {\n const { state } = useMosaicTileContext(DROP_INDICATOR_NAME);\n return state.type === 'target' && state.closestEdge ? (\n <NaturalDropIndicator {...props} edge={state.closestEdge} />\n ) : null;\n};\n\nMosaicDropIndicator.displayName = DROP_INDICATOR_NAME;\n\n//\n// Exports\n//\n\nexport { MosaicDropIndicator, MosaicPlaceholder };\n\nexport type { MosaicDropIndicatorProps, MosaicPlaceholderProps };\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React from 'react';\n\nimport { ResizeHandle } from '@dxos/react-ui-dnd';\n\nimport { useMosaicContainerContext } from './Container';\nimport { useMosaicTileContext } from './Tile';\n\nconst MOSAIC_RESIZE_HANDLE_NAME = 'Mosaic.ResizeHandle';\n\n// Lower bounds for a tile's extent (rem); below these the content stops being usable.\nconst MIN_WIDTH = 20;\nconst MIN_HEIGHT = 3;\n// Extent assumed when the subject hasn't been measured yet (matches the deck plank default).\nconst DEFAULT_EXTRINSIC_SIZE = 50;\n\nexport type MosaicResizeHandleProps = {\n /** Lower bound in rem; overrides the tile's `minSize`, else a sensible per-axis minimum. */\n minSize?: number;\n /** Upper bound in rem; overrides the tile's `maxSize`. */\n maxSize?: number;\n /** Extent assumed before the subject is first measured. */\n fallbackSize?: number;\n};\n\n/**\n * Edge affordance that resizes the enclosing {@link MosaicTile}. The axis tracks the container\n * orientation (width when horizontal, height when vertical); the tile must be given a `size` so the\n * dragged extent is reflected and persisted via its `onSizeChange`. Resize bounds default to the\n * tile's `minSize`/`maxSize` and can be overridden per handle.\n */\nexport const MosaicResizeHandle = ({\n minSize,\n maxSize,\n fallbackSize = DEFAULT_EXTRINSIC_SIZE,\n}: MosaicResizeHandleProps) => {\n const { orientation = 'vertical' } = useMosaicContainerContext(MOSAIC_RESIZE_HANDLE_NAME);\n const { size, setSize, minSize: tileMinSize, maxSize: tileMaxSize } = useMosaicTileContext(MOSAIC_RESIZE_HANDLE_NAME);\n const horizontal = orientation === 'horizontal';\n\n return (\n <ResizeHandle\n side={horizontal ? 'inline-end' : 'block-end'}\n fallbackSize={fallbackSize}\n minSize={minSize ?? tileMinSize ?? (horizontal ? MIN_WIDTH : MIN_HEIGHT)}\n maxSize={maxSize ?? tileMaxSize}\n size={size}\n onSizeChange={setSize}\n />\n );\n};\n\nMosaicResizeHandle.displayName = MOSAIC_RESIZE_HANDLE_NAME;\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { type ReactVirtualizerOptions, useVirtualizer } from '@tanstack/react-virtual';\nimport React, {\n type FC,\n Fragment,\n type ReactElement,\n type Ref,\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from 'react';\n\nimport { invariant } from '@dxos/invariant';\nimport { type Axis, type ThemedClassName, composable, composableProps } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport { useVisibleItems } from '../../hooks';\nimport { useMosaicContainerContext } from './Container';\nimport { MosaicPlaceholder, type MosaicPlaceholderProps } from './Placeholder';\nimport { styles } from './styles';\nimport { type MosaicTileProps } from './Tile';\nimport { type GetId } from './types';\n\n//\n// Mosaic Drag-and-drop\n//\n// Drop targets:\n// - Placeholders exist to allow gaps but prevent deadspace when dragging within a container.\n// - When dragging over a Tile, the placeholder next to the closest edge is activated.\n// - Placeholders expand when active; event handlers are disabled while the container is scrolling.\n//\n// [Container]\n// - [Placeholder 0.5]\n// - [Tile 1 ]\n// - [Placeholder 1.5]\n// - [Tile 2 ]\n// - [Placeholder 2.5]\n// - [Tile 3 ]\n// - [Placeholder 3.5]\n//\n// Implementation Notes\n// - We use [Radix composition](https://www.radix-ui.com/primitives/docs/guides/composition) to factor out composible aspects (e.g., Focus, Mosaic, etc.)\n// - NOTE: Use Slottable only if needed to disambiguate; otherwise a suspected Radix bug causes compositional problems.\n\nconst MOSAIC_STACK_NAME = 'MosaicStack';\n\ntype MosaicStackTileComponent<TData = any> = FC<MosaicTileProps<TData>>;\n\ntype MosaicStackProps<TData = any> = ThemedClassName<\n {\n role?: string;\n orientation?: Axis;\n getId: GetId<TData>;\n items?: readonly TData[];\n scrollIntoView?: boolean;\n Tile: MosaicStackTileComponent<TData>;\n } & Pick<MosaicTileProps<TData>, 'draggable' | 'debug'>\n>;\n\n/**\n * Linear layout of Mosaic tiles.\n * NOTE: This is a low-level component and should be wrapped by a scrollable container.\n */\nconst MosaicStackInner = composable<HTMLDivElement, MosaicStackProps>(\n (\n {\n orientation: orientationProp = 'vertical',\n getId,\n items,\n scrollIntoView = true,\n Tile,\n draggable = true,\n debug,\n ...props\n },\n forwardedRef,\n ) => {\n const {\n id,\n orientation = orientationProp,\n dragging,\n currentId,\n selectedIds,\n registerScrollTo,\n setActiveLocation,\n } = useMosaicContainerContext(MOSAIC_STACK_NAME);\n const visibleItems = useVisibleItems({ id, items, dragging: dragging?.source.data, getId });\n invariant(orientation === 'vertical' || orientation === 'horizontal', `Invalid orientation: ${orientation}`);\n\n // Reserve the dragged item's slot the instant it leaves `visibleItems`. The source is removed a frame\n // before any placeholder becomes active (the pointer still sits over the source, so no `onDragEnter`\n // has fired), which collapses the stack by the item's height and flickers the following tiles upward.\n // Activating the source-slot placeholder (location `index + 0.5`) in a layout effect fills the gap in\n // the same commit, before paint.\n const draggingSource = dragging?.source.data;\n const sourceIndex = useMemo(() => {\n if (!items || !draggingSource || draggingSource.containerId !== id) {\n return -1;\n }\n return items.findIndex((item) => getId(item) === draggingSource.id);\n }, [items, draggingSource, id, getId]);\n useLayoutEffect(() => {\n if (sourceIndex >= 0) {\n setActiveLocation(sourceIndex + 0.5);\n }\n }, [sourceIndex, setActiveLocation]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const scrollToId = useCallback(\n (targetId: string) => {\n if (!scrollIntoView) {\n return;\n }\n\n const el = rootRef.current?.querySelector<HTMLElement>(`[data-object-id=\"${CSS.escape(targetId)}\"]`);\n el?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n },\n [scrollIntoView],\n );\n\n useEffect(() => {\n registerScrollTo(scrollToId);\n return () => registerScrollTo(undefined);\n }, [registerScrollTo, scrollToId]);\n\n const composedRef = useComposedRefs(rootRef, forwardedRef);\n return (\n <div\n {...composableProps(props, {\n role: 'list',\n classNames: [\n 'flex',\n orientation === 'horizontal' && 'h-full [&>*]:shrink-0',\n orientation === 'vertical' && 'flex-col',\n ],\n })}\n ref={composedRef}\n >\n {draggable && <InternalPlaceholder orientation={orientation} location={0.5} />}\n {visibleItems?.map((item, index) => (\n <Fragment key={getId(item)}>\n <Tile\n id={getId(item)}\n data={item}\n location={index + 1}\n draggable={draggable}\n current={getId(item) === currentId}\n selected={selectedIds?.has(getId(item))}\n debug={debug}\n />\n {draggable && <InternalPlaceholder orientation={orientation} location={index + 1.5} />}\n </Fragment>\n ))}\n </div>\n );\n },\n);\n\nMosaicStackInner.displayName = MOSAIC_STACK_NAME;\n\nconst MosaicStack = MosaicStackInner as <TData = any>(\n props: MosaicStackProps<TData> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement;\n\n//\n// VirtualStack\n//\n\nconst MOSAIC_VIRTUAL_STACK_NAME = 'MosaicVirtualStack';\n\ntype MosaicVirtualStackProps<TData = any> = MosaicStackProps<TData> &\n Pick<\n ReactVirtualizerOptions<HTMLElement, HTMLDivElement>,\n 'estimateSize' | 'gap' | 'getScrollElement' | 'overscan' | 'onChange'\n >;\n\nconst MosaicVirtualStackInner = forwardRef<HTMLDivElement, MosaicVirtualStackProps>(\n (\n {\n orientation = 'vertical',\n getId,\n items,\n scrollIntoView = true,\n Tile,\n estimateSize,\n getScrollElement,\n overscan = 8,\n gap,\n onChange,\n draggable = true,\n debug,\n ...props\n },\n forwardedRef,\n ) => {\n invariant(Tile);\n const { id, dragging, currentId, selectedIds, registerScrollTo } =\n useMosaicContainerContext(MOSAIC_VIRTUAL_STACK_NAME);\n const visibleItems = useVisibleItems({ id, items, dragging: dragging?.source.data, getId });\n // In draggable mode virtual indices alternate: even=placeholder, odd=tile.\n // Wrap estimateSize so placeholders get 0 (their actual negligible height) and\n // tile slots receive the caller's estimate at the correct tile index.\n // This keeps getTotalSize() stable as items are measured → no scrollbar drift.\n const wrappedEstimateSize = draggable\n ? (index: number) => (index % 2 === 0 ? 0 : estimateSize(Math.floor(index / 2)))\n : estimateSize;\n\n const virtualizer = useVirtualizer({\n // NOTE: When draggable we double the number of items to allow for placeholders.\n count: draggable ? visibleItems.length * 2 + 1 : visibleItems.length,\n estimateSize: wrappedEstimateSize,\n gap,\n // Inset the stack from both ends by `gap` (matching the inter-item spacing). The virtualizer\n // folds this into item offsets, getTotalSize(), and scrollToIndex, so no manual compensation.\n paddingStart: gap,\n paddingEnd: gap,\n // Key measurements by stable item ID so the size cache survives scrolling;\n // without this, measurements are indexed by position and are lost when items reorder.\n getItemKey: draggable\n ? (index) => (index % 2 === 0 ? `ph-${index}` : getId(visibleItems![Math.floor(index / 2)]))\n : (index) => getId(visibleItems![index]),\n getScrollElement,\n overscan,\n onChange,\n });\n\n // Register scroll-to-item via virtualizer index lookup.\n const scrollToId = useCallback(\n (targetId: string) => {\n const itemIndex = visibleItems.findIndex((item) => getId(item) === targetId);\n if (itemIndex >= 0) {\n if (!scrollIntoView) {\n return;\n }\n\n const virtualIndex = draggable ? itemIndex * 2 + 1 : itemIndex;\n // Align to the item's start, but offset by the inter-item `gap` so the tile lands\n // one gap below the viewport edge rather than flush against it (a plain\n // `scrollToIndex({ align: 'start' })` scrolls the preceding gap out of view).\n const [offset] = virtualizer.getOffsetForIndex(virtualIndex, 'start') ?? [];\n if (offset != null) {\n virtualizer.scrollToOffset(Math.max(0, offset - (gap ?? 0)), { behavior: 'smooth' });\n }\n }\n },\n [visibleItems, getId, draggable, virtualizer, scrollIntoView, gap],\n );\n\n useEffect(() => {\n registerScrollTo(scrollToId);\n return () => registerScrollTo(undefined);\n }, [registerScrollTo, scrollToId]);\n\n const virtualItems = virtualizer.getVirtualItems();\n const getData = (index: number): { data?: any; location: number } => {\n if (draggable) {\n if (index % 2 === 0) {\n return { location: Math.floor(index / 2) + 0.5 };\n } else {\n return { data: visibleItems![Math.floor(index / 2)], location: Math.floor(index / 2) + 1 };\n }\n } else {\n return { data: visibleItems![index], location: index + 1 };\n }\n };\n\n return (\n <div\n {...composableProps(props, {\n role: 'list',\n classNames: [\n // shrink-0 is required: this div sets an explicit height via inline style (getTotalSize).\n // Without it, a parent flex container (e.g. ScrollArea.Viewport) would shrink this div\n // to the viewport height, collapsing the scroll content and causing scrollbar drift.\n 'flex shrink-0',\n orientation === 'horizontal' && 'h-full [&>*]:shrink-0',\n orientation === 'vertical' && 'flex-col',\n ],\n })}\n style={{\n position: 'relative',\n ...(orientation === 'vertical'\n ? {\n width: '100%',\n height: virtualizer.getTotalSize(),\n }\n : {\n width: virtualizer.getTotalSize(),\n height: '100%',\n }),\n }}\n ref={forwardedRef}\n >\n {virtualItems.map(({ key, index, start }) => {\n const { data, location } = getData(index);\n return (\n <div\n key={key}\n data-index={index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n ...(orientation === 'vertical'\n ? {\n width: '100%',\n transform: `translateY(${start}px)`,\n }\n : {\n height: '100%',\n transform: `translateX(${start}px)`,\n }),\n }}\n ref={virtualizer.measureElement}\n >\n {data ? (\n <Tile\n id={getId(data)}\n data={data}\n location={location}\n draggable={draggable}\n current={getId(data) === currentId}\n selected={selectedIds?.has(getId(data))}\n debug={debug}\n />\n ) : (\n <InternalPlaceholder orientation={orientation} location={location} />\n )}\n </div>\n );\n })}\n </div>\n );\n },\n);\n\nMosaicVirtualStackInner.displayName = MOSAIC_VIRTUAL_STACK_NAME;\n\nconst MosaicVirtualStack = MosaicVirtualStackInner as <TData = any>(\n props: MosaicVirtualStackProps<TData> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement;\n\n(MosaicVirtualStack as any)[Symbol.for('dxos.composable')] = true;\n\n//\n// InternalPlaceholder\n//\n\nconst InternalPlaceholder = (props: MosaicPlaceholderProps<number>) => {\n return (\n <MosaicPlaceholder {...props} classNames={styles.placeholder.root}>\n <div\n className={mx(\n 'flex h-full bg-base-surface border border-dashed border-separator rounded-xs',\n styles.placeholder.content,\n )}\n />\n </MosaicPlaceholder>\n );\n};\n\nInternalPlaceholder.displayName = 'InternalPlaceholder';\n\n//\n// Exports\n//\n\nexport { MosaicStack, MosaicVirtualStack };\n\nexport type { MosaicStackProps, MosaicStackTileComponent, MosaicVirtualStackProps };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport {\n MosaicContainer,\n type MosaicContainerProps,\n type MosaicContainerState,\n type MosaicScrollController,\n useMosaicContainerContext,\n} from './Container';\nimport { MosaicDragHandle, type MosaicDragHandleProps } from './DragHandle';\nimport {\n MosaicDropIndicator,\n type MosaicDropIndicatorProps,\n MosaicPlaceholder,\n type MosaicPlaceholderProps,\n} from './Placeholder';\nimport { MosaicResizeHandle, type MosaicResizeHandleProps } from './ResizeHandle';\nimport { MosaicRoot, type MosaicRootProps, useMosaicRootContext } from './Root';\nimport { MosaicStack, type MosaicStackProps, type MosaicStackTileComponent, MosaicVirtualStack } from './Stack';\nimport { MosaicTile, type MosaicTileProps, type MosaicTileState, useMosaicTileContext } from './Tile';\n\n//\n// Mosaic\n//\n\nexport const Mosaic = {\n Root: MosaicRoot,\n Container: MosaicContainer,\n Tile: MosaicTile,\n DragHandle: MosaicDragHandle,\n ResizeHandle: MosaicResizeHandle,\n Placeholder: MosaicPlaceholder,\n DropIndicator: MosaicDropIndicator,\n Stack: MosaicStack,\n VirtualStack: MosaicVirtualStack,\n};\n\nexport type {\n MosaicContainerProps,\n MosaicContainerState,\n MosaicDragHandleProps,\n MosaicDropIndicatorProps,\n MosaicPlaceholderProps,\n MosaicResizeHandleProps,\n MosaicRootProps,\n MosaicScrollController,\n MosaicStackProps,\n MosaicStackTileComponent,\n MosaicTileProps,\n MosaicTileState,\n};\n\nexport {\n useMosaicRootContext as useMosaic,\n useMosaicContainerContext as useMosaicContainer,\n useMosaicTileContext as useMosaicTile,\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useMemo", "useVisibleItems", "id", "items", "dragging", "getId", "visibleItems", "containerId", "idx", "findIndex", "item", "slice", "splice", "Focus", "useFocus", "styles", "placeholder", "root", "content", "getSourceData", "source", "data", "type", "combine", "monitorForElements", "useComposedRefs", "createContext", "Primitive", "Slot", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "log", "MosaicRootContextProvider", "MOSAIC_ROOT_DEBUG_ATTR", "rootRef", "forwardedRef", "Comp", "asChild", "setHandlers", "dragging", "setDragging", "getSourceHandler", "source", "data", "handler", "handlers", "target", "containerId", "type", "targetData", "getTargetHandler", "onCancel", "container", "location", "dropTargets", "find", "requestAnimationFrame", "bubbles", "noTargetTimeout", "canMonitor", "current", "handleChange", "clientX", "onDrag", "position", "x", "y", "sourceData", "sourceHandler", "warn", "object", "targetHandler", "handleCancel", "removeContainer", "containers", "className", "debug", "ref", "composedRef", "children", "MosaicRoot", "displayName", "autoScrollForElements", "combine", "dropTargetForElements", "useComposedRefs", "createContext", "Primitive", "Slot", "bind", "React", "useCallback", "useEffect", "useImperativeHandle", "useMemo", "useRef", "useState", "composable", "composableProps", "isTruthy", "MOSAIC_CONTAINER_NAME", "MosaicContainerContextProvider", "useMosaicContainerContext", "createContext", "MOSAIC_CONTAINER_STATE_ATTR", "MOSAIC_CONTAINER_PLACEHOLDER_WIDTH", "MOSAIC_CONTAINER_PLACEHOLDER_HEIGHT", "counter", "MosaicContainer", "composable", "children", "eventHandler", "eventHandlerProp", "orientation", "asChild", "autoScroll", "autoscrollElement", "withFocus", "controllerRef", "currentId", "onCurrentChange", "selectedIds", "onSelectionChange", "debug", "props", "forwardedRef", "Comp", "Slot", "Primitive", "div", "rootRef", "useRef", "composedRef", "useComposedRefs", "useMemo", "id", "dragging", "useMosaicRootContext", "state", "setState", "useState", "type", "activeLocation", "setActiveLocation", "scrolling", "setScrolling", "setCurrentId", "useCallback", "setSelected", "selected", "scrollToRef", "undefined", "registerScrollTo", "fn", "current", "useImperativeHandle", "scrollToItem", "useEffect", "setFocus", "useFocus", "addContainer", "removeContainer", "data", "timeout", "handleScroll", "clearTimeout", "setTimeout", "combine", "bind", "listener", "dropTargetForElements", "element", "getData", "canDrop", "source", "getSourceData", "getDropEffect", "onDragStart", "sourceData", "bounds", "onDragEnter", "onDragLeave", "containerId", "onDrop", "autoScrollForElements", "canScroll", "getAllowedAxis", "getConfiguration", "maxScrollSpeed", "filter", "isTruthy", "flatMap", "x", "React", "composableProps", "classNames", "style", "width", "height", "ref", "displayName", "attachClosestEdge", "extractClosestEdge", "combine", "draggable", "dropTargetForElements", "preserveOffsetOnSource", "setCustomNativeDragPreview", "composeRefs", "createContext", "Primitive", "Slot", "React", "useCallback", "useLayoutEffect", "useMemo", "useRef", "useState", "createPortal", "composableProps", "slottable", "resizeAttributes", "sizeStyle", "MOSAIC_TILE_NAME", "MosaicTileContextProvider", "useMosaicTileContext", "createContext", "MOSAIC_TILE_STATE_ATTR", "MosaicTile", "slottable", "children", "asChild", "dragHandle", "dragHandleProp", "allowedEdges", "allowedEdgesProp", "location", "id", "data", "dataProp", "draggable", "draggableProp", "current", "selected", "size", "sizeProp", "onSizeChange", "minSize", "maxSize", "debug", "_", "props", "forwardedRef", "Comp", "Slot", "Primitive", "div", "rootRef", "useRef", "composedRef", "composeRefs", "containerId", "eventHandler", "orientation", "scrolling", "setActiveLocation", "useMosaicContainerContext", "state", "setState", "useState", "type", "registeredDragHandle", "setRegisteredDragHandle", "setInternalSize", "setSize", "useCallback", "nextSize", "commit", "useMemo", "useLayoutEffect", "root", "handleChange", "self", "source", "closestEdge", "extractClosestEdge", "handleNativeDragStart", "event", "dataTransfer", "effectAllowed", "addEventListener", "combine", "removeEventListener", "element", "undefined", "canDrag", "getInitialData", "onGenerateDragPreview", "nativeSetDragImage", "setCustomNativeDragPreview", "getOffset", "preserveOffsetOnSource", "input", "render", "container", "bounds", "getBoundingClientRect", "rect", "onDragStart", "onDrop", "dropTargetForElements", "getData", "attachClosestEdge", "canDrop", "getSourceData", "getDropEffect", "onDragEnter", "onDragLeave", "onDrag", "className", "rest", "composableProps", "classNames", "vertical", "sized", "bounded", "sizeStyles", "sizeStyle", "React", "setDragHandle", "resizeAttributes", "style", "role", "aria-current", "aria-selected", "ref", "createPortal", "width", "height", "displayName", "composeRefs", "React", "forwardRef", "Button", "IconButton", "useTranslation", "MOSAIC_DRAG_HANDLE_NAME", "REACT_UI_TRANSLATION_KEY", "MosaicDragHandle", "forwardRef", "icon", "label", "variant", "classNames", "testId", "children", "forwardedRef", "t", "useTranslation", "setDragHandle", "useMosaicTileContext", "ref", "composeRefs", "testIdProps", "React", "Button", "tabIndex", "span", "className", "IconButton", "iconOnly", "noTooltip", "displayName", "DropIndicator", "NaturalDropIndicator", "dropTargetForElements", "Primitive", "Slot", "React", "useLayoutEffect", "useMemo", "useRef", "mx", "MOSAIC_PLACEHOLDER_NAME", "MOSAIC_PLACEHOLDER_ORIENTATION_ATTR", "MOSAIC_PLACEHOLDER_STATE_ATTR", "MOSAIC_PLACEHOLDER_LOCATION_ATTR", "MosaicPlaceholder", "classNames", "children", "asChild", "orientation", "location", "rootRef", "useRef", "Comp", "Slot", "Primitive", "div", "id", "containerId", "eventHandler", "scrolling", "activeLocation", "setActiveLocation", "useMosaicContainerContext", "data", "useMemo", "type", "useLayoutEffect", "root", "current", "dropTargetForElements", "element", "getData", "canDrop", "source", "getSourceData", "getDropEffect", "onDragEnter", "onDragLeave", "undefined", "onDrop", "React", "String", "role", "className", "mx", "ref", "displayName", "DROP_INDICATOR_NAME", "MosaicDropIndicator", "props", "state", "useMosaicTileContext", "closestEdge", "NaturalDropIndicator", "edge", "React", "ResizeHandle", "MOSAIC_RESIZE_HANDLE_NAME", "MIN_WIDTH", "MIN_HEIGHT", "DEFAULT_EXTRINSIC_SIZE", "MosaicResizeHandle", "minSize", "maxSize", "fallbackSize", "orientation", "useMosaicContainerContext", "size", "setSize", "tileMinSize", "tileMaxSize", "useMosaicTileContext", "horizontal", "React", "ResizeHandle", "side", "onSizeChange", "displayName", "useComposedRefs", "useVirtualizer", "React", "Fragment", "forwardRef", "useCallback", "useEffect", "useLayoutEffect", "useMemo", "useRef", "invariant", "composable", "composableProps", "mx", "__dxlog_file", "visibleItems", "useVisibleItems", "draggable", "id", "items", "dragging", "getId", "invariant", "draggingSource", "useMemo", "useLayoutEffect", "setActiveLocation", "sourceIndex", "scrollIntoView", "useCallback", "el", "block", "behavior", "useEffect", "registerScrollTo", "composableProps", "React", "orientation", "ref", "Tile", "item", "location", "index", "current", "selected", "selectedIds", "debug", "MosaicStackInner", "useMosaicContainerContext", "MOSAIC_VIRTUAL_STACK_NAME", "count", "gap", "overscan", "onChange", "itemIndex", "virtualizer", "scrollToOffset", "offset", "Math", "style", "width", "getTotalSize", "height", "virtualItems", "div", "key", "top", "left", "start", "transform", "data", "InternalPlaceholder", "MosaicVirtualStackInner", "MosaicVirtualStack", "Symbol", "styles", "placeholder", "className", "mx", "Mosaic", "Root", "MosaicRoot", "Container", "MosaicContainer", "Tile", "MosaicTile", "DragHandle", "MosaicDragHandle", "ResizeHandle", "MosaicResizeHandle", "Placeholder", "MosaicPlaceholder", "DropIndicator", "MosaicDropIndicator", "Stack", "MosaicStack", "VirtualStack", "MosaicVirtualStack"]
|
|
7
|
+
}
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
useMosaicRootContext,
|
|
9
9
|
useMosaicTileContext,
|
|
10
10
|
useVisibleItems
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-OBVIYZLR.mjs";
|
|
12
12
|
|
|
13
13
|
// src/components/Board/Board.tsx
|
|
14
14
|
import { useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
|
|
@@ -339,7 +339,7 @@ var BoardItemInner = /* @__PURE__ */ forwardRef2(({ classNames, data, location,
|
|
|
339
339
|
})), label && /* @__PURE__ */ React2.createElement("div", {
|
|
340
340
|
className: "shrink-0 flex gap-1 items-center text-xs"
|
|
341
341
|
}, /* @__PURE__ */ React2.createElement(Tag, {
|
|
342
|
-
|
|
342
|
+
hue: getHashStyles(label).hue
|
|
343
343
|
}, label)))))));
|
|
344
344
|
});
|
|
345
345
|
BoardItemInner.displayName = BOARD_ITEM_NAME;
|
|
@@ -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 { composable, composableProps } from '@dxos/react-ui';\nimport { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';\nimport { 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\\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-bg)';\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 { composable, composableProps } from '@dxos/react-ui';\nimport { Menu, createMenuAction } from '@dxos/react-ui-menu';\nimport { 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.uri,\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, Icon, IconButton, Tag, 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.Header>\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 <Card.Block end>\n <Menu.Trigger asChild disabled={!items?.length}>\n <IconButton\n iconOnly\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n label={t('action-menu.label')}\n />\n </Menu.Trigger>\n </Card.Block>\n <Menu.Content items={items} />\n </Card.Header>\n {/* TODO(burdon): Replace with surface. */}\n <Card.Row classNames='text-description'>\n <Card.Block>\n <Icon icon='ph--note--regular' />\n </Card.Block>\n <Card.Text>{description}</Card.Text>\n </Card.Row>\n <Card.Row>\n <Card.Block>\n <Icon icon='ph--tag--regular' />\n </Card.Block>\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 { composable, composableProps } from '@dxos/react-ui';\nimport { type SearchResult } from '@dxos/react-ui-search';\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.Header>\n <Card.Block />\n <Card.Title>{result.label}</Card.Title>\n </Card.Header>\n {result.snippet && (\n <Card.Body>\n <Card.Row>\n <Card.Text variant='description'>{result.snippet}</Card.Text>\n </Card.Row>\n </Card.Body>\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", "composable", "composableProps", "JsonHighlighter", "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", "composable", "composableProps", "Menu", "createMenuAction", "mx", "translationKey", "useComposedRefs", "React", "forwardRef", "useMemo", "useRef", "useState", "Obj", "Card", "Icon", "IconButton", "Tag", "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", "Header", "DragHandle", "testId", "Title", "Block", "end", "Trigger", "disabled", "length", "IconButton", "iconOnly", "variant", "Content", "Row", "Icon", "Text", "div", "className", "Tag", "
|
|
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 { composable, composableProps } from '@dxos/react-ui';\nimport { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';\nimport { 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 { BoardColumnProps, BoardContentProps, BoardItemProps, BoardRootProps };\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\\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-bg)';\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 { composable, composableProps } from '@dxos/react-ui';\nimport { Menu, createMenuAction } from '@dxos/react-ui-menu';\nimport { 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.uri,\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, Icon, IconButton, Tag, 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.Header>\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 <Card.Block end>\n <Menu.Trigger asChild disabled={!items?.length}>\n <IconButton\n iconOnly\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n label={t('action-menu.label')}\n />\n </Menu.Trigger>\n </Card.Block>\n <Menu.Content items={items} />\n </Card.Header>\n {/* TODO(burdon): Replace with surface. */}\n <Card.Row classNames='text-description'>\n <Card.Block>\n <Icon icon='ph--note--regular' />\n </Card.Block>\n <Card.Text>{description}</Card.Text>\n </Card.Row>\n <Card.Row>\n <Card.Block>\n <Icon icon='ph--tag--regular' />\n </Card.Block>\n {label && (\n <div className='shrink-0 flex gap-1 items-center text-xs'>\n <Tag hue={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 { composable, composableProps } from '@dxos/react-ui';\nimport { type SearchResult } from '@dxos/react-ui-search';\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.Header>\n <Card.Block />\n <Card.Title>{result.label}</Card.Title>\n </Card.Header>\n {result.snippet && (\n <Card.Body>\n <Card.Row>\n <Card.Text variant='description'>{result.snippet}</Card.Text>\n </Card.Row>\n </Card.Body>\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", "composable", "composableProps", "JsonHighlighter", "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", "composable", "composableProps", "Menu", "createMenuAction", "mx", "translationKey", "useComposedRefs", "React", "forwardRef", "useMemo", "useRef", "useState", "Obj", "Card", "Icon", "IconButton", "Tag", "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", "Header", "DragHandle", "testId", "Title", "Block", "end", "Trigger", "disabled", "length", "IconButton", "iconOnly", "variant", "Content", "Row", "Icon", "Text", "div", "className", "Tag", "hue", "getHashStyles", "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", "uri", "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", "Header", "Block", "Title", "label", "snippet", "Body", "Row", "Text", "variant"]
|
|
7
7
|
}
|