@dashfoo/react 0.8.3 → 0.9.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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Panel"],"sources":["../src/lib/topmost-collision.ts","../src/hooks/drag-hooks.tsx","../src/hooks/persistence.ts","../src/hooks/responsive.ts","../src/lib/warn-once.ts","../src/hooks/store.ts","../src/lib/compact-model.ts","../src/lib/drag-subject.ts","../src/lib/tab-insertion.ts","../src/components/drag-preview-overlay.tsx","../src/components/dashfoo-drag-provider.tsx","../src/hooks/layout-store.ts","../src/components/drag-provider.tsx","../src/components/float-context.ts","../src/components/float-resize-handles.ts","../src/lib/float-geometry.ts","../src/hooks/use-float-gesture.ts","../src/hooks/use-inline-rename.ts","../src/components/close-icon.tsx","../src/components/layout-root.tsx","../src/hooks/use-snap-resize.ts","../src/lib/tab-ids.ts","../src/components/tabset/tabset-store.ts","../src/components/tabset/tabset-content.tsx","../src/components/tab-overflow-menu.tsx","../src/components/tabset/tabset-overflow-menu.tsx","../src/lib/merge-refs.ts","../src/components/tabset/tabset-rename-input.tsx","../src/hooks/use-tab-overflow.ts","../src/lib/tab-selection.ts","../src/components/tabset/tabset-root.tsx","../src/components/tabset/tabset-tab.tsx","../src/components/tabset/tabset-tablist.tsx","../src/components/tabset/tabset-toolbar.tsx","../src/components/tabset/tabset-view.tsx","../src/components/row-view.tsx","../src/components/float-panel.tsx","../src/components/float-layer.tsx","../src/components/layout.tsx","../src/components/dashfoo-layout.tsx","../src/components/panel-badge.tsx","../src/components/panel-body.tsx","../src/components/panel-header.tsx","../src/components/panel-icon.tsx","../src/components/panel-root.tsx","../src/components/panel-title.tsx","../src/components/panel.tsx","../src/components/tabset/tabset.ts"],"sourcesContent":["import type { Collision, CollisionDetector, UniqueIdentifier } from \"@dnd-kit/abstract\";\nimport { CollisionPriority, CollisionType } from \"@dnd-kit/abstract\";\n\ntype TopmostDetectorInput = {\n dragOperation: { position: { current: { x: number; y: number } } };\n droppable: { element?: Element; id: UniqueIdentifier };\n};\n\ntype TopmostDetector = (input: TopmostDetectorInput) => Collision | null;\n\nconst createTopmostPointerIntersection = (\n topElementAt: (x: number, y: number) => Element | null = (x, y) =>\n document.elementFromPoint(x, y),\n): TopmostDetector => {\n let cached: { top: Element | null; x: number; y: number } | null = null;\n const topAt = (x: number, y: number): Element | null => {\n if (cached && cached.x === x && cached.y === y) {\n return cached.top;\n }\n const top = topElementAt(x, y);\n cached = { top, x, y };\n queueMicrotask(() => {\n cached = null;\n });\n return top;\n };\n\n return ({ dragOperation, droppable }) => {\n const { element } = droppable;\n if (!element) {\n return null;\n }\n const point = dragOperation.position.current;\n const top = topAt(point.x, point.y);\n if (!top || !element.contains(top)) {\n return null;\n }\n\n let depth = 0;\n for (let node: Element | null = element; node; node = node.parentElement) {\n depth += 1;\n }\n return {\n id: droppable.id,\n priority: CollisionPriority.High,\n type: CollisionType.PointerIntersection,\n value: depth,\n };\n };\n};\n\nconst topmostPointerIntersection: CollisionDetector = createTopmostPointerIntersection();\n\nexport { createTopmostPointerIntersection, topmostPointerIntersection };\nexport type { TopmostDetectorInput };\n","\"use client\";\n\nimport type {\n Action,\n dragDockMachine,\n DragSubject,\n DropIntent,\n Point,\n TabNode,\n} from \"@dashfoo/core\";\nimport {\n Accessibility,\n Draggable,\n DragDropManager,\n Droppable,\n Feedback,\n PointerSensor,\n} from \"@dnd-kit/dom\";\nimport { useSelector } from \"@xstate/react\";\nimport type { Context } from \"react\";\nimport { createContext, useCallback, useContext, useEffect, useId, useMemo, useRef } from \"react\";\nimport type { ActorRefFrom } from \"xstate\";\n\nimport type { DashfooDragData } from \"../lib/drag-subject\";\nimport { topmostPointerIntersection } from \"../lib/topmost-collision\";\n\nconst INTERACTIVE_SELECTOR = `\n input:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n button:not([disabled]),\n a[href],\n [contenteditable]:not([contenteditable=\"false\"])\n`;\n\nconst preventActivation = (event: PointerEvent, source: Draggable): boolean => {\n const { target } = event;\n if (!(target instanceof Element)) {\n return false;\n }\n const interactive = target.closest(INTERACTIVE_SELECTOR);\n return interactive !== null && interactive !== source.element;\n};\n\ntype DashfooDragManager = DragDropManager;\ntype DashfooDraggable = Draggable;\n\nconst createDragManager = (): DashfooDragManager =>\n new DragDropManager({\n plugins: (defaults) => [\n ...defaults.filter((plugin) => plugin !== Accessibility && plugin !== Feedback),\n Feedback.configure({ dropAnimation: null }),\n ],\n sensors: () => [PointerSensor.configure({ preventActivation })],\n });\n\ntype DragActor = ActorRefFrom<typeof dragDockMachine>;\n\n/**\n * One per rendered layer (the main tree, then one per float); the manager and\n * actor are shared above them. `layerId` namespaces droppable registrations, so\n * two layers can hold a tabset with the same model id.\n */\ntype DragScope = {\n commit: (action: Action) => void;\n layerId: string;\n resolveIntent: (\n targetId: string,\n element: HTMLElement,\n point: Point,\n draggedId?: string,\n ) => DropIntent | null;\n};\n\ntype DragRootContextValue = {\n actorRef: DragActor;\n manager: DashfooDragManager;\n registerScope: (scope: DragScope) => () => void;\n};\n\nconst DragRootContext: Context<DragRootContextValue | null> =\n createContext<DragRootContextValue | null>(null);\n\ntype DragContextValue = {\n actorRef: DragActor;\n layerId: string;\n manager: DashfooDragManager;\n};\n\nconst DragContext = createContext<DragContextValue | null>(null);\n\nconst SharedDragManagerContext: Context<DashfooDragManager | null> =\n createContext<DashfooDragManager | null>(null);\n\n/** The intent is rebuilt every pointer move, so readers compare by value. */\nconst sameDropIntent = (a: DropIntent | null, b: DropIntent | null): boolean =>\n a === b ||\n (a !== null &&\n b !== null &&\n a.index === b.index &&\n a.location === b.location &&\n a.targetId === b.targetId);\n\ntype DraggableHandle = {\n draggableRef: { current: DashfooDraggable | null };\n elementRef: { current: Element | null };\n ref: (element: Element | null) => void;\n};\n\nconst useDraggableHandle = (): DraggableHandle => {\n const elementRef = useRef<Element | null>(null);\n const draggableRef = useRef<DashfooDraggable | null>(null);\n const ref = useCallback((element: Element | null): void => {\n elementRef.current = element;\n if (draggableRef.current) {\n draggableRef.current.element = element ?? undefined;\n }\n }, []);\n return { draggableRef, elementRef, ref };\n};\n\ntype DraggableDescriptor = { data: DashfooDragData; id: string };\n\nconst useDraggableEntity = (\n descriptor: DraggableDescriptor,\n disabled: boolean,\n label: string,\n): { ref: (element: Element | null) => void } => {\n const context = useContext(DragContext);\n\n const sharedManager = useContext(SharedDragManagerContext);\n const manager = context?.manager ?? sharedManager;\n const { draggableRef, elementRef, ref } = useDraggableHandle();\n const { data, id } = descriptor;\n\n useEffect(() => {\n if (!manager || disabled) {\n return undefined;\n }\n const draggable = new Draggable({ data: { ...data, label: \"\" }, id }, manager);\n draggable.element = elementRef.current ?? undefined;\n draggableRef.current = draggable;\n return () => {\n draggable.destroy();\n draggableRef.current = null;\n };\n }, [data, disabled, draggableRef, elementRef, id, manager]);\n\n useEffect(() => {\n const draggable = draggableRef.current;\n if (draggable) {\n draggable.data = { ...data, label };\n }\n }, [data, draggableRef, label]);\n\n return useMemo(() => ({ ref }), [ref]);\n};\n\nconst useTabDraggable = (\n tabId: string,\n disabled = false,\n label = \"\",\n): { ref: (element: Element | null) => void } => {\n const data = useMemo(() => ({ type: \"tab\" }) satisfies DashfooDragData, []);\n return useDraggableEntity({ data, id: tabId }, disabled, label);\n};\n\nconst useTabsetDraggable = (\n tabsetId: string,\n disabled = false,\n label = \"\",\n): { ref: (element: Element | null) => void } => {\n const data = useMemo(() => ({ tabsetId, type: \"tabset\" }) satisfies DashfooDragData, [tabsetId]);\n return useDraggableEntity({ data, id: `grip-${tabsetId}` }, disabled, label);\n};\n\nconst useTabsetDroppable = (tabsetId: string): { ref: (element: HTMLElement | null) => void } => {\n const context = useContext(DragContext);\n const elementRef = useRef<HTMLElement | null>(null);\n const droppableRef = useRef<Droppable | null>(null);\n const ref = useCallback((element: HTMLElement | null): void => {\n elementRef.current = element;\n if (droppableRef.current) {\n droppableRef.current.element = element ?? undefined;\n }\n }, []);\n const layerId = context?.layerId;\n const manager = context?.manager;\n\n useEffect(() => {\n if (!manager || layerId === undefined) {\n return undefined;\n }\n\n const droppable = new Droppable(\n {\n collisionDetector: topmostPointerIntersection,\n data: { layerId, tabsetId, type: \"tabset\" },\n id: `${layerId}:${tabsetId}`,\n },\n manager,\n );\n droppable.element = elementRef.current ?? undefined;\n droppableRef.current = droppable;\n return () => {\n droppable.destroy();\n droppableRef.current = null;\n };\n }, [layerId, manager, tabsetId]);\n\n return useMemo(() => ({ ref }), [ref]);\n};\n\ntype ExternalTabSourceOptions = {\n createTab: () => TabNode;\n disabled?: boolean;\n label?: string;\n};\n\nconst useExternalTabSource = ({\n createTab,\n disabled = false,\n label = \"\",\n}: ExternalTabSourceOptions): { ref: (element: Element | null) => void } => {\n const id = useId();\n const createTabRef = useRef(createTab);\n\n useEffect(() => {\n createTabRef.current = createTab;\n }, [createTab]);\n const data = useMemo(\n () =>\n ({\n createTab: (): TabNode => createTabRef.current(),\n type: \"external\",\n }) satisfies DashfooDragData,\n [],\n );\n return useDraggableEntity({ data, id: `external-${id}` }, disabled, label);\n};\n\n/**\n * Reads the root's actor, so it works from an overlay mounted beside the layout\n * rather than inside a drag layer. Outside a provider it reports the empty state\n * instead of throwing.\n */\nconst useDragSubject = (): DragSubject | null => {\n const actorRef = useContext(DragRootContext)?.actorRef;\n return useSelector(actorRef, (snapshot) => {\n const drag = snapshot?.context.drag;\n return drag?.kind === \"dragging\" ? drag.subject : null;\n });\n};\n\nconst useDropIntent = (): DropIntent | null => {\n const actorRef = useContext(DragRootContext)?.actorRef;\n return useSelector(\n actorRef,\n (snapshot) => {\n const drag = snapshot?.context.drag;\n return drag?.kind === \"dragging\" ? (drag.drop?.intent ?? null) : null;\n },\n sameDropIntent,\n );\n};\n\nexport type {\n DragActor,\n DragContextValue,\n DashfooDragManager,\n DragRootContextValue,\n DragScope,\n ExternalTabSourceOptions,\n};\nexport {\n createDragManager,\n DragContext,\n DragRootContext,\n sameDropIntent,\n SharedDragManagerContext,\n useDragSubject,\n useDropIntent,\n useExternalTabSource,\n useTabDraggable,\n useTabsetDraggable,\n useTabsetDroppable,\n};\n","\"use client\";\n\nimport type { Dashfoo } from \"@dashfoo/core\";\nimport { fromJSON, toJSON } from \"@dashfoo/core\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\ntype StorageAdapter = {\n getItem: (key: string) => string | null;\n removeItem: (key: string) => void;\n setItem: (key: string, value: string) => void;\n};\n\nconst memoryStorageAdapter = (): StorageAdapter => {\n const store = new Map<string, string>();\n return {\n getItem: (key) => store.get(key) ?? null,\n removeItem: (key) => {\n store.delete(key);\n },\n setItem: (key, value) => {\n store.set(key, value);\n },\n };\n};\n\nconst localStorageAdapter: StorageAdapter = {\n getItem: (key) => {\n if (typeof window === \"undefined\") {\n return null;\n }\n try {\n return window.localStorage.getItem(key);\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] failed to load persisted layout\", error);\n return null;\n }\n },\n removeItem: (key) => {\n if (typeof window === \"undefined\") {\n return;\n }\n try {\n window.localStorage.removeItem(key);\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] failed to clear persisted layout\", error);\n }\n },\n setItem: (key, value) => {\n if (typeof window === \"undefined\") {\n return;\n }\n try {\n window.localStorage.setItem(key, value);\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] failed to persist layout\", error);\n }\n },\n};\n\ntype PersistConfig = {\n debounceMs: number;\n key: string;\n storage: StorageAdapter;\n};\n\nconst removeStoredLayout = ({ key, storage }: PersistConfig): void => {\n try {\n storage.removeItem(key);\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] failed to clear persisted layout\", error);\n }\n};\n\ntype Persistence = {\n clear: () => void;\n\n initialModel: Dashfoo | undefined;\n save: (model: Dashfoo) => void;\n};\n\nconst usePersistence = (\n config: PersistConfig | null,\n defaultModel: Dashfoo | undefined,\n): Persistence => {\n const configRef = useRef(config);\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n const [initialModel, setInitialModel] = useState(defaultModel);\n const loaded = useRef(false);\n useEffect(() => {\n // A browser-only read during render disagrees with SSR. Load once after\n // hydration; the layout applies this snapshot without recording an action.\n if (loaded.current) {\n return;\n }\n loaded.current = true;\n const current = configRef.current;\n if (current === null || defaultModel === undefined) {\n return;\n }\n try {\n const raw = current.storage.getItem(current.key);\n if (raw === null) {\n return;\n }\n try {\n const restored = fromJSON(raw);\n setInitialModel(restored);\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] discarding unreadable persisted layout\", error);\n removeStoredLayout(current);\n }\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] failed to load persisted layout\", error);\n }\n }, [defaultModel]);\n\n const loadedKey = useRef(config?.key);\n useEffect(() => {\n if (config !== null && config.key !== loadedKey.current) {\n // oxlint-disable-next-line no-console\n console.warn(\n \"[dashfoo] persist key changed for a mounted layout; the displayed layout still reflects the previous key; remount (key={persistKey}) to load the new key\",\n );\n loadedKey.current = config.key;\n }\n }, [config]);\n\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const pending = useRef<{ key: string; storage: StorageAdapter; value: string } | null>(null);\n\n const flush = useCallback((): void => {\n if (timer.current !== null) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n if (pending.current !== null) {\n const write = pending.current;\n pending.current = null;\n try {\n write.storage.setItem(write.key, write.value);\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] failed to persist layout\", error);\n }\n }\n }, []);\n\n const save = useCallback(\n (next: Dashfoo): void => {\n const current = configRef.current;\n if (current === null) {\n return;\n }\n pending.current = { key: current.key, storage: current.storage, value: toJSON(next) };\n if (timer.current !== null) {\n clearTimeout(timer.current);\n }\n timer.current = setTimeout(flush, current.debounceMs);\n },\n [flush],\n );\n\n useEffect(() => {\n const handlePageHide = (): void => {\n flush();\n };\n const handleVisibilityChange = (): void => {\n if (document.visibilityState === \"hidden\") {\n flush();\n }\n };\n window.addEventListener(\"pagehide\", handlePageHide);\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n return () => {\n window.removeEventListener(\"pagehide\", handlePageHide);\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n flush();\n };\n }, [flush]);\n\n const clear = useCallback((): void => {\n if (timer.current !== null) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n pending.current = null;\n const current = configRef.current;\n if (current !== null) {\n removeStoredLayout(current);\n }\n }, []);\n\n return useMemo(() => ({ clear, initialModel, save }), [clear, initialModel, save]);\n};\n\nexport { localStorageAdapter, memoryStorageAdapter, usePersistence };\nexport type { Persistence, PersistConfig, StorageAdapter };\n","\"use client\";\n\nimport type { Dashfoo } from \"@dashfoo/core\";\nimport { useEffect, useMemo, useState } from \"react\";\n\ntype Breakpoint = {\n compact?: boolean;\n id: string;\n model: Dashfoo;\n query?: { maxWidth: number } | { media: string };\n};\n\ntype UseResponsiveModelOptions = { breakpoints: Array<Breakpoint> };\n\ntype ResponsiveModel = {\n breakpoint: string;\n containerRef: (element: HTMLElement | null) => void;\n draggableTabs: boolean;\n draggableTabsets: boolean;\n isCompact: boolean;\n model: Dashfoo;\n resizableSplits: boolean;\n};\n\nconst hasMatchMedia = (): boolean =>\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\";\n\nconst matchBreakpoint = (breakpoint: Breakpoint, width: number): boolean => {\n const { query } = breakpoint;\n if (!query) {\n return true;\n }\n if (\"maxWidth\" in query) {\n return width <= query.maxWidth;\n }\n return hasMatchMedia() && window.matchMedia(query.media).matches;\n};\n\nconst activeBreakpoint = (breakpoints: Array<Breakpoint>, width: number): Breakpoint => {\n const fallback = breakpoints.at(-1);\n if (!fallback) {\n throw new Error(\"useResponsiveModel requires at least one breakpoint.\");\n }\n return breakpoints.find((breakpoint) => matchBreakpoint(breakpoint, width)) ?? fallback;\n};\n\nconst observeWidth = (element: HTMLElement, onWidth: (width: number) => void): (() => void) => {\n const observer = new ResizeObserver((entries) => {\n const entry = entries.at(0);\n if (entry) {\n onWidth(entry.contentRect.width);\n }\n });\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n};\n\nconst listenToMedia = (list: MediaQueryList, handleChange: () => void): (() => void) => {\n list.addEventListener(\"change\", handleChange);\n return () => {\n list.removeEventListener(\"change\", handleChange);\n };\n};\n\nconst useContainerWidth = (): [(element: HTMLElement | null) => void, number] => {\n const [width, setWidth] = useState<number>(Number.POSITIVE_INFINITY);\n const [container, setContainer] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!container) {\n return undefined;\n }\n // React 18 replays effects without replaying callback refs in StrictMode.\n // Create and disconnect the observer in the same lifecycle.\n return observeWidth(container, setWidth);\n }, [container]);\n\n return [setContainer, width];\n};\n\nconst useResponsiveModel = ({ breakpoints }: UseResponsiveModelOptions): ResponsiveModel => {\n const [containerRef, width] = useContainerWidth();\n const [, setMediaTick] = useState(0);\n\n useEffect(() => {\n if (!hasMatchMedia()) {\n return undefined;\n }\n const lists = breakpoints.flatMap((breakpoint) =>\n breakpoint.query && \"media\" in breakpoint.query\n ? [window.matchMedia(breakpoint.query.media)]\n : [],\n );\n if (lists.length === 0) {\n return undefined;\n }\n const handleChange = (): void => {\n setMediaTick((tick) => tick + 1);\n };\n const cleanups = lists.map((list) => listenToMedia(list, handleChange));\n return () => {\n for (const cleanup of cleanups) {\n cleanup();\n }\n };\n }, [breakpoints]);\n\n const active = activeBreakpoint(breakpoints, width);\n\n return useMemo(() => {\n const isCompact = active.compact === true;\n return {\n breakpoint: active.id,\n containerRef,\n draggableTabs: !isCompact,\n draggableTabsets: !isCompact,\n isCompact,\n model: active.model,\n resizableSplits: !isCompact,\n };\n }, [active, containerRef]);\n};\n\nexport { activeBreakpoint, matchBreakpoint, useContainerWidth, useResponsiveModel };\nexport type { Breakpoint, ResponsiveModel, UseResponsiveModelOptions };\n","const warned = new Set<string>();\n\nconst warnOnce = (key: string, message: string): void => {\n if (warned.has(key)) {\n return;\n }\n warned.add(key);\n // oxlint-disable-next-line no-console\n console.warn(`[dashfoo] ${message}`);\n};\n\nexport { warnOnce };\n","\"use client\";\n\nimport type { Action, Dashfoo } from \"@dashfoo/core\";\nimport { canRedo, canUndo, dashfooMachine, normalize, reducer } from \"@dashfoo/core\";\nimport { useActorRef, useSelector } from \"@xstate/react\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nimport { warnOnce } from \"../lib/warn-once\";\n\nconst CONTROLLED_HISTORY_MESSAGE =\n \"undo/redo are unavailable while `model` is controlled; keep the history in the state you own and drive it through onModelChange\";\n\nconst CONTROLLED_SET_MODEL_MESSAGE =\n \"setModel (and resetLayout) do nothing while `model` is controlled; set the model you own instead\";\n\nconst CONTROLLED_MODE_SWITCH_MESSAGE =\n \"`model` was added or removed after mount; a layout is controlled or uncontrolled for its whole life, so the first render wins. Remount (key=…) to switch\";\n\nconst CONTROLLED_WITH_DEFAULT_MESSAGE =\n \"`model` and `defaultModel` were both passed; `model` wins and `defaultModel` (and `persist`) are ignored\";\n\ntype DashfooStore = {\n canRedo: () => boolean;\n canUndo: () => boolean;\n dispatch: (action: Action) => void;\n model: Dashfoo;\n redo: () => void;\n setModel: (model: Dashfoo) => void;\n undo: () => void;\n};\n\ntype UseDashfooStoreOptions = {\n defaultModel?: Dashfoo;\n model?: Dashfoo;\n onAction?: (action: Action) => Action | null;\n onActiveTabsetChange?: (tabsetId: string | undefined) => void;\n onMaximizedTabsetChange?: (tabsetId: string | undefined) => void;\n onModelChange?: (model: Dashfoo, action?: Action) => void;\n};\n\n/** The mode is latched on the first render; running both sources leaves the\n * unread one describing a document nobody rendered. */\nconst useDashfooStore = (options: UseDashfooStoreOptions): DashfooStore => {\n const {\n defaultModel,\n model: controlledModel,\n onAction,\n onActiveTabsetChange,\n onMaximizedTabsetChange,\n onModelChange,\n } = options;\n const initialModel = controlledModel ?? defaultModel;\n if (initialModel === undefined) {\n throw new Error(\"useDashfooStore requires either a `model` or a `defaultModel`.\");\n }\n\n const [controlled] = useState(() => controlledModel !== undefined);\n if (controlled !== (controlledModel !== undefined)) {\n warnOnce(\"controlled-mode-switch\", CONTROLLED_MODE_SWITCH_MESSAGE);\n }\n if (controlled && defaultModel !== undefined) {\n warnOnce(\"controlled-with-default\", CONTROLLED_WITH_DEFAULT_MESSAGE);\n }\n\n const actorRef = useActorRef(dashfooMachine, { input: { model: normalize(initialModel) } });\n const history = useSelector(actorRef, (snapshot) => snapshot.context.history);\n\n const model = useMemo(\n () => (controlledModel === undefined ? history.present : normalize(controlledModel)),\n [controlledModel, history.present],\n );\n\n const notify = useCallback(\n (before: Dashfoo, after: Dashfoo, action?: Action) => {\n if (Object.is(before, after)) {\n return;\n }\n onModelChange?.(after, action);\n if (after.activeTabsetId !== before.activeTabsetId) {\n onActiveTabsetChange?.(after.activeTabsetId);\n }\n if (after.maximizedTabsetId !== before.maximizedTabsetId) {\n onMaximizedTabsetChange?.(after.maximizedTabsetId);\n }\n },\n [onModelChange, onActiveTabsetChange, onMaximizedTabsetChange],\n );\n\n const dispatch = useCallback(\n (action: Action) => {\n const resolved = onAction ? onAction(action) : action;\n if (!resolved) {\n return;\n }\n\n if (controlled) {\n notify(model, reducer(model, resolved), resolved);\n return;\n }\n\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ action: resolved, type: \"DISPATCH\" });\n notify(before, actorRef.getSnapshot().context.history.present, resolved);\n },\n [actorRef, controlled, model, notify, onAction],\n );\n\n const undo = useCallback(() => {\n if (controlled) {\n warnOnce(\"controlled-undo\", CONTROLLED_HISTORY_MESSAGE);\n return;\n }\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ type: \"UNDO\" });\n notify(before, actorRef.getSnapshot().context.history.present);\n }, [actorRef, controlled, notify]);\n\n const redo = useCallback(() => {\n if (controlled) {\n warnOnce(\"controlled-redo\", CONTROLLED_HISTORY_MESSAGE);\n return;\n }\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ type: \"REDO\" });\n notify(before, actorRef.getSnapshot().context.history.present);\n }, [actorRef, controlled, notify]);\n\n const setModel = useCallback(\n (next: Dashfoo) => {\n if (controlled) {\n warnOnce(\"controlled-set-model\", CONTROLLED_SET_MODEL_MESSAGE);\n return;\n }\n actorRef.send({ model: normalize(next), type: \"SET_MODEL\" });\n },\n [actorRef, controlled],\n );\n\n return useMemo(\n () => ({\n canRedo: () => !controlled && canRedo(actorRef.getSnapshot().context.history),\n canUndo: () => !controlled && canUndo(actorRef.getSnapshot().context.history),\n dispatch,\n model,\n redo,\n setModel,\n undo,\n }),\n [actorRef, controlled, dispatch, model, redo, setModel, undo],\n );\n};\n\nexport { useDashfooStore };\nexport type { DashfooStore, UseDashfooStoreOptions };\n","import type { Dashfoo, Orientation, RowNode } from \"@dashfoo/core\";\n\nconst compactRow = (node: RowNode, orientation: Orientation): RowNode => {\n const children = node.children.map((child) =>\n child.type === \"row\" ? compactRow(child, orientation) : { ...child, weight: 1 },\n );\n return {\n ...node,\n children,\n orientation,\n weight: children.reduce((sum, child) => sum + child.weight, 0),\n };\n};\n\n// Flattening with core's stackModel reparents nested tabsets in React, losing\n// widget state. Keep every ancestor and distribute space by descendant count.\nconst compactModel = (model: Dashfoo, orientation: Orientation = \"column\"): Dashfoo => ({\n ...model,\n layout: compactRow(model.layout, orientation),\n maximizedTabsetId: undefined,\n});\n\nexport { compactModel };\n","import type { DragSubject, TabNode } from \"@dashfoo/core\";\nimport { tabNodeSchema } from \"@dashfoo/core\";\nimport type { Data } from \"@dnd-kit/abstract\";\nimport type { Draggable } from \"@dnd-kit/dom\";\n\ntype DashfooDragData =\n | { label?: string; type: \"tab\" }\n | { label?: string; layerId?: string; tabsetId: string; type: \"tabset\" }\n | { createTab: () => TabNode; label?: string; type: \"external\" };\n\ntype DragSource = Pick<Draggable, \"data\" | \"id\">;\n\nconst isTabFactory = (value: Data[string]): value is () => TabNode => typeof value === \"function\";\n\n/** Beside the manager wiring, not the layer adapter: `dragstart` fires once per\n * gesture on the shared manager, above any one layer. */\nconst subjectFor = (source: DragSource): DragSubject | null => {\n const data = source.data;\n if (data.type === \"tabset\") {\n return { id: String(data.tabsetId), kind: \"tabset\" };\n }\n if (data.type === \"external\") {\n if (!isTabFactory(data.createTab)) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] external drag source is missing its createTab function\");\n return null;\n }\n let candidate: ReturnType<typeof data.createTab>;\n try {\n candidate = data.createTab();\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] external drag source createTab threw\", error);\n return null;\n }\n const parsed = tabNodeSchema.safeParse(candidate);\n if (!parsed.success) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] external drag source returned an invalid tab\", parsed.error);\n return null;\n }\n return { id: String(source.id), kind: \"external\", tab: parsed.data };\n }\n return { id: String(source.id), kind: \"tab\" };\n};\n\nexport { subjectFor };\nexport type { DashfooDragData, DragSource };\n","import type { Point, Rect } from \"@dashfoo/core\";\n\ntype Zone = { height: number; width: number; x: number; y: number };\n\nconst pointInRect = (point: Point, rect: Rect): boolean =>\n point.x >= rect.x &&\n point.x <= rect.x + rect.width &&\n point.y >= rect.y &&\n point.y <= rect.y + rect.height;\n\nconst insertionIndex = (rects: ReadonlyArray<Rect>, pointerX: number): number => {\n const found = rects.findIndex((rect) => pointerX < rect.x + rect.width / 2);\n return found === -1 ? rects.length : found;\n};\n\nconst INSERTION_LINE_WIDTH = 4;\n\nconst insertionLineRect = (\n stripRect: Rect,\n itemRects: ReadonlyArray<Rect>,\n index: number,\n): Zone => {\n const at = itemRects[index];\n const last = itemRects.at(-1);\n const x = at?.x ?? (last ? last.x + last.width : stripRect.x);\n const left = x - INSERTION_LINE_WIDTH / 2;\n return {\n height: stripRect.height,\n width: INSERTION_LINE_WIDTH,\n x: Math.max(stripRect.x, Math.min(left, stripRect.x + stripRect.width - INSERTION_LINE_WIDTH)),\n y: stripRect.y,\n };\n};\n\nconst shouldAllowDrop = (\n draggedId: string | undefined,\n targetId: string,\n tabIds: ReadonlyArray<string>,\n): boolean => {\n if (draggedId === `grip-${targetId}`) {\n return false;\n }\n if (tabIds.length === 1 && tabIds[0] === draggedId) {\n return false;\n }\n return true;\n};\n\nexport { insertionIndex, insertionLineRect, pointInRect, shouldAllowDrop };\nexport type { Zone };\n","\"use client\";\n\nimport type { Point } from \"@dashfoo/core\";\nimport { zoneRect } from \"@dashfoo/core\";\nimport { Feedback } from \"@dnd-kit/dom\";\nimport type { DragStartEvent } from \"@dnd-kit/dom\";\nimport { useSelector } from \"@xstate/react\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport type { DashfooDragManager, DragActor } from \"../hooks/drag-hooks\";\nimport type { DragSource } from \"../lib/drag-subject\";\nimport type { Zone } from \"../lib/tab-insertion\";\nimport { insertionLineRect } from \"../lib/tab-insertion\";\n\nconst overlayBase: CSSProperties = {\n boxSizing: \"border-box\",\n pointerEvents: \"none\",\n position: \"fixed\",\n\n transition: \"var(--dashfoo-dock-transition, left 60ms, top 60ms, width 60ms, height 60ms)\",\n zIndex: 9999,\n};\n\nconst paneStyle = (zone: Zone): CSSProperties => ({\n ...overlayBase,\n background: \"var(--dashfoo-dock-fill, oklch(0.556 0 0 / 0.18))\",\n border:\n \"var(--dashfoo-dock-border-width, 1px) solid var(--dashfoo-dock-border, oklch(0.708 0 0 / 0.75))\",\n borderRadius: \"var(--dashfoo-dock-radius, 6px)\",\n height: zone.height,\n left: zone.x,\n top: zone.y,\n width: zone.width,\n});\n\nconst lineStyle = (zone: Zone): CSSProperties => ({\n ...paneStyle(zone),\n borderRadius: \"var(--dashfoo-dock-line-radius, 2px)\",\n});\n\nconst tabItemRects = (strip: Element, excludeId?: string): Array<DOMRect> =>\n [...strip.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab-item\"]')].flatMap((item) =>\n item.querySelector<HTMLElement>('[data-dashfoo=\"tab\"]')?.dataset.tabId === excludeId\n ? []\n : [item.getBoundingClientRect()],\n );\n\nconst DockIndicator = ({\n actorRef,\n getTabsetElement,\n}: {\n actorRef: DragActor;\n getTabsetElement: (id: string) => HTMLElement | undefined;\n}): ReactNode => {\n const drag = useSelector(actorRef, (snapshot) => snapshot.context.drag);\n if (drag.kind !== \"dragging\" || drag.drop === null) {\n return null;\n }\n const { intent } = drag.drop;\n const draggedId = drag.subject.id;\n const element = getTabsetElement(intent.targetId);\n if (!element) {\n return null;\n }\n\n const zIndex = element.closest('[data-dashfoo=\"float\"]') ? overlayBase.zIndex : \"auto\";\n if (intent.location === \"center\") {\n const strip = element.querySelector('[data-dashfoo=\"tabstrip\"]');\n if (strip) {\n const line = insertionLineRect(\n strip.getBoundingClientRect(),\n tabItemRects(strip, draggedId),\n intent.index ?? 0,\n );\n return <div data-dashfoo=\"dock-indicator\" style={{ ...lineStyle(line), zIndex }} />;\n }\n }\n const zone = zoneRect(element.getBoundingClientRect(), intent.location);\n return <div data-dashfoo=\"dock-indicator\" style={{ ...paneStyle(zone), zIndex }} />;\n};\n\nconst PREVIEW_OFFSET: Point = { x: 12, y: 8 };\n\nconst labelOf = (source: DragSource | null): string => {\n if (typeof source?.data.label !== \"string\") {\n return \"\";\n }\n return source.data.label;\n};\n\ntype ChipState = { label: string; x: number; y: number };\n\nconst DragPreviewOverlay = ({ manager }: { manager: DashfooDragManager }): ReactNode => {\n const [chip, setChip] = useState<ChipState | null>(null);\n\n useEffect(() => {\n const handleStart = (event: DragStartEvent): void => {\n const source = event.operation.source;\n if (!source) {\n return;\n }\n const rect = source.element?.getBoundingClientRect();\n const point = event.operation.position.current;\n setChip({\n label: labelOf(source),\n x: PREVIEW_OFFSET.x + (rect ? point.x - rect.left : 0),\n y: PREVIEW_OFFSET.y + (rect ? point.y - rect.top : 0),\n });\n };\n const handleEnd = (): void => {\n setChip(null);\n };\n manager.monitor.addEventListener(\"dragstart\", handleStart);\n manager.monitor.addEventListener(\"dragend\", handleEnd);\n return () => {\n manager.monitor.removeEventListener(\"dragstart\", handleStart);\n manager.monitor.removeEventListener(\"dragend\", handleEnd);\n };\n }, [manager]);\n\n const attachOverlay = useCallback(\n (element: HTMLDivElement | null): void => {\n const feedback = manager.registry.plugins.get(Feedback);\n if (feedback) {\n feedback.overlay = element ?? undefined;\n }\n },\n [manager],\n );\n\n return (\n <div data-dnd-overlay=\"\" ref={attachOverlay}>\n {chip === null ? null : (\n <div\n data-dashfoo=\"drag-preview\"\n style={{\n left: 0,\n position: \"absolute\",\n top: 0,\n transform: `translate(${chip.x}px, ${chip.y}px)`,\n\n width: \"max-content\",\n }}\n >\n {chip.label}\n </div>\n )}\n </div>\n );\n};\n\nexport { DockIndicator, DragPreviewOverlay };\n","\"use client\";\n\nimport { dragDockMachine } from \"@dashfoo/core\";\nimport type { Data } from \"@dnd-kit/abstract\";\nimport type { DragEndEvent, DragStartEvent } from \"@dnd-kit/dom\";\nimport { useActorRef } from \"@xstate/react\";\nimport type { ReactNode } from \"react\";\nimport { useCallback, useEffect, useInsertionEffect, useMemo, useState } from \"react\";\n\nimport type { DragRootContextValue, DragScope } from \"../hooks/drag-hooks\";\nimport { createDragManager, DragRootContext, SharedDragManagerContext } from \"../hooks/drag-hooks\";\nimport { subjectFor } from \"../lib/drag-subject\";\n\nimport { DragPreviewOverlay } from \"./drag-preview-overlay\";\n\ntype ScopedTarget = { element: HTMLElement; scope: DragScope; tabsetId: string };\ntype ScopedTargetData = Data & { layerId: string; tabsetId: string };\n\nconst isScopedTargetData = (data: Data): data is ScopedTargetData =>\n typeof data.layerId === \"string\" && typeof data.tabsetId === \"string\";\n\nconst DashfooDragProvider = ({ children }: { children: ReactNode }): ReactNode => {\n const [manager] = useState(createDragManager);\n useInsertionEffect(\n () => () => {\n manager.destroy();\n },\n [manager],\n );\n\n const actorRef = useActorRef(dragDockMachine);\n\n const [scopes] = useState(() => new Map<string, DragScope>());\n const registerScope = useCallback(\n (scope: DragScope): (() => void) => {\n scopes.set(scope.layerId, scope);\n return () => {\n scopes.delete(scope.layerId);\n };\n },\n [scopes],\n );\n\n // One listener set and one actor for the whole tree: per layer, a float that\n // did not own the target resolved a null intent and swallowed the drop.\n useEffect(() => {\n const scopedTarget = (): ScopedTarget | null => {\n const target = manager.dragOperation.target;\n const data = target?.data;\n const scope = data && isScopedTargetData(data) ? scopes.get(data.layerId) : undefined;\n const element = target?.element;\n if (!scope || !data || !isScopedTargetData(data) || !(element instanceof HTMLElement)) {\n return null;\n }\n return { element, scope, tabsetId: data.tabsetId };\n };\n\n const syncIntent = (): void => {\n const operation = manager.dragOperation;\n const found = scopedTarget();\n const draggedId = operation.source ? String(operation.source.id) : undefined;\n const intent =\n found === null\n ? null\n : found.scope.resolveIntent(\n found.tabsetId,\n found.element,\n operation.position.current,\n draggedId,\n );\n actorRef.send({\n drop: intent === null || found === null ? null : { intent, scope: found.scope.layerId },\n type: \"OVER\",\n });\n };\n\n const handleStart = (event: DragStartEvent): void => {\n const source = event.operation.source;\n if (!source) {\n return;\n }\n const subject = subjectFor(source);\n if (!subject) {\n manager.actions.stop({ canceled: true });\n return;\n }\n actorRef.send({ subject, type: \"START\" });\n };\n\n // `dragmove` and `collision` both fire per frame and each resolve measures\n // the target strip. The drop path stays synchronous: a deferred resolve\n // would land after the actor had already been asked to commit.\n let frame: number | null = null;\n const scheduleResolve = (): void => {\n if (frame !== null) {\n return;\n }\n frame = requestAnimationFrame(() => {\n frame = null;\n syncIntent();\n });\n };\n const cancelPendingResolve = (): void => {\n if (frame !== null) {\n cancelAnimationFrame(frame);\n frame = null;\n }\n };\n\n const handleEnd = (event: DragEndEvent): void => {\n cancelPendingResolve();\n if (event.canceled) {\n actorRef.send({ type: \"CANCEL\" });\n return;\n }\n syncIntent();\n actorRef.send({ type: \"DROP\" });\n };\n\n const commitSubscription = actorRef.on(\"COMMIT\", (emitted) => {\n scopes.get(emitted.scope)?.commit(emitted.action);\n });\n manager.monitor.addEventListener(\"dragstart\", handleStart);\n manager.monitor.addEventListener(\"dragmove\", scheduleResolve);\n manager.monitor.addEventListener(\"collision\", scheduleResolve);\n manager.monitor.addEventListener(\"dragend\", handleEnd);\n return () => {\n cancelPendingResolve();\n commitSubscription.unsubscribe();\n manager.monitor.removeEventListener(\"dragstart\", handleStart);\n manager.monitor.removeEventListener(\"dragmove\", scheduleResolve);\n manager.monitor.removeEventListener(\"collision\", scheduleResolve);\n manager.monitor.removeEventListener(\"dragend\", handleEnd);\n };\n }, [actorRef, manager, scopes]);\n\n const rootValue = useMemo<DragRootContextValue>(\n () => ({ actorRef, manager, registerScope }),\n [actorRef, manager, registerScope],\n );\n\n return (\n <SharedDragManagerContext.Provider value={manager}>\n <DragRootContext.Provider value={rootValue}>\n {children}\n <DragPreviewOverlay manager={manager} />\n </DragRootContext.Provider>\n </SharedDragManagerContext.Provider>\n );\n};\n\nexport { DashfooDragProvider };\n","\"use client\";\n\nimport type { Action, SnapConfig, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport type { ReactNode } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { createStore, useStore } from \"zustand\";\n\ntype LayoutState = {\n closableTabs: boolean;\n dispatch: (action: Action) => void;\n draggableTabs: boolean;\n draggableTabsets: boolean;\n editable: boolean;\n\n floatable: boolean;\n keepMounted: boolean;\n maximizable: boolean;\n maximizedTabsetId: string | undefined;\n renamableTabs: boolean;\n renderTab: (tab: TabNode) => ReactNode;\n renderTabLabel: ((tab: TabNode) => ReactNode) | undefined;\n renderTabsetToolbar: ((tabset: TabsetNode) => ReactNode) | undefined;\n resizableSplits: boolean;\n\n snap: SnapConfig | null;\n splitDock: boolean;\n tabLocation: \"bottom\" | \"top\";\n tabsetMinSize: number;\n tabStripEnabled: boolean;\n};\n\ntype LayoutStore = StoreApi<LayoutState>;\n\nconst createLayoutStore = (initial: LayoutState): LayoutStore =>\n createStore<LayoutState>(() => initial);\n\nconst LayoutStoreContext = createContext<LayoutStore | null>(null);\n\nconst useLayout = <T>(selector: (state: LayoutState) => T): T => {\n const store = useContext(LayoutStoreContext);\n if (store === null) {\n throw new Error(\"dashfoo components must be rendered inside <DashfooLayout> or <Layout.Root>.\");\n }\n return useStore(store, selector);\n};\n\nexport { createLayoutStore, LayoutStoreContext, useLayout };\nexport type { LayoutState, LayoutStore };\n","\"use client\";\n\nimport type { Action, DropIntent, Point } from \"@dashfoo/core\";\nimport { resolveDockTarget, splitEdge } from \"@dashfoo/core\";\nimport type { ReactNode } from \"react\";\nimport { useCallback, useContext, useEffect, useId, useMemo, useState } from \"react\";\n\nimport type { DragContextValue, DragScope } from \"../hooks/drag-hooks\";\nimport { DragContext, DragRootContext } from \"../hooks/drag-hooks\";\nimport { LayoutStoreContext } from \"../hooks/layout-store\";\nimport { insertionIndex, pointInRect, shouldAllowDrop } from \"../lib/tab-insertion\";\nimport { warnOnce } from \"../lib/warn-once\";\n\nimport { DashfooDragProvider } from \"./dashfoo-drag-provider\";\nimport { DockIndicator } from \"./drag-preview-overlay\";\n\nconst MISSING_ROOT =\n \"[dashfoo] DashfooDragProvider unmounted while its layout is still mounted; keep the provider above the layout or remount the layout\";\n\ntype StripMeasurement = { rect: DOMRect; tabIds: Array<string>; tabRects: Array<DOMRect> };\n\n/** One DOM pass per pointer move, where resolving a drop used to run three. */\nconst measureStrip = (element: HTMLElement, excludeId?: string): StripMeasurement | null => {\n const strip = element.querySelector('[data-dashfoo=\"tabstrip\"]');\n if (!strip) {\n return null;\n }\n const tabIds: Array<string> = [];\n const tabRects: Array<DOMRect> = [];\n for (const tab of strip.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')) {\n const tabId = tab.dataset.tabId ?? \"\";\n tabIds.push(tabId);\n if (tabId !== excludeId) {\n tabRects.push(tab.getBoundingClientRect());\n }\n }\n return { rect: strip.getBoundingClientRect(), tabIds, tabRects };\n};\n\nconst intentForTabset = (\n id: string,\n element: HTMLElement,\n point: Point,\n strip: StripMeasurement | null,\n): DropIntent => {\n if (strip && pointInRect(point, strip.rect)) {\n return {\n index: insertionIndex(strip.tabRects, point.x),\n location: \"center\",\n targetId: id,\n };\n }\n const location = resolveDockTarget(point, element.getBoundingClientRect());\n if (location === \"center\" && strip) {\n return { index: strip.tabRects.length, location, targetId: id };\n }\n return { location, targetId: id };\n};\n\ntype DragProviderProps = {\n children: ReactNode;\n\n onCommit?: (action: Action) => void;\n\n splitDock?: boolean;\n};\n\n/** One drag layer (the main tree, or one float). Holds no drag state of its own. */\nconst DragScope = ({ children, onCommit, splitDock }: DragProviderProps): ReactNode => {\n const root = useContext(DragRootContext);\n const layoutStore = useContext(LayoutStoreContext);\n const layerId = useId();\n\n const manager = root?.manager;\n const getTabsetElement = useCallback(\n (id: string): HTMLElement | undefined => {\n const element = manager?.registry.droppables.get(`${layerId}:${id}`)?.element;\n return element instanceof HTMLElement ? element : undefined;\n },\n [layerId, manager],\n );\n\n const scope = useMemo<DragScope>(\n () => ({\n commit: (action) => {\n if (layoutStore?.getState().editable === false) {\n return;\n }\n const commit = onCommit ?? layoutStore?.getState().dispatch;\n if (!commit) {\n warnOnce(\n \"drag-layer-no-commit\",\n \"Layout.DragLayer has neither an onCommit prop nor a <Layout.Root> above it; drops are ignored\",\n );\n return;\n }\n commit(action);\n },\n layerId,\n resolveIntent: (targetId, element, point, draggedId) => {\n if (layoutStore?.getState().editable === false) {\n return null;\n }\n const strip = measureStrip(element, draggedId);\n if (!shouldAllowDrop(draggedId, targetId, strip?.tabIds ?? [])) {\n return null;\n }\n const intent = intentForTabset(targetId, element, point, strip);\n\n const splitDockResolved = splitDock ?? layoutStore?.getState().splitDock ?? true;\n if (!splitDockResolved && splitEdge(intent.location) !== undefined) {\n return { location: \"center\", targetId };\n }\n return intent;\n },\n }),\n [layerId, layoutStore, onCommit, splitDock],\n );\n\n const registerScope = root?.registerScope;\n useEffect(() => registerScope?.(scope), [registerScope, scope]);\n\n const contextValue = useMemo<DragContextValue | null>(\n () => (root === null ? null : { actorRef: root.actorRef, layerId, manager: root.manager }),\n [layerId, root],\n );\n\n if (contextValue === null) {\n throw new Error(MISSING_ROOT);\n }\n\n return (\n <DragContext.Provider value={contextValue}>\n {children}\n <DockIndicator actorRef={contextValue.actorRef} getTabsetElement={getTabsetElement} />\n </DragContext.Provider>\n );\n};\n\n/**\n * Mounts its own root when there is none above it. Decided on the first render:\n * a root that disappears later means a torn-down tree, which `DragScope` reports.\n */\nconst DragProvider = (props: DragProviderProps): ReactNode => {\n const hasRoot = useContext(DragRootContext) !== null;\n const [ownsRoot] = useState(() => !hasRoot);\n const layer = <DragScope {...props} />;\n\n return ownsRoot ? <DashfooDragProvider>{layer}</DashfooDragProvider> : layer;\n};\n\nexport {\n useDragSubject,\n useTabDraggable,\n useTabsetDraggable,\n useTabsetDroppable,\n} from \"../hooks/drag-hooks\";\nexport { DragProvider };\nexport type { DragProviderProps };\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\n\nconst FloatLayerContext = createContext(false);\n\nconst useHasFloatLayer = (): boolean => useContext(FloatLayerContext);\n\nexport { FloatLayerContext, useHasFloatLayer };\n","import type { CSSProperties } from \"react\";\n\nimport type { ResizeEdges } from \"../lib/float-geometry\";\n\nconst EDGE_THICKNESS = 12;\nconst EDGE_OFFSET = -(EDGE_THICKNESS / 2);\n\nconst CORNER_SIZE = 20;\nconst CORNER_OFFSET = -8;\n\nconst EDGE_INSET = CORNER_SIZE + CORNER_OFFSET;\n\nconst RESIZE_HANDLES: ReadonlyArray<{ edges: ResizeEdges; key: string; style: CSSProperties }> = [\n {\n edges: { x: 0, y: -1 },\n key: \"n\",\n style: {\n cursor: \"ns-resize\",\n height: EDGE_THICKNESS,\n insetInline: EDGE_INSET,\n top: EDGE_OFFSET,\n },\n },\n {\n edges: { x: 0, y: 1 },\n key: \"s\",\n style: {\n bottom: EDGE_OFFSET,\n cursor: \"ns-resize\",\n height: EDGE_THICKNESS,\n insetInline: EDGE_INSET,\n },\n },\n {\n edges: { x: 1, y: 0 },\n key: \"e\",\n style: {\n cursor: \"ew-resize\",\n insetBlock: EDGE_INSET,\n right: EDGE_OFFSET,\n width: EDGE_THICKNESS,\n },\n },\n {\n edges: { x: -1, y: 0 },\n key: \"w\",\n style: {\n cursor: \"ew-resize\",\n insetBlock: EDGE_INSET,\n left: EDGE_OFFSET,\n width: EDGE_THICKNESS,\n },\n },\n {\n edges: { x: 1, y: -1 },\n key: \"ne\",\n style: {\n cursor: \"nesw-resize\",\n height: CORNER_SIZE,\n right: CORNER_OFFSET,\n top: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n {\n edges: { x: -1, y: -1 },\n key: \"nw\",\n style: {\n cursor: \"nwse-resize\",\n height: CORNER_SIZE,\n left: CORNER_OFFSET,\n top: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n {\n edges: { x: 1, y: 1 },\n key: \"se\",\n style: {\n bottom: CORNER_OFFSET,\n cursor: \"nwse-resize\",\n height: CORNER_SIZE,\n right: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n {\n edges: { x: -1, y: 1 },\n key: \"sw\",\n style: {\n bottom: CORNER_OFFSET,\n cursor: \"nesw-resize\",\n height: CORNER_SIZE,\n left: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n];\n\nconst EDGE_BY_KEY = new Map<string, ResizeEdges>(RESIZE_HANDLES.map((h) => [h.key, h.edges]));\n\nexport { EDGE_BY_KEY, RESIZE_HANDLES };\n","\"use client\";\n\nimport type { Geometry } from \"@dashfoo/core\";\n\nconst MIN_WIDTH = 200;\nconst MIN_HEIGHT = 120;\n\nconst DEFAULT_WIDTH = 480;\nconst DEFAULT_HEIGHT = 340;\n\nconst LIFT_OFFSET = 16;\n\ntype Size = { height: number; width: number };\n\nconst clampToBounds = (rect: Geometry, bounds: Size, size: Size = rect): Geometry => ({\n height: rect.height,\n left: Math.max(0, Math.min(rect.left, Math.max(0, bounds.width - size.width))),\n top: Math.max(0, Math.min(rect.top, Math.max(0, bounds.height - size.height))),\n width: rect.width,\n});\n\nconst measureFloatRect = (element: Element): Geometry => {\n const tabsetElement = element.closest('[data-dashfoo=\"tabset\"]') ?? element;\n const rect = tabsetElement.getBoundingClientRect();\n const seeded: Geometry = {\n height: Math.max(MIN_HEIGHT, Math.min(Math.round(rect.height), DEFAULT_HEIGHT)),\n left: Math.round(rect.left) + LIFT_OFFSET,\n top: Math.round(rect.top) + LIFT_OFFSET,\n width: Math.max(MIN_WIDTH, Math.min(Math.round(rect.width), DEFAULT_WIDTH)),\n };\n return clampToBounds(seeded, { height: window.innerHeight, width: window.innerWidth });\n};\n\ntype ResizeEdges = { x: -1 | 0 | 1; y: -1 | 0 | 1 };\n\nconst resizeRect = (start: Geometry, edges: ResizeEdges, dx: number, dy: number): Geometry => {\n let { height, left, top, width } = start;\n if (edges.x === 1) {\n width = Math.max(MIN_WIDTH, start.width + dx);\n } else if (edges.x === -1) {\n width = Math.max(MIN_WIDTH, start.width - dx);\n left = Math.max(0, start.left + (start.width - width));\n }\n if (edges.y === 1) {\n height = Math.max(MIN_HEIGHT, start.height + dy);\n } else if (edges.y === -1) {\n height = Math.max(MIN_HEIGHT, start.height - dy);\n top = Math.max(0, start.top + (start.height - height));\n }\n return { height, left, top, width };\n};\n\nexport { clampToBounds, measureFloatRect, resizeRect };\nexport type { ResizeEdges, Size };\n","\"use client\";\n\nimport type { Geometry } from \"@dashfoo/core\";\nimport type { CSSProperties, PointerEvent as ReactPointerEvent } from \"react\";\nimport { useRef } from \"react\";\n\nimport { EDGE_BY_KEY } from \"../components/float-resize-handles\";\nimport type { ResizeEdges, Size } from \"../lib/float-geometry\";\nimport { clampToBounds, resizeRect } from \"../lib/float-geometry\";\n\nconst CHIP_SIZE: Size = { height: 34, width: 168 };\n\nconst TAP_SLOP = 4;\n\n/** `moved` and `latest` live here because they only mean anything mid-gesture. */\ntype Gesture = {\n bounds: Size;\n edges: ResizeEdges | null;\n initialStyle: Pick<CSSProperties, \"height\" | \"left\" | \"top\" | \"width\">;\n latest: Geometry;\n moved: boolean;\n pointerId: number;\n start: Geometry;\n startX: number;\n startY: number;\n};\n\ntype FloatGestureOptions = {\n editable: boolean;\n geometry: Geometry;\n minimized: boolean;\n onCommit: (geometry: Geometry) => void;\n onTap: () => void;\n};\n\ntype FloatGestureHandlers = {\n onPointerCancel: (event: ReactPointerEvent) => void;\n onPointerDown: (event: ReactPointerEvent<HTMLElement>) => void;\n onPointerMove: (event: ReactPointerEvent) => void;\n onPointerUp: (event: ReactPointerEvent) => void;\n};\n\ntype FloatGesture = {\n handlers: FloatGestureHandlers;\n ref: (element: HTMLElement | null) => void;\n style: CSSProperties;\n};\n\n/** Writes inline style and dispatches only on pointer-up: routing every move\n * through the model would re-render the whole tree behind the float. */\nconst useFloatGesture = ({\n editable,\n geometry,\n minimized,\n onCommit,\n onTap,\n}: FloatGestureOptions): FloatGesture => {\n const panelRef = useRef<HTMLElement | null>(null);\n const gestureRef = useRef<Gesture | null>(null);\n\n const setPanel = (element: HTMLElement | null): void => {\n panelRef.current = element;\n };\n\n const handlePointerDown = (event: ReactPointerEvent<HTMLElement>): void => {\n const panel = panelRef.current;\n\n if (!panel || !editable) {\n return;\n }\n\n const prior = gestureRef.current;\n if (prior && panel.hasPointerCapture?.(prior.pointerId)) {\n panel.releasePointerCapture(prior.pointerId);\n }\n const edgeKey = event.currentTarget.dataset.edge;\n\n const parent = panel.offsetParent instanceof HTMLElement ? panel.offsetParent : null;\n const rect = panel.getBoundingClientRect();\n const visibleGeometry = {\n height: minimized ? geometry.height : rect.height,\n left: rect.left,\n top: rect.top,\n width: minimized ? geometry.width : rect.width,\n };\n const gesture: Gesture = {\n bounds: { height: parent?.clientHeight ?? 0, width: parent?.clientWidth ?? 0 },\n edges: edgeKey === undefined ? null : (EDGE_BY_KEY.get(edgeKey) ?? null),\n initialStyle: {\n height: panel.style.height,\n left: panel.style.left,\n top: panel.style.top,\n width: panel.style.width,\n },\n latest: visibleGeometry,\n moved: false,\n pointerId: event.pointerId,\n start: visibleGeometry,\n startX: event.clientX,\n startY: event.clientY,\n };\n gestureRef.current = gesture;\n\n if (gesture.edges) {\n panel.setPointerCapture(event.pointerId);\n }\n };\n\n const handlePointerUp = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n if (!gesture || event.pointerId !== gesture.pointerId) {\n return;\n }\n gestureRef.current = null;\n\n const panel = panelRef.current;\n if (panel?.hasPointerCapture?.(event.pointerId) === true) {\n panel.releasePointerCapture(event.pointerId);\n }\n\n if (!gesture.moved) {\n onTap();\n return;\n }\n onCommit(gesture.latest);\n };\n\n const handlePointerMove = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n const panel = panelRef.current;\n if (!gesture || !panel || event.pointerId !== gesture.pointerId) {\n return;\n }\n\n if (event.buttons === 0) {\n handlePointerUp(event);\n return;\n }\n const dx = event.clientX - gesture.startX;\n const dy = event.clientY - gesture.startY;\n if (!gesture.moved) {\n if (Math.hypot(dx, dy) <= TAP_SLOP) {\n return;\n }\n gesture.moved = true;\n\n if (!gesture.edges) {\n panel.setPointerCapture(gesture.pointerId);\n }\n }\n const next = gesture.edges\n ? resizeRect(gesture.start, gesture.edges, dx, dy)\n : clampToBounds(\n { ...gesture.start, left: gesture.start.left + dx, top: gesture.start.top + dy },\n gesture.bounds,\n minimized ? CHIP_SIZE : undefined,\n );\n\n gesture.latest = next;\n panel.style.left = `${next.left}px`;\n panel.style.top = `${next.top}px`;\n\n if (!minimized) {\n panel.style.width = `${next.width}px`;\n panel.style.height = `${next.height}px`;\n }\n };\n\n const handlePointerCancel = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n const panel = panelRef.current;\n if (!gesture || !panel || event.pointerId !== gesture.pointerId) {\n return;\n }\n gestureRef.current = null;\n if (panel.hasPointerCapture?.(event.pointerId)) {\n panel.releasePointerCapture(event.pointerId);\n }\n if (!gesture.moved) {\n return;\n }\n Object.assign(panel.style, gesture.initialStyle);\n };\n\n return {\n handlers: {\n onPointerCancel: handlePointerCancel,\n onPointerDown: handlePointerDown,\n onPointerMove: handlePointerMove,\n onPointerUp: handlePointerUp,\n },\n ref: setPanel,\n // CSS projects saved desktop geometry into the current viewport without\n // a resize effect, hydration divergence, storage write or history entry.\n style: {\n height: minimized ? undefined : `min(${geometry.height}px, 100dvh)`,\n left: `clamp(0px, ${geometry.left}px, calc(100vw - min(${minimized ? CHIP_SIZE.width : geometry.width}px, 100vw)))`,\n top: `clamp(0px, ${geometry.top}px, calc(100dvh - min(${minimized ? CHIP_SIZE.height : geometry.height}px, 100dvh)))`,\n width: minimized ? undefined : `min(${geometry.width}px, 100vw)`,\n },\n };\n};\n\nexport { useFloatGesture };\nexport type { FloatGesture, FloatGestureOptions };\n","\"use client\";\n\nimport type { FocusEvent, KeyboardEvent, RefObject } from \"react\";\nimport { useEffect, useRef } from \"react\";\n\ntype InlineRenameOptions = {\n currentName: string;\n inputRef: RefObject<HTMLInputElement | null>;\n onCommit: (name: string) => void;\n onDone: () => void;\n};\n\ntype InlineRename = {\n handleBlur: (event: FocusEvent<HTMLInputElement>) => void;\n handleKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;\n};\n\nconst useInlineRename = ({\n currentName,\n inputRef,\n onCommit,\n onDone,\n}: InlineRenameOptions): InlineRename => {\n const done = useRef(false);\n\n useEffect(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, [inputRef]);\n\n const commit = (value: string): void => {\n const trimmed = value.trim();\n if (trimmed && trimmed !== currentName) {\n onCommit(trimmed);\n }\n onDone();\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>): void => {\n if (event.key === \"Enter\") {\n done.current = true;\n commit(event.currentTarget.value);\n } else if (event.key === \"Escape\") {\n done.current = true;\n onDone();\n }\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>): void => {\n if (done.current) {\n return;\n }\n done.current = true;\n commit(event.currentTarget.value);\n };\n\n return { handleBlur, handleKeyDown };\n};\n\nexport { useInlineRename };\n","import type { CSSProperties, ReactNode } from \"react\";\n\nconst iconStyle: CSSProperties = { pointerEvents: \"none\" };\n\nconst Icon = ({ children }: { children: ReactNode }): ReactNode => (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"12\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n style={iconStyle}\n viewBox=\"0 0 24 24\"\n width=\"12\"\n >\n {children}\n </svg>\n);\n\nconst CloseIcon = (): ReactNode => (\n <Icon>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </Icon>\n);\n\nconst GripIcon = (): ReactNode => (\n <Icon>\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"19\" cy=\"5\" r=\"1\" />\n <circle cx=\"5\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n <circle cx=\"19\" cy=\"19\" r=\"1\" />\n <circle cx=\"5\" cy=\"19\" r=\"1\" />\n </Icon>\n);\n\nconst MaximizeIcon = ({ maximized }: { maximized: boolean }): ReactNode =>\n maximized ? (\n <Icon>\n <path d=\"m14 10 7-7\" />\n <path d=\"M20 10h-6V4\" />\n <path d=\"m3 21 7-7\" />\n <path d=\"M4 14h6v6\" />\n </Icon>\n ) : (\n <Icon>\n <path d=\"M15 3h6v6\" />\n <path d=\"m21 3-7 7\" />\n <path d=\"m3 21 7-7\" />\n <path d=\"M9 21H3v-6\" />\n </Icon>\n );\n\nconst FloatIcon = (): ReactNode => (\n <Icon>\n <rect height=\"14\" rx=\"2\" width=\"18\" x=\"3\" y=\"6\" />\n <path d=\"M3 10h18\" />\n </Icon>\n);\n\nconst MinimizeIcon = (): ReactNode => (\n <Icon>\n <path d=\"M5 12h14\" />\n </Icon>\n);\n\nconst DockIcon = (): ReactNode => (\n <Icon>\n <path d=\"M3 7V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-2\" />\n <path d=\"M11 8 7 12l4 4\" />\n <path d=\"M7 12h10\" />\n </Icon>\n);\n\nexport { CloseIcon, DockIcon, FloatIcon, GripIcon, MaximizeIcon, MinimizeIcon };\n","\"use client\";\n\nimport type { Action, Dashfoo, SnapConfig, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport type { ComponentProps, CSSProperties, ReactNode, Ref } from \"react\";\nimport { useLayoutEffect, useState } from \"react\";\n\nimport type { LayoutState } from \"../hooks/layout-store\";\nimport { createLayoutStore, LayoutStoreContext, useLayout } from \"../hooks/layout-store\";\n\nconst DEFAULT_TABSET_MIN_SIZE = 320;\n\nconst rootStyle = { display: \"flex\", height: \"100%\", position: \"relative\", width: \"100%\" } as const;\n\ntype LayoutRootProps = Omit<ComponentProps<\"div\">, \"children\"> & {\n children: ReactNode;\n closableTabs?: boolean;\n dispatch: (action: Action) => void;\n draggableTabs?: boolean;\n draggableTabsets?: boolean;\n\n editable?: boolean;\n\n floatable?: boolean;\n keepMounted?: boolean;\n maximizable?: boolean;\n model: Dashfoo;\n renamableTabs?: boolean;\n renderers: LayoutRenderers;\n resizableSplits?: boolean;\n\n /** When false, the tree itself is frozen: no dragging, splitting or floating. Tabs stay closable and renamable. */\n restructurable?: boolean;\n\n rootRef?: Ref<HTMLDivElement>;\n\n snap?: SnapConfig;\n};\n\ntype LayoutRenderers = {\n tab: (tab: TabNode) => ReactNode;\n tabLabel?: (tab: TabNode) => ReactNode;\n tabsetToolbar?: (tabset: TabsetNode) => ReactNode;\n};\n\ntype LayoutStyle = CSSProperties & { \"--dashfoo-splitter-size\"?: string };\n\ntype CapabilityOptions = Required<\n Pick<\n LayoutRootProps,\n | \"closableTabs\"\n | \"draggableTabs\"\n | \"draggableTabsets\"\n | \"editable\"\n | \"floatable\"\n | \"maximizable\"\n | \"renamableTabs\"\n | \"resizableSplits\"\n | \"restructurable\"\n >\n>;\n\nconst resolveCapabilities = (global: Dashfoo[\"global\"], options: CapabilityOptions) => {\n const structural = options.editable && options.restructurable;\n return {\n closableTabs: options.editable && options.closableTabs && global.tabEnableClose !== false,\n draggableTabs: structural && options.draggableTabs && global.tabEnableDrag !== false,\n draggableTabsets: structural && options.draggableTabsets,\n floatable: structural && options.floatable,\n maximizable: options.maximizable && global.tabSetEnableMaximize !== false,\n renamableTabs: options.editable && options.renamableTabs && global.tabEnableRename !== false,\n resizableSplits: structural && options.resizableSplits && global.enableSplitResize !== false,\n };\n};\n\nconst LayoutRoot = ({\n children,\n closableTabs = true,\n dispatch,\n draggableTabs = true,\n draggableTabsets = true,\n editable = true,\n floatable = false,\n keepMounted = false,\n maximizable = true,\n model,\n renamableTabs = true,\n renderers,\n resizableSplits = true,\n restructurable = true,\n rootRef,\n snap,\n style,\n ...props\n}: LayoutRootProps): ReactNode => {\n const global = model.global;\n const snapshot: LayoutState = {\n ...resolveCapabilities(global, {\n closableTabs,\n draggableTabs,\n draggableTabsets,\n editable,\n floatable,\n maximizable,\n renamableTabs,\n resizableSplits,\n restructurable,\n }),\n dispatch,\n editable,\n keepMounted,\n maximizedTabsetId: model.maximizedTabsetId,\n renderTab: renderers.tab,\n renderTabLabel: renderers.tabLabel,\n renderTabsetToolbar: renderers.tabsetToolbar,\n snap: snap ?? global.snap ?? null,\n splitDock: global.enableSplitDock !== false,\n tabLocation: global.tabLocation ?? \"top\",\n tabsetMinSize: global.tabSetMinSize ?? DEFAULT_TABSET_MIN_SIZE,\n tabStripEnabled: global.tabSetEnableTabStrip !== false,\n };\n\n const [store] = useState(() => createLayoutStore(snapshot));\n\n useLayoutEffect(() => {\n store.setState(snapshot);\n });\n\n const layoutStyle: LayoutStyle = { ...rootStyle, ...style };\n if (global.splitterSize !== undefined) {\n layoutStyle[\"--dashfoo-splitter-size\"] = `${global.splitterSize}px`;\n }\n\n return (\n <LayoutStoreContext.Provider value={store}>\n <div {...props} data-dashfoo=\"layout\" ref={rootRef} style={layoutStyle}>\n {children}\n </div>\n </LayoutStoreContext.Provider>\n );\n};\n\ntype LayoutOverridesProps = {\n children: ReactNode;\n overrides: Partial<LayoutState>;\n};\n\n/**\n * Republishes the parent store with overrides applied rather than re-deriving\n * flags, so anything the parent changes keeps flowing into the subtree.\n */\nconst LayoutOverrides = ({ children, overrides }: LayoutOverridesProps): ReactNode => {\n const parentState = useLayout((state) => state);\n const snapshot: LayoutState = { ...parentState, ...overrides };\n\n const [store] = useState(() => createLayoutStore(snapshot));\n\n useLayoutEffect(() => {\n store.setState(snapshot);\n });\n\n return (\n <LayoutStoreContext.Provider value={store}>\n <div data-dashfoo=\"layout\" style={rootStyle}>\n {children}\n </div>\n </LayoutStoreContext.Provider>\n );\n};\n\nexport { LayoutOverrides, LayoutRoot };\nexport type { LayoutOverridesProps, LayoutRenderers, LayoutRootProps };\n","\"use client\";\n\nimport type { RowNode, SnapGrid } from \"@dashfoo/core\";\nimport { decideSnap, settleSnap } from \"@dashfoo/core\";\nimport type { RefObject } from \"react\";\nimport { useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type { GroupImperativeHandle, Layout, LayoutChangedMeta } from \"react-resizable-panels\";\n\nconst WEIGHT_EPSILON = 0.01;\n\ntype RowChildren = RowNode[\"children\"];\n\n/** `syncing` covers this hook's own writes: the group echoes an imperative\n * `setLayout` back synchronously, and that echo is not user input. */\ntype ResizeState =\n | { kind: \"idle\" }\n | { kind: \"syncing\" }\n | { boundary: number; kind: \"dragging\" }\n | { boundary: number; kind: \"snapped\" };\n\nconst IDLE: ResizeState = { kind: \"idle\" };\n\nconst boundaryOf = (state: ResizeState): number | null =>\n state.kind === \"dragging\" || state.kind === \"snapped\" ? state.boundary : null;\n\nconst snappedBoundaryOf = (state: ResizeState): number | null =>\n state.kind === \"snapped\" ? state.boundary : null;\n\nconst layoutFromWeights = (children: RowChildren): Layout => {\n const total = children.reduce((sum, child) => sum + child.weight, 0);\n return children.reduce<Layout>((layout, child) => {\n layout[child.id] = (child.weight / total) * 100;\n return layout;\n }, {});\n};\n\nconst orderedFromLayout = (layout: Layout, children: RowChildren): Array<number> =>\n children.map((child) => layout[child.id] ?? 0);\n\nconst layoutFromOrdered = (sizes: Array<number>, children: RowChildren): Layout =>\n children.reduce<Layout>((layout, child, index) => {\n layout[child.id] = sizes[index] ?? 0;\n return layout;\n }, {});\n\nconst layoutsMatch = (current: Layout, expected: Layout): boolean => {\n const currentIds = Object.keys(current);\n const expectedIds = Object.keys(expected);\n if (currentIds.length !== expectedIds.length) {\n return false;\n }\n return expectedIds.every(\n (id) => Math.abs((current[id] ?? Number.NaN) - expected[id]) <= WEIGHT_EPSILON,\n );\n};\n\ntype SnapResizeOptions = {\n children: RowChildren;\n onWeightsSettled: (weights: Array<number>) => void;\n resizableSplits: boolean;\n snap: SnapGrid;\n};\n\ntype SnapResize = {\n beginBoundaryDrag: (boundary: number) => void;\n groupRef: RefObject<GroupImperativeHandle | null>;\n onLayoutChange: (layout: Layout) => void;\n onLayoutChanged: (layout: Layout, meta: LayoutChangedMeta) => void;\n snappedBoundary: number | null;\n};\n\nconst useSnapResize = ({\n children,\n onWeightsSettled,\n resizableSplits,\n snap,\n}: SnapResizeOptions): SnapResize => {\n const groupRef = useRef<GroupImperativeHandle | null>(null);\n const state = useRef<ResizeState>(IDLE);\n const [snappedBoundary, setSnappedBoundary] = useState<number | null>(null);\n\n const transition = useCallback((next: ResizeState): void => {\n state.current = next;\n setSnappedBoundary(snappedBoundaryOf(next));\n }, []);\n\n const desiredLayout = useMemo(() => layoutFromWeights(children), [children]);\n\n useLayoutEffect(() => {\n const group = groupRef.current;\n if (!group) {\n return undefined;\n }\n const current = group.getLayout();\n const samePanelSet =\n Object.keys(current).length === Object.keys(desiredLayout).length &&\n Object.keys(desiredLayout).every((id) => id in current);\n if (!samePanelSet || layoutsMatch(current, desiredLayout)) {\n return undefined;\n }\n\n transition({ kind: \"syncing\" });\n group.setLayout(desiredLayout);\n const frame = requestAnimationFrame(() => {\n transition(IDLE);\n });\n return () => {\n cancelAnimationFrame(frame);\n transition(IDLE);\n };\n }, [desiredLayout, transition]);\n\n const onLayoutChange = (layout: Layout): void => {\n if (state.current.kind === \"syncing\" || !resizableSplits) {\n return;\n }\n const boundary = boundaryOf(state.current);\n if (boundary === null) {\n return;\n }\n\n const decision = decideSnap(orderedFromLayout(layout, children), boundary, snap);\n if (decision.kind === \"inactive\") {\n return;\n }\n if (decision.kind === \"clear\") {\n transition({ boundary, kind: \"dragging\" });\n return;\n }\n\n transition({ boundary, kind: \"snapped\" });\n const group = groupRef.current;\n const target = layoutFromOrdered(decision.sizes, children);\n if (!group || layoutsMatch(layout, target)) {\n return;\n }\n transition({ kind: \"syncing\" });\n group.setLayout(target);\n transition({ boundary, kind: \"snapped\" });\n };\n\n const onLayoutChanged = (layout: Layout, meta: LayoutChangedMeta): void => {\n if (!meta.isUserInteraction) {\n return;\n }\n if (state.current.kind === \"syncing\") {\n return;\n }\n const boundary = boundaryOf(state.current);\n transition(IDLE);\n\n if (!resizableSplits) {\n return;\n }\n const weights = settleSnap(\n children.map((child) => layout[child.id] ?? child.weight),\n boundary,\n snap,\n );\n const weightsChanged = weights.some((weight, index) => {\n const child = children[index];\n return child !== undefined && Math.abs(weight - child.weight) > WEIGHT_EPSILON;\n });\n if (!weightsChanged) {\n return;\n }\n\n onWeightsSettled(weights);\n };\n\n const beginBoundaryDrag = (boundary: number): void => {\n transition({ boundary, kind: \"dragging\" });\n };\n\n return { beginBoundaryDrag, groupRef, onLayoutChange, onLayoutChanged, snappedBoundary };\n};\n\nexport { useSnapResize };\nexport type { SnapResize, SnapResizeOptions };\n","const tabDomId = (tabsetId: string, tabId: string): string => `dashfoo-tab-${tabsetId}-${tabId}`;\nconst panelDomId = (tabsetId: string): string => `dashfoo-panel-${tabsetId}`;\n\nexport { panelDomId, tabDomId };\n","\"use client\";\n\nimport type { Action, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport { createContext, useContext } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { createStore, useStore } from \"zustand\";\n\nimport { tabDomId } from \"../../lib/tab-ids\";\nimport { warnOnce } from \"../../lib/warn-once\";\nimport type { OverflowItem } from \"../tab-overflow-menu\";\n\ntype TabsetState = {\n activeTab: TabNode | undefined;\n cancelRename: () => void;\n closeTab: (tabId: string) => void;\n commitRename: (tabId: string, value: string) => void;\n dispatch: (action: Action) => void;\n editingTabId: string | null;\n isMaximized: boolean;\n node: TabsetNode;\n overflowItems: Array<OverflowItem>;\n /** The tab a `closeTab` is waiting on, so a vetoed close cannot restore focus. */\n pendingCloseTabId: string | null;\n registerRenameInput: () => () => void;\n registerTablist: (element: HTMLDivElement | null) => void;\n renameInputCount: number;\n renameTab: (tabId: string, name: string) => void;\n selectOverflowTab: (tabId: string) => void;\n selectTab: (index: number, options?: { focus?: boolean }) => void;\n showMaximize: boolean;\n startEditing: (tabId: string) => void;\n tablistElement: HTMLDivElement | null;\n tabsClosable: boolean;\n tabsRenamable: boolean;\n toggleMaximize: () => void;\n visualSelected: number;\n};\n\ntype TabsetStore = StoreApi<TabsetState>;\n\ntype TabsetSnapshot = Pick<\n TabsetState,\n | \"activeTab\"\n | \"dispatch\"\n | \"isMaximized\"\n | \"node\"\n | \"showMaximize\"\n | \"tabsClosable\"\n | \"tabsRenamable\"\n | \"visualSelected\"\n>;\n\nconst tabButtonIn = (\n scope: HTMLElement | null,\n tabsetId: string,\n tabId: string,\n): HTMLElement | null =>\n scope?.querySelector<HTMLElement>(`#${CSS.escape(tabDomId(tabsetId, tabId))}`) ?? null;\n\nconst createTabsetStore = (initial: TabsetSnapshot): TabsetStore =>\n createStore<TabsetState>((set, get) => ({\n ...initial,\n cancelRename: () => {\n set({ editingTabId: null });\n },\n closeTab: (tabId) => {\n set({ pendingCloseTabId: tabId });\n get().dispatch({ tabId, type: \"deleteTab\" });\n },\n commitRename: (tabId, value) => {\n set({ editingTabId: null });\n const { node, renameTab } = get();\n const trimmed = value.trim();\n const current = node.children.find((tab) => tab.id === tabId)?.name;\n if (trimmed && trimmed !== current) {\n renameTab(tabId, trimmed);\n }\n },\n editingTabId: null,\n overflowItems: [],\n pendingCloseTabId: null,\n registerRenameInput: () => {\n set((state) => ({ renameInputCount: state.renameInputCount + 1 }));\n return () => {\n set((state) => ({ renameInputCount: state.renameInputCount - 1 }));\n };\n },\n registerTablist: (element) => {\n if (element) {\n const current = get().tablistElement;\n if (current && current !== element) {\n warnOnce(\n `duplicate-tablist-${get().node.id}`,\n \"more than one <Tabset.Tablist> under the same <Tabset.Root>; the last one wins for keyboard focus and overflow\",\n );\n }\n set({ tablistElement: element });\n return;\n }\n set({ tablistElement: null });\n },\n renameInputCount: 0,\n renameTab: (tabId, name) => {\n get().dispatch({ name, tabId, type: \"renameTab\" });\n },\n selectOverflowTab: (tabId) => {\n const { dispatch, node, tablistElement } = get();\n const index = node.children.findIndex((tab) => tab.id === tabId);\n if (index === -1) {\n return;\n }\n dispatch({ index, tabsetId: node.id, type: \"selectTab\" });\n tabButtonIn(tablistElement, node.id, tabId)?.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n });\n },\n selectTab: (index, options) => {\n const { dispatch, node, tablistElement } = get();\n dispatch({ index, tabsetId: node.id, type: \"selectTab\" });\n if (options?.focus === true) {\n const tabId = node.children[index]?.id;\n if (tabId) {\n tabButtonIn(tablistElement, node.id, tabId)?.focus();\n }\n }\n },\n startEditing: (tabId) => {\n const { node, renameInputCount, tabsRenamable } = get();\n const tab = node.children.find((child) => child.id === tabId);\n if (!tabsRenamable || tab?.enableRename === false) {\n return;\n }\n if (renameInputCount === 0) {\n warnOnce(\n `missing-rename-input-${node.id}`,\n \"startEditing needs a <Tabset.RenameInput> in the composition; ignoring\",\n );\n return;\n }\n set({ editingTabId: tabId });\n },\n tablistElement: null,\n toggleMaximize: () => {\n const { dispatch, isMaximized, node } = get();\n dispatch({ tabsetId: isMaximized ? null : node.id, type: \"setMaximizedTabset\" });\n },\n }));\n\nconst TabsetStoreContext = createContext<TabsetStore | null>(null);\n\nconst useTabset = <T>(selector: (state: TabsetState) => T): T => {\n const store = useContext(TabsetStoreContext);\n if (store === null) {\n throw new Error(\"dashfoo Tabset parts must be rendered inside <Tabset.Root>.\");\n }\n return useStore(store, selector);\n};\n\ntype TabContextValue = { index: number; tab: TabNode };\n\nconst TabContext = createContext<TabContextValue | null>(null);\n\nconst useTab = (): TabContextValue => {\n const value = useContext(TabContext);\n if (value === null) {\n throw new Error(\"dashfoo tab parts must be rendered inside <Tabset.Tab>.\");\n }\n return value;\n};\n\nexport { createTabsetStore, TabContext, TabsetStoreContext, useTab, useTabset };\nexport type { TabContextValue, TabsetSnapshot, TabsetState, TabsetStore };\n","\"use client\";\n\nimport type { TabNode } from \"@dashfoo/core\";\nimport type { ComponentProps, CSSProperties, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { panelDomId, tabDomId } from \"../../lib/tab-ids\";\n\nimport { useTabset } from \"./tabset-store\";\n\nconst contentStyle: CSSProperties = { flex: 1, minHeight: 0, overflow: \"auto\" };\n\nconst TabPanel = ({\n render,\n tab,\n}: {\n render?: (tab: TabNode) => ReactNode;\n tab: TabNode;\n}): ReactNode => {\n const renderTab = useLayout((state) => state.renderTab);\n return render ? render(tab) : renderTab(tab);\n};\n\ntype TabsetContentProps = Omit<ComponentProps<\"div\">, \"children\"> & {\n children?: (tab: TabNode) => ReactNode;\n};\n\nconst TabsetContent = forwardRef<HTMLDivElement, TabsetContentProps>(\n ({ children, style, ...props }, ref): ReactNode => {\n const node = useTabset((state) => state.node);\n const editingTabId = useTabset((state) => state.editingTabId);\n const visualSelected = useTabset((state) => state.visualSelected);\n const keepMounted = useLayout((state) => state.keepMounted);\n\n const mergedStyle = { ...contentStyle, ...style };\n\n if (keepMounted && node.children.length > 0) {\n return node.children.map((tab, index) => (\n <div\n {...props}\n aria-label={editingTabId === tab.id ? tab.name : undefined}\n aria-labelledby={editingTabId === tab.id ? undefined : tabDomId(node.id, tab.id)}\n data-dashfoo=\"tabcontent\"\n hidden={index !== visualSelected || undefined}\n id={index === visualSelected ? panelDomId(node.id) : undefined}\n key={tab.id}\n ref={index === visualSelected ? ref : undefined}\n role={index === visualSelected ? \"tabpanel\" : undefined}\n style={mergedStyle}\n tabIndex={index === visualSelected ? 0 : undefined}\n >\n <TabPanel render={children} tab={tab} />\n </div>\n ));\n }\n\n const active = node.children[visualSelected];\n // oxlint-disable-next-line typescript/strict-boolean-expressions -- visualSelected is -1 while the tabset's only tab is dragged out, so this lookup really is undefined despite the non-optional type; `.at()` would wrongly resolve -1 to the last tab.\n if (active) {\n return (\n <div\n {...props}\n aria-label={editingTabId === active.id ? active.name : undefined}\n aria-labelledby={editingTabId === active.id ? undefined : tabDomId(node.id, active.id)}\n data-dashfoo=\"tabcontent\"\n id={panelDomId(node.id)}\n ref={ref}\n role=\"tabpanel\"\n style={mergedStyle}\n tabIndex={0}\n >\n <TabPanel render={children} tab={active} />\n </div>\n );\n }\n return <div {...props} data-dashfoo=\"tabcontent\" ref={ref} style={mergedStyle} />;\n },\n);\n\nTabsetContent.displayName = \"TabsetContent\";\n\nexport { TabsetContent };\nexport type { TabsetContentProps };\n","\"use client\";\n\nimport type { CSSProperties, FocusEvent, KeyboardEvent, ReactNode } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\n\nconst OverflowIcon = (): ReactNode => (\n <svg aria-hidden=\"true\" fill=\"currentColor\" height=\"10\" viewBox=\"0 0 10 10\" width=\"10\">\n <circle cx=\"2\" cy=\"5\" r=\"1\" />\n <circle cx=\"5\" cy=\"5\" r=\"1\" />\n <circle cx=\"8\" cy=\"5\" r=\"1\" />\n </svg>\n);\n\nconst menuStyle: CSSProperties = {\n position: \"absolute\",\n right: 0,\n top: \"100%\",\n zIndex: 10,\n};\n\ntype OverflowItem = { id: string; name: string };\n\nconst TabOverflowMenu = ({\n items,\n onSelect,\n}: {\n items: Array<OverflowItem>;\n onSelect: (id: string) => void;\n}): ReactNode => {\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(0);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n useEffect(() => {\n if (!open) {\n return undefined;\n }\n const handlePointerDown = (event: PointerEvent): void => {\n if (event.target instanceof Node && rootRef.current?.contains(event.target) !== true) {\n setOpen(false);\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [open]);\n\n useEffect(() => {\n if (open) {\n itemRefs.current[0]?.focus();\n }\n }, [open]);\n\n const closeAndReturnFocus = (): void => {\n setOpen(false);\n triggerRef.current?.focus();\n };\n\n const focusItem = (index: number): void => {\n setActiveIndex(index);\n itemRefs.current[index]?.focus();\n };\n\n const handleToggle = (): void => {\n setActiveIndex(0);\n setOpen((value) => !value);\n };\n\n const handleSelect = (id: string): void => {\n onSelect(id);\n closeAndReturnFocus();\n };\n\n const handleMenuKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n const last = items.length - 1;\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n focusItem(activeIndex >= last ? 0 : activeIndex + 1);\n break;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n focusItem(activeIndex <= 0 ? last : activeIndex - 1);\n break;\n }\n case \"Home\": {\n event.preventDefault();\n focusItem(0);\n break;\n }\n case \"End\": {\n event.preventDefault();\n focusItem(last);\n break;\n }\n case \"Escape\": {\n event.preventDefault();\n closeAndReturnFocus();\n break;\n }\n default: {\n break;\n }\n }\n };\n\n const handleFocusOut = (event: FocusEvent<HTMLDivElement>): void => {\n if (\n event.relatedTarget instanceof Node &&\n rootRef.current?.contains(event.relatedTarget) === true\n ) {\n return;\n }\n setOpen(false);\n };\n\n return (\n <div data-dashfoo=\"tab-overflow-root\" ref={rootRef} style={{ position: \"relative\" }}>\n <button\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-label=\"More tabs\"\n data-dashfoo=\"tab-overflow\"\n onClick={handleToggle}\n ref={triggerRef}\n title=\"More tabs\"\n type=\"button\"\n >\n <OverflowIcon />\n </button>\n {open ? (\n <div\n data-dashfoo=\"tab-overflow-menu\"\n onBlur={handleFocusOut}\n onKeyDown={handleMenuKeyDown}\n role=\"menu\"\n style={menuStyle}\n tabIndex={-1}\n >\n {items.map((item, index) => (\n <button\n data-dashfoo=\"tab-overflow-item\"\n key={item.id}\n onClick={() => {\n handleSelect(item.id);\n }}\n ref={(node) => {\n itemRefs.current[index] = node;\n }}\n role=\"menuitem\"\n tabIndex={index === activeIndex ? 0 : -1}\n type=\"button\"\n >\n {item.name}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n );\n};\n\nexport { TabOverflowMenu };\nexport type { OverflowItem };\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport { TabOverflowMenu } from \"../tab-overflow-menu\";\n\nimport { useTabset } from \"./tabset-store\";\n\nconst TabsetOverflowMenu = (): ReactNode => {\n const overflowItems = useTabset((state) => state.overflowItems);\n const selectOverflowTab = useTabset((state) => state.selectOverflowTab);\n\n if (overflowItems.length === 0) {\n return null;\n }\n return <TabOverflowMenu items={overflowItems} onSelect={selectOverflowTab} />;\n};\n\nexport { TabsetOverflowMenu };\n","import type { Ref } from \"react\";\n\nconst applyRef = <T>(ref: Ref<T> | undefined, value: T | null): void => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n};\n\nconst mergeRefs =\n <T>(...refs: Array<Ref<T> | undefined>) =>\n (value: T | null): void => {\n for (const ref of refs) {\n applyRef(ref, value);\n }\n };\n\nexport { mergeRefs };\n","\"use client\";\n\nimport type { ComponentProps, FocusEvent, KeyboardEvent, MouseEvent, ReactNode } from \"react\";\nimport { forwardRef, useEffect, useMemo, useRef } from \"react\";\n\nimport { useInlineRename } from \"../../hooks/use-inline-rename\";\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { CloseIcon } from \"../close-icon\";\n\nimport { useTab, useTabset } from \"./tabset-store\";\n\ntype TabsetRenameInputProps = ComponentProps<\"input\">;\n\nconst RenameEditor = forwardRef<HTMLInputElement, TabsetRenameInputProps>(\n (\n {\n defaultValue,\n onBlur,\n onKeyDown,\n\n ...props\n },\n userRef,\n ): ReactNode => {\n const { tab } = useTab();\n const cancelRename = useTabset((state) => state.cancelRename);\n const commitRename = useTabset((state) => state.commitRename);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const rename = useInlineRename({\n currentName: tab.name,\n inputRef,\n onCommit: (name) => {\n commitRename(tab.id, name);\n },\n onDone: cancelRename,\n });\n const refCallback = useMemo(() => mergeRefs<HTMLInputElement>(inputRef, userRef), [userRef]);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>): void => {\n onKeyDown?.(event);\n rename.handleKeyDown(event);\n };\n\n const handleCommitOnBlur = (event: FocusEvent<HTMLInputElement>): void => {\n onBlur?.(event);\n rename.handleBlur(event);\n };\n\n return (\n <input\n aria-label={`Rename ${tab.name}`}\n {...props}\n data-dashfoo=\"tab-rename\"\n defaultValue={defaultValue ?? tab.name}\n onBlur={handleCommitOnBlur}\n onKeyDown={handleKeyDown}\n ref={refCallback}\n type=\"text\"\n />\n );\n },\n);\n\nRenameEditor.displayName = \"RenameEditor\";\n\nconst TabsetRenameInput = forwardRef<HTMLInputElement, TabsetRenameInputProps>(\n (props, ref): ReactNode => {\n const { tab } = useTab();\n const editing = useTabset((state) => state.editingTabId === tab.id);\n const registerRenameInput = useTabset((state) => state.registerRenameInput);\n\n useEffect(() => registerRenameInput(), [registerRenameInput]);\n\n if (!editing) {\n return null;\n }\n return <RenameEditor {...props} ref={ref} />;\n },\n);\n\nTabsetRenameInput.displayName = \"TabsetRenameInput\";\n\ntype TabsetCloseButtonProps = ComponentProps<\"button\">;\n\nconst TabsetCloseButton = forwardRef<HTMLButtonElement, TabsetCloseButtonProps>(\n ({ children, onClick, ...props }, ref): ReactNode => {\n const { index, tab } = useTab();\n const closeTab = useTabset((state) => state.closeTab);\n const editing = useTabset((state) => state.editingTabId === tab.id);\n const tabsClosable = useTabset((state) => state.tabsClosable);\n const visualSelected = useTabset((state) => state.visualSelected);\n\n const closable = tabsClosable && tab.enableClose !== false;\n if (!closable || editing) {\n return null;\n }\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n\n event.stopPropagation();\n closeTab(tab.id);\n };\n\n return (\n <button\n aria-label={`Close ${tab.name}`}\n title={`Close ${tab.name}`}\n {...props}\n data-dashfoo=\"tab-close\"\n onClick={handleClick}\n ref={ref}\n tabIndex={index === visualSelected ? 0 : -1}\n type=\"button\"\n >\n {children ?? <CloseIcon />}\n </button>\n );\n },\n);\n\nTabsetCloseButton.displayName = \"TabsetCloseButton\";\n\nexport { RenameEditor, TabsetCloseButton, TabsetRenameInput };\nexport type { TabsetCloseButtonProps, TabsetRenameInputProps };\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst overflowingIds = (tablist: Element): Array<string> => {\n const box = tablist.getBoundingClientRect();\n return [...tablist.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')].flatMap((tab) => {\n const rect = tab.getBoundingClientRect();\n const clipped = rect.right > box.right + 1 || rect.left < box.left - 1;\n const tabId = tab.dataset.tabId;\n return clipped && tabId !== undefined && tabId !== \"\" ? [tabId] : [];\n });\n};\n\nconst sameIds = (a: Array<string>, b: Array<string>): boolean =>\n a.length === b.length && a.every((id, index) => id === b[index]);\n\nconst useTabOverflow = (tablist: HTMLElement | null, signature: string): Array<string> => {\n const [overflow, setOverflow] = useState<Array<string>>([]);\n\n useEffect(() => {\n // Fires per frame while an overflowing strip scrolls, so an unchanged set\n // has to keep its array identity or the tabset re-renders throughout.\n const recompute = (): void => {\n setOverflow((previous) => {\n const next = tablist ? overflowingIds(tablist) : [];\n return sameIds(previous, next) ? previous : next;\n });\n };\n recompute();\n if (!tablist) {\n return undefined;\n }\n const observer = new ResizeObserver(recompute);\n observer.observe(tablist);\n\n tablist.addEventListener(\"scroll\", recompute, { passive: true });\n return () => {\n observer.disconnect();\n tablist.removeEventListener(\"scroll\", recompute);\n };\n }, [tablist, signature]);\n\n return overflow;\n};\n\nexport { overflowingIds, useTabOverflow };\n","const fallbackSelectedIndex = (count: number, removedIndex: number): number =>\n removedIndex + 1 < count ? removedIndex + 1 : removedIndex - 1;\n\nexport { fallbackSelectedIndex };\n","\"use client\";\n\nimport type { TabsetNode } from \"@dashfoo/core\";\nimport type { ComponentProps, CSSProperties, ReactNode } from \"react\";\nimport { forwardRef, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { useStore } from \"zustand\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { useTabOverflow } from \"../../hooks/use-tab-overflow\";\nimport { tabDomId } from \"../../lib/tab-ids\";\nimport { fallbackSelectedIndex } from \"../../lib/tab-selection\";\nimport { useDragSubject, useTabsetDroppable } from \"../drag-provider\";\n\nimport type { TabsetSnapshot } from \"./tabset-store\";\nimport { createTabsetStore, TabsetStoreContext } from \"./tabset-store\";\n\nconst tabsetStyle: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n minHeight: 0,\n minWidth: 0,\n width: \"100%\",\n};\n\ntype TabsetRootProps = ComponentProps<\"div\"> & { node: TabsetNode };\n\nconst TabsetRoot = forwardRef<HTMLDivElement, TabsetRootProps>(\n (\n {\n children,\n node,\n\n style,\n ...props\n },\n userRef,\n ): ReactNode => {\n const closableTabs = useLayout((state) => state.closableTabs);\n const dispatch = useLayout((state) => state.dispatch);\n const maximizable = useLayout((state) => state.maximizable);\n const maximizedTabsetId = useLayout((state) => state.maximizedTabsetId);\n const renamableTabs = useLayout((state) => state.renamableTabs);\n const tabLocation = useLayout((state) => state.tabLocation);\n\n const { ref } = useTabsetDroppable(node.id);\n const dragSubject = useDragSubject();\n const tabsetRef = useRef<HTMLDivElement | null>(null);\n\n const isMaximized = maximizedTabsetId === node.id;\n const showMaximize = maximizable && node.enableMaximize !== false;\n const tabsClosable = closableTabs && node.enableClose !== false;\n\n const tabsRenamable = renamableTabs;\n\n const draggingTabIndex =\n dragSubject?.kind === \"tab\"\n ? node.children.findIndex((tab) => tab.id === dragSubject.id)\n : -1;\n const visualSelected =\n draggingTabIndex !== -1 && draggingTabIndex === node.selected\n ? fallbackSelectedIndex(node.children.length, draggingTabIndex)\n : node.selected;\n const activeTab = node.children[visualSelected];\n const isDragSource = dragSubject?.kind === \"tabset\" && dragSubject.id === node.id;\n\n const snapshot: TabsetSnapshot = {\n activeTab,\n dispatch,\n isMaximized,\n node,\n showMaximize,\n tabsClosable,\n tabsRenamable,\n visualSelected,\n };\n const [store] = useState(() => createTabsetStore(snapshot));\n\n useLayoutEffect(() => {\n store.setState(snapshot);\n });\n\n const tablistElement = useStore(store, (state) => state.tablistElement);\n\n const overflowSignature = node.children.map((tab) => `${tab.id}:${tab.name}`).join(\"|\");\n const overflow = useTabOverflow(tablistElement, overflowSignature);\n\n const overflowItems = useMemo(() => {\n const names = new Map(node.children.map((tab) => [tab.id, tab.name]));\n return overflow.map((id) => ({ id, name: names.get(id) ?? id }));\n }, [overflow, node.children]);\n useLayoutEffect(() => {\n store.setState({ overflowItems });\n }, [overflowItems, store]);\n\n // Every dispatch rebuilds `node.children`, so this also runs for changes\n // unrelated to a close; the pending id is what keeps a vetoed one from firing.\n useEffect(() => {\n const { pendingCloseTabId } = store.getState();\n if (pendingCloseTabId === null) {\n return;\n }\n store.setState({ pendingCloseTabId: null });\n if (node.children.some((tab) => tab.id === pendingCloseTabId)) {\n return;\n }\n const activeTabId = node.children[node.selected]?.id;\n if (activeTabId) {\n tabsetRef.current\n ?.querySelector<HTMLElement>(`#${CSS.escape(tabDomId(node.id, activeTabId))}`)\n ?.focus();\n } else {\n tabsetRef.current?.focus();\n }\n }, [node.children, node.selected, node.id, store]);\n\n return (\n <TabsetStoreContext.Provider value={store}>\n <div\n {...props}\n data-dashfoo=\"tabset\"\n data-dragging-source={isDragSource || undefined}\n data-tab-location={tabLocation}\n ref={(element) => {\n ref(element);\n tabsetRef.current = element;\n if (typeof userRef === \"function\") {\n userRef(element);\n } else if (userRef) {\n userRef.current = element;\n }\n }}\n style={{ ...tabsetStyle, ...style }}\n tabIndex={-1}\n >\n {children}\n </div>\n </TabsetStoreContext.Provider>\n );\n },\n);\n\nTabsetRoot.displayName = \"TabsetRoot\";\n\nexport { TabsetRoot };\nexport type { TabsetRootProps };\n","\"use client\";\n\nimport type { TabNode } from \"@dashfoo/core\";\nimport type { ComponentProps, MouseEvent, ReactNode } from \"react\";\nimport { forwardRef, useContext, useEffect, useMemo, useRef } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { panelDomId, tabDomId } from \"../../lib/tab-ids\";\nimport { warnOnce } from \"../../lib/warn-once\";\nimport { useDragSubject, useTabDraggable } from \"../drag-provider\";\n\nimport { TabContext, TabsetStoreContext, useTab, useTabset } from \"./tabset-store\";\n\ntype TabsetTabProps = ComponentProps<\"span\"> & { tab: TabNode };\n\nconst TabsetTab = forwardRef<HTMLSpanElement, TabsetTabProps>(\n ({ children, tab, ...props }, userRef): ReactNode => {\n const store = useContext(TabsetStoreContext);\n const node = useTabset((state) => state.node);\n const editing = useTabset((state) => state.editingTabId === tab.id);\n\n const dragSubject = useDragSubject();\n const isDragging = dragSubject?.kind === \"tab\" && dragSubject.id === tab.id;\n const itemRef = useRef<HTMLSpanElement | null>(null);\n const wasEditing = useRef(false);\n\n const index = node.children.findIndex((child) => child.id === tab.id);\n\n const orphanAtRender = index === -1;\n useEffect(() => {\n const settled = store?.getState().node.children.some((child) => child.id === tab.id);\n if (settled === false) {\n warnOnce(\n `orphan-tab-${tab.id}`,\n `<Tabset.Tab> for \"${tab.id}\" is not a child of its Tabset.Root's node; it renders but can never be selected`,\n );\n }\n }, [orphanAtRender, store, tab.id]);\n\n useEffect(() => {\n if (wasEditing.current && !editing) {\n itemRef.current?.querySelector<HTMLElement>('[data-dashfoo=\"tab\"]')?.focus();\n }\n wasEditing.current = editing;\n }, [editing]);\n\n const contextValue = useMemo(() => ({ index, tab }), [index, tab]);\n const refCallback = useMemo(() => mergeRefs<HTMLSpanElement>(itemRef, userRef), [userRef]);\n\n return (\n <TabContext.Provider value={contextValue}>\n <span\n {...props}\n data-dashfoo=\"tab-item\"\n data-dragging={isDragging || undefined}\n ref={refCallback}\n >\n {children}\n </span>\n </TabContext.Provider>\n );\n },\n);\n\nTabsetTab.displayName = \"TabsetTab\";\n\ntype TabsetTriggerProps = ComponentProps<\"button\">;\n\nconst TabsetTrigger = forwardRef<HTMLButtonElement, TabsetTriggerProps>(\n (\n {\n children,\n onClick,\n onDoubleClick,\n\n ...props\n },\n userRef,\n ): ReactNode => {\n const { index, tab } = useTab();\n const node = useTabset((state) => state.node);\n const editing = useTabset((state) => state.editingTabId === tab.id);\n const selectTab = useTabset((state) => state.selectTab);\n const startEditing = useTabset((state) => state.startEditing);\n const tabsRenamable = useTabset((state) => state.tabsRenamable);\n const visualSelected = useTabset((state) => state.visualSelected);\n const draggableTabs = useLayout((state) => state.draggableTabs);\n const renderTabLabel = useLayout((state) => state.renderTabLabel);\n const { ref } = useTabDraggable(tab.id, !draggableTabs || tab.enableDrag === false, tab.name);\n const refCallback = useMemo(() => mergeRefs<HTMLButtonElement>(ref, userRef), [ref, userRef]);\n\n if (editing) {\n return null;\n }\n\n const selected = index === visualSelected;\n const renamable = tabsRenamable && tab.enableRename !== false;\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n selectTab(index);\n };\n\n const handleDoubleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onDoubleClick?.(event);\n if (renamable) {\n startEditing(tab.id);\n }\n };\n\n return (\n <button\n aria-label={renderTabLabel ? tab.name : undefined}\n {...props}\n aria-controls={panelDomId(node.id)}\n aria-selected={selected}\n data-dashfoo=\"tab\"\n data-tab-id={tab.id}\n id={tabDomId(node.id, tab.id)}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n ref={refCallback}\n role=\"tab\"\n tabIndex={selected ? 0 : -1}\n type=\"button\"\n >\n {children ?? (renderTabLabel ? renderTabLabel(tab) : tab.name)}\n </button>\n );\n },\n);\n\nTabsetTrigger.displayName = \"TabsetTrigger\";\n\nexport { TabsetTab, TabsetTrigger };\nexport type { TabsetTabProps, TabsetTriggerProps };\n","// oxlint-disable jsx-a11y/no-static-element-interactions -- Keyboard events bubble from the owned tabs; the scroll viewport is not itself a tablist.\n\"use client\";\n\nimport type { ComponentProps, CSSProperties, KeyboardEvent, ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { tabDomId } from \"../../lib/tab-ids\";\n\nimport { useTabset } from \"./tabset-store\";\n\nconst stripStyle: CSSProperties = { display: \"flex\", flexShrink: 0 };\n\nconst tablistStyle: CSSProperties = { display: \"flex\", minWidth: 0, overflowX: \"auto\" };\n\ntype TabsetTabStripProps = ComponentProps<\"div\">;\n\nconst TabsetTabStrip = forwardRef<HTMLDivElement, TabsetTabStripProps>(\n ({ style, ...props }, ref): ReactNode => (\n <div {...props} data-dashfoo=\"tabstrip\" ref={ref} style={{ ...stripStyle, ...style }} />\n ),\n);\n\nTabsetTabStrip.displayName = \"TabsetTabStrip\";\n\ntype TabsetTablistProps = ComponentProps<\"div\">;\n\nconst TabsetTablist = forwardRef<HTMLDivElement, TabsetTablistProps>(\n (\n {\n \"aria-label\": ariaLabel,\n children,\n onKeyDown,\n\n style,\n ...props\n },\n userRef,\n ): ReactNode => {\n const node = useTabset((state) => state.node);\n const registerTablist = useTabset((state) => state.registerTablist);\n const selectTab = useTabset((state) => state.selectTab);\n const editingTabId = useTabset((state) => state.editingTabId);\n const visualSelected = useTabset((state) => state.visualSelected);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n onKeyDown?.(event);\n if (event.defaultPrevented) {\n return;\n }\n\n if (!(event.target instanceof HTMLElement) || !event.target.closest('[role=\"tab\"]')) {\n return;\n }\n const count = node.children.length;\n if (count === 0) {\n return;\n }\n // The visual index, not the model's: focus (`tabindex=\"0\"`) sits at that one.\n const from = Math.max(visualSelected, 0);\n const targets = new Map([\n [\"ArrowLeft\", (from - 1 + count) % count],\n [\"ArrowRight\", (from + 1) % count],\n [\"End\", count - 1],\n [\"Home\", 0],\n ]);\n const next = targets.get(event.key);\n if (next === undefined) {\n return;\n }\n event.preventDefault();\n selectTab(next, { focus: true });\n };\n\n const refCallback = useMemo(\n () => mergeRefs<HTMLDivElement>(registerTablist, userRef),\n [registerTablist, userRef],\n );\n\n const ownedTabs = node.children\n .filter((tab) => tab.id !== editingTabId)\n .map((tab) => tabDomId(node.id, tab.id))\n .join(\" \");\n\n return (\n <div\n {...props}\n data-dashfoo=\"tablist\"\n onKeyDown={handleKeyDown}\n ref={refCallback}\n style={{ ...tablistStyle, ...style }}\n tabIndex={-1}\n >\n {/* Close buttons and rename inputs stay outside the tablist in the\n accessibility tree. Ownership keeps custom tab chrome composable. */}\n {ownedTabs ? (\n <span\n aria-label={ariaLabel ?? node.name ?? \"Tabs\"}\n aria-orientation=\"horizontal\"\n aria-owns={ownedTabs}\n role=\"tablist\"\n />\n ) : null}\n {children}\n </div>\n );\n },\n);\n\nTabsetTablist.displayName = \"TabsetTablist\";\n\nexport { TabsetTablist, TabsetTabStrip };\nexport type { TabsetTablistProps, TabsetTabStripProps };\n","\"use client\";\n\nimport type { ComponentProps, CSSProperties, MouseEvent, ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { measureFloatRect } from \"../../lib/float-geometry\";\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { warnOnce } from \"../../lib/warn-once\";\nimport { FloatIcon, GripIcon, MaximizeIcon } from \"../close-icon\";\nimport { useTabsetDraggable } from \"../drag-provider\";\nimport { useHasFloatLayer } from \"../float-context\";\n\nimport { useTabset } from \"./tabset-store\";\n\nconst toolbarStyle: CSSProperties = {\n alignItems: \"center\",\n display: \"flex\",\n flexShrink: 0,\n marginInlineStart: \"auto\",\n};\n\ntype TabsetToolbarProps = ComponentProps<\"div\">;\n\nconst TabsetToolbar = forwardRef<HTMLDivElement, TabsetToolbarProps>(\n ({ style, ...props }, ref): ReactNode => (\n <div {...props} data-dashfoo=\"tabset-toolbar\" ref={ref} style={{ ...toolbarStyle, ...style }} />\n ),\n);\n\nTabsetToolbar.displayName = \"TabsetToolbar\";\n\ntype TabsetChrome = { float: boolean; grip: boolean; maximize: boolean; overflow: boolean };\n\n/**\n * One answer per control, shared by the controls and by the layout deciding\n * whether to render a toolbar at all, so the two cannot disagree.\n */\nconst useTabsetChrome = (): TabsetChrome => {\n const draggableTabsets = useLayout((state) => state.draggableTabsets);\n const floatable = useLayout((state) => state.floatable);\n const isMaximized = useTabset((state) => state.isMaximized);\n const overflowCount = useTabset((state) => state.overflowItems.length);\n const showMaximize = useTabset((state) => state.showMaximize);\n const hasFloatLayer = useHasFloatLayer();\n\n if (floatable && !isMaximized && !hasFloatLayer) {\n warnOnce(\n \"float-no-layer\",\n \"Tabset.FloatButton needs a <Layout.FloatLayer> around the layout (DashfooLayout adds one); the float control is hidden\",\n );\n }\n\n return {\n float: floatable && !isMaximized && hasFloatLayer,\n grip: draggableTabsets && !isMaximized,\n maximize: showMaximize,\n overflow: overflowCount > 0,\n };\n};\n\ntype TabsetGripProps = ComponentProps<\"button\">;\n\nconst TabsetGrip = forwardRef<HTMLButtonElement, TabsetGripProps>(\n ({ children, ...props }, userRef): ReactNode => {\n const activeTabName = useTabset((state) => state.activeTab?.name ?? \"\");\n const node = useTabset((state) => state.node);\n const { grip } = useTabsetChrome();\n const { ref } = useTabsetDraggable(node.id, !grip, activeTabName);\n const refCallback = useMemo(() => mergeRefs<HTMLButtonElement>(ref, userRef), [ref, userRef]);\n\n if (!grip) {\n return null;\n }\n\n return (\n <button\n aria-label=\"Move tabset\"\n title=\"Move tabset\"\n {...props}\n data-dashfoo=\"tabset-grip\"\n ref={refCallback}\n type=\"button\"\n >\n {children ?? <GripIcon />}\n </button>\n );\n },\n);\n\nTabsetGrip.displayName = \"TabsetGrip\";\n\ntype TabsetMaximizeButtonProps = ComponentProps<\"button\">;\n\nconst TabsetMaximizeButton = forwardRef<HTMLButtonElement, TabsetMaximizeButtonProps>(\n ({ children, onClick, ...props }, ref): ReactNode => {\n const isMaximized = useTabset((state) => state.isMaximized);\n const toggleMaximize = useTabset((state) => state.toggleMaximize);\n const { maximize } = useTabsetChrome();\n\n if (!maximize) {\n return null;\n }\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n toggleMaximize();\n };\n\n return (\n <button\n aria-label={isMaximized ? \"Restore\" : \"Maximize\"}\n title={isMaximized ? \"Restore tabset\" : \"Maximize tabset\"}\n {...props}\n aria-pressed={isMaximized}\n data-dashfoo=\"tabset-maximize\"\n onClick={handleClick}\n ref={ref}\n type=\"button\"\n >\n {children ?? <MaximizeIcon maximized={isMaximized} />}\n </button>\n );\n },\n);\n\nTabsetMaximizeButton.displayName = \"TabsetMaximizeButton\";\n\ntype TabsetFloatButtonProps = ComponentProps<\"button\">;\n\nconst TabsetFloatButton = forwardRef<HTMLButtonElement, TabsetFloatButtonProps>(\n ({ children, onClick, ...props }, ref): ReactNode => {\n const dispatch = useLayout((state) => state.dispatch);\n const node = useTabset((state) => state.node);\n const { float } = useTabsetChrome();\n\n if (!float) {\n return null;\n }\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n const geometry = measureFloatRect(event.currentTarget);\n dispatch({ geometry, tabsetId: node.id, type: \"floatTabset\" });\n };\n\n return (\n <button\n aria-label=\"Float panel\"\n title=\"Float panel\"\n {...props}\n data-dashfoo=\"tabset-float\"\n onClick={handleClick}\n ref={ref}\n type=\"button\"\n >\n {children ?? <FloatIcon />}\n </button>\n );\n },\n);\n\nTabsetFloatButton.displayName = \"TabsetFloatButton\";\n\nexport { TabsetFloatButton, TabsetGrip, TabsetMaximizeButton, TabsetToolbar, useTabsetChrome };\nexport type {\n TabsetChrome,\n TabsetFloatButtonProps,\n TabsetGripProps,\n TabsetMaximizeButtonProps,\n TabsetToolbarProps,\n};\n","\"use client\";\n\nimport type { TabsetNode } from \"@dashfoo/core\";\nimport type { ReactNode } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\n\nimport { TabsetContent } from \"./tabset-content\";\nimport { TabsetOverflowMenu } from \"./tabset-overflow-menu\";\nimport { TabsetCloseButton, TabsetRenameInput } from \"./tabset-rename-input\";\nimport { TabsetRoot } from \"./tabset-root\";\nimport { useTabset } from \"./tabset-store\";\nimport { TabsetTab, TabsetTrigger } from \"./tabset-tab\";\nimport { TabsetTablist, TabsetTabStrip } from \"./tabset-tablist\";\nimport {\n TabsetFloatButton,\n TabsetGrip,\n TabsetMaximizeButton,\n TabsetToolbar,\n useTabsetChrome,\n} from \"./tabset-toolbar\";\n\nconst tabsetContent = <TabsetContent />;\n\nconst DefaultTabsetLayout = (): ReactNode => {\n const renderTabsetToolbar = useLayout((state) => state.renderTabsetToolbar);\n const tabLocation = useLayout((state) => state.tabLocation);\n const tabStripEnabled = useLayout((state) => state.tabStripEnabled);\n const node = useTabset((state) => state.node);\n const chrome = useTabsetChrome();\n\n const showToolbar = renderTabsetToolbar !== undefined || Object.values(chrome).some(Boolean);\n\n const strip = tabStripEnabled ? (\n <TabsetTabStrip>\n <TabsetTablist>\n {node.children.map((tab) => (\n <TabsetTab key={tab.id} tab={tab}>\n <TabsetTrigger />\n <TabsetRenameInput />\n <TabsetCloseButton />\n </TabsetTab>\n ))}\n </TabsetTablist>\n {showToolbar ? (\n <TabsetToolbar>\n <TabsetOverflowMenu />\n <TabsetGrip />\n {renderTabsetToolbar?.(node)}\n <TabsetFloatButton />\n <TabsetMaximizeButton />\n </TabsetToolbar>\n ) : null}\n </TabsetTabStrip>\n ) : null;\n\n return tabLocation === \"bottom\" ? (\n <>\n {tabsetContent}\n {strip}\n </>\n ) : (\n <>\n {strip}\n {tabsetContent}\n </>\n );\n};\n\ntype TabsetViewProps = { node: TabsetNode };\n\nconst TabsetView = ({ node }: TabsetViewProps): ReactNode => (\n <TabsetRoot node={node}>\n <DefaultTabsetLayout />\n </TabsetRoot>\n);\n\nexport { TabsetView };\nexport type { TabsetViewProps };\n","\"use client\";\n\nimport type { Dimension, RowNode, SnapConfig, TabsetNode } from \"@dashfoo/core\";\nimport { resolveSnapGrid, snapEnabled } from \"@dashfoo/core\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { Fragment, useMemo } from \"react\";\nimport type { Orientation } from \"react-resizable-panels\";\nimport { Group, Panel, Separator } from \"react-resizable-panels\";\n\nimport { useLayout } from \"../hooks/layout-store\";\nimport { useSnapResize } from \"../hooks/use-snap-resize\";\n\nimport { TabsetView } from \"./tabset/tabset-view\";\n\nconst dimensionToSize = (dimension: Dimension): string => `${dimension.value}${dimension.unit}`;\nconst dimensionToPixels = (dimension: Dimension | undefined): number | undefined =>\n dimension?.unit === \"px\" ? dimension.value : undefined;\n\nconst groupStyle: CSSProperties = { display: \"flex\", flex: 1, minHeight: 0, minWidth: 0 };\n\ntype LayoutChild = RowNode[\"children\"][number];\n\nconst descendantMinSize = (\n child: LayoutChild,\n axis: RowNode[\"orientation\"],\n tabsetMinSize: number,\n): number | undefined => {\n const explicit = dimensionToPixels(child.min);\n if (explicit !== undefined) {\n return explicit;\n }\n if (child.min !== undefined) {\n return undefined;\n }\n if (child.type === \"tabset\") {\n return tabsetMinSize;\n }\n\n const childMinimums: Array<number> = [];\n for (const grandchild of child.children) {\n const minimum = descendantMinSize(grandchild, axis, tabsetMinSize);\n if (minimum === undefined) {\n return undefined;\n }\n childMinimums.push(minimum);\n }\n if (childMinimums.length === 0) {\n return undefined;\n }\n\n return child.orientation === axis\n ? childMinimums.reduce((sum, value) => sum + value, 0)\n : Math.max(...childMinimums);\n};\n\ntype RowViewProps = {\n node: RowNode;\n\n renderTabset?: (node: TabsetNode) => ReactNode;\n};\n\nconst RowView = ({ node, renderTabset }: RowViewProps): ReactNode => {\n const dispatch = useLayout((state) => state.dispatch);\n const resizableSplits = useLayout((state) => state.resizableSplits);\n const tabsetMinSize = useLayout((state) => state.tabsetMinSize);\n const globalSnap = useLayout((state) => state.snap);\n\n const effectiveSnap: SnapConfig | null = node.snap ?? globalSnap;\n // Resolved once per row, and the same value decides whether the per-move\n // listener is attached at all.\n const snapGrid = useMemo(\n () => resolveSnapGrid(effectiveSnap, node.children.length),\n [effectiveSnap, node.children.length],\n );\n const snapActive = snapEnabled(snapGrid);\n const orientation: Orientation = node.orientation === \"row\" ? \"horizontal\" : \"vertical\";\n const total = node.children.reduce((sum, child) => sum + child.weight, 0);\n\n const { beginBoundaryDrag, groupRef, onLayoutChange, onLayoutChanged, snappedBoundary } =\n useSnapResize({\n children: node.children,\n onWeightsSettled: (weights) => {\n dispatch({ rowId: node.id, type: \"adjustSplit\", weights });\n },\n resizableSplits,\n snap: snapGrid,\n });\n\n return (\n <Group\n data-dashfoo=\"row\"\n data-dashfoo-snapping={snappedBoundary === null ? undefined : \"true\"}\n disabled={!resizableSplits}\n groupRef={groupRef}\n key={node.id}\n onLayoutChange={snapActive ? onLayoutChange : undefined}\n onLayoutChanged={onLayoutChanged}\n orientation={orientation}\n style={groupStyle}\n >\n {node.children.map((child, index) => {\n const percent = (child.weight / total) * 100;\n let min = child.min ? dimensionToSize(child.min) : undefined;\n if (min === undefined) {\n const minimum = descendantMinSize(child, node.orientation, tabsetMinSize);\n min = minimum === undefined ? undefined : `${minimum}px`;\n }\n const max = child.max ? dimensionToSize(child.max) : undefined;\n\n return (\n <Fragment key={child.id}>\n {index > 0 ? (\n <Separator\n data-dashfoo=\"splitter\"\n data-dashfoo-snapped={snappedBoundary === index - 1 ? \"true\" : undefined}\n disabled={!resizableSplits}\n onPointerDown={\n snapActive && resizableSplits\n ? () => {\n beginBoundaryDrag(index - 1);\n }\n : undefined\n }\n />\n ) : null}\n <Panel defaultSize={`${percent}%`} id={child.id} maxSize={max} minSize={min}>\n {child.type === \"row\" ? (\n <RowView node={child} renderTabset={renderTabset} />\n ) : (\n (renderTabset?.(child) ?? <TabsetView node={child} />)\n )}\n </Panel>\n </Fragment>\n );\n })}\n </Group>\n );\n};\n\nexport { RowView };\nexport type { RowViewProps };\n","\"use client\";\n\nimport type { Action, FloatNode } from \"@dashfoo/core\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { useRef, useState } from \"react\";\n\nimport type { LayoutState } from \"../hooks/layout-store\";\nimport { useLayout } from \"../hooks/layout-store\";\nimport { useFloatGesture } from \"../hooks/use-float-gesture\";\nimport { useInlineRename } from \"../hooks/use-inline-rename\";\n\nimport { DockIcon, FloatIcon, GripIcon, MinimizeIcon } from \"./close-icon\";\nimport { DragProvider } from \"./drag-provider\";\nimport { RESIZE_HANDLES } from \"./float-resize-handles\";\nimport { LayoutOverrides } from \"./layout-root\";\nimport { RowView } from \"./row-view\";\n\nconst floatTitle = (node: FloatNode): string => node.name ?? \"Panel\";\n\nconst titleBarStyle: CSSProperties = {\n alignItems: \"center\",\n display: \"flex\",\n flexShrink: 0,\n gap: \"0.375rem\",\n touchAction: \"none\",\n};\n\nconst titleStyle: CSSProperties = {\n flex: 1,\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n};\n\nconst dockButtonStyle: CSSProperties = {\n alignItems: \"center\",\n cursor: \"pointer\",\n display: \"inline-flex\",\n flexShrink: 0,\n};\n\nconst bodyStyle: CSSProperties = { flex: 1, minHeight: 0, position: \"relative\" };\n\nconst FLOAT_OVERRIDES: Partial<LayoutState> = {\n draggableTabsets: false,\n floatable: false,\n maximizable: false,\n maximizedTabsetId: undefined,\n};\n\ntype TitleProps = { dispatch: (action: Action) => void; node: FloatNode };\n\nconst FloatTitleEditor = ({\n dispatch,\n node,\n onDone,\n}: TitleProps & { onDone: () => void }): ReactNode => {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const { handleBlur, handleKeyDown } = useInlineRename({\n currentName: floatTitle(node),\n inputRef,\n onCommit: (name) => {\n dispatch({ floatId: node.id, name, type: \"renameFloat\" });\n },\n onDone,\n });\n\n return (\n <input\n aria-label={`Rename ${floatTitle(node)}`}\n data-dashfoo=\"float-rename\"\n defaultValue={floatTitle(node)}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n ref={inputRef}\n style={titleStyle}\n type=\"text\"\n />\n );\n};\n\nconst FloatTitle = ({\n dispatch,\n node,\n renamable,\n}: TitleProps & { renamable: boolean }): ReactNode => {\n const [editing, setEditing] = useState(false);\n if (renamable && editing) {\n return (\n <FloatTitleEditor\n dispatch={dispatch}\n node={node}\n onDone={() => {\n setEditing(false);\n }}\n />\n );\n }\n return (\n <span\n data-dashfoo=\"float-title\"\n onDoubleClick={\n renamable\n ? () => {\n setEditing(true);\n }\n : undefined\n }\n style={titleStyle}\n title={renamable ? \"Double-click to rename\" : undefined}\n >\n {floatTitle(node)}\n </span>\n );\n};\n\ntype FloatPanelProps = {\n node: FloatNode;\n onFocus: () => void;\n zIndex: number;\n};\n\nconst FloatPanel = ({ node, onFocus, zIndex }: FloatPanelProps): ReactNode => {\n const dispatch = useLayout((state) => state.dispatch);\n const editable = useLayout((state) => state.editable);\n\n const minimized = node.minimized === true;\n\n const restore = (): void => {\n if (!editable) {\n return;\n }\n dispatch({ floatId: node.id, minimized: false, type: \"setFloatMinimized\" });\n };\n\n const { handlers, ref, style } = useFloatGesture({\n editable,\n geometry: node.geometry,\n minimized,\n onCommit: (geometry) => {\n dispatch({ floatId: node.id, geometry, type: \"moveFloat\" });\n },\n onTap: () => {\n if (minimized) {\n restore();\n }\n },\n });\n const { onPointerDown, ...rootHandlers } = handlers;\n const frameStyle: CSSProperties = {\n ...style,\n pointerEvents: \"auto\",\n position: \"absolute\",\n zIndex,\n };\n\n if (minimized) {\n return (\n <button\n {...rootHandlers}\n aria-label={`Restore ${floatTitle(node)} panel`}\n data-dashfoo=\"float-chip\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n restore();\n }\n }}\n onPointerDown={onPointerDown}\n onPointerDownCapture={onFocus}\n ref={ref}\n style={frameStyle}\n title={floatTitle(node)}\n type=\"button\"\n >\n <FloatIcon />\n <span data-dashfoo=\"float-chip-label\">{floatTitle(node)}</span>\n </button>\n );\n }\n\n return (\n <div\n {...rootHandlers}\n data-dashfoo=\"float\"\n onPointerDownCapture={onFocus}\n ref={ref}\n style={frameStyle}\n >\n <div\n data-dashfoo=\"float-titlebar\"\n onPointerDown={onPointerDown}\n style={editable ? titleBarStyle : { ...titleBarStyle, cursor: \"default\" }}\n >\n <span aria-hidden=\"true\" data-dashfoo=\"float-grip\">\n <GripIcon />\n </span>\n <FloatTitle dispatch={dispatch} node={node} renamable={editable} />\n {editable && (\n <>\n <button\n aria-label=\"Minimize panel\"\n data-dashfoo=\"float-minimize\"\n onClick={() => {\n dispatch({ floatId: node.id, minimized: true, type: \"setFloatMinimized\" });\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n style={dockButtonStyle}\n title=\"Minimize panel\"\n type=\"button\"\n >\n <MinimizeIcon />\n </button>\n <button\n aria-label=\"Dock panel back into the main layout\"\n data-dashfoo=\"float-dock\"\n onClick={() => {\n dispatch({ floatId: node.id, type: \"dockFloat\" });\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n style={dockButtonStyle}\n title=\"Dock panel back\"\n type=\"button\"\n >\n <DockIcon />\n </button>\n </>\n )}\n </div>\n <div data-dashfoo=\"float-body\" style={bodyStyle}>\n <LayoutOverrides overrides={FLOAT_OVERRIDES}>\n <DragProvider>\n <RowView node={node.layout} />\n </DragProvider>\n </LayoutOverrides>\n </div>\n {editable &&\n RESIZE_HANDLES.map((handle) => (\n <div\n data-dashfoo=\"float-resize\"\n data-edge={handle.key}\n key={handle.key}\n onPointerDown={onPointerDown}\n style={{ position: \"absolute\", touchAction: \"none\", zIndex: 1, ...handle.style }}\n />\n ))}\n </div>\n );\n};\n\nexport { FloatPanel, FloatTitleEditor };\nexport type { FloatPanelProps };\n","\"use client\";\n\nimport type { FloatNode, GlobalAttributes } from \"@dashfoo/core\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { useState } from \"react\";\n\nimport { FloatLayerContext } from \"./float-context\";\nimport { FloatPanel } from \"./float-panel\";\n\nconst overlayStyle: CSSProperties = {\n inset: 0,\n\n pointerEvents: \"none\",\n position: \"fixed\",\n\n zIndex: 1,\n};\n\nconst FloatOverlay = ({ floats }: { floats: Array<FloatNode> }): ReactNode => {\n const [topId, setTopId] = useState<string | null>(null);\n if (floats.length === 0) {\n return null;\n }\n return (\n <div data-dashfoo=\"float-overlay\" style={overlayStyle}>\n {floats.map((node) => (\n <FloatPanel\n key={node.id}\n node={node}\n onFocus={() => {\n setTopId(node.id);\n }}\n zIndex={node.id === topId ? 2 : 1}\n />\n ))}\n </div>\n );\n};\n\ntype FloatLayerProps = {\n children: ReactNode;\n floats: Array<FloatNode>;\n /** Unread: floats inherit every global-derived capability from the layout store above them. */\n global?: GlobalAttributes;\n};\n\nconst FloatLayer = ({ children, floats }: FloatLayerProps): ReactNode => (\n <FloatLayerContext.Provider value>\n {children}\n <FloatOverlay floats={floats} />\n </FloatLayerContext.Provider>\n);\n\nexport { FloatLayer };\nexport type { FloatLayerProps };\n","\"use client\";\n\nimport { DragProvider } from \"./drag-provider\";\nimport { FloatLayer } from \"./float-layer\";\nimport { LayoutRoot } from \"./layout-root\";\nimport { RowView } from \"./row-view\";\nimport { TabsetView } from \"./tabset/tabset-view\";\n\nconst Layout = {\n DragLayer: DragProvider,\n FloatLayer,\n Root: LayoutRoot,\n Rows: RowView,\n Tabset: TabsetView,\n} as const;\n\nexport { Layout };\nexport type { DragProviderProps as LayoutDragLayerProps } from \"./drag-provider\";\nexport type { FloatLayerProps as LayoutFloatLayerProps } from \"./float-layer\";\nexport type { LayoutRenderers, LayoutRootProps } from \"./layout-root\";\nexport type { RowViewProps as LayoutRowsProps } from \"./row-view\";\nexport type { TabsetViewProps as LayoutTabsetProps } from \"./tabset/tabset-view\";\n","\"use client\";\n\nimport type {\n Action,\n Dashfoo,\n DockLocation,\n Orientation,\n SnapConfig,\n TabNode,\n TabsetNode,\n} from \"@dashfoo/core\";\nimport { findTabset } from \"@dashfoo/core\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport {\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n} from \"react\";\n\nimport { SharedDragManagerContext } from \"../hooks/drag-hooks\";\nimport type { PersistConfig, StorageAdapter } from \"../hooks/persistence\";\nimport { localStorageAdapter, usePersistence } from \"../hooks/persistence\";\nimport { useContainerWidth } from \"../hooks/responsive\";\nimport { useDashfooStore } from \"../hooks/store\";\nimport { compactModel } from \"../lib/compact-model\";\n\nimport { DashfooDragProvider } from \"./dashfoo-drag-provider\";\nimport { Layout } from \"./layout\";\n\nconst DEFAULT_PERSIST_DEBOUNCE_MS = 300;\n\ntype PersistInput = string | { debounceMs?: number; key: string; storage?: StorageAdapter };\n\nconst resolvePersist = (persist: PersistInput | undefined): PersistConfig | null => {\n if (persist === undefined) {\n return null;\n }\n if (typeof persist === \"string\") {\n return { debounceMs: DEFAULT_PERSIST_DEBOUNCE_MS, key: persist, storage: localStorageAdapter };\n }\n return {\n debounceMs: persist.debounceMs ?? DEFAULT_PERSIST_DEBOUNCE_MS,\n key: persist.key,\n storage: persist.storage ?? localStorageAdapter,\n };\n};\n\ntype TabComponent = ComponentType<{ node: TabNode }>;\n\nconst warnedComponents = new Set<string>();\n\ntype DashfooHandle = {\n addTab: (\n tab: TabNode,\n target: { index?: number; location?: DockLocation; targetId: string },\n ) => void;\n canRedo: () => boolean;\n canUndo: () => boolean;\n closeTab: (tabId: string) => void;\n dispatch: (action: Action) => void;\n\n dockFloat: (floatId: string) => void;\n\n floatTab: (tabId: string) => void;\n getModel: () => Dashfoo;\n maximizeTabset: (tabsetId: string | null) => void;\n redo: () => void;\n renameTab: (tabId: string, name: string) => void;\n\n resetLayout: () => void;\n selectTab: (tabsetId: string, index: number) => void;\n undo: () => void;\n};\n\ntype DashfooLayoutCommonProps = {\n closableTabs?: boolean;\n components?: Record<string, TabComponent>;\n draggableTabs?: boolean;\n draggableTabsets?: boolean;\n\n editable?: boolean;\n factory?: (tab: TabNode) => ReactNode;\n\n floatable?: boolean;\n keepMounted?: boolean;\n maximizable?: boolean;\n onAction?: (action: Action) => Action | null;\n onActiveTabsetChange?: (tabsetId: string | undefined) => void;\n onMaximizedTabsetChange?: (tabsetId: string | undefined) => void;\n onModelChange?: (model: Dashfoo, action?: Action) => void;\n renamableTabs?: boolean;\n renderTabLabel?: (tab: TabNode) => ReactNode;\n renderTabsetToolbar?: (tabset: TabsetNode) => ReactNode;\n\n resizableSplits?: boolean;\n responsive?: { maxWidth: number; orientation?: Orientation };\n\n snap?: SnapConfig;\n};\n\ntype DashfooLayoutProps = DashfooLayoutCommonProps &\n (\n | { defaultModel: Dashfoo; model?: never; persist?: PersistInput }\n | { defaultModel?: never; model: Dashfoo; persist?: never }\n );\n\nconst DashfooLayout = forwardRef<DashfooHandle, DashfooLayoutProps>((props, ref): ReactNode => {\n const {\n closableTabs = true,\n components,\n defaultModel,\n draggableTabs = true,\n draggableTabsets = true,\n editable = true,\n factory,\n floatable = false,\n keepMounted = false,\n maximizable = true,\n model,\n onAction,\n onActiveTabsetChange,\n onMaximizedTabsetChange,\n onModelChange,\n persist,\n renamableTabs = true,\n renderTabLabel,\n renderTabsetToolbar,\n resizableSplits = true,\n responsive,\n snap,\n } = props;\n\n const persistConfig = useMemo(\n () => (model === undefined ? resolvePersist(persist) : null),\n [model, persist],\n );\n const persistence = usePersistence(persistConfig, defaultModel);\n\n const handleModelChange = useCallback(\n (next: Dashfoo, action?: Action): void => {\n persistence.save(next);\n onModelChange?.(next, action);\n },\n [onModelChange, persistence],\n );\n\n const store = useDashfooStore({\n defaultModel: persistence.initialModel ?? defaultModel,\n model,\n onAction,\n onActiveTabsetChange,\n onMaximizedTabsetChange,\n onModelChange: handleModelChange,\n });\n\n const { setModel } = store;\n const appliedInitialModel = useRef(persistence.initialModel);\n useEffect(() => {\n if (\n persistence.initialModel !== undefined &&\n persistence.initialModel !== appliedInitialModel.current\n ) {\n appliedInitialModel.current = persistence.initialModel;\n // Restoration must happen after hydration, without an action or undo entry.\n // oxlint-disable-next-line react-doctor/no-pass-data-to-parent\n setModel(persistence.initialModel);\n }\n }, [persistence.initialModel, setModel]);\n\n const hasSharedManager = useContext(SharedDragManagerContext) !== null;\n\n useImperativeHandle(\n ref,\n () => ({\n addTab: (tab, target) => {\n store.dispatch({\n index: target.index,\n location: target.location ?? \"center\",\n tab,\n targetId: target.targetId,\n type: \"addNode\",\n });\n },\n canRedo: store.canRedo,\n canUndo: store.canUndo,\n closeTab: (tabId) => {\n store.dispatch({ tabId, type: \"deleteTab\" });\n },\n dispatch: store.dispatch,\n dockFloat: (floatId) => {\n store.dispatch({ floatId, type: \"dockFloat\" });\n },\n floatTab: (tabId) => {\n store.dispatch({ tabId, type: \"floatTab\" });\n },\n getModel: () => store.model,\n maximizeTabset: (tabsetId) => {\n store.dispatch({ tabsetId, type: \"setMaximizedTabset\" });\n },\n redo: store.redo,\n renameTab: (tabId, name) => {\n store.dispatch({ name, tabId, type: \"renameTab\" });\n },\n resetLayout: () => {\n persistence.clear();\n if (defaultModel !== undefined) {\n store.setModel(defaultModel);\n }\n },\n selectTab: (tabsetId, index) => {\n store.dispatch({ index, tabsetId, type: \"selectTab\" });\n },\n undo: store.undo,\n }),\n [defaultModel, persistence, store],\n );\n\n const renderTab = useCallback(\n (tab: TabNode): ReactNode => {\n if (factory) {\n return factory(tab);\n }\n const Component = components?.[tab.component];\n if (!Component) {\n if (components && !warnedComponents.has(tab.component)) {\n warnedComponents.add(tab.component);\n\n // oxlint-disable-next-line no-console\n console.warn(`[dashfoo] no component registered for \"${tab.component}\"`);\n }\n return null;\n }\n return <Component node={tab} />;\n },\n [components, factory],\n );\n const renderers = useMemo(\n () => ({ tab: renderTab, tabLabel: renderTabLabel, tabsetToolbar: renderTabsetToolbar }),\n [renderTab, renderTabLabel, renderTabsetToolbar],\n );\n\n const [containerRef, width] = useContainerWidth();\n const isCompact = responsive !== undefined && width <= responsive.maxWidth;\n\n /** Everything the compact breakpoint changes, decided once. */\n const presentation = useMemo(\n () =>\n isCompact\n ? {\n maximizable: false,\n model: compactModel(store.model, responsive?.orientation),\n restructurable: false,\n }\n : { maximizable, model: store.model, restructurable: true },\n [isCompact, maximizable, responsive?.orientation, store.model],\n );\n const view = presentation.model;\n\n const maximized =\n view.maximizedTabsetId === undefined ? undefined : findTabset(view, view.maximizedTabsetId);\n\n const tree = (\n <Layout.FloatLayer floats={view.floats}>\n <Layout.DragLayer>\n {maximized ? <Layout.Tabset node={maximized} /> : <Layout.Rows node={view.layout} />}\n </Layout.DragLayer>\n </Layout.FloatLayer>\n );\n\n return (\n <Layout.Root\n closableTabs={closableTabs}\n dispatch={store.dispatch}\n draggableTabs={draggableTabs}\n draggableTabsets={draggableTabsets}\n editable={editable}\n floatable={floatable}\n keepMounted={keepMounted}\n maximizable={presentation.maximizable}\n model={view}\n renamableTabs={renamableTabs}\n renderers={renderers}\n resizableSplits={resizableSplits}\n restructurable={presentation.restructurable}\n rootRef={containerRef}\n snap={snap}\n >\n {hasSharedManager ? tree : <DashfooDragProvider>{tree}</DashfooDragProvider>}\n </Layout.Root>\n );\n});\n\nDashfooLayout.displayName = \"DashfooLayout\";\n\nexport { DashfooLayout };\nexport type { DashfooHandle, DashfooLayoutCommonProps, DashfooLayoutProps, TabComponent };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\ntype PanelBadgeProps = ComponentProps<\"span\">;\n\nconst PanelBadge = forwardRef<HTMLSpanElement, PanelBadgeProps>((props, ref): ReactNode => (\n <span {...props} data-dashfoo=\"panel-badge\" ref={ref} />\n));\n\nPanelBadge.displayName = \"PanelBadge\";\n\nexport { PanelBadge };\nexport type { PanelBadgeProps };\n","// oxlint-disable jsx-a11y/no-noninteractive-tabindex -- The themed body is an independent scroll region and needs keyboard access.\n\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\ntype PanelBodyProps = ComponentProps<\"div\">;\n\nconst PanelBody = forwardRef<HTMLDivElement, PanelBodyProps>((props, ref): ReactNode => (\n <div {...props} data-dashfoo=\"panel-body\" ref={ref} tabIndex={props.tabIndex ?? 0} />\n));\n\nPanelBody.displayName = \"PanelBody\";\n\nexport { PanelBody };\nexport type { PanelBodyProps };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\ntype PanelHeaderProps = ComponentProps<\"div\">;\n\nconst PanelHeader = forwardRef<HTMLDivElement, PanelHeaderProps>((props, ref): ReactNode => (\n <div {...props} data-dashfoo=\"panel-header\" ref={ref} />\n));\n\nPanelHeader.displayName = \"PanelHeader\";\n\nexport { PanelHeader };\nexport type { PanelHeaderProps };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\ntype PanelIconProps = ComponentProps<\"span\">;\n\nconst PanelIcon = forwardRef<HTMLSpanElement, PanelIconProps>((props, ref): ReactNode => (\n <span {...props} data-dashfoo=\"panel-icon\" ref={ref} />\n));\n\nPanelIcon.displayName = \"PanelIcon\";\n\nexport { PanelIcon };\nexport type { PanelIconProps };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\ntype PanelRootProps = ComponentProps<\"div\">;\n\nconst PanelRoot = forwardRef<HTMLDivElement, PanelRootProps>((props, ref): ReactNode => (\n <div {...props} data-dashfoo=\"panel\" ref={ref} />\n));\n\nPanelRoot.displayName = \"PanelRoot\";\n\nexport { PanelRoot };\nexport type { PanelRootProps };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\ntype PanelTitleProps = ComponentProps<\"span\">;\n\nconst PanelTitle = forwardRef<HTMLSpanElement, PanelTitleProps>((props, ref): ReactNode => (\n <span {...props} data-dashfoo=\"panel-title\" ref={ref} />\n));\n\nPanelTitle.displayName = \"PanelTitle\";\n\nexport { PanelTitle };\nexport type { PanelTitleProps };\n","\"use client\";\n\nimport { PanelBadge } from \"./panel-badge\";\nimport { PanelBody } from \"./panel-body\";\nimport { PanelHeader } from \"./panel-header\";\nimport { PanelIcon } from \"./panel-icon\";\nimport { PanelRoot } from \"./panel-root\";\nimport { PanelTitle } from \"./panel-title\";\n\nconst Panel = {\n Badge: PanelBadge,\n Body: PanelBody,\n Header: PanelHeader,\n Icon: PanelIcon,\n Root: PanelRoot,\n Title: PanelTitle,\n} as const;\n\nexport { Panel };\nexport type { PanelBadgeProps } from \"./panel-badge\";\nexport type { PanelBodyProps } from \"./panel-body\";\nexport type { PanelHeaderProps } from \"./panel-header\";\nexport type { PanelIconProps } from \"./panel-icon\";\nexport type { PanelRootProps } from \"./panel-root\";\nexport type { PanelTitleProps } from \"./panel-title\";\n","\"use client\";\n\nimport { TabsetContent } from \"./tabset-content\";\nimport { TabsetOverflowMenu } from \"./tabset-overflow-menu\";\nimport { TabsetCloseButton, TabsetRenameInput } from \"./tabset-rename-input\";\nimport { TabsetRoot } from \"./tabset-root\";\nimport { TabsetTab, TabsetTrigger } from \"./tabset-tab\";\nimport { TabsetTablist, TabsetTabStrip } from \"./tabset-tablist\";\nimport {\n TabsetFloatButton,\n TabsetGrip,\n TabsetMaximizeButton,\n TabsetToolbar,\n} from \"./tabset-toolbar\";\n\nconst Tabset = {\n CloseButton: TabsetCloseButton,\n Content: TabsetContent,\n FloatButton: TabsetFloatButton,\n Grip: TabsetGrip,\n MaximizeButton: TabsetMaximizeButton,\n OverflowMenu: TabsetOverflowMenu,\n RenameInput: TabsetRenameInput,\n Root: TabsetRoot,\n Tab: TabsetTab,\n Tablist: TabsetTablist,\n TabStrip: TabsetTabStrip,\n Toolbar: TabsetToolbar,\n Trigger: TabsetTrigger,\n} as const;\n\nexport { Tabset };\nexport type { TabsetContentProps } from \"./tabset-content\";\nexport type { TabsetRootProps } from \"./tabset-root\";\nexport type { TabsetTabProps, TabsetTriggerProps } from \"./tabset-tab\";\nexport type { TabsetCloseButtonProps, TabsetRenameInputProps } from \"./tabset-rename-input\";\nexport type { TabsetTablistProps, TabsetTabStripProps } from \"./tabset-tablist\";\nexport type {\n TabsetFloatButtonProps,\n TabsetGripProps,\n TabsetMaximizeButtonProps,\n TabsetToolbarProps,\n} from \"./tabset-toolbar\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["Panel"],"sources":["../src/lib/topmost-collision.ts","../src/hooks/drag-hooks.tsx","../src/hooks/persistence.ts","../src/hooks/responsive.ts","../src/lib/warn-once.ts","../src/hooks/store.ts","../src/lib/compact-model.ts","../src/lib/drag-subject.ts","../src/lib/tab-insertion.ts","../src/components/drag-preview-overlay.tsx","../src/components/dashfoo-drag-provider.tsx","../src/hooks/layout-store.ts","../src/components/drag-provider.tsx","../src/components/float-context.ts","../src/components/float-resize-handles.ts","../src/lib/float-geometry.ts","../src/hooks/use-float-gesture.ts","../src/hooks/use-inline-rename.ts","../src/components/close-icon.tsx","../src/components/layout-root.tsx","../src/hooks/use-snap-resize.ts","../src/lib/tab-ids.ts","../src/components/tabset/tabset-store.ts","../src/components/tabset/tabset-content.tsx","../src/components/tab-overflow-menu.tsx","../src/components/tabset/tabset-overflow-menu.tsx","../src/lib/merge-refs.ts","../src/components/tabset/tabset-rename-input.tsx","../src/hooks/use-tab-overflow.ts","../src/lib/tab-selection.ts","../src/components/tabset/tabset-root.tsx","../src/components/tabset/tabset-tab.tsx","../src/components/tabset/tabset-tablist.tsx","../src/components/tabset/tabset-toolbar.tsx","../src/components/tabset/tabset-view.tsx","../src/components/row-view.tsx","../src/components/float-panel.tsx","../src/components/float-layer.tsx","../src/components/layout.tsx","../src/components/dashfoo-layout.tsx","../src/components/panel-badge.tsx","../src/components/panel-body.tsx","../src/components/panel-header.tsx","../src/components/panel-icon.tsx","../src/components/panel-root.tsx","../src/components/panel-title.tsx","../src/components/panel.tsx","../src/components/tabset/tabset.ts"],"sourcesContent":["import type { Collision, CollisionDetector, UniqueIdentifier } from \"@dnd-kit/abstract\";\nimport { CollisionPriority, CollisionType } from \"@dnd-kit/abstract\";\n\ntype TopmostDetectorInput = {\n dragOperation: { position: { current: { x: number; y: number } } };\n droppable: { element?: Element; id: UniqueIdentifier };\n};\n\ntype TopmostDetector = (input: TopmostDetectorInput) => Collision | null;\n\nconst createTopmostPointerIntersection = (\n topElementAt: (x: number, y: number) => Element | null = (x, y) =>\n document.elementFromPoint(x, y),\n): TopmostDetector => {\n let cached: { top: Element | null; x: number; y: number } | null = null;\n const topAt = (x: number, y: number): Element | null => {\n if (cached?.x === x && cached.y === y) {\n return cached.top;\n }\n const top = topElementAt(x, y);\n cached = { top, x, y };\n queueMicrotask(() => {\n cached = null;\n });\n return top;\n };\n\n return ({ dragOperation, droppable }) => {\n const { element } = droppable;\n if (!element) {\n return null;\n }\n const point = dragOperation.position.current;\n const top = topAt(point.x, point.y);\n if (!top || !element.contains(top)) {\n return null;\n }\n\n let depth = 0;\n for (let node: Element | null = element; node; node = node.parentElement) {\n depth += 1;\n }\n return {\n id: droppable.id,\n priority: CollisionPriority.High,\n type: CollisionType.PointerIntersection,\n value: depth,\n };\n };\n};\n\nconst topmostPointerIntersection: CollisionDetector = createTopmostPointerIntersection();\n\nexport { createTopmostPointerIntersection, topmostPointerIntersection };\nexport type { TopmostDetectorInput };\n","\"use client\";\n\nimport type {\n Action,\n dragDockMachine,\n DragSubject,\n DropIntent,\n Point,\n TabNode,\n} from \"@dashfoo/core\";\nimport {\n Accessibility,\n Draggable,\n DragDropManager,\n Droppable,\n Feedback,\n PointerSensor,\n} from \"@dnd-kit/dom\";\nimport { useSelector } from \"@xstate/react\";\nimport type { Context } from \"react\";\nimport { createContext, useCallback, useContext, useEffect, useId, useMemo, useRef } from \"react\";\nimport type { ActorRefFrom } from \"xstate\";\n\nimport type { DashfooDragData } from \"../lib/drag-subject\";\nimport { topmostPointerIntersection } from \"../lib/topmost-collision\";\n\nconst INTERACTIVE_SELECTOR = `\n input:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n button:not([disabled]),\n a[href],\n [contenteditable]:not([contenteditable=\"false\"])\n`;\n\nconst preventActivation = (event: PointerEvent, source: Draggable): boolean => {\n const { target } = event;\n if (!(target instanceof Element)) {\n return false;\n }\n const interactive = target.closest(INTERACTIVE_SELECTOR);\n return interactive !== null && interactive !== source.element;\n};\n\ntype DashfooDragManager = DragDropManager;\ntype DashfooDraggable = Draggable;\n\nconst createDragManager = (): DashfooDragManager =>\n new DragDropManager({\n plugins: (defaults) => [\n ...defaults.filter((plugin) => plugin !== Accessibility && plugin !== Feedback),\n Feedback.configure({ dropAnimation: null }),\n ],\n sensors: () => [PointerSensor.configure({ preventActivation })],\n });\n\ntype DragActor = ActorRefFrom<typeof dragDockMachine>;\n\n/**\n * One per rendered layer (the main tree, then one per float); the manager and\n * actor are shared above them. `layerId` namespaces droppable registrations, so\n * two layers can hold a tabset with the same model id.\n */\ntype DragScope = {\n commit: (action: Action) => void;\n layerId: string;\n resolveIntent: (\n targetId: string,\n element: HTMLElement,\n point: Point,\n draggedId?: string,\n ) => DropIntent | null;\n};\n\ntype DragRootContextValue = {\n actorRef: DragActor;\n manager: DashfooDragManager;\n registerScope: (scope: DragScope) => () => void;\n};\n\nconst DragRootContext: Context<DragRootContextValue | null> =\n createContext<DragRootContextValue | null>(null);\n\ntype DragContextValue = {\n actorRef: DragActor;\n layerId: string;\n manager: DashfooDragManager;\n};\n\nconst DragContext = createContext<DragContextValue | null>(null);\n\nconst SharedDragManagerContext: Context<DashfooDragManager | null> =\n createContext<DashfooDragManager | null>(null);\n\n/** The intent is rebuilt every pointer move, so readers compare by value. */\nconst sameDropIntent = (a: DropIntent | null, b: DropIntent | null): boolean =>\n a === b ||\n (a !== null &&\n b !== null &&\n a.index === b.index &&\n a.location === b.location &&\n a.targetId === b.targetId);\n\ntype DraggableHandle = {\n draggableRef: { current: DashfooDraggable | null };\n elementRef: { current: Element | null };\n ref: (element: Element | null) => void;\n};\n\nconst useDraggableHandle = (): DraggableHandle => {\n const elementRef = useRef<Element | null>(null);\n const draggableRef = useRef<DashfooDraggable | null>(null);\n const ref = useCallback((element: Element | null): void => {\n elementRef.current = element;\n if (draggableRef.current) {\n draggableRef.current.element = element ?? undefined;\n }\n }, []);\n return { draggableRef, elementRef, ref };\n};\n\ntype DraggableDescriptor = { data: DashfooDragData; id: string };\n\nconst useDraggableEntity = (\n descriptor: DraggableDescriptor,\n disabled: boolean,\n label: string,\n): { ref: (element: Element | null) => void } => {\n const context = useContext(DragContext);\n\n const sharedManager = useContext(SharedDragManagerContext);\n const manager = context?.manager ?? sharedManager;\n const { draggableRef, elementRef, ref } = useDraggableHandle();\n const { data, id } = descriptor;\n\n useEffect(() => {\n if (!manager || disabled) {\n return undefined;\n }\n const draggable = new Draggable({ data: { ...data, label: \"\" }, id }, manager);\n draggable.element = elementRef.current ?? undefined;\n draggableRef.current = draggable;\n return () => {\n draggable.destroy();\n draggableRef.current = null;\n };\n }, [data, disabled, draggableRef, elementRef, id, manager]);\n\n useEffect(() => {\n const draggable = draggableRef.current;\n if (draggable) {\n draggable.data = { ...data, label };\n }\n }, [data, draggableRef, label]);\n\n return useMemo(() => ({ ref }), [ref]);\n};\n\nconst useTabDraggable = (\n tabId: string,\n disabled = false,\n label = \"\",\n): { ref: (element: Element | null) => void } => {\n const data = useMemo(() => ({ type: \"tab\" }) satisfies DashfooDragData, []);\n return useDraggableEntity({ data, id: tabId }, disabled, label);\n};\n\nconst useTabsetDraggable = (\n tabsetId: string,\n disabled = false,\n label = \"\",\n): { ref: (element: Element | null) => void } => {\n const data = useMemo(() => ({ tabsetId, type: \"tabset\" }) satisfies DashfooDragData, [tabsetId]);\n return useDraggableEntity({ data, id: `grip-${tabsetId}` }, disabled, label);\n};\n\nconst useTabsetDroppable = (tabsetId: string): { ref: (element: HTMLElement | null) => void } => {\n const context = useContext(DragContext);\n const elementRef = useRef<HTMLElement | null>(null);\n const droppableRef = useRef<Droppable | null>(null);\n const ref = useCallback((element: HTMLElement | null): void => {\n elementRef.current = element;\n if (droppableRef.current) {\n droppableRef.current.element = element ?? undefined;\n }\n }, []);\n const layerId = context?.layerId;\n const manager = context?.manager;\n\n useEffect(() => {\n if (!manager || layerId === undefined) {\n return undefined;\n }\n\n const droppable = new Droppable(\n {\n collisionDetector: topmostPointerIntersection,\n data: { layerId, tabsetId, type: \"tabset\" },\n id: `${layerId}:${tabsetId}`,\n },\n manager,\n );\n droppable.element = elementRef.current ?? undefined;\n droppableRef.current = droppable;\n return () => {\n droppable.destroy();\n droppableRef.current = null;\n };\n }, [layerId, manager, tabsetId]);\n\n return useMemo(() => ({ ref }), [ref]);\n};\n\ntype ExternalTabSourceOptions = {\n createTab: () => TabNode;\n disabled?: boolean;\n label?: string;\n};\n\nconst useExternalTabSource = ({\n createTab,\n disabled = false,\n label = \"\",\n}: ExternalTabSourceOptions): { ref: (element: Element | null) => void } => {\n const id = useId();\n const createTabRef = useRef(createTab);\n\n useEffect(() => {\n createTabRef.current = createTab;\n }, [createTab]);\n const data = useMemo(\n () =>\n ({\n createTab: (): TabNode => createTabRef.current(),\n type: \"external\",\n }) satisfies DashfooDragData,\n [],\n );\n return useDraggableEntity({ data, id: `external-${id}` }, disabled, label);\n};\n\n/**\n * Reads the root's actor, so it works from an overlay mounted beside the layout\n * rather than inside a drag layer. Outside a provider it reports the empty state\n * instead of throwing.\n */\nconst useDragSubject = (): DragSubject | null => {\n const actorRef = useContext(DragRootContext)?.actorRef;\n return useSelector(actorRef, (snapshot) => {\n const drag = snapshot?.context.drag;\n return drag?.kind === \"dragging\" ? drag.subject : null;\n });\n};\n\nconst useDropIntent = (): DropIntent | null => {\n const actorRef = useContext(DragRootContext)?.actorRef;\n return useSelector(\n actorRef,\n (snapshot) => {\n const drag = snapshot?.context.drag;\n return drag?.kind === \"dragging\" ? (drag.drop?.intent ?? null) : null;\n },\n sameDropIntent,\n );\n};\n\nexport type {\n DragActor,\n DragContextValue,\n DashfooDragManager,\n DragRootContextValue,\n DragScope,\n ExternalTabSourceOptions,\n};\nexport {\n createDragManager,\n DragContext,\n DragRootContext,\n sameDropIntent,\n SharedDragManagerContext,\n useDragSubject,\n useDropIntent,\n useExternalTabSource,\n useTabDraggable,\n useTabsetDraggable,\n useTabsetDroppable,\n};\n","\"use client\";\n\nimport type { Dashfoo } from \"@dashfoo/core\";\nimport { fromJSON, toJSON } from \"@dashfoo/core\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\ntype StorageAdapter = {\n getItem: (key: string) => string | null;\n removeItem: (key: string) => void;\n setItem: (key: string, value: string) => void;\n};\n\nconst memoryStorageAdapter = (): StorageAdapter => {\n const store = new Map<string, string>();\n return {\n getItem: (key) => store.get(key) ?? null,\n removeItem: (key) => {\n store.delete(key);\n },\n setItem: (key, value) => {\n store.set(key, value);\n },\n };\n};\n\nconst localStorageAdapter: StorageAdapter = {\n getItem: (key) => {\n if (typeof window === \"undefined\") {\n return null;\n }\n try {\n return window.localStorage.getItem(key);\n } catch (error) {\n // oxlint-disable-next-line no-console -- dashfoo reports degraded paths on the developer console instead of failing silently\n console.warn(\"[dashfoo] failed to load persisted layout\", error);\n return null;\n }\n },\n removeItem: (key) => {\n if (typeof window === \"undefined\") {\n return;\n }\n try {\n window.localStorage.removeItem(key);\n } catch (error) {\n // oxlint-disable-next-line no-console -- dashfoo reports degraded paths on the developer console instead of failing silently\n console.warn(\"[dashfoo] failed to clear persisted layout\", error);\n }\n },\n setItem: (key, value) => {\n if (typeof window === \"undefined\") {\n return;\n }\n try {\n window.localStorage.setItem(key, value);\n } catch (error) {\n // oxlint-disable-next-line no-console -- dashfoo reports degraded paths on the developer console instead of failing silently\n console.warn(\"[dashfoo] failed to persist layout\", error);\n }\n },\n};\n\ntype PersistConfig = {\n debounceMs: number;\n key: string;\n storage: StorageAdapter;\n};\n\nconst removeStoredLayout = ({ key, storage }: PersistConfig): void => {\n try {\n storage.removeItem(key);\n } catch (error) {\n // oxlint-disable-next-line no-console -- dashfoo reports degraded paths on the developer console instead of failing silently\n console.warn(\"[dashfoo] failed to clear persisted layout\", error);\n }\n};\n\ntype Persistence = {\n clear: () => void;\n\n initialModel: Dashfoo | undefined;\n save: (model: Dashfoo) => void;\n};\n\nconst usePersistence = (\n config: PersistConfig | null,\n defaultModel: Dashfoo | undefined,\n): Persistence => {\n const configRef = useRef(config);\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n const [initialModel, setInitialModel] = useState(defaultModel);\n const loaded = useRef(false);\n useEffect(() => {\n // A browser-only read during render disagrees with SSR. Load once after\n // hydration; the layout applies this snapshot without recording an action.\n if (loaded.current) {\n return;\n }\n loaded.current = true;\n const current = configRef.current;\n if (current === null || defaultModel === undefined) {\n return;\n }\n try {\n const raw = current.storage.getItem(current.key);\n if (raw === null) {\n return;\n }\n try {\n const restored = fromJSON(raw);\n setInitialModel(restored);\n } catch (error) {\n // oxlint-disable-next-line no-console -- dashfoo reports degraded paths on the developer console instead of failing silently\n console.warn(\"[dashfoo] discarding unreadable persisted layout\", error);\n removeStoredLayout(current);\n }\n } catch (error) {\n // oxlint-disable-next-line no-console -- dashfoo reports degraded paths on the developer console instead of failing silently\n console.warn(\"[dashfoo] failed to load persisted layout\", error);\n }\n }, [defaultModel]);\n\n const loadedKey = useRef(config?.key);\n useEffect(() => {\n if (config !== null && config.key !== loadedKey.current) {\n // oxlint-disable-next-line no-console -- dashfoo reports degraded paths on the developer console instead of failing silently\n console.warn(\n \"[dashfoo] persist key changed for a mounted layout; the displayed layout still reflects the previous key; remount (key={persistKey}) to load the new key\",\n );\n loadedKey.current = config.key;\n }\n }, [config]);\n\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const pending = useRef<{ key: string; storage: StorageAdapter; value: string } | null>(null);\n\n const flush = useCallback((): void => {\n if (timer.current !== null) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n if (pending.current !== null) {\n const write = pending.current;\n pending.current = null;\n try {\n write.storage.setItem(write.key, write.value);\n } catch (error) {\n // oxlint-disable-next-line no-console -- dashfoo reports degraded paths on the developer console instead of failing silently\n console.warn(\"[dashfoo] failed to persist layout\", error);\n }\n }\n }, []);\n\n const save = useCallback(\n (next: Dashfoo): void => {\n const current = configRef.current;\n if (current === null) {\n return;\n }\n pending.current = { key: current.key, storage: current.storage, value: toJSON(next) };\n if (timer.current !== null) {\n clearTimeout(timer.current);\n }\n timer.current = setTimeout(flush, current.debounceMs);\n },\n [flush],\n );\n\n useEffect(() => {\n const handlePageHide = (): void => {\n flush();\n };\n const handleVisibilityChange = (): void => {\n if (document.visibilityState === \"hidden\") {\n flush();\n }\n };\n window.addEventListener(\"pagehide\", handlePageHide);\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n return () => {\n window.removeEventListener(\"pagehide\", handlePageHide);\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n flush();\n };\n }, [flush]);\n\n const clear = useCallback((): void => {\n if (timer.current !== null) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n pending.current = null;\n const current = configRef.current;\n if (current !== null) {\n removeStoredLayout(current);\n }\n }, []);\n\n return useMemo(() => ({ clear, initialModel, save }), [clear, initialModel, save]);\n};\n\nexport { localStorageAdapter, memoryStorageAdapter, usePersistence };\nexport type { Persistence, PersistConfig, StorageAdapter };\n","\"use client\";\n\nimport type { Dashfoo } from \"@dashfoo/core\";\nimport { useEffect, useMemo, useState } from \"react\";\n\ntype Breakpoint = {\n compact?: boolean;\n id: string;\n model: Dashfoo;\n query?: { maxWidth: number } | { media: string };\n};\n\ntype UseResponsiveModelOptions = { breakpoints: Array<Breakpoint> };\n\ntype ResponsiveModel = {\n breakpoint: string;\n containerRef: (element: HTMLElement | null) => void;\n draggableTabs: boolean;\n draggableTabsets: boolean;\n isCompact: boolean;\n model: Dashfoo;\n resizableSplits: boolean;\n};\n\nconst hasMatchMedia = (): boolean =>\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\";\n\nconst matchBreakpoint = (breakpoint: Breakpoint, width: number): boolean => {\n const { query } = breakpoint;\n if (!query) {\n return true;\n }\n if (\"maxWidth\" in query) {\n return width <= query.maxWidth;\n }\n return hasMatchMedia() && window.matchMedia(query.media).matches;\n};\n\nconst activeBreakpoint = (breakpoints: Array<Breakpoint>, width: number): Breakpoint => {\n const fallback = breakpoints.at(-1);\n if (!fallback) {\n throw new Error(\"useResponsiveModel requires at least one breakpoint.\");\n }\n return breakpoints.find((breakpoint) => matchBreakpoint(breakpoint, width)) ?? fallback;\n};\n\nconst observeWidth = (element: HTMLElement, onWidth: (width: number) => void): (() => void) => {\n const observer = new ResizeObserver((entries) => {\n const entry = entries.at(0);\n if (entry) {\n onWidth(entry.contentRect.width);\n }\n });\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n};\n\nconst listenToMedia = (list: MediaQueryList, handleChange: () => void): (() => void) => {\n list.addEventListener(\"change\", handleChange);\n return () => {\n list.removeEventListener(\"change\", handleChange);\n };\n};\n\nconst useContainerWidth = (): [(element: HTMLElement | null) => void, number] => {\n const [width, setWidth] = useState<number>(Number.POSITIVE_INFINITY);\n const [container, setContainer] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!container) {\n return undefined;\n }\n // React 18 replays effects without replaying callback refs in StrictMode.\n // Create and disconnect the observer in the same lifecycle.\n return observeWidth(container, setWidth);\n }, [container]);\n\n return [setContainer, width];\n};\n\nconst useResponsiveModel = ({ breakpoints }: UseResponsiveModelOptions): ResponsiveModel => {\n const [containerRef, width] = useContainerWidth();\n const [, setMediaTick] = useState(0);\n\n useEffect(() => {\n if (!hasMatchMedia()) {\n return undefined;\n }\n const lists = breakpoints.flatMap((breakpoint) =>\n breakpoint.query && \"media\" in breakpoint.query\n ? [window.matchMedia(breakpoint.query.media)]\n : [],\n );\n if (lists.length === 0) {\n return undefined;\n }\n const handleChange = (): void => {\n setMediaTick((tick) => tick + 1);\n };\n const cleanups = lists.map((list) => listenToMedia(list, handleChange));\n return () => {\n for (const cleanup of cleanups) {\n cleanup();\n }\n };\n }, [breakpoints]);\n\n const active = activeBreakpoint(breakpoints, width);\n\n return useMemo(() => {\n const isCompact = active.compact === true;\n return {\n breakpoint: active.id,\n containerRef,\n draggableTabs: !isCompact,\n draggableTabsets: !isCompact,\n isCompact,\n model: active.model,\n resizableSplits: !isCompact,\n };\n }, [active, containerRef]);\n};\n\nexport { activeBreakpoint, matchBreakpoint, useContainerWidth, useResponsiveModel };\nexport type { Breakpoint, ResponsiveModel, UseResponsiveModelOptions };\n","const warned = new Set<string>();\n\nconst warnOnce = (key: string, message: string): void => {\n if (warned.has(key)) {\n return;\n }\n warned.add(key);\n // oxlint-disable-next-line no-console -- dashfoo reports degraded paths on the developer console instead of failing silently\n console.warn(`[dashfoo] ${message}`);\n};\n\nexport { warnOnce };\n","\"use client\";\n\nimport type { Action, Dashfoo } from \"@dashfoo/core\";\nimport { canRedo, canUndo, dashfooMachine, normalize, reducer } from \"@dashfoo/core\";\nimport { useActorRef, useSelector } from \"@xstate/react\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nimport { warnOnce } from \"../lib/warn-once\";\n\nconst CONTROLLED_HISTORY_MESSAGE =\n \"undo/redo are unavailable while `model` is controlled; keep the history in the state you own and drive it through onModelChange\";\n\nconst CONTROLLED_SET_MODEL_MESSAGE =\n \"setModel (and resetLayout) do nothing while `model` is controlled; set the model you own instead\";\n\nconst CONTROLLED_MODE_SWITCH_MESSAGE =\n \"`model` was added or removed after mount; a layout is controlled or uncontrolled for its whole life, so the first render wins. Remount (key=…) to switch\";\n\nconst CONTROLLED_WITH_DEFAULT_MESSAGE =\n \"`model` and `defaultModel` were both passed; `model` wins and `defaultModel` (and `persist`) are ignored\";\n\ntype DashfooStore = {\n canRedo: () => boolean;\n canUndo: () => boolean;\n dispatch: (action: Action) => void;\n model: Dashfoo;\n redo: () => void;\n setModel: (model: Dashfoo) => void;\n undo: () => void;\n};\n\ntype UseDashfooStoreOptions = {\n defaultModel?: Dashfoo;\n model?: Dashfoo;\n onAction?: (action: Action) => Action | null;\n onActiveTabsetChange?: (tabsetId: string | undefined) => void;\n onMaximizedTabsetChange?: (tabsetId: string | undefined) => void;\n onModelChange?: (model: Dashfoo, action?: Action) => void;\n};\n\n/** The mode is latched on the first render; running both sources leaves the\n * unread one describing a document nobody rendered. */\nconst useDashfooStore = (options: UseDashfooStoreOptions): DashfooStore => {\n const {\n defaultModel,\n model: controlledModel,\n onAction,\n onActiveTabsetChange,\n onMaximizedTabsetChange,\n onModelChange,\n } = options;\n const initialModel = controlledModel ?? defaultModel;\n if (initialModel === undefined) {\n throw new Error(\"useDashfooStore requires either a `model` or a `defaultModel`.\");\n }\n\n const [controlled] = useState(() => controlledModel !== undefined);\n if (controlled !== (controlledModel !== undefined)) {\n warnOnce(\"controlled-mode-switch\", CONTROLLED_MODE_SWITCH_MESSAGE);\n }\n if (controlled && defaultModel !== undefined) {\n warnOnce(\"controlled-with-default\", CONTROLLED_WITH_DEFAULT_MESSAGE);\n }\n\n const actorRef = useActorRef(dashfooMachine, { input: { model: normalize(initialModel) } });\n const history = useSelector(actorRef, (snapshot) => snapshot.context.history);\n\n const model = useMemo(\n () => (controlledModel === undefined ? history.present : normalize(controlledModel)),\n [controlledModel, history.present],\n );\n\n const notify = useCallback(\n (before: Dashfoo, after: Dashfoo, action?: Action) => {\n if (Object.is(before, after)) {\n return;\n }\n onModelChange?.(after, action);\n if (after.activeTabsetId !== before.activeTabsetId) {\n onActiveTabsetChange?.(after.activeTabsetId);\n }\n if (after.maximizedTabsetId !== before.maximizedTabsetId) {\n onMaximizedTabsetChange?.(after.maximizedTabsetId);\n }\n },\n [onModelChange, onActiveTabsetChange, onMaximizedTabsetChange],\n );\n\n const dispatch = useCallback(\n (action: Action) => {\n const resolved = onAction ? onAction(action) : action;\n if (!resolved) {\n return;\n }\n\n if (controlled) {\n notify(model, reducer(model, resolved), resolved);\n return;\n }\n\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ action: resolved, type: \"DISPATCH\" });\n notify(before, actorRef.getSnapshot().context.history.present, resolved);\n },\n [actorRef, controlled, model, notify, onAction],\n );\n\n const undo = useCallback(() => {\n if (controlled) {\n warnOnce(\"controlled-undo\", CONTROLLED_HISTORY_MESSAGE);\n return;\n }\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ type: \"UNDO\" });\n notify(before, actorRef.getSnapshot().context.history.present);\n }, [actorRef, controlled, notify]);\n\n const redo = useCallback(() => {\n if (controlled) {\n warnOnce(\"controlled-redo\", CONTROLLED_HISTORY_MESSAGE);\n return;\n }\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ type: \"REDO\" });\n notify(before, actorRef.getSnapshot().context.history.present);\n }, [actorRef, controlled, notify]);\n\n const setModel = useCallback(\n (next: Dashfoo) => {\n if (controlled) {\n warnOnce(\"controlled-set-model\", CONTROLLED_SET_MODEL_MESSAGE);\n return;\n }\n actorRef.send({ model: normalize(next), type: \"SET_MODEL\" });\n },\n [actorRef, controlled],\n );\n\n return useMemo(\n () => ({\n canRedo: () => !controlled && canRedo(actorRef.getSnapshot().context.history),\n canUndo: () => !controlled && canUndo(actorRef.getSnapshot().context.history),\n dispatch,\n model,\n redo,\n setModel,\n undo,\n }),\n [actorRef, controlled, dispatch, model, redo, setModel, undo],\n );\n};\n\nexport { useDashfooStore };\nexport type { DashfooStore, UseDashfooStoreOptions };\n","import type { Dashfoo, Orientation, RowNode } from \"@dashfoo/core\";\n\nconst compactRow = (node: RowNode, orientation: Orientation): RowNode => {\n const children = node.children.map((child) =>\n child.type === \"row\" ? compactRow(child, orientation) : { ...child, weight: 1 },\n );\n return {\n ...node,\n children,\n orientation,\n weight: children.reduce((sum, child) => sum + child.weight, 0),\n };\n};\n\n// Flattening with core's stackModel reparents nested tabsets in React, losing\n// widget state. Keep every ancestor and distribute space by descendant count.\nconst compactModel = (model: Dashfoo, orientation: Orientation = \"column\"): Dashfoo => ({\n ...model,\n layout: compactRow(model.layout, orientation),\n maximizedTabsetId: undefined,\n});\n\nexport { compactModel };\n","import type { DragSubject, TabNode } from \"@dashfoo/core\";\nimport { tabNodeSchema } from \"@dashfoo/core\";\nimport type { Data } from \"@dnd-kit/abstract\";\nimport type { Draggable } from \"@dnd-kit/dom\";\n\ntype DashfooDragData =\n | { label?: string; type: \"tab\" }\n | { label?: string; layerId?: string; tabsetId: string; type: \"tabset\" }\n | { createTab: () => TabNode; label?: string; type: \"external\" };\n\ntype DragSource = Pick<Draggable, \"data\" | \"id\">;\n\nconst isTabFactory = (value: Data[string]): value is () => TabNode => typeof value === \"function\";\n\n/** Beside the manager wiring, not the layer adapter: `dragstart` fires once per\n * gesture on the shared manager, above any one layer. */\nconst subjectFor = (source: DragSource): DragSubject | null => {\n const data = source.data;\n if (data.type === \"tabset\") {\n return { id: String(data.tabsetId), kind: \"tabset\" };\n }\n if (data.type === \"external\") {\n if (!isTabFactory(data.createTab)) {\n // oxlint-disable-next-line no-console -- dashfoo reports degraded paths on the developer console instead of failing silently\n console.warn(\"[dashfoo] external drag source is missing its createTab function\");\n return null;\n }\n let candidate: ReturnType<typeof data.createTab>;\n try {\n candidate = data.createTab();\n } catch (error) {\n // oxlint-disable-next-line no-console -- dashfoo reports degraded paths on the developer console instead of failing silently\n console.warn(\"[dashfoo] external drag source createTab threw\", error);\n return null;\n }\n const parsed = tabNodeSchema.safeParse(candidate);\n if (!parsed.success) {\n // oxlint-disable-next-line no-console -- dashfoo reports degraded paths on the developer console instead of failing silently\n console.warn(\"[dashfoo] external drag source returned an invalid tab\", parsed.error);\n return null;\n }\n return { id: String(source.id), kind: \"external\", tab: parsed.data };\n }\n return { id: String(source.id), kind: \"tab\" };\n};\n\nexport { subjectFor };\nexport type { DashfooDragData, DragSource };\n","import type { Point, Rect } from \"@dashfoo/core\";\n\ntype Zone = { height: number; width: number; x: number; y: number };\n\nconst pointInRect = (point: Point, rect: Rect): boolean =>\n point.x >= rect.x &&\n point.x <= rect.x + rect.width &&\n point.y >= rect.y &&\n point.y <= rect.y + rect.height;\n\nconst insertionIndex = (rects: ReadonlyArray<Rect>, pointerX: number): number => {\n const found = rects.findIndex((rect) => pointerX < rect.x + rect.width / 2);\n return found === -1 ? rects.length : found;\n};\n\nconst INSERTION_LINE_WIDTH = 4;\n\nconst insertionLineRect = (\n stripRect: Rect,\n itemRects: ReadonlyArray<Rect>,\n index: number,\n): Zone => {\n const at = itemRects.at(index);\n const last = itemRects.at(-1);\n const x = at?.x ?? (last ? last.x + last.width : stripRect.x);\n const left = x - INSERTION_LINE_WIDTH / 2;\n return {\n height: stripRect.height,\n width: INSERTION_LINE_WIDTH,\n x: Math.max(stripRect.x, Math.min(left, stripRect.x + stripRect.width - INSERTION_LINE_WIDTH)),\n y: stripRect.y,\n };\n};\n\nconst shouldAllowDrop = (\n draggedId: string | undefined,\n targetId: string,\n tabIds: ReadonlyArray<string>,\n): boolean => {\n if (draggedId === `grip-${targetId}`) {\n return false;\n }\n if (tabIds.length === 1 && tabIds[0] === draggedId) {\n return false;\n }\n return true;\n};\n\nexport { insertionIndex, insertionLineRect, pointInRect, shouldAllowDrop };\nexport type { Zone };\n","\"use client\";\n\nimport type { Point } from \"@dashfoo/core\";\nimport { zoneRect } from \"@dashfoo/core\";\nimport { Feedback } from \"@dnd-kit/dom\";\nimport type { DragStartEvent } from \"@dnd-kit/dom\";\nimport { useSelector } from \"@xstate/react\";\nimport type { ReactNode } from \"react\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport type { DashfooDragManager, DragActor } from \"../hooks/drag-hooks\";\nimport type { DragSource } from \"../lib/drag-subject\";\nimport type { Zone } from \"../lib/tab-insertion\";\nimport { insertionLineRect } from \"../lib/tab-insertion\";\n\nconst DockZone = ({\n insertion = false,\n zIndex,\n zone,\n}: {\n insertion?: boolean;\n zIndex: number | \"auto\";\n zone: Zone;\n}): ReactNode => (\n <div\n data-dashfoo=\"dock-indicator\"\n data-insertion={insertion || undefined}\n style={{\n \"--dashfoo-dock-height\": `${zone.height}px`,\n \"--dashfoo-dock-left\": `${zone.x}px`,\n \"--dashfoo-dock-top\": `${zone.y}px`,\n \"--dashfoo-dock-width\": `${zone.width}px`,\n \"--dashfoo-dock-z\": zIndex,\n }}\n />\n);\n\nconst tabItemRects = (strip: Element, excludeId?: string): Array<DOMRect> =>\n [...strip.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab-item\"]')].flatMap((item) =>\n item.querySelector<HTMLElement>('[data-dashfoo=\"tab\"]')?.dataset.tabId === excludeId\n ? []\n : [item.getBoundingClientRect()],\n );\n\nconst DockIndicator = ({\n actorRef,\n getTabsetElement,\n}: {\n actorRef: DragActor;\n getTabsetElement: (id: string) => HTMLElement | undefined;\n}): ReactNode => {\n const drag = useSelector(actorRef, (snapshot) => snapshot.context.drag);\n if (drag.kind !== \"dragging\" || drag.drop === null) {\n return null;\n }\n const { intent } = drag.drop;\n const draggedId = drag.subject.id;\n const element = getTabsetElement(intent.targetId);\n if (!element) {\n return null;\n }\n\n const zIndex = element.closest('[data-dashfoo=\"float\"]') ? 9999 : \"auto\";\n if (intent.location === \"center\") {\n const strip = element.querySelector('[data-dashfoo=\"tabstrip\"]');\n if (strip) {\n const line = insertionLineRect(\n strip.getBoundingClientRect(),\n tabItemRects(strip, draggedId),\n intent.index ?? 0,\n );\n return <DockZone insertion zIndex={zIndex} zone={line} />;\n }\n }\n const zone = zoneRect(element.getBoundingClientRect(), intent.location);\n return <DockZone zIndex={zIndex} zone={zone} />;\n};\n\nconst PREVIEW_OFFSET: Point = { x: 12, y: 8 };\n\nconst labelOf = (source: DragSource | null): string => {\n if (typeof source?.data.label !== \"string\") {\n return \"\";\n }\n return source.data.label;\n};\n\ntype ChipState = { label: string; x: number; y: number };\n\nconst DragPreviewOverlay = ({ manager }: { manager: DashfooDragManager }): ReactNode => {\n const [chip, setChip] = useState<ChipState | null>(null);\n\n useEffect(() => {\n const handleStart = (event: DragStartEvent): void => {\n const source = event.operation.source;\n if (!source) {\n return;\n }\n const rect = source.element?.getBoundingClientRect();\n const point = event.operation.position.current;\n setChip({\n label: labelOf(source),\n x: PREVIEW_OFFSET.x + (rect ? point.x - rect.left : 0),\n y: PREVIEW_OFFSET.y + (rect ? point.y - rect.top : 0),\n });\n };\n const handleEnd = (): void => {\n setChip(null);\n };\n manager.monitor.addEventListener(\"dragstart\", handleStart);\n manager.monitor.addEventListener(\"dragend\", handleEnd);\n return () => {\n manager.monitor.removeEventListener(\"dragstart\", handleStart);\n manager.monitor.removeEventListener(\"dragend\", handleEnd);\n };\n }, [manager]);\n\n const attachOverlay = useCallback(\n (element: HTMLDivElement | null): void => {\n const feedback = manager.registry.plugins.get(Feedback);\n if (feedback) {\n feedback.overlay = element ?? undefined;\n }\n },\n [manager],\n );\n\n return (\n <div data-dnd-overlay=\"\" ref={attachOverlay}>\n {chip === null ? null : (\n <div\n data-dashfoo=\"drag-preview\"\n style={{\n \"--dashfoo-preview-x\": `${chip.x}px`,\n \"--dashfoo-preview-y\": `${chip.y}px`,\n }}\n >\n {chip.label}\n </div>\n )}\n </div>\n );\n};\n\nexport { DockIndicator, DragPreviewOverlay };\n","\"use client\";\n\nimport { dragDockMachine } from \"@dashfoo/core\";\nimport type { Data } from \"@dnd-kit/abstract\";\nimport type { DragEndEvent, DragStartEvent } from \"@dnd-kit/dom\";\nimport { useActorRef } from \"@xstate/react\";\nimport type { ReactNode } from \"react\";\nimport { useCallback, useEffect, useInsertionEffect, useMemo, useState } from \"react\";\n\nimport type { DragRootContextValue, DragScope } from \"../hooks/drag-hooks\";\nimport { createDragManager, DragRootContext, SharedDragManagerContext } from \"../hooks/drag-hooks\";\nimport { subjectFor } from \"../lib/drag-subject\";\n\nimport { DragPreviewOverlay } from \"./drag-preview-overlay\";\n\ntype ScopedTarget = { element: HTMLElement; scope: DragScope; tabsetId: string };\ntype ScopedTargetData = Data & { layerId: string; tabsetId: string };\n\nconst isScopedTargetData = (data: Data): data is ScopedTargetData =>\n typeof data.layerId === \"string\" && typeof data.tabsetId === \"string\";\n\nconst DashfooDragProvider = ({ children }: { children: ReactNode }): ReactNode => {\n const [manager] = useState(createDragManager);\n useInsertionEffect(\n () => () => {\n manager.destroy();\n },\n [manager],\n );\n\n const actorRef = useActorRef(dragDockMachine);\n\n const [scopes] = useState(() => new Map<string, DragScope>());\n const registerScope = useCallback(\n (scope: DragScope): (() => void) => {\n scopes.set(scope.layerId, scope);\n return () => {\n scopes.delete(scope.layerId);\n };\n },\n [scopes],\n );\n\n // One listener set and one actor for the whole tree: per layer, a float that\n // did not own the target resolved a null intent and swallowed the drop.\n useEffect(() => {\n const scopedTarget = (): ScopedTarget | null => {\n const target = manager.dragOperation.target;\n const data = target?.data;\n const scope = data && isScopedTargetData(data) ? scopes.get(data.layerId) : undefined;\n const element = target?.element;\n if (!scope || !data || !isScopedTargetData(data) || !(element instanceof HTMLElement)) {\n return null;\n }\n return { element, scope, tabsetId: data.tabsetId };\n };\n\n const syncIntent = (): void => {\n const operation = manager.dragOperation;\n const found = scopedTarget();\n const draggedId = operation.source ? String(operation.source.id) : undefined;\n const intent =\n found === null\n ? null\n : found.scope.resolveIntent(\n found.tabsetId,\n found.element,\n operation.position.current,\n draggedId,\n );\n actorRef.send({\n drop: intent === null || found === null ? null : { intent, scope: found.scope.layerId },\n type: \"OVER\",\n });\n };\n\n const handleStart = (event: DragStartEvent): void => {\n const source = event.operation.source;\n if (!source) {\n return;\n }\n const subject = subjectFor(source);\n if (!subject) {\n manager.actions.stop({ canceled: true });\n return;\n }\n actorRef.send({ subject, type: \"START\" });\n };\n\n // `dragmove` and `collision` both fire per frame and each resolve measures\n // the target strip. The drop path stays synchronous: a deferred resolve\n // would land after the actor had already been asked to commit.\n let frame: number | null = null;\n const scheduleResolve = (): void => {\n if (frame !== null) {\n return;\n }\n frame = requestAnimationFrame(() => {\n frame = null;\n syncIntent();\n });\n };\n const cancelPendingResolve = (): void => {\n if (frame !== null) {\n cancelAnimationFrame(frame);\n frame = null;\n }\n };\n\n const handleEnd = (event: DragEndEvent): void => {\n cancelPendingResolve();\n if (event.canceled) {\n actorRef.send({ type: \"CANCEL\" });\n return;\n }\n syncIntent();\n actorRef.send({ type: \"DROP\" });\n };\n\n const commitSubscription = actorRef.on(\"COMMIT\", (emitted) => {\n scopes.get(emitted.scope)?.commit(emitted.action);\n });\n manager.monitor.addEventListener(\"dragstart\", handleStart);\n manager.monitor.addEventListener(\"dragmove\", scheduleResolve);\n manager.monitor.addEventListener(\"collision\", scheduleResolve);\n manager.monitor.addEventListener(\"dragend\", handleEnd);\n return () => {\n cancelPendingResolve();\n commitSubscription.unsubscribe();\n manager.monitor.removeEventListener(\"dragstart\", handleStart);\n manager.monitor.removeEventListener(\"dragmove\", scheduleResolve);\n manager.monitor.removeEventListener(\"collision\", scheduleResolve);\n manager.monitor.removeEventListener(\"dragend\", handleEnd);\n };\n }, [actorRef, manager, scopes]);\n\n const rootValue = useMemo<DragRootContextValue>(\n () => ({ actorRef, manager, registerScope }),\n [actorRef, manager, registerScope],\n );\n\n return (\n <SharedDragManagerContext.Provider value={manager}>\n <DragRootContext.Provider value={rootValue}>\n {children}\n <DragPreviewOverlay manager={manager} />\n </DragRootContext.Provider>\n </SharedDragManagerContext.Provider>\n );\n};\n\nexport { DashfooDragProvider };\n","\"use client\";\n\nimport type { Action, SnapConfig, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport type { ReactNode } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { createStore, useStore } from \"zustand\";\n\ntype LayoutState = {\n closableTabs: boolean;\n dispatch: (action: Action) => void;\n draggableTabs: boolean;\n draggableTabsets: boolean;\n editable: boolean;\n\n floatable: boolean;\n keepMounted: boolean;\n maximizable: boolean;\n maximizedTabsetId: string | undefined;\n renamableTabs: boolean;\n renderTab: (tab: TabNode) => ReactNode;\n renderTabLabel: ((tab: TabNode) => ReactNode) | undefined;\n renderTabsetToolbar: ((tabset: TabsetNode) => ReactNode) | undefined;\n resizableSplits: boolean;\n\n snap: SnapConfig | null;\n splitDock: boolean;\n tabLocation: \"bottom\" | \"top\";\n tabsetMinSize: number;\n tabStripEnabled: boolean;\n};\n\ntype LayoutStore = StoreApi<LayoutState>;\n\nconst createLayoutStore = (initial: LayoutState): LayoutStore =>\n createStore<LayoutState>(() => initial);\n\nconst LayoutStoreContext = createContext<LayoutStore | null>(null);\n\nconst useLayout = <T>(selector: (state: LayoutState) => T): T => {\n const store = useContext(LayoutStoreContext);\n if (store === null) {\n throw new Error(\"dashfoo components must be rendered inside <DashfooLayout> or <Layout.Root>.\");\n }\n return useStore(store, selector);\n};\n\nexport { createLayoutStore, LayoutStoreContext, useLayout };\nexport type { LayoutState, LayoutStore };\n","\"use client\";\n\nimport type { Action, DropIntent, Point } from \"@dashfoo/core\";\nimport { resolveDockTarget, splitEdge } from \"@dashfoo/core\";\nimport type { ReactNode } from \"react\";\nimport { useCallback, useContext, useEffect, useId, useMemo, useState } from \"react\";\n\nimport type { DragContextValue, DragScope } from \"../hooks/drag-hooks\";\nimport { DragContext, DragRootContext } from \"../hooks/drag-hooks\";\nimport { LayoutStoreContext } from \"../hooks/layout-store\";\nimport { insertionIndex, pointInRect, shouldAllowDrop } from \"../lib/tab-insertion\";\nimport { warnOnce } from \"../lib/warn-once\";\n\nimport { DashfooDragProvider } from \"./dashfoo-drag-provider\";\nimport { DockIndicator } from \"./drag-preview-overlay\";\n\nconst MISSING_ROOT =\n \"[dashfoo] DashfooDragProvider unmounted while its layout is still mounted; keep the provider above the layout or remount the layout\";\n\ntype StripMeasurement = { rect: DOMRect; tabIds: Array<string>; tabRects: Array<DOMRect> };\n\n/** One DOM pass per pointer move, where resolving a drop used to run three. */\nconst measureStrip = (element: HTMLElement, excludeId?: string): StripMeasurement | null => {\n const strip = element.querySelector('[data-dashfoo=\"tabstrip\"]');\n if (!strip) {\n return null;\n }\n const tabIds: Array<string> = [];\n const tabRects: Array<DOMRect> = [];\n for (const tab of strip.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')) {\n const tabId = tab.dataset.tabId ?? \"\";\n tabIds.push(tabId);\n if (tabId !== excludeId) {\n tabRects.push(tab.getBoundingClientRect());\n }\n }\n return { rect: strip.getBoundingClientRect(), tabIds, tabRects };\n};\n\nconst intentForTabset = (\n id: string,\n element: HTMLElement,\n point: Point,\n strip: StripMeasurement | null,\n): DropIntent => {\n if (strip && pointInRect(point, strip.rect)) {\n return {\n index: insertionIndex(strip.tabRects, point.x),\n location: \"center\",\n targetId: id,\n };\n }\n const location = resolveDockTarget(point, element.getBoundingClientRect());\n if (location === \"center\" && strip) {\n return { index: strip.tabRects.length, location, targetId: id };\n }\n return { location, targetId: id };\n};\n\ntype DragProviderProps = {\n children: ReactNode;\n\n onCommit?: (action: Action) => void;\n\n splitDock?: boolean;\n};\n\n/** One drag layer (the main tree, or one float). Holds no drag state of its own. */\nconst DragScope = ({ children, onCommit, splitDock }: DragProviderProps): ReactNode => {\n const root = useContext(DragRootContext);\n const layoutStore = useContext(LayoutStoreContext);\n const layerId = useId();\n\n const manager = root?.manager;\n const getTabsetElement = useCallback(\n (id: string): HTMLElement | undefined => {\n const element = manager?.registry.droppables.get(`${layerId}:${id}`)?.element;\n return element instanceof HTMLElement ? element : undefined;\n },\n [layerId, manager],\n );\n\n const scope = useMemo<DragScope>(\n () => ({\n commit: (action) => {\n if (layoutStore?.getState().editable === false) {\n return;\n }\n const commit = onCommit ?? layoutStore?.getState().dispatch;\n if (!commit) {\n warnOnce(\n \"drag-layer-no-commit\",\n \"Layout.DragLayer has neither an onCommit prop nor a <Layout.Root> above it; drops are ignored\",\n );\n return;\n }\n commit(action);\n },\n layerId,\n resolveIntent: (targetId, element, point, draggedId) => {\n if (layoutStore?.getState().editable === false) {\n return null;\n }\n const strip = measureStrip(element, draggedId);\n if (!shouldAllowDrop(draggedId, targetId, strip?.tabIds ?? [])) {\n return null;\n }\n const intent = intentForTabset(targetId, element, point, strip);\n\n const splitDockResolved = splitDock ?? layoutStore?.getState().splitDock ?? true;\n if (!splitDockResolved && splitEdge(intent.location) !== undefined) {\n return { location: \"center\", targetId };\n }\n return intent;\n },\n }),\n [layerId, layoutStore, onCommit, splitDock],\n );\n\n const registerScope = root?.registerScope;\n useEffect(() => registerScope?.(scope), [registerScope, scope]);\n\n const contextValue = useMemo<DragContextValue | null>(\n () => (root === null ? null : { actorRef: root.actorRef, layerId, manager: root.manager }),\n [layerId, root],\n );\n\n if (contextValue === null) {\n throw new Error(MISSING_ROOT);\n }\n\n return (\n <DragContext.Provider value={contextValue}>\n {children}\n <DockIndicator actorRef={contextValue.actorRef} getTabsetElement={getTabsetElement} />\n </DragContext.Provider>\n );\n};\n\n/**\n * Mounts its own root when there is none above it. Decided on the first render:\n * a root that disappears later means a torn-down tree, which `DragScope` reports.\n */\nconst DragProvider = (props: DragProviderProps): ReactNode => {\n const hasRoot = useContext(DragRootContext) !== null;\n const [ownsRoot] = useState(() => !hasRoot);\n const layer = <DragScope {...props} />;\n\n return ownsRoot ? <DashfooDragProvider>{layer}</DashfooDragProvider> : layer;\n};\n\nexport {\n useDragSubject,\n useTabDraggable,\n useTabsetDraggable,\n useTabsetDroppable,\n} from \"../hooks/drag-hooks\";\nexport { DragProvider };\nexport type { DragProviderProps };\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\n\nconst FloatLayerContext = createContext(false);\n\nconst useHasFloatLayer = (): boolean => useContext(FloatLayerContext);\n\nexport { FloatLayerContext, useHasFloatLayer };\n","import type { ResizeEdges } from \"../lib/float-geometry\";\n\nconst RESIZE_HANDLES: ReadonlyArray<{ edges: ResizeEdges; key: string }> = [\n { edges: { x: 0, y: -1 }, key: \"n\" },\n { edges: { x: 0, y: 1 }, key: \"s\" },\n { edges: { x: 1, y: 0 }, key: \"e\" },\n { edges: { x: -1, y: 0 }, key: \"w\" },\n { edges: { x: 1, y: -1 }, key: \"ne\" },\n { edges: { x: -1, y: -1 }, key: \"nw\" },\n { edges: { x: 1, y: 1 }, key: \"se\" },\n { edges: { x: -1, y: 1 }, key: \"sw\" },\n];\nconst EDGE_BY_KEY = new Map<string, ResizeEdges>(RESIZE_HANDLES.map((h) => [h.key, h.edges]));\nexport { EDGE_BY_KEY, RESIZE_HANDLES };\n","\"use client\";\n\nimport type { Geometry } from \"@dashfoo/core\";\n\nconst MIN_WIDTH = 200;\nconst MIN_HEIGHT = 120;\n\nconst DEFAULT_WIDTH = 480;\nconst DEFAULT_HEIGHT = 340;\n\nconst LIFT_OFFSET = 16;\n\ntype Size = { height: number; width: number };\n\nconst clampToBounds = (rect: Geometry, bounds: Size, size: Size = rect): Geometry => ({\n height: rect.height,\n left: Math.max(0, Math.min(rect.left, Math.max(0, bounds.width - size.width))),\n top: Math.max(0, Math.min(rect.top, Math.max(0, bounds.height - size.height))),\n width: rect.width,\n});\n\nconst measureFloatRect = (element: Element): Geometry => {\n const tabsetElement = element.closest('[data-dashfoo=\"tabset\"]') ?? element;\n const rect = tabsetElement.getBoundingClientRect();\n const seeded: Geometry = {\n height: Math.max(MIN_HEIGHT, Math.min(Math.round(rect.height), DEFAULT_HEIGHT)),\n left: Math.round(rect.left) + LIFT_OFFSET,\n top: Math.round(rect.top) + LIFT_OFFSET,\n width: Math.max(MIN_WIDTH, Math.min(Math.round(rect.width), DEFAULT_WIDTH)),\n };\n return clampToBounds(seeded, { height: window.innerHeight, width: window.innerWidth });\n};\n\ntype ResizeEdges = { x: -1 | 0 | 1; y: -1 | 0 | 1 };\n\nconst resizeRect = (start: Geometry, edges: ResizeEdges, dx: number, dy: number): Geometry => {\n let { height, left, top, width } = start;\n if (edges.x === 1) {\n width = Math.max(MIN_WIDTH, start.width + dx);\n } else if (edges.x === -1) {\n width = Math.max(MIN_WIDTH, start.width - dx);\n left = Math.max(0, start.left + (start.width - width));\n }\n if (edges.y === 1) {\n height = Math.max(MIN_HEIGHT, start.height + dy);\n } else if (edges.y === -1) {\n height = Math.max(MIN_HEIGHT, start.height - dy);\n top = Math.max(0, start.top + (start.height - height));\n }\n return { height, left, top, width };\n};\n\nexport { clampToBounds, measureFloatRect, resizeRect };\nexport type { ResizeEdges, Size };\n","\"use client\";\n\nimport type { Geometry } from \"@dashfoo/core\";\nimport type { CSSProperties, PointerEvent as ReactPointerEvent } from \"react\";\nimport { useRef } from \"react\";\n\nimport { EDGE_BY_KEY } from \"../components/float-resize-handles\";\nimport type { ResizeEdges, Size } from \"../lib/float-geometry\";\nimport { clampToBounds, resizeRect } from \"../lib/float-geometry\";\n\nconst CHIP_SIZE: Size = { height: 34, width: 168 };\n\nconst TAP_SLOP = 4;\n\nconst releaseCapture = (panel: HTMLElement, pointerId: number): void => {\n // oxlint-disable-next-line typescript/no-unnecessary-condition -- jsdom and older engines lack hasPointerCapture despite the DOM typings\n if (panel.hasPointerCapture?.(pointerId)) {\n panel.releasePointerCapture(pointerId);\n }\n};\n\n/** `moved` and `latest` live here because they only mean anything mid-gesture. */\ntype Gesture = {\n bounds: Size;\n edges: ResizeEdges | null;\n initialStyle: Record<string, string>;\n latest: Geometry;\n moved: boolean;\n pointerId: number;\n start: Geometry;\n startX: number;\n startY: number;\n};\n\ntype FloatGestureOptions = {\n editable: boolean;\n geometry: Geometry;\n minimized: boolean;\n onCommit: (geometry: Geometry) => void;\n onTap: () => void;\n};\n\ntype FloatGestureHandlers = {\n onPointerCancel: (event: ReactPointerEvent) => void;\n onPointerDown: (event: ReactPointerEvent<HTMLElement>) => void;\n onPointerMove: (event: ReactPointerEvent) => void;\n onPointerUp: (event: ReactPointerEvent) => void;\n};\n\ntype FloatGesture = {\n handlers: FloatGestureHandlers;\n ref: (element: HTMLElement | null) => void;\n style: CSSProperties;\n};\n\nconst useFloatGesture = ({\n editable,\n geometry,\n minimized,\n onCommit,\n onTap,\n}: FloatGestureOptions): FloatGesture => {\n const panelRef = useRef<HTMLElement | null>(null);\n const gestureRef = useRef<Gesture | null>(null);\n\n const setPanel = (element: HTMLElement | null): void => {\n panelRef.current = element;\n };\n\n const handlePointerDown = (event: ReactPointerEvent<HTMLElement>): void => {\n const panel = panelRef.current;\n\n if (!panel || !editable) {\n return;\n }\n\n const prior = gestureRef.current;\n if (prior) {\n releaseCapture(panel, prior.pointerId);\n }\n const edgeKey = event.currentTarget.dataset.edge;\n\n const parent = panel.offsetParent instanceof HTMLElement ? panel.offsetParent : null;\n const rect = panel.getBoundingClientRect();\n const visibleGeometry = {\n height: minimized ? geometry.height : rect.height,\n left: rect.left,\n top: rect.top,\n width: minimized ? geometry.width : rect.width,\n };\n const gesture: Gesture = {\n bounds: { height: parent?.clientHeight ?? 0, width: parent?.clientWidth ?? 0 },\n edges: edgeKey === undefined ? null : (EDGE_BY_KEY.get(edgeKey) ?? null),\n initialStyle: {\n \"--dashfoo-float-height\": panel.style.getPropertyValue(\"--dashfoo-float-height\"),\n \"--dashfoo-float-left\": panel.style.getPropertyValue(\"--dashfoo-float-left\"),\n \"--dashfoo-float-top\": panel.style.getPropertyValue(\"--dashfoo-float-top\"),\n \"--dashfoo-float-width\": panel.style.getPropertyValue(\"--dashfoo-float-width\"),\n },\n latest: visibleGeometry,\n moved: false,\n pointerId: event.pointerId,\n start: visibleGeometry,\n startX: event.clientX,\n startY: event.clientY,\n };\n gestureRef.current = gesture;\n\n if (gesture.edges) {\n panel.setPointerCapture(event.pointerId);\n }\n };\n\n const handlePointerUp = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n if (!gesture || event.pointerId !== gesture.pointerId) {\n return;\n }\n gestureRef.current = null;\n\n const panel = panelRef.current;\n if (panel) {\n releaseCapture(panel, event.pointerId);\n }\n\n if (!gesture.moved) {\n onTap();\n return;\n }\n onCommit(gesture.latest);\n };\n\n const handlePointerMove = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n const panel = panelRef.current;\n if (!gesture || !panel || event.pointerId !== gesture.pointerId) {\n return;\n }\n\n if (event.buttons === 0) {\n handlePointerUp(event);\n return;\n }\n const dx = event.clientX - gesture.startX;\n const dy = event.clientY - gesture.startY;\n if (!gesture.moved) {\n if (Math.hypot(dx, dy) <= TAP_SLOP) {\n return;\n }\n gesture.moved = true;\n\n if (!gesture.edges) {\n panel.setPointerCapture(gesture.pointerId);\n }\n }\n const next = gesture.edges\n ? resizeRect(gesture.start, gesture.edges, dx, dy)\n : clampToBounds(\n { ...gesture.start, left: gesture.start.left + dx, top: gesture.start.top + dy },\n gesture.bounds,\n minimized ? CHIP_SIZE : undefined,\n );\n\n gesture.latest = next;\n panel.style.setProperty(\"--dashfoo-float-left\", `${next.left}px`);\n panel.style.setProperty(\"--dashfoo-float-top\", `${next.top}px`);\n\n if (!minimized) {\n panel.style.setProperty(\"--dashfoo-float-width\", `${next.width}px`);\n panel.style.setProperty(\"--dashfoo-float-height\", `${next.height}px`);\n }\n };\n\n const handlePointerCancel = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n const panel = panelRef.current;\n if (!gesture || !panel || event.pointerId !== gesture.pointerId) {\n return;\n }\n gestureRef.current = null;\n releaseCapture(panel, event.pointerId);\n if (!gesture.moved) {\n return;\n }\n for (const [property, value] of Object.entries(gesture.initialStyle)) {\n panel.style.setProperty(property, value);\n }\n };\n\n return {\n handlers: {\n onPointerCancel: handlePointerCancel,\n onPointerDown: handlePointerDown,\n onPointerMove: handlePointerMove,\n onPointerUp: handlePointerUp,\n },\n ref: setPanel,\n style: {\n \"--dashfoo-float-height\": `${geometry.height}px`,\n \"--dashfoo-float-left\": `${geometry.left}px`,\n \"--dashfoo-float-top\": `${geometry.top}px`,\n \"--dashfoo-float-width\": `${geometry.width}px`,\n },\n };\n};\n\nexport { useFloatGesture };\nexport type { FloatGesture, FloatGestureOptions };\n","\"use client\";\n\nimport type { FocusEvent, KeyboardEvent, RefObject } from \"react\";\nimport { useEffect, useRef } from \"react\";\n\ntype InlineRenameOptions = {\n currentName: string;\n inputRef: RefObject<HTMLInputElement | null>;\n onCommit: (name: string) => void;\n onDone: () => void;\n};\n\ntype InlineRename = {\n handleBlur: (event: FocusEvent<HTMLInputElement>) => void;\n handleKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;\n};\n\nconst useInlineRename = ({\n currentName,\n inputRef,\n onCommit,\n onDone,\n}: InlineRenameOptions): InlineRename => {\n const done = useRef(false);\n\n useEffect(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, [inputRef]);\n\n const commit = (value: string): void => {\n const trimmed = value.trim();\n if (trimmed && trimmed !== currentName) {\n onCommit(trimmed);\n }\n onDone();\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>): void => {\n if (event.key === \"Enter\") {\n done.current = true;\n commit(event.currentTarget.value);\n } else if (event.key === \"Escape\") {\n done.current = true;\n onDone();\n }\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>): void => {\n if (done.current) {\n return;\n }\n done.current = true;\n commit(event.currentTarget.value);\n };\n\n return { handleBlur, handleKeyDown };\n};\n\nexport { useInlineRename };\n","import type { ReactNode } from \"react\";\n\nconst Icon = ({ children }: { children: ReactNode }): ReactNode => (\n <svg\n aria-hidden=\"true\"\n data-dashfoo=\"icon\"\n fill=\"none\"\n height=\"12\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"12\"\n >\n {children}\n </svg>\n);\n\nconst CloseIcon = (): ReactNode => (\n <Icon>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </Icon>\n);\n\nconst GripIcon = (): ReactNode => (\n <Icon>\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"19\" cy=\"5\" r=\"1\" />\n <circle cx=\"5\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n <circle cx=\"19\" cy=\"19\" r=\"1\" />\n <circle cx=\"5\" cy=\"19\" r=\"1\" />\n </Icon>\n);\n\nconst MaximizeIcon = ({ maximized }: { maximized: boolean }): ReactNode =>\n maximized ? (\n <Icon>\n <path d=\"m14 10 7-7\" />\n <path d=\"M20 10h-6V4\" />\n <path d=\"m3 21 7-7\" />\n <path d=\"M4 14h6v6\" />\n </Icon>\n ) : (\n <Icon>\n <path d=\"M15 3h6v6\" />\n <path d=\"m21 3-7 7\" />\n <path d=\"m3 21 7-7\" />\n <path d=\"M9 21H3v-6\" />\n </Icon>\n );\n\nconst FloatIcon = (): ReactNode => (\n <Icon>\n <rect height=\"14\" rx=\"2\" width=\"18\" x=\"3\" y=\"6\" />\n <path d=\"M3 10h18\" />\n </Icon>\n);\n\nconst MinimizeIcon = (): ReactNode => (\n <Icon>\n <path d=\"M5 12h14\" />\n </Icon>\n);\n\nconst DockIcon = (): ReactNode => (\n <Icon>\n <path d=\"M3 7V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-2\" />\n <path d=\"M11 8 7 12l4 4\" />\n <path d=\"M7 12h10\" />\n </Icon>\n);\n\nexport { CloseIcon, DockIcon, FloatIcon, GripIcon, MaximizeIcon, MinimizeIcon };\n","\"use client\";\n\nimport type { Action, Dashfoo, SnapConfig, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport type { ComponentProps, ReactNode, Ref } from \"react\";\nimport { useLayoutEffect, useState } from \"react\";\n\nimport type { LayoutState } from \"../hooks/layout-store\";\nimport { createLayoutStore, LayoutStoreContext, useLayout } from \"../hooks/layout-store\";\n\nconst DEFAULT_TABSET_MIN_SIZE = 320;\n\ntype LayoutRootProps = Omit<ComponentProps<\"div\">, \"children\" | \"style\"> & {\n children: ReactNode;\n closableTabs?: boolean;\n dispatch: (action: Action) => void;\n draggableTabs?: boolean;\n draggableTabsets?: boolean;\n\n editable?: boolean;\n\n floatable?: boolean;\n keepMounted?: boolean;\n maximizable?: boolean;\n model: Dashfoo;\n renamableTabs?: boolean;\n renderers: LayoutRenderers;\n resizableSplits?: boolean;\n\n /** When false, the tree itself is frozen: no dragging, splitting or floating. Tabs stay closable and renamable. */\n restructurable?: boolean;\n\n rootRef?: Ref<HTMLDivElement>;\n\n snap?: SnapConfig;\n};\n\ntype LayoutRenderers = {\n tab: (tab: TabNode) => ReactNode;\n tabLabel?: (tab: TabNode) => ReactNode;\n tabsetToolbar?: (tabset: TabsetNode) => ReactNode;\n};\n\ntype CapabilityOptions = Required<\n Pick<\n LayoutRootProps,\n | \"closableTabs\"\n | \"draggableTabs\"\n | \"draggableTabsets\"\n | \"editable\"\n | \"floatable\"\n | \"maximizable\"\n | \"renamableTabs\"\n | \"resizableSplits\"\n | \"restructurable\"\n >\n>;\n\nconst resolveCapabilities = (global: Dashfoo[\"global\"], options: CapabilityOptions) => {\n const structural = options.editable && options.restructurable;\n return {\n closableTabs: options.editable && options.closableTabs && global.tabEnableClose !== false,\n draggableTabs: structural && options.draggableTabs && global.tabEnableDrag !== false,\n draggableTabsets: structural && options.draggableTabsets,\n floatable: structural && options.floatable,\n maximizable: options.maximizable && global.tabSetEnableMaximize !== false,\n renamableTabs: options.editable && options.renamableTabs && global.tabEnableRename !== false,\n resizableSplits: structural && options.resizableSplits && global.enableSplitResize !== false,\n };\n};\n\nconst LayoutRoot = ({\n children,\n closableTabs = true,\n dispatch,\n draggableTabs = true,\n draggableTabsets = true,\n editable = true,\n floatable = false,\n keepMounted = false,\n maximizable = true,\n model,\n renamableTabs = true,\n renderers,\n resizableSplits = true,\n restructurable = true,\n rootRef,\n snap,\n ...props\n}: LayoutRootProps): ReactNode => {\n const global = model.global;\n const snapshot: LayoutState = {\n ...resolveCapabilities(global, {\n closableTabs,\n draggableTabs,\n draggableTabsets,\n editable,\n floatable,\n maximizable,\n renamableTabs,\n resizableSplits,\n restructurable,\n }),\n dispatch,\n editable,\n keepMounted,\n maximizedTabsetId: model.maximizedTabsetId,\n renderTab: renderers.tab,\n renderTabLabel: renderers.tabLabel,\n renderTabsetToolbar: renderers.tabsetToolbar,\n snap: snap ?? global.snap ?? null,\n splitDock: global.enableSplitDock !== false,\n tabLocation: global.tabLocation ?? \"top\",\n tabsetMinSize: global.tabSetMinSize ?? DEFAULT_TABSET_MIN_SIZE,\n tabStripEnabled: global.tabSetEnableTabStrip !== false,\n };\n\n const [store] = useState(() => createLayoutStore(snapshot));\n\n useLayoutEffect(() => {\n store.setState(snapshot);\n });\n\n return (\n <LayoutStoreContext.Provider value={store}>\n <div\n {...props}\n data-dashfoo=\"layout\"\n ref={rootRef}\n style={{\n \"--dashfoo-splitter-size\":\n global.splitterSize === undefined ? undefined : `${global.splitterSize}px`,\n }}\n >\n {children}\n </div>\n </LayoutStoreContext.Provider>\n );\n};\n\ntype LayoutOverridesProps = {\n children: ReactNode;\n overrides: Partial<LayoutState>;\n};\n\n/**\n * Republishes the parent store with overrides applied rather than re-deriving\n * flags, so anything the parent changes keeps flowing into the subtree.\n */\nconst LayoutOverrides = ({ children, overrides }: LayoutOverridesProps): ReactNode => {\n const parentState = useLayout((state) => state);\n const snapshot: LayoutState = { ...parentState, ...overrides };\n\n const [store] = useState(() => createLayoutStore(snapshot));\n\n useLayoutEffect(() => {\n store.setState(snapshot);\n });\n\n return (\n <LayoutStoreContext.Provider value={store}>\n <div data-dashfoo=\"layout\">{children}</div>\n </LayoutStoreContext.Provider>\n );\n};\n\nexport { LayoutOverrides, LayoutRoot };\nexport type { LayoutOverridesProps, LayoutRenderers, LayoutRootProps };\n","\"use client\";\n\nimport type { RowNode, SnapGrid } from \"@dashfoo/core\";\nimport { decideSnap, settleSnap } from \"@dashfoo/core\";\nimport type { RefObject } from \"react\";\nimport { useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type { GroupImperativeHandle, Layout, LayoutChangedMeta } from \"react-resizable-panels\";\n\nconst WEIGHT_EPSILON = 0.01;\n\ntype RowChildren = RowNode[\"children\"];\n\n/** `syncing` covers this hook's own writes: the group echoes an imperative\n * `setLayout` back synchronously, and that echo is not user input. */\ntype ResizeState =\n | { kind: \"idle\" }\n | { kind: \"syncing\" }\n | { boundary: number; kind: \"dragging\" }\n | { boundary: number; kind: \"snapped\" };\n\nconst IDLE: ResizeState = { kind: \"idle\" };\n\nconst boundaryOf = (state: ResizeState): number | null =>\n state.kind === \"dragging\" || state.kind === \"snapped\" ? state.boundary : null;\n\nconst snappedBoundaryOf = (state: ResizeState): number | null =>\n state.kind === \"snapped\" ? state.boundary : null;\n\nconst layoutFromWeights = (children: RowChildren): Layout => {\n const total = children.reduce((sum, child) => sum + child.weight, 0);\n return children.reduce<Layout>((layout, child) => {\n layout[child.id] = (child.weight / total) * 100;\n return layout;\n }, {});\n};\n\nconst orderedFromLayout = (layout: Layout, children: RowChildren): Array<number> =>\n children.map((child) => layout[child.id] ?? 0);\n\nconst layoutFromOrdered = (sizes: Array<number>, children: RowChildren): Layout =>\n children.reduce<Layout>((layout, child, index) => {\n layout[child.id] = sizes[index] ?? 0;\n return layout;\n }, {});\n\nconst layoutsMatch = (current: Layout, expected: Layout): boolean => {\n const expectedEntries = Object.entries(expected);\n if (Object.keys(current).length !== expectedEntries.length) {\n return false;\n }\n return expectedEntries.every(\n ([id, weight]) => Math.abs((current[id] ?? Number.NaN) - weight) <= WEIGHT_EPSILON,\n );\n};\n\ntype SnapResizeOptions = {\n children: RowChildren;\n onWeightsSettled: (weights: Array<number>) => void;\n resizableSplits: boolean;\n snap: SnapGrid;\n};\n\ntype SnapResize = {\n beginBoundaryDrag: (boundary: number) => void;\n groupRef: RefObject<GroupImperativeHandle | null>;\n onLayoutChange: (layout: Layout) => void;\n onLayoutChanged: (layout: Layout, meta: LayoutChangedMeta) => void;\n snappedBoundary: number | null;\n};\n\nconst useSnapResize = ({\n children,\n onWeightsSettled,\n resizableSplits,\n snap,\n}: SnapResizeOptions): SnapResize => {\n const groupRef = useRef<GroupImperativeHandle | null>(null);\n const state = useRef<ResizeState>(IDLE);\n const [snappedBoundary, setSnappedBoundary] = useState<number | null>(null);\n\n const transition = useCallback((next: ResizeState): void => {\n state.current = next;\n setSnappedBoundary(snappedBoundaryOf(next));\n }, []);\n\n const desiredLayout = useMemo(() => layoutFromWeights(children), [children]);\n\n useLayoutEffect(() => {\n const group = groupRef.current;\n if (!group) {\n return undefined;\n }\n const current = group.getLayout();\n const samePanelSet =\n Object.keys(current).length === Object.keys(desiredLayout).length &&\n Object.keys(desiredLayout).every((id) => id in current);\n if (!samePanelSet || layoutsMatch(current, desiredLayout)) {\n return undefined;\n }\n\n transition({ kind: \"syncing\" });\n group.setLayout(desiredLayout);\n const frame = requestAnimationFrame(() => {\n transition(IDLE);\n });\n return () => {\n cancelAnimationFrame(frame);\n transition(IDLE);\n };\n }, [desiredLayout, transition]);\n\n const onLayoutChange = (layout: Layout): void => {\n if (state.current.kind === \"syncing\" || !resizableSplits) {\n return;\n }\n const boundary = boundaryOf(state.current);\n if (boundary === null) {\n return;\n }\n\n const decision = decideSnap(orderedFromLayout(layout, children), boundary, snap);\n if (decision.kind === \"inactive\") {\n return;\n }\n if (decision.kind === \"clear\") {\n transition({ boundary, kind: \"dragging\" });\n return;\n }\n\n transition({ boundary, kind: \"snapped\" });\n const group = groupRef.current;\n const target = layoutFromOrdered(decision.sizes, children);\n if (!group || layoutsMatch(layout, target)) {\n return;\n }\n transition({ kind: \"syncing\" });\n group.setLayout(target);\n transition({ boundary, kind: \"snapped\" });\n };\n\n const onLayoutChanged = (layout: Layout, meta: LayoutChangedMeta): void => {\n if (!meta.isUserInteraction) {\n return;\n }\n if (state.current.kind === \"syncing\") {\n return;\n }\n const boundary = boundaryOf(state.current);\n transition(IDLE);\n\n if (!resizableSplits) {\n return;\n }\n const weights = settleSnap(\n children.map((child) => layout[child.id] ?? child.weight),\n boundary,\n snap,\n );\n const weightsChanged = weights.some((weight, index) => {\n const child = children.at(index);\n return child !== undefined && Math.abs(weight - child.weight) > WEIGHT_EPSILON;\n });\n if (!weightsChanged) {\n return;\n }\n\n onWeightsSettled(weights);\n };\n\n const beginBoundaryDrag = (boundary: number): void => {\n transition({ boundary, kind: \"dragging\" });\n };\n\n return { beginBoundaryDrag, groupRef, onLayoutChange, onLayoutChanged, snappedBoundary };\n};\n\nexport { useSnapResize };\nexport type { SnapResize, SnapResizeOptions };\n","const tabDomId = (tabsetId: string, tabId: string): string => `dashfoo-tab-${tabsetId}-${tabId}`;\nconst panelDomId = (tabsetId: string): string => `dashfoo-panel-${tabsetId}`;\n\nexport { panelDomId, tabDomId };\n","\"use client\";\n\nimport type { Action, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport { createContext, useContext } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { createStore, useStore } from \"zustand\";\n\nimport { tabDomId } from \"../../lib/tab-ids\";\nimport { warnOnce } from \"../../lib/warn-once\";\nimport type { OverflowItem } from \"../tab-overflow-menu\";\n\ntype TabsetState = {\n activeTab: TabNode | undefined;\n cancelRename: () => void;\n closeTab: (tabId: string) => void;\n commitRename: (tabId: string, value: string) => void;\n dispatch: (action: Action) => void;\n editingTabId: string | null;\n isMaximized: boolean;\n node: TabsetNode;\n overflowItems: Array<OverflowItem>;\n /** The tab a `closeTab` is waiting on, so a vetoed close cannot restore focus. */\n pendingCloseTabId: string | null;\n registerRenameInput: () => () => void;\n registerTablist: (element: HTMLDivElement | null) => void;\n renameInputCount: number;\n renameTab: (tabId: string, name: string) => void;\n selectOverflowTab: (tabId: string) => void;\n selectTab: (index: number, options?: { focus?: boolean }) => void;\n showMaximize: boolean;\n startEditing: (tabId: string) => void;\n tablistElement: HTMLDivElement | null;\n tabsClosable: boolean;\n tabsRenamable: boolean;\n toggleMaximize: () => void;\n visualSelected: number;\n};\n\ntype TabsetStore = StoreApi<TabsetState>;\n\ntype TabsetSnapshot = Pick<\n TabsetState,\n | \"activeTab\"\n | \"dispatch\"\n | \"isMaximized\"\n | \"node\"\n | \"showMaximize\"\n | \"tabsClosable\"\n | \"tabsRenamable\"\n | \"visualSelected\"\n>;\n\nconst tabButtonIn = (\n scope: HTMLElement | null,\n tabsetId: string,\n tabId: string,\n): HTMLElement | null =>\n scope?.querySelector<HTMLElement>(`#${CSS.escape(tabDomId(tabsetId, tabId))}`) ?? null;\n\nconst createTabsetStore = (initial: TabsetSnapshot): TabsetStore =>\n createStore<TabsetState>((set, get) => ({\n ...initial,\n cancelRename: () => {\n set({ editingTabId: null });\n },\n closeTab: (tabId) => {\n set({ pendingCloseTabId: tabId });\n get().dispatch({ tabId, type: \"deleteTab\" });\n },\n commitRename: (tabId, value) => {\n set({ editingTabId: null });\n const { node, renameTab } = get();\n const trimmed = value.trim();\n const current = node.children.find((tab) => tab.id === tabId)?.name;\n if (trimmed && trimmed !== current) {\n renameTab(tabId, trimmed);\n }\n },\n editingTabId: null,\n overflowItems: [],\n pendingCloseTabId: null,\n registerRenameInput: () => {\n set((state) => ({ renameInputCount: state.renameInputCount + 1 }));\n return () => {\n set((state) => ({ renameInputCount: state.renameInputCount - 1 }));\n };\n },\n registerTablist: (element) => {\n if (element) {\n const current = get().tablistElement;\n if (current && current !== element) {\n warnOnce(\n `duplicate-tablist-${get().node.id}`,\n \"more than one <Tabset.Tablist> under the same <Tabset.Root>; the last one wins for keyboard focus and overflow\",\n );\n }\n set({ tablistElement: element });\n return;\n }\n set({ tablistElement: null });\n },\n renameInputCount: 0,\n renameTab: (tabId, name) => {\n get().dispatch({ name, tabId, type: \"renameTab\" });\n },\n selectOverflowTab: (tabId) => {\n const { dispatch, node, tablistElement } = get();\n const index = node.children.findIndex((tab) => tab.id === tabId);\n if (index === -1) {\n return;\n }\n dispatch({ index, tabsetId: node.id, type: \"selectTab\" });\n tabButtonIn(tablistElement, node.id, tabId)?.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n });\n },\n selectTab: (index, options) => {\n const { dispatch, node, tablistElement } = get();\n dispatch({ index, tabsetId: node.id, type: \"selectTab\" });\n if (options?.focus === true) {\n const tab = node.children[index];\n if (tab) {\n tabButtonIn(tablistElement, node.id, tab.id)?.focus();\n }\n }\n },\n startEditing: (tabId) => {\n const { node, renameInputCount, tabsRenamable } = get();\n const tab = node.children.find((child) => child.id === tabId);\n if (!tabsRenamable || tab?.enableRename === false) {\n return;\n }\n if (renameInputCount === 0) {\n warnOnce(\n `missing-rename-input-${node.id}`,\n \"startEditing needs a <Tabset.RenameInput> in the composition; ignoring\",\n );\n return;\n }\n set({ editingTabId: tabId });\n },\n tablistElement: null,\n toggleMaximize: () => {\n const { dispatch, isMaximized, node } = get();\n dispatch({ tabsetId: isMaximized ? null : node.id, type: \"setMaximizedTabset\" });\n },\n }));\n\nconst TabsetStoreContext = createContext<TabsetStore | null>(null);\n\nconst useTabset = <T>(selector: (state: TabsetState) => T): T => {\n const store = useContext(TabsetStoreContext);\n if (store === null) {\n throw new Error(\"dashfoo Tabset parts must be rendered inside <Tabset.Root>.\");\n }\n return useStore(store, selector);\n};\n\ntype TabContextValue = { index: number; tab: TabNode };\n\nconst TabContext = createContext<TabContextValue | null>(null);\n\nconst useTab = (): TabContextValue => {\n const value = useContext(TabContext);\n if (value === null) {\n throw new Error(\"dashfoo tab parts must be rendered inside <Tabset.Tab>.\");\n }\n return value;\n};\n\nexport { createTabsetStore, TabContext, TabsetStoreContext, useTab, useTabset };\nexport type { TabContextValue, TabsetSnapshot, TabsetState, TabsetStore };\n","\"use client\";\n\nimport type { TabNode } from \"@dashfoo/core\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { panelDomId, tabDomId } from \"../../lib/tab-ids\";\n\nimport { useTabset } from \"./tabset-store\";\n\nconst TabPanel = ({\n render,\n tab,\n}: {\n render?: (tab: TabNode) => ReactNode;\n tab: TabNode;\n}): ReactNode => {\n const renderTab = useLayout((state) => state.renderTab);\n return render ? render(tab) : renderTab(tab);\n};\n\ntype TabsetContentProps = Omit<ComponentProps<\"div\">, \"children\"> & {\n children?: (tab: TabNode) => ReactNode;\n};\n\nconst TabsetContent = forwardRef<HTMLDivElement, TabsetContentProps>(\n ({ children, style, ...props }, ref): ReactNode => {\n const node = useTabset((state) => state.node);\n const editingTabId = useTabset((state) => state.editingTabId);\n const visualSelected = useTabset((state) => state.visualSelected);\n const keepMounted = useLayout((state) => state.keepMounted);\n\n if (keepMounted && node.children.length > 0) {\n return node.children.map((tab, index) => (\n <div\n {...props}\n aria-label={editingTabId === tab.id ? tab.name : undefined}\n aria-labelledby={editingTabId === tab.id ? undefined : tabDomId(node.id, tab.id)}\n data-dashfoo=\"tabcontent\"\n hidden={index !== visualSelected || undefined}\n id={index === visualSelected ? panelDomId(node.id) : undefined}\n key={tab.id}\n ref={index === visualSelected ? ref : undefined}\n role={index === visualSelected ? \"tabpanel\" : undefined}\n style={style}\n tabIndex={index === visualSelected ? 0 : undefined}\n >\n <TabPanel render={children} tab={tab} />\n </div>\n ));\n }\n\n const active = visualSelected < 0 ? undefined : node.children.at(visualSelected);\n if (active) {\n return (\n <div\n {...props}\n aria-label={editingTabId === active.id ? active.name : undefined}\n aria-labelledby={editingTabId === active.id ? undefined : tabDomId(node.id, active.id)}\n data-dashfoo=\"tabcontent\"\n id={panelDomId(node.id)}\n ref={ref}\n role=\"tabpanel\"\n style={style}\n tabIndex={0}\n >\n <TabPanel render={children} tab={active} />\n </div>\n );\n }\n return <div {...props} data-dashfoo=\"tabcontent\" ref={ref} style={style} />;\n },\n);\n\nTabsetContent.displayName = \"TabsetContent\";\n\nexport { TabsetContent };\nexport type { TabsetContentProps };\n","\"use client\";\n\nimport type { FocusEvent, KeyboardEvent, ReactNode } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\n\nconst OverflowIcon = (): ReactNode => (\n <svg aria-hidden=\"true\" fill=\"currentColor\" height=\"10\" viewBox=\"0 0 10 10\" width=\"10\">\n <circle cx=\"2\" cy=\"5\" r=\"1\" />\n <circle cx=\"5\" cy=\"5\" r=\"1\" />\n <circle cx=\"8\" cy=\"5\" r=\"1\" />\n </svg>\n);\n\ntype OverflowItem = { id: string; name: string };\n\nconst TabOverflowMenu = ({\n items,\n onSelect,\n}: {\n items: Array<OverflowItem>;\n onSelect: (id: string) => void;\n}): ReactNode => {\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(0);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n useEffect(() => {\n if (!open) {\n return undefined;\n }\n const handlePointerDown = (event: PointerEvent): void => {\n if (event.target instanceof Node && rootRef.current?.contains(event.target) !== true) {\n setOpen(false);\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [open]);\n\n useEffect(() => {\n if (open) {\n itemRefs.current[0]?.focus();\n }\n }, [open]);\n\n const closeAndReturnFocus = (): void => {\n setOpen(false);\n triggerRef.current?.focus();\n };\n\n const focusItem = (index: number): void => {\n setActiveIndex(index);\n itemRefs.current[index]?.focus();\n };\n\n const handleToggle = (): void => {\n setActiveIndex(0);\n setOpen((value) => !value);\n };\n\n const handleSelect = (id: string): void => {\n onSelect(id);\n closeAndReturnFocus();\n };\n\n const handleMenuKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n const last = items.length - 1;\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n focusItem(activeIndex >= last ? 0 : activeIndex + 1);\n break;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n focusItem(activeIndex <= 0 ? last : activeIndex - 1);\n break;\n }\n case \"Home\": {\n event.preventDefault();\n focusItem(0);\n break;\n }\n case \"End\": {\n event.preventDefault();\n focusItem(last);\n break;\n }\n case \"Escape\": {\n event.preventDefault();\n closeAndReturnFocus();\n break;\n }\n default: {\n break;\n }\n }\n };\n\n const handleFocusOut = (event: FocusEvent<HTMLDivElement>): void => {\n if (\n event.relatedTarget instanceof Node &&\n rootRef.current?.contains(event.relatedTarget) === true\n ) {\n return;\n }\n setOpen(false);\n };\n\n return (\n <div data-dashfoo=\"tab-overflow-root\" ref={rootRef}>\n <button\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-label=\"More tabs\"\n data-dashfoo=\"tab-overflow\"\n onClick={handleToggle}\n ref={triggerRef}\n title=\"More tabs\"\n type=\"button\"\n >\n <OverflowIcon />\n </button>\n {open ? (\n <div\n data-dashfoo=\"tab-overflow-menu\"\n onBlur={handleFocusOut}\n onKeyDown={handleMenuKeyDown}\n role=\"menu\"\n tabIndex={-1}\n >\n {items.map((item, index) => (\n <button\n data-dashfoo=\"tab-overflow-item\"\n key={item.id}\n onClick={() => {\n handleSelect(item.id);\n }}\n ref={(node) => {\n itemRefs.current[index] = node;\n }}\n role=\"menuitem\"\n tabIndex={index === activeIndex ? 0 : -1}\n type=\"button\"\n >\n {item.name}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n );\n};\n\nexport { TabOverflowMenu };\nexport type { OverflowItem };\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport { TabOverflowMenu } from \"../tab-overflow-menu\";\n\nimport { useTabset } from \"./tabset-store\";\n\nconst TabsetOverflowMenu = (): ReactNode => {\n const overflowItems = useTabset((state) => state.overflowItems);\n const selectOverflowTab = useTabset((state) => state.selectOverflowTab);\n\n if (overflowItems.length === 0) {\n return null;\n }\n return <TabOverflowMenu items={overflowItems} onSelect={selectOverflowTab} />;\n};\n\nexport { TabsetOverflowMenu };\n","import type { Ref } from \"react\";\n\nconst applyRef = <T>(ref: Ref<T> | undefined, value: T | null): void => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n};\n\nconst mergeRefs =\n <T>(...refs: Array<Ref<T> | undefined>) =>\n (value: T | null): void => {\n for (const ref of refs) {\n applyRef(ref, value);\n }\n };\n\nexport { mergeRefs };\n","\"use client\";\n\nimport type { ComponentProps, FocusEvent, KeyboardEvent, MouseEvent, ReactNode } from \"react\";\nimport { forwardRef, useEffect, useMemo, useRef } from \"react\";\n\nimport { useInlineRename } from \"../../hooks/use-inline-rename\";\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { CloseIcon } from \"../close-icon\";\n\nimport { useTab, useTabset } from \"./tabset-store\";\n\ntype TabsetRenameInputProps = ComponentProps<\"input\">;\n\nconst RenameEditor = forwardRef<HTMLInputElement, TabsetRenameInputProps>(\n (\n {\n defaultValue,\n onBlur,\n onKeyDown,\n\n ...props\n },\n userRef,\n ): ReactNode => {\n const { tab } = useTab();\n const cancelRename = useTabset((state) => state.cancelRename);\n const commitRename = useTabset((state) => state.commitRename);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const rename = useInlineRename({\n currentName: tab.name,\n inputRef,\n onCommit: (name) => {\n commitRename(tab.id, name);\n },\n onDone: cancelRename,\n });\n const refCallback = useMemo(() => mergeRefs<HTMLInputElement>(inputRef, userRef), [userRef]);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>): void => {\n onKeyDown?.(event);\n rename.handleKeyDown(event);\n };\n\n const handleCommitOnBlur = (event: FocusEvent<HTMLInputElement>): void => {\n onBlur?.(event);\n rename.handleBlur(event);\n };\n\n return (\n <input\n aria-label={`Rename ${tab.name}`}\n {...props}\n data-dashfoo=\"tab-rename\"\n defaultValue={defaultValue ?? tab.name}\n onBlur={handleCommitOnBlur}\n onKeyDown={handleKeyDown}\n ref={refCallback}\n type=\"text\"\n />\n );\n },\n);\n\nRenameEditor.displayName = \"RenameEditor\";\n\nconst TabsetRenameInput = forwardRef<HTMLInputElement, TabsetRenameInputProps>(\n (props, ref): ReactNode => {\n const { tab } = useTab();\n const editing = useTabset((state) => state.editingTabId === tab.id);\n const registerRenameInput = useTabset((state) => state.registerRenameInput);\n\n useEffect(() => registerRenameInput(), [registerRenameInput]);\n\n if (!editing) {\n return null;\n }\n return <RenameEditor {...props} ref={ref} />;\n },\n);\n\nTabsetRenameInput.displayName = \"TabsetRenameInput\";\n\ntype TabsetCloseButtonProps = ComponentProps<\"button\">;\n\nconst TabsetCloseButton = forwardRef<HTMLButtonElement, TabsetCloseButtonProps>(\n ({ children, onClick, ...props }, ref): ReactNode => {\n const { index, tab } = useTab();\n const closeTab = useTabset((state) => state.closeTab);\n const editing = useTabset((state) => state.editingTabId === tab.id);\n const tabsClosable = useTabset((state) => state.tabsClosable);\n const visualSelected = useTabset((state) => state.visualSelected);\n\n const closable = tabsClosable && tab.enableClose !== false;\n if (!closable || editing) {\n return null;\n }\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n\n event.stopPropagation();\n closeTab(tab.id);\n };\n\n return (\n <button\n aria-label={`Close ${tab.name}`}\n title={`Close ${tab.name}`}\n {...props}\n data-dashfoo=\"tab-close\"\n onClick={handleClick}\n ref={ref}\n tabIndex={index === visualSelected ? 0 : -1}\n type=\"button\"\n >\n {children ?? <CloseIcon />}\n </button>\n );\n },\n);\n\nTabsetCloseButton.displayName = \"TabsetCloseButton\";\n\nexport { RenameEditor, TabsetCloseButton, TabsetRenameInput };\nexport type { TabsetCloseButtonProps, TabsetRenameInputProps };\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst overflowingIds = (tablist: Element): Array<string> => {\n const box = tablist.getBoundingClientRect();\n return [...tablist.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')].flatMap((tab) => {\n const rect = tab.getBoundingClientRect();\n const clipped = rect.right > box.right + 1 || rect.left < box.left - 1;\n const tabId = tab.dataset.tabId;\n return clipped && tabId !== undefined && tabId !== \"\" ? [tabId] : [];\n });\n};\n\nconst sameIds = (a: Array<string>, b: Array<string>): boolean =>\n a.length === b.length && a.every((id, index) => id === b[index]);\n\nconst useTabOverflow = (tablist: HTMLElement | null, signature: string): Array<string> => {\n const [overflow, setOverflow] = useState<Array<string>>([]);\n\n useEffect(() => {\n // Fires per frame while an overflowing strip scrolls, so an unchanged set\n // has to keep its array identity or the tabset re-renders throughout.\n const recompute = (): void => {\n setOverflow((previous) => {\n const next = tablist ? overflowingIds(tablist) : [];\n return sameIds(previous, next) ? previous : next;\n });\n };\n recompute();\n if (!tablist) {\n return undefined;\n }\n const observer = new ResizeObserver(recompute);\n observer.observe(tablist);\n\n tablist.addEventListener(\"scroll\", recompute, { passive: true });\n return () => {\n observer.disconnect();\n tablist.removeEventListener(\"scroll\", recompute);\n };\n }, [tablist, signature]);\n\n return overflow;\n};\n\nexport { overflowingIds, useTabOverflow };\n","const fallbackSelectedIndex = (count: number, removedIndex: number): number =>\n removedIndex + 1 < count ? removedIndex + 1 : removedIndex - 1;\n\nexport { fallbackSelectedIndex };\n","\"use client\";\n\nimport type { TabsetNode } from \"@dashfoo/core\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { useStore } from \"zustand\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { useTabOverflow } from \"../../hooks/use-tab-overflow\";\nimport { tabDomId } from \"../../lib/tab-ids\";\nimport { fallbackSelectedIndex } from \"../../lib/tab-selection\";\nimport { useDragSubject, useTabsetDroppable } from \"../drag-provider\";\n\nimport type { TabsetSnapshot } from \"./tabset-store\";\nimport { createTabsetStore, TabsetStoreContext } from \"./tabset-store\";\n\ntype TabsetRootProps = ComponentProps<\"div\"> & { node: TabsetNode };\n\nconst TabsetRoot = forwardRef<HTMLDivElement, TabsetRootProps>(\n (\n {\n children,\n node,\n\n style,\n ...props\n },\n userRef,\n ): ReactNode => {\n const closableTabs = useLayout((state) => state.closableTabs);\n const dispatch = useLayout((state) => state.dispatch);\n const maximizable = useLayout((state) => state.maximizable);\n const maximizedTabsetId = useLayout((state) => state.maximizedTabsetId);\n const renamableTabs = useLayout((state) => state.renamableTabs);\n const tabLocation = useLayout((state) => state.tabLocation);\n\n const { ref } = useTabsetDroppable(node.id);\n const dragSubject = useDragSubject();\n const tabsetRef = useRef<HTMLDivElement | null>(null);\n\n const isMaximized = maximizedTabsetId === node.id;\n const showMaximize = maximizable && node.enableMaximize !== false;\n const tabsClosable = closableTabs && node.enableClose !== false;\n\n const tabsRenamable = renamableTabs;\n\n const draggingTabIndex =\n dragSubject?.kind === \"tab\"\n ? node.children.findIndex((tab) => tab.id === dragSubject.id)\n : -1;\n const visualSelected =\n draggingTabIndex !== -1 && draggingTabIndex === node.selected\n ? fallbackSelectedIndex(node.children.length, draggingTabIndex)\n : node.selected;\n const activeTab = node.children[visualSelected];\n const isDragSource = dragSubject?.kind === \"tabset\" && dragSubject.id === node.id;\n\n const snapshot: TabsetSnapshot = {\n activeTab,\n dispatch,\n isMaximized,\n node,\n showMaximize,\n tabsClosable,\n tabsRenamable,\n visualSelected,\n };\n const [store] = useState(() => createTabsetStore(snapshot));\n\n useLayoutEffect(() => {\n store.setState(snapshot);\n });\n\n const tablistElement = useStore(store, (state) => state.tablistElement);\n\n const overflowSignature = node.children.map((tab) => `${tab.id}:${tab.name}`).join(\"|\");\n const overflow = useTabOverflow(tablistElement, overflowSignature);\n\n const overflowItems = useMemo(() => {\n const names = new Map(node.children.map((tab) => [tab.id, tab.name]));\n return overflow.map((id) => ({ id, name: names.get(id) ?? id }));\n }, [overflow, node.children]);\n useLayoutEffect(() => {\n store.setState({ overflowItems });\n }, [overflowItems, store]);\n\n // Every dispatch rebuilds `node.children`, so this also runs for changes\n // unrelated to a close; the pending id is what keeps a vetoed one from firing.\n useEffect(() => {\n const { pendingCloseTabId } = store.getState();\n if (pendingCloseTabId === null) {\n return;\n }\n store.setState({ pendingCloseTabId: null });\n if (node.children.some((tab) => tab.id === pendingCloseTabId)) {\n return;\n }\n const selectedTab = node.children[node.selected];\n if (selectedTab) {\n tabsetRef.current\n ?.querySelector<HTMLElement>(`#${CSS.escape(tabDomId(node.id, selectedTab.id))}`)\n ?.focus();\n } else {\n tabsetRef.current?.focus();\n }\n }, [node.children, node.selected, node.id, store]);\n\n return (\n <TabsetStoreContext.Provider value={store}>\n <div\n {...props}\n data-dashfoo=\"tabset\"\n data-dragging-source={isDragSource || undefined}\n data-tab-location={tabLocation}\n ref={(element) => {\n ref(element);\n tabsetRef.current = element;\n if (typeof userRef === \"function\") {\n userRef(element);\n } else if (userRef) {\n userRef.current = element;\n }\n }}\n style={style}\n tabIndex={-1}\n >\n {children}\n </div>\n </TabsetStoreContext.Provider>\n );\n },\n);\n\nTabsetRoot.displayName = \"TabsetRoot\";\n\nexport { TabsetRoot };\nexport type { TabsetRootProps };\n","\"use client\";\n\nimport type { TabNode } from \"@dashfoo/core\";\nimport type { ComponentProps, KeyboardEvent, MouseEvent, ReactNode } from \"react\";\nimport { forwardRef, useContext, useEffect, useMemo, useRef } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { panelDomId, tabDomId } from \"../../lib/tab-ids\";\nimport { warnOnce } from \"../../lib/warn-once\";\nimport { useDragSubject, useTabDraggable } from \"../drag-provider\";\n\nimport { TabContext, TabsetStoreContext, useTab, useTabset } from \"./tabset-store\";\n\ntype TabsetTabProps = ComponentProps<\"span\"> & { tab: TabNode };\n\nconst TabsetTab = forwardRef<HTMLSpanElement, TabsetTabProps>(\n ({ children, tab, ...props }, userRef): ReactNode => {\n const store = useContext(TabsetStoreContext);\n const node = useTabset((state) => state.node);\n const editing = useTabset((state) => state.editingTabId === tab.id);\n\n const dragSubject = useDragSubject();\n const isDragging = dragSubject?.kind === \"tab\" && dragSubject.id === tab.id;\n const itemRef = useRef<HTMLSpanElement | null>(null);\n const wasEditing = useRef(false);\n\n const index = node.children.findIndex((child) => child.id === tab.id);\n\n const orphanAtRender = index === -1;\n useEffect(() => {\n const settled = store?.getState().node.children.some((child) => child.id === tab.id);\n if (settled === false) {\n warnOnce(\n `orphan-tab-${tab.id}`,\n `<Tabset.Tab> for \"${tab.id}\" is not a child of its Tabset.Root's node; it renders but can never be selected`,\n );\n }\n }, [orphanAtRender, store, tab.id]);\n\n useEffect(() => {\n if (wasEditing.current && !editing) {\n itemRef.current?.querySelector<HTMLElement>('[data-dashfoo=\"tab\"]')?.focus();\n }\n wasEditing.current = editing;\n }, [editing]);\n\n const contextValue = useMemo(() => ({ index, tab }), [index, tab]);\n const refCallback = useMemo(() => mergeRefs<HTMLSpanElement>(itemRef, userRef), [userRef]);\n\n return (\n <TabContext.Provider value={contextValue}>\n <span\n {...props}\n data-dashfoo=\"tab-item\"\n data-dragging={isDragging || undefined}\n ref={refCallback}\n >\n {children}\n </span>\n </TabContext.Provider>\n );\n },\n);\n\nTabsetTab.displayName = \"TabsetTab\";\n\ntype TabsetTriggerProps = ComponentProps<\"button\">;\n\nconst TabsetTrigger = forwardRef<HTMLButtonElement, TabsetTriggerProps>(\n (\n {\n children,\n onClick,\n onDoubleClick,\n onKeyDown,\n\n ...props\n },\n userRef,\n ): ReactNode => {\n const { index, tab } = useTab();\n const node = useTabset((state) => state.node);\n const editing = useTabset((state) => state.editingTabId === tab.id);\n const selectTab = useTabset((state) => state.selectTab);\n const startEditing = useTabset((state) => state.startEditing);\n const tabsRenamable = useTabset((state) => state.tabsRenamable);\n const visualSelected = useTabset((state) => state.visualSelected);\n const draggableTabs = useLayout((state) => state.draggableTabs);\n const renderTabLabel = useLayout((state) => state.renderTabLabel);\n const { ref } = useTabDraggable(tab.id, !draggableTabs || tab.enableDrag === false, tab.name);\n const refCallback = useMemo(() => mergeRefs<HTMLButtonElement>(ref, userRef), [ref, userRef]);\n\n if (editing) {\n return null;\n }\n\n const selected = index === visualSelected;\n const renamable = tabsRenamable && tab.enableRename !== false;\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n selectTab(index);\n };\n\n const handleDoubleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onDoubleClick?.(event);\n if (renamable) {\n startEditing(tab.id);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>): void => {\n onKeyDown?.(event);\n const count = node.children.length;\n if (event.defaultPrevented || count === 0) {\n return;\n }\n // The visual index, not the model's: focus (`tabindex=\"0\"`) sits at that one.\n const from = Math.max(visualSelected, 0);\n const targets = new Map([\n [\"ArrowLeft\", (from - 1 + count) % count],\n [\"ArrowRight\", (from + 1) % count],\n [\"End\", count - 1],\n [\"Home\", 0],\n ]);\n const next = targets.get(event.key);\n if (next === undefined) {\n return;\n }\n event.preventDefault();\n selectTab(next, { focus: true });\n };\n\n return (\n <button\n aria-label={renderTabLabel ? tab.name : undefined}\n {...props}\n aria-controls={panelDomId(node.id)}\n aria-selected={selected}\n data-dashfoo=\"tab\"\n data-tab-id={tab.id}\n id={tabDomId(node.id, tab.id)}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n onKeyDown={handleKeyDown}\n ref={refCallback}\n role=\"tab\"\n tabIndex={selected ? 0 : -1}\n type=\"button\"\n >\n {children ?? (renderTabLabel ? renderTabLabel(tab) : tab.name)}\n </button>\n );\n },\n);\n\nTabsetTrigger.displayName = \"TabsetTrigger\";\n\nexport { TabsetTab, TabsetTrigger };\nexport type { TabsetTabProps, TabsetTriggerProps };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { tabDomId } from \"../../lib/tab-ids\";\n\nimport { useTabset } from \"./tabset-store\";\n\ntype TabsetTabStripProps = ComponentProps<\"div\">;\n\nconst TabsetTabStrip = forwardRef<HTMLDivElement, TabsetTabStripProps>(\n ({ style, ...props }, ref): ReactNode => (\n <div {...props} data-dashfoo=\"tabstrip\" ref={ref} style={style} />\n ),\n);\n\nTabsetTabStrip.displayName = \"TabsetTabStrip\";\n\ntype TabsetTablistProps = ComponentProps<\"div\">;\n\nconst TabsetTablist = forwardRef<HTMLDivElement, TabsetTablistProps>(\n ({ \"aria-label\": ariaLabel, children, style, ...props }, userRef): ReactNode => {\n const node = useTabset((state) => state.node);\n const registerTablist = useTabset((state) => state.registerTablist);\n const editingTabId = useTabset((state) => state.editingTabId);\n\n const refCallback = useMemo(\n () => mergeRefs<HTMLDivElement>(registerTablist, userRef),\n [registerTablist, userRef],\n );\n\n const ownedTabs = node.children\n .flatMap((tab) => (tab.id === editingTabId ? [] : [tabDomId(node.id, tab.id)]))\n .join(\" \");\n\n return (\n <div {...props} data-dashfoo=\"tablist\" ref={refCallback} style={style} tabIndex={-1}>\n {/* Close buttons and rename inputs stay outside the tablist in the\n accessibility tree. Ownership keeps custom tab chrome composable. */}\n {ownedTabs ? (\n <span\n aria-label={ariaLabel ?? node.name ?? \"Tabs\"}\n aria-orientation=\"horizontal\"\n aria-owns={ownedTabs}\n role=\"tablist\"\n />\n ) : null}\n {children}\n </div>\n );\n },\n);\n\nTabsetTablist.displayName = \"TabsetTablist\";\n\nexport { TabsetTablist, TabsetTabStrip };\nexport type { TabsetTablistProps, TabsetTabStripProps };\n","\"use client\";\n\nimport type { ComponentProps, MouseEvent, ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { measureFloatRect } from \"../../lib/float-geometry\";\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { warnOnce } from \"../../lib/warn-once\";\nimport { FloatIcon, GripIcon, MaximizeIcon } from \"../close-icon\";\nimport { useTabsetDraggable } from \"../drag-provider\";\nimport { useHasFloatLayer } from \"../float-context\";\n\nimport { useTabset } from \"./tabset-store\";\n\ntype TabsetToolbarProps = ComponentProps<\"div\">;\n\nconst TabsetToolbar = forwardRef<HTMLDivElement, TabsetToolbarProps>(\n ({ style, ...props }, ref): ReactNode => (\n <div {...props} data-dashfoo=\"tabset-toolbar\" ref={ref} style={style} />\n ),\n);\n\nTabsetToolbar.displayName = \"TabsetToolbar\";\n\ntype TabsetChrome = { float: boolean; grip: boolean; maximize: boolean; overflow: boolean };\n\n/**\n * One answer per control, shared by the controls and by the layout deciding\n * whether to render a toolbar at all, so the two cannot disagree.\n */\nconst useTabsetChrome = (): TabsetChrome => {\n const draggableTabsets = useLayout((state) => state.draggableTabsets);\n const floatable = useLayout((state) => state.floatable);\n const isMaximized = useTabset((state) => state.isMaximized);\n const overflowCount = useTabset((state) => state.overflowItems.length);\n const showMaximize = useTabset((state) => state.showMaximize);\n const hasFloatLayer = useHasFloatLayer();\n\n if (floatable && !isMaximized && !hasFloatLayer) {\n warnOnce(\n \"float-no-layer\",\n \"Tabset.FloatButton needs a <Layout.FloatLayer> around the layout (DashfooLayout adds one); the float control is hidden\",\n );\n }\n\n return {\n float: floatable && !isMaximized && hasFloatLayer,\n grip: draggableTabsets && !isMaximized,\n maximize: showMaximize,\n overflow: overflowCount > 0,\n };\n};\n\ntype TabsetGripProps = ComponentProps<\"button\">;\n\nconst TabsetGrip = forwardRef<HTMLButtonElement, TabsetGripProps>(\n ({ children, ...props }, userRef): ReactNode => {\n const activeTabName = useTabset((state) => state.activeTab?.name ?? \"\");\n const node = useTabset((state) => state.node);\n const { grip } = useTabsetChrome();\n const { ref } = useTabsetDraggable(node.id, !grip, activeTabName);\n const refCallback = useMemo(() => mergeRefs<HTMLButtonElement>(ref, userRef), [ref, userRef]);\n\n if (!grip) {\n return null;\n }\n\n return (\n <button\n aria-label=\"Move tabset\"\n title=\"Move tabset\"\n {...props}\n data-dashfoo=\"tabset-grip\"\n ref={refCallback}\n type=\"button\"\n >\n {children ?? <GripIcon />}\n </button>\n );\n },\n);\n\nTabsetGrip.displayName = \"TabsetGrip\";\n\ntype TabsetMaximizeButtonProps = ComponentProps<\"button\">;\n\nconst TabsetMaximizeButton = forwardRef<HTMLButtonElement, TabsetMaximizeButtonProps>(\n ({ children, onClick, ...props }, ref): ReactNode => {\n const isMaximized = useTabset((state) => state.isMaximized);\n const toggleMaximize = useTabset((state) => state.toggleMaximize);\n const { maximize } = useTabsetChrome();\n\n if (!maximize) {\n return null;\n }\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n toggleMaximize();\n };\n\n return (\n <button\n aria-label={isMaximized ? \"Restore\" : \"Maximize\"}\n title={isMaximized ? \"Restore tabset\" : \"Maximize tabset\"}\n {...props}\n aria-pressed={isMaximized}\n data-dashfoo=\"tabset-maximize\"\n onClick={handleClick}\n ref={ref}\n type=\"button\"\n >\n {children ?? <MaximizeIcon maximized={isMaximized} />}\n </button>\n );\n },\n);\n\nTabsetMaximizeButton.displayName = \"TabsetMaximizeButton\";\n\ntype TabsetFloatButtonProps = ComponentProps<\"button\">;\n\nconst TabsetFloatButton = forwardRef<HTMLButtonElement, TabsetFloatButtonProps>(\n ({ children, onClick, ...props }, ref): ReactNode => {\n const dispatch = useLayout((state) => state.dispatch);\n const node = useTabset((state) => state.node);\n const { float } = useTabsetChrome();\n\n if (!float) {\n return null;\n }\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n const geometry = measureFloatRect(event.currentTarget);\n dispatch({ geometry, tabsetId: node.id, type: \"floatTabset\" });\n };\n\n return (\n <button\n aria-label=\"Float panel\"\n title=\"Float panel\"\n {...props}\n data-dashfoo=\"tabset-float\"\n onClick={handleClick}\n ref={ref}\n type=\"button\"\n >\n {children ?? <FloatIcon />}\n </button>\n );\n },\n);\n\nTabsetFloatButton.displayName = \"TabsetFloatButton\";\n\nexport { TabsetFloatButton, TabsetGrip, TabsetMaximizeButton, TabsetToolbar, useTabsetChrome };\nexport type {\n TabsetChrome,\n TabsetFloatButtonProps,\n TabsetGripProps,\n TabsetMaximizeButtonProps,\n TabsetToolbarProps,\n};\n","\"use client\";\n\nimport type { TabsetNode } from \"@dashfoo/core\";\nimport type { ReactNode } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\n\nimport { TabsetContent } from \"./tabset-content\";\nimport { TabsetOverflowMenu } from \"./tabset-overflow-menu\";\nimport { TabsetCloseButton, TabsetRenameInput } from \"./tabset-rename-input\";\nimport { TabsetRoot } from \"./tabset-root\";\nimport { useTabset } from \"./tabset-store\";\nimport { TabsetTab, TabsetTrigger } from \"./tabset-tab\";\nimport { TabsetTablist, TabsetTabStrip } from \"./tabset-tablist\";\nimport {\n TabsetFloatButton,\n TabsetGrip,\n TabsetMaximizeButton,\n TabsetToolbar,\n useTabsetChrome,\n} from \"./tabset-toolbar\";\n\nconst tabsetContent = <TabsetContent />;\n\nconst DefaultTabsetLayout = (): ReactNode => {\n const renderTabsetToolbar = useLayout((state) => state.renderTabsetToolbar);\n const tabLocation = useLayout((state) => state.tabLocation);\n const tabStripEnabled = useLayout((state) => state.tabStripEnabled);\n const node = useTabset((state) => state.node);\n const chrome = useTabsetChrome();\n\n const showToolbar = renderTabsetToolbar !== undefined || Object.values(chrome).some(Boolean);\n\n const strip = tabStripEnabled ? (\n <TabsetTabStrip>\n <TabsetTablist>\n {node.children.map((tab) => (\n <TabsetTab key={tab.id} tab={tab}>\n <TabsetTrigger />\n <TabsetRenameInput />\n <TabsetCloseButton />\n </TabsetTab>\n ))}\n </TabsetTablist>\n {showToolbar ? (\n <TabsetToolbar>\n <TabsetOverflowMenu />\n <TabsetGrip />\n {renderTabsetToolbar?.(node)}\n <TabsetFloatButton />\n <TabsetMaximizeButton />\n </TabsetToolbar>\n ) : null}\n </TabsetTabStrip>\n ) : null;\n\n return tabLocation === \"bottom\" ? (\n <>\n {tabsetContent}\n {strip}\n </>\n ) : (\n <>\n {strip}\n {tabsetContent}\n </>\n );\n};\n\ntype TabsetViewProps = { node: TabsetNode };\n\nconst TabsetView = ({ node }: TabsetViewProps): ReactNode => (\n <TabsetRoot node={node}>\n <DefaultTabsetLayout />\n </TabsetRoot>\n);\n\nexport { TabsetView };\nexport type { TabsetViewProps };\n","\"use client\";\n\nimport type { Dimension, RowNode, SnapConfig, TabsetNode } from \"@dashfoo/core\";\nimport { resolveSnapGrid, snapEnabled } from \"@dashfoo/core\";\nimport type { ReactNode } from \"react\";\nimport { Fragment, useMemo } from \"react\";\nimport type { Orientation } from \"react-resizable-panels\";\nimport { Group, Panel, Separator } from \"react-resizable-panels\";\n\nimport { useLayout } from \"../hooks/layout-store\";\nimport { useSnapResize } from \"../hooks/use-snap-resize\";\n\nimport { TabsetView } from \"./tabset/tabset-view\";\n\nconst dimensionToSize = (dimension: Dimension): string => `${dimension.value}${dimension.unit}`;\nconst dimensionToPixels = (dimension: Dimension | undefined): number | undefined =>\n dimension?.unit === \"px\" ? dimension.value : undefined;\n\ntype LayoutChild = RowNode[\"children\"][number];\n\nconst descendantMinSize = (\n child: LayoutChild,\n axis: RowNode[\"orientation\"],\n tabsetMinSize: number,\n): number | undefined => {\n const explicit = dimensionToPixels(child.min);\n if (explicit !== undefined) {\n return explicit;\n }\n if (child.min !== undefined) {\n return undefined;\n }\n if (child.type === \"tabset\") {\n return tabsetMinSize;\n }\n\n const childMinimums: Array<number> = [];\n for (const grandchild of child.children) {\n const minimum = descendantMinSize(grandchild, axis, tabsetMinSize);\n if (minimum === undefined) {\n return undefined;\n }\n childMinimums.push(minimum);\n }\n if (childMinimums.length === 0) {\n return undefined;\n }\n\n return child.orientation === axis\n ? childMinimums.reduce((sum, value) => sum + value, 0)\n : Math.max(...childMinimums);\n};\n\ntype RowViewProps = {\n node: RowNode;\n\n renderTabset?: (node: TabsetNode) => ReactNode;\n};\n\nconst RowView = ({ node, renderTabset }: RowViewProps): ReactNode => {\n const dispatch = useLayout((state) => state.dispatch);\n const resizableSplits = useLayout((state) => state.resizableSplits);\n const tabsetMinSize = useLayout((state) => state.tabsetMinSize);\n const globalSnap = useLayout((state) => state.snap);\n\n const effectiveSnap: SnapConfig | null = node.snap ?? globalSnap;\n // Resolved once per row, and the same value decides whether the per-move\n // listener is attached at all.\n const snapGrid = useMemo(\n () => resolveSnapGrid(effectiveSnap, node.children.length),\n [effectiveSnap, node.children.length],\n );\n const snapActive = snapEnabled(snapGrid);\n const orientation: Orientation = node.orientation === \"row\" ? \"horizontal\" : \"vertical\";\n const total = node.children.reduce((sum, child) => sum + child.weight, 0);\n\n const { beginBoundaryDrag, groupRef, onLayoutChange, onLayoutChanged, snappedBoundary } =\n useSnapResize({\n children: node.children,\n onWeightsSettled: (weights) => {\n dispatch({ rowId: node.id, type: \"adjustSplit\", weights });\n },\n resizableSplits,\n snap: snapGrid,\n });\n\n return (\n <Group\n data-dashfoo=\"row\"\n data-dashfoo-snapping={snappedBoundary === null ? undefined : \"true\"}\n disabled={!resizableSplits}\n groupRef={groupRef}\n key={node.id}\n onLayoutChange={snapActive ? onLayoutChange : undefined}\n onLayoutChanged={onLayoutChanged}\n orientation={orientation}\n >\n {node.children.map((child, index) => {\n const percent = (child.weight / total) * 100;\n let min = child.min ? dimensionToSize(child.min) : undefined;\n if (min === undefined) {\n const minimum = descendantMinSize(child, node.orientation, tabsetMinSize);\n min = minimum === undefined ? undefined : `${minimum}px`;\n }\n const max = child.max ? dimensionToSize(child.max) : undefined;\n\n return (\n <Fragment key={child.id}>\n {index > 0 ? (\n <Separator\n data-dashfoo=\"splitter\"\n data-dashfoo-snapped={snappedBoundary === index - 1 ? \"true\" : undefined}\n disabled={!resizableSplits}\n onPointerDown={\n snapActive && resizableSplits\n ? () => {\n beginBoundaryDrag(index - 1);\n }\n : undefined\n }\n />\n ) : null}\n <Panel defaultSize={`${percent}%`} id={child.id} maxSize={max} minSize={min}>\n {child.type === \"row\" ? (\n <RowView node={child} renderTabset={renderTabset} />\n ) : (\n (renderTabset?.(child) ?? <TabsetView node={child} />)\n )}\n </Panel>\n </Fragment>\n );\n })}\n </Group>\n );\n};\n\nexport { RowView };\nexport type { RowViewProps };\n","\"use client\";\n\nimport type { Action, FloatNode } from \"@dashfoo/core\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { useRef, useState } from \"react\";\n\nimport type { LayoutState } from \"../hooks/layout-store\";\nimport { useLayout } from \"../hooks/layout-store\";\nimport { useFloatGesture } from \"../hooks/use-float-gesture\";\nimport { useInlineRename } from \"../hooks/use-inline-rename\";\n\nimport { DockIcon, FloatIcon, GripIcon, MinimizeIcon } from \"./close-icon\";\nimport { DragProvider } from \"./drag-provider\";\nimport { RESIZE_HANDLES } from \"./float-resize-handles\";\nimport { LayoutOverrides } from \"./layout-root\";\nimport { RowView } from \"./row-view\";\n\nconst floatTitle = (node: FloatNode): string => node.name ?? \"Panel\";\n\nconst FLOAT_OVERRIDES: Partial<LayoutState> = {\n draggableTabsets: false,\n floatable: false,\n maximizable: false,\n maximizedTabsetId: undefined,\n};\n\ntype TitleProps = { dispatch: (action: Action) => void; node: FloatNode };\n\nconst FloatTitleEditor = ({\n dispatch,\n node,\n onDone,\n}: TitleProps & { onDone: () => void }): ReactNode => {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const { handleBlur, handleKeyDown } = useInlineRename({\n currentName: floatTitle(node),\n inputRef,\n onCommit: (name) => {\n dispatch({ floatId: node.id, name, type: \"renameFloat\" });\n },\n onDone,\n });\n\n return (\n <input\n aria-label={`Rename ${floatTitle(node)}`}\n data-dashfoo=\"float-rename\"\n defaultValue={floatTitle(node)}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n ref={inputRef}\n type=\"text\"\n />\n );\n};\n\nconst FloatTitle = ({\n dispatch,\n node,\n renamable,\n}: TitleProps & { renamable: boolean }): ReactNode => {\n const [editing, setEditing] = useState(false);\n if (renamable && editing) {\n return (\n <FloatTitleEditor\n dispatch={dispatch}\n node={node}\n onDone={() => {\n setEditing(false);\n }}\n />\n );\n }\n return (\n <span\n data-dashfoo=\"float-title\"\n onDoubleClick={\n renamable\n ? () => {\n setEditing(true);\n }\n : undefined\n }\n title={renamable ? \"Double-click to rename\" : undefined}\n >\n {floatTitle(node)}\n </span>\n );\n};\n\ntype FloatPanelProps = {\n node: FloatNode;\n onFocus: () => void;\n zIndex: number;\n};\n\nconst FloatPanel = ({ node, onFocus, zIndex }: FloatPanelProps): ReactNode => {\n const dispatch = useLayout((state) => state.dispatch);\n const editable = useLayout((state) => state.editable);\n\n const minimized = node.minimized === true;\n\n const restore = (): void => {\n if (!editable) {\n return;\n }\n dispatch({ floatId: node.id, minimized: false, type: \"setFloatMinimized\" });\n };\n\n const { handlers, ref, style } = useFloatGesture({\n editable,\n geometry: node.geometry,\n minimized,\n onCommit: (geometry) => {\n dispatch({ floatId: node.id, geometry, type: \"moveFloat\" });\n },\n onTap: () => {\n if (minimized) {\n restore();\n }\n },\n });\n const { onPointerDown, ...rootHandlers } = handlers;\n const frameStyle: CSSProperties = {\n \"--dashfoo-float-height\": style[\"--dashfoo-float-height\"],\n \"--dashfoo-float-left\": style[\"--dashfoo-float-left\"],\n \"--dashfoo-float-top\": style[\"--dashfoo-float-top\"],\n \"--dashfoo-float-width\": style[\"--dashfoo-float-width\"],\n \"--dashfoo-float-z\": zIndex,\n };\n\n if (minimized) {\n return (\n <button\n {...rootHandlers}\n aria-label={`Restore ${floatTitle(node)} panel`}\n data-dashfoo=\"float-chip\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n restore();\n }\n }}\n onPointerDown={onPointerDown}\n onPointerDownCapture={onFocus}\n ref={ref}\n style={frameStyle}\n title={floatTitle(node)}\n type=\"button\"\n >\n <FloatIcon />\n <span data-dashfoo=\"float-chip-label\">{floatTitle(node)}</span>\n </button>\n );\n }\n\n return (\n <div\n {...rootHandlers}\n data-dashfoo=\"float\"\n onPointerDownCapture={onFocus}\n ref={ref}\n style={frameStyle}\n >\n <div\n data-dashfoo=\"float-titlebar\"\n data-editable={editable || undefined}\n onPointerDown={onPointerDown}\n >\n <span aria-hidden=\"true\" data-dashfoo=\"float-grip\">\n <GripIcon />\n </span>\n <FloatTitle dispatch={dispatch} node={node} renamable={editable} />\n {editable && (\n <>\n <button\n aria-label=\"Minimize panel\"\n data-dashfoo=\"float-minimize\"\n onClick={() => {\n dispatch({ floatId: node.id, minimized: true, type: \"setFloatMinimized\" });\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n title=\"Minimize panel\"\n type=\"button\"\n >\n <MinimizeIcon />\n </button>\n <button\n aria-label=\"Dock panel back into the main layout\"\n data-dashfoo=\"float-dock\"\n onClick={() => {\n dispatch({ floatId: node.id, type: \"dockFloat\" });\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n title=\"Dock panel back\"\n type=\"button\"\n >\n <DockIcon />\n </button>\n </>\n )}\n </div>\n <div data-dashfoo=\"float-body\">\n <LayoutOverrides overrides={FLOAT_OVERRIDES}>\n <DragProvider>\n <RowView node={node.layout} />\n </DragProvider>\n </LayoutOverrides>\n </div>\n {editable &&\n RESIZE_HANDLES.map((handle) => (\n <div\n data-dashfoo=\"float-resize\"\n data-edge={handle.key}\n key={handle.key}\n onPointerDown={onPointerDown}\n />\n ))}\n </div>\n );\n};\n\nexport { FloatPanel, FloatTitleEditor };\nexport type { FloatPanelProps };\n","\"use client\";\n\nimport type { FloatNode, GlobalAttributes } from \"@dashfoo/core\";\nimport type { ReactNode } from \"react\";\nimport { useState } from \"react\";\n\nimport { FloatLayerContext } from \"./float-context\";\nimport { FloatPanel } from \"./float-panel\";\n\nconst FloatOverlay = ({ floats }: { floats: Array<FloatNode> }): ReactNode => {\n const [topId, setTopId] = useState<string | null>(null);\n if (floats.length === 0) {\n return null;\n }\n return (\n <div data-dashfoo=\"float-overlay\">\n {floats.map((node) => (\n <FloatPanel\n key={node.id}\n node={node}\n onFocus={() => {\n setTopId(node.id);\n }}\n zIndex={node.id === topId ? 2 : 1}\n />\n ))}\n </div>\n );\n};\n\ntype FloatLayerProps = {\n children: ReactNode;\n floats: Array<FloatNode>;\n /** Unread: floats inherit every global-derived capability from the layout store above them. */\n global?: GlobalAttributes;\n};\n\nconst FloatLayer = ({ children, floats }: FloatLayerProps): ReactNode => (\n <FloatLayerContext.Provider value>\n {children}\n <FloatOverlay floats={floats} />\n </FloatLayerContext.Provider>\n);\n\nexport { FloatLayer };\nexport type { FloatLayerProps };\n","\"use client\";\n\nimport { DragProvider } from \"./drag-provider\";\nimport { FloatLayer } from \"./float-layer\";\nimport { LayoutRoot } from \"./layout-root\";\nimport { RowView } from \"./row-view\";\nimport { TabsetView } from \"./tabset/tabset-view\";\n\nconst Layout = {\n DragLayer: DragProvider,\n FloatLayer,\n Root: LayoutRoot,\n Rows: RowView,\n Tabset: TabsetView,\n} as const;\n\nexport { Layout };\nexport type { DragProviderProps as LayoutDragLayerProps } from \"./drag-provider\";\nexport type { FloatLayerProps as LayoutFloatLayerProps } from \"./float-layer\";\nexport type { LayoutRenderers, LayoutRootProps } from \"./layout-root\";\nexport type { RowViewProps as LayoutRowsProps } from \"./row-view\";\nexport type { TabsetViewProps as LayoutTabsetProps } from \"./tabset/tabset-view\";\n","\"use client\";\n\nimport type {\n Action,\n Dashfoo,\n DockLocation,\n Orientation,\n SnapConfig,\n TabNode,\n TabsetNode,\n} from \"@dashfoo/core\";\nimport { findTabset } from \"@dashfoo/core\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport {\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n} from \"react\";\n\nimport { SharedDragManagerContext } from \"../hooks/drag-hooks\";\nimport type { PersistConfig, StorageAdapter } from \"../hooks/persistence\";\nimport { localStorageAdapter, usePersistence } from \"../hooks/persistence\";\nimport { useContainerWidth } from \"../hooks/responsive\";\nimport { useDashfooStore } from \"../hooks/store\";\nimport { compactModel } from \"../lib/compact-model\";\n\nimport { DashfooDragProvider } from \"./dashfoo-drag-provider\";\nimport { Layout } from \"./layout\";\n\nconst DEFAULT_PERSIST_DEBOUNCE_MS = 300;\n\ntype PersistInput = string | { debounceMs?: number; key: string; storage?: StorageAdapter };\n\nconst resolvePersist = (persist: PersistInput | undefined): PersistConfig | null => {\n if (persist === undefined) {\n return null;\n }\n if (typeof persist === \"string\") {\n return { debounceMs: DEFAULT_PERSIST_DEBOUNCE_MS, key: persist, storage: localStorageAdapter };\n }\n return {\n debounceMs: persist.debounceMs ?? DEFAULT_PERSIST_DEBOUNCE_MS,\n key: persist.key,\n storage: persist.storage ?? localStorageAdapter,\n };\n};\n\ntype TabComponent = ComponentType<{ node: TabNode }>;\n\nconst warnedComponents = new Set<string>();\n\ntype DashfooHandle = {\n addTab: (\n tab: TabNode,\n target: { index?: number; location?: DockLocation; targetId: string },\n ) => void;\n canRedo: () => boolean;\n canUndo: () => boolean;\n closeTab: (tabId: string) => void;\n dispatch: (action: Action) => void;\n\n dockFloat: (floatId: string) => void;\n\n floatTab: (tabId: string) => void;\n getModel: () => Dashfoo;\n maximizeTabset: (tabsetId: string | null) => void;\n redo: () => void;\n renameTab: (tabId: string, name: string) => void;\n\n resetLayout: () => void;\n selectTab: (tabsetId: string, index: number) => void;\n undo: () => void;\n};\n\ntype DashfooLayoutCommonProps = {\n closableTabs?: boolean;\n components?: Record<string, TabComponent>;\n draggableTabs?: boolean;\n draggableTabsets?: boolean;\n\n editable?: boolean;\n factory?: (tab: TabNode) => ReactNode;\n\n floatable?: boolean;\n keepMounted?: boolean;\n maximizable?: boolean;\n onAction?: (action: Action) => Action | null;\n onActiveTabsetChange?: (tabsetId: string | undefined) => void;\n onMaximizedTabsetChange?: (tabsetId: string | undefined) => void;\n onModelChange?: (model: Dashfoo, action?: Action) => void;\n renamableTabs?: boolean;\n renderTabLabel?: (tab: TabNode) => ReactNode;\n renderTabsetToolbar?: (tabset: TabsetNode) => ReactNode;\n\n resizableSplits?: boolean;\n responsive?: { maxWidth: number; orientation?: Orientation };\n\n snap?: SnapConfig;\n};\n\ntype DashfooLayoutProps = DashfooLayoutCommonProps &\n (\n | { defaultModel: Dashfoo; model?: never; persist?: PersistInput }\n | { defaultModel?: never; model: Dashfoo; persist?: never }\n );\n\nconst DashfooLayout = forwardRef<DashfooHandle, DashfooLayoutProps>((props, ref): ReactNode => {\n const {\n closableTabs = true,\n components,\n defaultModel,\n draggableTabs = true,\n draggableTabsets = true,\n editable = true,\n factory,\n floatable = false,\n keepMounted = false,\n maximizable = true,\n model,\n onAction,\n onActiveTabsetChange,\n onMaximizedTabsetChange,\n onModelChange,\n persist,\n renamableTabs = true,\n renderTabLabel,\n renderTabsetToolbar,\n resizableSplits = true,\n responsive,\n snap,\n } = props;\n\n const persistConfig = useMemo(\n () => (model === undefined ? resolvePersist(persist) : null),\n [model, persist],\n );\n const persistence = usePersistence(persistConfig, defaultModel);\n\n const handleModelChange = useCallback(\n (next: Dashfoo, action?: Action): void => {\n persistence.save(next);\n onModelChange?.(next, action);\n },\n [onModelChange, persistence],\n );\n\n const store = useDashfooStore({\n defaultModel: persistence.initialModel ?? defaultModel,\n model,\n onAction,\n onActiveTabsetChange,\n onMaximizedTabsetChange,\n onModelChange: handleModelChange,\n });\n\n const { setModel } = store;\n const appliedInitialModel = useRef(persistence.initialModel);\n useEffect(() => {\n if (\n persistence.initialModel !== undefined &&\n persistence.initialModel !== appliedInitialModel.current\n ) {\n appliedInitialModel.current = persistence.initialModel;\n // oxlint-disable-next-line react-doctor/no-pass-data-to-parent -- restoration must happen after hydration, without an action or undo entry\n setModel(persistence.initialModel);\n }\n }, [persistence.initialModel, setModel]);\n\n const hasSharedManager = useContext(SharedDragManagerContext) !== null;\n\n useImperativeHandle(\n ref,\n () => ({\n addTab: (tab, target) => {\n store.dispatch({\n index: target.index,\n location: target.location ?? \"center\",\n tab,\n targetId: target.targetId,\n type: \"addNode\",\n });\n },\n canRedo: store.canRedo,\n canUndo: store.canUndo,\n closeTab: (tabId) => {\n store.dispatch({ tabId, type: \"deleteTab\" });\n },\n dispatch: store.dispatch,\n dockFloat: (floatId) => {\n store.dispatch({ floatId, type: \"dockFloat\" });\n },\n floatTab: (tabId) => {\n store.dispatch({ tabId, type: \"floatTab\" });\n },\n getModel: () => store.model,\n maximizeTabset: (tabsetId) => {\n store.dispatch({ tabsetId, type: \"setMaximizedTabset\" });\n },\n redo: store.redo,\n renameTab: (tabId, name) => {\n store.dispatch({ name, tabId, type: \"renameTab\" });\n },\n resetLayout: () => {\n persistence.clear();\n if (defaultModel !== undefined) {\n store.setModel(defaultModel);\n }\n },\n selectTab: (tabsetId, index) => {\n store.dispatch({ index, tabsetId, type: \"selectTab\" });\n },\n undo: store.undo,\n }),\n [defaultModel, persistence, store],\n );\n\n const renderTab = useCallback(\n (tab: TabNode): ReactNode => {\n if (factory) {\n return factory(tab);\n }\n const Component = components?.[tab.component];\n if (!Component) {\n if (components && !warnedComponents.has(tab.component)) {\n warnedComponents.add(tab.component);\n\n // oxlint-disable-next-line no-console -- dashfoo reports degraded paths on the developer console instead of failing silently\n console.warn(`[dashfoo] no component registered for \"${tab.component}\"`);\n }\n return null;\n }\n return <Component node={tab} />;\n },\n [components, factory],\n );\n const renderers = useMemo(\n () => ({ tab: renderTab, tabLabel: renderTabLabel, tabsetToolbar: renderTabsetToolbar }),\n [renderTab, renderTabLabel, renderTabsetToolbar],\n );\n\n const [containerRef, width] = useContainerWidth();\n const isCompact = responsive !== undefined && width <= responsive.maxWidth;\n const compactOrientation = responsive?.orientation;\n\n /** Everything the compact breakpoint changes, decided once. */\n const presentation = useMemo(\n () =>\n isCompact\n ? {\n maximizable: false,\n model: compactModel(store.model, compactOrientation),\n restructurable: false,\n }\n : { maximizable, model: store.model, restructurable: true },\n [compactOrientation, isCompact, maximizable, store.model],\n );\n const view = presentation.model;\n\n const maximized =\n view.maximizedTabsetId === undefined ? undefined : findTabset(view, view.maximizedTabsetId);\n\n const tree = (\n <Layout.FloatLayer floats={view.floats}>\n <Layout.DragLayer>\n {maximized ? <Layout.Tabset node={maximized} /> : <Layout.Rows node={view.layout} />}\n </Layout.DragLayer>\n </Layout.FloatLayer>\n );\n\n return (\n <Layout.Root\n closableTabs={closableTabs}\n dispatch={store.dispatch}\n draggableTabs={draggableTabs}\n draggableTabsets={draggableTabsets}\n editable={editable}\n floatable={floatable}\n keepMounted={keepMounted}\n maximizable={presentation.maximizable}\n model={view}\n renamableTabs={renamableTabs}\n renderers={renderers}\n resizableSplits={resizableSplits}\n restructurable={presentation.restructurable}\n rootRef={containerRef}\n snap={snap}\n >\n {hasSharedManager ? tree : <DashfooDragProvider>{tree}</DashfooDragProvider>}\n </Layout.Root>\n );\n});\n\nDashfooLayout.displayName = \"DashfooLayout\";\n\nexport { DashfooLayout };\nexport type { DashfooHandle, DashfooLayoutCommonProps, DashfooLayoutProps, TabComponent };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\ntype PanelBadgeProps = ComponentProps<\"span\">;\n\nconst PanelBadge = forwardRef<HTMLSpanElement, PanelBadgeProps>((props, ref): ReactNode => (\n <span {...props} data-dashfoo=\"panel-badge\" ref={ref} />\n));\n\nPanelBadge.displayName = \"PanelBadge\";\n\nexport { PanelBadge };\nexport type { PanelBadgeProps };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\ntype PanelBodyProps = ComponentProps<\"div\">;\n\nconst PanelBody = forwardRef<HTMLDivElement, PanelBodyProps>((props, ref): ReactNode => (\n <div {...props} data-dashfoo=\"panel-body\" ref={ref} tabIndex={props.tabIndex ?? 0} />\n));\n\nPanelBody.displayName = \"PanelBody\";\n\nexport { PanelBody };\nexport type { PanelBodyProps };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\ntype PanelHeaderProps = ComponentProps<\"div\">;\n\nconst PanelHeader = forwardRef<HTMLDivElement, PanelHeaderProps>((props, ref): ReactNode => (\n <div {...props} data-dashfoo=\"panel-header\" ref={ref} />\n));\n\nPanelHeader.displayName = \"PanelHeader\";\n\nexport { PanelHeader };\nexport type { PanelHeaderProps };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\ntype PanelIconProps = ComponentProps<\"span\">;\n\nconst PanelIcon = forwardRef<HTMLSpanElement, PanelIconProps>((props, ref): ReactNode => (\n <span {...props} data-dashfoo=\"panel-icon\" ref={ref} />\n));\n\nPanelIcon.displayName = \"PanelIcon\";\n\nexport { PanelIcon };\nexport type { PanelIconProps };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\ntype PanelRootProps = ComponentProps<\"div\">;\n\nconst PanelRoot = forwardRef<HTMLDivElement, PanelRootProps>((props, ref): ReactNode => (\n <div {...props} data-dashfoo=\"panel\" ref={ref} />\n));\n\nPanelRoot.displayName = \"PanelRoot\";\n\nexport { PanelRoot };\nexport type { PanelRootProps };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\ntype PanelTitleProps = ComponentProps<\"span\">;\n\nconst PanelTitle = forwardRef<HTMLSpanElement, PanelTitleProps>((props, ref): ReactNode => (\n <span {...props} data-dashfoo=\"panel-title\" ref={ref} />\n));\n\nPanelTitle.displayName = \"PanelTitle\";\n\nexport { PanelTitle };\nexport type { PanelTitleProps };\n","\"use client\";\n\nimport { PanelBadge } from \"./panel-badge\";\nimport { PanelBody } from \"./panel-body\";\nimport { PanelHeader } from \"./panel-header\";\nimport { PanelIcon } from \"./panel-icon\";\nimport { PanelRoot } from \"./panel-root\";\nimport { PanelTitle } from \"./panel-title\";\n\nconst Panel = {\n Badge: PanelBadge,\n Body: PanelBody,\n Header: PanelHeader,\n Icon: PanelIcon,\n Root: PanelRoot,\n Title: PanelTitle,\n} as const;\n\nexport { Panel };\nexport type { PanelBadgeProps } from \"./panel-badge\";\nexport type { PanelBodyProps } from \"./panel-body\";\nexport type { PanelHeaderProps } from \"./panel-header\";\nexport type { PanelIconProps } from \"./panel-icon\";\nexport type { PanelRootProps } from \"./panel-root\";\nexport type { PanelTitleProps } from \"./panel-title\";\n","\"use client\";\n\nimport { TabsetContent } from \"./tabset-content\";\nimport { TabsetOverflowMenu } from \"./tabset-overflow-menu\";\nimport { TabsetCloseButton, TabsetRenameInput } from \"./tabset-rename-input\";\nimport { TabsetRoot } from \"./tabset-root\";\nimport { TabsetTab, TabsetTrigger } from \"./tabset-tab\";\nimport { TabsetTablist, TabsetTabStrip } from \"./tabset-tablist\";\nimport {\n TabsetFloatButton,\n TabsetGrip,\n TabsetMaximizeButton,\n TabsetToolbar,\n} from \"./tabset-toolbar\";\n\nconst Tabset = {\n CloseButton: TabsetCloseButton,\n Content: TabsetContent,\n FloatButton: TabsetFloatButton,\n Grip: TabsetGrip,\n MaximizeButton: TabsetMaximizeButton,\n OverflowMenu: TabsetOverflowMenu,\n RenameInput: TabsetRenameInput,\n Root: TabsetRoot,\n Tab: TabsetTab,\n Tablist: TabsetTablist,\n TabStrip: TabsetTabStrip,\n Toolbar: TabsetToolbar,\n Trigger: TabsetTrigger,\n} as const;\n\nexport { Tabset };\nexport type { TabsetContentProps } from \"./tabset-content\";\nexport type { TabsetRootProps } from \"./tabset-root\";\nexport type { TabsetTabProps, TabsetTriggerProps } from \"./tabset-tab\";\nexport type { TabsetCloseButtonProps, TabsetRenameInputProps } from \"./tabset-rename-input\";\nexport type { TabsetTablistProps, TabsetTabStripProps } from \"./tabset-tablist\";\nexport type {\n TabsetFloatButtonProps,\n TabsetGripProps,\n TabsetMaximizeButtonProps,\n TabsetToolbarProps,\n} from \"./tabset-toolbar\";\n"],"mappings":"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"}