@dashfoo/react 0.6.3 → 0.6.4

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/hooks/store.ts","../src/lib/tab-insertion.ts","../src/components/drag-overlays.tsx","../src/components/drag-root.tsx","../src/hooks/layout-store.ts","../src/lib/warn-once.ts","../src/components/drag-adapter.tsx","../src/components/float-context.ts","../src/hooks/use-inline-rename.ts","../src/lib/float-geometry.ts","../src/components/float-resize-handles.ts","../src/components/layout-root.tsx","../src/lib/tab-ids.ts","../src/components/tabset/tabset-store.ts","../src/components/tabset/tabset-content.tsx","../src/components/tab-overflow.tsx","../src/components/tabset/tabset-overflow.tsx","../src/hooks/use-tab-overflow.ts","../src/lib/tab-selection.ts","../src/components/tabset/tabset-root.tsx","../src/lib/merge-refs.ts","../src/components/tabset/tabset-tab.tsx","../src/components/tabset-icons.tsx","../src/components/tabset/tabset-tab-controls.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.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 { DragSubject, DropIntent, TabNode } from \"@dashfoo/core\";\nimport {\n Accessibility,\n Draggable,\n DragDropManager,\n Droppable,\n Feedback,\n PointerSensor,\n} from \"@dnd-kit/dom\";\nimport type { Context } from \"react\";\nimport { createContext, useCallback, useContext, useEffect, useId, useMemo, useRef } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { createStore, useStore } from \"zustand\";\n\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\nconst createDragManager = (): DragDropManager =>\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 DragContextValue = {\n layerId: string;\n manager: DragDropManager;\n};\n\nconst DragContext = createContext<DragContextValue | null>(null);\n\nconst SharedDragManagerContext: Context<DragDropManager | null> =\n createContext<DragDropManager | null>(null);\n\ntype DragSubjectState = {\n intent: DropIntent | null;\n intentOwner: string | null;\n subject: DragSubject | null;\n};\n\ntype DragSubjectStore = StoreApi<DragSubjectState>;\n\nconst createDragSubjectStore = (): DragSubjectStore =>\n createStore<DragSubjectState>(() => ({ intent: null, intentOwner: null, subject: null }));\n\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\nconst sameDragSubject = (a: DragSubject | null, b: DragSubject | null): boolean =>\n a === b || (a !== null && b !== null && a.id === b.id && a.kind === b.kind);\n\nconst nullSubjectStore = createDragSubjectStore();\n\nconst DragSubjectStoreContext: Context<DragSubjectStore | null> =\n createContext<DragSubjectStore | null>(null);\n\ntype DraggableHandle = {\n draggableRef: { current: Draggable | 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<Draggable | 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: Record<string, unknown>; 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\" }), []);\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\" }), [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 });\n const data = useMemo(\n () => ({ createTab: (): TabNode => createTabRef.current(), type: \"external\" }),\n [],\n );\n return useDraggableEntity({ data, id: `external-${id}` }, disabled, label);\n};\n\nconst useDragSubject = (): DragSubject | null => {\n const store = useContext(DragSubjectStoreContext);\n return useStore(store ?? nullSubjectStore, (state) => state.subject);\n};\n\nconst useDropIntent = (): DropIntent | null => {\n const store = useContext(DragSubjectStoreContext);\n return useStore(store ?? nullSubjectStore, (state) => state.intent);\n};\n\nexport type { DragContextValue, DragSubjectStore, ExternalTabSourceOptions };\nexport {\n createDragManager,\n createDragSubjectStore,\n DragContext,\n DragSubjectStoreContext,\n sameDragSubject,\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 {\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 {\n void 0;\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\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 });\n\n const [initialModel] = useState<Dashfoo | undefined>(() => {\n if (config === null || defaultModel === undefined) {\n return defaultModel;\n }\n const raw = config.storage.getItem(config.key);\n if (raw === null) {\n return defaultModel;\n }\n try {\n return fromJSON(raw);\n } catch {\n return defaultModel;\n }\n });\n\n useEffect(() => {\n const current = configRef.current;\n if (current === null) {\n return;\n }\n const raw = current.storage.getItem(current.key);\n if (raw === null) {\n return;\n }\n try {\n fromJSON(raw);\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] discarding unreadable persisted layout\", error);\n current.storage.removeItem(current.key);\n }\n }, []);\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 pending.current.storage.setItem(pending.current.key, pending.current.value);\n pending.current = null;\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 current.storage.removeItem(current.key);\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 { useCallback, useEffect, useMemo, useRef, 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 useContainerWidth = (): [(element: HTMLElement | null) => void, number] => {\n const [width, setWidth] = useState<number>(Number.POSITIVE_INFINITY);\n const observerRef = useRef<ResizeObserver | null>(null);\n\n const containerRef = useCallback((element: HTMLElement | null): void => {\n observerRef.current?.disconnect();\n if (!element) {\n return;\n }\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n setWidth(entry.contentRect.width);\n }\n });\n observer.observe(element);\n observerRef.current = observer;\n }, []);\n\n useEffect(\n () => () => {\n observerRef.current?.disconnect();\n },\n [],\n );\n\n return [containerRef, 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;\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;\n }\n const handleChange = (): void => {\n setMediaTick((tick) => tick + 1);\n };\n for (const list of lists) {\n list.addEventListener(\"change\", handleChange);\n }\n return () => {\n for (const list of lists) {\n list.removeEventListener(\"change\", handleChange);\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","\"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, useEffect, useMemo } from \"react\";\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\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 actorRef = useActorRef(dashfooMachine, { input: { model: normalize(initialModel) } });\n const history = useSelector(actorRef, (snapshot) => snapshot.context.history);\n\n useEffect(() => {\n if (controlledModel !== undefined) {\n actorRef.send({ model: normalize(controlledModel), type: \"SET_MODEL\" });\n }\n }, [actorRef, controlledModel]);\n\n const model = controlledModel ?? history.present;\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 const transition = ((): { after: Dashfoo; before: Dashfoo } => {\n if (controlledModel === undefined) {\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ action: resolved, type: \"DISPATCH\" });\n return { after: actorRef.getSnapshot().context.history.present, before };\n }\n return { after: reducer(controlledModel, resolved), before: normalize(controlledModel) };\n })();\n notify(transition.before, transition.after, resolved);\n },\n [actorRef, controlledModel, notify, onAction],\n );\n\n const undo = useCallback(() => {\n if (controlledModel !== undefined) {\n return;\n }\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ type: \"UNDO\" });\n const after = actorRef.getSnapshot().context.history.present;\n notify(before, after);\n }, [actorRef, controlledModel, notify]);\n\n const redo = useCallback(() => {\n if (controlledModel !== undefined) {\n return;\n }\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ type: \"REDO\" });\n const after = actorRef.getSnapshot().context.history.present;\n notify(before, after);\n }, [actorRef, controlledModel, notify]);\n\n const setModel = useCallback(\n (next: Dashfoo) => {\n actorRef.send({ model: normalize(next), type: \"SET_MODEL\" });\n },\n [actorRef],\n );\n\n return useMemo(\n () => ({\n canRedo: () => canRedo(actorRef.getSnapshot().context.history),\n canUndo: () => canUndo(actorRef.getSnapshot().context.history),\n dispatch,\n model,\n redo,\n setModel,\n undo,\n }),\n [actorRef, dispatch, model, redo, setModel, undo],\n );\n};\n\nexport { useDashfooStore };\nexport type { DashfooStore, UseDashfooStoreOptions };\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 { dragDockMachine, Point } from \"@dashfoo/core\";\nimport { zoneRect } from \"@dashfoo/core\";\nimport type { DragDropManager } from \"@dnd-kit/dom\";\nimport { Feedback } from \"@dnd-kit/dom\";\nimport { useSelector } from \"@xstate/react\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport type { ActorRefFrom } from \"xstate\";\n\nimport type { Zone } from \"../lib/tab-insertion\";\nimport { insertionLineRect } from \"../lib/tab-insertion\";\n\ntype DragActor = ActorRefFrom<typeof dragDockMachine>;\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 intent = useSelector(actorRef, (snapshot) => snapshot.context.intent);\n const draggedId = useSelector(actorRef, (snapshot) => snapshot.context.subject?.id);\n if (!intent) {\n return null;\n }\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: { data?: Record<string, unknown> } | null): string => {\n const raw = source?.data?.label;\n return typeof raw === \"string\" ? raw : \"\";\n};\n\ntype ChipState = { label: string; x: number; y: number };\n\nconst DragPreviewOverlay = ({ manager }: { manager: DragDropManager }): ReactNode => {\n const [chip, setChip] = useState<ChipState | null>(null);\n\n useEffect(() => {\n const offStart = manager.monitor.addEventListener(\"dragstart\", (event) => {\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 offEnd = manager.monitor.addEventListener(\"dragend\", () => setChip(null));\n return () => {\n offStart();\n offEnd();\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 type { ReactNode } from \"react\";\nimport { useInsertionEffect, useState } from \"react\";\n\nimport {\n createDragManager,\n createDragSubjectStore,\n DragSubjectStoreContext,\n SharedDragManagerContext,\n} from \"../hooks/drag-hooks\";\n\nimport { DragPreviewOverlay } from \"./drag-overlays\";\n\nconst DashfooDragProvider = ({ children }: { children: ReactNode }): ReactNode => {\n const [manager] = useState(createDragManager);\n useInsertionEffect(() => () => manager.destroy(), [manager]);\n\n const [subjectStore] = useState(createDragSubjectStore);\n\n return (\n <SharedDragManagerContext.Provider value={manager}>\n <DragSubjectStoreContext.Provider value={subjectStore}>\n {children}\n <DragPreviewOverlay manager={manager} />\n </DragSubjectStoreContext.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","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, DockLocation, DragSubject, DropIntent, Point } from \"@dashfoo/core\";\nimport { dragDockMachine, resolveDockTarget, tabNodeSchema } from \"@dashfoo/core\";\nimport type { DragEndEvent, DragStartEvent } from \"@dnd-kit/dom\";\nimport { useActorRef } from \"@xstate/react\";\nimport type { ReactNode } from \"react\";\nimport {\n useCallback,\n useContext,\n useEffect,\n useId,\n useInsertionEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport type { DragContextValue } from \"../hooks/drag-hooks\";\nimport {\n createDragManager,\n createDragSubjectStore,\n DragContext,\n DragSubjectStoreContext,\n sameDragSubject,\n sameDropIntent,\n SharedDragManagerContext,\n} 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 { DockIndicator, DragPreviewOverlay } from \"./drag-overlays\";\n\nconst tabRects = (strip: Element, excludeId?: string): Array<DOMRect> =>\n [...strip.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')].flatMap((tab) =>\n tab.dataset.tabId === excludeId ? [] : [tab.getBoundingClientRect()],\n );\n\nconst intentForTabset = (\n id: string,\n element: HTMLElement,\n point: Point,\n draggedId?: string,\n): DropIntent => {\n const strip = element.querySelector('[data-dashfoo=\"tabstrip\"]');\n if (strip && pointInRect(point, strip.getBoundingClientRect())) {\n return {\n index: insertionIndex(tabRects(strip, draggedId), point.x),\n location: \"center\",\n targetId: id,\n };\n }\n const target = resolveDockTarget(point, element.getBoundingClientRect());\n const location: DockLocation = target.kind === \"tab\" ? \"center\" : `split-${target.edge}`;\n if (location === \"center\" && strip) {\n return { index: tabRects(strip, draggedId).length, location, targetId: id };\n }\n return { location, targetId: id };\n};\n\nconst isTabFactory = (value: unknown): value is () => unknown => typeof value === \"function\";\n\nconst subjectFor = (source: {\n data?: Record<string, unknown>;\n id: string | number;\n}): 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: unknown;\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\ntype DragProviderProps = {\n children: ReactNode;\n\n onCommit?: (action: Action) => void;\n\n splitDock?: boolean;\n};\n\nconst DragProvider = ({ children, onCommit, splitDock }: DragProviderProps): ReactNode => {\n const actorRef = useActorRef(dragDockMachine);\n\n const layoutStore = useContext(LayoutStoreContext);\n\n const sharedManager = useContext(SharedDragManagerContext);\n const [ownManager] = useState(() => (sharedManager ? null : createDragManager()));\n useInsertionEffect(() => () => ownManager?.destroy(), [ownManager]);\n const manager = sharedManager ?? ownManager;\n if (manager === null) {\n throw new Error(\n \"[dashfoo] DashfooDragProvider unmounted while its layout is still mounted; keep the provider above the layout or remount the layout\",\n );\n }\n\n const inheritedStore = useContext(DragSubjectStoreContext);\n const [subjectStore] = useState(() => inheritedStore ?? createDragSubjectStore());\n const ownerId = useId();\n useEffect(() => {\n const subscription = actorRef.subscribe((snapshot) => {\n const { intent, subject } = snapshot.context;\n const state = subjectStore.getState();\n if (intent !== null) {\n if (!sameDropIntent(state.intent, intent) || state.intentOwner !== ownerId) {\n subjectStore.setState({ intent, intentOwner: ownerId });\n }\n } else if (state.intent !== null && state.intentOwner === ownerId) {\n subjectStore.setState({ intent: null, intentOwner: null });\n }\n if (!sameDragSubject(subjectStore.getState().subject, subject)) {\n subjectStore.setState({ subject });\n }\n });\n return () => {\n subscription.unsubscribe();\n };\n }, [actorRef, ownerId, subjectStore]);\n\n const onCommitRef = useRef(onCommit);\n const splitDockRef = useRef(splitDock);\n useEffect(() => {\n onCommitRef.current = onCommit;\n splitDockRef.current = splitDock;\n });\n\n const getTabsetElement = useCallback(\n (id: string): HTMLElement | undefined => {\n const element = manager.registry.droppables.get(`${ownerId}:${id}`)?.element;\n return element instanceof HTMLElement ? element : undefined;\n },\n [manager, ownerId],\n );\n\n useEffect(() => {\n const subscription = actorRef.on(\"COMMIT\", (emitted) => {\n if (layoutStore?.getState().editable === false) {\n return;\n }\n const commit = onCommitRef.current ?? 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(emitted.action);\n });\n return () => {\n subscription.unsubscribe();\n };\n }, [actorRef, layoutStore]);\n\n useEffect(() => {\n const resolveIntent = (\n targetId: string,\n element: HTMLElement,\n point: Point,\n draggedId?: string,\n ): DropIntent | null => {\n if (layoutStore?.getState().editable === false) {\n return null;\n }\n const tabIds = [...element.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')].map(\n (tab) => tab.dataset.tabId ?? \"\",\n );\n if (!shouldAllowDrop(draggedId, targetId, tabIds)) {\n return null;\n }\n const intent = intentForTabset(targetId, element, point, draggedId);\n\n const splitDockResolved = splitDockRef.current ?? layoutStore?.getState().splitDock ?? true;\n if (!splitDockResolved && intent.location.startsWith(\"split-\")) {\n return { location: \"center\", targetId };\n }\n return intent;\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 const syncIntent = (): void => {\n const operation = manager.dragOperation;\n const point = operation.position.current;\n const target = operation.target;\n\n const data = target?.data as { layerId?: string; tabsetId?: string } | undefined;\n const tabsetId = data?.layerId === ownerId ? data.tabsetId : undefined;\n const element = tabsetId === undefined ? undefined : target?.element;\n const draggedId = operation.source ? String(operation.source.id) : undefined;\n actorRef.send({\n intent:\n tabsetId !== undefined && element instanceof HTMLElement\n ? resolveIntent(tabsetId, element, point, draggedId)\n : null,\n type: \"OVER\",\n });\n };\n\n const handleMove = (): void => syncIntent();\n const handleCollision = (): void => syncIntent();\n\n const handleEnd = (event: DragEndEvent): void => {\n if (event.canceled) {\n actorRef.send({ type: \"CANCEL\" });\n return;\n }\n syncIntent();\n actorRef.send({ type: \"DROP\" });\n };\n const offStart = manager.monitor.addEventListener(\"dragstart\", handleStart);\n const offMove = manager.monitor.addEventListener(\"dragmove\", handleMove);\n const offCollision = manager.monitor.addEventListener(\"collision\", handleCollision);\n const offEnd = manager.monitor.addEventListener(\"dragend\", handleEnd);\n return () => {\n offStart();\n offMove();\n offCollision();\n offEnd();\n };\n }, [actorRef, layoutStore, manager, ownerId]);\n\n const contextValue = useMemo<DragContextValue>(\n () => ({ layerId: ownerId, manager }),\n [manager, ownerId],\n );\n\n return (\n <DragContext.Provider value={contextValue}>\n <DragSubjectStoreContext.Provider value={subjectStore}>\n {children}\n <DockIndicator actorRef={actorRef} getTabsetElement={getTabsetElement} />\n {ownManager === null ? null : <DragPreviewOverlay manager={ownManager} />}\n </DragSubjectStoreContext.Provider>\n </DragContext.Provider>\n );\n};\n\nexport {\n useDragSubject,\n useTabDraggable,\n useTabsetDraggable,\n useTabsetDroppable,\n} from \"../hooks/drag-hooks\";\nexport { DragProvider, subjectFor };\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","\"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 // Blur can fire after Enter/Escape already settled the edit; the ref\n // suppresses that trailing blur so the commit happens at most once.\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","\"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","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 { 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 } 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 renderTab: (tab: TabNode) => ReactNode;\n renderTabLabel?: (tab: TabNode) => ReactNode;\n renderTabsetToolbar?: (tabset: TabsetNode) => ReactNode;\n resizableSplits?: boolean;\n\n rootRef?: Ref<HTMLDivElement>;\n\n snap?: SnapConfig;\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 renderTab,\n renderTabLabel,\n renderTabsetToolbar,\n resizableSplits = true,\n rootRef,\n snap,\n style,\n ...props\n}: LayoutRootProps): ReactNode => {\n const global = model.global;\n const snapshot: LayoutState = {\n closableTabs: editable && closableTabs && global.tabEnableClose !== false,\n dispatch,\n draggableTabs: editable && draggableTabs && global.tabEnableDrag !== false,\n draggableTabsets: editable && draggableTabsets,\n editable,\n floatable: editable && floatable,\n keepMounted,\n maximizable: maximizable && global.tabSetEnableMaximize !== false,\n maximizedTabsetId: model.maximizedTabsetId,\n renamableTabs: editable && renamableTabs && global.tabEnableRename !== false,\n renderTab,\n renderTabLabel,\n renderTabsetToolbar,\n resizableSplits: editable && resizableSplits && global.enableSplitResize !== false,\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: CSSProperties =\n global.splitterSize === undefined\n ? { ...rootStyle, ...style }\n : ({\n ...rootStyle,\n \"--dashfoo-splitter-size\": `${global.splitterSize}px`,\n ...style,\n } as CSSProperties);\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\nexport { LayoutRoot };\nexport type { LayoutRootProps };\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\";\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 registerRenameInput: () => () => void;\n registerTablist: (element: HTMLDivElement | null) => void;\n renameInputCount: number;\n renameTab: (tabId: string, name: string) => void;\n restoreFocus: boolean;\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: () => set({ editingTabId: null }),\n closeTab: (tabId) => {\n set({ restoreFocus: true });\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 registerRenameInput: () => {\n set((state) => ({ renameInputCount: state.renameInputCount + 1 }));\n return () => set((state) => ({ renameInputCount: state.renameInputCount - 1 }));\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) => get().dispatch({ name, tabId, type: \"renameTab\" }),\n restoreFocus: false,\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) {\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\";\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 = ({ children, style, ...props }: TabsetContentProps): ReactNode => {\n const node = useTabset((state) => state.node);\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-labelledby={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 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 if (active) {\n return (\n <div\n {...props}\n aria-labelledby={tabDomId(node.id, active.id)}\n data-dashfoo=\"tabcontent\"\n id={panelDomId(node.id)}\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\" style={mergedStyle} />;\n};\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;\n }\n const handlePointerDown = (event: PointerEvent): void => {\n if (event.target instanceof Node && !rootRef.current?.contains(event.target)) {\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 (event.relatedTarget instanceof Node && rootRef.current?.contains(event.relatedTarget)) {\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={() => handleSelect(item.id)}\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\";\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","\"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 return clipped && tab.dataset.tabId ? [tab.dataset.tabId] : [];\n });\n};\n\nconst useTabOverflow = (tablist: HTMLElement | null, signature: string): Array<string> => {\n const [overflow, setOverflow] = useState<Array<string>>([]);\n\n useEffect(() => {\n const recompute = (): void => {\n setOverflow((previous) => {\n const next = tablist ? overflowingIds(tablist) : [];\n return next.length === 0 && previous.length === 0 ? previous : next;\n });\n };\n recompute();\n if (!tablist) {\n return;\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 { 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-adapter\";\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 = ({\n children,\n node,\n ref: userRef,\n style,\n ...props\n}: TabsetRootProps): 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\" ? node.children.findIndex((tab) => tab.id === dragSubject.id) : -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 useEffect(() => {\n if (!store.getState().restoreFocus) {\n return;\n }\n store.setState({ restoreFocus: false });\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\nexport { TabsetRoot };\nexport type { TabsetRootProps };\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 { TabNode } from \"@dashfoo/core\";\nimport type { ComponentProps, MouseEvent, ReactNode } from \"react\";\nimport { 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-adapter\";\n\nimport { TabContext, TabsetStoreContext, useTab, useTabset } from \"./tabset-store\";\n\ntype TabsetTabProps = ComponentProps<\"span\"> & { tab: TabNode };\n\nconst TabsetTab = ({ children, ref: userRef, tab, ...props }: TabsetTabProps): 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\ntype TabsetTriggerProps = ComponentProps<\"button\">;\n\nconst TabsetTrigger = ({\n children,\n onClick,\n onDoubleClick,\n ref: userRef,\n ...props\n}: TabsetTriggerProps): 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\nexport { TabsetTab, TabsetTrigger };\nexport type { TabsetTabProps, TabsetTriggerProps };\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 { ComponentProps, FocusEvent, KeyboardEvent, MouseEvent, ReactNode } from \"react\";\nimport { useEffect, useMemo, useRef } from \"react\";\n\nimport { useInlineRename } from \"../../hooks/use-inline-rename\";\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { CloseIcon } from \"../tabset-icons\";\n\nimport { useTab, useTabset } from \"./tabset-store\";\n\ntype TabsetRenameInputProps = ComponentProps<\"input\">;\n\nconst RenameEditor = ({\n defaultValue,\n onBlur,\n onKeyDown,\n ref: userRef,\n ...props\n}: TabsetRenameInputProps): 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) => commitRename(tab.id, name),\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\nconst TabsetRenameInput = (props: TabsetRenameInputProps): 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} />;\n};\n\ntype TabsetCloseButtonProps = ComponentProps<\"button\">;\n\nconst TabsetCloseButton = ({ children, onClick, ...props }: TabsetCloseButtonProps): 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 tabIndex={index === visualSelected ? 0 : -1}\n type=\"button\"\n >\n {children ?? <CloseIcon />}\n </button>\n );\n};\n\nexport { RenameEditor, TabsetCloseButton, TabsetRenameInput };\nexport type { TabsetCloseButtonProps, TabsetRenameInputProps };\n","\"use client\";\n\nimport type { ComponentProps, CSSProperties, KeyboardEvent, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\n\nimport { mergeRefs } from \"../../lib/merge-refs\";\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 = ({ style, ...props }: TabsetTabStripProps): ReactNode => (\n <div {...props} data-dashfoo=\"tabstrip\" style={{ ...stripStyle, ...style }} />\n);\n\ntype TabsetTablistProps = ComponentProps<\"div\">;\n\nconst TabsetTablist = ({\n onKeyDown,\n ref: userRef,\n style,\n ...props\n}: TabsetTablistProps): ReactNode => {\n const node = useTabset((state) => state.node);\n const registerTablist = useTabset((state) => state.registerTablist);\n const selectTab = useTabset((state) => state.selectTab);\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 const targets: Record<string, number> = {\n ArrowLeft: (node.selected - 1 + count) % count,\n ArrowRight: (node.selected + 1) % count,\n End: count - 1,\n Home: 0,\n };\n const next = targets[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 return (\n <div\n aria-label={node.name ?? \"Tabs\"}\n {...props}\n aria-orientation=\"horizontal\"\n data-dashfoo=\"tablist\"\n onKeyDown={handleKeyDown}\n ref={refCallback}\n role=\"tablist\"\n style={{ ...tablistStyle, ...style }}\n tabIndex={-1}\n />\n );\n};\n\nexport { TabsetTablist, TabsetTabStrip };\nexport type { TabsetTablistProps, TabsetTabStripProps };\n","\"use client\";\n\nimport type { ComponentProps, CSSProperties, MouseEvent, ReactNode } from \"react\";\nimport { 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 { useTabsetDraggable } from \"../drag-adapter\";\nimport { useHasFloatLayer } from \"../float-context\";\nimport { FloatIcon, GripIcon, MaximizeIcon } from \"../tabset-icons\";\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 = ({ style, ...props }: TabsetToolbarProps): ReactNode => (\n <div {...props} data-dashfoo=\"tabset-toolbar\" style={{ ...toolbarStyle, ...style }} />\n);\n\ntype TabsetGripProps = ComponentProps<\"button\">;\n\nconst TabsetGrip = ({ children, ref: userRef, ...props }: TabsetGripProps): ReactNode => {\n const activeTabName = useTabset((state) => state.activeTab?.name ?? \"\");\n const isMaximized = useTabset((state) => state.isMaximized);\n const node = useTabset((state) => state.node);\n const draggableTabsets = useLayout((state) => state.draggableTabsets);\n const hidden = !draggableTabsets || isMaximized;\n const { ref } = useTabsetDraggable(node.id, hidden, activeTabName);\n const refCallback = useMemo(() => mergeRefs<HTMLButtonElement>(ref, userRef), [ref, userRef]);\n\n if (hidden) {\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\ntype TabsetMaximizeButtonProps = ComponentProps<\"button\">;\n\nconst TabsetMaximizeButton = ({\n children,\n onClick,\n ...props\n}: TabsetMaximizeButtonProps): ReactNode => {\n const isMaximized = useTabset((state) => state.isMaximized);\n const showMaximize = useTabset((state) => state.showMaximize);\n const toggleMaximize = useTabset((state) => state.toggleMaximize);\n\n if (!showMaximize) {\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 type=\"button\"\n >\n {children ?? <MaximizeIcon maximized={isMaximized} />}\n </button>\n );\n};\n\ntype TabsetFloatButtonProps = ComponentProps<\"button\">;\n\nconst TabsetFloatButton = ({ children, onClick, ...props }: TabsetFloatButtonProps): ReactNode => {\n const floatable = useLayout((state) => state.floatable);\n const dispatch = useLayout((state) => state.dispatch);\n const isMaximized = useTabset((state) => state.isMaximized);\n const node = useTabset((state) => state.node);\n const hasFloatLayer = useHasFloatLayer();\n\n if (!floatable || isMaximized) {\n return null;\n }\n\n if (!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 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 type=\"button\"\n >\n {children ?? <FloatIcon />}\n </button>\n );\n};\n\nexport { TabsetFloatButton, TabsetGrip, TabsetMaximizeButton, TabsetToolbar };\nexport type {\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\";\nimport { TabsetRoot } from \"./tabset-root\";\nimport { useTabset } from \"./tabset-store\";\nimport { TabsetTab, TabsetTrigger } from \"./tabset-tab\";\nimport { TabsetCloseButton, TabsetRenameInput } from \"./tabset-tab-controls\";\nimport { TabsetTablist, TabsetTabStrip } from \"./tabset-tablist\";\nimport {\n TabsetFloatButton,\n TabsetGrip,\n TabsetMaximizeButton,\n TabsetToolbar,\n} from \"./tabset-toolbar\";\n\nconst tabsetContent = <TabsetContent />;\n\nconst DefaultTabsetLayout = (): ReactNode => {\n const draggableTabsets = useLayout((state) => state.draggableTabsets);\n const floatable = useLayout((state) => state.floatable);\n const renderTabsetToolbar = useLayout((state) => state.renderTabsetToolbar);\n const tabLocation = useLayout((state) => state.tabLocation);\n const tabStripEnabled = useLayout((state) => state.tabStripEnabled);\n const isMaximized = useTabset((state) => state.isMaximized);\n const node = useTabset((state) => state.node);\n const overflowCount = useTabset((state) => state.overflowItems.length);\n const showMaximize = useTabset((state) => state.showMaximize);\n\n const showToolbar =\n showMaximize ||\n renderTabsetToolbar !== undefined ||\n overflowCount > 0 ||\n (floatable && !isMaximized) ||\n (draggableTabsets && !isMaximized);\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 { snapEnabled, snapSizes } from \"@dashfoo/core\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { Fragment, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n GroupImperativeHandle,\n Layout,\n LayoutChangedMeta,\n Orientation,\n} from \"react-resizable-panels\";\nimport { Group, Panel, Separator } from \"react-resizable-panels\";\n\nimport { useLayout } from \"../hooks/layout-store\";\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 };\nconst WEIGHT_EPSILON = 0.01;\n\ntype LayoutChild = RowNode[\"children\"][number];\n\nconst layoutFromWeights = (children: RowNode[\"children\"], total: number): Layout =>\n children.reduce<Layout>((layout, child) => {\n layout[child.id] = ((child.weight ?? 1) / total) * 100;\n return layout;\n }, {});\n\nconst orderedFromLayout = (layout: Layout, children: RowNode[\"children\"]): Array<number> =>\n children.map((child) => layout[child.id] ?? 0);\n\nconst layoutFromOrdered = (sizes: Array<number>, children: RowNode[\"children\"]): 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\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 const snapActive = snapEnabled(effectiveSnap);\n const orientation: Orientation = node.orientation === \"row\" ? \"horizontal\" : \"vertical\";\n const total = node.children.reduce((sum, child) => sum + (child.weight ?? 1), 0);\n const desiredLayout = useMemo(\n () => layoutFromWeights(node.children, total),\n [node.children, total],\n );\n\n const groupRef = useRef<GroupImperativeHandle | null>(null);\n const groupElement = useRef<HTMLDivElement | null>(null);\n const syncing = useRef(false);\n\n const activeBoundary = useRef<number | null>(null);\n const snapping = useRef(false);\n const snappedBoundaryRef = useRef<number | null>(null);\n const [snappedBoundary, setSnappedBoundary] = useState<number | null>(null);\n\n const setHighlight = (boundary: number | null): void => {\n if (boundary !== snappedBoundaryRef.current) {\n snappedBoundaryRef.current = boundary;\n setSnappedBoundary(boundary);\n }\n };\n\n const setSnapTransition = (active: boolean): void => {\n const element = groupElement.current;\n if (!element) {\n return;\n }\n if (active) {\n element.dataset.dashfooSnapping = \"true\";\n } else {\n delete element.dataset.dashfooSnapping;\n }\n };\n\n useLayoutEffect(() => {\n const group = groupRef.current;\n if (!group) {\n return;\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;\n }\n\n syncing.current = true;\n group.setLayout(desiredLayout);\n const frame = requestAnimationFrame(() => {\n syncing.current = false;\n });\n return () => {\n cancelAnimationFrame(frame);\n syncing.current = false;\n };\n }, [desiredLayout]);\n\n const handleLayoutChange = (layout: Layout): void => {\n if (snapping.current || syncing.current || !resizableSplits) {\n return;\n }\n if (effectiveSnap === null || !snapActive) {\n return;\n }\n const boundary = activeBoundary.current;\n if (boundary === null) {\n return;\n }\n\n const { sizes, snapped } = snapSizes(\n orderedFromLayout(layout, node.children),\n boundary,\n effectiveSnap,\n );\n setHighlight(snapped ? boundary : null);\n if (!snapped) {\n setSnapTransition(false);\n return;\n }\n\n setSnapTransition(true);\n const group = groupRef.current;\n const target = layoutFromOrdered(sizes, node.children);\n if (!group || layoutsMatch(layout, target)) {\n return;\n }\n snapping.current = true;\n group.setLayout(target);\n snapping.current = false;\n };\n\n const handleLayoutChanged = (layout: Layout, meta: LayoutChangedMeta): void => {\n if (!meta.isUserInteraction) {\n return;\n }\n if (syncing.current) {\n return;\n }\n const boundary = activeBoundary.current;\n activeBoundary.current = null;\n setHighlight(null);\n setSnapTransition(false);\n\n if (!resizableSplits) {\n return;\n }\n let weights = node.children.map((child) => layout[child.id] ?? child.weight ?? 1);\n\n if (boundary !== null && effectiveSnap !== null && snapActive) {\n weights = snapSizes(weights, boundary, effectiveSnap).sizes;\n }\n const weightsChanged = weights.some(\n (weight, index) => Math.abs(weight - (node.children[index]?.weight ?? 1)) > WEIGHT_EPSILON,\n );\n\n if (!weightsChanged) {\n return;\n }\n\n dispatch({\n rowId: node.id,\n type: \"adjustSplit\",\n weights,\n });\n };\n\n return (\n <Group\n data-dashfoo=\"row\"\n disabled={!resizableSplits}\n elementRef={groupElement}\n groupRef={groupRef}\n key={node.id}\n onLayoutChange={snapActive ? handleLayoutChange : undefined}\n onLayoutChanged={handleLayoutChanged}\n orientation={orientation}\n style={groupStyle}\n >\n {node.children.map((child, index) => {\n const percent = ((child.weight ?? 1) / 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 activeBoundary.current = 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, Dashfoo, FloatNode, Geometry, GlobalAttributes } from \"@dashfoo/core\";\nimport type { CSSProperties, PointerEvent as ReactPointerEvent, ReactNode } from \"react\";\nimport { useRef, useState } from \"react\";\n\nimport { useLayout } from \"../hooks/layout-store\";\nimport { useInlineRename } from \"../hooks/use-inline-rename\";\nimport type { ResizeEdges, Size } from \"../lib/float-geometry\";\nimport { clampToBounds, resizeRect } from \"../lib/float-geometry\";\n\nimport { DragProvider } from \"./drag-adapter\";\nimport { EDGE_BY_KEY, RESIZE_HANDLES } from \"./float-resize-handles\";\nimport { LayoutRoot } from \"./layout-root\";\nimport { RowView } from \"./row-view\";\nimport { DockIcon, FloatIcon, GripIcon, MinimizeIcon } from \"./tabset-icons\";\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 CHIP_SIZE: Size = { height: 34, width: 168 };\n\nconst TAP_SLOP = 4;\n\ntype Gesture = {\n bounds: Size;\n edges: ResizeEdges | null;\n pointerId: number;\n start: Geometry;\n startX: number;\n startY: number;\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) => dispatch({ floatId: node.id, name, type: \"renameFloat\" }),\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) => event.stopPropagation()}\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 <FloatTitleEditor dispatch={dispatch} node={node} onDone={() => setEditing(false)} />;\n }\n return (\n <span\n data-dashfoo=\"float-title\"\n onDoubleClick={renamable ? () => setEditing(true) : undefined}\n style={titleStyle}\n title={renamable ? \"Double-click to rename\" : undefined}\n >\n {floatTitle(node)}\n </span>\n );\n};\n\ntype FloatPanelProps = {\n global: GlobalAttributes;\n node: FloatNode;\n onFocus: () => void;\n zIndex: number;\n};\n\nconst FloatPanel = ({ global, node, onFocus, zIndex }: FloatPanelProps): ReactNode => {\n const dispatch = useLayout((state) => state.dispatch);\n const closableTabs = useLayout((state) => state.closableTabs);\n const draggableTabs = useLayout((state) => state.draggableTabs);\n const editable = useLayout((state) => state.editable);\n const renamableTabs = useLayout((state) => state.renamableTabs);\n const resizableSplits = useLayout((state) => state.resizableSplits);\n const keepMounted = useLayout((state) => state.keepMounted);\n const renderTab = useLayout((state) => state.renderTab);\n const renderTabLabel = useLayout((state) => state.renderTabLabel);\n const renderTabsetToolbar = useLayout((state) => state.renderTabsetToolbar);\n const snap = useLayout((state) => state.snap);\n\n const panelRef = useRef<HTMLElement | null>(null);\n const gestureRef = useRef<Gesture | null>(null);\n const latestRef = useRef<Geometry>(node.geometry);\n const movedRef = useRef(false);\n const setPanel = (element: HTMLElement | null): void => {\n panelRef.current = element;\n };\n\n const restore = (): void => {\n if (!editable) {\n return;\n }\n dispatch({ floatId: node.id, minimized: false, type: \"setFloatMinimized\" });\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 movedRef.current = false;\n const edgeKey = event.currentTarget.dataset.edge;\n\n const parent = panel.offsetParent as HTMLElement | null;\n const gesture: Gesture = {\n bounds: { height: parent?.clientHeight ?? 0, width: parent?.clientWidth ?? 0 },\n edges: edgeKey ? (EDGE_BY_KEY.get(edgeKey) ?? null) : null,\n pointerId: event.pointerId,\n start: node.geometry,\n startX: event.clientX,\n startY: event.clientY,\n };\n gestureRef.current = gesture;\n latestRef.current = node.geometry;\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)) {\n panel.releasePointerCapture(event.pointerId);\n }\n\n if (!movedRef.current) {\n if (node.minimized) {\n restore();\n }\n return;\n }\n dispatch({ floatId: node.id, geometry: latestRef.current, type: \"moveFloat\" });\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 (!movedRef.current) {\n if (Math.hypot(dx, dy) <= TAP_SLOP) {\n return;\n }\n movedRef.current = 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 node.minimized ? CHIP_SIZE : undefined,\n );\n\n latestRef.current = next;\n panel.style.left = `${next.left}px`;\n panel.style.top = `${next.top}px`;\n\n if (!node.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 (!movedRef.current) {\n return;\n }\n panel.style.left = `${gesture.start.left}px`;\n panel.style.top = `${gesture.start.top}px`;\n if (!node.minimized) {\n panel.style.width = `${gesture.start.width}px`;\n panel.style.height = `${gesture.start.height}px`;\n }\n };\n\n if (node.minimized) {\n return (\n <button\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 onPointerCancel={handlePointerCancel}\n onPointerDown={handlePointerDown}\n onPointerDownCapture={onFocus}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n ref={setPanel}\n style={{\n left: node.geometry.left,\n pointerEvents: \"auto\",\n position: \"absolute\",\n top: node.geometry.top,\n zIndex,\n }}\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 const floatModel: Dashfoo = { global, layout: node.layout, version: 1 };\n\n return (\n <div\n data-dashfoo=\"float\"\n onPointerCancel={handlePointerCancel}\n onPointerDownCapture={onFocus}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n ref={setPanel}\n style={{\n height: node.geometry.height,\n left: node.geometry.left,\n\n pointerEvents: \"auto\",\n position: \"absolute\",\n top: node.geometry.top,\n width: node.geometry.width,\n zIndex,\n }}\n >\n <div\n data-dashfoo=\"float-titlebar\"\n onPointerDown={handlePointerDown}\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) => event.stopPropagation()}\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={() => dispatch({ floatId: node.id, type: \"dockFloat\" })}\n onPointerDown={(event) => event.stopPropagation()}\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 <LayoutRoot\n closableTabs={closableTabs}\n dispatch={dispatch}\n draggableTabs={draggableTabs}\n draggableTabsets={false}\n editable={editable}\n floatable={false}\n keepMounted={keepMounted}\n maximizable={false}\n model={floatModel}\n renamableTabs={renamableTabs}\n renderTab={renderTab}\n renderTabLabel={renderTabLabel}\n renderTabsetToolbar={renderTabsetToolbar}\n resizableSplits={resizableSplits}\n snap={snap ?? undefined}\n >\n <DragProvider>\n <RowView node={node.layout} />\n </DragProvider>\n </LayoutRoot>\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={handlePointerDown}\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 = ({\n floats,\n global,\n}: {\n floats: Array<FloatNode>;\n global: GlobalAttributes;\n}): 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 global={global}\n key={node.id}\n node={node}\n onFocus={() => setTopId(node.id)}\n zIndex={node.id === topId ? 2 : 1}\n />\n ))}\n </div>\n );\n};\n\ntype FloatLayerProps = {\n children: ReactNode;\n floats: Array<FloatNode>;\n global: GlobalAttributes;\n};\n\nconst FloatLayer = ({ children, floats, global }: FloatLayerProps): ReactNode => (\n <FloatLayerContext.Provider value>\n {children}\n <FloatOverlay floats={floats} global={global} />\n </FloatLayerContext.Provider>\n);\n\nexport { FloatLayer };\nexport type { FloatLayerProps };\n","\"use client\";\n\nimport { DragProvider } from \"./drag-adapter\";\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-adapter\";\nexport type { FloatLayerProps as LayoutFloatLayerProps } from \"./float-layer\";\nexport type { 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, stackModel } from \"@dashfoo/core\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport { forwardRef, useCallback, useContext, useImperativeHandle, useMemo } 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\";\n\nimport { DashfooDragProvider } from \"./drag-root\";\nimport { Layout } from \"./layout\";\n\nconst DEFAULT_PERSIST_DEBOUNCE_MS = 300;\n\ntype PersistInput = string | { debounceMs?: number; key: string; storage?: StorageAdapter };\n\nconst resolvePersist = (\n persist: PersistInput | undefined,\n hasDefaultModel: boolean,\n): PersistConfig | null => {\n if (persist === undefined || !hasDefaultModel) {\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 DashfooLayoutProps = {\n closableTabs?: boolean;\n components?: Record<string, TabComponent>;\n defaultModel?: Dashfoo;\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 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 persist?: PersistInput;\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\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 () => resolvePersist(persist, defaultModel !== undefined),\n [persist, defaultModel],\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 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 canRedo: store.canRedo,\n canUndo: store.canUndo,\n closeTab: (tabId) => store.dispatch({ tabId, type: \"deleteTab\" }),\n dispatch: store.dispatch,\n dockFloat: (floatId) => store.dispatch({ floatId, type: \"dockFloat\" }),\n floatTab: (tabId) => store.dispatch({ tabId, type: \"floatTab\" }),\n getModel: () => store.model,\n maximizeTabset: (tabsetId) => store.dispatch({ tabsetId, type: \"setMaximizedTabset\" }),\n redo: store.redo,\n renameTab: (tabId, name) => store.dispatch({ name, tabId, type: \"renameTab\" }),\n resetLayout: () => {\n persistence.clear();\n if (defaultModel !== undefined) {\n store.setModel(defaultModel);\n }\n },\n selectTab: (tabsetId, index) => store.dispatch({ index, tabsetId, type: \"selectTab\" }),\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\n const [containerRef, width] = useContainerWidth();\n const isCompact = responsive !== undefined && width <= responsive.maxWidth;\n const view = useMemo(\n () => (isCompact ? stackModel(store.model, responsive?.orientation) : store.model),\n [isCompact, responsive?.orientation, store.model],\n );\n\n const storeDispatch = store.dispatch;\n const dispatch = useCallback(\n (action: Action): void => {\n if (isCompact && action.type === \"adjustSplit\") {\n return;\n }\n storeDispatch(action);\n },\n [isCompact, storeDispatch],\n );\n\n const maximized = view.maximizedTabsetId ? findTabset(view, view.maximizedTabsetId) : undefined;\n\n const tree = (\n <Layout.FloatLayer floats={store.model.floats ?? []} global={store.model.global}>\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={dispatch}\n draggableTabs={isCompact ? false : draggableTabs}\n draggableTabsets={isCompact ? false : draggableTabsets}\n editable={editable}\n floatable={isCompact ? false : floatable}\n keepMounted={keepMounted}\n maximizable={maximizable}\n model={view}\n renamableTabs={renamableTabs}\n renderTab={renderTab}\n renderTabLabel={renderTabLabel}\n renderTabsetToolbar={renderTabsetToolbar}\n resizableSplits={isCompact ? false : resizableSplits}\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, DashfooLayoutProps, TabComponent };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\n\ntype PanelRootProps = ComponentProps<\"div\">;\ntype PanelHeaderProps = ComponentProps<\"div\">;\ntype PanelBodyProps = ComponentProps<\"div\">;\ntype PanelTitleProps = ComponentProps<\"span\">;\ntype PanelIconProps = ComponentProps<\"span\">;\ntype PanelBadgeProps = ComponentProps<\"span\">;\n\nconst PanelRoot = (props: PanelRootProps): ReactNode => <div {...props} data-dashfoo=\"panel\" />;\nconst PanelHeader = (props: PanelHeaderProps): ReactNode => (\n <div {...props} data-dashfoo=\"panel-header\" />\n);\nconst PanelBody = (props: PanelBodyProps): ReactNode => (\n <div {...props} data-dashfoo=\"panel-body\" />\n);\nconst PanelTitle = (props: PanelTitleProps): ReactNode => (\n <span {...props} data-dashfoo=\"panel-title\" />\n);\nconst PanelIcon = (props: PanelIconProps): ReactNode => (\n <span {...props} data-dashfoo=\"panel-icon\" />\n);\nconst PanelBadge = (props: PanelBadgeProps): ReactNode => (\n <span {...props} data-dashfoo=\"panel-badge\" />\n);\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 {\n PanelBadgeProps,\n PanelBodyProps,\n PanelHeaderProps,\n PanelIconProps,\n PanelRootProps,\n PanelTitleProps,\n};\n","\"use client\";\n\nimport { TabsetContent } from \"./tabset-content\";\nimport { TabsetOverflowMenu } from \"./tabset-overflow\";\nimport { TabsetRoot } from \"./tabset-root\";\nimport { TabsetTab, TabsetTrigger } from \"./tabset-tab\";\nimport { TabsetCloseButton, TabsetRenameInput } from \"./tabset-tab-controls\";\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-tab-controls\";\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/hooks/store.ts","../src/lib/tab-insertion.ts","../src/components/drag-overlays.tsx","../src/components/drag-root.tsx","../src/hooks/layout-store.ts","../src/lib/warn-once.ts","../src/components/drag-adapter.tsx","../src/components/float-context.ts","../src/hooks/use-inline-rename.ts","../src/lib/float-geometry.ts","../src/components/float-resize-handles.ts","../src/components/layout-root.tsx","../src/lib/tab-ids.ts","../src/components/tabset/tabset-store.ts","../src/components/tabset/tabset-content.tsx","../src/components/tab-overflow.tsx","../src/components/tabset/tabset-overflow.tsx","../src/hooks/use-tab-overflow.ts","../src/lib/tab-selection.ts","../src/components/tabset/tabset-root.tsx","../src/lib/merge-refs.ts","../src/components/tabset/tabset-tab.tsx","../src/components/tabset-icons.tsx","../src/components/tabset/tabset-tab-controls.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.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 { DragSubject, DropIntent, TabNode } from \"@dashfoo/core\";\nimport {\n Accessibility,\n Draggable,\n DragDropManager,\n Droppable,\n Feedback,\n PointerSensor,\n} from \"@dnd-kit/dom\";\nimport type { Context } from \"react\";\nimport { createContext, useCallback, useContext, useEffect, useId, useMemo, useRef } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { createStore, useStore } from \"zustand\";\n\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\nconst createDragManager = (): DragDropManager =>\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 DragContextValue = {\n layerId: string;\n manager: DragDropManager;\n};\n\nconst DragContext = createContext<DragContextValue | null>(null);\n\nconst SharedDragManagerContext: Context<DragDropManager | null> =\n createContext<DragDropManager | null>(null);\n\ntype DragSubjectState = {\n intent: DropIntent | null;\n intentOwner: string | null;\n subject: DragSubject | null;\n};\n\ntype DragSubjectStore = StoreApi<DragSubjectState>;\n\nconst createDragSubjectStore = (): DragSubjectStore =>\n createStore<DragSubjectState>(() => ({ intent: null, intentOwner: null, subject: null }));\n\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\nconst sameDragSubject = (a: DragSubject | null, b: DragSubject | null): boolean =>\n a === b || (a !== null && b !== null && a.id === b.id && a.kind === b.kind);\n\nconst nullSubjectStore = createDragSubjectStore();\n\nconst DragSubjectStoreContext: Context<DragSubjectStore | null> =\n createContext<DragSubjectStore | null>(null);\n\ntype DraggableHandle = {\n draggableRef: { current: Draggable | 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<Draggable | 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: Record<string, unknown>; 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\" }), []);\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\" }), [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 });\n const data = useMemo(\n () => ({ createTab: (): TabNode => createTabRef.current(), type: \"external\" }),\n [],\n );\n return useDraggableEntity({ data, id: `external-${id}` }, disabled, label);\n};\n\nconst useDragSubject = (): DragSubject | null => {\n const store = useContext(DragSubjectStoreContext);\n return useStore(store ?? nullSubjectStore, (state) => state.subject);\n};\n\nconst useDropIntent = (): DropIntent | null => {\n const store = useContext(DragSubjectStoreContext);\n return useStore(store ?? nullSubjectStore, (state) => state.intent);\n};\n\nexport type { DragContextValue, DragSubjectStore, ExternalTabSourceOptions };\nexport {\n createDragManager,\n createDragSubjectStore,\n DragContext,\n DragSubjectStoreContext,\n sameDragSubject,\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 {\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 {\n void 0;\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\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 });\n\n const [initialModel] = useState<Dashfoo | undefined>(() => {\n if (config === null || defaultModel === undefined) {\n return defaultModel;\n }\n const raw = config.storage.getItem(config.key);\n if (raw === null) {\n return defaultModel;\n }\n try {\n return fromJSON(raw);\n } catch {\n return defaultModel;\n }\n });\n\n useEffect(() => {\n const current = configRef.current;\n if (current === null) {\n return;\n }\n const raw = current.storage.getItem(current.key);\n if (raw === null) {\n return;\n }\n try {\n fromJSON(raw);\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] discarding unreadable persisted layout\", error);\n current.storage.removeItem(current.key);\n }\n }, []);\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 pending.current.storage.setItem(pending.current.key, pending.current.value);\n pending.current = null;\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 current.storage.removeItem(current.key);\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 { useCallback, useEffect, useMemo, useRef, 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 useContainerWidth = (): [(element: HTMLElement | null) => void, number] => {\n const [width, setWidth] = useState<number>(Number.POSITIVE_INFINITY);\n const observerRef = useRef<ResizeObserver | null>(null);\n\n const containerRef = useCallback((element: HTMLElement | null): void => {\n observerRef.current?.disconnect();\n if (!element) {\n return;\n }\n const observer = new ResizeObserver((entries) => {\n const entry = entries.at(0);\n if (entry) {\n setWidth(entry.contentRect.width);\n }\n });\n observer.observe(element);\n observerRef.current = observer;\n }, []);\n\n useEffect(\n () => () => {\n observerRef.current?.disconnect();\n },\n [],\n );\n\n return [containerRef, 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 for (const list of lists) {\n list.addEventListener(\"change\", handleChange);\n }\n return () => {\n for (const list of lists) {\n list.removeEventListener(\"change\", handleChange);\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","\"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, useEffect, useMemo } from \"react\";\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\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 actorRef = useActorRef(dashfooMachine, { input: { model: normalize(initialModel) } });\n const history = useSelector(actorRef, (snapshot) => snapshot.context.history);\n\n useEffect(() => {\n if (controlledModel !== undefined) {\n actorRef.send({ model: normalize(controlledModel), type: \"SET_MODEL\" });\n }\n }, [actorRef, controlledModel]);\n\n const model = controlledModel ?? history.present;\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 const transition = ((): { after: Dashfoo; before: Dashfoo } => {\n if (controlledModel === undefined) {\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ action: resolved, type: \"DISPATCH\" });\n return { after: actorRef.getSnapshot().context.history.present, before };\n }\n return { after: reducer(controlledModel, resolved), before: normalize(controlledModel) };\n })();\n notify(transition.before, transition.after, resolved);\n },\n [actorRef, controlledModel, notify, onAction],\n );\n\n const undo = useCallback(() => {\n if (controlledModel !== undefined) {\n return;\n }\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ type: \"UNDO\" });\n const after = actorRef.getSnapshot().context.history.present;\n notify(before, after);\n }, [actorRef, controlledModel, notify]);\n\n const redo = useCallback(() => {\n if (controlledModel !== undefined) {\n return;\n }\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ type: \"REDO\" });\n const after = actorRef.getSnapshot().context.history.present;\n notify(before, after);\n }, [actorRef, controlledModel, notify]);\n\n const setModel = useCallback(\n (next: Dashfoo) => {\n actorRef.send({ model: normalize(next), type: \"SET_MODEL\" });\n },\n [actorRef],\n );\n\n return useMemo(\n () => ({\n canRedo: () => canRedo(actorRef.getSnapshot().context.history),\n canUndo: () => canUndo(actorRef.getSnapshot().context.history),\n dispatch,\n model,\n redo,\n setModel,\n undo,\n }),\n [actorRef, dispatch, model, redo, setModel, undo],\n );\n};\n\nexport { useDashfooStore };\nexport type { DashfooStore, UseDashfooStoreOptions };\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 { dragDockMachine, Point } from \"@dashfoo/core\";\nimport { zoneRect } from \"@dashfoo/core\";\nimport type { DragDropManager } from \"@dnd-kit/dom\";\nimport { Feedback } from \"@dnd-kit/dom\";\nimport { useSelector } from \"@xstate/react\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport type { ActorRefFrom } from \"xstate\";\n\nimport type { Zone } from \"../lib/tab-insertion\";\nimport { insertionLineRect } from \"../lib/tab-insertion\";\n\ntype DragActor = ActorRefFrom<typeof dragDockMachine>;\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 intent = useSelector(actorRef, (snapshot) => snapshot.context.intent);\n const draggedId = useSelector(actorRef, (snapshot) => snapshot.context.subject?.id);\n if (!intent) {\n return null;\n }\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: { data?: Record<string, unknown> } | null): string => {\n const raw = source?.data?.label;\n return typeof raw === \"string\" ? raw : \"\";\n};\n\ntype ChipState = { label: string; x: number; y: number };\n\nconst DragPreviewOverlay = ({ manager }: { manager: DragDropManager }): ReactNode => {\n const [chip, setChip] = useState<ChipState | null>(null);\n\n useEffect(() => {\n const offStart = manager.monitor.addEventListener(\"dragstart\", (event) => {\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 offEnd = manager.monitor.addEventListener(\"dragend\", () => {\n setChip(null);\n });\n return () => {\n offStart();\n offEnd();\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 type { ReactNode } from \"react\";\nimport { useInsertionEffect, useState } from \"react\";\n\nimport {\n createDragManager,\n createDragSubjectStore,\n DragSubjectStoreContext,\n SharedDragManagerContext,\n} from \"../hooks/drag-hooks\";\n\nimport { DragPreviewOverlay } from \"./drag-overlays\";\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 [subjectStore] = useState(createDragSubjectStore);\n\n return (\n <SharedDragManagerContext.Provider value={manager}>\n <DragSubjectStoreContext.Provider value={subjectStore}>\n {children}\n <DragPreviewOverlay manager={manager} />\n </DragSubjectStoreContext.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","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, DockLocation, DragSubject, DropIntent, Point } from \"@dashfoo/core\";\nimport { dragDockMachine, resolveDockTarget, tabNodeSchema } from \"@dashfoo/core\";\nimport type { DragEndEvent, DragStartEvent } from \"@dnd-kit/dom\";\nimport { useActorRef } from \"@xstate/react\";\nimport type { ReactNode } from \"react\";\nimport {\n useCallback,\n useContext,\n useEffect,\n useId,\n useInsertionEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport type { DragContextValue } from \"../hooks/drag-hooks\";\nimport {\n createDragManager,\n createDragSubjectStore,\n DragContext,\n DragSubjectStoreContext,\n sameDragSubject,\n sameDropIntent,\n SharedDragManagerContext,\n} 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 { DockIndicator, DragPreviewOverlay } from \"./drag-overlays\";\n\nconst tabRects = (strip: Element, excludeId?: string): Array<DOMRect> =>\n [...strip.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')].flatMap((tab) =>\n tab.dataset.tabId === excludeId ? [] : [tab.getBoundingClientRect()],\n );\n\nconst intentForTabset = (\n id: string,\n element: HTMLElement,\n point: Point,\n draggedId?: string,\n): DropIntent => {\n const strip = element.querySelector('[data-dashfoo=\"tabstrip\"]');\n if (strip && pointInRect(point, strip.getBoundingClientRect())) {\n return {\n index: insertionIndex(tabRects(strip, draggedId), point.x),\n location: \"center\",\n targetId: id,\n };\n }\n const target = resolveDockTarget(point, element.getBoundingClientRect());\n const location: DockLocation = target.kind === \"tab\" ? \"center\" : `split-${target.edge}`;\n if (location === \"center\" && strip) {\n return { index: tabRects(strip, draggedId).length, location, targetId: id };\n }\n return { location, targetId: id };\n};\n\nconst isTabFactory = (value: unknown): value is () => unknown => typeof value === \"function\";\n\nconst subjectFor = (source: {\n data?: Record<string, unknown>;\n id: string | number;\n}): 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: unknown;\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\ntype DragProviderProps = {\n children: ReactNode;\n\n onCommit?: (action: Action) => void;\n\n splitDock?: boolean;\n};\n\nconst DragProvider = ({ children, onCommit, splitDock }: DragProviderProps): ReactNode => {\n const actorRef = useActorRef(dragDockMachine);\n\n const layoutStore = useContext(LayoutStoreContext);\n\n const sharedManager = useContext(SharedDragManagerContext);\n const [ownManager] = useState(() => (sharedManager ? null : createDragManager()));\n useInsertionEffect(() => () => ownManager?.destroy(), [ownManager]);\n const manager = sharedManager ?? ownManager;\n if (manager === null) {\n throw new Error(\n \"[dashfoo] DashfooDragProvider unmounted while its layout is still mounted; keep the provider above the layout or remount the layout\",\n );\n }\n\n const inheritedStore = useContext(DragSubjectStoreContext);\n const [subjectStore] = useState(() => inheritedStore ?? createDragSubjectStore());\n const ownerId = useId();\n useEffect(() => {\n const subscription = actorRef.subscribe((snapshot) => {\n const { intent, subject } = snapshot.context;\n const state = subjectStore.getState();\n if (intent !== null) {\n if (!sameDropIntent(state.intent, intent) || state.intentOwner !== ownerId) {\n subjectStore.setState({ intent, intentOwner: ownerId });\n }\n } else if (state.intent !== null && state.intentOwner === ownerId) {\n subjectStore.setState({ intent: null, intentOwner: null });\n }\n if (!sameDragSubject(subjectStore.getState().subject, subject)) {\n subjectStore.setState({ subject });\n }\n });\n return () => {\n subscription.unsubscribe();\n };\n }, [actorRef, ownerId, subjectStore]);\n\n const onCommitRef = useRef(onCommit);\n const splitDockRef = useRef(splitDock);\n useEffect(() => {\n onCommitRef.current = onCommit;\n splitDockRef.current = splitDock;\n });\n\n const getTabsetElement = useCallback(\n (id: string): HTMLElement | undefined => {\n const element = manager.registry.droppables.get(`${ownerId}:${id}`)?.element;\n return element instanceof HTMLElement ? element : undefined;\n },\n [manager, ownerId],\n );\n\n useEffect(() => {\n const subscription = actorRef.on(\"COMMIT\", (emitted) => {\n if (layoutStore?.getState().editable === false) {\n return;\n }\n const commit = onCommitRef.current ?? 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(emitted.action);\n });\n return () => {\n subscription.unsubscribe();\n };\n }, [actorRef, layoutStore]);\n\n useEffect(() => {\n const resolveIntent = (\n targetId: string,\n element: HTMLElement,\n point: Point,\n draggedId?: string,\n ): DropIntent | null => {\n if (layoutStore?.getState().editable === false) {\n return null;\n }\n const tabIds = [...element.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')].map(\n (tab) => tab.dataset.tabId ?? \"\",\n );\n if (!shouldAllowDrop(draggedId, targetId, tabIds)) {\n return null;\n }\n const intent = intentForTabset(targetId, element, point, draggedId);\n\n const splitDockResolved = splitDockRef.current ?? layoutStore?.getState().splitDock ?? true;\n if (!splitDockResolved && intent.location.startsWith(\"split-\")) {\n return { location: \"center\", targetId };\n }\n return intent;\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 const syncIntent = (): void => {\n const operation = manager.dragOperation;\n const point = operation.position.current;\n const target = operation.target;\n\n const data = target?.data as { layerId?: string; tabsetId?: string } | undefined;\n const tabsetId = data?.layerId === ownerId ? data.tabsetId : undefined;\n const element = tabsetId === undefined ? undefined : target?.element;\n const draggedId = operation.source ? String(operation.source.id) : undefined;\n actorRef.send({\n intent:\n tabsetId !== undefined && element instanceof HTMLElement\n ? resolveIntent(tabsetId, element, point, draggedId)\n : null,\n type: \"OVER\",\n });\n };\n\n const handleMove = (): void => {\n syncIntent();\n };\n const handleCollision = (): void => {\n syncIntent();\n };\n\n const handleEnd = (event: DragEndEvent): void => {\n if (event.canceled) {\n actorRef.send({ type: \"CANCEL\" });\n return;\n }\n syncIntent();\n actorRef.send({ type: \"DROP\" });\n };\n const offStart = manager.monitor.addEventListener(\"dragstart\", handleStart);\n const offMove = manager.monitor.addEventListener(\"dragmove\", handleMove);\n const offCollision = manager.monitor.addEventListener(\"collision\", handleCollision);\n const offEnd = manager.monitor.addEventListener(\"dragend\", handleEnd);\n return () => {\n offStart();\n offMove();\n offCollision();\n offEnd();\n };\n }, [actorRef, layoutStore, manager, ownerId]);\n\n const contextValue = useMemo<DragContextValue>(\n () => ({ layerId: ownerId, manager }),\n [manager, ownerId],\n );\n\n return (\n <DragContext.Provider value={contextValue}>\n <DragSubjectStoreContext.Provider value={subjectStore}>\n {children}\n <DockIndicator actorRef={actorRef} getTabsetElement={getTabsetElement} />\n {ownManager === null ? null : <DragPreviewOverlay manager={ownManager} />}\n </DragSubjectStoreContext.Provider>\n </DragContext.Provider>\n );\n};\n\nexport {\n useDragSubject,\n useTabDraggable,\n useTabsetDraggable,\n useTabsetDroppable,\n} from \"../hooks/drag-hooks\";\nexport { DragProvider, subjectFor };\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","\"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 // Blur can fire after Enter/Escape already settled the edit; the ref\n // suppresses that trailing blur so the commit happens at most once.\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","\"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","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 { 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 } 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 renderTab: (tab: TabNode) => ReactNode;\n renderTabLabel?: (tab: TabNode) => ReactNode;\n renderTabsetToolbar?: (tabset: TabsetNode) => ReactNode;\n resizableSplits?: boolean;\n\n rootRef?: Ref<HTMLDivElement>;\n\n snap?: SnapConfig;\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 renderTab,\n renderTabLabel,\n renderTabsetToolbar,\n resizableSplits = true,\n rootRef,\n snap,\n style,\n ...props\n}: LayoutRootProps): ReactNode => {\n const global = model.global;\n const snapshot: LayoutState = {\n closableTabs: editable && closableTabs && global.tabEnableClose !== false,\n dispatch,\n draggableTabs: editable && draggableTabs && global.tabEnableDrag !== false,\n draggableTabsets: editable && draggableTabsets,\n editable,\n floatable: editable && floatable,\n keepMounted,\n maximizable: maximizable && global.tabSetEnableMaximize !== false,\n maximizedTabsetId: model.maximizedTabsetId,\n renamableTabs: editable && renamableTabs && global.tabEnableRename !== false,\n renderTab,\n renderTabLabel,\n renderTabsetToolbar,\n resizableSplits: editable && resizableSplits && global.enableSplitResize !== false,\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: CSSProperties =\n global.splitterSize === undefined\n ? { ...rootStyle, ...style }\n : ({\n ...rootStyle,\n \"--dashfoo-splitter-size\": `${global.splitterSize}px`,\n ...style,\n } as CSSProperties);\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\nexport { LayoutRoot };\nexport type { LayoutRootProps };\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\";\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 registerRenameInput: () => () => void;\n registerTablist: (element: HTMLDivElement | null) => void;\n renameInputCount: number;\n renameTab: (tabId: string, name: string) => void;\n restoreFocus: boolean;\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({ restoreFocus: true });\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 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 restoreFocus: false,\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\";\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 = ({ children, style, ...props }: TabsetContentProps): ReactNode => {\n const node = useTabset((state) => state.node);\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-labelledby={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 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-labelledby={tabDomId(node.id, active.id)}\n data-dashfoo=\"tabcontent\"\n id={panelDomId(node.id)}\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\" style={mergedStyle} />;\n};\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\";\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","\"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 useTabOverflow = (tablist: HTMLElement | null, signature: string): Array<string> => {\n const [overflow, setOverflow] = useState<Array<string>>([]);\n\n useEffect(() => {\n const recompute = (): void => {\n setOverflow((previous) => {\n const next = tablist ? overflowingIds(tablist) : [];\n return next.length === 0 && previous.length === 0 ? 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 { 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-adapter\";\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 = ({\n children,\n node,\n ref: userRef,\n style,\n ...props\n}: TabsetRootProps): 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\" ? node.children.findIndex((tab) => tab.id === dragSubject.id) : -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 useEffect(() => {\n if (!store.getState().restoreFocus) {\n return;\n }\n store.setState({ restoreFocus: false });\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\nexport { TabsetRoot };\nexport type { TabsetRootProps };\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 { TabNode } from \"@dashfoo/core\";\nimport type { ComponentProps, MouseEvent, ReactNode } from \"react\";\nimport { 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-adapter\";\n\nimport { TabContext, TabsetStoreContext, useTab, useTabset } from \"./tabset-store\";\n\ntype TabsetTabProps = ComponentProps<\"span\"> & { tab: TabNode };\n\nconst TabsetTab = ({ children, ref: userRef, tab, ...props }: TabsetTabProps): 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\ntype TabsetTriggerProps = ComponentProps<\"button\">;\n\nconst TabsetTrigger = ({\n children,\n onClick,\n onDoubleClick,\n ref: userRef,\n ...props\n}: TabsetTriggerProps): 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\nexport { TabsetTab, TabsetTrigger };\nexport type { TabsetTabProps, TabsetTriggerProps };\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 { ComponentProps, FocusEvent, KeyboardEvent, MouseEvent, ReactNode } from \"react\";\nimport { useEffect, useMemo, useRef } from \"react\";\n\nimport { useInlineRename } from \"../../hooks/use-inline-rename\";\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { CloseIcon } from \"../tabset-icons\";\n\nimport { useTab, useTabset } from \"./tabset-store\";\n\ntype TabsetRenameInputProps = ComponentProps<\"input\">;\n\nconst RenameEditor = ({\n defaultValue,\n onBlur,\n onKeyDown,\n ref: userRef,\n ...props\n}: TabsetRenameInputProps): 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\nconst TabsetRenameInput = (props: TabsetRenameInputProps): 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} />;\n};\n\ntype TabsetCloseButtonProps = ComponentProps<\"button\">;\n\nconst TabsetCloseButton = ({ children, onClick, ...props }: TabsetCloseButtonProps): 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 tabIndex={index === visualSelected ? 0 : -1}\n type=\"button\"\n >\n {children ?? <CloseIcon />}\n </button>\n );\n};\n\nexport { RenameEditor, TabsetCloseButton, TabsetRenameInput };\nexport type { TabsetCloseButtonProps, TabsetRenameInputProps };\n","\"use client\";\n\nimport type { ComponentProps, CSSProperties, KeyboardEvent, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\n\nimport { mergeRefs } from \"../../lib/merge-refs\";\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 = ({ style, ...props }: TabsetTabStripProps): ReactNode => (\n <div {...props} data-dashfoo=\"tabstrip\" style={{ ...stripStyle, ...style }} />\n);\n\ntype TabsetTablistProps = ComponentProps<\"div\">;\n\nconst TabsetTablist = ({\n onKeyDown,\n ref: userRef,\n style,\n ...props\n}: TabsetTablistProps): ReactNode => {\n const node = useTabset((state) => state.node);\n const registerTablist = useTabset((state) => state.registerTablist);\n const selectTab = useTabset((state) => state.selectTab);\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 const targets: Record<string, number> = {\n ArrowLeft: (node.selected - 1 + count) % count,\n ArrowRight: (node.selected + 1) % count,\n End: count - 1,\n Home: 0,\n };\n const next = targets[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 return (\n <div\n aria-label={node.name ?? \"Tabs\"}\n {...props}\n aria-orientation=\"horizontal\"\n data-dashfoo=\"tablist\"\n onKeyDown={handleKeyDown}\n ref={refCallback}\n role=\"tablist\"\n style={{ ...tablistStyle, ...style }}\n tabIndex={-1}\n />\n );\n};\n\nexport { TabsetTablist, TabsetTabStrip };\nexport type { TabsetTablistProps, TabsetTabStripProps };\n","\"use client\";\n\nimport type { ComponentProps, CSSProperties, MouseEvent, ReactNode } from \"react\";\nimport { 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 { useTabsetDraggable } from \"../drag-adapter\";\nimport { useHasFloatLayer } from \"../float-context\";\nimport { FloatIcon, GripIcon, MaximizeIcon } from \"../tabset-icons\";\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 = ({ style, ...props }: TabsetToolbarProps): ReactNode => (\n <div {...props} data-dashfoo=\"tabset-toolbar\" style={{ ...toolbarStyle, ...style }} />\n);\n\ntype TabsetGripProps = ComponentProps<\"button\">;\n\nconst TabsetGrip = ({ children, ref: userRef, ...props }: TabsetGripProps): ReactNode => {\n const activeTabName = useTabset((state) => state.activeTab?.name ?? \"\");\n const isMaximized = useTabset((state) => state.isMaximized);\n const node = useTabset((state) => state.node);\n const draggableTabsets = useLayout((state) => state.draggableTabsets);\n const hidden = !draggableTabsets || isMaximized;\n const { ref } = useTabsetDraggable(node.id, hidden, activeTabName);\n const refCallback = useMemo(() => mergeRefs<HTMLButtonElement>(ref, userRef), [ref, userRef]);\n\n if (hidden) {\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\ntype TabsetMaximizeButtonProps = ComponentProps<\"button\">;\n\nconst TabsetMaximizeButton = ({\n children,\n onClick,\n ...props\n}: TabsetMaximizeButtonProps): ReactNode => {\n const isMaximized = useTabset((state) => state.isMaximized);\n const showMaximize = useTabset((state) => state.showMaximize);\n const toggleMaximize = useTabset((state) => state.toggleMaximize);\n\n if (!showMaximize) {\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 type=\"button\"\n >\n {children ?? <MaximizeIcon maximized={isMaximized} />}\n </button>\n );\n};\n\ntype TabsetFloatButtonProps = ComponentProps<\"button\">;\n\nconst TabsetFloatButton = ({ children, onClick, ...props }: TabsetFloatButtonProps): ReactNode => {\n const floatable = useLayout((state) => state.floatable);\n const dispatch = useLayout((state) => state.dispatch);\n const isMaximized = useTabset((state) => state.isMaximized);\n const node = useTabset((state) => state.node);\n const hasFloatLayer = useHasFloatLayer();\n\n if (!floatable || isMaximized) {\n return null;\n }\n\n if (!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 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 type=\"button\"\n >\n {children ?? <FloatIcon />}\n </button>\n );\n};\n\nexport { TabsetFloatButton, TabsetGrip, TabsetMaximizeButton, TabsetToolbar };\nexport type {\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\";\nimport { TabsetRoot } from \"./tabset-root\";\nimport { useTabset } from \"./tabset-store\";\nimport { TabsetTab, TabsetTrigger } from \"./tabset-tab\";\nimport { TabsetCloseButton, TabsetRenameInput } from \"./tabset-tab-controls\";\nimport { TabsetTablist, TabsetTabStrip } from \"./tabset-tablist\";\nimport {\n TabsetFloatButton,\n TabsetGrip,\n TabsetMaximizeButton,\n TabsetToolbar,\n} from \"./tabset-toolbar\";\n\nconst tabsetContent = <TabsetContent />;\n\nconst DefaultTabsetLayout = (): ReactNode => {\n const draggableTabsets = useLayout((state) => state.draggableTabsets);\n const floatable = useLayout((state) => state.floatable);\n const renderTabsetToolbar = useLayout((state) => state.renderTabsetToolbar);\n const tabLocation = useLayout((state) => state.tabLocation);\n const tabStripEnabled = useLayout((state) => state.tabStripEnabled);\n const isMaximized = useTabset((state) => state.isMaximized);\n const node = useTabset((state) => state.node);\n const overflowCount = useTabset((state) => state.overflowItems.length);\n const showMaximize = useTabset((state) => state.showMaximize);\n\n const showToolbar =\n showMaximize ||\n renderTabsetToolbar !== undefined ||\n overflowCount > 0 ||\n (floatable && !isMaximized) ||\n (draggableTabsets && !isMaximized);\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 { snapEnabled, snapSizes } from \"@dashfoo/core\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { Fragment, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n GroupImperativeHandle,\n Layout,\n LayoutChangedMeta,\n Orientation,\n} from \"react-resizable-panels\";\nimport { Group, Panel, Separator } from \"react-resizable-panels\";\n\nimport { useLayout } from \"../hooks/layout-store\";\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 };\nconst WEIGHT_EPSILON = 0.01;\n\ntype LayoutChild = RowNode[\"children\"][number];\n\nconst layoutFromWeights = (children: RowNode[\"children\"], total: number): Layout =>\n children.reduce<Layout>((layout, child) => {\n layout[child.id] = ((child.weight ?? 1) / total) * 100;\n return layout;\n }, {});\n\nconst orderedFromLayout = (layout: Layout, children: RowNode[\"children\"]): Array<number> =>\n children.map((child) => layout[child.id] ?? 0);\n\nconst layoutFromOrdered = (sizes: Array<number>, children: RowNode[\"children\"]): 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\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 const snapActive = snapEnabled(effectiveSnap);\n const orientation: Orientation = node.orientation === \"row\" ? \"horizontal\" : \"vertical\";\n const total = node.children.reduce((sum, child) => sum + (child.weight ?? 1), 0);\n const desiredLayout = useMemo(\n () => layoutFromWeights(node.children, total),\n [node.children, total],\n );\n\n const groupRef = useRef<GroupImperativeHandle | null>(null);\n const groupElement = useRef<HTMLDivElement | null>(null);\n const syncing = useRef(false);\n\n const activeBoundary = useRef<number | null>(null);\n const snapping = useRef(false);\n const snappedBoundaryRef = useRef<number | null>(null);\n const [snappedBoundary, setSnappedBoundary] = useState<number | null>(null);\n\n const setHighlight = (boundary: number | null): void => {\n if (boundary !== snappedBoundaryRef.current) {\n snappedBoundaryRef.current = boundary;\n setSnappedBoundary(boundary);\n }\n };\n\n const setSnapTransition = (active: boolean): void => {\n const element = groupElement.current;\n if (!element) {\n return;\n }\n if (active) {\n element.dataset.dashfooSnapping = \"true\";\n } else {\n delete element.dataset.dashfooSnapping;\n }\n };\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 syncing.current = true;\n group.setLayout(desiredLayout);\n const frame = requestAnimationFrame(() => {\n syncing.current = false;\n });\n return () => {\n cancelAnimationFrame(frame);\n syncing.current = false;\n };\n }, [desiredLayout]);\n\n const handleLayoutChange = (layout: Layout): void => {\n if (snapping.current || syncing.current || !resizableSplits) {\n return;\n }\n if (effectiveSnap === null || !snapActive) {\n return;\n }\n const boundary = activeBoundary.current;\n if (boundary === null) {\n return;\n }\n\n const { sizes, snapped } = snapSizes(\n orderedFromLayout(layout, node.children),\n boundary,\n effectiveSnap,\n );\n setHighlight(snapped ? boundary : null);\n if (!snapped) {\n setSnapTransition(false);\n return;\n }\n\n setSnapTransition(true);\n const group = groupRef.current;\n const target = layoutFromOrdered(sizes, node.children);\n if (!group || layoutsMatch(layout, target)) {\n return;\n }\n snapping.current = true;\n group.setLayout(target);\n snapping.current = false;\n };\n\n const handleLayoutChanged = (layout: Layout, meta: LayoutChangedMeta): void => {\n if (!meta.isUserInteraction) {\n return;\n }\n if (syncing.current) {\n return;\n }\n const boundary = activeBoundary.current;\n activeBoundary.current = null;\n setHighlight(null);\n setSnapTransition(false);\n\n if (!resizableSplits) {\n return;\n }\n let weights = node.children.map((child) => layout[child.id] ?? child.weight ?? 1);\n\n if (boundary !== null && effectiveSnap !== null && snapActive) {\n weights = snapSizes(weights, boundary, effectiveSnap).sizes;\n }\n const weightsChanged = weights.some(\n (weight, index) => Math.abs(weight - (node.children[index]?.weight ?? 1)) > WEIGHT_EPSILON,\n );\n\n if (!weightsChanged) {\n return;\n }\n\n dispatch({\n rowId: node.id,\n type: \"adjustSplit\",\n weights,\n });\n };\n\n return (\n <Group\n data-dashfoo=\"row\"\n disabled={!resizableSplits}\n elementRef={groupElement}\n groupRef={groupRef}\n key={node.id}\n onLayoutChange={snapActive ? handleLayoutChange : undefined}\n onLayoutChanged={handleLayoutChanged}\n orientation={orientation}\n style={groupStyle}\n >\n {node.children.map((child, index) => {\n const percent = ((child.weight ?? 1) / 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 activeBoundary.current = 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, Dashfoo, FloatNode, Geometry, GlobalAttributes } from \"@dashfoo/core\";\nimport type { CSSProperties, PointerEvent as ReactPointerEvent, ReactNode } from \"react\";\nimport { useRef, useState } from \"react\";\n\nimport { useLayout } from \"../hooks/layout-store\";\nimport { useInlineRename } from \"../hooks/use-inline-rename\";\nimport type { ResizeEdges, Size } from \"../lib/float-geometry\";\nimport { clampToBounds, resizeRect } from \"../lib/float-geometry\";\n\nimport { DragProvider } from \"./drag-adapter\";\nimport { EDGE_BY_KEY, RESIZE_HANDLES } from \"./float-resize-handles\";\nimport { LayoutRoot } from \"./layout-root\";\nimport { RowView } from \"./row-view\";\nimport { DockIcon, FloatIcon, GripIcon, MinimizeIcon } from \"./tabset-icons\";\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 CHIP_SIZE: Size = { height: 34, width: 168 };\n\nconst TAP_SLOP = 4;\n\ntype Gesture = {\n bounds: Size;\n edges: ResizeEdges | null;\n pointerId: number;\n start: Geometry;\n startX: number;\n startY: number;\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 global: GlobalAttributes;\n node: FloatNode;\n onFocus: () => void;\n zIndex: number;\n};\n\nconst FloatPanel = ({ global, node, onFocus, zIndex }: FloatPanelProps): ReactNode => {\n const dispatch = useLayout((state) => state.dispatch);\n const closableTabs = useLayout((state) => state.closableTabs);\n const draggableTabs = useLayout((state) => state.draggableTabs);\n const editable = useLayout((state) => state.editable);\n const renamableTabs = useLayout((state) => state.renamableTabs);\n const resizableSplits = useLayout((state) => state.resizableSplits);\n const keepMounted = useLayout((state) => state.keepMounted);\n const renderTab = useLayout((state) => state.renderTab);\n const renderTabLabel = useLayout((state) => state.renderTabLabel);\n const renderTabsetToolbar = useLayout((state) => state.renderTabsetToolbar);\n const snap = useLayout((state) => state.snap);\n\n const panelRef = useRef<HTMLElement | null>(null);\n const gestureRef = useRef<Gesture | null>(null);\n const latestRef = useRef<Geometry>(node.geometry);\n const movedRef = useRef(false);\n const setPanel = (element: HTMLElement | null): void => {\n panelRef.current = element;\n };\n\n const restore = (): void => {\n if (!editable) {\n return;\n }\n dispatch({ floatId: node.id, minimized: false, type: \"setFloatMinimized\" });\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 movedRef.current = false;\n const edgeKey = event.currentTarget.dataset.edge;\n\n const parent = panel.offsetParent instanceof HTMLElement ? panel.offsetParent : null;\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 pointerId: event.pointerId,\n start: node.geometry,\n startX: event.clientX,\n startY: event.clientY,\n };\n gestureRef.current = gesture;\n latestRef.current = node.geometry;\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 (!movedRef.current) {\n if (node.minimized === true) {\n restore();\n }\n return;\n }\n dispatch({ floatId: node.id, geometry: latestRef.current, type: \"moveFloat\" });\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 (!movedRef.current) {\n if (Math.hypot(dx, dy) <= TAP_SLOP) {\n return;\n }\n movedRef.current = 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 node.minimized === true ? CHIP_SIZE : undefined,\n );\n\n latestRef.current = next;\n panel.style.left = `${next.left}px`;\n panel.style.top = `${next.top}px`;\n\n if (node.minimized !== true) {\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 (!movedRef.current) {\n return;\n }\n panel.style.left = `${gesture.start.left}px`;\n panel.style.top = `${gesture.start.top}px`;\n if (node.minimized !== true) {\n panel.style.width = `${gesture.start.width}px`;\n panel.style.height = `${gesture.start.height}px`;\n }\n };\n\n if (node.minimized === true) {\n return (\n <button\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 onPointerCancel={handlePointerCancel}\n onPointerDown={handlePointerDown}\n onPointerDownCapture={onFocus}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n ref={setPanel}\n style={{\n left: node.geometry.left,\n pointerEvents: \"auto\",\n position: \"absolute\",\n top: node.geometry.top,\n zIndex,\n }}\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 const floatModel: Dashfoo = { global, layout: node.layout, version: 1 };\n\n return (\n <div\n data-dashfoo=\"float\"\n onPointerCancel={handlePointerCancel}\n onPointerDownCapture={onFocus}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n ref={setPanel}\n style={{\n height: node.geometry.height,\n left: node.geometry.left,\n\n pointerEvents: \"auto\",\n position: \"absolute\",\n top: node.geometry.top,\n width: node.geometry.width,\n zIndex,\n }}\n >\n <div\n data-dashfoo=\"float-titlebar\"\n onPointerDown={handlePointerDown}\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 <LayoutRoot\n closableTabs={closableTabs}\n dispatch={dispatch}\n draggableTabs={draggableTabs}\n draggableTabsets={false}\n editable={editable}\n floatable={false}\n keepMounted={keepMounted}\n maximizable={false}\n model={floatModel}\n renamableTabs={renamableTabs}\n renderTab={renderTab}\n renderTabLabel={renderTabLabel}\n renderTabsetToolbar={renderTabsetToolbar}\n resizableSplits={resizableSplits}\n snap={snap ?? undefined}\n >\n <DragProvider>\n <RowView node={node.layout} />\n </DragProvider>\n </LayoutRoot>\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={handlePointerDown}\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 = ({\n floats,\n global,\n}: {\n floats: Array<FloatNode>;\n global: GlobalAttributes;\n}): 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 global={global}\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 global: GlobalAttributes;\n};\n\nconst FloatLayer = ({ children, floats, global }: FloatLayerProps): ReactNode => (\n <FloatLayerContext.Provider value>\n {children}\n <FloatOverlay floats={floats} global={global} />\n </FloatLayerContext.Provider>\n);\n\nexport { FloatLayer };\nexport type { FloatLayerProps };\n","\"use client\";\n\nimport { DragProvider } from \"./drag-adapter\";\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-adapter\";\nexport type { FloatLayerProps as LayoutFloatLayerProps } from \"./float-layer\";\nexport type { 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, stackModel } from \"@dashfoo/core\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport { forwardRef, useCallback, useContext, useImperativeHandle, useMemo } 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\";\n\nimport { DashfooDragProvider } from \"./drag-root\";\nimport { Layout } from \"./layout\";\n\nconst DEFAULT_PERSIST_DEBOUNCE_MS = 300;\n\ntype PersistInput = string | { debounceMs?: number; key: string; storage?: StorageAdapter };\n\nconst resolvePersist = (\n persist: PersistInput | undefined,\n hasDefaultModel: boolean,\n): PersistConfig | null => {\n if (persist === undefined || !hasDefaultModel) {\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 DashfooLayoutProps = {\n closableTabs?: boolean;\n components?: Record<string, TabComponent>;\n defaultModel?: Dashfoo;\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 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 persist?: PersistInput;\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\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 () => resolvePersist(persist, defaultModel !== undefined),\n [persist, defaultModel],\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 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\n const [containerRef, width] = useContainerWidth();\n const isCompact = responsive !== undefined && width <= responsive.maxWidth;\n const view = useMemo(\n () => (isCompact ? stackModel(store.model, responsive?.orientation) : store.model),\n [isCompact, responsive?.orientation, store.model],\n );\n\n const storeDispatch = store.dispatch;\n const dispatch = useCallback(\n (action: Action): void => {\n if (isCompact && action.type === \"adjustSplit\") {\n return;\n }\n storeDispatch(action);\n },\n [isCompact, storeDispatch],\n );\n\n const maximized =\n view.maximizedTabsetId === undefined ? undefined : findTabset(view, view.maximizedTabsetId);\n\n const tree = (\n <Layout.FloatLayer floats={store.model.floats ?? []} global={store.model.global}>\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={dispatch}\n draggableTabs={isCompact ? false : draggableTabs}\n draggableTabsets={isCompact ? false : draggableTabsets}\n editable={editable}\n floatable={isCompact ? false : floatable}\n keepMounted={keepMounted}\n maximizable={maximizable}\n model={view}\n renamableTabs={renamableTabs}\n renderTab={renderTab}\n renderTabLabel={renderTabLabel}\n renderTabsetToolbar={renderTabsetToolbar}\n resizableSplits={isCompact ? false : resizableSplits}\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, DashfooLayoutProps, TabComponent };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\n\ntype PanelRootProps = ComponentProps<\"div\">;\ntype PanelHeaderProps = ComponentProps<\"div\">;\ntype PanelBodyProps = ComponentProps<\"div\">;\ntype PanelTitleProps = ComponentProps<\"span\">;\ntype PanelIconProps = ComponentProps<\"span\">;\ntype PanelBadgeProps = ComponentProps<\"span\">;\n\nconst PanelRoot = (props: PanelRootProps): ReactNode => <div {...props} data-dashfoo=\"panel\" />;\nconst PanelHeader = (props: PanelHeaderProps): ReactNode => (\n <div {...props} data-dashfoo=\"panel-header\" />\n);\nconst PanelBody = (props: PanelBodyProps): ReactNode => (\n <div {...props} data-dashfoo=\"panel-body\" />\n);\nconst PanelTitle = (props: PanelTitleProps): ReactNode => (\n <span {...props} data-dashfoo=\"panel-title\" />\n);\nconst PanelIcon = (props: PanelIconProps): ReactNode => (\n <span {...props} data-dashfoo=\"panel-icon\" />\n);\nconst PanelBadge = (props: PanelBadgeProps): ReactNode => (\n <span {...props} data-dashfoo=\"panel-badge\" />\n);\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 {\n PanelBadgeProps,\n PanelBodyProps,\n PanelHeaderProps,\n PanelIconProps,\n PanelRootProps,\n PanelTitleProps,\n};\n","\"use client\";\n\nimport { TabsetContent } from \"./tabset-content\";\nimport { TabsetOverflowMenu } from \"./tabset-overflow\";\nimport { TabsetRoot } from \"./tabset-root\";\nimport { TabsetTab, TabsetTrigger } from \"./tabset-tab\";\nimport { TabsetCloseButton, TabsetRenameInput } from \"./tabset-tab-controls\";\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-tab-controls\";\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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"}