@dashfoo/react 0.6.4 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/index.d.ts +57 -39
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1099 -976
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
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.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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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Panel"],"sources":["../src/lib/topmost-collision.ts","../src/hooks/drag-hooks.tsx","../src/hooks/persistence.ts","../src/hooks/responsive.ts","../src/lib/warn-once.ts","../src/hooks/store.ts","../src/lib/drag-subject.ts","../src/lib/tab-insertion.ts","../src/components/drag-preview-overlay.tsx","../src/components/dashfoo-drag-provider.tsx","../src/hooks/layout-store.ts","../src/components/drag-provider.tsx","../src/components/float-context.ts","../src/components/float-resize-handles.ts","../src/lib/float-geometry.ts","../src/hooks/use-float-gesture.ts","../src/hooks/use-inline-rename.ts","../src/components/close-icon.tsx","../src/components/layout-root.tsx","../src/hooks/use-snap-resize.ts","../src/lib/tab-ids.ts","../src/components/tabset/tabset-store.ts","../src/components/tabset/tabset-content.tsx","../src/components/tab-overflow-menu.tsx","../src/components/tabset/tabset-overflow-menu.tsx","../src/lib/merge-refs.ts","../src/components/tabset/tabset-rename-input.tsx","../src/hooks/use-tab-overflow.ts","../src/lib/tab-selection.ts","../src/components/tabset/tabset-root.tsx","../src/components/tabset/tabset-tab.tsx","../src/components/tabset/tabset-tablist.tsx","../src/components/tabset/tabset-toolbar.tsx","../src/components/tabset/tabset-view.tsx","../src/components/row-view.tsx","../src/components/float-panel.tsx","../src/components/float-layer.tsx","../src/components/layout.tsx","../src/components/dashfoo-layout.tsx","../src/components/panel.tsx","../src/components/tabset/tabset.ts"],"sourcesContent":["import type { Collision, CollisionDetector, UniqueIdentifier } from \"@dnd-kit/abstract\";\nimport { CollisionPriority, CollisionType } from \"@dnd-kit/abstract\";\n\ntype TopmostDetectorInput = {\n dragOperation: { position: { current: { x: number; y: number } } };\n droppable: { element?: Element; id: UniqueIdentifier };\n};\n\ntype TopmostDetector = (input: TopmostDetectorInput) => Collision | null;\n\nconst createTopmostPointerIntersection = (\n topElementAt: (x: number, y: number) => Element | null = (x, y) =>\n document.elementFromPoint(x, y),\n): TopmostDetector => {\n let cached: { top: Element | null; x: number; y: number } | null = null;\n const topAt = (x: number, y: number): Element | null => {\n if (cached && cached.x === x && cached.y === y) {\n return cached.top;\n }\n const top = topElementAt(x, y);\n cached = { top, x, y };\n queueMicrotask(() => {\n cached = null;\n });\n return top;\n };\n\n return ({ dragOperation, droppable }) => {\n const { element } = droppable;\n if (!element) {\n return null;\n }\n const point = dragOperation.position.current;\n const top = topAt(point.x, point.y);\n if (!top || !element.contains(top)) {\n return null;\n }\n\n let depth = 0;\n for (let node: Element | null = element; node; node = node.parentElement) {\n depth += 1;\n }\n return {\n id: droppable.id,\n priority: CollisionPriority.High,\n type: CollisionType.PointerIntersection,\n value: depth,\n };\n };\n};\n\nconst topmostPointerIntersection: CollisionDetector = createTopmostPointerIntersection();\n\nexport { createTopmostPointerIntersection, topmostPointerIntersection };\nexport type { TopmostDetectorInput };\n","\"use client\";\n\nimport type {\n Action,\n dragDockMachine,\n DragSubject,\n DropIntent,\n Point,\n TabNode,\n} from \"@dashfoo/core\";\nimport {\n Accessibility,\n Draggable,\n DragDropManager,\n Droppable,\n Feedback,\n PointerSensor,\n} from \"@dnd-kit/dom\";\nimport { useSelector } from \"@xstate/react\";\nimport type { Context } from \"react\";\nimport { createContext, useCallback, useContext, useEffect, useId, useMemo, useRef } from \"react\";\nimport type { ActorRefFrom } from \"xstate\";\n\nimport { 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 DragActor = ActorRefFrom<typeof dragDockMachine>;\n\n/**\n * One per rendered layer (the main tree, then one per float); the manager and\n * actor are shared above them. `layerId` namespaces droppable registrations, so\n * two layers can hold a tabset with the same model id.\n */\ntype DragScope = {\n commit: (action: Action) => void;\n layerId: string;\n resolveIntent: (\n targetId: string,\n element: HTMLElement,\n point: Point,\n draggedId?: string,\n ) => DropIntent | null;\n};\n\ntype DragRootContextValue = {\n actorRef: DragActor;\n manager: DragDropManager;\n registerScope: (scope: DragScope) => () => void;\n};\n\nconst DragRootContext: Context<DragRootContextValue | null> =\n createContext<DragRootContextValue | null>(null);\n\ntype DragContextValue = {\n actorRef: DragActor;\n layerId: string;\n manager: DragDropManager;\n};\n\nconst DragContext = createContext<DragContextValue | null>(null);\n\nconst SharedDragManagerContext: Context<DragDropManager | null> =\n createContext<DragDropManager | null>(null);\n\n/** The intent is rebuilt every pointer move, so readers compare by value. */\nconst sameDropIntent = (a: DropIntent | null, b: DropIntent | null): boolean =>\n a === b ||\n (a !== null &&\n b !== null &&\n a.index === b.index &&\n a.location === b.location &&\n a.targetId === b.targetId);\n\ntype DraggableHandle = {\n draggableRef: { current: 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\n/**\n * Reads the root's actor, so it works from an overlay mounted beside the layout\n * rather than inside a drag layer. Outside a provider it reports the empty state\n * instead of throwing.\n */\nconst useDragSubject = (): DragSubject | null => {\n const actorRef = useContext(DragRootContext)?.actorRef;\n return useSelector(actorRef, (snapshot) => {\n const drag = snapshot?.context.drag;\n return drag?.kind === \"dragging\" ? drag.subject : null;\n });\n};\n\nconst useDropIntent = (): DropIntent | null => {\n const actorRef = useContext(DragRootContext)?.actorRef;\n return useSelector(\n actorRef,\n (snapshot) => {\n const drag = snapshot?.context.drag;\n return drag?.kind === \"dragging\" ? (drag.drop?.intent ?? null) : null;\n },\n sameDropIntent,\n );\n};\n\nexport type {\n DragActor,\n DragContextValue,\n DragRootContextValue,\n DragScope,\n ExternalTabSourceOptions,\n};\nexport {\n createDragManager,\n DragContext,\n DragRootContext,\n sameDropIntent,\n SharedDragManagerContext,\n useDragSubject,\n useDropIntent,\n useExternalTabSource,\n useTabDraggable,\n useTabsetDraggable,\n useTabsetDroppable,\n};\n","\"use client\";\n\nimport type { Dashfoo } from \"@dashfoo/core\";\nimport { fromJSON, toJSON } from \"@dashfoo/core\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\ntype StorageAdapter = {\n getItem: (key: string) => string | null;\n removeItem: (key: string) => void;\n setItem: (key: string, value: string) => void;\n};\n\nconst memoryStorageAdapter = (): StorageAdapter => {\n const store = new Map<string, string>();\n return {\n getItem: (key) => store.get(key) ?? null,\n removeItem: (key) => {\n store.delete(key);\n },\n setItem: (key, value) => {\n store.set(key, value);\n },\n };\n};\n\nconst localStorageAdapter: StorageAdapter = {\n getItem: (key) => {\n if (typeof window === \"undefined\") {\n return null;\n }\n try {\n return window.localStorage.getItem(key);\n } catch {\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\ntype StoredLoad =\n | { error: unknown; kind: \"corrupt\" }\n | { kind: \"absent\" }\n | { kind: \"loaded\"; model: Dashfoo };\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 // Read and parsed once; the effect below acts on the outcome.\n const [load] = useState<StoredLoad>(() => {\n if (config === null) {\n return { kind: \"absent\" };\n }\n const raw = config.storage.getItem(config.key);\n if (raw === null) {\n return { kind: \"absent\" };\n }\n try {\n return { kind: \"loaded\", model: fromJSON(raw) };\n } catch (error) {\n return { error, kind: \"corrupt\" };\n }\n });\n\n const initialModel =\n load.kind === \"loaded\" && defaultModel !== undefined ? load.model : defaultModel;\n\n useEffect(() => {\n const current = configRef.current;\n if (current === null || load.kind !== \"corrupt\") {\n return;\n }\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] discarding unreadable persisted layout\", load.error);\n current.storage.removeItem(current.key);\n }, [load]);\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","const warned = new Set<string>();\n\nconst warnOnce = (key: string, message: string): void => {\n if (warned.has(key)) {\n return;\n }\n warned.add(key);\n // oxlint-disable-next-line no-console\n console.warn(`[dashfoo] ${message}`);\n};\n\nexport { warnOnce };\n","\"use client\";\n\nimport type { Action, Dashfoo } from \"@dashfoo/core\";\nimport { canRedo, canUndo, dashfooMachine, normalize, reducer } from \"@dashfoo/core\";\nimport { useActorRef, useSelector } from \"@xstate/react\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nimport { warnOnce } from \"../lib/warn-once\";\n\nconst CONTROLLED_HISTORY_MESSAGE =\n \"undo/redo are unavailable while `model` is controlled; keep the history in the state you own and drive it through onModelChange\";\n\nconst CONTROLLED_SET_MODEL_MESSAGE =\n \"setModel (and resetLayout) do nothing while `model` is controlled; set the model you own instead\";\n\nconst CONTROLLED_MODE_SWITCH_MESSAGE =\n \"`model` was added or removed after mount; a layout is controlled or uncontrolled for its whole life, so the first render wins. Remount (key=…) to switch\";\n\nconst CONTROLLED_WITH_DEFAULT_MESSAGE =\n \"`model` and `defaultModel` were both passed; `model` wins and `defaultModel` (and `persist`) are ignored\";\n\ntype DashfooStore = {\n canRedo: () => boolean;\n canUndo: () => boolean;\n dispatch: (action: Action) => void;\n model: Dashfoo;\n redo: () => void;\n setModel: (model: Dashfoo) => void;\n undo: () => void;\n};\n\ntype UseDashfooStoreOptions = {\n defaultModel?: Dashfoo;\n model?: Dashfoo;\n onAction?: (action: Action) => Action | null;\n onActiveTabsetChange?: (tabsetId: string | undefined) => void;\n onMaximizedTabsetChange?: (tabsetId: string | undefined) => void;\n onModelChange?: (model: Dashfoo, action?: Action) => void;\n};\n\n/** The mode is latched on the first render; running both sources leaves the\n * unread one describing a document nobody rendered. */\nconst useDashfooStore = (options: UseDashfooStoreOptions): DashfooStore => {\n const {\n defaultModel,\n model: controlledModel,\n onAction,\n onActiveTabsetChange,\n onMaximizedTabsetChange,\n onModelChange,\n } = options;\n const initialModel = controlledModel ?? defaultModel;\n if (initialModel === undefined) {\n throw new Error(\"useDashfooStore requires either a `model` or a `defaultModel`.\");\n }\n\n const [controlled] = useState(() => controlledModel !== undefined);\n if (controlled !== (controlledModel !== undefined)) {\n warnOnce(\"controlled-mode-switch\", CONTROLLED_MODE_SWITCH_MESSAGE);\n }\n if (controlled && defaultModel !== undefined) {\n warnOnce(\"controlled-with-default\", CONTROLLED_WITH_DEFAULT_MESSAGE);\n }\n\n const actorRef = useActorRef(dashfooMachine, { input: { model: normalize(initialModel) } });\n const history = useSelector(actorRef, (snapshot) => snapshot.context.history);\n\n const model = useMemo(\n () => (controlledModel === undefined ? history.present : normalize(controlledModel)),\n [controlledModel, history.present],\n );\n\n const notify = useCallback(\n (before: Dashfoo, after: Dashfoo, action?: Action) => {\n if (Object.is(before, after)) {\n return;\n }\n onModelChange?.(after, action);\n if (after.activeTabsetId !== before.activeTabsetId) {\n onActiveTabsetChange?.(after.activeTabsetId);\n }\n if (after.maximizedTabsetId !== before.maximizedTabsetId) {\n onMaximizedTabsetChange?.(after.maximizedTabsetId);\n }\n },\n [onModelChange, onActiveTabsetChange, onMaximizedTabsetChange],\n );\n\n const dispatch = useCallback(\n (action: Action) => {\n const resolved = onAction ? onAction(action) : action;\n if (!resolved) {\n return;\n }\n\n if (controlled) {\n notify(model, reducer(model, resolved), resolved);\n return;\n }\n\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ action: resolved, type: \"DISPATCH\" });\n notify(before, actorRef.getSnapshot().context.history.present, resolved);\n },\n [actorRef, controlled, model, notify, onAction],\n );\n\n const undo = useCallback(() => {\n if (controlled) {\n warnOnce(\"controlled-undo\", CONTROLLED_HISTORY_MESSAGE);\n return;\n }\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ type: \"UNDO\" });\n notify(before, actorRef.getSnapshot().context.history.present);\n }, [actorRef, controlled, notify]);\n\n const redo = useCallback(() => {\n if (controlled) {\n warnOnce(\"controlled-redo\", CONTROLLED_HISTORY_MESSAGE);\n return;\n }\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ type: \"REDO\" });\n notify(before, actorRef.getSnapshot().context.history.present);\n }, [actorRef, controlled, notify]);\n\n const setModel = useCallback(\n (next: Dashfoo) => {\n if (controlled) {\n warnOnce(\"controlled-set-model\", CONTROLLED_SET_MODEL_MESSAGE);\n return;\n }\n actorRef.send({ model: normalize(next), type: \"SET_MODEL\" });\n },\n [actorRef, controlled],\n );\n\n return useMemo(\n () => ({\n canRedo: () => !controlled && canRedo(actorRef.getSnapshot().context.history),\n canUndo: () => !controlled && canUndo(actorRef.getSnapshot().context.history),\n dispatch,\n model,\n redo,\n setModel,\n undo,\n }),\n [actorRef, controlled, dispatch, model, redo, setModel, undo],\n );\n};\n\nexport { useDashfooStore };\nexport type { DashfooStore, UseDashfooStoreOptions };\n","import type { DragSubject } from \"@dashfoo/core\";\nimport { tabNodeSchema } from \"@dashfoo/core\";\n\nconst isTabFactory = (value: unknown): value is () => unknown => typeof value === \"function\";\n\n/** Beside the manager wiring, not the layer adapter: `dragstart` fires once per\n * gesture on the shared manager, above any one layer. */\nconst subjectFor = (source: {\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\nexport { subjectFor };\n","import type { Point, Rect } from \"@dashfoo/core\";\n\ntype Zone = { height: number; width: number; x: number; y: number };\n\nconst pointInRect = (point: Point, rect: Rect): boolean =>\n point.x >= rect.x &&\n point.x <= rect.x + rect.width &&\n point.y >= rect.y &&\n point.y <= rect.y + rect.height;\n\nconst insertionIndex = (rects: ReadonlyArray<Rect>, pointerX: number): number => {\n const found = rects.findIndex((rect) => pointerX < rect.x + rect.width / 2);\n return found === -1 ? rects.length : found;\n};\n\nconst INSERTION_LINE_WIDTH = 4;\n\nconst insertionLineRect = (\n stripRect: Rect,\n itemRects: ReadonlyArray<Rect>,\n index: number,\n): Zone => {\n const at = itemRects[index];\n const last = itemRects.at(-1);\n const x = at?.x ?? (last ? last.x + last.width : stripRect.x);\n const left = x - INSERTION_LINE_WIDTH / 2;\n return {\n height: stripRect.height,\n width: INSERTION_LINE_WIDTH,\n x: Math.max(stripRect.x, Math.min(left, stripRect.x + stripRect.width - INSERTION_LINE_WIDTH)),\n y: stripRect.y,\n };\n};\n\nconst shouldAllowDrop = (\n draggedId: string | undefined,\n targetId: string,\n tabIds: ReadonlyArray<string>,\n): boolean => {\n if (draggedId === `grip-${targetId}`) {\n return false;\n }\n if (tabIds.length === 1 && tabIds[0] === draggedId) {\n return false;\n }\n return true;\n};\n\nexport { insertionIndex, insertionLineRect, pointInRect, shouldAllowDrop };\nexport type { Zone };\n","\"use client\";\n\nimport type { Point } from \"@dashfoo/core\";\nimport { zoneRect } from \"@dashfoo/core\";\nimport 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\";\n\nimport type { DragActor } from \"../hooks/drag-hooks\";\nimport type { Zone } from \"../lib/tab-insertion\";\nimport { insertionLineRect } from \"../lib/tab-insertion\";\n\nconst overlayBase: CSSProperties = {\n boxSizing: \"border-box\",\n pointerEvents: \"none\",\n position: \"fixed\",\n\n transition: \"var(--dashfoo-dock-transition, left 60ms, top 60ms, width 60ms, height 60ms)\",\n zIndex: 9999,\n};\n\nconst paneStyle = (zone: Zone): CSSProperties => ({\n ...overlayBase,\n background: \"var(--dashfoo-dock-fill, oklch(0.556 0 0 / 0.18))\",\n border:\n \"var(--dashfoo-dock-border-width, 1px) solid var(--dashfoo-dock-border, oklch(0.708 0 0 / 0.75))\",\n borderRadius: \"var(--dashfoo-dock-radius, 6px)\",\n height: zone.height,\n left: zone.x,\n top: zone.y,\n width: zone.width,\n});\n\nconst lineStyle = (zone: Zone): CSSProperties => ({\n ...paneStyle(zone),\n borderRadius: \"var(--dashfoo-dock-line-radius, 2px)\",\n});\n\nconst tabItemRects = (strip: Element, excludeId?: string): Array<DOMRect> =>\n [...strip.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab-item\"]')].flatMap((item) =>\n item.querySelector<HTMLElement>('[data-dashfoo=\"tab\"]')?.dataset.tabId === excludeId\n ? []\n : [item.getBoundingClientRect()],\n );\n\nconst DockIndicator = ({\n actorRef,\n getTabsetElement,\n}: {\n actorRef: DragActor;\n getTabsetElement: (id: string) => HTMLElement | undefined;\n}): ReactNode => {\n const drag = useSelector(actorRef, (snapshot) => snapshot.context.drag);\n if (drag.kind !== \"dragging\" || drag.drop === null) {\n return null;\n }\n const { intent } = drag.drop;\n const draggedId = drag.subject.id;\n const element = getTabsetElement(intent.targetId);\n if (!element) {\n return null;\n }\n\n const zIndex = element.closest('[data-dashfoo=\"float\"]') ? overlayBase.zIndex : \"auto\";\n if (intent.location === \"center\") {\n const strip = element.querySelector('[data-dashfoo=\"tabstrip\"]');\n if (strip) {\n const line = insertionLineRect(\n strip.getBoundingClientRect(),\n tabItemRects(strip, draggedId),\n intent.index ?? 0,\n );\n return <div data-dashfoo=\"dock-indicator\" style={{ ...lineStyle(line), zIndex }} />;\n }\n }\n const zone = zoneRect(element.getBoundingClientRect(), intent.location);\n return <div data-dashfoo=\"dock-indicator\" style={{ ...paneStyle(zone), zIndex }} />;\n};\n\nconst PREVIEW_OFFSET: Point = { x: 12, y: 8 };\n\nconst labelOf = (source: { 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 { dragDockMachine } from \"@dashfoo/core\";\nimport type { DragEndEvent, DragStartEvent } from \"@dnd-kit/dom\";\nimport { useActorRef } from \"@xstate/react\";\nimport type { ReactNode } from \"react\";\nimport { useCallback, useEffect, useInsertionEffect, useMemo, useState } from \"react\";\n\nimport type { DragRootContextValue, DragScope } from \"../hooks/drag-hooks\";\nimport { createDragManager, DragRootContext, SharedDragManagerContext } from \"../hooks/drag-hooks\";\nimport { subjectFor } from \"../lib/drag-subject\";\n\nimport { DragPreviewOverlay } from \"./drag-preview-overlay\";\n\ntype ScopedTarget = { element: HTMLElement; scope: DragScope; tabsetId: string };\n\nconst DashfooDragProvider = ({ children }: { children: ReactNode }): ReactNode => {\n const [manager] = useState(createDragManager);\n useInsertionEffect(\n () => () => {\n manager.destroy();\n },\n [manager],\n );\n\n const actorRef = useActorRef(dragDockMachine);\n\n const [scopes] = useState(() => new Map<string, DragScope>());\n const registerScope = useCallback(\n (scope: DragScope): (() => void) => {\n scopes.set(scope.layerId, scope);\n return () => {\n scopes.delete(scope.layerId);\n };\n },\n [scopes],\n );\n\n // One listener set and one actor for the whole tree: per layer, a float that\n // did not own the target resolved a null intent and swallowed the drop.\n useEffect(() => {\n const scopedTarget = (): ScopedTarget | null => {\n const target = manager.dragOperation.target;\n const data = target?.data as { layerId?: string; tabsetId?: string } | undefined;\n const scope = data?.layerId === undefined ? undefined : scopes.get(data.layerId);\n const element = target?.element;\n if (!scope || data?.tabsetId === undefined || !(element instanceof HTMLElement)) {\n return null;\n }\n return { element, scope, tabsetId: data.tabsetId };\n };\n\n const syncIntent = (): void => {\n const operation = manager.dragOperation;\n const found = scopedTarget();\n const draggedId = operation.source ? String(operation.source.id) : undefined;\n const intent =\n found === null\n ? null\n : found.scope.resolveIntent(\n found.tabsetId,\n found.element,\n operation.position.current,\n draggedId,\n );\n actorRef.send({\n drop: intent === null || found === null ? null : { intent, scope: found.scope.layerId },\n type: \"OVER\",\n });\n };\n\n const handleStart = (event: DragStartEvent): void => {\n const source = event.operation.source;\n if (!source) {\n return;\n }\n const subject = subjectFor(source);\n if (!subject) {\n manager.actions.stop({ canceled: true });\n return;\n }\n actorRef.send({ subject, type: \"START\" });\n };\n\n // `dragmove` and `collision` both fire per frame and each resolve measures\n // the target strip. The drop path stays synchronous: a deferred resolve\n // would land after the actor had already been asked to commit.\n let frame: number | null = null;\n const scheduleResolve = (): void => {\n if (frame !== null) {\n return;\n }\n frame = requestAnimationFrame(() => {\n frame = null;\n syncIntent();\n });\n };\n const cancelPendingResolve = (): void => {\n if (frame !== null) {\n cancelAnimationFrame(frame);\n frame = null;\n }\n };\n\n const handleEnd = (event: DragEndEvent): void => {\n cancelPendingResolve();\n if (event.canceled) {\n actorRef.send({ type: \"CANCEL\" });\n return;\n }\n syncIntent();\n actorRef.send({ type: \"DROP\" });\n };\n\n const commitSubscription = actorRef.on(\"COMMIT\", (emitted) => {\n scopes.get(emitted.scope)?.commit(emitted.action);\n });\n const offStart = manager.monitor.addEventListener(\"dragstart\", handleStart);\n const offMove = manager.monitor.addEventListener(\"dragmove\", scheduleResolve);\n const offCollision = manager.monitor.addEventListener(\"collision\", scheduleResolve);\n const offEnd = manager.monitor.addEventListener(\"dragend\", handleEnd);\n return () => {\n cancelPendingResolve();\n commitSubscription.unsubscribe();\n offStart();\n offMove();\n offCollision();\n offEnd();\n };\n }, [actorRef, manager, scopes]);\n\n const rootValue = useMemo<DragRootContextValue>(\n () => ({ actorRef, manager, registerScope }),\n [actorRef, manager, registerScope],\n );\n\n return (\n <SharedDragManagerContext.Provider value={manager}>\n <DragRootContext.Provider value={rootValue}>\n {children}\n <DragPreviewOverlay manager={manager} />\n </DragRootContext.Provider>\n </SharedDragManagerContext.Provider>\n );\n};\n\nexport { DashfooDragProvider };\n","\"use client\";\n\nimport type { Action, SnapConfig, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport type { ReactNode } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { createStore, useStore } from \"zustand\";\n\ntype LayoutState = {\n closableTabs: boolean;\n dispatch: (action: Action) => void;\n draggableTabs: boolean;\n draggableTabsets: boolean;\n editable: boolean;\n\n floatable: boolean;\n keepMounted: boolean;\n maximizable: boolean;\n maximizedTabsetId: string | undefined;\n renamableTabs: boolean;\n renderTab: (tab: TabNode) => ReactNode;\n renderTabLabel: ((tab: TabNode) => ReactNode) | undefined;\n renderTabsetToolbar: ((tabset: TabsetNode) => ReactNode) | undefined;\n resizableSplits: boolean;\n\n snap: SnapConfig | null;\n splitDock: boolean;\n tabLocation: \"bottom\" | \"top\";\n tabsetMinSize: number;\n tabStripEnabled: boolean;\n};\n\ntype LayoutStore = StoreApi<LayoutState>;\n\nconst createLayoutStore = (initial: LayoutState): LayoutStore =>\n createStore<LayoutState>(() => initial);\n\nconst LayoutStoreContext = createContext<LayoutStore | null>(null);\n\nconst useLayout = <T>(selector: (state: LayoutState) => T): T => {\n const store = useContext(LayoutStoreContext);\n if (store === null) {\n throw new Error(\"dashfoo components must be rendered inside <DashfooLayout> or <Layout.Root>.\");\n }\n return useStore(store, selector);\n};\n\nexport { createLayoutStore, LayoutStoreContext, useLayout };\nexport type { LayoutState, LayoutStore };\n","\"use client\";\n\nimport type { Action, DropIntent, Point } from \"@dashfoo/core\";\nimport { resolveDockTarget, splitEdge } from \"@dashfoo/core\";\nimport type { ReactNode } from \"react\";\nimport { useCallback, useContext, useEffect, useId, useMemo, useState } from \"react\";\n\nimport type { DragContextValue, DragScope } from \"../hooks/drag-hooks\";\nimport { DragContext, DragRootContext } from \"../hooks/drag-hooks\";\nimport { LayoutStoreContext } from \"../hooks/layout-store\";\nimport { insertionIndex, pointInRect, shouldAllowDrop } from \"../lib/tab-insertion\";\nimport { warnOnce } from \"../lib/warn-once\";\n\nimport { DashfooDragProvider } from \"./dashfoo-drag-provider\";\nimport { DockIndicator } from \"./drag-preview-overlay\";\n\nconst MISSING_ROOT =\n \"[dashfoo] DashfooDragProvider unmounted while its layout is still mounted; keep the provider above the layout or remount the layout\";\n\ntype StripMeasurement = { rect: DOMRect; tabIds: Array<string>; tabRects: Array<DOMRect> };\n\n/** One DOM pass per pointer move, where resolving a drop used to run three. */\nconst measureStrip = (element: HTMLElement, excludeId?: string): StripMeasurement | null => {\n const strip = element.querySelector('[data-dashfoo=\"tabstrip\"]');\n if (!strip) {\n return null;\n }\n const tabIds: Array<string> = [];\n const tabRects: Array<DOMRect> = [];\n for (const tab of strip.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')) {\n const tabId = tab.dataset.tabId ?? \"\";\n tabIds.push(tabId);\n if (tabId !== excludeId) {\n tabRects.push(tab.getBoundingClientRect());\n }\n }\n return { rect: strip.getBoundingClientRect(), tabIds, tabRects };\n};\n\nconst intentForTabset = (\n id: string,\n element: HTMLElement,\n point: Point,\n strip: StripMeasurement | null,\n): DropIntent => {\n if (strip && pointInRect(point, strip.rect)) {\n return {\n index: insertionIndex(strip.tabRects, point.x),\n location: \"center\",\n targetId: id,\n };\n }\n const location = resolveDockTarget(point, element.getBoundingClientRect());\n if (location === \"center\" && strip) {\n return { index: strip.tabRects.length, location, targetId: id };\n }\n return { location, targetId: id };\n};\n\ntype DragProviderProps = {\n children: ReactNode;\n\n onCommit?: (action: Action) => void;\n\n splitDock?: boolean;\n};\n\n/** One drag layer (the main tree, or one float). Holds no drag state of its own. */\nconst DragScope = ({ children, onCommit, splitDock }: DragProviderProps): ReactNode => {\n const root = useContext(DragRootContext);\n const layoutStore = useContext(LayoutStoreContext);\n const layerId = useId();\n\n const manager = root?.manager;\n const getTabsetElement = useCallback(\n (id: string): HTMLElement | undefined => {\n const element = manager?.registry.droppables.get(`${layerId}:${id}`)?.element;\n return element instanceof HTMLElement ? element : undefined;\n },\n [layerId, manager],\n );\n\n const scope = useMemo<DragScope>(\n () => ({\n commit: (action) => {\n if (layoutStore?.getState().editable === false) {\n return;\n }\n const commit = onCommit ?? layoutStore?.getState().dispatch;\n if (!commit) {\n warnOnce(\n \"drag-layer-no-commit\",\n \"Layout.DragLayer has neither an onCommit prop nor a <Layout.Root> above it; drops are ignored\",\n );\n return;\n }\n commit(action);\n },\n layerId,\n resolveIntent: (targetId, element, point, draggedId) => {\n if (layoutStore?.getState().editable === false) {\n return null;\n }\n const strip = measureStrip(element, draggedId);\n if (!shouldAllowDrop(draggedId, targetId, strip?.tabIds ?? [])) {\n return null;\n }\n const intent = intentForTabset(targetId, element, point, strip);\n\n const splitDockResolved = splitDock ?? layoutStore?.getState().splitDock ?? true;\n if (!splitDockResolved && splitEdge(intent.location) !== undefined) {\n return { location: \"center\", targetId };\n }\n return intent;\n },\n }),\n [layerId, layoutStore, onCommit, splitDock],\n );\n\n const registerScope = root?.registerScope;\n useEffect(() => registerScope?.(scope), [registerScope, scope]);\n\n const contextValue = useMemo<DragContextValue | null>(\n () => (root === null ? null : { actorRef: root.actorRef, layerId, manager: root.manager }),\n [layerId, root],\n );\n\n if (contextValue === null) {\n throw new Error(MISSING_ROOT);\n }\n\n return (\n <DragContext.Provider value={contextValue}>\n {children}\n <DockIndicator actorRef={contextValue.actorRef} getTabsetElement={getTabsetElement} />\n </DragContext.Provider>\n );\n};\n\n/**\n * Mounts its own root when there is none above it. Decided on the first render:\n * a root that disappears later means a torn-down tree, which `DragScope` reports.\n */\nconst DragProvider = (props: DragProviderProps): ReactNode => {\n const hasRoot = useContext(DragRootContext) !== null;\n const [ownsRoot] = useState(() => !hasRoot);\n const layer = <DragScope {...props} />;\n\n return ownsRoot ? <DashfooDragProvider>{layer}</DashfooDragProvider> : layer;\n};\n\nexport {\n useDragSubject,\n useTabDraggable,\n useTabsetDraggable,\n useTabsetDroppable,\n} from \"../hooks/drag-hooks\";\nexport { DragProvider };\nexport type { DragProviderProps };\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\n\nconst FloatLayerContext = createContext(false);\n\nconst useHasFloatLayer = (): boolean => useContext(FloatLayerContext);\n\nexport { FloatLayerContext, useHasFloatLayer };\n","import type { CSSProperties } from \"react\";\n\nimport type { ResizeEdges } from \"../lib/float-geometry\";\n\nconst EDGE_THICKNESS = 12;\nconst EDGE_OFFSET = -(EDGE_THICKNESS / 2);\n\nconst CORNER_SIZE = 20;\nconst CORNER_OFFSET = -8;\n\nconst EDGE_INSET = CORNER_SIZE + CORNER_OFFSET;\n\nconst RESIZE_HANDLES: ReadonlyArray<{ edges: ResizeEdges; key: string; style: CSSProperties }> = [\n {\n edges: { x: 0, y: -1 },\n key: \"n\",\n style: {\n cursor: \"ns-resize\",\n height: EDGE_THICKNESS,\n insetInline: EDGE_INSET,\n top: EDGE_OFFSET,\n },\n },\n {\n edges: { x: 0, y: 1 },\n key: \"s\",\n style: {\n bottom: EDGE_OFFSET,\n cursor: \"ns-resize\",\n height: EDGE_THICKNESS,\n insetInline: EDGE_INSET,\n },\n },\n {\n edges: { x: 1, y: 0 },\n key: \"e\",\n style: {\n cursor: \"ew-resize\",\n insetBlock: EDGE_INSET,\n right: EDGE_OFFSET,\n width: EDGE_THICKNESS,\n },\n },\n {\n edges: { x: -1, y: 0 },\n key: \"w\",\n style: {\n cursor: \"ew-resize\",\n insetBlock: EDGE_INSET,\n left: EDGE_OFFSET,\n width: EDGE_THICKNESS,\n },\n },\n {\n edges: { x: 1, y: -1 },\n key: \"ne\",\n style: {\n cursor: \"nesw-resize\",\n height: CORNER_SIZE,\n right: CORNER_OFFSET,\n top: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n {\n edges: { x: -1, y: -1 },\n key: \"nw\",\n style: {\n cursor: \"nwse-resize\",\n height: CORNER_SIZE,\n left: CORNER_OFFSET,\n top: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n {\n edges: { x: 1, y: 1 },\n key: \"se\",\n style: {\n bottom: CORNER_OFFSET,\n cursor: \"nwse-resize\",\n height: CORNER_SIZE,\n right: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n {\n edges: { x: -1, y: 1 },\n key: \"sw\",\n style: {\n bottom: CORNER_OFFSET,\n cursor: \"nesw-resize\",\n height: CORNER_SIZE,\n left: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n];\n\nconst EDGE_BY_KEY = new Map<string, ResizeEdges>(RESIZE_HANDLES.map((h) => [h.key, h.edges]));\n\nexport { EDGE_BY_KEY, RESIZE_HANDLES };\n","\"use client\";\n\nimport type { Geometry } from \"@dashfoo/core\";\n\nconst MIN_WIDTH = 200;\nconst MIN_HEIGHT = 120;\n\nconst DEFAULT_WIDTH = 480;\nconst DEFAULT_HEIGHT = 340;\n\nconst LIFT_OFFSET = 16;\n\ntype Size = { height: number; width: number };\n\nconst clampToBounds = (rect: Geometry, bounds: Size, size: Size = rect): Geometry => ({\n height: rect.height,\n left: Math.max(0, Math.min(rect.left, Math.max(0, bounds.width - size.width))),\n top: Math.max(0, Math.min(rect.top, Math.max(0, bounds.height - size.height))),\n width: rect.width,\n});\n\nconst measureFloatRect = (element: Element): Geometry => {\n const tabsetElement = element.closest('[data-dashfoo=\"tabset\"]') ?? element;\n const rect = tabsetElement.getBoundingClientRect();\n const seeded: Geometry = {\n height: Math.max(MIN_HEIGHT, Math.min(Math.round(rect.height), DEFAULT_HEIGHT)),\n left: Math.round(rect.left) + LIFT_OFFSET,\n top: Math.round(rect.top) + LIFT_OFFSET,\n width: Math.max(MIN_WIDTH, Math.min(Math.round(rect.width), DEFAULT_WIDTH)),\n };\n return clampToBounds(seeded, { height: window.innerHeight, width: window.innerWidth });\n};\n\ntype ResizeEdges = { x: -1 | 0 | 1; y: -1 | 0 | 1 };\n\nconst resizeRect = (start: Geometry, edges: ResizeEdges, dx: number, dy: number): Geometry => {\n let { height, left, top, width } = start;\n if (edges.x === 1) {\n width = Math.max(MIN_WIDTH, start.width + dx);\n } else if (edges.x === -1) {\n width = Math.max(MIN_WIDTH, start.width - dx);\n left = Math.max(0, start.left + (start.width - width));\n }\n if (edges.y === 1) {\n height = Math.max(MIN_HEIGHT, start.height + dy);\n } else if (edges.y === -1) {\n height = Math.max(MIN_HEIGHT, start.height - dy);\n top = Math.max(0, start.top + (start.height - height));\n }\n return { height, left, top, width };\n};\n\nexport { clampToBounds, measureFloatRect, resizeRect };\nexport type { ResizeEdges, Size };\n","\"use client\";\n\nimport type { Geometry } from \"@dashfoo/core\";\nimport type { CSSProperties, PointerEvent as ReactPointerEvent } from \"react\";\nimport { useRef } from \"react\";\n\nimport { EDGE_BY_KEY } from \"../components/float-resize-handles\";\nimport type { ResizeEdges, Size } from \"../lib/float-geometry\";\nimport { clampToBounds, resizeRect } from \"../lib/float-geometry\";\n\nconst CHIP_SIZE: Size = { height: 34, width: 168 };\n\nconst TAP_SLOP = 4;\n\n/** `moved` and `latest` live here because they only mean anything mid-gesture. */\ntype Gesture = {\n bounds: Size;\n edges: ResizeEdges | null;\n latest: Geometry;\n moved: boolean;\n pointerId: number;\n start: Geometry;\n startX: number;\n startY: number;\n};\n\ntype FloatGestureOptions = {\n editable: boolean;\n geometry: Geometry;\n minimized: boolean;\n onCommit: (geometry: Geometry) => void;\n onTap: () => void;\n};\n\ntype FloatGestureHandlers = {\n onPointerCancel: (event: ReactPointerEvent) => void;\n onPointerDown: (event: ReactPointerEvent<HTMLElement>) => void;\n onPointerMove: (event: ReactPointerEvent) => void;\n onPointerUp: (event: ReactPointerEvent) => void;\n};\n\ntype FloatGesture = {\n handlers: FloatGestureHandlers;\n ref: (element: HTMLElement | null) => void;\n style: CSSProperties;\n};\n\n/** Writes inline style and dispatches only on pointer-up: routing every move\n * through the model would re-render the whole tree behind the float. */\nconst useFloatGesture = ({\n editable,\n geometry,\n minimized,\n onCommit,\n onTap,\n}: FloatGestureOptions): FloatGesture => {\n const panelRef = useRef<HTMLElement | null>(null);\n const gestureRef = useRef<Gesture | null>(null);\n\n const setPanel = (element: HTMLElement | null): void => {\n panelRef.current = element;\n };\n\n const handlePointerDown = (event: ReactPointerEvent<HTMLElement>): void => {\n const panel = panelRef.current;\n\n if (!panel || !editable) {\n return;\n }\n\n const prior = gestureRef.current;\n if (prior && panel.hasPointerCapture?.(prior.pointerId)) {\n panel.releasePointerCapture(prior.pointerId);\n }\n const edgeKey = event.currentTarget.dataset.edge;\n\n const parent = panel.offsetParent instanceof HTMLElement ? panel.offsetParent : null;\n const gesture: Gesture = {\n bounds: { height: parent?.clientHeight ?? 0, width: parent?.clientWidth ?? 0 },\n edges: edgeKey === undefined ? null : (EDGE_BY_KEY.get(edgeKey) ?? null),\n latest: geometry,\n moved: false,\n pointerId: event.pointerId,\n start: geometry,\n startX: event.clientX,\n startY: event.clientY,\n };\n gestureRef.current = gesture;\n\n if (gesture.edges) {\n panel.setPointerCapture(event.pointerId);\n }\n };\n\n const handlePointerUp = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n if (!gesture || event.pointerId !== gesture.pointerId) {\n return;\n }\n gestureRef.current = null;\n\n const panel = panelRef.current;\n if (panel?.hasPointerCapture?.(event.pointerId) === true) {\n panel.releasePointerCapture(event.pointerId);\n }\n\n if (!gesture.moved) {\n onTap();\n return;\n }\n onCommit(gesture.latest);\n };\n\n const handlePointerMove = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n const panel = panelRef.current;\n if (!gesture || !panel || event.pointerId !== gesture.pointerId) {\n return;\n }\n\n if (event.buttons === 0) {\n handlePointerUp(event);\n return;\n }\n const dx = event.clientX - gesture.startX;\n const dy = event.clientY - gesture.startY;\n if (!gesture.moved) {\n if (Math.hypot(dx, dy) <= TAP_SLOP) {\n return;\n }\n gesture.moved = true;\n\n if (!gesture.edges) {\n panel.setPointerCapture(gesture.pointerId);\n }\n }\n const next = gesture.edges\n ? resizeRect(gesture.start, gesture.edges, dx, dy)\n : clampToBounds(\n { ...gesture.start, left: gesture.start.left + dx, top: gesture.start.top + dy },\n gesture.bounds,\n minimized ? CHIP_SIZE : undefined,\n );\n\n gesture.latest = next;\n panel.style.left = `${next.left}px`;\n panel.style.top = `${next.top}px`;\n\n if (!minimized) {\n panel.style.width = `${next.width}px`;\n panel.style.height = `${next.height}px`;\n }\n };\n\n const handlePointerCancel = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n const panel = panelRef.current;\n if (!gesture || !panel || event.pointerId !== gesture.pointerId) {\n return;\n }\n gestureRef.current = null;\n if (panel.hasPointerCapture?.(event.pointerId)) {\n panel.releasePointerCapture(event.pointerId);\n }\n if (!gesture.moved) {\n return;\n }\n panel.style.left = `${gesture.start.left}px`;\n panel.style.top = `${gesture.start.top}px`;\n if (!minimized) {\n panel.style.width = `${gesture.start.width}px`;\n panel.style.height = `${gesture.start.height}px`;\n }\n };\n\n return {\n handlers: {\n onPointerCancel: handlePointerCancel,\n onPointerDown: handlePointerDown,\n onPointerMove: handlePointerMove,\n onPointerUp: handlePointerUp,\n },\n ref: setPanel,\n style: minimized\n ? { left: geometry.left, top: geometry.top }\n : {\n height: geometry.height,\n left: geometry.left,\n top: geometry.top,\n width: geometry.width,\n },\n };\n};\n\nexport { useFloatGesture };\nexport type { FloatGesture, FloatGestureOptions };\n","\"use client\";\n\nimport type { FocusEvent, KeyboardEvent, RefObject } from \"react\";\nimport { useEffect, useRef } from \"react\";\n\ntype InlineRenameOptions = {\n currentName: string;\n inputRef: RefObject<HTMLInputElement | null>;\n onCommit: (name: string) => void;\n onDone: () => void;\n};\n\ntype InlineRename = {\n handleBlur: (event: FocusEvent<HTMLInputElement>) => void;\n handleKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;\n};\n\nconst useInlineRename = ({\n currentName,\n inputRef,\n onCommit,\n onDone,\n}: InlineRenameOptions): InlineRename => {\n const done = useRef(false);\n\n useEffect(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, [inputRef]);\n\n const commit = (value: string): void => {\n const trimmed = value.trim();\n if (trimmed && trimmed !== currentName) {\n onCommit(trimmed);\n }\n onDone();\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>): void => {\n if (event.key === \"Enter\") {\n done.current = true;\n commit(event.currentTarget.value);\n } else if (event.key === \"Escape\") {\n done.current = true;\n onDone();\n }\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>): void => {\n if (done.current) {\n return;\n }\n done.current = true;\n commit(event.currentTarget.value);\n };\n\n return { handleBlur, handleKeyDown };\n};\n\nexport { useInlineRename };\n","import type { CSSProperties, ReactNode } from \"react\";\n\nconst iconStyle: CSSProperties = { pointerEvents: \"none\" };\n\nconst Icon = ({ children }: { children: ReactNode }): ReactNode => (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"12\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n style={iconStyle}\n viewBox=\"0 0 24 24\"\n width=\"12\"\n >\n {children}\n </svg>\n);\n\nconst CloseIcon = (): ReactNode => (\n <Icon>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </Icon>\n);\n\nconst GripIcon = (): ReactNode => (\n <Icon>\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"19\" cy=\"5\" r=\"1\" />\n <circle cx=\"5\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n <circle cx=\"19\" cy=\"19\" r=\"1\" />\n <circle cx=\"5\" cy=\"19\" r=\"1\" />\n </Icon>\n);\n\nconst MaximizeIcon = ({ maximized }: { maximized: boolean }): ReactNode =>\n maximized ? (\n <Icon>\n <path d=\"m14 10 7-7\" />\n <path d=\"M20 10h-6V4\" />\n <path d=\"m3 21 7-7\" />\n <path d=\"M4 14h6v6\" />\n </Icon>\n ) : (\n <Icon>\n <path d=\"M15 3h6v6\" />\n <path d=\"m21 3-7 7\" />\n <path d=\"m3 21 7-7\" />\n <path d=\"M9 21H3v-6\" />\n </Icon>\n );\n\nconst FloatIcon = (): ReactNode => (\n <Icon>\n <rect height=\"14\" rx=\"2\" width=\"18\" x=\"3\" y=\"6\" />\n <path d=\"M3 10h18\" />\n </Icon>\n);\n\nconst MinimizeIcon = (): ReactNode => (\n <Icon>\n <path d=\"M5 12h14\" />\n </Icon>\n);\n\nconst DockIcon = (): ReactNode => (\n <Icon>\n <path d=\"M3 7V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-2\" />\n <path d=\"M11 8 7 12l4 4\" />\n <path d=\"M7 12h10\" />\n </Icon>\n);\n\nexport { CloseIcon, DockIcon, FloatIcon, GripIcon, MaximizeIcon, MinimizeIcon };\n","\"use client\";\n\nimport type { Action, Dashfoo, SnapConfig, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport type { ComponentProps, CSSProperties, ReactNode, Ref } from \"react\";\nimport { useLayoutEffect, useState } from \"react\";\n\nimport type { LayoutState } from \"../hooks/layout-store\";\nimport { createLayoutStore, LayoutStoreContext, useLayout } from \"../hooks/layout-store\";\n\nconst DEFAULT_TABSET_MIN_SIZE = 320;\n\nconst rootStyle = { display: \"flex\", height: \"100%\", position: \"relative\", width: \"100%\" } as const;\n\ntype LayoutRootProps = Omit<ComponentProps<\"div\">, \"children\"> & {\n children: ReactNode;\n closableTabs?: boolean;\n dispatch: (action: Action) => void;\n draggableTabs?: boolean;\n draggableTabsets?: boolean;\n\n editable?: boolean;\n\n floatable?: boolean;\n keepMounted?: boolean;\n maximizable?: boolean;\n model: Dashfoo;\n renamableTabs?: boolean;\n renderTab: (tab: TabNode) => ReactNode;\n renderTabLabel?: (tab: TabNode) => ReactNode;\n renderTabsetToolbar?: (tabset: TabsetNode) => ReactNode;\n resizableSplits?: boolean;\n\n /** When false, the tree itself is frozen: no dragging, splitting or floating. Tabs stay closable and renamable. */\n restructurable?: boolean;\n\n rootRef?: Ref<HTMLDivElement>;\n\n snap?: SnapConfig;\n};\n\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 restructurable = 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 && restructurable && draggableTabs && global.tabEnableDrag !== false,\n draggableTabsets: editable && restructurable && draggableTabsets,\n editable,\n floatable: editable && restructurable && 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:\n editable && restructurable && 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\ntype LayoutOverridesProps = {\n children: ReactNode;\n overrides: Partial<LayoutState>;\n};\n\n/**\n * Republishes the parent store with overrides applied rather than re-deriving\n * flags, so anything the parent changes keeps flowing into the subtree.\n */\nconst LayoutOverrides = ({ children, overrides }: LayoutOverridesProps): ReactNode => {\n const parentState = useLayout((state) => state);\n const snapshot: LayoutState = { ...parentState, ...overrides };\n\n const [store] = useState(() => createLayoutStore(snapshot));\n\n useLayoutEffect(() => {\n store.setState(snapshot);\n });\n\n return (\n <LayoutStoreContext.Provider value={store}>\n <div data-dashfoo=\"layout\" style={rootStyle}>\n {children}\n </div>\n </LayoutStoreContext.Provider>\n );\n};\n\nexport { LayoutOverrides, LayoutRoot };\nexport type { LayoutOverridesProps, LayoutRootProps };\n","\"use client\";\n\nimport type { RowNode, SnapGrid } from \"@dashfoo/core\";\nimport { decideSnap, settleSnap } from \"@dashfoo/core\";\nimport type { RefObject } from \"react\";\nimport { useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type { GroupImperativeHandle, Layout, LayoutChangedMeta } from \"react-resizable-panels\";\n\nconst WEIGHT_EPSILON = 0.01;\n\ntype RowChildren = RowNode[\"children\"];\n\n/** `syncing` covers this hook's own writes: the group echoes an imperative\n * `setLayout` back synchronously, and that echo is not user input. */\ntype ResizeState =\n | { kind: \"idle\" }\n | { kind: \"syncing\" }\n | { boundary: number; kind: \"dragging\" }\n | { boundary: number; kind: \"snapped\" };\n\nconst IDLE: ResizeState = { kind: \"idle\" };\n\nconst boundaryOf = (state: ResizeState): number | null =>\n state.kind === \"dragging\" || state.kind === \"snapped\" ? state.boundary : null;\n\nconst snappedBoundaryOf = (state: ResizeState): number | null =>\n state.kind === \"snapped\" ? state.boundary : null;\n\nconst layoutFromWeights = (children: RowChildren): Layout => {\n const total = children.reduce((sum, child) => sum + child.weight, 0);\n return children.reduce<Layout>((layout, child) => {\n layout[child.id] = (child.weight / total) * 100;\n return layout;\n }, {});\n};\n\nconst orderedFromLayout = (layout: Layout, children: RowChildren): Array<number> =>\n children.map((child) => layout[child.id] ?? 0);\n\nconst layoutFromOrdered = (sizes: Array<number>, children: RowChildren): Layout =>\n children.reduce<Layout>((layout, child, index) => {\n layout[child.id] = sizes[index] ?? 0;\n return layout;\n }, {});\n\nconst layoutsMatch = (current: Layout, expected: Layout): boolean => {\n const currentIds = Object.keys(current);\n const expectedIds = Object.keys(expected);\n if (currentIds.length !== expectedIds.length) {\n return false;\n }\n return expectedIds.every(\n (id) => Math.abs((current[id] ?? Number.NaN) - expected[id]) <= WEIGHT_EPSILON,\n );\n};\n\ntype SnapResizeOptions = {\n children: RowChildren;\n onWeightsSettled: (weights: Array<number>) => void;\n resizableSplits: boolean;\n snap: SnapGrid;\n};\n\ntype SnapResize = {\n beginBoundaryDrag: (boundary: number) => void;\n groupRef: RefObject<GroupImperativeHandle | null>;\n onLayoutChange: (layout: Layout) => void;\n onLayoutChanged: (layout: Layout, meta: LayoutChangedMeta) => void;\n snappedBoundary: number | null;\n};\n\nconst useSnapResize = ({\n children,\n onWeightsSettled,\n resizableSplits,\n snap,\n}: SnapResizeOptions): SnapResize => {\n const groupRef = useRef<GroupImperativeHandle | null>(null);\n const state = useRef<ResizeState>(IDLE);\n const [snappedBoundary, setSnappedBoundary] = useState<number | null>(null);\n\n const transition = useCallback((next: ResizeState): void => {\n state.current = next;\n setSnappedBoundary(snappedBoundaryOf(next));\n }, []);\n\n const desiredLayout = useMemo(() => layoutFromWeights(children), [children]);\n\n useLayoutEffect(() => {\n const group = groupRef.current;\n if (!group) {\n return undefined;\n }\n const current = group.getLayout();\n const samePanelSet =\n Object.keys(current).length === Object.keys(desiredLayout).length &&\n Object.keys(desiredLayout).every((id) => id in current);\n if (!samePanelSet || layoutsMatch(current, desiredLayout)) {\n return undefined;\n }\n\n transition({ kind: \"syncing\" });\n group.setLayout(desiredLayout);\n const frame = requestAnimationFrame(() => {\n transition(IDLE);\n });\n return () => {\n cancelAnimationFrame(frame);\n transition(IDLE);\n };\n }, [desiredLayout, transition]);\n\n const onLayoutChange = (layout: Layout): void => {\n if (state.current.kind === \"syncing\" || !resizableSplits) {\n return;\n }\n const boundary = boundaryOf(state.current);\n if (boundary === null) {\n return;\n }\n\n const decision = decideSnap(orderedFromLayout(layout, children), boundary, snap);\n if (decision.kind === \"inactive\") {\n return;\n }\n if (decision.kind === \"clear\") {\n transition({ boundary, kind: \"dragging\" });\n return;\n }\n\n transition({ boundary, kind: \"snapped\" });\n const group = groupRef.current;\n const target = layoutFromOrdered(decision.sizes, children);\n if (!group || layoutsMatch(layout, target)) {\n return;\n }\n transition({ kind: \"syncing\" });\n group.setLayout(target);\n transition({ boundary, kind: \"snapped\" });\n };\n\n const onLayoutChanged = (layout: Layout, meta: LayoutChangedMeta): void => {\n if (!meta.isUserInteraction) {\n return;\n }\n if (state.current.kind === \"syncing\") {\n return;\n }\n const boundary = boundaryOf(state.current);\n transition(IDLE);\n\n if (!resizableSplits) {\n return;\n }\n const weights = settleSnap(\n children.map((child) => layout[child.id] ?? child.weight),\n boundary,\n snap,\n );\n const weightsChanged = weights.some((weight, index) => {\n const child = children[index];\n return child !== undefined && Math.abs(weight - child.weight) > WEIGHT_EPSILON;\n });\n if (!weightsChanged) {\n return;\n }\n\n onWeightsSettled(weights);\n };\n\n const beginBoundaryDrag = (boundary: number): void => {\n transition({ boundary, kind: \"dragging\" });\n };\n\n return { beginBoundaryDrag, groupRef, onLayoutChange, onLayoutChanged, snappedBoundary };\n};\n\nexport { useSnapResize };\nexport type { SnapResize, SnapResizeOptions };\n","const tabDomId = (tabsetId: string, tabId: string): string => `dashfoo-tab-${tabsetId}-${tabId}`;\nconst panelDomId = (tabsetId: string): string => `dashfoo-panel-${tabsetId}`;\n\nexport { panelDomId, tabDomId };\n","\"use client\";\n\nimport type { Action, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport { createContext, useContext } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { createStore, useStore } from \"zustand\";\n\nimport { tabDomId } from \"../../lib/tab-ids\";\nimport { warnOnce } from \"../../lib/warn-once\";\nimport type { OverflowItem } from \"../tab-overflow-menu\";\n\ntype TabsetState = {\n activeTab: TabNode | undefined;\n cancelRename: () => void;\n closeTab: (tabId: string) => void;\n commitRename: (tabId: string, value: string) => void;\n dispatch: (action: Action) => void;\n editingTabId: string | null;\n isMaximized: boolean;\n node: TabsetNode;\n overflowItems: Array<OverflowItem>;\n /** The tab a `closeTab` is waiting on, so a vetoed close cannot restore focus. */\n pendingCloseTabId: string | null;\n registerRenameInput: () => () => void;\n registerTablist: (element: HTMLDivElement | null) => void;\n renameInputCount: number;\n renameTab: (tabId: string, name: string) => void;\n selectOverflowTab: (tabId: string) => void;\n selectTab: (index: number, options?: { focus?: boolean }) => void;\n showMaximize: boolean;\n startEditing: (tabId: string) => void;\n tablistElement: HTMLDivElement | null;\n tabsClosable: boolean;\n tabsRenamable: boolean;\n toggleMaximize: () => void;\n visualSelected: number;\n};\n\ntype TabsetStore = StoreApi<TabsetState>;\n\ntype TabsetSnapshot = Pick<\n TabsetState,\n | \"activeTab\"\n | \"dispatch\"\n | \"isMaximized\"\n | \"node\"\n | \"showMaximize\"\n | \"tabsClosable\"\n | \"tabsRenamable\"\n | \"visualSelected\"\n>;\n\nconst tabButtonIn = (\n scope: HTMLElement | null,\n tabsetId: string,\n tabId: string,\n): HTMLElement | null =>\n scope?.querySelector<HTMLElement>(`#${CSS.escape(tabDomId(tabsetId, tabId))}`) ?? null;\n\nconst createTabsetStore = (initial: TabsetSnapshot): TabsetStore =>\n createStore<TabsetState>((set, get) => ({\n ...initial,\n cancelRename: () => {\n set({ editingTabId: null });\n },\n closeTab: (tabId) => {\n set({ pendingCloseTabId: tabId });\n get().dispatch({ tabId, type: \"deleteTab\" });\n },\n commitRename: (tabId, value) => {\n set({ editingTabId: null });\n const { node, renameTab } = get();\n const trimmed = value.trim();\n const current = node.children.find((tab) => tab.id === tabId)?.name;\n if (trimmed && trimmed !== current) {\n renameTab(tabId, trimmed);\n }\n },\n editingTabId: null,\n overflowItems: [],\n pendingCloseTabId: null,\n registerRenameInput: () => {\n set((state) => ({ renameInputCount: state.renameInputCount + 1 }));\n return () => {\n set((state) => ({ renameInputCount: state.renameInputCount - 1 }));\n };\n },\n registerTablist: (element) => {\n if (element) {\n const current = get().tablistElement;\n if (current && current !== element) {\n warnOnce(\n `duplicate-tablist-${get().node.id}`,\n \"more than one <Tabset.Tablist> under the same <Tabset.Root>; the last one wins for keyboard focus and overflow\",\n );\n }\n set({ tablistElement: element });\n return;\n }\n set({ tablistElement: null });\n },\n renameInputCount: 0,\n renameTab: (tabId, name) => {\n get().dispatch({ name, tabId, type: \"renameTab\" });\n },\n selectOverflowTab: (tabId) => {\n const { dispatch, node, tablistElement } = get();\n const index = node.children.findIndex((tab) => tab.id === tabId);\n if (index === -1) {\n return;\n }\n dispatch({ index, tabsetId: node.id, type: \"selectTab\" });\n tabButtonIn(tablistElement, node.id, tabId)?.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n });\n },\n selectTab: (index, options) => {\n const { dispatch, node, tablistElement } = get();\n dispatch({ index, tabsetId: node.id, type: \"selectTab\" });\n if (options?.focus === true) {\n const tabId = node.children[index]?.id;\n if (tabId) {\n tabButtonIn(tablistElement, node.id, tabId)?.focus();\n }\n }\n },\n startEditing: (tabId) => {\n const { node, renameInputCount, tabsRenamable } = get();\n const tab = node.children.find((child) => child.id === tabId);\n if (!tabsRenamable || tab?.enableRename === false) {\n return;\n }\n if (renameInputCount === 0) {\n warnOnce(\n `missing-rename-input-${node.id}`,\n \"startEditing needs a <Tabset.RenameInput> in the composition; ignoring\",\n );\n return;\n }\n set({ editingTabId: tabId });\n },\n tablistElement: null,\n toggleMaximize: () => {\n const { dispatch, isMaximized, node } = get();\n dispatch({ tabsetId: isMaximized ? null : node.id, type: \"setMaximizedTabset\" });\n },\n }));\n\nconst TabsetStoreContext = createContext<TabsetStore | null>(null);\n\nconst useTabset = <T>(selector: (state: TabsetState) => T): T => {\n const store = useContext(TabsetStoreContext);\n if (store === null) {\n throw new Error(\"dashfoo Tabset parts must be rendered inside <Tabset.Root>.\");\n }\n return useStore(store, selector);\n};\n\ntype TabContextValue = { index: number; tab: TabNode };\n\nconst TabContext = createContext<TabContextValue | null>(null);\n\nconst useTab = (): TabContextValue => {\n const value = useContext(TabContext);\n if (value === null) {\n throw new Error(\"dashfoo tab parts must be rendered inside <Tabset.Tab>.\");\n }\n return value;\n};\n\nexport { createTabsetStore, TabContext, TabsetStoreContext, useTab, useTabset };\nexport type { TabContextValue, TabsetSnapshot, TabsetState, TabsetStore };\n","\"use client\";\n\nimport type { TabNode } from \"@dashfoo/core\";\nimport type { ComponentProps, CSSProperties, ReactNode } from \"react\";\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-menu\";\n\nimport { useTabset } from \"./tabset-store\";\n\nconst TabsetOverflowMenu = (): ReactNode => {\n const overflowItems = useTabset((state) => state.overflowItems);\n const selectOverflowTab = useTabset((state) => state.selectOverflowTab);\n\n if (overflowItems.length === 0) {\n return null;\n }\n return <TabOverflowMenu items={overflowItems} onSelect={selectOverflowTab} />;\n};\n\nexport { TabsetOverflowMenu };\n","import type { Ref } from \"react\";\n\nconst applyRef = <T>(ref: Ref<T> | undefined, value: T | null): void => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n};\n\nconst mergeRefs =\n <T>(...refs: Array<Ref<T> | undefined>) =>\n (value: T | null): void => {\n for (const ref of refs) {\n applyRef(ref, value);\n }\n };\n\nexport { mergeRefs };\n","\"use client\";\n\nimport type { ComponentProps, FocusEvent, KeyboardEvent, MouseEvent, ReactNode } from \"react\";\nimport { useEffect, useMemo, useRef } from \"react\";\n\nimport { useInlineRename } from \"../../hooks/use-inline-rename\";\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { CloseIcon } from \"../close-icon\";\n\nimport { useTab, useTabset } from \"./tabset-store\";\n\ntype TabsetRenameInputProps = ComponentProps<\"input\">;\n\nconst RenameEditor = ({\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 { useEffect, useState } from \"react\";\n\nconst overflowingIds = (tablist: Element): Array<string> => {\n const box = tablist.getBoundingClientRect();\n return [...tablist.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')].flatMap((tab) => {\n const rect = tab.getBoundingClientRect();\n const clipped = rect.right > box.right + 1 || rect.left < box.left - 1;\n const tabId = tab.dataset.tabId;\n return clipped && tabId !== undefined && tabId !== \"\" ? [tabId] : [];\n });\n};\n\nconst sameIds = (a: Array<string>, b: Array<string>): boolean =>\n a.length === b.length && a.every((id, index) => id === b[index]);\n\nconst useTabOverflow = (tablist: HTMLElement | null, signature: string): Array<string> => {\n const [overflow, setOverflow] = useState<Array<string>>([]);\n\n useEffect(() => {\n // Fires per frame while an overflowing strip scrolls, so an unchanged set\n // has to keep its array identity or the tabset re-renders throughout.\n const recompute = (): void => {\n setOverflow((previous) => {\n const next = tablist ? overflowingIds(tablist) : [];\n return sameIds(previous, next) ? previous : next;\n });\n };\n recompute();\n if (!tablist) {\n return undefined;\n }\n const observer = new ResizeObserver(recompute);\n observer.observe(tablist);\n\n tablist.addEventListener(\"scroll\", recompute, { passive: true });\n return () => {\n observer.disconnect();\n tablist.removeEventListener(\"scroll\", recompute);\n };\n }, [tablist, signature]);\n\n return overflow;\n};\n\nexport { overflowingIds, useTabOverflow };\n","const fallbackSelectedIndex = (count: number, removedIndex: number): number =>\n removedIndex + 1 < count ? removedIndex + 1 : removedIndex - 1;\n\nexport { fallbackSelectedIndex };\n","\"use client\";\n\nimport type { TabsetNode } from \"@dashfoo/core\";\nimport type { ComponentProps, CSSProperties, ReactNode } from \"react\";\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { useStore } from \"zustand\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { useTabOverflow } from \"../../hooks/use-tab-overflow\";\nimport { tabDomId } from \"../../lib/tab-ids\";\nimport { fallbackSelectedIndex } from \"../../lib/tab-selection\";\nimport { useDragSubject, useTabsetDroppable } from \"../drag-provider\";\n\nimport type { TabsetSnapshot } from \"./tabset-store\";\nimport { createTabsetStore, TabsetStoreContext } from \"./tabset-store\";\n\nconst tabsetStyle: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n minHeight: 0,\n minWidth: 0,\n width: \"100%\",\n};\n\ntype TabsetRootProps = ComponentProps<\"div\"> & { node: TabsetNode };\n\nconst TabsetRoot = ({\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 // Every dispatch rebuilds `node.children`, so this also runs for changes\n // unrelated to a close; the pending id is what keeps a vetoed one from firing.\n useEffect(() => {\n const { pendingCloseTabId } = store.getState();\n if (pendingCloseTabId === null) {\n return;\n }\n store.setState({ pendingCloseTabId: null });\n if (node.children.some((tab) => tab.id === pendingCloseTabId)) {\n return;\n }\n const activeTabId = node.children[node.selected]?.id;\n if (activeTabId) {\n tabsetRef.current\n ?.querySelector<HTMLElement>(`#${CSS.escape(tabDomId(node.id, activeTabId))}`)\n ?.focus();\n } else {\n tabsetRef.current?.focus();\n }\n }, [node.children, node.selected, node.id, store]);\n\n return (\n <TabsetStoreContext.Provider value={store}>\n <div\n {...props}\n data-dashfoo=\"tabset\"\n data-dragging-source={isDragSource || undefined}\n data-tab-location={tabLocation}\n ref={(element) => {\n ref(element);\n tabsetRef.current = element;\n if (typeof userRef === \"function\") {\n userRef(element);\n } else if (userRef) {\n userRef.current = element;\n }\n }}\n style={{ ...tabsetStyle, ...style }}\n tabIndex={-1}\n >\n {children}\n </div>\n </TabsetStoreContext.Provider>\n );\n};\n\nexport { TabsetRoot };\nexport type { TabsetRootProps };\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-provider\";\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","\"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 const visualSelected = useTabset((state) => state.visualSelected);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n onKeyDown?.(event);\n if (event.defaultPrevented) {\n return;\n }\n\n if (!(event.target instanceof HTMLElement) || !event.target.closest('[role=\"tab\"]')) {\n return;\n }\n const count = node.children.length;\n if (count === 0) {\n return;\n }\n // The visual index, not the model's: focus (`tabindex=\"0\"`) sits at that one.\n const from = Math.max(visualSelected, 0);\n const targets: Record<string, number> = {\n ArrowLeft: (from - 1 + count) % count,\n ArrowRight: (from + 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 { FloatIcon, GripIcon, MaximizeIcon } from \"../close-icon\";\nimport { useTabsetDraggable } from \"../drag-provider\";\nimport { useHasFloatLayer } from \"../float-context\";\n\nimport { useTabset } from \"./tabset-store\";\n\nconst toolbarStyle: CSSProperties = {\n alignItems: \"center\",\n display: \"flex\",\n flexShrink: 0,\n marginInlineStart: \"auto\",\n};\n\ntype TabsetToolbarProps = ComponentProps<\"div\">;\n\nconst TabsetToolbar = ({ style, ...props }: TabsetToolbarProps): ReactNode => (\n <div {...props} data-dashfoo=\"tabset-toolbar\" style={{ ...toolbarStyle, ...style }} />\n);\n\ntype TabsetChrome = { float: boolean; grip: boolean; maximize: boolean; overflow: boolean };\n\n/**\n * One answer per control, shared by the controls and by the layout deciding\n * whether to render a toolbar at all, so the two cannot disagree.\n */\nconst useTabsetChrome = (): TabsetChrome => {\n const draggableTabsets = useLayout((state) => state.draggableTabsets);\n const floatable = useLayout((state) => state.floatable);\n const isMaximized = useTabset((state) => state.isMaximized);\n const overflowCount = useTabset((state) => state.overflowItems.length);\n const showMaximize = useTabset((state) => state.showMaximize);\n const hasFloatLayer = useHasFloatLayer();\n\n if (floatable && !isMaximized && !hasFloatLayer) {\n warnOnce(\n \"float-no-layer\",\n \"Tabset.FloatButton needs a <Layout.FloatLayer> around the layout (DashfooLayout adds one); the float control is hidden\",\n );\n }\n\n return {\n float: floatable && !isMaximized && hasFloatLayer,\n grip: draggableTabsets && !isMaximized,\n maximize: showMaximize,\n overflow: overflowCount > 0,\n };\n};\n\ntype TabsetGripProps = ComponentProps<\"button\">;\n\nconst TabsetGrip = ({ children, ref: userRef, ...props }: TabsetGripProps): ReactNode => {\n const activeTabName = useTabset((state) => state.activeTab?.name ?? \"\");\n const node = useTabset((state) => state.node);\n const { grip } = useTabsetChrome();\n const { ref } = useTabsetDraggable(node.id, !grip, activeTabName);\n const refCallback = useMemo(() => mergeRefs<HTMLButtonElement>(ref, userRef), [ref, userRef]);\n\n if (!grip) {\n return null;\n }\n\n return (\n <button\n aria-label=\"Move tabset\"\n title=\"Move tabset\"\n {...props}\n data-dashfoo=\"tabset-grip\"\n ref={refCallback}\n type=\"button\"\n >\n {children ?? <GripIcon />}\n </button>\n );\n};\n\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 toggleMaximize = useTabset((state) => state.toggleMaximize);\n const { maximize } = useTabsetChrome();\n\n if (!maximize) {\n return null;\n }\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n toggleMaximize();\n };\n\n return (\n <button\n aria-label={isMaximized ? \"Restore\" : \"Maximize\"}\n title={isMaximized ? \"Restore tabset\" : \"Maximize tabset\"}\n {...props}\n aria-pressed={isMaximized}\n data-dashfoo=\"tabset-maximize\"\n onClick={handleClick}\n 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 dispatch = useLayout((state) => state.dispatch);\n const node = useTabset((state) => state.node);\n const { float } = useTabsetChrome();\n\n if (!float) {\n return null;\n }\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n const geometry = measureFloatRect(event.currentTarget);\n dispatch({ geometry, tabsetId: node.id, type: \"floatTabset\" });\n };\n\n return (\n <button\n aria-label=\"Float panel\"\n title=\"Float panel\"\n {...props}\n data-dashfoo=\"tabset-float\"\n onClick={handleClick}\n type=\"button\"\n >\n {children ?? <FloatIcon />}\n </button>\n );\n};\n\nexport { TabsetFloatButton, TabsetGrip, TabsetMaximizeButton, TabsetToolbar, useTabsetChrome };\nexport type {\n TabsetChrome,\n TabsetFloatButtonProps,\n TabsetGripProps,\n TabsetMaximizeButtonProps,\n TabsetToolbarProps,\n};\n","\"use client\";\n\nimport type { TabsetNode } from \"@dashfoo/core\";\nimport type { ReactNode } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\n\nimport { TabsetContent } from \"./tabset-content\";\nimport { TabsetOverflowMenu } from \"./tabset-overflow-menu\";\nimport { TabsetCloseButton, TabsetRenameInput } from \"./tabset-rename-input\";\nimport { TabsetRoot } from \"./tabset-root\";\nimport { useTabset } from \"./tabset-store\";\nimport { TabsetTab, TabsetTrigger } from \"./tabset-tab\";\nimport { TabsetTablist, TabsetTabStrip } from \"./tabset-tablist\";\nimport {\n TabsetFloatButton,\n TabsetGrip,\n TabsetMaximizeButton,\n TabsetToolbar,\n useTabsetChrome,\n} from \"./tabset-toolbar\";\n\nconst tabsetContent = <TabsetContent />;\n\nconst DefaultTabsetLayout = (): ReactNode => {\n const renderTabsetToolbar = useLayout((state) => state.renderTabsetToolbar);\n const tabLocation = useLayout((state) => state.tabLocation);\n const tabStripEnabled = useLayout((state) => state.tabStripEnabled);\n const node = useTabset((state) => state.node);\n const chrome = useTabsetChrome();\n\n const showToolbar = renderTabsetToolbar !== undefined || Object.values(chrome).some(Boolean);\n\n const strip = tabStripEnabled ? (\n <TabsetTabStrip>\n <TabsetTablist>\n {node.children.map((tab) => (\n <TabsetTab key={tab.id} tab={tab}>\n <TabsetTrigger />\n <TabsetRenameInput />\n <TabsetCloseButton />\n </TabsetTab>\n ))}\n </TabsetTablist>\n {showToolbar ? (\n <TabsetToolbar>\n <TabsetOverflowMenu />\n <TabsetGrip />\n {renderTabsetToolbar?.(node)}\n <TabsetFloatButton />\n <TabsetMaximizeButton />\n </TabsetToolbar>\n ) : null}\n </TabsetTabStrip>\n ) : null;\n\n return tabLocation === \"bottom\" ? (\n <>\n {tabsetContent}\n {strip}\n </>\n ) : (\n <>\n {strip}\n {tabsetContent}\n </>\n );\n};\n\ntype TabsetViewProps = { node: TabsetNode };\n\nconst TabsetView = ({ node }: TabsetViewProps): ReactNode => (\n <TabsetRoot node={node}>\n <DefaultTabsetLayout />\n </TabsetRoot>\n);\n\nexport { TabsetView };\nexport type { TabsetViewProps };\n","\"use client\";\n\nimport type { Dimension, RowNode, SnapConfig, TabsetNode } from \"@dashfoo/core\";\nimport { resolveSnapGrid, snapEnabled } from \"@dashfoo/core\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { Fragment, useMemo } from \"react\";\nimport type { Orientation } from \"react-resizable-panels\";\nimport { Group, Panel, Separator } from \"react-resizable-panels\";\n\nimport { useLayout } from \"../hooks/layout-store\";\nimport { useSnapResize } from \"../hooks/use-snap-resize\";\n\nimport { TabsetView } from \"./tabset/tabset-view\";\n\nconst dimensionToSize = (dimension: Dimension): string => `${dimension.value}${dimension.unit}`;\nconst dimensionToPixels = (dimension: Dimension | undefined): number | undefined =>\n dimension?.unit === \"px\" ? dimension.value : undefined;\n\nconst groupStyle: CSSProperties = { display: \"flex\", flex: 1, minHeight: 0, minWidth: 0 };\n\ntype LayoutChild = RowNode[\"children\"][number];\n\nconst descendantMinSize = (\n child: LayoutChild,\n axis: RowNode[\"orientation\"],\n tabsetMinSize: number,\n): number | undefined => {\n const explicit = dimensionToPixels(child.min);\n if (explicit !== undefined) {\n return explicit;\n }\n if (child.min !== undefined) {\n return undefined;\n }\n if (child.type === \"tabset\") {\n return tabsetMinSize;\n }\n\n const childMinimums: Array<number> = [];\n for (const grandchild of child.children) {\n const minimum = descendantMinSize(grandchild, axis, tabsetMinSize);\n if (minimum === undefined) {\n return undefined;\n }\n childMinimums.push(minimum);\n }\n if (childMinimums.length === 0) {\n return undefined;\n }\n\n return child.orientation === axis\n ? childMinimums.reduce((sum, value) => sum + value, 0)\n : Math.max(...childMinimums);\n};\n\ntype RowViewProps = {\n node: RowNode;\n\n renderTabset?: (node: TabsetNode) => ReactNode;\n};\n\nconst RowView = ({ node, renderTabset }: RowViewProps): ReactNode => {\n const dispatch = useLayout((state) => state.dispatch);\n const resizableSplits = useLayout((state) => state.resizableSplits);\n const tabsetMinSize = useLayout((state) => state.tabsetMinSize);\n const globalSnap = useLayout((state) => state.snap);\n\n const effectiveSnap: SnapConfig | null = node.snap ?? globalSnap;\n // Resolved once per row, and the same value decides whether the per-move\n // listener is attached at all.\n const snapGrid = useMemo(\n () => resolveSnapGrid(effectiveSnap, node.children.length),\n [effectiveSnap, node.children.length],\n );\n const snapActive = snapEnabled(snapGrid);\n const orientation: Orientation = node.orientation === \"row\" ? \"horizontal\" : \"vertical\";\n const total = node.children.reduce((sum, child) => sum + child.weight, 0);\n\n const { beginBoundaryDrag, groupRef, onLayoutChange, onLayoutChanged, snappedBoundary } =\n useSnapResize({\n children: node.children,\n onWeightsSettled: (weights) => {\n dispatch({ rowId: node.id, type: \"adjustSplit\", weights });\n },\n resizableSplits,\n snap: snapGrid,\n });\n\n return (\n <Group\n data-dashfoo=\"row\"\n data-dashfoo-snapping={snappedBoundary === null ? undefined : \"true\"}\n disabled={!resizableSplits}\n groupRef={groupRef}\n key={node.id}\n onLayoutChange={snapActive ? onLayoutChange : undefined}\n onLayoutChanged={onLayoutChanged}\n orientation={orientation}\n style={groupStyle}\n >\n {node.children.map((child, index) => {\n const percent = (child.weight / total) * 100;\n let min = child.min ? dimensionToSize(child.min) : undefined;\n if (min === undefined) {\n const minimum = descendantMinSize(child, node.orientation, tabsetMinSize);\n min = minimum === undefined ? undefined : `${minimum}px`;\n }\n const max = child.max ? dimensionToSize(child.max) : undefined;\n\n return (\n <Fragment key={child.id}>\n {index > 0 ? (\n <Separator\n data-dashfoo=\"splitter\"\n data-dashfoo-snapped={snappedBoundary === index - 1 ? \"true\" : undefined}\n disabled={!resizableSplits}\n onPointerDown={\n snapActive && resizableSplits\n ? () => {\n beginBoundaryDrag(index - 1);\n }\n : undefined\n }\n />\n ) : null}\n <Panel defaultSize={`${percent}%`} id={child.id} maxSize={max} minSize={min}>\n {child.type === \"row\" ? (\n <RowView node={child} renderTabset={renderTabset} />\n ) : (\n (renderTabset?.(child) ?? <TabsetView node={child} />)\n )}\n </Panel>\n </Fragment>\n );\n })}\n </Group>\n );\n};\n\nexport { RowView };\nexport type { RowViewProps };\n","\"use client\";\n\nimport type { Action, FloatNode } from \"@dashfoo/core\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { useRef, useState } from \"react\";\n\nimport type { LayoutState } from \"../hooks/layout-store\";\nimport { useLayout } from \"../hooks/layout-store\";\nimport { useFloatGesture } from \"../hooks/use-float-gesture\";\nimport { useInlineRename } from \"../hooks/use-inline-rename\";\n\nimport { DockIcon, FloatIcon, GripIcon, MinimizeIcon } from \"./close-icon\";\nimport { DragProvider } from \"./drag-provider\";\nimport { RESIZE_HANDLES } from \"./float-resize-handles\";\nimport { LayoutOverrides } from \"./layout-root\";\nimport { RowView } from \"./row-view\";\n\nconst floatTitle = (node: FloatNode): string => node.name ?? \"Panel\";\n\nconst titleBarStyle: CSSProperties = {\n alignItems: \"center\",\n display: \"flex\",\n flexShrink: 0,\n gap: \"0.375rem\",\n touchAction: \"none\",\n};\n\nconst titleStyle: CSSProperties = {\n flex: 1,\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n};\n\nconst dockButtonStyle: CSSProperties = {\n alignItems: \"center\",\n cursor: \"pointer\",\n display: \"inline-flex\",\n flexShrink: 0,\n};\n\nconst bodyStyle: CSSProperties = { flex: 1, minHeight: 0, position: \"relative\" };\n\nconst FLOAT_OVERRIDES: Partial<LayoutState> = {\n draggableTabsets: false,\n floatable: false,\n maximizable: false,\n maximizedTabsetId: undefined,\n};\n\ntype TitleProps = { dispatch: (action: Action) => void; node: FloatNode };\n\nconst FloatTitleEditor = ({\n dispatch,\n node,\n onDone,\n}: TitleProps & { onDone: () => void }): ReactNode => {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const { handleBlur, handleKeyDown } = useInlineRename({\n currentName: floatTitle(node),\n inputRef,\n onCommit: (name) => {\n dispatch({ floatId: node.id, name, type: \"renameFloat\" });\n },\n onDone,\n });\n\n return (\n <input\n aria-label={`Rename ${floatTitle(node)}`}\n data-dashfoo=\"float-rename\"\n defaultValue={floatTitle(node)}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n ref={inputRef}\n style={titleStyle}\n type=\"text\"\n />\n );\n};\n\nconst FloatTitle = ({\n dispatch,\n node,\n renamable,\n}: TitleProps & { renamable: boolean }): ReactNode => {\n const [editing, setEditing] = useState(false);\n if (renamable && editing) {\n return (\n <FloatTitleEditor\n dispatch={dispatch}\n node={node}\n onDone={() => {\n setEditing(false);\n }}\n />\n );\n }\n return (\n <span\n data-dashfoo=\"float-title\"\n onDoubleClick={\n renamable\n ? () => {\n setEditing(true);\n }\n : undefined\n }\n style={titleStyle}\n title={renamable ? \"Double-click to rename\" : undefined}\n >\n {floatTitle(node)}\n </span>\n );\n};\n\ntype FloatPanelProps = {\n node: FloatNode;\n onFocus: () => void;\n zIndex: number;\n};\n\nconst FloatPanel = ({ node, onFocus, zIndex }: FloatPanelProps): ReactNode => {\n const dispatch = useLayout((state) => state.dispatch);\n const editable = useLayout((state) => state.editable);\n\n const minimized = node.minimized === true;\n\n const restore = (): void => {\n if (!editable) {\n return;\n }\n dispatch({ floatId: node.id, minimized: false, type: \"setFloatMinimized\" });\n };\n\n const { handlers, ref, style } = useFloatGesture({\n editable,\n geometry: node.geometry,\n minimized,\n onCommit: (geometry) => {\n dispatch({ floatId: node.id, geometry, type: \"moveFloat\" });\n },\n onTap: () => {\n if (minimized) {\n restore();\n }\n },\n });\n const { onPointerDown, ...rootHandlers } = handlers;\n const frameStyle: CSSProperties = {\n ...style,\n pointerEvents: \"auto\",\n position: \"absolute\",\n zIndex,\n };\n\n if (minimized) {\n return (\n <button\n {...rootHandlers}\n aria-label={`Restore ${floatTitle(node)} panel`}\n data-dashfoo=\"float-chip\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n restore();\n }\n }}\n onPointerDown={onPointerDown}\n onPointerDownCapture={onFocus}\n ref={ref}\n style={frameStyle}\n title={floatTitle(node)}\n type=\"button\"\n >\n <FloatIcon />\n <span data-dashfoo=\"float-chip-label\">{floatTitle(node)}</span>\n </button>\n );\n }\n\n return (\n <div\n {...rootHandlers}\n data-dashfoo=\"float\"\n onPointerDownCapture={onFocus}\n ref={ref}\n style={frameStyle}\n >\n <div\n data-dashfoo=\"float-titlebar\"\n onPointerDown={onPointerDown}\n style={editable ? titleBarStyle : { ...titleBarStyle, cursor: \"default\" }}\n >\n <span aria-hidden=\"true\" data-dashfoo=\"float-grip\">\n <GripIcon />\n </span>\n <FloatTitle dispatch={dispatch} node={node} renamable={editable} />\n {editable && (\n <>\n <button\n aria-label=\"Minimize panel\"\n data-dashfoo=\"float-minimize\"\n onClick={() => {\n dispatch({ floatId: node.id, minimized: true, type: \"setFloatMinimized\" });\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n style={dockButtonStyle}\n title=\"Minimize panel\"\n type=\"button\"\n >\n <MinimizeIcon />\n </button>\n <button\n aria-label=\"Dock panel back into the main layout\"\n data-dashfoo=\"float-dock\"\n onClick={() => {\n dispatch({ floatId: node.id, type: \"dockFloat\" });\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n style={dockButtonStyle}\n title=\"Dock panel back\"\n type=\"button\"\n >\n <DockIcon />\n </button>\n </>\n )}\n </div>\n <div data-dashfoo=\"float-body\" style={bodyStyle}>\n <LayoutOverrides overrides={FLOAT_OVERRIDES}>\n <DragProvider>\n <RowView node={node.layout} />\n </DragProvider>\n </LayoutOverrides>\n </div>\n {editable &&\n RESIZE_HANDLES.map((handle) => (\n <div\n data-dashfoo=\"float-resize\"\n data-edge={handle.key}\n key={handle.key}\n onPointerDown={onPointerDown}\n style={{ position: \"absolute\", touchAction: \"none\", zIndex: 1, ...handle.style }}\n />\n ))}\n </div>\n );\n};\n\nexport { FloatPanel, FloatTitleEditor };\nexport type { FloatPanelProps };\n","\"use client\";\n\nimport type { FloatNode, GlobalAttributes } from \"@dashfoo/core\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { useState } from \"react\";\n\nimport { FloatLayerContext } from \"./float-context\";\nimport { FloatPanel } from \"./float-panel\";\n\nconst overlayStyle: CSSProperties = {\n inset: 0,\n\n pointerEvents: \"none\",\n position: \"fixed\",\n\n zIndex: 1,\n};\n\nconst FloatOverlay = ({ floats }: { floats: Array<FloatNode> }): ReactNode => {\n const [topId, setTopId] = useState<string | null>(null);\n if (floats.length === 0) {\n return null;\n }\n return (\n <div data-dashfoo=\"float-overlay\" style={overlayStyle}>\n {floats.map((node) => (\n <FloatPanel\n key={node.id}\n node={node}\n onFocus={() => {\n setTopId(node.id);\n }}\n zIndex={node.id === topId ? 2 : 1}\n />\n ))}\n </div>\n );\n};\n\ntype FloatLayerProps = {\n children: ReactNode;\n floats: Array<FloatNode>;\n /** Unread: floats inherit every global-derived capability from the layout store above them. */\n global?: GlobalAttributes;\n};\n\nconst FloatLayer = ({ children, floats }: FloatLayerProps): ReactNode => (\n <FloatLayerContext.Provider value>\n {children}\n <FloatOverlay floats={floats} />\n </FloatLayerContext.Provider>\n);\n\nexport { FloatLayer };\nexport type { FloatLayerProps };\n","\"use client\";\n\nimport { DragProvider } from \"./drag-provider\";\nimport { FloatLayer } from \"./float-layer\";\nimport { LayoutRoot } from \"./layout-root\";\nimport { RowView } from \"./row-view\";\nimport { TabsetView } from \"./tabset/tabset-view\";\n\nconst Layout = {\n DragLayer: DragProvider,\n FloatLayer,\n Root: LayoutRoot,\n Rows: RowView,\n Tabset: TabsetView,\n} as const;\n\nexport { Layout };\nexport type { DragProviderProps as LayoutDragLayerProps } from \"./drag-provider\";\nexport type { FloatLayerProps as LayoutFloatLayerProps } from \"./float-layer\";\nexport type { 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 \"./dashfoo-drag-provider\";\nimport { Layout } from \"./layout\";\n\nconst DEFAULT_PERSIST_DEBOUNCE_MS = 300;\n\ntype PersistInput = string | { debounceMs?: number; key: string; storage?: StorageAdapter };\n\nconst resolvePersist = (persist: PersistInput | undefined): PersistConfig | null => {\n if (persist === undefined) {\n return null;\n }\n if (typeof persist === \"string\") {\n return { debounceMs: DEFAULT_PERSIST_DEBOUNCE_MS, key: persist, storage: localStorageAdapter };\n }\n return {\n debounceMs: persist.debounceMs ?? DEFAULT_PERSIST_DEBOUNCE_MS,\n key: persist.key,\n storage: persist.storage ?? localStorageAdapter,\n };\n};\n\ntype TabComponent = ComponentType<{ node: TabNode }>;\n\nconst warnedComponents = new Set<string>();\n\ntype DashfooHandle = {\n addTab: (\n tab: TabNode,\n target: { index?: number; location?: DockLocation; targetId: string },\n ) => void;\n canRedo: () => boolean;\n canUndo: () => boolean;\n closeTab: (tabId: string) => void;\n dispatch: (action: Action) => void;\n\n dockFloat: (floatId: string) => void;\n\n floatTab: (tabId: string) => void;\n getModel: () => Dashfoo;\n maximizeTabset: (tabsetId: string | null) => void;\n redo: () => void;\n renameTab: (tabId: string, name: string) => void;\n\n resetLayout: () => void;\n selectTab: (tabsetId: string, index: number) => void;\n undo: () => void;\n};\n\ntype DashfooLayoutCommonProps = {\n closableTabs?: boolean;\n components?: Record<string, TabComponent>;\n draggableTabs?: boolean;\n draggableTabsets?: boolean;\n\n editable?: boolean;\n factory?: (tab: TabNode) => ReactNode;\n\n floatable?: boolean;\n keepMounted?: boolean;\n maximizable?: boolean;\n onAction?: (action: Action) => Action | null;\n onActiveTabsetChange?: (tabsetId: string | undefined) => void;\n onMaximizedTabsetChange?: (tabsetId: string | undefined) => void;\n onModelChange?: (model: Dashfoo, action?: Action) => void;\n renamableTabs?: boolean;\n renderTabLabel?: (tab: TabNode) => ReactNode;\n renderTabsetToolbar?: (tabset: TabsetNode) => ReactNode;\n\n resizableSplits?: boolean;\n responsive?: { maxWidth: number; orientation?: Orientation };\n\n snap?: SnapConfig;\n};\n\ntype DashfooLayoutProps = DashfooLayoutCommonProps &\n (\n | { defaultModel: Dashfoo; model?: never; persist?: PersistInput }\n | { defaultModel?: never; model: Dashfoo; persist?: never }\n );\n\nconst DashfooLayout = forwardRef<DashfooHandle, DashfooLayoutProps>((props, ref): ReactNode => {\n const {\n closableTabs = true,\n components,\n defaultModel,\n draggableTabs = true,\n draggableTabsets = true,\n editable = true,\n factory,\n floatable = false,\n keepMounted = false,\n maximizable = true,\n model,\n onAction,\n onActiveTabsetChange,\n onMaximizedTabsetChange,\n onModelChange,\n persist,\n renamableTabs = true,\n renderTabLabel,\n renderTabsetToolbar,\n resizableSplits = true,\n responsive,\n snap,\n } = props;\n\n const persistConfig = useMemo(() => resolvePersist(persist), [persist]);\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\n /** Everything the compact breakpoint changes, decided once. */\n const presentation = useMemo(\n () =>\n isCompact\n ? {\n maximizable: false,\n model: stackModel(store.model, responsive?.orientation),\n restructurable: false,\n }\n : { maximizable, model: store.model, restructurable: true },\n [isCompact, maximizable, responsive?.orientation, store.model],\n );\n const view = presentation.model;\n\n const maximized =\n view.maximizedTabsetId === undefined ? undefined : findTabset(view, view.maximizedTabsetId);\n\n const tree = (\n <Layout.FloatLayer floats={view.floats}>\n <Layout.DragLayer>\n {maximized ? <Layout.Tabset node={maximized} /> : <Layout.Rows node={view.layout} />}\n </Layout.DragLayer>\n </Layout.FloatLayer>\n );\n\n return (\n <Layout.Root\n closableTabs={closableTabs}\n dispatch={store.dispatch}\n draggableTabs={draggableTabs}\n draggableTabsets={draggableTabsets}\n editable={editable}\n floatable={floatable}\n keepMounted={keepMounted}\n maximizable={presentation.maximizable}\n model={view}\n renamableTabs={renamableTabs}\n renderTab={renderTab}\n renderTabLabel={renderTabLabel}\n renderTabsetToolbar={renderTabsetToolbar}\n resizableSplits={resizableSplits}\n restructurable={presentation.restructurable}\n rootRef={containerRef}\n snap={snap}\n >\n {hasSharedManager ? tree : <DashfooDragProvider>{tree}</DashfooDragProvider>}\n </Layout.Root>\n );\n});\n\nDashfooLayout.displayName = \"DashfooLayout\";\n\nexport { DashfooLayout };\nexport type { DashfooHandle, DashfooLayoutCommonProps, DashfooLayoutProps, TabComponent };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\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-menu\";\nimport { TabsetCloseButton, TabsetRenameInput } from \"./tabset-rename-input\";\nimport { TabsetRoot } from \"./tabset-root\";\nimport { TabsetTab, TabsetTrigger } from \"./tabset-tab\";\nimport { TabsetTablist, TabsetTabStrip } from \"./tabset-tablist\";\nimport {\n TabsetFloatButton,\n TabsetGrip,\n TabsetMaximizeButton,\n TabsetToolbar,\n} from \"./tabset-toolbar\";\n\nconst Tabset = {\n CloseButton: TabsetCloseButton,\n Content: TabsetContent,\n FloatButton: TabsetFloatButton,\n Grip: TabsetGrip,\n MaximizeButton: TabsetMaximizeButton,\n OverflowMenu: TabsetOverflowMenu,\n RenameInput: TabsetRenameInput,\n Root: TabsetRoot,\n Tab: TabsetTab,\n Tablist: TabsetTablist,\n TabStrip: TabsetTabStrip,\n Toolbar: TabsetToolbar,\n Trigger: TabsetTrigger,\n} as const;\n\nexport { Tabset };\nexport type { TabsetContentProps } from \"./tabset-content\";\nexport type { TabsetRootProps } from \"./tabset-root\";\nexport type { TabsetTabProps, TabsetTriggerProps } from \"./tabset-tab\";\nexport type { TabsetCloseButtonProps, TabsetRenameInputProps } from \"./tabset-rename-input\";\nexport type { TabsetTablistProps, TabsetTabStripProps } from \"./tabset-tablist\";\nexport type {\n TabsetFloatButtonProps,\n TabsetGripProps,\n TabsetMaximizeButtonProps,\n TabsetToolbarProps,\n} from \"./tabset-toolbar\";\n"],"mappings":"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"}
|