@dashfoo/react 0.6.2 → 0.6.3
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 +66 -66
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +59 -56
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
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/lib/float-geometry.ts","../src/components/float-resize-handles.ts","../src/components/layout-root.tsx","../src/lib/tab-ids.ts","../src/components/tabset/tabset-store.ts","../src/components/tabset/tabset-content.tsx","../src/components/tab-overflow.tsx","../src/components/tabset/tabset-overflow.tsx","../src/hooks/use-tab-overflow.ts","../src/lib/tab-selection.ts","../src/components/tabset/tabset-root.tsx","../src/lib/merge-refs.ts","../src/components/tabset/tabset-tab.tsx","../src/components/tabset-icons.tsx","../src/components/tabset/tabset-tab-controls.tsx","../src/components/tabset/tabset-tablist.tsx","../src/components/tabset/tabset-toolbar.tsx","../src/components/tabset/tabset-view.tsx","../src/components/row-view.tsx","../src/components/float-panel.tsx","../src/components/float-layer.tsx","../src/components/layout.tsx","../src/components/dashfoo-layout.tsx","../src/components/panel.tsx","../src/components/tabset/tabset.ts"],"sourcesContent":["import type { Collision, CollisionDetector, UniqueIdentifier } from \"@dnd-kit/abstract\";\nimport { CollisionPriority, CollisionType } from \"@dnd-kit/abstract\";\n\ntype TopmostDetectorInput = {\n dragOperation: { position: { current: { x: number; y: number } } };\n droppable: { element?: Element; id: UniqueIdentifier };\n};\n\ntype TopmostDetector = (input: TopmostDetectorInput) => Collision | null;\n\nconst createTopmostPointerIntersection = (\n topElementAt: (x: number, y: number) => Element | null = (x, y) =>\n document.elementFromPoint(x, y),\n): TopmostDetector => {\n let cached: { top: Element | null; x: number; y: number } | null = null;\n const topAt = (x: number, y: number): Element | null => {\n if (cached && cached.x === x && cached.y === y) {\n return cached.top;\n }\n const top = topElementAt(x, y);\n cached = { top, x, y };\n queueMicrotask(() => {\n cached = null;\n });\n return top;\n };\n\n return ({ dragOperation, droppable }) => {\n const { element } = droppable;\n if (!element) {\n return null;\n }\n const point = dragOperation.position.current;\n const top = topAt(point.x, point.y);\n if (!top || !element.contains(top)) {\n return null;\n }\n\n let depth = 0;\n for (let node: Element | null = element; node; node = node.parentElement) {\n depth += 1;\n }\n return {\n id: droppable.id,\n priority: CollisionPriority.High,\n type: CollisionType.PointerIntersection,\n value: depth,\n };\n };\n};\n\nconst topmostPointerIntersection: CollisionDetector = createTopmostPointerIntersection();\n\nexport { createTopmostPointerIntersection, topmostPointerIntersection };\nexport type { TopmostDetectorInput };\n","\"use client\";\n\nimport type { DragSubject, DropIntent, TabNode } from \"@dashfoo/core\";\nimport {\n Accessibility,\n Draggable,\n DragDropManager,\n Droppable,\n Feedback,\n PointerSensor,\n} from \"@dnd-kit/dom\";\nimport type { Context } from \"react\";\nimport { createContext, useCallback, useContext, useEffect, useId, useMemo, useRef } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { createStore, useStore } from \"zustand\";\n\nimport { topmostPointerIntersection } from \"../lib/topmost-collision\";\n\nconst INTERACTIVE_SELECTOR = `\n input:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n button:not([disabled]),\n a[href],\n [contenteditable]:not([contenteditable=\"false\"])\n`;\n\nconst preventActivation = (event: PointerEvent, source: Draggable): boolean => {\n const { target } = event;\n if (!(target instanceof Element)) {\n return false;\n }\n const interactive = target.closest(INTERACTIVE_SELECTOR);\n return interactive !== null && interactive !== source.element;\n};\n\nconst createDragManager = (): DragDropManager =>\n new DragDropManager({\n plugins: (defaults) => [\n ...defaults.filter((plugin) => plugin !== Accessibility && plugin !== Feedback),\n Feedback.configure({ dropAnimation: null }),\n ],\n sensors: () => [PointerSensor.configure({ preventActivation })],\n });\n\ntype DragContextValue = {\n layerId: string;\n manager: DragDropManager;\n};\n\nconst DragContext = createContext<DragContextValue | null>(null);\n\nconst SharedDragManagerContext: Context<DragDropManager | null> =\n createContext<DragDropManager | null>(null);\n\ntype DragSubjectState = {\n intent: DropIntent | null;\n intentOwner: string | null;\n subject: DragSubject | null;\n};\n\ntype DragSubjectStore = StoreApi<DragSubjectState>;\n\nconst createDragSubjectStore = (): DragSubjectStore =>\n createStore<DragSubjectState>(() => ({ intent: null, intentOwner: null, subject: null }));\n\nconst sameDropIntent = (a: DropIntent | null, b: DropIntent | null): boolean =>\n a === b ||\n (a !== null &&\n b !== null &&\n a.index === b.index &&\n a.location === b.location &&\n a.targetId === b.targetId);\n\nconst sameDragSubject = (a: DragSubject | null, b: DragSubject | null): boolean =>\n a === b || (a !== null && b !== null && a.id === b.id && a.kind === b.kind);\n\nconst nullSubjectStore = createDragSubjectStore();\n\nconst DragSubjectStoreContext: Context<DragSubjectStore | null> =\n createContext<DragSubjectStore | null>(null);\n\ntype DraggableHandle = {\n draggableRef: { current: Draggable | null };\n elementRef: { current: Element | null };\n ref: (element: Element | null) => void;\n};\n\nconst useDraggableHandle = (): DraggableHandle => {\n const elementRef = useRef<Element | null>(null);\n const draggableRef = useRef<Draggable | null>(null);\n const ref = useCallback((element: Element | null): void => {\n elementRef.current = element;\n if (draggableRef.current) {\n draggableRef.current.element = element ?? undefined;\n }\n }, []);\n return { draggableRef, elementRef, ref };\n};\n\ntype DraggableDescriptor = { data: Record<string, unknown>; id: string };\n\nconst useDraggableEntity = (\n descriptor: DraggableDescriptor,\n disabled: boolean,\n label: string,\n): { ref: (element: Element | null) => void } => {\n const context = useContext(DragContext);\n\n const sharedManager = useContext(SharedDragManagerContext);\n const manager = context?.manager ?? sharedManager;\n const { draggableRef, elementRef, ref } = useDraggableHandle();\n const { data, id } = descriptor;\n\n useEffect(() => {\n if (!manager || disabled) {\n return undefined;\n }\n const draggable = new Draggable({ data: { ...data, label: \"\" }, id }, manager);\n draggable.element = elementRef.current ?? undefined;\n draggableRef.current = draggable;\n return () => {\n draggable.destroy();\n draggableRef.current = null;\n };\n }, [data, disabled, draggableRef, elementRef, id, manager]);\n\n useEffect(() => {\n const draggable = draggableRef.current;\n if (draggable) {\n draggable.data = { ...data, label };\n }\n }, [data, draggableRef, label]);\n\n return useMemo(() => ({ ref }), [ref]);\n};\n\nconst useTabDraggable = (\n tabId: string,\n disabled = false,\n label = \"\",\n): { ref: (element: Element | null) => void } => {\n const data = useMemo(() => ({ type: \"tab\" }), []);\n return useDraggableEntity({ data, id: tabId }, disabled, label);\n};\n\nconst useTabsetDraggable = (\n tabsetId: string,\n disabled = false,\n label = \"\",\n): { ref: (element: Element | null) => void } => {\n const data = useMemo(() => ({ tabsetId, type: \"tabset\" }), [tabsetId]);\n return useDraggableEntity({ data, id: `grip-${tabsetId}` }, disabled, label);\n};\n\nconst useTabsetDroppable = (tabsetId: string): { ref: (element: HTMLElement | null) => void } => {\n const context = useContext(DragContext);\n const elementRef = useRef<HTMLElement | null>(null);\n const droppableRef = useRef<Droppable | null>(null);\n const ref = useCallback((element: HTMLElement | null): void => {\n elementRef.current = element;\n if (droppableRef.current) {\n droppableRef.current.element = element ?? undefined;\n }\n }, []);\n const layerId = context?.layerId;\n const manager = context?.manager;\n\n useEffect(() => {\n if (!manager || layerId === undefined) {\n return undefined;\n }\n\n const droppable = new Droppable(\n {\n collisionDetector: topmostPointerIntersection,\n data: { layerId, tabsetId, type: \"tabset\" },\n id: `${layerId}:${tabsetId}`,\n },\n manager,\n );\n droppable.element = elementRef.current ?? undefined;\n droppableRef.current = droppable;\n return () => {\n droppable.destroy();\n droppableRef.current = null;\n };\n }, [layerId, manager, tabsetId]);\n\n return useMemo(() => ({ ref }), [ref]);\n};\n\ntype ExternalTabSourceOptions = {\n createTab: () => TabNode;\n disabled?: boolean;\n label?: string;\n};\n\nconst useExternalTabSource = ({\n createTab,\n disabled = false,\n label = \"\",\n}: ExternalTabSourceOptions): { ref: (element: Element | null) => void } => {\n const id = useId();\n const createTabRef = useRef(createTab);\n\n useEffect(() => {\n createTabRef.current = createTab;\n });\n const data = useMemo(\n () => ({ createTab: (): TabNode => createTabRef.current(), type: \"external\" }),\n [],\n );\n return useDraggableEntity({ data, id: `external-${id}` }, disabled, label);\n};\n\nconst useDragSubject = (): DragSubject | null => {\n const store = useContext(DragSubjectStoreContext);\n return useStore(store ?? nullSubjectStore, (state) => state.subject);\n};\n\nconst useDropIntent = (): DropIntent | null => {\n const store = useContext(DragSubjectStoreContext);\n return useStore(store ?? nullSubjectStore, (state) => state.intent);\n};\n\nexport type { DragContextValue, DragSubjectStore, ExternalTabSourceOptions };\nexport {\n createDragManager,\n createDragSubjectStore,\n DragContext,\n DragSubjectStoreContext,\n sameDragSubject,\n sameDropIntent,\n SharedDragManagerContext,\n useDragSubject,\n useDropIntent,\n useExternalTabSource,\n useTabDraggable,\n useTabsetDraggable,\n useTabsetDroppable,\n};\n","\"use client\";\n\nimport type { Dashfoo } from \"@dashfoo/core\";\nimport { fromJSON, toJSON } from \"@dashfoo/core\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\ntype StorageAdapter = {\n getItem: (key: string) => string | null;\n removeItem: (key: string) => void;\n setItem: (key: string, value: string) => void;\n};\n\nconst memoryStorageAdapter = (): StorageAdapter => {\n const store = new Map<string, string>();\n return {\n getItem: (key) => store.get(key) ?? null,\n removeItem: (key) => {\n store.delete(key);\n },\n setItem: (key, value) => {\n store.set(key, value);\n },\n };\n};\n\nconst localStorageAdapter: StorageAdapter = {\n getItem: (key) => {\n if (typeof window === \"undefined\") {\n return null;\n }\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n },\n removeItem: (key) => {\n if (typeof window === \"undefined\") {\n return;\n }\n try {\n window.localStorage.removeItem(key);\n } catch {\n void 0;\n }\n },\n setItem: (key, value) => {\n if (typeof window === \"undefined\") {\n return;\n }\n try {\n window.localStorage.setItem(key, value);\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] failed to persist layout\", error);\n }\n },\n};\n\ntype PersistConfig = {\n debounceMs: number;\n key: string;\n storage: StorageAdapter;\n};\n\ntype Persistence = {\n clear: () => void;\n\n initialModel: Dashfoo | undefined;\n save: (model: Dashfoo) => void;\n};\n\nconst usePersistence = (\n config: PersistConfig | null,\n defaultModel: Dashfoo | undefined,\n): Persistence => {\n const configRef = useRef(config);\n useEffect(() => {\n configRef.current = config;\n });\n\n const [initialModel] = useState<Dashfoo | undefined>(() => {\n if (config === null || defaultModel === undefined) {\n return defaultModel;\n }\n const raw = config.storage.getItem(config.key);\n if (raw === null) {\n return defaultModel;\n }\n try {\n return fromJSON(raw);\n } catch {\n return defaultModel;\n }\n });\n\n useEffect(() => {\n const current = configRef.current;\n if (current === null) {\n return;\n }\n const raw = current.storage.getItem(current.key);\n if (raw === null) {\n return;\n }\n try {\n fromJSON(raw);\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] discarding unreadable persisted layout\", error);\n current.storage.removeItem(current.key);\n }\n }, []);\n\n const loadedKey = useRef(config?.key);\n useEffect(() => {\n if (config !== null && config.key !== loadedKey.current) {\n // oxlint-disable-next-line no-console\n console.warn(\n \"[dashfoo] persist key changed for a mounted layout; the displayed layout still reflects the previous key — remount (key={persistKey}) to load the new key\",\n );\n loadedKey.current = config.key;\n }\n }, [config]);\n\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const pending = useRef<{ key: string; storage: StorageAdapter; value: string } | null>(null);\n\n const flush = useCallback((): void => {\n if (timer.current !== null) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n if (pending.current !== null) {\n pending.current.storage.setItem(pending.current.key, pending.current.value);\n pending.current = null;\n }\n }, []);\n\n const save = useCallback(\n (next: Dashfoo): void => {\n const current = configRef.current;\n if (current === null) {\n return;\n }\n pending.current = { key: current.key, storage: current.storage, value: toJSON(next) };\n if (timer.current !== null) {\n clearTimeout(timer.current);\n }\n timer.current = setTimeout(flush, current.debounceMs);\n },\n [flush],\n );\n\n useEffect(() => {\n const handlePageHide = (): void => {\n flush();\n };\n const handleVisibilityChange = (): void => {\n if (document.visibilityState === \"hidden\") {\n flush();\n }\n };\n window.addEventListener(\"pagehide\", handlePageHide);\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n return () => {\n window.removeEventListener(\"pagehide\", handlePageHide);\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n flush();\n };\n }, [flush]);\n\n const clear = useCallback((): void => {\n if (timer.current !== null) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n pending.current = null;\n const current = configRef.current;\n if (current !== null) {\n current.storage.removeItem(current.key);\n }\n }, []);\n\n return useMemo(() => ({ clear, initialModel, save }), [clear, initialModel, save]);\n};\n\nexport { localStorageAdapter, memoryStorageAdapter, usePersistence };\nexport type { Persistence, PersistConfig, StorageAdapter };\n","\"use client\";\n\nimport type { Dashfoo } from \"@dashfoo/core\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\ntype Breakpoint = {\n compact?: boolean;\n id: string;\n model: Dashfoo;\n query?: { maxWidth: number } | { media: string };\n};\n\ntype UseResponsiveModelOptions = { breakpoints: Array<Breakpoint> };\n\ntype ResponsiveModel = {\n breakpoint: string;\n containerRef: (element: HTMLElement | null) => void;\n draggableTabs: boolean;\n draggableTabsets: boolean;\n isCompact: boolean;\n model: Dashfoo;\n resizableSplits: boolean;\n};\n\nconst hasMatchMedia = (): boolean =>\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\";\n\nconst matchBreakpoint = (breakpoint: Breakpoint, width: number): boolean => {\n const { query } = breakpoint;\n if (!query) {\n return true;\n }\n if (\"maxWidth\" in query) {\n return width <= query.maxWidth;\n }\n return hasMatchMedia() && window.matchMedia(query.media).matches;\n};\n\nconst activeBreakpoint = (breakpoints: Array<Breakpoint>, width: number): Breakpoint => {\n const fallback = breakpoints.at(-1);\n if (!fallback) {\n throw new Error(\"useResponsiveModel requires at least one breakpoint.\");\n }\n return breakpoints.find((breakpoint) => matchBreakpoint(breakpoint, width)) ?? fallback;\n};\n\nconst useContainerWidth = (): [(element: HTMLElement | null) => void, number] => {\n const [width, setWidth] = useState<number>(Number.POSITIVE_INFINITY);\n const observerRef = useRef<ResizeObserver | null>(null);\n\n const containerRef = useCallback((element: HTMLElement | null): void => {\n observerRef.current?.disconnect();\n if (!element) {\n return;\n }\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n setWidth(entry.contentRect.width);\n }\n });\n observer.observe(element);\n observerRef.current = observer;\n }, []);\n\n useEffect(\n () => () => {\n observerRef.current?.disconnect();\n },\n [],\n );\n\n return [containerRef, width];\n};\n\nconst useResponsiveModel = ({ breakpoints }: UseResponsiveModelOptions): ResponsiveModel => {\n const [containerRef, width] = useContainerWidth();\n const [, setMediaTick] = useState(0);\n\n useEffect(() => {\n if (!hasMatchMedia()) {\n return;\n }\n const lists = breakpoints.flatMap((breakpoint) =>\n breakpoint.query && \"media\" in breakpoint.query\n ? [window.matchMedia(breakpoint.query.media)]\n : [],\n );\n if (lists.length === 0) {\n return;\n }\n const handleChange = (): void => {\n setMediaTick((tick) => tick + 1);\n };\n for (const list of lists) {\n list.addEventListener(\"change\", handleChange);\n }\n return () => {\n for (const list of lists) {\n list.removeEventListener(\"change\", handleChange);\n }\n };\n }, [breakpoints]);\n\n const active = activeBreakpoint(breakpoints, width);\n\n return useMemo(() => {\n const isCompact = active.compact === true;\n return {\n breakpoint: active.id,\n containerRef,\n draggableTabs: !isCompact,\n draggableTabsets: !isCompact,\n isCompact,\n model: active.model,\n resizableSplits: !isCompact,\n };\n }, [active, containerRef]);\n};\n\nexport { activeBreakpoint, matchBreakpoint, useContainerWidth, useResponsiveModel };\nexport type { Breakpoint, ResponsiveModel, UseResponsiveModelOptions };\n","\"use client\";\n\nimport type { Action, Dashfoo } from \"@dashfoo/core\";\nimport { canRedo, canUndo, dashfooMachine, normalize, reducer } from \"@dashfoo/core\";\nimport { useActorRef, useSelector } from \"@xstate/react\";\nimport { useCallback, useEffect, useMemo } from \"react\";\n\ntype DashfooStore = {\n canRedo: () => boolean;\n canUndo: () => boolean;\n dispatch: (action: Action) => void;\n model: Dashfoo;\n redo: () => void;\n setModel: (model: Dashfoo) => void;\n undo: () => void;\n};\n\ntype UseDashfooStoreOptions = {\n defaultModel?: Dashfoo;\n model?: Dashfoo;\n onAction?: (action: Action) => Action | null;\n onActiveTabsetChange?: (tabsetId: string | undefined) => void;\n onMaximizedTabsetChange?: (tabsetId: string | undefined) => void;\n onModelChange?: (model: Dashfoo, action?: Action) => void;\n};\n\nconst useDashfooStore = (options: UseDashfooStoreOptions): DashfooStore => {\n const {\n defaultModel,\n model: controlledModel,\n onAction,\n onActiveTabsetChange,\n onMaximizedTabsetChange,\n onModelChange,\n } = options;\n const initialModel = controlledModel ?? defaultModel;\n if (initialModel === undefined) {\n throw new Error(\"useDashfooStore requires either a `model` or a `defaultModel`.\");\n }\n\n const actorRef = useActorRef(dashfooMachine, { input: { model: normalize(initialModel) } });\n const history = useSelector(actorRef, (snapshot) => snapshot.context.history);\n\n useEffect(() => {\n if (controlledModel !== undefined) {\n actorRef.send({ model: normalize(controlledModel), type: \"SET_MODEL\" });\n }\n }, [actorRef, controlledModel]);\n\n const model = controlledModel ?? history.present;\n\n const notify = useCallback(\n (before: Dashfoo, after: Dashfoo, action?: Action) => {\n if (Object.is(before, after)) {\n return;\n }\n onModelChange?.(after, action);\n if (after.activeTabsetId !== before.activeTabsetId) {\n onActiveTabsetChange?.(after.activeTabsetId);\n }\n if (after.maximizedTabsetId !== before.maximizedTabsetId) {\n onMaximizedTabsetChange?.(after.maximizedTabsetId);\n }\n },\n [onModelChange, onActiveTabsetChange, onMaximizedTabsetChange],\n );\n\n const dispatch = useCallback(\n (action: Action) => {\n const resolved = onAction ? onAction(action) : action;\n if (!resolved) {\n return;\n }\n\n const transition = ((): { after: Dashfoo; before: Dashfoo } => {\n if (controlledModel === undefined) {\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ action: resolved, type: \"DISPATCH\" });\n return { after: actorRef.getSnapshot().context.history.present, before };\n }\n return { after: reducer(controlledModel, resolved), before: normalize(controlledModel) };\n })();\n notify(transition.before, transition.after, resolved);\n },\n [actorRef, controlledModel, notify, onAction],\n );\n\n const undo = useCallback(() => {\n if (controlledModel !== undefined) {\n return;\n }\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ type: \"UNDO\" });\n const after = actorRef.getSnapshot().context.history.present;\n notify(before, after);\n }, [actorRef, controlledModel, notify]);\n\n const redo = useCallback(() => {\n if (controlledModel !== undefined) {\n return;\n }\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ type: \"REDO\" });\n const after = actorRef.getSnapshot().context.history.present;\n notify(before, after);\n }, [actorRef, controlledModel, notify]);\n\n const setModel = useCallback(\n (next: Dashfoo) => {\n actorRef.send({ model: normalize(next), type: \"SET_MODEL\" });\n },\n [actorRef],\n );\n\n return useMemo(\n () => ({\n canRedo: () => canRedo(actorRef.getSnapshot().context.history),\n canUndo: () => canUndo(actorRef.getSnapshot().context.history),\n dispatch,\n model,\n redo,\n setModel,\n undo,\n }),\n [actorRef, dispatch, model, redo, setModel, undo],\n );\n};\n\nexport { useDashfooStore };\nexport type { DashfooStore, UseDashfooStoreOptions };\n","import type { Point, Rect } from \"@dashfoo/core\";\n\ntype Zone = { height: number; width: number; x: number; y: number };\n\nconst pointInRect = (point: Point, rect: Rect): boolean =>\n point.x >= rect.x &&\n point.x <= rect.x + rect.width &&\n point.y >= rect.y &&\n point.y <= rect.y + rect.height;\n\nconst insertionIndex = (rects: ReadonlyArray<Rect>, pointerX: number): number => {\n const found = rects.findIndex((rect) => pointerX < rect.x + rect.width / 2);\n return found === -1 ? rects.length : found;\n};\n\nconst INSERTION_LINE_WIDTH = 4;\n\nconst insertionLineRect = (\n stripRect: Rect,\n itemRects: ReadonlyArray<Rect>,\n index: number,\n): Zone => {\n const at = itemRects[index];\n const last = itemRects.at(-1);\n const x = at?.x ?? (last ? last.x + last.width : stripRect.x);\n const left = x - INSERTION_LINE_WIDTH / 2;\n return {\n height: stripRect.height,\n width: INSERTION_LINE_WIDTH,\n x: Math.max(stripRect.x, Math.min(left, stripRect.x + stripRect.width - INSERTION_LINE_WIDTH)),\n y: stripRect.y,\n };\n};\n\nconst shouldAllowDrop = (\n draggedId: string | undefined,\n targetId: string,\n tabIds: ReadonlyArray<string>,\n): boolean => {\n if (draggedId === `grip-${targetId}`) {\n return false;\n }\n if (tabIds.length === 1 && tabIds[0] === draggedId) {\n return false;\n }\n return true;\n};\n\nexport { insertionIndex, insertionLineRect, pointInRect, shouldAllowDrop };\nexport type { Zone };\n","\"use client\";\n\nimport type { dragDockMachine, Point } from \"@dashfoo/core\";\nimport { zoneRect } from \"@dashfoo/core\";\nimport type { DragDropManager } from \"@dnd-kit/dom\";\nimport { Feedback } from \"@dnd-kit/dom\";\nimport { useSelector } from \"@xstate/react\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport type { ActorRefFrom } from \"xstate\";\n\nimport type { Zone } from \"../lib/tab-insertion\";\nimport { insertionLineRect } from \"../lib/tab-insertion\";\n\ntype DragActor = ActorRefFrom<typeof dragDockMachine>;\n\nconst overlayBase: CSSProperties = {\n boxSizing: \"border-box\",\n pointerEvents: \"none\",\n position: \"fixed\",\n\n transition: \"var(--dashfoo-dock-transition, left 60ms, top 60ms, width 60ms, height 60ms)\",\n zIndex: 9999,\n};\n\nconst paneStyle = (zone: Zone): CSSProperties => ({\n ...overlayBase,\n background: \"var(--dashfoo-dock-fill, oklch(0.556 0 0 / 0.18))\",\n border:\n \"var(--dashfoo-dock-border-width, 1px) solid var(--dashfoo-dock-border, oklch(0.708 0 0 / 0.75))\",\n borderRadius: \"var(--dashfoo-dock-radius, 6px)\",\n height: zone.height,\n left: zone.x,\n top: zone.y,\n width: zone.width,\n});\n\nconst lineStyle = (zone: Zone): CSSProperties => ({\n ...paneStyle(zone),\n borderRadius: \"var(--dashfoo-dock-line-radius, 2px)\",\n});\n\nconst tabItemRects = (strip: Element, excludeId?: string): Array<DOMRect> =>\n [...strip.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab-item\"]')].flatMap((item) =>\n item.querySelector<HTMLElement>('[data-dashfoo=\"tab\"]')?.dataset.tabId === excludeId\n ? []\n : [item.getBoundingClientRect()],\n );\n\nconst DockIndicator = ({\n actorRef,\n getTabsetElement,\n}: {\n actorRef: DragActor;\n getTabsetElement: (id: string) => HTMLElement | undefined;\n}): ReactNode => {\n const intent = useSelector(actorRef, (snapshot) => snapshot.context.intent);\n const draggedId = useSelector(actorRef, (snapshot) => snapshot.context.subject?.id);\n if (!intent) {\n return null;\n }\n const element = getTabsetElement(intent.targetId);\n if (!element) {\n return null;\n }\n\n const zIndex = element.closest('[data-dashfoo=\"float\"]') ? overlayBase.zIndex : \"auto\";\n if (intent.location === \"center\") {\n const strip = element.querySelector('[data-dashfoo=\"tabstrip\"]');\n if (strip) {\n const line = insertionLineRect(\n strip.getBoundingClientRect(),\n tabItemRects(strip, draggedId),\n intent.index ?? 0,\n );\n return <div data-dashfoo=\"dock-indicator\" style={{ ...lineStyle(line), zIndex }} />;\n }\n }\n const zone = zoneRect(element.getBoundingClientRect(), intent.location);\n return <div data-dashfoo=\"dock-indicator\" style={{ ...paneStyle(zone), zIndex }} />;\n};\n\nconst PREVIEW_OFFSET: Point = { x: 12, y: 8 };\n\nconst labelOf = (source: { data?: Record<string, unknown> } | null): string => {\n const raw = source?.data?.label;\n return typeof raw === \"string\" ? raw : \"\";\n};\n\ntype ChipState = { label: string; x: number; y: number };\n\nconst DragPreviewOverlay = ({ manager }: { manager: DragDropManager }): ReactNode => {\n const [chip, setChip] = useState<ChipState | null>(null);\n\n useEffect(() => {\n const offStart = manager.monitor.addEventListener(\"dragstart\", (event) => {\n const source = event.operation.source;\n if (!source) {\n return;\n }\n const rect = source.element?.getBoundingClientRect();\n const point = event.operation.position.current;\n setChip({\n label: labelOf(source),\n x: PREVIEW_OFFSET.x + (rect ? point.x - rect.left : 0),\n y: PREVIEW_OFFSET.y + (rect ? point.y - rect.top : 0),\n });\n });\n const offEnd = manager.monitor.addEventListener(\"dragend\", () => setChip(null));\n return () => {\n offStart();\n offEnd();\n };\n }, [manager]);\n\n const attachOverlay = useCallback(\n (element: HTMLDivElement | null): void => {\n const feedback = manager.registry.plugins.get(Feedback);\n if (feedback) {\n feedback.overlay = element ?? undefined;\n }\n },\n [manager],\n );\n\n return (\n <div data-dnd-overlay=\"\" ref={attachOverlay}>\n {chip === null ? null : (\n <div\n data-dashfoo=\"drag-preview\"\n style={{\n left: 0,\n position: \"absolute\",\n top: 0,\n transform: `translate(${chip.x}px, ${chip.y}px)`,\n\n width: \"max-content\",\n }}\n >\n {chip.label}\n </div>\n )}\n </div>\n );\n};\n\nexport { DockIndicator, DragPreviewOverlay };\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { useInsertionEffect, useState } from \"react\";\n\nimport {\n createDragManager,\n createDragSubjectStore,\n DragSubjectStoreContext,\n SharedDragManagerContext,\n} from \"../hooks/drag-hooks\";\n\nimport { DragPreviewOverlay } from \"./drag-overlays\";\n\nconst DashfooDragProvider = ({ children }: { children: ReactNode }): ReactNode => {\n const [manager] = useState(createDragManager);\n useInsertionEffect(() => () => manager.destroy(), [manager]);\n\n const [subjectStore] = useState(createDragSubjectStore);\n\n return (\n <SharedDragManagerContext.Provider value={manager}>\n <DragSubjectStoreContext.Provider value={subjectStore}>\n {children}\n {}\n <DragPreviewOverlay manager={manager} />\n </DragSubjectStoreContext.Provider>\n </SharedDragManagerContext.Provider>\n );\n};\n\nexport { DashfooDragProvider };\n","\"use client\";\n\nimport type { Action, SnapConfig, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport type { ReactNode } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { createStore, useStore } from \"zustand\";\n\ntype LayoutState = {\n closableTabs: boolean;\n dispatch: (action: Action) => void;\n draggableTabs: boolean;\n draggableTabsets: boolean;\n editable: boolean;\n\n floatable: boolean;\n keepMounted: boolean;\n maximizable: boolean;\n maximizedTabsetId: string | undefined;\n renamableTabs: boolean;\n renderTab: (tab: TabNode) => ReactNode;\n renderTabLabel: ((tab: TabNode) => ReactNode) | undefined;\n renderTabsetToolbar: ((tabset: TabsetNode) => ReactNode) | undefined;\n resizableSplits: boolean;\n\n snap: SnapConfig | null;\n splitDock: boolean;\n tabLocation: \"bottom\" | \"top\";\n tabsetMinSize: number;\n tabStripEnabled: boolean;\n};\n\ntype LayoutStore = StoreApi<LayoutState>;\n\nconst createLayoutStore = (initial: LayoutState): LayoutStore =>\n createStore<LayoutState>(() => initial);\n\nconst LayoutStoreContext = createContext<LayoutStore | null>(null);\n\nconst useLayout = <T>(selector: (state: LayoutState) => T): T => {\n const store = useContext(LayoutStoreContext);\n if (store === null) {\n throw new Error(\"dashfoo components must be rendered inside <DashfooLayout> or <Layout.Root>.\");\n }\n return useStore(store, selector);\n};\n\nexport { createLayoutStore, LayoutStoreContext, useLayout };\nexport type { LayoutState, LayoutStore };\n","const warned = new Set<string>();\n\nconst warnOnce = (key: string, message: string): void => {\n if (warned.has(key)) {\n return;\n }\n warned.add(key);\n // oxlint-disable-next-line no-console\n console.warn(`[dashfoo] ${message}`);\n};\n\nexport { warnOnce };\n","\"use client\";\n\nimport type { Action, DockLocation, DragSubject, DropIntent, Point } from \"@dashfoo/core\";\nimport { dragDockMachine, resolveDockTarget, tabNodeSchema } from \"@dashfoo/core\";\nimport type { DragEndEvent, DragStartEvent } from \"@dnd-kit/dom\";\nimport { useActorRef } from \"@xstate/react\";\nimport type { ReactNode } from \"react\";\nimport {\n useCallback,\n useContext,\n useEffect,\n useId,\n useInsertionEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport type { DragContextValue } from \"../hooks/drag-hooks\";\nimport {\n createDragManager,\n createDragSubjectStore,\n DragContext,\n DragSubjectStoreContext,\n sameDragSubject,\n sameDropIntent,\n SharedDragManagerContext,\n} from \"../hooks/drag-hooks\";\nimport { LayoutStoreContext } from \"../hooks/layout-store\";\nimport { insertionIndex, pointInRect, shouldAllowDrop } from \"../lib/tab-insertion\";\nimport { warnOnce } from \"../lib/warn-once\";\n\nimport { DockIndicator, DragPreviewOverlay } from \"./drag-overlays\";\n\nconst tabRects = (strip: Element, excludeId?: string): Array<DOMRect> =>\n [...strip.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')].flatMap((tab) =>\n tab.dataset.tabId === excludeId ? [] : [tab.getBoundingClientRect()],\n );\n\nconst intentForTabset = (\n id: string,\n element: HTMLElement,\n point: Point,\n draggedId?: string,\n): DropIntent => {\n const strip = element.querySelector('[data-dashfoo=\"tabstrip\"]');\n if (strip && pointInRect(point, strip.getBoundingClientRect())) {\n return {\n index: insertionIndex(tabRects(strip, draggedId), point.x),\n location: \"center\",\n targetId: id,\n };\n }\n const target = resolveDockTarget(point, element.getBoundingClientRect());\n const location: DockLocation = target.kind === \"tab\" ? \"center\" : `split-${target.edge}`;\n if (location === \"center\" && strip) {\n return { index: tabRects(strip, draggedId).length, location, targetId: id };\n }\n return { location, targetId: id };\n};\n\nconst isTabFactory = (value: unknown): value is () => unknown => typeof value === \"function\";\n\nconst subjectFor = (source: {\n data?: Record<string, unknown>;\n id: string | number;\n}): DragSubject | null => {\n const data = source.data;\n if (data?.type === \"tabset\") {\n return { id: String(data.tabsetId), kind: \"tabset\" };\n }\n if (data?.type === \"external\") {\n if (!isTabFactory(data.createTab)) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] external drag source is missing its createTab function\");\n return null;\n }\n let candidate: unknown;\n try {\n candidate = data.createTab();\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] external drag source createTab threw\", error);\n return null;\n }\n const parsed = tabNodeSchema.safeParse(candidate);\n if (!parsed.success) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] external drag source returned an invalid tab\", parsed.error);\n return null;\n }\n return { id: String(source.id), kind: \"external\", tab: parsed.data };\n }\n return { id: String(source.id), kind: \"tab\" };\n};\n\ntype DragProviderProps = {\n children: ReactNode;\n\n onCommit?: (action: Action) => void;\n\n splitDock?: boolean;\n};\n\nconst DragProvider = ({ children, onCommit, splitDock }: DragProviderProps): ReactNode => {\n const actorRef = useActorRef(dragDockMachine);\n\n const layoutStore = useContext(LayoutStoreContext);\n\n const sharedManager = useContext(SharedDragManagerContext);\n const [ownManager] = useState(() => (sharedManager ? null : createDragManager()));\n useInsertionEffect(() => () => ownManager?.destroy(), [ownManager]);\n const manager = sharedManager ?? ownManager;\n if (manager === null) {\n throw new Error(\n \"[dashfoo] DashfooDragProvider unmounted while its layout is still mounted; keep the provider above the layout or remount the layout\",\n );\n }\n\n const inheritedStore = useContext(DragSubjectStoreContext);\n const [subjectStore] = useState(() => inheritedStore ?? createDragSubjectStore());\n const ownerId = useId();\n useEffect(() => {\n const subscription = actorRef.subscribe((snapshot) => {\n const { intent, subject } = snapshot.context;\n const state = subjectStore.getState();\n if (intent !== null) {\n if (!sameDropIntent(state.intent, intent) || state.intentOwner !== ownerId) {\n subjectStore.setState({ intent, intentOwner: ownerId });\n }\n } else if (state.intent !== null && state.intentOwner === ownerId) {\n subjectStore.setState({ intent: null, intentOwner: null });\n }\n if (!sameDragSubject(subjectStore.getState().subject, subject)) {\n subjectStore.setState({ subject });\n }\n });\n return () => {\n subscription.unsubscribe();\n };\n }, [actorRef, ownerId, subjectStore]);\n\n const onCommitRef = useRef(onCommit);\n const splitDockRef = useRef(splitDock);\n useEffect(() => {\n onCommitRef.current = onCommit;\n splitDockRef.current = splitDock;\n });\n\n const getTabsetElement = useCallback(\n (id: string): HTMLElement | undefined => {\n const element = manager.registry.droppables.get(`${ownerId}:${id}`)?.element;\n return element instanceof HTMLElement ? element : undefined;\n },\n [manager, ownerId],\n );\n\n useEffect(() => {\n const subscription = actorRef.on(\"COMMIT\", (emitted) => {\n if (layoutStore?.getState().editable === false) {\n return;\n }\n const commit = onCommitRef.current ?? layoutStore?.getState().dispatch;\n if (!commit) {\n warnOnce(\n \"drag-layer-no-commit\",\n \"Layout.DragLayer has neither an onCommit prop nor a <Layout.Root> above it; drops are ignored\",\n );\n return;\n }\n commit(emitted.action);\n });\n return () => {\n subscription.unsubscribe();\n };\n }, [actorRef, layoutStore]);\n\n useEffect(() => {\n const resolveIntent = (\n targetId: string,\n element: HTMLElement,\n point: Point,\n draggedId?: string,\n ): DropIntent | null => {\n if (layoutStore?.getState().editable === false) {\n return null;\n }\n const tabIds = [...element.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')].map(\n (tab) => tab.dataset.tabId ?? \"\",\n );\n if (!shouldAllowDrop(draggedId, targetId, tabIds)) {\n return null;\n }\n const intent = intentForTabset(targetId, element, point, draggedId);\n\n const splitDockResolved = splitDockRef.current ?? layoutStore?.getState().splitDock ?? true;\n if (!splitDockResolved && intent.location.startsWith(\"split-\")) {\n return { location: \"center\", targetId };\n }\n return intent;\n };\n\n const handleStart = (event: DragStartEvent): void => {\n const source = event.operation.source;\n if (!source) {\n return;\n }\n const subject = subjectFor(source);\n if (!subject) {\n manager.actions.stop({ canceled: true });\n return;\n }\n actorRef.send({ subject, type: \"START\" });\n };\n\n const syncIntent = (): void => {\n const operation = manager.dragOperation;\n const point = operation.position.current;\n const target = operation.target;\n\n const data = target?.data as { layerId?: string; tabsetId?: string } | undefined;\n const tabsetId = data?.layerId === ownerId ? data.tabsetId : undefined;\n const element = tabsetId === undefined ? undefined : target?.element;\n const draggedId = operation.source ? String(operation.source.id) : undefined;\n actorRef.send({\n intent:\n tabsetId !== undefined && element instanceof HTMLElement\n ? resolveIntent(tabsetId, element, point, draggedId)\n : null,\n type: \"OVER\",\n });\n };\n\n const handleMove = (): void => syncIntent();\n const handleCollision = (): void => syncIntent();\n\n const handleEnd = (event: DragEndEvent): void => {\n if (event.canceled) {\n actorRef.send({ type: \"CANCEL\" });\n return;\n }\n syncIntent();\n actorRef.send({ type: \"DROP\" });\n };\n const offStart = manager.monitor.addEventListener(\"dragstart\", handleStart);\n const offMove = manager.monitor.addEventListener(\"dragmove\", handleMove);\n const offCollision = manager.monitor.addEventListener(\"collision\", handleCollision);\n const offEnd = manager.monitor.addEventListener(\"dragend\", handleEnd);\n return () => {\n offStart();\n offMove();\n offCollision();\n offEnd();\n };\n }, [actorRef, layoutStore, manager, ownerId]);\n\n const contextValue = useMemo<DragContextValue>(\n () => ({ layerId: ownerId, manager }),\n [manager, ownerId],\n );\n\n return (\n <DragContext.Provider value={contextValue}>\n <DragSubjectStoreContext.Provider value={subjectStore}>\n {children}\n <DockIndicator actorRef={actorRef} getTabsetElement={getTabsetElement} />\n {}\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 { Geometry } from \"@dashfoo/core\";\n\nconst MIN_WIDTH = 200;\nconst MIN_HEIGHT = 120;\n\nconst DEFAULT_WIDTH = 480;\nconst DEFAULT_HEIGHT = 340;\n\nconst LIFT_OFFSET = 16;\n\ntype Size = { height: number; width: number };\n\nconst clampToBounds = (rect: Geometry, bounds: Size, size: Size = rect): Geometry => ({\n height: rect.height,\n left: Math.max(0, Math.min(rect.left, Math.max(0, bounds.width - size.width))),\n top: Math.max(0, Math.min(rect.top, Math.max(0, bounds.height - size.height))),\n width: rect.width,\n});\n\nconst measureFloatRect = (element: Element): Geometry => {\n const tabsetElement = element.closest('[data-dashfoo=\"tabset\"]') ?? element;\n const rect = tabsetElement.getBoundingClientRect();\n const seeded: Geometry = {\n height: Math.max(MIN_HEIGHT, Math.min(Math.round(rect.height), DEFAULT_HEIGHT)),\n left: Math.round(rect.left) + LIFT_OFFSET,\n top: Math.round(rect.top) + LIFT_OFFSET,\n width: Math.max(MIN_WIDTH, Math.min(Math.round(rect.width), DEFAULT_WIDTH)),\n };\n return clampToBounds(seeded, { height: window.innerHeight, width: window.innerWidth });\n};\n\ntype ResizeEdges = { x: -1 | 0 | 1; y: -1 | 0 | 1 };\n\nconst resizeRect = (start: Geometry, edges: ResizeEdges, dx: number, dy: number): Geometry => {\n let { height, left, top, width } = start;\n if (edges.x === 1) {\n width = Math.max(MIN_WIDTH, start.width + dx);\n } else if (edges.x === -1) {\n width = Math.max(MIN_WIDTH, start.width - dx);\n left = Math.max(0, start.left + (start.width - width));\n }\n if (edges.y === 1) {\n height = Math.max(MIN_HEIGHT, start.height + dy);\n } else if (edges.y === -1) {\n height = Math.max(MIN_HEIGHT, start.height - dy);\n top = Math.max(0, start.top + (start.height - height));\n }\n return { height, left, top, width };\n};\n\nexport { clampToBounds, measureFloatRect, resizeRect };\nexport type { ResizeEdges, Size };\n","import type { CSSProperties } from \"react\";\n\nimport type { ResizeEdges } from \"../lib/float-geometry\";\n\nconst EDGE_THICKNESS = 12;\nconst EDGE_OFFSET = -(EDGE_THICKNESS / 2);\n\nconst CORNER_SIZE = 20;\nconst CORNER_OFFSET = -8;\n\nconst EDGE_INSET = CORNER_SIZE + CORNER_OFFSET;\n\nconst RESIZE_HANDLES: ReadonlyArray<{ edges: ResizeEdges; key: string; style: CSSProperties }> = [\n {\n edges: { x: 0, y: -1 },\n key: \"n\",\n style: {\n cursor: \"ns-resize\",\n height: EDGE_THICKNESS,\n insetInline: EDGE_INSET,\n top: EDGE_OFFSET,\n },\n },\n {\n edges: { x: 0, y: 1 },\n key: \"s\",\n style: {\n bottom: EDGE_OFFSET,\n cursor: \"ns-resize\",\n height: EDGE_THICKNESS,\n insetInline: EDGE_INSET,\n },\n },\n {\n edges: { x: 1, y: 0 },\n key: \"e\",\n style: {\n cursor: \"ew-resize\",\n insetBlock: EDGE_INSET,\n right: EDGE_OFFSET,\n width: EDGE_THICKNESS,\n },\n },\n {\n edges: { x: -1, y: 0 },\n key: \"w\",\n style: {\n cursor: \"ew-resize\",\n insetBlock: EDGE_INSET,\n left: EDGE_OFFSET,\n width: EDGE_THICKNESS,\n },\n },\n {\n edges: { x: 1, y: -1 },\n key: \"ne\",\n style: {\n cursor: \"nesw-resize\",\n height: CORNER_SIZE,\n right: CORNER_OFFSET,\n top: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n {\n edges: { x: -1, y: -1 },\n key: \"nw\",\n style: {\n cursor: \"nwse-resize\",\n height: CORNER_SIZE,\n left: CORNER_OFFSET,\n top: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n {\n edges: { x: 1, y: 1 },\n key: \"se\",\n style: {\n bottom: CORNER_OFFSET,\n cursor: \"nwse-resize\",\n height: CORNER_SIZE,\n right: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n {\n edges: { x: -1, y: 1 },\n key: \"sw\",\n style: {\n bottom: CORNER_OFFSET,\n cursor: \"nesw-resize\",\n height: CORNER_SIZE,\n left: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n];\n\nconst EDGE_BY_KEY = new Map<string, ResizeEdges>(RESIZE_HANDLES.map((h) => [h.key, h.edges]));\n\nexport { EDGE_BY_KEY, RESIZE_HANDLES };\n","\"use client\";\n\nimport type { Action, Dashfoo, SnapConfig, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport type { ComponentProps, CSSProperties, ReactNode, Ref } from \"react\";\nimport { useLayoutEffect, useState } from \"react\";\n\nimport type { LayoutState } from \"../hooks/layout-store\";\nimport { createLayoutStore, LayoutStoreContext } from \"../hooks/layout-store\";\n\nconst DEFAULT_TABSET_MIN_SIZE = 320;\n\nconst rootStyle = { display: \"flex\", height: \"100%\", position: \"relative\", width: \"100%\" } as const;\n\ntype LayoutRootProps = Omit<ComponentProps<\"div\">, \"children\"> & {\n children: ReactNode;\n closableTabs?: boolean;\n dispatch: (action: Action) => void;\n draggableTabs?: boolean;\n draggableTabsets?: boolean;\n\n editable?: boolean;\n\n floatable?: boolean;\n keepMounted?: boolean;\n maximizable?: boolean;\n model: Dashfoo;\n renamableTabs?: boolean;\n renderTab: (tab: TabNode) => ReactNode;\n renderTabLabel?: (tab: TabNode) => ReactNode;\n renderTabsetToolbar?: (tabset: TabsetNode) => ReactNode;\n resizableSplits?: boolean;\n\n rootRef?: Ref<HTMLDivElement>;\n\n snap?: SnapConfig;\n};\n\nconst LayoutRoot = ({\n children,\n closableTabs = true,\n dispatch,\n draggableTabs = true,\n draggableTabsets = true,\n editable = true,\n floatable = false,\n keepMounted = false,\n maximizable = true,\n model,\n renamableTabs = true,\n renderTab,\n renderTabLabel,\n renderTabsetToolbar,\n resizableSplits = true,\n rootRef,\n snap,\n style,\n ...props\n}: LayoutRootProps): ReactNode => {\n const global = model.global;\n const snapshot: LayoutState = {\n closableTabs: editable && closableTabs && global.tabEnableClose !== false,\n dispatch,\n draggableTabs: editable && draggableTabs && global.tabEnableDrag !== false,\n draggableTabsets: editable && draggableTabsets,\n editable,\n floatable: editable && floatable,\n keepMounted,\n maximizable: maximizable && global.tabSetEnableMaximize !== false,\n maximizedTabsetId: model.maximizedTabsetId,\n renamableTabs: editable && renamableTabs && global.tabEnableRename !== false,\n renderTab,\n renderTabLabel,\n renderTabsetToolbar,\n resizableSplits: editable && resizableSplits && global.enableSplitResize !== false,\n snap: snap ?? global.snap ?? null,\n splitDock: global.enableSplitDock !== false,\n tabLocation: global.tabLocation ?? \"top\",\n tabsetMinSize: global.tabSetMinSize ?? DEFAULT_TABSET_MIN_SIZE,\n tabStripEnabled: global.tabSetEnableTabStrip !== false,\n };\n\n const [store] = useState(() => createLayoutStore(snapshot));\n\n useLayoutEffect(() => {\n store.setState(snapshot);\n });\n\n const layoutStyle: CSSProperties =\n global.splitterSize === undefined\n ? { ...rootStyle, ...style }\n : ({\n ...rootStyle,\n \"--dashfoo-splitter-size\": `${global.splitterSize}px`,\n ...style,\n } as CSSProperties);\n\n return (\n <LayoutStoreContext.Provider value={store}>\n <div {...props} data-dashfoo=\"layout\" ref={rootRef} style={layoutStyle}>\n {children}\n </div>\n </LayoutStoreContext.Provider>\n );\n};\n\nexport { LayoutRoot };\nexport type { LayoutRootProps };\n","const tabDomId = (tabsetId: string, tabId: string): string => `dashfoo-tab-${tabsetId}-${tabId}`;\nconst panelDomId = (tabsetId: string): string => `dashfoo-panel-${tabsetId}`;\n\nexport { panelDomId, tabDomId };\n","\"use client\";\n\nimport type { Action, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport { createContext, useContext } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { createStore, useStore } from \"zustand\";\n\nimport { tabDomId } from \"../../lib/tab-ids\";\nimport { warnOnce } from \"../../lib/warn-once\";\nimport type { OverflowItem } from \"../tab-overflow\";\n\ntype TabsetState = {\n activeTab: TabNode | undefined;\n cancelRename: () => void;\n closeTab: (tabId: string) => void;\n commitRename: (tabId: string, value: string) => void;\n dispatch: (action: Action) => void;\n editingTabId: string | null;\n isMaximized: boolean;\n node: TabsetNode;\n overflowItems: Array<OverflowItem>;\n registerRenameInput: () => () => void;\n registerTablist: (element: HTMLDivElement | null) => void;\n renameInputCount: number;\n renameTab: (tabId: string, name: string) => void;\n restoreFocus: boolean;\n selectOverflowTab: (tabId: string) => void;\n selectTab: (index: number, options?: { focus?: boolean }) => void;\n showMaximize: boolean;\n startEditing: (tabId: string) => void;\n tablistElement: HTMLDivElement | null;\n tabsClosable: boolean;\n tabsRenamable: boolean;\n toggleMaximize: () => void;\n visualSelected: number;\n};\n\ntype TabsetStore = StoreApi<TabsetState>;\n\ntype TabsetSnapshot = Pick<\n TabsetState,\n | \"activeTab\"\n | \"dispatch\"\n | \"isMaximized\"\n | \"node\"\n | \"showMaximize\"\n | \"tabsClosable\"\n | \"tabsRenamable\"\n | \"visualSelected\"\n>;\n\nconst tabButtonIn = (\n scope: HTMLElement | null,\n tabsetId: string,\n tabId: string,\n): HTMLElement | null =>\n scope?.querySelector<HTMLElement>(`#${CSS.escape(tabDomId(tabsetId, tabId))}`) ?? null;\n\nconst createTabsetStore = (initial: TabsetSnapshot): TabsetStore =>\n createStore<TabsetState>((set, get) => ({\n ...initial,\n cancelRename: () => set({ editingTabId: null }),\n closeTab: (tabId) => {\n set({ restoreFocus: true });\n get().dispatch({ tabId, type: \"deleteTab\" });\n },\n commitRename: (tabId, value) => {\n set({ editingTabId: null });\n const { node, renameTab } = get();\n const trimmed = value.trim();\n const current = node.children.find((tab) => tab.id === tabId)?.name;\n if (trimmed && trimmed !== current) {\n renameTab(tabId, trimmed);\n }\n },\n editingTabId: null,\n overflowItems: [],\n registerRenameInput: () => {\n set((state) => ({ renameInputCount: state.renameInputCount + 1 }));\n return () => set((state) => ({ renameInputCount: state.renameInputCount - 1 }));\n },\n registerTablist: (element) => {\n if (element) {\n const current = get().tablistElement;\n if (current && current !== element) {\n warnOnce(\n `duplicate-tablist-${get().node.id}`,\n \"more than one <Tabset.Tablist> under the same <Tabset.Root>; the last one wins for keyboard focus and overflow\",\n );\n }\n set({ tablistElement: element });\n return;\n }\n set({ tablistElement: null });\n },\n renameInputCount: 0,\n renameTab: (tabId, name) => get().dispatch({ name, tabId, type: \"renameTab\" }),\n restoreFocus: false,\n selectOverflowTab: (tabId) => {\n const { dispatch, node, tablistElement } = get();\n const index = node.children.findIndex((tab) => tab.id === tabId);\n if (index === -1) {\n return;\n }\n dispatch({ index, tabsetId: node.id, type: \"selectTab\" });\n tabButtonIn(tablistElement, node.id, tabId)?.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n });\n },\n selectTab: (index, options) => {\n const { dispatch, node, tablistElement } = get();\n dispatch({ index, tabsetId: node.id, type: \"selectTab\" });\n if (options?.focus) {\n const tabId = node.children[index]?.id;\n if (tabId) {\n tabButtonIn(tablistElement, node.id, tabId)?.focus();\n }\n }\n },\n startEditing: (tabId) => {\n const { node, renameInputCount, tabsRenamable } = get();\n const tab = node.children.find((child) => child.id === tabId);\n if (!tabsRenamable || tab?.enableRename === false) {\n return;\n }\n if (renameInputCount === 0) {\n warnOnce(\n `missing-rename-input-${node.id}`,\n \"startEditing needs a <Tabset.RenameInput> in the composition; ignoring\",\n );\n return;\n }\n set({ editingTabId: tabId });\n },\n tablistElement: null,\n toggleMaximize: () => {\n const { dispatch, isMaximized, node } = get();\n dispatch({ tabsetId: isMaximized ? null : node.id, type: \"setMaximizedTabset\" });\n },\n }));\n\nconst TabsetStoreContext = createContext<TabsetStore | null>(null);\n\nconst useTabset = <T>(selector: (state: TabsetState) => T): T => {\n const store = useContext(TabsetStoreContext);\n if (store === null) {\n throw new Error(\"dashfoo Tabset parts must be rendered inside <Tabset.Root>.\");\n }\n return useStore(store, selector);\n};\n\ntype TabContextValue = { index: number; tab: TabNode };\n\nconst TabContext = createContext<TabContextValue | null>(null);\n\nconst useTab = (): TabContextValue => {\n const value = useContext(TabContext);\n if (value === null) {\n throw new Error(\"dashfoo tab parts must be rendered inside <Tabset.Tab>.\");\n }\n return value;\n};\n\nexport { createTabsetStore, TabContext, TabsetStoreContext, useTab, useTabset };\nexport type { TabContextValue, TabsetSnapshot, TabsetState, TabsetStore };\n","\"use client\";\n\nimport type { TabNode } from \"@dashfoo/core\";\nimport type { ComponentProps, CSSProperties, ReactNode } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { panelDomId, tabDomId } from \"../../lib/tab-ids\";\n\nimport { useTabset } from \"./tabset-store\";\n\nconst contentStyle: CSSProperties = { flex: 1, minHeight: 0, overflow: \"auto\" };\n\nconst TabPanel = ({\n render,\n tab,\n}: {\n render?: (tab: TabNode) => ReactNode;\n tab: TabNode;\n}): ReactNode => {\n const renderTab = useLayout((state) => state.renderTab);\n return render ? render(tab) : renderTab(tab);\n};\n\ntype TabsetContentProps = Omit<ComponentProps<\"div\">, \"children\"> & {\n children?: (tab: TabNode) => ReactNode;\n};\n\nconst TabsetContent = ({ children, style, ...props }: TabsetContentProps): ReactNode => {\n const node = useTabset((state) => state.node);\n const visualSelected = useTabset((state) => state.visualSelected);\n const keepMounted = useLayout((state) => state.keepMounted);\n\n const mergedStyle = { ...contentStyle, ...style };\n\n if (keepMounted && node.children.length > 0) {\n return node.children.map((tab, index) => (\n <div\n {...props}\n aria-labelledby={tabDomId(node.id, tab.id)}\n data-dashfoo=\"tabcontent\"\n hidden={index !== visualSelected || undefined}\n id={index === visualSelected ? panelDomId(node.id) : undefined}\n key={tab.id}\n role={index === visualSelected ? \"tabpanel\" : undefined}\n style={mergedStyle}\n tabIndex={index === visualSelected ? 0 : undefined}\n >\n <TabPanel render={children} tab={tab} />\n </div>\n ));\n }\n\n const active = node.children[visualSelected];\n if (active) {\n return (\n <div\n {...props}\n aria-labelledby={tabDomId(node.id, active.id)}\n data-dashfoo=\"tabcontent\"\n id={panelDomId(node.id)}\n role=\"tabpanel\"\n style={mergedStyle}\n tabIndex={0}\n >\n <TabPanel render={children} tab={active} />\n </div>\n );\n }\n return <div {...props} data-dashfoo=\"tabcontent\" style={mergedStyle} />;\n};\n\nexport { TabsetContent };\nexport type { TabsetContentProps };\n","\"use client\";\n\nimport type { CSSProperties, FocusEvent, KeyboardEvent, ReactNode } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\n\nconst OverflowIcon = (): ReactNode => (\n <svg aria-hidden=\"true\" fill=\"currentColor\" height=\"10\" viewBox=\"0 0 10 10\" width=\"10\">\n <circle cx=\"2\" cy=\"5\" r=\"1\" />\n <circle cx=\"5\" cy=\"5\" r=\"1\" />\n <circle cx=\"8\" cy=\"5\" r=\"1\" />\n </svg>\n);\n\nconst menuStyle: CSSProperties = {\n position: \"absolute\",\n right: 0,\n top: \"100%\",\n zIndex: 10,\n};\n\ntype OverflowItem = { id: string; name: string };\n\nconst TabOverflowMenu = ({\n items,\n onSelect,\n}: {\n items: Array<OverflowItem>;\n onSelect: (id: string) => void;\n}): ReactNode => {\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(0);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const handlePointerDown = (event: PointerEvent): void => {\n if (event.target instanceof Node && !rootRef.current?.contains(event.target)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [open]);\n\n useEffect(() => {\n if (open) {\n itemRefs.current[0]?.focus();\n }\n }, [open]);\n\n const closeAndReturnFocus = (): void => {\n setOpen(false);\n triggerRef.current?.focus();\n };\n\n const focusItem = (index: number): void => {\n setActiveIndex(index);\n itemRefs.current[index]?.focus();\n };\n\n const handleToggle = (): void => {\n setActiveIndex(0);\n setOpen((value) => !value);\n };\n\n const handleSelect = (id: string): void => {\n onSelect(id);\n closeAndReturnFocus();\n };\n\n const handleMenuKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n const last = items.length - 1;\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n focusItem(activeIndex >= last ? 0 : activeIndex + 1);\n break;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n focusItem(activeIndex <= 0 ? last : activeIndex - 1);\n break;\n }\n case \"Home\": {\n event.preventDefault();\n focusItem(0);\n break;\n }\n case \"End\": {\n event.preventDefault();\n focusItem(last);\n break;\n }\n case \"Escape\": {\n event.preventDefault();\n closeAndReturnFocus();\n break;\n }\n default: {\n break;\n }\n }\n };\n\n const handleFocusOut = (event: FocusEvent<HTMLDivElement>): void => {\n if (event.relatedTarget instanceof Node && rootRef.current?.contains(event.relatedTarget)) {\n return;\n }\n setOpen(false);\n };\n\n return (\n <div data-dashfoo=\"tab-overflow-root\" ref={rootRef} style={{ position: \"relative\" }}>\n <button\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-label=\"More tabs\"\n data-dashfoo=\"tab-overflow\"\n onClick={handleToggle}\n ref={triggerRef}\n title=\"More tabs\"\n type=\"button\"\n >\n <OverflowIcon />\n </button>\n {open ? (\n <div\n data-dashfoo=\"tab-overflow-menu\"\n onBlur={handleFocusOut}\n onKeyDown={handleMenuKeyDown}\n role=\"menu\"\n style={menuStyle}\n tabIndex={-1}\n >\n {items.map((item, index) => (\n <button\n data-dashfoo=\"tab-overflow-item\"\n key={item.id}\n onClick={() => handleSelect(item.id)}\n ref={(node) => {\n itemRefs.current[index] = node;\n }}\n role=\"menuitem\"\n tabIndex={index === activeIndex ? 0 : -1}\n type=\"button\"\n >\n {item.name}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n );\n};\n\nexport { TabOverflowMenu };\nexport type { OverflowItem };\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport { TabOverflowMenu } from \"../tab-overflow\";\n\nimport { useTabset } from \"./tabset-store\";\n\nconst TabsetOverflowMenu = (): ReactNode => {\n const overflowItems = useTabset((state) => state.overflowItems);\n const selectOverflowTab = useTabset((state) => state.selectOverflowTab);\n\n if (overflowItems.length === 0) {\n return null;\n }\n return <TabOverflowMenu items={overflowItems} onSelect={selectOverflowTab} />;\n};\n\nexport { TabsetOverflowMenu };\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst overflowingIds = (tablist: Element): Array<string> => {\n const box = tablist.getBoundingClientRect();\n return [...tablist.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')].flatMap((tab) => {\n const rect = tab.getBoundingClientRect();\n const clipped = rect.right > box.right + 1 || rect.left < box.left - 1;\n return clipped && tab.dataset.tabId ? [tab.dataset.tabId] : [];\n });\n};\n\nconst useTabOverflow = (tablist: HTMLElement | null, signature: string): Array<string> => {\n const [overflow, setOverflow] = useState<Array<string>>([]);\n\n useEffect(() => {\n const recompute = (): void => {\n setOverflow((previous) => {\n const next = tablist ? overflowingIds(tablist) : [];\n return next.length === 0 && previous.length === 0 ? previous : next;\n });\n };\n recompute();\n if (!tablist) {\n return;\n }\n const observer = new ResizeObserver(recompute);\n observer.observe(tablist);\n\n tablist.addEventListener(\"scroll\", recompute, { passive: true });\n return () => {\n observer.disconnect();\n tablist.removeEventListener(\"scroll\", recompute);\n };\n }, [tablist, signature]);\n\n return overflow;\n};\n\nexport { overflowingIds, useTabOverflow };\n","const fallbackSelectedIndex = (count: number, removedIndex: number): number =>\n removedIndex + 1 < count ? removedIndex + 1 : removedIndex - 1;\n\nexport { fallbackSelectedIndex };\n","\"use client\";\n\nimport type { TabsetNode } from \"@dashfoo/core\";\nimport type { ComponentProps, CSSProperties, ReactNode } from \"react\";\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { useStore } from \"zustand\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { useTabOverflow } from \"../../hooks/use-tab-overflow\";\nimport { tabDomId } from \"../../lib/tab-ids\";\nimport { fallbackSelectedIndex } from \"../../lib/tab-selection\";\nimport { useDragSubject, useTabsetDroppable } from \"../drag-adapter\";\n\nimport type { TabsetSnapshot } from \"./tabset-store\";\nimport { createTabsetStore, TabsetStoreContext } from \"./tabset-store\";\n\nconst tabsetStyle: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n minHeight: 0,\n minWidth: 0,\n width: \"100%\",\n};\n\ntype TabsetRootProps = ComponentProps<\"div\"> & { node: TabsetNode };\n\nconst TabsetRoot = ({\n children,\n node,\n ref: userRef,\n style,\n ...props\n}: TabsetRootProps): ReactNode => {\n const closableTabs = useLayout((state) => state.closableTabs);\n const dispatch = useLayout((state) => state.dispatch);\n const maximizable = useLayout((state) => state.maximizable);\n const maximizedTabsetId = useLayout((state) => state.maximizedTabsetId);\n const renamableTabs = useLayout((state) => state.renamableTabs);\n const tabLocation = useLayout((state) => state.tabLocation);\n\n const { ref } = useTabsetDroppable(node.id);\n const dragSubject = useDragSubject();\n const tabsetRef = useRef<HTMLDivElement | null>(null);\n\n const isMaximized = maximizedTabsetId === node.id;\n const showMaximize = maximizable && node.enableMaximize !== false;\n const tabsClosable = closableTabs && node.enableClose !== false;\n\n const tabsRenamable = renamableTabs;\n\n const draggingTabIndex =\n dragSubject?.kind === \"tab\" ? node.children.findIndex((tab) => tab.id === dragSubject.id) : -1;\n const visualSelected =\n draggingTabIndex !== -1 && draggingTabIndex === node.selected\n ? fallbackSelectedIndex(node.children.length, draggingTabIndex)\n : node.selected;\n const activeTab = node.children[visualSelected];\n const isDragSource = dragSubject?.kind === \"tabset\" && dragSubject.id === node.id;\n\n const snapshot: TabsetSnapshot = {\n activeTab,\n dispatch,\n isMaximized,\n node,\n showMaximize,\n tabsClosable,\n tabsRenamable,\n visualSelected,\n };\n const [store] = useState(() => createTabsetStore(snapshot));\n\n useLayoutEffect(() => {\n store.setState(snapshot);\n });\n\n const tablistElement = useStore(store, (state) => state.tablistElement);\n\n const overflowSignature = node.children.map((tab) => `${tab.id}:${tab.name}`).join(\"|\");\n const overflow = useTabOverflow(tablistElement, overflowSignature);\n\n const overflowItems = useMemo(() => {\n const names = new Map(node.children.map((tab) => [tab.id, tab.name]));\n return overflow.map((id) => ({ id, name: names.get(id) ?? id }));\n }, [overflow, node.children]);\n useLayoutEffect(() => {\n store.setState({ overflowItems });\n }, [overflowItems, store]);\n\n useEffect(() => {\n if (!store.getState().restoreFocus) {\n return;\n }\n store.setState({ restoreFocus: false });\n const activeTabId = node.children[node.selected]?.id;\n if (activeTabId) {\n tabsetRef.current\n ?.querySelector<HTMLElement>(`#${CSS.escape(tabDomId(node.id, activeTabId))}`)\n ?.focus();\n } else {\n tabsetRef.current?.focus();\n }\n }, [node.children, node.selected, node.id, store]);\n\n return (\n <TabsetStoreContext.Provider value={store}>\n <div\n {...props}\n data-dashfoo=\"tabset\"\n data-dragging-source={isDragSource || undefined}\n data-tab-location={tabLocation}\n ref={(element) => {\n ref(element);\n tabsetRef.current = element;\n if (typeof userRef === \"function\") {\n userRef(element);\n } else if (userRef) {\n userRef.current = element;\n }\n }}\n style={{ ...tabsetStyle, ...style }}\n tabIndex={-1}\n >\n {children}\n </div>\n </TabsetStoreContext.Provider>\n );\n};\n\nexport { TabsetRoot };\nexport type { TabsetRootProps };\n","import type { Ref } from \"react\";\n\nconst applyRef = <T>(ref: Ref<T> | undefined, value: T | null): void => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n};\n\nconst mergeRefs =\n <T>(...refs: Array<Ref<T> | undefined>) =>\n (value: T | null): void => {\n for (const ref of refs) {\n applyRef(ref, value);\n }\n };\n\nexport { mergeRefs };\n","\"use client\";\n\nimport type { TabNode } from \"@dashfoo/core\";\nimport type { ComponentProps, MouseEvent, ReactNode } from \"react\";\nimport { useContext, useEffect, useMemo, useRef } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { panelDomId, tabDomId } from \"../../lib/tab-ids\";\nimport { warnOnce } from \"../../lib/warn-once\";\nimport { useDragSubject, useTabDraggable } from \"../drag-adapter\";\n\nimport { TabContext, TabsetStoreContext, useTab, useTabset } from \"./tabset-store\";\n\ntype TabsetTabProps = ComponentProps<\"span\"> & { tab: TabNode };\n\nconst TabsetTab = ({ children, ref: userRef, tab, ...props }: TabsetTabProps): ReactNode => {\n const store = useContext(TabsetStoreContext);\n const node = useTabset((state) => state.node);\n const editing = useTabset((state) => state.editingTabId === tab.id);\n\n const dragSubject = useDragSubject();\n const isDragging = dragSubject?.kind === \"tab\" && dragSubject.id === tab.id;\n const itemRef = useRef<HTMLSpanElement | null>(null);\n const wasEditing = useRef(false);\n\n const index = node.children.findIndex((child) => child.id === tab.id);\n\n const orphanAtRender = index === -1;\n useEffect(() => {\n const settled = store?.getState().node.children.some((child) => child.id === tab.id);\n if (settled === false) {\n warnOnce(\n `orphan-tab-${tab.id}`,\n `<Tabset.Tab> for \"${tab.id}\" is not a child of its Tabset.Root's node; it renders but can never be selected`,\n );\n }\n }, [orphanAtRender, store, tab.id]);\n\n useEffect(() => {\n if (wasEditing.current && !editing) {\n itemRef.current?.querySelector<HTMLElement>('[data-dashfoo=\"tab\"]')?.focus();\n }\n wasEditing.current = editing;\n }, [editing]);\n\n const contextValue = useMemo(() => ({ index, tab }), [index, tab]);\n const refCallback = useMemo(() => mergeRefs<HTMLSpanElement>(itemRef, userRef), [userRef]);\n\n return (\n <TabContext.Provider value={contextValue}>\n <span\n {...props}\n data-dashfoo=\"tab-item\"\n data-dragging={isDragging || undefined}\n ref={refCallback}\n >\n {children}\n </span>\n </TabContext.Provider>\n );\n};\n\ntype TabsetTriggerProps = ComponentProps<\"button\">;\n\nconst TabsetTrigger = ({\n children,\n onClick,\n onDoubleClick,\n ref: userRef,\n ...props\n}: TabsetTriggerProps): ReactNode => {\n const { index, tab } = useTab();\n const node = useTabset((state) => state.node);\n const editing = useTabset((state) => state.editingTabId === tab.id);\n const selectTab = useTabset((state) => state.selectTab);\n const startEditing = useTabset((state) => state.startEditing);\n const tabsRenamable = useTabset((state) => state.tabsRenamable);\n const visualSelected = useTabset((state) => state.visualSelected);\n const draggableTabs = useLayout((state) => state.draggableTabs);\n const renderTabLabel = useLayout((state) => state.renderTabLabel);\n const { ref } = useTabDraggable(tab.id, !draggableTabs || tab.enableDrag === false, tab.name);\n const refCallback = useMemo(() => mergeRefs<HTMLButtonElement>(ref, userRef), [ref, userRef]);\n\n if (editing) {\n return null;\n }\n\n const selected = index === visualSelected;\n const renamable = tabsRenamable && tab.enableRename !== false;\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n selectTab(index);\n };\n\n const handleDoubleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onDoubleClick?.(event);\n if (renamable) {\n startEditing(tab.id);\n }\n };\n\n return (\n <button\n aria-label={renderTabLabel ? tab.name : undefined}\n {...props}\n aria-controls={panelDomId(node.id)}\n aria-selected={selected}\n data-dashfoo=\"tab\"\n data-tab-id={tab.id}\n id={tabDomId(node.id, tab.id)}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n ref={refCallback}\n role=\"tab\"\n tabIndex={selected ? 0 : -1}\n type=\"button\"\n >\n {children ?? (renderTabLabel ? renderTabLabel(tab) : tab.name)}\n </button>\n );\n};\n\nexport { TabsetTab, TabsetTrigger };\nexport type { TabsetTabProps, TabsetTriggerProps };\n","import type { CSSProperties, ReactNode } from \"react\";\n\nconst iconStyle: CSSProperties = { pointerEvents: \"none\" };\n\nconst Icon = ({ children }: { children: ReactNode }): ReactNode => (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"12\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n style={iconStyle}\n viewBox=\"0 0 24 24\"\n width=\"12\"\n >\n {children}\n </svg>\n);\n\nconst CloseIcon = (): ReactNode => (\n <Icon>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </Icon>\n);\n\nconst GripIcon = (): ReactNode => (\n <Icon>\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"19\" cy=\"5\" r=\"1\" />\n <circle cx=\"5\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n <circle cx=\"19\" cy=\"19\" r=\"1\" />\n <circle cx=\"5\" cy=\"19\" r=\"1\" />\n </Icon>\n);\n\nconst MaximizeIcon = ({ maximized }: { maximized: boolean }): ReactNode =>\n maximized ? (\n <Icon>\n <path d=\"m14 10 7-7\" />\n <path d=\"M20 10h-6V4\" />\n <path d=\"m3 21 7-7\" />\n <path d=\"M4 14h6v6\" />\n </Icon>\n ) : (\n <Icon>\n <path d=\"M15 3h6v6\" />\n <path d=\"m21 3-7 7\" />\n <path d=\"m3 21 7-7\" />\n <path d=\"M9 21H3v-6\" />\n </Icon>\n );\n\nconst FloatIcon = (): ReactNode => (\n <Icon>\n <rect height=\"14\" rx=\"2\" width=\"18\" x=\"3\" y=\"6\" />\n <path d=\"M3 10h18\" />\n </Icon>\n);\n\nconst MinimizeIcon = (): ReactNode => (\n <Icon>\n <path d=\"M5 12h14\" />\n </Icon>\n);\n\nconst DockIcon = (): ReactNode => (\n <Icon>\n <path d=\"M3 7V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-2\" />\n <path d=\"M11 8 7 12l4 4\" />\n <path d=\"M7 12h10\" />\n </Icon>\n);\n\nexport { CloseIcon, DockIcon, FloatIcon, GripIcon, MaximizeIcon, MinimizeIcon };\n","\"use client\";\n\nimport type { ComponentProps, FocusEvent, KeyboardEvent, MouseEvent, ReactNode } from \"react\";\nimport { useEffect, useMemo, useRef } from \"react\";\n\nimport { 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 ref = useRef<HTMLInputElement | null>(null);\n const done = useRef(false);\n const refCallback = useMemo(() => mergeRefs<HTMLInputElement>(ref, userRef), [userRef]);\n\n useEffect(() => {\n ref.current?.focus();\n ref.current?.select();\n }, []);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>): void => {\n onKeyDown?.(event);\n if (event.key === \"Enter\") {\n done.current = true;\n commitRename(tab.id, event.currentTarget.value);\n } else if (event.key === \"Escape\") {\n done.current = true;\n cancelRename();\n }\n };\n\n const handleCommitOnBlur = (event: FocusEvent<HTMLInputElement>): void => {\n onBlur?.(event);\n if (done.current) {\n return;\n }\n done.current = true;\n commitRename(tab.id, event.currentTarget.value);\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 { 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 { GroupImperativeHandle, Layout, Orientation } 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 measured = useRef(false);\n const groupRef = useRef<GroupImperativeHandle | null>(null);\n const groupElement = useRef<HTMLDivElement | null>(null);\n const syncing = useRef(false);\n\n const activeBoundary = useRef<number | null>(null);\n const snapping = useRef(false);\n const snappedBoundaryRef = useRef<number | null>(null);\n const [snappedBoundary, setSnappedBoundary] = useState<number | null>(null);\n\n const setHighlight = (boundary: number | null): void => {\n if (boundary !== snappedBoundaryRef.current) {\n snappedBoundaryRef.current = boundary;\n setSnappedBoundary(boundary);\n }\n };\n\n const setSnapTransition = (active: boolean): void => {\n const element = groupElement.current;\n if (!element) {\n return;\n }\n if (active) {\n element.dataset.dashfooSnapping = \"true\";\n } else {\n delete element.dataset.dashfooSnapping;\n }\n };\n\n useLayoutEffect(() => {\n const group = groupRef.current;\n if (!group) {\n return;\n }\n const current = group.getLayout();\n const samePanelSet =\n Object.keys(current).length === Object.keys(desiredLayout).length &&\n Object.keys(desiredLayout).every((id) => id in current);\n if (!samePanelSet || layoutsMatch(current, desiredLayout)) {\n return;\n }\n\n syncing.current = true;\n group.setLayout(desiredLayout);\n const frame = requestAnimationFrame(() => {\n syncing.current = false;\n });\n return () => {\n cancelAnimationFrame(frame);\n syncing.current = false;\n };\n }, [desiredLayout]);\n\n const handleLayoutChange = (layout: Layout): void => {\n if (snapping.current || syncing.current || !resizableSplits) {\n return;\n }\n if (effectiveSnap === null || !snapActive) {\n return;\n }\n const boundary = activeBoundary.current;\n if (boundary === null) {\n return;\n }\n\n const { sizes, snapped } = snapSizes(\n orderedFromLayout(layout, node.children),\n boundary,\n effectiveSnap,\n );\n setHighlight(snapped ? boundary : null);\n if (!snapped) {\n setSnapTransition(false);\n return;\n }\n\n setSnapTransition(true);\n const group = groupRef.current;\n const target = layoutFromOrdered(sizes, node.children);\n if (!group || layoutsMatch(layout, target)) {\n return;\n }\n snapping.current = true;\n group.setLayout(target);\n snapping.current = false;\n };\n\n const handleLayoutChanged = (layout: Layout): void => {\n if (!measured.current) {\n measured.current = true;\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 {}\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 {\n CSSProperties,\n FocusEvent as ReactFocusEvent,\n KeyboardEvent as ReactKeyboardEvent,\n PointerEvent as ReactPointerEvent,\n ReactNode,\n} from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { useLayout } from \"../hooks/layout-store\";\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 ref = useRef<HTMLInputElement | null>(null);\n const done = useRef(false);\n useEffect(() => {\n ref.current?.focus();\n ref.current?.select();\n }, []);\n\n const commit = (value: string): void => {\n const trimmed = value.trim();\n if (trimmed && trimmed !== floatTitle(node)) {\n dispatch({ floatId: node.id, name: trimmed, type: \"renameFloat\" });\n }\n onDone();\n };\n\n const handleKeyDown = (event: ReactKeyboardEvent<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: ReactFocusEvent<HTMLInputElement>): void => {\n if (done.current) {\n return;\n }\n done.current = true;\n commit(event.currentTarget.value);\n };\n\n return (\n <input\n aria-label={`Rename ${floatTitle(node)}`}\n data-dashfoo=\"float-rename\"\n defaultValue={floatTitle(node)}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onPointerDown={(event) => event.stopPropagation()}\n ref={ref}\n style={titleStyle}\n type=\"text\"\n />\n );\n};\n\nconst FloatTitle = ({\n dispatch,\n node,\n renamable,\n}: TitleProps & { renamable: boolean }): ReactNode => {\n const [editing, setEditing] = useState(false);\n if (renamable && editing) {\n return <FloatTitleEditor dispatch={dispatch} node={node} onDone={() => setEditing(false)} />;\n }\n return (\n <span\n data-dashfoo=\"float-title\"\n onDoubleClick={renamable ? () => setEditing(true) : undefined}\n style={titleStyle}\n title={renamable ? \"Double-click to rename\" : undefined}\n >\n {floatTitle(node)}\n </span>\n );\n};\n\ntype FloatPanelProps = {\n global: GlobalAttributes;\n node: FloatNode;\n onFocus: () => void;\n zIndex: number;\n};\n\nconst FloatPanel = ({ global, node, onFocus, zIndex }: FloatPanelProps): ReactNode => {\n const dispatch = useLayout((state) => state.dispatch);\n const closableTabs = useLayout((state) => state.closableTabs);\n const draggableTabs = useLayout((state) => state.draggableTabs);\n const editable = useLayout((state) => state.editable);\n const renamableTabs = useLayout((state) => state.renamableTabs);\n const resizableSplits = useLayout((state) => state.resizableSplits);\n const keepMounted = useLayout((state) => state.keepMounted);\n const renderTab = useLayout((state) => state.renderTab);\n const renderTabLabel = useLayout((state) => state.renderTabLabel);\n const renderTabsetToolbar = useLayout((state) => state.renderTabsetToolbar);\n const snap = useLayout((state) => state.snap);\n\n const panelRef = useRef<HTMLElement | null>(null);\n const gestureRef = useRef<Gesture | null>(null);\n const latestRef = useRef<Geometry>(node.geometry);\n const movedRef = useRef(false);\n const setPanel = (element: HTMLElement | null): void => {\n panelRef.current = element;\n };\n\n const restore = (): void => {\n if (!editable) {\n return;\n }\n dispatch({ floatId: node.id, minimized: false, type: \"setFloatMinimized\" });\n };\n\n const handlePointerDown = (event: ReactPointerEvent<HTMLElement>): void => {\n const panel = panelRef.current;\n\n if (!panel || !editable) {\n return;\n }\n\n const prior = gestureRef.current;\n if (prior && panel.hasPointerCapture?.(prior.pointerId)) {\n panel.releasePointerCapture(prior.pointerId);\n }\n movedRef.current = false;\n const edgeKey = event.currentTarget.dataset.edge;\n\n const parent = panel.offsetParent as HTMLElement | null;\n const gesture: Gesture = {\n bounds: { height: parent?.clientHeight ?? 0, width: parent?.clientWidth ?? 0 },\n edges: edgeKey ? (EDGE_BY_KEY.get(edgeKey) ?? null) : null,\n pointerId: event.pointerId,\n start: node.geometry,\n startX: event.clientX,\n startY: event.clientY,\n };\n gestureRef.current = gesture;\n latestRef.current = node.geometry;\n\n if (gesture.edges) {\n panel.setPointerCapture(event.pointerId);\n }\n };\n\n const handlePointerUp = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n if (!gesture || event.pointerId !== gesture.pointerId) {\n return;\n }\n gestureRef.current = null;\n\n const panel = panelRef.current;\n if (panel?.hasPointerCapture?.(event.pointerId)) {\n panel.releasePointerCapture(event.pointerId);\n }\n\n if (!movedRef.current) {\n if (node.minimized) {\n restore();\n }\n return;\n }\n dispatch({ floatId: node.id, geometry: latestRef.current, type: \"moveFloat\" });\n };\n\n const handlePointerMove = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n const panel = panelRef.current;\n if (!gesture || !panel || event.pointerId !== gesture.pointerId) {\n return;\n }\n\n if (event.buttons === 0) {\n handlePointerUp(event);\n return;\n }\n const dx = event.clientX - gesture.startX;\n const dy = event.clientY - gesture.startY;\n if (!movedRef.current) {\n if (Math.hypot(dx, dy) <= TAP_SLOP) {\n return;\n }\n movedRef.current = true;\n\n if (!gesture.edges) {\n panel.setPointerCapture(gesture.pointerId);\n }\n }\n const next = gesture.edges\n ? resizeRect(gesture.start, gesture.edges, dx, dy)\n : clampToBounds(\n { ...gesture.start, left: gesture.start.left + dx, top: gesture.start.top + dy },\n gesture.bounds,\n node.minimized ? CHIP_SIZE : undefined,\n );\n\n latestRef.current = next;\n panel.style.left = `${next.left}px`;\n panel.style.top = `${next.top}px`;\n\n if (!node.minimized) {\n panel.style.width = `${next.width}px`;\n panel.style.height = `${next.height}px`;\n }\n };\n\n const handlePointerCancel = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n const panel = panelRef.current;\n if (!gesture || !panel || event.pointerId !== gesture.pointerId) {\n return;\n }\n gestureRef.current = null;\n if (panel.hasPointerCapture?.(event.pointerId)) {\n panel.releasePointerCapture(event.pointerId);\n }\n if (!movedRef.current) {\n return;\n }\n panel.style.left = `${gesture.start.left}px`;\n panel.style.top = `${gesture.start.top}px`;\n if (!node.minimized) {\n panel.style.width = `${gesture.start.width}px`;\n panel.style.height = `${gesture.start.height}px`;\n }\n };\n\n if (node.minimized) {\n return (\n <button\n aria-label={`Restore ${floatTitle(node)} panel`}\n data-dashfoo=\"float-chip\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n restore();\n }\n }}\n onPointerCancel={handlePointerCancel}\n onPointerDown={handlePointerDown}\n onPointerDownCapture={onFocus}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n ref={setPanel}\n style={{\n left: node.geometry.left,\n pointerEvents: \"auto\",\n position: \"absolute\",\n top: node.geometry.top,\n zIndex,\n }}\n title={floatTitle(node)}\n type=\"button\"\n >\n <FloatIcon />\n <span data-dashfoo=\"float-chip-label\">{floatTitle(node)}</span>\n </button>\n );\n }\n\n const floatModel: Dashfoo = { global, layout: node.layout, version: 1 };\n\n return (\n <div\n data-dashfoo=\"float\"\n onPointerCancel={handlePointerCancel}\n onPointerDownCapture={onFocus}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n ref={setPanel}\n style={{\n height: node.geometry.height,\n left: node.geometry.left,\n\n pointerEvents: \"auto\",\n position: \"absolute\",\n top: node.geometry.top,\n width: node.geometry.width,\n zIndex,\n }}\n >\n <div\n data-dashfoo=\"float-titlebar\"\n onPointerDown={handlePointerDown}\n style={editable ? titleBarStyle : { ...titleBarStyle, cursor: \"default\" }}\n >\n <span aria-hidden=\"true\" data-dashfoo=\"float-grip\">\n <GripIcon />\n </span>\n <FloatTitle dispatch={dispatch} node={node} renamable={editable} />\n {editable && (\n <>\n <button\n aria-label=\"Minimize panel\"\n data-dashfoo=\"float-minimize\"\n onClick={() =>\n dispatch({ floatId: node.id, minimized: true, type: \"setFloatMinimized\" })\n }\n onPointerDown={(event) => event.stopPropagation()}\n style={dockButtonStyle}\n title=\"Minimize panel\"\n type=\"button\"\n >\n <MinimizeIcon />\n </button>\n <button\n aria-label=\"Dock panel back into the main layout\"\n data-dashfoo=\"float-dock\"\n onClick={() => dispatch({ floatId: node.id, type: \"dockFloat\" })}\n onPointerDown={(event) => event.stopPropagation()}\n style={dockButtonStyle}\n title=\"Dock panel back\"\n type=\"button\"\n >\n <DockIcon />\n </button>\n </>\n )}\n </div>\n <div data-dashfoo=\"float-body\" style={bodyStyle}>\n <LayoutRoot\n closableTabs={closableTabs}\n dispatch={dispatch}\n draggableTabs={draggableTabs}\n draggableTabsets={false}\n editable={editable}\n floatable={false}\n keepMounted={keepMounted}\n maximizable={false}\n model={floatModel}\n renamableTabs={renamableTabs}\n renderTab={renderTab}\n renderTabLabel={renderTabLabel}\n renderTabsetToolbar={renderTabsetToolbar}\n resizableSplits={resizableSplits}\n snap={snap ?? undefined}\n >\n {}\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 };\nexport type { FloatPanelProps };\n","\"use client\";\n\nimport type { FloatNode, GlobalAttributes } from \"@dashfoo/core\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { useState } from \"react\";\n\nimport { FloatLayerContext } from \"./float-context\";\nimport { FloatPanel } from \"./float-panel\";\n\nconst overlayStyle: CSSProperties = {\n inset: 0,\n\n pointerEvents: \"none\",\n position: \"fixed\",\n\n zIndex: 1,\n};\n\nconst FloatOverlay = ({\n floats,\n global,\n}: {\n floats: Array<FloatNode>;\n global: GlobalAttributes;\n}): ReactNode => {\n const [topId, setTopId] = useState<string | null>(null);\n if (floats.length === 0) {\n return null;\n }\n return (\n <div data-dashfoo=\"float-overlay\" style={overlayStyle}>\n {floats.map((node) => (\n <FloatPanel\n global={global}\n key={node.id}\n node={node}\n onFocus={() => setTopId(node.id)}\n zIndex={node.id === topId ? 2 : 1}\n />\n ))}\n </div>\n );\n};\n\ntype FloatLayerProps = {\n children: ReactNode;\n floats: Array<FloatNode>;\n global: GlobalAttributes;\n};\n\nconst FloatLayer = ({ children, floats, global }: FloatLayerProps): ReactNode => (\n <FloatLayerContext.Provider value>\n {children}\n <FloatOverlay floats={floats} global={global} />\n </FloatLayerContext.Provider>\n);\n\nexport { FloatLayer };\nexport type { FloatLayerProps };\n","\"use client\";\n\nimport { DragProvider } from \"./drag-adapter\";\nimport { FloatLayer } from \"./float-layer\";\nimport { LayoutRoot } from \"./layout-root\";\nimport { RowView } from \"./row-view\";\nimport { TabsetView } from \"./tabset/tabset-view\";\n\nconst Layout = {\n DragLayer: DragProvider,\n FloatLayer,\n Root: LayoutRoot,\n Rows: RowView,\n Tabset: TabsetView,\n} as const;\n\nexport { Layout };\nexport type { DragProviderProps as LayoutDragLayerProps } from \"./drag-adapter\";\nexport type { FloatLayerProps as LayoutFloatLayerProps } from \"./float-layer\";\nexport type { LayoutRootProps } from \"./layout-root\";\nexport type { RowViewProps as LayoutRowsProps } from \"./row-view\";\nexport type { TabsetViewProps as LayoutTabsetProps } from \"./tabset/tabset-view\";\n","\"use client\";\n\nimport type {\n Action,\n Dashfoo,\n DockLocation,\n Orientation,\n SnapConfig,\n TabNode,\n TabsetNode,\n} from \"@dashfoo/core\";\nimport { findTabset, stackModel } from \"@dashfoo/core\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport { forwardRef, useCallback, useContext, useImperativeHandle, useMemo, useRef } from \"react\";\n\nimport { SharedDragManagerContext } from \"../hooks/drag-hooks\";\nimport type { PersistConfig, StorageAdapter } from \"../hooks/persistence\";\nimport { localStorageAdapter, usePersistence } from \"../hooks/persistence\";\nimport { useContainerWidth } from \"../hooks/responsive\";\nimport { useDashfooStore } from \"../hooks/store\";\n\nimport { DashfooDragProvider } from \"./drag-root\";\nimport { Layout } from \"./layout\";\n\nconst DEFAULT_PERSIST_DEBOUNCE_MS = 300;\n\ntype PersistInput = string | { debounceMs?: number; key: string; storage?: StorageAdapter };\n\nconst resolvePersist = (\n persist: PersistInput | undefined,\n hasDefaultModel: boolean,\n): PersistConfig | null => {\n if (persist === undefined || !hasDefaultModel) {\n return null;\n }\n if (typeof persist === \"string\") {\n return { debounceMs: DEFAULT_PERSIST_DEBOUNCE_MS, key: persist, storage: localStorageAdapter };\n }\n return {\n debounceMs: persist.debounceMs ?? DEFAULT_PERSIST_DEBOUNCE_MS,\n key: persist.key,\n storage: persist.storage ?? localStorageAdapter,\n };\n};\n\ntype TabComponent = ComponentType<{ node: TabNode }>;\n\nconst warnedComponents = new Set<string>();\n\ntype DashfooHandle = {\n addTab: (\n tab: TabNode,\n target: { index?: number; location?: DockLocation; targetId: string },\n ) => void;\n canRedo: () => boolean;\n canUndo: () => boolean;\n closeTab: (tabId: string) => void;\n dispatch: (action: Action) => void;\n\n dockFloat: (floatId: string) => void;\n\n floatTab: (tabId: string) => void;\n getModel: () => Dashfoo;\n maximizeTabset: (tabsetId: string | null) => void;\n redo: () => void;\n renameTab: (tabId: string, name: string) => void;\n\n resetLayout: () => void;\n selectTab: (tabsetId: string, index: number) => void;\n undo: () => void;\n};\n\ntype DashfooLayoutProps = {\n closableTabs?: boolean;\n components?: Record<string, TabComponent>;\n defaultModel?: Dashfoo;\n draggableTabs?: boolean;\n draggableTabsets?: boolean;\n\n editable?: boolean;\n factory?: (tab: TabNode) => ReactNode;\n\n floatable?: boolean;\n keepMounted?: boolean;\n maximizable?: boolean;\n model?: Dashfoo;\n onAction?: (action: Action) => Action | null;\n onActiveTabsetChange?: (tabsetId: string | undefined) => void;\n onMaximizedTabsetChange?: (tabsetId: string | undefined) => void;\n onModelChange?: (model: Dashfoo, action?: Action) => void;\n persist?: PersistInput;\n renamableTabs?: boolean;\n renderTabLabel?: (tab: TabNode) => ReactNode;\n renderTabsetToolbar?: (tabset: TabsetNode) => ReactNode;\n\n resizableSplits?: boolean;\n responsive?: { maxWidth: number; orientation?: Orientation };\n\n snap?: SnapConfig;\n};\n\nconst DashfooLayout = forwardRef<DashfooHandle, DashfooLayoutProps>((props, ref): ReactNode => {\n const {\n closableTabs = true,\n components,\n defaultModel,\n draggableTabs = true,\n draggableTabsets = true,\n editable = true,\n factory,\n floatable = false,\n keepMounted = false,\n maximizable = true,\n model,\n onAction,\n onActiveTabsetChange,\n onMaximizedTabsetChange,\n onModelChange,\n persist,\n renamableTabs = true,\n renderTabLabel,\n renderTabsetToolbar,\n resizableSplits = true,\n responsive,\n snap,\n } = props;\n\n const persistConfig = useMemo(\n () => resolvePersist(persist, defaultModel !== undefined),\n [persist, defaultModel],\n );\n const persistence = usePersistence(persistConfig, defaultModel);\n\n const handleModelChange = useCallback(\n (next: Dashfoo, action?: Action): void => {\n persistence.save(next);\n onModelChange?.(next, action);\n },\n [onModelChange, persistence],\n );\n\n const store = useDashfooStore({\n defaultModel: persistence.initialModel ?? defaultModel,\n model,\n onAction,\n onActiveTabsetChange,\n onMaximizedTabsetChange,\n onModelChange: handleModelChange,\n });\n\n const hasSharedManager = useContext(SharedDragManagerContext) !== null;\n\n useImperativeHandle(\n ref,\n () => ({\n addTab: (tab, target) =>\n store.dispatch({\n index: target.index,\n location: target.location ?? \"center\",\n tab,\n targetId: target.targetId,\n type: \"addNode\",\n }),\n canRedo: store.canRedo,\n canUndo: store.canUndo,\n closeTab: (tabId) => store.dispatch({ tabId, type: \"deleteTab\" }),\n dispatch: store.dispatch,\n dockFloat: (floatId) => store.dispatch({ floatId, type: \"dockFloat\" }),\n floatTab: (tabId) => store.dispatch({ tabId, type: \"floatTab\" }),\n getModel: () => store.model,\n maximizeTabset: (tabsetId) => store.dispatch({ tabsetId, type: \"setMaximizedTabset\" }),\n redo: store.redo,\n renameTab: (tabId, name) => store.dispatch({ name, tabId, type: \"renameTab\" }),\n resetLayout: () => {\n persistence.clear();\n if (defaultModel !== undefined) {\n store.setModel(defaultModel);\n }\n },\n selectTab: (tabsetId, index) => store.dispatch({ index, tabsetId, type: \"selectTab\" }),\n undo: store.undo,\n }),\n [defaultModel, persistence, store],\n );\n\n const renderTab = useCallback(\n (tab: TabNode): ReactNode => {\n if (factory) {\n return factory(tab);\n }\n const Component = components?.[tab.component];\n if (!Component) {\n if (components && !warnedComponents.has(tab.component)) {\n warnedComponents.add(tab.component);\n\n // oxlint-disable-next-line no-console\n console.warn(`[dashfoo] no component registered for \"${tab.component}\"`);\n }\n return null;\n }\n return <Component node={tab} />;\n },\n [components, factory],\n );\n\n const [containerRef, width] = useContainerWidth();\n const isCompact = responsive !== undefined && width <= responsive.maxWidth;\n const view = useMemo(\n () => (isCompact ? stackModel(store.model, responsive?.orientation) : store.model),\n [isCompact, responsive?.orientation, store.model],\n );\n\n const isCompactRef = useRef(isCompact);\n isCompactRef.current = isCompact;\n const dispatch = useCallback(\n (action: Action): void => {\n if (isCompactRef.current && action.type === \"adjustSplit\") {\n return;\n }\n store.dispatch(action);\n },\n [store],\n );\n\n const maximized = view.maximizedTabsetId ? findTabset(view, view.maximizedTabsetId) : undefined;\n\n const tree = (\n <Layout.FloatLayer floats={store.model.floats ?? []} global={store.model.global}>\n <Layout.DragLayer>\n {maximized ? <Layout.Tabset node={maximized} /> : <Layout.Rows node={view.layout} />}\n </Layout.DragLayer>\n </Layout.FloatLayer>\n );\n\n return (\n <Layout.Root\n closableTabs={closableTabs}\n dispatch={dispatch}\n draggableTabs={isCompact ? false : draggableTabs}\n draggableTabsets={isCompact ? false : draggableTabsets}\n editable={editable}\n floatable={isCompact ? false : floatable}\n keepMounted={keepMounted}\n maximizable={maximizable}\n model={view}\n renamableTabs={renamableTabs}\n renderTab={renderTab}\n renderTabLabel={renderTabLabel}\n renderTabsetToolbar={renderTabsetToolbar}\n resizableSplits={isCompact ? false : resizableSplits}\n rootRef={containerRef}\n snap={snap}\n >\n {}\n {hasSharedManager ? tree : <DashfooDragProvider>{tree}</DashfooDragProvider>}\n </Layout.Root>\n );\n});\n\nDashfooLayout.displayName = \"DashfooLayout\";\n\nexport { DashfooLayout };\nexport type { DashfooHandle, DashfooLayoutProps, TabComponent };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\n\ntype PanelRootProps = ComponentProps<\"div\">;\ntype PanelHeaderProps = ComponentProps<\"div\">;\ntype PanelBodyProps = ComponentProps<\"div\">;\ntype PanelTitleProps = ComponentProps<\"span\">;\ntype PanelIconProps = ComponentProps<\"span\">;\ntype PanelBadgeProps = ComponentProps<\"span\">;\n\nconst PanelRoot = (props: PanelRootProps): ReactNode => <div {...props} data-dashfoo=\"panel\" />;\nconst PanelHeader = (props: PanelHeaderProps): ReactNode => (\n <div {...props} data-dashfoo=\"panel-header\" />\n);\nconst PanelBody = (props: PanelBodyProps): ReactNode => (\n <div {...props} data-dashfoo=\"panel-body\" />\n);\nconst PanelTitle = (props: PanelTitleProps): ReactNode => (\n <span {...props} data-dashfoo=\"panel-title\" />\n);\nconst PanelIcon = (props: PanelIconProps): ReactNode => (\n <span {...props} data-dashfoo=\"panel-icon\" />\n);\nconst PanelBadge = (props: PanelBadgeProps): ReactNode => (\n <span {...props} data-dashfoo=\"panel-badge\" />\n);\n\nconst Panel = {\n Badge: PanelBadge,\n Body: PanelBody,\n Header: PanelHeader,\n Icon: PanelIcon,\n Root: PanelRoot,\n Title: PanelTitle,\n} as const;\n\nexport { Panel };\nexport type {\n PanelBadgeProps,\n PanelBodyProps,\n PanelHeaderProps,\n PanelIconProps,\n PanelRootProps,\n PanelTitleProps,\n};\n","\"use client\";\n\nimport { TabsetContent } from \"./tabset-content\";\nimport { TabsetOverflowMenu } from \"./tabset-overflow\";\nimport { TabsetRoot } from \"./tabset-root\";\nimport { TabsetTab, TabsetTrigger } from \"./tabset-tab\";\nimport { TabsetCloseButton, TabsetRenameInput } from \"./tabset-tab-controls\";\nimport { TabsetTablist, TabsetTabStrip } from \"./tabset-tablist\";\nimport {\n TabsetFloatButton,\n TabsetGrip,\n TabsetMaximizeButton,\n TabsetToolbar,\n} from \"./tabset-toolbar\";\n\nconst Tabset = {\n CloseButton: TabsetCloseButton,\n Content: TabsetContent,\n FloatButton: TabsetFloatButton,\n Grip: TabsetGrip,\n MaximizeButton: TabsetMaximizeButton,\n OverflowMenu: TabsetOverflowMenu,\n RenameInput: TabsetRenameInput,\n Root: TabsetRoot,\n Tab: TabsetTab,\n Tablist: TabsetTablist,\n TabStrip: TabsetTabStrip,\n Toolbar: TabsetToolbar,\n Trigger: TabsetTrigger,\n} as const;\n\nexport { Tabset };\nexport type { TabsetContentProps } from \"./tabset-content\";\nexport type { TabsetRootProps } from \"./tabset-root\";\nexport type { TabsetTabProps, TabsetTriggerProps } from \"./tabset-tab\";\nexport type { TabsetCloseButtonProps, TabsetRenameInputProps } from \"./tabset-tab-controls\";\nexport type { TabsetTablistProps, TabsetTabStripProps } from \"./tabset-tablist\";\nexport type {\n TabsetFloatButtonProps,\n TabsetGripProps,\n TabsetMaximizeButtonProps,\n TabsetToolbarProps,\n} from \"./tabset-toolbar\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Panel"],"sources":["../src/lib/topmost-collision.ts","../src/hooks/drag-hooks.tsx","../src/hooks/persistence.ts","../src/hooks/responsive.ts","../src/hooks/store.ts","../src/lib/tab-insertion.ts","../src/components/drag-overlays.tsx","../src/components/drag-root.tsx","../src/hooks/layout-store.ts","../src/lib/warn-once.ts","../src/components/drag-adapter.tsx","../src/components/float-context.ts","../src/hooks/use-inline-rename.ts","../src/lib/float-geometry.ts","../src/components/float-resize-handles.ts","../src/components/layout-root.tsx","../src/lib/tab-ids.ts","../src/components/tabset/tabset-store.ts","../src/components/tabset/tabset-content.tsx","../src/components/tab-overflow.tsx","../src/components/tabset/tabset-overflow.tsx","../src/hooks/use-tab-overflow.ts","../src/lib/tab-selection.ts","../src/components/tabset/tabset-root.tsx","../src/lib/merge-refs.ts","../src/components/tabset/tabset-tab.tsx","../src/components/tabset-icons.tsx","../src/components/tabset/tabset-tab-controls.tsx","../src/components/tabset/tabset-tablist.tsx","../src/components/tabset/tabset-toolbar.tsx","../src/components/tabset/tabset-view.tsx","../src/components/row-view.tsx","../src/components/float-panel.tsx","../src/components/float-layer.tsx","../src/components/layout.tsx","../src/components/dashfoo-layout.tsx","../src/components/panel.tsx","../src/components/tabset/tabset.ts"],"sourcesContent":["import type { Collision, CollisionDetector, UniqueIdentifier } from \"@dnd-kit/abstract\";\nimport { CollisionPriority, CollisionType } from \"@dnd-kit/abstract\";\n\ntype TopmostDetectorInput = {\n dragOperation: { position: { current: { x: number; y: number } } };\n droppable: { element?: Element; id: UniqueIdentifier };\n};\n\ntype TopmostDetector = (input: TopmostDetectorInput) => Collision | null;\n\nconst createTopmostPointerIntersection = (\n topElementAt: (x: number, y: number) => Element | null = (x, y) =>\n document.elementFromPoint(x, y),\n): TopmostDetector => {\n let cached: { top: Element | null; x: number; y: number } | null = null;\n const topAt = (x: number, y: number): Element | null => {\n if (cached && cached.x === x && cached.y === y) {\n return cached.top;\n }\n const top = topElementAt(x, y);\n cached = { top, x, y };\n queueMicrotask(() => {\n cached = null;\n });\n return top;\n };\n\n return ({ dragOperation, droppable }) => {\n const { element } = droppable;\n if (!element) {\n return null;\n }\n const point = dragOperation.position.current;\n const top = topAt(point.x, point.y);\n if (!top || !element.contains(top)) {\n return null;\n }\n\n let depth = 0;\n for (let node: Element | null = element; node; node = node.parentElement) {\n depth += 1;\n }\n return {\n id: droppable.id,\n priority: CollisionPriority.High,\n type: CollisionType.PointerIntersection,\n value: depth,\n };\n };\n};\n\nconst topmostPointerIntersection: CollisionDetector = createTopmostPointerIntersection();\n\nexport { createTopmostPointerIntersection, topmostPointerIntersection };\nexport type { TopmostDetectorInput };\n","\"use client\";\n\nimport type { DragSubject, DropIntent, TabNode } from \"@dashfoo/core\";\nimport {\n Accessibility,\n Draggable,\n DragDropManager,\n Droppable,\n Feedback,\n PointerSensor,\n} from \"@dnd-kit/dom\";\nimport type { Context } from \"react\";\nimport { createContext, useCallback, useContext, useEffect, useId, useMemo, useRef } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { createStore, useStore } from \"zustand\";\n\nimport { topmostPointerIntersection } from \"../lib/topmost-collision\";\n\nconst INTERACTIVE_SELECTOR = `\n input:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n button:not([disabled]),\n a[href],\n [contenteditable]:not([contenteditable=\"false\"])\n`;\n\nconst preventActivation = (event: PointerEvent, source: Draggable): boolean => {\n const { target } = event;\n if (!(target instanceof Element)) {\n return false;\n }\n const interactive = target.closest(INTERACTIVE_SELECTOR);\n return interactive !== null && interactive !== source.element;\n};\n\nconst createDragManager = (): DragDropManager =>\n new DragDropManager({\n plugins: (defaults) => [\n ...defaults.filter((plugin) => plugin !== Accessibility && plugin !== Feedback),\n Feedback.configure({ dropAnimation: null }),\n ],\n sensors: () => [PointerSensor.configure({ preventActivation })],\n });\n\ntype DragContextValue = {\n layerId: string;\n manager: DragDropManager;\n};\n\nconst DragContext = createContext<DragContextValue | null>(null);\n\nconst SharedDragManagerContext: Context<DragDropManager | null> =\n createContext<DragDropManager | null>(null);\n\ntype DragSubjectState = {\n intent: DropIntent | null;\n intentOwner: string | null;\n subject: DragSubject | null;\n};\n\ntype DragSubjectStore = StoreApi<DragSubjectState>;\n\nconst createDragSubjectStore = (): DragSubjectStore =>\n createStore<DragSubjectState>(() => ({ intent: null, intentOwner: null, subject: null }));\n\nconst sameDropIntent = (a: DropIntent | null, b: DropIntent | null): boolean =>\n a === b ||\n (a !== null &&\n b !== null &&\n a.index === b.index &&\n a.location === b.location &&\n a.targetId === b.targetId);\n\nconst sameDragSubject = (a: DragSubject | null, b: DragSubject | null): boolean =>\n a === b || (a !== null && b !== null && a.id === b.id && a.kind === b.kind);\n\nconst nullSubjectStore = createDragSubjectStore();\n\nconst DragSubjectStoreContext: Context<DragSubjectStore | null> =\n createContext<DragSubjectStore | null>(null);\n\ntype DraggableHandle = {\n draggableRef: { current: Draggable | null };\n elementRef: { current: Element | null };\n ref: (element: Element | null) => void;\n};\n\nconst useDraggableHandle = (): DraggableHandle => {\n const elementRef = useRef<Element | null>(null);\n const draggableRef = useRef<Draggable | null>(null);\n const ref = useCallback((element: Element | null): void => {\n elementRef.current = element;\n if (draggableRef.current) {\n draggableRef.current.element = element ?? undefined;\n }\n }, []);\n return { draggableRef, elementRef, ref };\n};\n\ntype DraggableDescriptor = { data: Record<string, unknown>; id: string };\n\nconst useDraggableEntity = (\n descriptor: DraggableDescriptor,\n disabled: boolean,\n label: string,\n): { ref: (element: Element | null) => void } => {\n const context = useContext(DragContext);\n\n const sharedManager = useContext(SharedDragManagerContext);\n const manager = context?.manager ?? sharedManager;\n const { draggableRef, elementRef, ref } = useDraggableHandle();\n const { data, id } = descriptor;\n\n useEffect(() => {\n if (!manager || disabled) {\n return undefined;\n }\n const draggable = new Draggable({ data: { ...data, label: \"\" }, id }, manager);\n draggable.element = elementRef.current ?? undefined;\n draggableRef.current = draggable;\n return () => {\n draggable.destroy();\n draggableRef.current = null;\n };\n }, [data, disabled, draggableRef, elementRef, id, manager]);\n\n useEffect(() => {\n const draggable = draggableRef.current;\n if (draggable) {\n draggable.data = { ...data, label };\n }\n }, [data, draggableRef, label]);\n\n return useMemo(() => ({ ref }), [ref]);\n};\n\nconst useTabDraggable = (\n tabId: string,\n disabled = false,\n label = \"\",\n): { ref: (element: Element | null) => void } => {\n const data = useMemo(() => ({ type: \"tab\" }), []);\n return useDraggableEntity({ data, id: tabId }, disabled, label);\n};\n\nconst useTabsetDraggable = (\n tabsetId: string,\n disabled = false,\n label = \"\",\n): { ref: (element: Element | null) => void } => {\n const data = useMemo(() => ({ tabsetId, type: \"tabset\" }), [tabsetId]);\n return useDraggableEntity({ data, id: `grip-${tabsetId}` }, disabled, label);\n};\n\nconst useTabsetDroppable = (tabsetId: string): { ref: (element: HTMLElement | null) => void } => {\n const context = useContext(DragContext);\n const elementRef = useRef<HTMLElement | null>(null);\n const droppableRef = useRef<Droppable | null>(null);\n const ref = useCallback((element: HTMLElement | null): void => {\n elementRef.current = element;\n if (droppableRef.current) {\n droppableRef.current.element = element ?? undefined;\n }\n }, []);\n const layerId = context?.layerId;\n const manager = context?.manager;\n\n useEffect(() => {\n if (!manager || layerId === undefined) {\n return undefined;\n }\n\n const droppable = new Droppable(\n {\n collisionDetector: topmostPointerIntersection,\n data: { layerId, tabsetId, type: \"tabset\" },\n id: `${layerId}:${tabsetId}`,\n },\n manager,\n );\n droppable.element = elementRef.current ?? undefined;\n droppableRef.current = droppable;\n return () => {\n droppable.destroy();\n droppableRef.current = null;\n };\n }, [layerId, manager, tabsetId]);\n\n return useMemo(() => ({ ref }), [ref]);\n};\n\ntype ExternalTabSourceOptions = {\n createTab: () => TabNode;\n disabled?: boolean;\n label?: string;\n};\n\nconst useExternalTabSource = ({\n createTab,\n disabled = false,\n label = \"\",\n}: ExternalTabSourceOptions): { ref: (element: Element | null) => void } => {\n const id = useId();\n const createTabRef = useRef(createTab);\n\n useEffect(() => {\n createTabRef.current = createTab;\n });\n const data = useMemo(\n () => ({ createTab: (): TabNode => createTabRef.current(), type: \"external\" }),\n [],\n );\n return useDraggableEntity({ data, id: `external-${id}` }, disabled, label);\n};\n\nconst useDragSubject = (): DragSubject | null => {\n const store = useContext(DragSubjectStoreContext);\n return useStore(store ?? nullSubjectStore, (state) => state.subject);\n};\n\nconst useDropIntent = (): DropIntent | null => {\n const store = useContext(DragSubjectStoreContext);\n return useStore(store ?? nullSubjectStore, (state) => state.intent);\n};\n\nexport type { DragContextValue, DragSubjectStore, ExternalTabSourceOptions };\nexport {\n createDragManager,\n createDragSubjectStore,\n DragContext,\n DragSubjectStoreContext,\n sameDragSubject,\n sameDropIntent,\n SharedDragManagerContext,\n useDragSubject,\n useDropIntent,\n useExternalTabSource,\n useTabDraggable,\n useTabsetDraggable,\n useTabsetDroppable,\n};\n","\"use client\";\n\nimport type { Dashfoo } from \"@dashfoo/core\";\nimport { fromJSON, toJSON } from \"@dashfoo/core\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\ntype StorageAdapter = {\n getItem: (key: string) => string | null;\n removeItem: (key: string) => void;\n setItem: (key: string, value: string) => void;\n};\n\nconst memoryStorageAdapter = (): StorageAdapter => {\n const store = new Map<string, string>();\n return {\n getItem: (key) => store.get(key) ?? null,\n removeItem: (key) => {\n store.delete(key);\n },\n setItem: (key, value) => {\n store.set(key, value);\n },\n };\n};\n\nconst localStorageAdapter: StorageAdapter = {\n getItem: (key) => {\n if (typeof window === \"undefined\") {\n return null;\n }\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n },\n removeItem: (key) => {\n if (typeof window === \"undefined\") {\n return;\n }\n try {\n window.localStorage.removeItem(key);\n } catch {\n void 0;\n }\n },\n setItem: (key, value) => {\n if (typeof window === \"undefined\") {\n return;\n }\n try {\n window.localStorage.setItem(key, value);\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] failed to persist layout\", error);\n }\n },\n};\n\ntype PersistConfig = {\n debounceMs: number;\n key: string;\n storage: StorageAdapter;\n};\n\ntype Persistence = {\n clear: () => void;\n\n initialModel: Dashfoo | undefined;\n save: (model: Dashfoo) => void;\n};\n\nconst usePersistence = (\n config: PersistConfig | null,\n defaultModel: Dashfoo | undefined,\n): Persistence => {\n const configRef = useRef(config);\n useEffect(() => {\n configRef.current = config;\n });\n\n const [initialModel] = useState<Dashfoo | undefined>(() => {\n if (config === null || defaultModel === undefined) {\n return defaultModel;\n }\n const raw = config.storage.getItem(config.key);\n if (raw === null) {\n return defaultModel;\n }\n try {\n return fromJSON(raw);\n } catch {\n return defaultModel;\n }\n });\n\n useEffect(() => {\n const current = configRef.current;\n if (current === null) {\n return;\n }\n const raw = current.storage.getItem(current.key);\n if (raw === null) {\n return;\n }\n try {\n fromJSON(raw);\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] discarding unreadable persisted layout\", error);\n current.storage.removeItem(current.key);\n }\n }, []);\n\n const loadedKey = useRef(config?.key);\n useEffect(() => {\n if (config !== null && config.key !== loadedKey.current) {\n // oxlint-disable-next-line no-console\n console.warn(\n \"[dashfoo] persist key changed for a mounted layout; the displayed layout still reflects the previous key — remount (key={persistKey}) to load the new key\",\n );\n loadedKey.current = config.key;\n }\n }, [config]);\n\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const pending = useRef<{ key: string; storage: StorageAdapter; value: string } | null>(null);\n\n const flush = useCallback((): void => {\n if (timer.current !== null) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n if (pending.current !== null) {\n pending.current.storage.setItem(pending.current.key, pending.current.value);\n pending.current = null;\n }\n }, []);\n\n const save = useCallback(\n (next: Dashfoo): void => {\n const current = configRef.current;\n if (current === null) {\n return;\n }\n pending.current = { key: current.key, storage: current.storage, value: toJSON(next) };\n if (timer.current !== null) {\n clearTimeout(timer.current);\n }\n timer.current = setTimeout(flush, current.debounceMs);\n },\n [flush],\n );\n\n useEffect(() => {\n const handlePageHide = (): void => {\n flush();\n };\n const handleVisibilityChange = (): void => {\n if (document.visibilityState === \"hidden\") {\n flush();\n }\n };\n window.addEventListener(\"pagehide\", handlePageHide);\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n return () => {\n window.removeEventListener(\"pagehide\", handlePageHide);\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n flush();\n };\n }, [flush]);\n\n const clear = useCallback((): void => {\n if (timer.current !== null) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n pending.current = null;\n const current = configRef.current;\n if (current !== null) {\n current.storage.removeItem(current.key);\n }\n }, []);\n\n return useMemo(() => ({ clear, initialModel, save }), [clear, initialModel, save]);\n};\n\nexport { localStorageAdapter, memoryStorageAdapter, usePersistence };\nexport type { Persistence, PersistConfig, StorageAdapter };\n","\"use client\";\n\nimport type { Dashfoo } from \"@dashfoo/core\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\ntype Breakpoint = {\n compact?: boolean;\n id: string;\n model: Dashfoo;\n query?: { maxWidth: number } | { media: string };\n};\n\ntype UseResponsiveModelOptions = { breakpoints: Array<Breakpoint> };\n\ntype ResponsiveModel = {\n breakpoint: string;\n containerRef: (element: HTMLElement | null) => void;\n draggableTabs: boolean;\n draggableTabsets: boolean;\n isCompact: boolean;\n model: Dashfoo;\n resizableSplits: boolean;\n};\n\nconst hasMatchMedia = (): boolean =>\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\";\n\nconst matchBreakpoint = (breakpoint: Breakpoint, width: number): boolean => {\n const { query } = breakpoint;\n if (!query) {\n return true;\n }\n if (\"maxWidth\" in query) {\n return width <= query.maxWidth;\n }\n return hasMatchMedia() && window.matchMedia(query.media).matches;\n};\n\nconst activeBreakpoint = (breakpoints: Array<Breakpoint>, width: number): Breakpoint => {\n const fallback = breakpoints.at(-1);\n if (!fallback) {\n throw new Error(\"useResponsiveModel requires at least one breakpoint.\");\n }\n return breakpoints.find((breakpoint) => matchBreakpoint(breakpoint, width)) ?? fallback;\n};\n\nconst useContainerWidth = (): [(element: HTMLElement | null) => void, number] => {\n const [width, setWidth] = useState<number>(Number.POSITIVE_INFINITY);\n const observerRef = useRef<ResizeObserver | null>(null);\n\n const containerRef = useCallback((element: HTMLElement | null): void => {\n observerRef.current?.disconnect();\n if (!element) {\n return;\n }\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n setWidth(entry.contentRect.width);\n }\n });\n observer.observe(element);\n observerRef.current = observer;\n }, []);\n\n useEffect(\n () => () => {\n observerRef.current?.disconnect();\n },\n [],\n );\n\n return [containerRef, width];\n};\n\nconst useResponsiveModel = ({ breakpoints }: UseResponsiveModelOptions): ResponsiveModel => {\n const [containerRef, width] = useContainerWidth();\n const [, setMediaTick] = useState(0);\n\n useEffect(() => {\n if (!hasMatchMedia()) {\n return;\n }\n const lists = breakpoints.flatMap((breakpoint) =>\n breakpoint.query && \"media\" in breakpoint.query\n ? [window.matchMedia(breakpoint.query.media)]\n : [],\n );\n if (lists.length === 0) {\n return;\n }\n const handleChange = (): void => {\n setMediaTick((tick) => tick + 1);\n };\n for (const list of lists) {\n list.addEventListener(\"change\", handleChange);\n }\n return () => {\n for (const list of lists) {\n list.removeEventListener(\"change\", handleChange);\n }\n };\n }, [breakpoints]);\n\n const active = activeBreakpoint(breakpoints, width);\n\n return useMemo(() => {\n const isCompact = active.compact === true;\n return {\n breakpoint: active.id,\n containerRef,\n draggableTabs: !isCompact,\n draggableTabsets: !isCompact,\n isCompact,\n model: active.model,\n resizableSplits: !isCompact,\n };\n }, [active, containerRef]);\n};\n\nexport { activeBreakpoint, matchBreakpoint, useContainerWidth, useResponsiveModel };\nexport type { Breakpoint, ResponsiveModel, UseResponsiveModelOptions };\n","\"use client\";\n\nimport type { Action, Dashfoo } from \"@dashfoo/core\";\nimport { canRedo, canUndo, dashfooMachine, normalize, reducer } from \"@dashfoo/core\";\nimport { useActorRef, useSelector } from \"@xstate/react\";\nimport { useCallback, useEffect, useMemo } from \"react\";\n\ntype DashfooStore = {\n canRedo: () => boolean;\n canUndo: () => boolean;\n dispatch: (action: Action) => void;\n model: Dashfoo;\n redo: () => void;\n setModel: (model: Dashfoo) => void;\n undo: () => void;\n};\n\ntype UseDashfooStoreOptions = {\n defaultModel?: Dashfoo;\n model?: Dashfoo;\n onAction?: (action: Action) => Action | null;\n onActiveTabsetChange?: (tabsetId: string | undefined) => void;\n onMaximizedTabsetChange?: (tabsetId: string | undefined) => void;\n onModelChange?: (model: Dashfoo, action?: Action) => void;\n};\n\nconst useDashfooStore = (options: UseDashfooStoreOptions): DashfooStore => {\n const {\n defaultModel,\n model: controlledModel,\n onAction,\n onActiveTabsetChange,\n onMaximizedTabsetChange,\n onModelChange,\n } = options;\n const initialModel = controlledModel ?? defaultModel;\n if (initialModel === undefined) {\n throw new Error(\"useDashfooStore requires either a `model` or a `defaultModel`.\");\n }\n\n const actorRef = useActorRef(dashfooMachine, { input: { model: normalize(initialModel) } });\n const history = useSelector(actorRef, (snapshot) => snapshot.context.history);\n\n useEffect(() => {\n if (controlledModel !== undefined) {\n actorRef.send({ model: normalize(controlledModel), type: \"SET_MODEL\" });\n }\n }, [actorRef, controlledModel]);\n\n const model = controlledModel ?? history.present;\n\n const notify = useCallback(\n (before: Dashfoo, after: Dashfoo, action?: Action) => {\n if (Object.is(before, after)) {\n return;\n }\n onModelChange?.(after, action);\n if (after.activeTabsetId !== before.activeTabsetId) {\n onActiveTabsetChange?.(after.activeTabsetId);\n }\n if (after.maximizedTabsetId !== before.maximizedTabsetId) {\n onMaximizedTabsetChange?.(after.maximizedTabsetId);\n }\n },\n [onModelChange, onActiveTabsetChange, onMaximizedTabsetChange],\n );\n\n const dispatch = useCallback(\n (action: Action) => {\n const resolved = onAction ? onAction(action) : action;\n if (!resolved) {\n return;\n }\n\n const transition = ((): { after: Dashfoo; before: Dashfoo } => {\n if (controlledModel === undefined) {\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ action: resolved, type: \"DISPATCH\" });\n return { after: actorRef.getSnapshot().context.history.present, before };\n }\n return { after: reducer(controlledModel, resolved), before: normalize(controlledModel) };\n })();\n notify(transition.before, transition.after, resolved);\n },\n [actorRef, controlledModel, notify, onAction],\n );\n\n const undo = useCallback(() => {\n if (controlledModel !== undefined) {\n return;\n }\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ type: \"UNDO\" });\n const after = actorRef.getSnapshot().context.history.present;\n notify(before, after);\n }, [actorRef, controlledModel, notify]);\n\n const redo = useCallback(() => {\n if (controlledModel !== undefined) {\n return;\n }\n const before = actorRef.getSnapshot().context.history.present;\n actorRef.send({ type: \"REDO\" });\n const after = actorRef.getSnapshot().context.history.present;\n notify(before, after);\n }, [actorRef, controlledModel, notify]);\n\n const setModel = useCallback(\n (next: Dashfoo) => {\n actorRef.send({ model: normalize(next), type: \"SET_MODEL\" });\n },\n [actorRef],\n );\n\n return useMemo(\n () => ({\n canRedo: () => canRedo(actorRef.getSnapshot().context.history),\n canUndo: () => canUndo(actorRef.getSnapshot().context.history),\n dispatch,\n model,\n redo,\n setModel,\n undo,\n }),\n [actorRef, dispatch, model, redo, setModel, undo],\n );\n};\n\nexport { useDashfooStore };\nexport type { DashfooStore, UseDashfooStoreOptions };\n","import type { Point, Rect } from \"@dashfoo/core\";\n\ntype Zone = { height: number; width: number; x: number; y: number };\n\nconst pointInRect = (point: Point, rect: Rect): boolean =>\n point.x >= rect.x &&\n point.x <= rect.x + rect.width &&\n point.y >= rect.y &&\n point.y <= rect.y + rect.height;\n\nconst insertionIndex = (rects: ReadonlyArray<Rect>, pointerX: number): number => {\n const found = rects.findIndex((rect) => pointerX < rect.x + rect.width / 2);\n return found === -1 ? rects.length : found;\n};\n\nconst INSERTION_LINE_WIDTH = 4;\n\nconst insertionLineRect = (\n stripRect: Rect,\n itemRects: ReadonlyArray<Rect>,\n index: number,\n): Zone => {\n const at = itemRects[index];\n const last = itemRects.at(-1);\n const x = at?.x ?? (last ? last.x + last.width : stripRect.x);\n const left = x - INSERTION_LINE_WIDTH / 2;\n return {\n height: stripRect.height,\n width: INSERTION_LINE_WIDTH,\n x: Math.max(stripRect.x, Math.min(left, stripRect.x + stripRect.width - INSERTION_LINE_WIDTH)),\n y: stripRect.y,\n };\n};\n\nconst shouldAllowDrop = (\n draggedId: string | undefined,\n targetId: string,\n tabIds: ReadonlyArray<string>,\n): boolean => {\n if (draggedId === `grip-${targetId}`) {\n return false;\n }\n if (tabIds.length === 1 && tabIds[0] === draggedId) {\n return false;\n }\n return true;\n};\n\nexport { insertionIndex, insertionLineRect, pointInRect, shouldAllowDrop };\nexport type { Zone };\n","\"use client\";\n\nimport type { dragDockMachine, Point } from \"@dashfoo/core\";\nimport { zoneRect } from \"@dashfoo/core\";\nimport type { DragDropManager } from \"@dnd-kit/dom\";\nimport { Feedback } from \"@dnd-kit/dom\";\nimport { useSelector } from \"@xstate/react\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport type { ActorRefFrom } from \"xstate\";\n\nimport type { Zone } from \"../lib/tab-insertion\";\nimport { insertionLineRect } from \"../lib/tab-insertion\";\n\ntype DragActor = ActorRefFrom<typeof dragDockMachine>;\n\nconst overlayBase: CSSProperties = {\n boxSizing: \"border-box\",\n pointerEvents: \"none\",\n position: \"fixed\",\n\n transition: \"var(--dashfoo-dock-transition, left 60ms, top 60ms, width 60ms, height 60ms)\",\n zIndex: 9999,\n};\n\nconst paneStyle = (zone: Zone): CSSProperties => ({\n ...overlayBase,\n background: \"var(--dashfoo-dock-fill, oklch(0.556 0 0 / 0.18))\",\n border:\n \"var(--dashfoo-dock-border-width, 1px) solid var(--dashfoo-dock-border, oklch(0.708 0 0 / 0.75))\",\n borderRadius: \"var(--dashfoo-dock-radius, 6px)\",\n height: zone.height,\n left: zone.x,\n top: zone.y,\n width: zone.width,\n});\n\nconst lineStyle = (zone: Zone): CSSProperties => ({\n ...paneStyle(zone),\n borderRadius: \"var(--dashfoo-dock-line-radius, 2px)\",\n});\n\nconst tabItemRects = (strip: Element, excludeId?: string): Array<DOMRect> =>\n [...strip.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab-item\"]')].flatMap((item) =>\n item.querySelector<HTMLElement>('[data-dashfoo=\"tab\"]')?.dataset.tabId === excludeId\n ? []\n : [item.getBoundingClientRect()],\n );\n\nconst DockIndicator = ({\n actorRef,\n getTabsetElement,\n}: {\n actorRef: DragActor;\n getTabsetElement: (id: string) => HTMLElement | undefined;\n}): ReactNode => {\n const intent = useSelector(actorRef, (snapshot) => snapshot.context.intent);\n const draggedId = useSelector(actorRef, (snapshot) => snapshot.context.subject?.id);\n if (!intent) {\n return null;\n }\n const element = getTabsetElement(intent.targetId);\n if (!element) {\n return null;\n }\n\n const zIndex = element.closest('[data-dashfoo=\"float\"]') ? overlayBase.zIndex : \"auto\";\n if (intent.location === \"center\") {\n const strip = element.querySelector('[data-dashfoo=\"tabstrip\"]');\n if (strip) {\n const line = insertionLineRect(\n strip.getBoundingClientRect(),\n tabItemRects(strip, draggedId),\n intent.index ?? 0,\n );\n return <div data-dashfoo=\"dock-indicator\" style={{ ...lineStyle(line), zIndex }} />;\n }\n }\n const zone = zoneRect(element.getBoundingClientRect(), intent.location);\n return <div data-dashfoo=\"dock-indicator\" style={{ ...paneStyle(zone), zIndex }} />;\n};\n\nconst PREVIEW_OFFSET: Point = { x: 12, y: 8 };\n\nconst labelOf = (source: { data?: Record<string, unknown> } | null): string => {\n const raw = source?.data?.label;\n return typeof raw === \"string\" ? raw : \"\";\n};\n\ntype ChipState = { label: string; x: number; y: number };\n\nconst DragPreviewOverlay = ({ manager }: { manager: DragDropManager }): ReactNode => {\n const [chip, setChip] = useState<ChipState | null>(null);\n\n useEffect(() => {\n const offStart = manager.monitor.addEventListener(\"dragstart\", (event) => {\n const source = event.operation.source;\n if (!source) {\n return;\n }\n const rect = source.element?.getBoundingClientRect();\n const point = event.operation.position.current;\n setChip({\n label: labelOf(source),\n x: PREVIEW_OFFSET.x + (rect ? point.x - rect.left : 0),\n y: PREVIEW_OFFSET.y + (rect ? point.y - rect.top : 0),\n });\n });\n const offEnd = manager.monitor.addEventListener(\"dragend\", () => setChip(null));\n return () => {\n offStart();\n offEnd();\n };\n }, [manager]);\n\n const attachOverlay = useCallback(\n (element: HTMLDivElement | null): void => {\n const feedback = manager.registry.plugins.get(Feedback);\n if (feedback) {\n feedback.overlay = element ?? undefined;\n }\n },\n [manager],\n );\n\n return (\n <div data-dnd-overlay=\"\" ref={attachOverlay}>\n {chip === null ? null : (\n <div\n data-dashfoo=\"drag-preview\"\n style={{\n left: 0,\n position: \"absolute\",\n top: 0,\n transform: `translate(${chip.x}px, ${chip.y}px)`,\n\n width: \"max-content\",\n }}\n >\n {chip.label}\n </div>\n )}\n </div>\n );\n};\n\nexport { DockIndicator, DragPreviewOverlay };\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { useInsertionEffect, useState } from \"react\";\n\nimport {\n createDragManager,\n createDragSubjectStore,\n DragSubjectStoreContext,\n SharedDragManagerContext,\n} from \"../hooks/drag-hooks\";\n\nimport { DragPreviewOverlay } from \"./drag-overlays\";\n\nconst DashfooDragProvider = ({ children }: { children: ReactNode }): ReactNode => {\n const [manager] = useState(createDragManager);\n useInsertionEffect(() => () => manager.destroy(), [manager]);\n\n const [subjectStore] = useState(createDragSubjectStore);\n\n return (\n <SharedDragManagerContext.Provider value={manager}>\n <DragSubjectStoreContext.Provider value={subjectStore}>\n {children}\n <DragPreviewOverlay manager={manager} />\n </DragSubjectStoreContext.Provider>\n </SharedDragManagerContext.Provider>\n );\n};\n\nexport { DashfooDragProvider };\n","\"use client\";\n\nimport type { Action, SnapConfig, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport type { ReactNode } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { createStore, useStore } from \"zustand\";\n\ntype LayoutState = {\n closableTabs: boolean;\n dispatch: (action: Action) => void;\n draggableTabs: boolean;\n draggableTabsets: boolean;\n editable: boolean;\n\n floatable: boolean;\n keepMounted: boolean;\n maximizable: boolean;\n maximizedTabsetId: string | undefined;\n renamableTabs: boolean;\n renderTab: (tab: TabNode) => ReactNode;\n renderTabLabel: ((tab: TabNode) => ReactNode) | undefined;\n renderTabsetToolbar: ((tabset: TabsetNode) => ReactNode) | undefined;\n resizableSplits: boolean;\n\n snap: SnapConfig | null;\n splitDock: boolean;\n tabLocation: \"bottom\" | \"top\";\n tabsetMinSize: number;\n tabStripEnabled: boolean;\n};\n\ntype LayoutStore = StoreApi<LayoutState>;\n\nconst createLayoutStore = (initial: LayoutState): LayoutStore =>\n createStore<LayoutState>(() => initial);\n\nconst LayoutStoreContext = createContext<LayoutStore | null>(null);\n\nconst useLayout = <T>(selector: (state: LayoutState) => T): T => {\n const store = useContext(LayoutStoreContext);\n if (store === null) {\n throw new Error(\"dashfoo components must be rendered inside <DashfooLayout> or <Layout.Root>.\");\n }\n return useStore(store, selector);\n};\n\nexport { createLayoutStore, LayoutStoreContext, useLayout };\nexport type { LayoutState, LayoutStore };\n","const warned = new Set<string>();\n\nconst warnOnce = (key: string, message: string): void => {\n if (warned.has(key)) {\n return;\n }\n warned.add(key);\n // oxlint-disable-next-line no-console\n console.warn(`[dashfoo] ${message}`);\n};\n\nexport { warnOnce };\n","\"use client\";\n\nimport type { Action, DockLocation, DragSubject, DropIntent, Point } from \"@dashfoo/core\";\nimport { dragDockMachine, resolveDockTarget, tabNodeSchema } from \"@dashfoo/core\";\nimport type { DragEndEvent, DragStartEvent } from \"@dnd-kit/dom\";\nimport { useActorRef } from \"@xstate/react\";\nimport type { ReactNode } from \"react\";\nimport {\n useCallback,\n useContext,\n useEffect,\n useId,\n useInsertionEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport type { DragContextValue } from \"../hooks/drag-hooks\";\nimport {\n createDragManager,\n createDragSubjectStore,\n DragContext,\n DragSubjectStoreContext,\n sameDragSubject,\n sameDropIntent,\n SharedDragManagerContext,\n} from \"../hooks/drag-hooks\";\nimport { LayoutStoreContext } from \"../hooks/layout-store\";\nimport { insertionIndex, pointInRect, shouldAllowDrop } from \"../lib/tab-insertion\";\nimport { warnOnce } from \"../lib/warn-once\";\n\nimport { DockIndicator, DragPreviewOverlay } from \"./drag-overlays\";\n\nconst tabRects = (strip: Element, excludeId?: string): Array<DOMRect> =>\n [...strip.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')].flatMap((tab) =>\n tab.dataset.tabId === excludeId ? [] : [tab.getBoundingClientRect()],\n );\n\nconst intentForTabset = (\n id: string,\n element: HTMLElement,\n point: Point,\n draggedId?: string,\n): DropIntent => {\n const strip = element.querySelector('[data-dashfoo=\"tabstrip\"]');\n if (strip && pointInRect(point, strip.getBoundingClientRect())) {\n return {\n index: insertionIndex(tabRects(strip, draggedId), point.x),\n location: \"center\",\n targetId: id,\n };\n }\n const target = resolveDockTarget(point, element.getBoundingClientRect());\n const location: DockLocation = target.kind === \"tab\" ? \"center\" : `split-${target.edge}`;\n if (location === \"center\" && strip) {\n return { index: tabRects(strip, draggedId).length, location, targetId: id };\n }\n return { location, targetId: id };\n};\n\nconst isTabFactory = (value: unknown): value is () => unknown => typeof value === \"function\";\n\nconst subjectFor = (source: {\n data?: Record<string, unknown>;\n id: string | number;\n}): DragSubject | null => {\n const data = source.data;\n if (data?.type === \"tabset\") {\n return { id: String(data.tabsetId), kind: \"tabset\" };\n }\n if (data?.type === \"external\") {\n if (!isTabFactory(data.createTab)) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] external drag source is missing its createTab function\");\n return null;\n }\n let candidate: unknown;\n try {\n candidate = data.createTab();\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] external drag source createTab threw\", error);\n return null;\n }\n const parsed = tabNodeSchema.safeParse(candidate);\n if (!parsed.success) {\n // oxlint-disable-next-line no-console\n console.warn(\"[dashfoo] external drag source returned an invalid tab\", parsed.error);\n return null;\n }\n return { id: String(source.id), kind: \"external\", tab: parsed.data };\n }\n return { id: String(source.id), kind: \"tab\" };\n};\n\ntype DragProviderProps = {\n children: ReactNode;\n\n onCommit?: (action: Action) => void;\n\n splitDock?: boolean;\n};\n\nconst DragProvider = ({ children, onCommit, splitDock }: DragProviderProps): ReactNode => {\n const actorRef = useActorRef(dragDockMachine);\n\n const layoutStore = useContext(LayoutStoreContext);\n\n const sharedManager = useContext(SharedDragManagerContext);\n const [ownManager] = useState(() => (sharedManager ? null : createDragManager()));\n useInsertionEffect(() => () => ownManager?.destroy(), [ownManager]);\n const manager = sharedManager ?? ownManager;\n if (manager === null) {\n throw new Error(\n \"[dashfoo] DashfooDragProvider unmounted while its layout is still mounted; keep the provider above the layout or remount the layout\",\n );\n }\n\n const inheritedStore = useContext(DragSubjectStoreContext);\n const [subjectStore] = useState(() => inheritedStore ?? createDragSubjectStore());\n const ownerId = useId();\n useEffect(() => {\n const subscription = actorRef.subscribe((snapshot) => {\n const { intent, subject } = snapshot.context;\n const state = subjectStore.getState();\n if (intent !== null) {\n if (!sameDropIntent(state.intent, intent) || state.intentOwner !== ownerId) {\n subjectStore.setState({ intent, intentOwner: ownerId });\n }\n } else if (state.intent !== null && state.intentOwner === ownerId) {\n subjectStore.setState({ intent: null, intentOwner: null });\n }\n if (!sameDragSubject(subjectStore.getState().subject, subject)) {\n subjectStore.setState({ subject });\n }\n });\n return () => {\n subscription.unsubscribe();\n };\n }, [actorRef, ownerId, subjectStore]);\n\n const onCommitRef = useRef(onCommit);\n const splitDockRef = useRef(splitDock);\n useEffect(() => {\n onCommitRef.current = onCommit;\n splitDockRef.current = splitDock;\n });\n\n const getTabsetElement = useCallback(\n (id: string): HTMLElement | undefined => {\n const element = manager.registry.droppables.get(`${ownerId}:${id}`)?.element;\n return element instanceof HTMLElement ? element : undefined;\n },\n [manager, ownerId],\n );\n\n useEffect(() => {\n const subscription = actorRef.on(\"COMMIT\", (emitted) => {\n if (layoutStore?.getState().editable === false) {\n return;\n }\n const commit = onCommitRef.current ?? layoutStore?.getState().dispatch;\n if (!commit) {\n warnOnce(\n \"drag-layer-no-commit\",\n \"Layout.DragLayer has neither an onCommit prop nor a <Layout.Root> above it; drops are ignored\",\n );\n return;\n }\n commit(emitted.action);\n });\n return () => {\n subscription.unsubscribe();\n };\n }, [actorRef, layoutStore]);\n\n useEffect(() => {\n const resolveIntent = (\n targetId: string,\n element: HTMLElement,\n point: Point,\n draggedId?: string,\n ): DropIntent | null => {\n if (layoutStore?.getState().editable === false) {\n return null;\n }\n const tabIds = [...element.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')].map(\n (tab) => tab.dataset.tabId ?? \"\",\n );\n if (!shouldAllowDrop(draggedId, targetId, tabIds)) {\n return null;\n }\n const intent = intentForTabset(targetId, element, point, draggedId);\n\n const splitDockResolved = splitDockRef.current ?? layoutStore?.getState().splitDock ?? true;\n if (!splitDockResolved && intent.location.startsWith(\"split-\")) {\n return { location: \"center\", targetId };\n }\n return intent;\n };\n\n const handleStart = (event: DragStartEvent): void => {\n const source = event.operation.source;\n if (!source) {\n return;\n }\n const subject = subjectFor(source);\n if (!subject) {\n manager.actions.stop({ canceled: true });\n return;\n }\n actorRef.send({ subject, type: \"START\" });\n };\n\n const syncIntent = (): void => {\n const operation = manager.dragOperation;\n const point = operation.position.current;\n const target = operation.target;\n\n const data = target?.data as { layerId?: string; tabsetId?: string } | undefined;\n const tabsetId = data?.layerId === ownerId ? data.tabsetId : undefined;\n const element = tabsetId === undefined ? undefined : target?.element;\n const draggedId = operation.source ? String(operation.source.id) : undefined;\n actorRef.send({\n intent:\n tabsetId !== undefined && element instanceof HTMLElement\n ? resolveIntent(tabsetId, element, point, draggedId)\n : null,\n type: \"OVER\",\n });\n };\n\n const handleMove = (): void => syncIntent();\n const handleCollision = (): void => syncIntent();\n\n const handleEnd = (event: DragEndEvent): void => {\n if (event.canceled) {\n actorRef.send({ type: \"CANCEL\" });\n return;\n }\n syncIntent();\n actorRef.send({ type: \"DROP\" });\n };\n const offStart = manager.monitor.addEventListener(\"dragstart\", handleStart);\n const offMove = manager.monitor.addEventListener(\"dragmove\", handleMove);\n const offCollision = manager.monitor.addEventListener(\"collision\", handleCollision);\n const offEnd = manager.monitor.addEventListener(\"dragend\", handleEnd);\n return () => {\n offStart();\n offMove();\n offCollision();\n offEnd();\n };\n }, [actorRef, layoutStore, manager, ownerId]);\n\n const contextValue = useMemo<DragContextValue>(\n () => ({ layerId: ownerId, manager }),\n [manager, ownerId],\n );\n\n return (\n <DragContext.Provider value={contextValue}>\n <DragSubjectStoreContext.Provider value={subjectStore}>\n {children}\n <DockIndicator actorRef={actorRef} getTabsetElement={getTabsetElement} />\n {ownManager === null ? null : <DragPreviewOverlay manager={ownManager} />}\n </DragSubjectStoreContext.Provider>\n </DragContext.Provider>\n );\n};\n\nexport {\n useDragSubject,\n useTabDraggable,\n useTabsetDraggable,\n useTabsetDroppable,\n} from \"../hooks/drag-hooks\";\nexport { DragProvider, subjectFor };\nexport type { DragProviderProps };\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\n\nconst FloatLayerContext = createContext(false);\n\nconst useHasFloatLayer = (): boolean => useContext(FloatLayerContext);\n\nexport { FloatLayerContext, useHasFloatLayer };\n","\"use client\";\n\nimport type { FocusEvent, KeyboardEvent, RefObject } from \"react\";\nimport { useEffect, useRef } from \"react\";\n\ntype InlineRenameOptions = {\n currentName: string;\n inputRef: RefObject<HTMLInputElement | null>;\n onCommit: (name: string) => void;\n onDone: () => void;\n};\n\ntype InlineRename = {\n handleBlur: (event: FocusEvent<HTMLInputElement>) => void;\n handleKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;\n};\n\nconst useInlineRename = ({\n currentName,\n inputRef,\n onCommit,\n onDone,\n}: InlineRenameOptions): InlineRename => {\n // Blur can fire after Enter/Escape already settled the edit; the ref\n // suppresses that trailing blur so the commit happens at most once.\n const done = useRef(false);\n\n useEffect(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, [inputRef]);\n\n const commit = (value: string): void => {\n const trimmed = value.trim();\n if (trimmed && trimmed !== currentName) {\n onCommit(trimmed);\n }\n onDone();\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>): void => {\n if (event.key === \"Enter\") {\n done.current = true;\n commit(event.currentTarget.value);\n } else if (event.key === \"Escape\") {\n done.current = true;\n onDone();\n }\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>): void => {\n if (done.current) {\n return;\n }\n done.current = true;\n commit(event.currentTarget.value);\n };\n\n return { handleBlur, handleKeyDown };\n};\n\nexport { useInlineRename };\n","\"use client\";\n\nimport type { Geometry } from \"@dashfoo/core\";\n\nconst MIN_WIDTH = 200;\nconst MIN_HEIGHT = 120;\n\nconst DEFAULT_WIDTH = 480;\nconst DEFAULT_HEIGHT = 340;\n\nconst LIFT_OFFSET = 16;\n\ntype Size = { height: number; width: number };\n\nconst clampToBounds = (rect: Geometry, bounds: Size, size: Size = rect): Geometry => ({\n height: rect.height,\n left: Math.max(0, Math.min(rect.left, Math.max(0, bounds.width - size.width))),\n top: Math.max(0, Math.min(rect.top, Math.max(0, bounds.height - size.height))),\n width: rect.width,\n});\n\nconst measureFloatRect = (element: Element): Geometry => {\n const tabsetElement = element.closest('[data-dashfoo=\"tabset\"]') ?? element;\n const rect = tabsetElement.getBoundingClientRect();\n const seeded: Geometry = {\n height: Math.max(MIN_HEIGHT, Math.min(Math.round(rect.height), DEFAULT_HEIGHT)),\n left: Math.round(rect.left) + LIFT_OFFSET,\n top: Math.round(rect.top) + LIFT_OFFSET,\n width: Math.max(MIN_WIDTH, Math.min(Math.round(rect.width), DEFAULT_WIDTH)),\n };\n return clampToBounds(seeded, { height: window.innerHeight, width: window.innerWidth });\n};\n\ntype ResizeEdges = { x: -1 | 0 | 1; y: -1 | 0 | 1 };\n\nconst resizeRect = (start: Geometry, edges: ResizeEdges, dx: number, dy: number): Geometry => {\n let { height, left, top, width } = start;\n if (edges.x === 1) {\n width = Math.max(MIN_WIDTH, start.width + dx);\n } else if (edges.x === -1) {\n width = Math.max(MIN_WIDTH, start.width - dx);\n left = Math.max(0, start.left + (start.width - width));\n }\n if (edges.y === 1) {\n height = Math.max(MIN_HEIGHT, start.height + dy);\n } else if (edges.y === -1) {\n height = Math.max(MIN_HEIGHT, start.height - dy);\n top = Math.max(0, start.top + (start.height - height));\n }\n return { height, left, top, width };\n};\n\nexport { clampToBounds, measureFloatRect, resizeRect };\nexport type { ResizeEdges, Size };\n","import type { CSSProperties } from \"react\";\n\nimport type { ResizeEdges } from \"../lib/float-geometry\";\n\nconst EDGE_THICKNESS = 12;\nconst EDGE_OFFSET = -(EDGE_THICKNESS / 2);\n\nconst CORNER_SIZE = 20;\nconst CORNER_OFFSET = -8;\n\nconst EDGE_INSET = CORNER_SIZE + CORNER_OFFSET;\n\nconst RESIZE_HANDLES: ReadonlyArray<{ edges: ResizeEdges; key: string; style: CSSProperties }> = [\n {\n edges: { x: 0, y: -1 },\n key: \"n\",\n style: {\n cursor: \"ns-resize\",\n height: EDGE_THICKNESS,\n insetInline: EDGE_INSET,\n top: EDGE_OFFSET,\n },\n },\n {\n edges: { x: 0, y: 1 },\n key: \"s\",\n style: {\n bottom: EDGE_OFFSET,\n cursor: \"ns-resize\",\n height: EDGE_THICKNESS,\n insetInline: EDGE_INSET,\n },\n },\n {\n edges: { x: 1, y: 0 },\n key: \"e\",\n style: {\n cursor: \"ew-resize\",\n insetBlock: EDGE_INSET,\n right: EDGE_OFFSET,\n width: EDGE_THICKNESS,\n },\n },\n {\n edges: { x: -1, y: 0 },\n key: \"w\",\n style: {\n cursor: \"ew-resize\",\n insetBlock: EDGE_INSET,\n left: EDGE_OFFSET,\n width: EDGE_THICKNESS,\n },\n },\n {\n edges: { x: 1, y: -1 },\n key: \"ne\",\n style: {\n cursor: \"nesw-resize\",\n height: CORNER_SIZE,\n right: CORNER_OFFSET,\n top: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n {\n edges: { x: -1, y: -1 },\n key: \"nw\",\n style: {\n cursor: \"nwse-resize\",\n height: CORNER_SIZE,\n left: CORNER_OFFSET,\n top: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n {\n edges: { x: 1, y: 1 },\n key: \"se\",\n style: {\n bottom: CORNER_OFFSET,\n cursor: \"nwse-resize\",\n height: CORNER_SIZE,\n right: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n {\n edges: { x: -1, y: 1 },\n key: \"sw\",\n style: {\n bottom: CORNER_OFFSET,\n cursor: \"nesw-resize\",\n height: CORNER_SIZE,\n left: CORNER_OFFSET,\n width: CORNER_SIZE,\n },\n },\n];\n\nconst EDGE_BY_KEY = new Map<string, ResizeEdges>(RESIZE_HANDLES.map((h) => [h.key, h.edges]));\n\nexport { EDGE_BY_KEY, RESIZE_HANDLES };\n","\"use client\";\n\nimport type { Action, Dashfoo, SnapConfig, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport type { ComponentProps, CSSProperties, ReactNode, Ref } from \"react\";\nimport { useLayoutEffect, useState } from \"react\";\n\nimport type { LayoutState } from \"../hooks/layout-store\";\nimport { createLayoutStore, LayoutStoreContext } from \"../hooks/layout-store\";\n\nconst DEFAULT_TABSET_MIN_SIZE = 320;\n\nconst rootStyle = { display: \"flex\", height: \"100%\", position: \"relative\", width: \"100%\" } as const;\n\ntype LayoutRootProps = Omit<ComponentProps<\"div\">, \"children\"> & {\n children: ReactNode;\n closableTabs?: boolean;\n dispatch: (action: Action) => void;\n draggableTabs?: boolean;\n draggableTabsets?: boolean;\n\n editable?: boolean;\n\n floatable?: boolean;\n keepMounted?: boolean;\n maximizable?: boolean;\n model: Dashfoo;\n renamableTabs?: boolean;\n renderTab: (tab: TabNode) => ReactNode;\n renderTabLabel?: (tab: TabNode) => ReactNode;\n renderTabsetToolbar?: (tabset: TabsetNode) => ReactNode;\n resizableSplits?: boolean;\n\n rootRef?: Ref<HTMLDivElement>;\n\n snap?: SnapConfig;\n};\n\nconst LayoutRoot = ({\n children,\n closableTabs = true,\n dispatch,\n draggableTabs = true,\n draggableTabsets = true,\n editable = true,\n floatable = false,\n keepMounted = false,\n maximizable = true,\n model,\n renamableTabs = true,\n renderTab,\n renderTabLabel,\n renderTabsetToolbar,\n resizableSplits = true,\n rootRef,\n snap,\n style,\n ...props\n}: LayoutRootProps): ReactNode => {\n const global = model.global;\n const snapshot: LayoutState = {\n closableTabs: editable && closableTabs && global.tabEnableClose !== false,\n dispatch,\n draggableTabs: editable && draggableTabs && global.tabEnableDrag !== false,\n draggableTabsets: editable && draggableTabsets,\n editable,\n floatable: editable && floatable,\n keepMounted,\n maximizable: maximizable && global.tabSetEnableMaximize !== false,\n maximizedTabsetId: model.maximizedTabsetId,\n renamableTabs: editable && renamableTabs && global.tabEnableRename !== false,\n renderTab,\n renderTabLabel,\n renderTabsetToolbar,\n resizableSplits: editable && resizableSplits && global.enableSplitResize !== false,\n snap: snap ?? global.snap ?? null,\n splitDock: global.enableSplitDock !== false,\n tabLocation: global.tabLocation ?? \"top\",\n tabsetMinSize: global.tabSetMinSize ?? DEFAULT_TABSET_MIN_SIZE,\n tabStripEnabled: global.tabSetEnableTabStrip !== false,\n };\n\n const [store] = useState(() => createLayoutStore(snapshot));\n\n useLayoutEffect(() => {\n store.setState(snapshot);\n });\n\n const layoutStyle: CSSProperties =\n global.splitterSize === undefined\n ? { ...rootStyle, ...style }\n : ({\n ...rootStyle,\n \"--dashfoo-splitter-size\": `${global.splitterSize}px`,\n ...style,\n } as CSSProperties);\n\n return (\n <LayoutStoreContext.Provider value={store}>\n <div {...props} data-dashfoo=\"layout\" ref={rootRef} style={layoutStyle}>\n {children}\n </div>\n </LayoutStoreContext.Provider>\n );\n};\n\nexport { LayoutRoot };\nexport type { LayoutRootProps };\n","const tabDomId = (tabsetId: string, tabId: string): string => `dashfoo-tab-${tabsetId}-${tabId}`;\nconst panelDomId = (tabsetId: string): string => `dashfoo-panel-${tabsetId}`;\n\nexport { panelDomId, tabDomId };\n","\"use client\";\n\nimport type { Action, TabNode, TabsetNode } from \"@dashfoo/core\";\nimport { createContext, useContext } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport { createStore, useStore } from \"zustand\";\n\nimport { tabDomId } from \"../../lib/tab-ids\";\nimport { warnOnce } from \"../../lib/warn-once\";\nimport type { OverflowItem } from \"../tab-overflow\";\n\ntype TabsetState = {\n activeTab: TabNode | undefined;\n cancelRename: () => void;\n closeTab: (tabId: string) => void;\n commitRename: (tabId: string, value: string) => void;\n dispatch: (action: Action) => void;\n editingTabId: string | null;\n isMaximized: boolean;\n node: TabsetNode;\n overflowItems: Array<OverflowItem>;\n registerRenameInput: () => () => void;\n registerTablist: (element: HTMLDivElement | null) => void;\n renameInputCount: number;\n renameTab: (tabId: string, name: string) => void;\n restoreFocus: boolean;\n selectOverflowTab: (tabId: string) => void;\n selectTab: (index: number, options?: { focus?: boolean }) => void;\n showMaximize: boolean;\n startEditing: (tabId: string) => void;\n tablistElement: HTMLDivElement | null;\n tabsClosable: boolean;\n tabsRenamable: boolean;\n toggleMaximize: () => void;\n visualSelected: number;\n};\n\ntype TabsetStore = StoreApi<TabsetState>;\n\ntype TabsetSnapshot = Pick<\n TabsetState,\n | \"activeTab\"\n | \"dispatch\"\n | \"isMaximized\"\n | \"node\"\n | \"showMaximize\"\n | \"tabsClosable\"\n | \"tabsRenamable\"\n | \"visualSelected\"\n>;\n\nconst tabButtonIn = (\n scope: HTMLElement | null,\n tabsetId: string,\n tabId: string,\n): HTMLElement | null =>\n scope?.querySelector<HTMLElement>(`#${CSS.escape(tabDomId(tabsetId, tabId))}`) ?? null;\n\nconst createTabsetStore = (initial: TabsetSnapshot): TabsetStore =>\n createStore<TabsetState>((set, get) => ({\n ...initial,\n cancelRename: () => set({ editingTabId: null }),\n closeTab: (tabId) => {\n set({ restoreFocus: true });\n get().dispatch({ tabId, type: \"deleteTab\" });\n },\n commitRename: (tabId, value) => {\n set({ editingTabId: null });\n const { node, renameTab } = get();\n const trimmed = value.trim();\n const current = node.children.find((tab) => tab.id === tabId)?.name;\n if (trimmed && trimmed !== current) {\n renameTab(tabId, trimmed);\n }\n },\n editingTabId: null,\n overflowItems: [],\n registerRenameInput: () => {\n set((state) => ({ renameInputCount: state.renameInputCount + 1 }));\n return () => set((state) => ({ renameInputCount: state.renameInputCount - 1 }));\n },\n registerTablist: (element) => {\n if (element) {\n const current = get().tablistElement;\n if (current && current !== element) {\n warnOnce(\n `duplicate-tablist-${get().node.id}`,\n \"more than one <Tabset.Tablist> under the same <Tabset.Root>; the last one wins for keyboard focus and overflow\",\n );\n }\n set({ tablistElement: element });\n return;\n }\n set({ tablistElement: null });\n },\n renameInputCount: 0,\n renameTab: (tabId, name) => get().dispatch({ name, tabId, type: \"renameTab\" }),\n restoreFocus: false,\n selectOverflowTab: (tabId) => {\n const { dispatch, node, tablistElement } = get();\n const index = node.children.findIndex((tab) => tab.id === tabId);\n if (index === -1) {\n return;\n }\n dispatch({ index, tabsetId: node.id, type: \"selectTab\" });\n tabButtonIn(tablistElement, node.id, tabId)?.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n });\n },\n selectTab: (index, options) => {\n const { dispatch, node, tablistElement } = get();\n dispatch({ index, tabsetId: node.id, type: \"selectTab\" });\n if (options?.focus) {\n const tabId = node.children[index]?.id;\n if (tabId) {\n tabButtonIn(tablistElement, node.id, tabId)?.focus();\n }\n }\n },\n startEditing: (tabId) => {\n const { node, renameInputCount, tabsRenamable } = get();\n const tab = node.children.find((child) => child.id === tabId);\n if (!tabsRenamable || tab?.enableRename === false) {\n return;\n }\n if (renameInputCount === 0) {\n warnOnce(\n `missing-rename-input-${node.id}`,\n \"startEditing needs a <Tabset.RenameInput> in the composition; ignoring\",\n );\n return;\n }\n set({ editingTabId: tabId });\n },\n tablistElement: null,\n toggleMaximize: () => {\n const { dispatch, isMaximized, node } = get();\n dispatch({ tabsetId: isMaximized ? null : node.id, type: \"setMaximizedTabset\" });\n },\n }));\n\nconst TabsetStoreContext = createContext<TabsetStore | null>(null);\n\nconst useTabset = <T>(selector: (state: TabsetState) => T): T => {\n const store = useContext(TabsetStoreContext);\n if (store === null) {\n throw new Error(\"dashfoo Tabset parts must be rendered inside <Tabset.Root>.\");\n }\n return useStore(store, selector);\n};\n\ntype TabContextValue = { index: number; tab: TabNode };\n\nconst TabContext = createContext<TabContextValue | null>(null);\n\nconst useTab = (): TabContextValue => {\n const value = useContext(TabContext);\n if (value === null) {\n throw new Error(\"dashfoo tab parts must be rendered inside <Tabset.Tab>.\");\n }\n return value;\n};\n\nexport { createTabsetStore, TabContext, TabsetStoreContext, useTab, useTabset };\nexport type { TabContextValue, TabsetSnapshot, TabsetState, TabsetStore };\n","\"use client\";\n\nimport type { TabNode } from \"@dashfoo/core\";\nimport type { ComponentProps, CSSProperties, ReactNode } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { panelDomId, tabDomId } from \"../../lib/tab-ids\";\n\nimport { useTabset } from \"./tabset-store\";\n\nconst contentStyle: CSSProperties = { flex: 1, minHeight: 0, overflow: \"auto\" };\n\nconst TabPanel = ({\n render,\n tab,\n}: {\n render?: (tab: TabNode) => ReactNode;\n tab: TabNode;\n}): ReactNode => {\n const renderTab = useLayout((state) => state.renderTab);\n return render ? render(tab) : renderTab(tab);\n};\n\ntype TabsetContentProps = Omit<ComponentProps<\"div\">, \"children\"> & {\n children?: (tab: TabNode) => ReactNode;\n};\n\nconst TabsetContent = ({ children, style, ...props }: TabsetContentProps): ReactNode => {\n const node = useTabset((state) => state.node);\n const visualSelected = useTabset((state) => state.visualSelected);\n const keepMounted = useLayout((state) => state.keepMounted);\n\n const mergedStyle = { ...contentStyle, ...style };\n\n if (keepMounted && node.children.length > 0) {\n return node.children.map((tab, index) => (\n <div\n {...props}\n aria-labelledby={tabDomId(node.id, tab.id)}\n data-dashfoo=\"tabcontent\"\n hidden={index !== visualSelected || undefined}\n id={index === visualSelected ? panelDomId(node.id) : undefined}\n key={tab.id}\n role={index === visualSelected ? \"tabpanel\" : undefined}\n style={mergedStyle}\n tabIndex={index === visualSelected ? 0 : undefined}\n >\n <TabPanel render={children} tab={tab} />\n </div>\n ));\n }\n\n const active = node.children[visualSelected];\n if (active) {\n return (\n <div\n {...props}\n aria-labelledby={tabDomId(node.id, active.id)}\n data-dashfoo=\"tabcontent\"\n id={panelDomId(node.id)}\n role=\"tabpanel\"\n style={mergedStyle}\n tabIndex={0}\n >\n <TabPanel render={children} tab={active} />\n </div>\n );\n }\n return <div {...props} data-dashfoo=\"tabcontent\" style={mergedStyle} />;\n};\n\nexport { TabsetContent };\nexport type { TabsetContentProps };\n","\"use client\";\n\nimport type { CSSProperties, FocusEvent, KeyboardEvent, ReactNode } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\n\nconst OverflowIcon = (): ReactNode => (\n <svg aria-hidden=\"true\" fill=\"currentColor\" height=\"10\" viewBox=\"0 0 10 10\" width=\"10\">\n <circle cx=\"2\" cy=\"5\" r=\"1\" />\n <circle cx=\"5\" cy=\"5\" r=\"1\" />\n <circle cx=\"8\" cy=\"5\" r=\"1\" />\n </svg>\n);\n\nconst menuStyle: CSSProperties = {\n position: \"absolute\",\n right: 0,\n top: \"100%\",\n zIndex: 10,\n};\n\ntype OverflowItem = { id: string; name: string };\n\nconst TabOverflowMenu = ({\n items,\n onSelect,\n}: {\n items: Array<OverflowItem>;\n onSelect: (id: string) => void;\n}): ReactNode => {\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(0);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const handlePointerDown = (event: PointerEvent): void => {\n if (event.target instanceof Node && !rootRef.current?.contains(event.target)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [open]);\n\n useEffect(() => {\n if (open) {\n itemRefs.current[0]?.focus();\n }\n }, [open]);\n\n const closeAndReturnFocus = (): void => {\n setOpen(false);\n triggerRef.current?.focus();\n };\n\n const focusItem = (index: number): void => {\n setActiveIndex(index);\n itemRefs.current[index]?.focus();\n };\n\n const handleToggle = (): void => {\n setActiveIndex(0);\n setOpen((value) => !value);\n };\n\n const handleSelect = (id: string): void => {\n onSelect(id);\n closeAndReturnFocus();\n };\n\n const handleMenuKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n const last = items.length - 1;\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n focusItem(activeIndex >= last ? 0 : activeIndex + 1);\n break;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n focusItem(activeIndex <= 0 ? last : activeIndex - 1);\n break;\n }\n case \"Home\": {\n event.preventDefault();\n focusItem(0);\n break;\n }\n case \"End\": {\n event.preventDefault();\n focusItem(last);\n break;\n }\n case \"Escape\": {\n event.preventDefault();\n closeAndReturnFocus();\n break;\n }\n default: {\n break;\n }\n }\n };\n\n const handleFocusOut = (event: FocusEvent<HTMLDivElement>): void => {\n if (event.relatedTarget instanceof Node && rootRef.current?.contains(event.relatedTarget)) {\n return;\n }\n setOpen(false);\n };\n\n return (\n <div data-dashfoo=\"tab-overflow-root\" ref={rootRef} style={{ position: \"relative\" }}>\n <button\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-label=\"More tabs\"\n data-dashfoo=\"tab-overflow\"\n onClick={handleToggle}\n ref={triggerRef}\n title=\"More tabs\"\n type=\"button\"\n >\n <OverflowIcon />\n </button>\n {open ? (\n <div\n data-dashfoo=\"tab-overflow-menu\"\n onBlur={handleFocusOut}\n onKeyDown={handleMenuKeyDown}\n role=\"menu\"\n style={menuStyle}\n tabIndex={-1}\n >\n {items.map((item, index) => (\n <button\n data-dashfoo=\"tab-overflow-item\"\n key={item.id}\n onClick={() => handleSelect(item.id)}\n ref={(node) => {\n itemRefs.current[index] = node;\n }}\n role=\"menuitem\"\n tabIndex={index === activeIndex ? 0 : -1}\n type=\"button\"\n >\n {item.name}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n );\n};\n\nexport { TabOverflowMenu };\nexport type { OverflowItem };\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport { TabOverflowMenu } from \"../tab-overflow\";\n\nimport { useTabset } from \"./tabset-store\";\n\nconst TabsetOverflowMenu = (): ReactNode => {\n const overflowItems = useTabset((state) => state.overflowItems);\n const selectOverflowTab = useTabset((state) => state.selectOverflowTab);\n\n if (overflowItems.length === 0) {\n return null;\n }\n return <TabOverflowMenu items={overflowItems} onSelect={selectOverflowTab} />;\n};\n\nexport { TabsetOverflowMenu };\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst overflowingIds = (tablist: Element): Array<string> => {\n const box = tablist.getBoundingClientRect();\n return [...tablist.querySelectorAll<HTMLElement>('[data-dashfoo=\"tab\"]')].flatMap((tab) => {\n const rect = tab.getBoundingClientRect();\n const clipped = rect.right > box.right + 1 || rect.left < box.left - 1;\n return clipped && tab.dataset.tabId ? [tab.dataset.tabId] : [];\n });\n};\n\nconst useTabOverflow = (tablist: HTMLElement | null, signature: string): Array<string> => {\n const [overflow, setOverflow] = useState<Array<string>>([]);\n\n useEffect(() => {\n const recompute = (): void => {\n setOverflow((previous) => {\n const next = tablist ? overflowingIds(tablist) : [];\n return next.length === 0 && previous.length === 0 ? previous : next;\n });\n };\n recompute();\n if (!tablist) {\n return;\n }\n const observer = new ResizeObserver(recompute);\n observer.observe(tablist);\n\n tablist.addEventListener(\"scroll\", recompute, { passive: true });\n return () => {\n observer.disconnect();\n tablist.removeEventListener(\"scroll\", recompute);\n };\n }, [tablist, signature]);\n\n return overflow;\n};\n\nexport { overflowingIds, useTabOverflow };\n","const fallbackSelectedIndex = (count: number, removedIndex: number): number =>\n removedIndex + 1 < count ? removedIndex + 1 : removedIndex - 1;\n\nexport { fallbackSelectedIndex };\n","\"use client\";\n\nimport type { TabsetNode } from \"@dashfoo/core\";\nimport type { ComponentProps, CSSProperties, ReactNode } from \"react\";\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { useStore } from \"zustand\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { useTabOverflow } from \"../../hooks/use-tab-overflow\";\nimport { tabDomId } from \"../../lib/tab-ids\";\nimport { fallbackSelectedIndex } from \"../../lib/tab-selection\";\nimport { useDragSubject, useTabsetDroppable } from \"../drag-adapter\";\n\nimport type { TabsetSnapshot } from \"./tabset-store\";\nimport { createTabsetStore, TabsetStoreContext } from \"./tabset-store\";\n\nconst tabsetStyle: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n minHeight: 0,\n minWidth: 0,\n width: \"100%\",\n};\n\ntype TabsetRootProps = ComponentProps<\"div\"> & { node: TabsetNode };\n\nconst TabsetRoot = ({\n children,\n node,\n ref: userRef,\n style,\n ...props\n}: TabsetRootProps): ReactNode => {\n const closableTabs = useLayout((state) => state.closableTabs);\n const dispatch = useLayout((state) => state.dispatch);\n const maximizable = useLayout((state) => state.maximizable);\n const maximizedTabsetId = useLayout((state) => state.maximizedTabsetId);\n const renamableTabs = useLayout((state) => state.renamableTabs);\n const tabLocation = useLayout((state) => state.tabLocation);\n\n const { ref } = useTabsetDroppable(node.id);\n const dragSubject = useDragSubject();\n const tabsetRef = useRef<HTMLDivElement | null>(null);\n\n const isMaximized = maximizedTabsetId === node.id;\n const showMaximize = maximizable && node.enableMaximize !== false;\n const tabsClosable = closableTabs && node.enableClose !== false;\n\n const tabsRenamable = renamableTabs;\n\n const draggingTabIndex =\n dragSubject?.kind === \"tab\" ? node.children.findIndex((tab) => tab.id === dragSubject.id) : -1;\n const visualSelected =\n draggingTabIndex !== -1 && draggingTabIndex === node.selected\n ? fallbackSelectedIndex(node.children.length, draggingTabIndex)\n : node.selected;\n const activeTab = node.children[visualSelected];\n const isDragSource = dragSubject?.kind === \"tabset\" && dragSubject.id === node.id;\n\n const snapshot: TabsetSnapshot = {\n activeTab,\n dispatch,\n isMaximized,\n node,\n showMaximize,\n tabsClosable,\n tabsRenamable,\n visualSelected,\n };\n const [store] = useState(() => createTabsetStore(snapshot));\n\n useLayoutEffect(() => {\n store.setState(snapshot);\n });\n\n const tablistElement = useStore(store, (state) => state.tablistElement);\n\n const overflowSignature = node.children.map((tab) => `${tab.id}:${tab.name}`).join(\"|\");\n const overflow = useTabOverflow(tablistElement, overflowSignature);\n\n const overflowItems = useMemo(() => {\n const names = new Map(node.children.map((tab) => [tab.id, tab.name]));\n return overflow.map((id) => ({ id, name: names.get(id) ?? id }));\n }, [overflow, node.children]);\n useLayoutEffect(() => {\n store.setState({ overflowItems });\n }, [overflowItems, store]);\n\n useEffect(() => {\n if (!store.getState().restoreFocus) {\n return;\n }\n store.setState({ restoreFocus: false });\n const activeTabId = node.children[node.selected]?.id;\n if (activeTabId) {\n tabsetRef.current\n ?.querySelector<HTMLElement>(`#${CSS.escape(tabDomId(node.id, activeTabId))}`)\n ?.focus();\n } else {\n tabsetRef.current?.focus();\n }\n }, [node.children, node.selected, node.id, store]);\n\n return (\n <TabsetStoreContext.Provider value={store}>\n <div\n {...props}\n data-dashfoo=\"tabset\"\n data-dragging-source={isDragSource || undefined}\n data-tab-location={tabLocation}\n ref={(element) => {\n ref(element);\n tabsetRef.current = element;\n if (typeof userRef === \"function\") {\n userRef(element);\n } else if (userRef) {\n userRef.current = element;\n }\n }}\n style={{ ...tabsetStyle, ...style }}\n tabIndex={-1}\n >\n {children}\n </div>\n </TabsetStoreContext.Provider>\n );\n};\n\nexport { TabsetRoot };\nexport type { TabsetRootProps };\n","import type { Ref } from \"react\";\n\nconst applyRef = <T>(ref: Ref<T> | undefined, value: T | null): void => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n};\n\nconst mergeRefs =\n <T>(...refs: Array<Ref<T> | undefined>) =>\n (value: T | null): void => {\n for (const ref of refs) {\n applyRef(ref, value);\n }\n };\n\nexport { mergeRefs };\n","\"use client\";\n\nimport type { TabNode } from \"@dashfoo/core\";\nimport type { ComponentProps, MouseEvent, ReactNode } from \"react\";\nimport { useContext, useEffect, useMemo, useRef } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { panelDomId, tabDomId } from \"../../lib/tab-ids\";\nimport { warnOnce } from \"../../lib/warn-once\";\nimport { useDragSubject, useTabDraggable } from \"../drag-adapter\";\n\nimport { TabContext, TabsetStoreContext, useTab, useTabset } from \"./tabset-store\";\n\ntype TabsetTabProps = ComponentProps<\"span\"> & { tab: TabNode };\n\nconst TabsetTab = ({ children, ref: userRef, tab, ...props }: TabsetTabProps): ReactNode => {\n const store = useContext(TabsetStoreContext);\n const node = useTabset((state) => state.node);\n const editing = useTabset((state) => state.editingTabId === tab.id);\n\n const dragSubject = useDragSubject();\n const isDragging = dragSubject?.kind === \"tab\" && dragSubject.id === tab.id;\n const itemRef = useRef<HTMLSpanElement | null>(null);\n const wasEditing = useRef(false);\n\n const index = node.children.findIndex((child) => child.id === tab.id);\n\n const orphanAtRender = index === -1;\n useEffect(() => {\n const settled = store?.getState().node.children.some((child) => child.id === tab.id);\n if (settled === false) {\n warnOnce(\n `orphan-tab-${tab.id}`,\n `<Tabset.Tab> for \"${tab.id}\" is not a child of its Tabset.Root's node; it renders but can never be selected`,\n );\n }\n }, [orphanAtRender, store, tab.id]);\n\n useEffect(() => {\n if (wasEditing.current && !editing) {\n itemRef.current?.querySelector<HTMLElement>('[data-dashfoo=\"tab\"]')?.focus();\n }\n wasEditing.current = editing;\n }, [editing]);\n\n const contextValue = useMemo(() => ({ index, tab }), [index, tab]);\n const refCallback = useMemo(() => mergeRefs<HTMLSpanElement>(itemRef, userRef), [userRef]);\n\n return (\n <TabContext.Provider value={contextValue}>\n <span\n {...props}\n data-dashfoo=\"tab-item\"\n data-dragging={isDragging || undefined}\n ref={refCallback}\n >\n {children}\n </span>\n </TabContext.Provider>\n );\n};\n\ntype TabsetTriggerProps = ComponentProps<\"button\">;\n\nconst TabsetTrigger = ({\n children,\n onClick,\n onDoubleClick,\n ref: userRef,\n ...props\n}: TabsetTriggerProps): ReactNode => {\n const { index, tab } = useTab();\n const node = useTabset((state) => state.node);\n const editing = useTabset((state) => state.editingTabId === tab.id);\n const selectTab = useTabset((state) => state.selectTab);\n const startEditing = useTabset((state) => state.startEditing);\n const tabsRenamable = useTabset((state) => state.tabsRenamable);\n const visualSelected = useTabset((state) => state.visualSelected);\n const draggableTabs = useLayout((state) => state.draggableTabs);\n const renderTabLabel = useLayout((state) => state.renderTabLabel);\n const { ref } = useTabDraggable(tab.id, !draggableTabs || tab.enableDrag === false, tab.name);\n const refCallback = useMemo(() => mergeRefs<HTMLButtonElement>(ref, userRef), [ref, userRef]);\n\n if (editing) {\n return null;\n }\n\n const selected = index === visualSelected;\n const renamable = tabsRenamable && tab.enableRename !== false;\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n selectTab(index);\n };\n\n const handleDoubleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onDoubleClick?.(event);\n if (renamable) {\n startEditing(tab.id);\n }\n };\n\n return (\n <button\n aria-label={renderTabLabel ? tab.name : undefined}\n {...props}\n aria-controls={panelDomId(node.id)}\n aria-selected={selected}\n data-dashfoo=\"tab\"\n data-tab-id={tab.id}\n id={tabDomId(node.id, tab.id)}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n ref={refCallback}\n role=\"tab\"\n tabIndex={selected ? 0 : -1}\n type=\"button\"\n >\n {children ?? (renderTabLabel ? renderTabLabel(tab) : tab.name)}\n </button>\n );\n};\n\nexport { TabsetTab, TabsetTrigger };\nexport type { TabsetTabProps, TabsetTriggerProps };\n","import type { CSSProperties, ReactNode } from \"react\";\n\nconst iconStyle: CSSProperties = { pointerEvents: \"none\" };\n\nconst Icon = ({ children }: { children: ReactNode }): ReactNode => (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"12\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n style={iconStyle}\n viewBox=\"0 0 24 24\"\n width=\"12\"\n >\n {children}\n </svg>\n);\n\nconst CloseIcon = (): ReactNode => (\n <Icon>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </Icon>\n);\n\nconst GripIcon = (): ReactNode => (\n <Icon>\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"19\" cy=\"5\" r=\"1\" />\n <circle cx=\"5\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n <circle cx=\"19\" cy=\"19\" r=\"1\" />\n <circle cx=\"5\" cy=\"19\" r=\"1\" />\n </Icon>\n);\n\nconst MaximizeIcon = ({ maximized }: { maximized: boolean }): ReactNode =>\n maximized ? (\n <Icon>\n <path d=\"m14 10 7-7\" />\n <path d=\"M20 10h-6V4\" />\n <path d=\"m3 21 7-7\" />\n <path d=\"M4 14h6v6\" />\n </Icon>\n ) : (\n <Icon>\n <path d=\"M15 3h6v6\" />\n <path d=\"m21 3-7 7\" />\n <path d=\"m3 21 7-7\" />\n <path d=\"M9 21H3v-6\" />\n </Icon>\n );\n\nconst FloatIcon = (): ReactNode => (\n <Icon>\n <rect height=\"14\" rx=\"2\" width=\"18\" x=\"3\" y=\"6\" />\n <path d=\"M3 10h18\" />\n </Icon>\n);\n\nconst MinimizeIcon = (): ReactNode => (\n <Icon>\n <path d=\"M5 12h14\" />\n </Icon>\n);\n\nconst DockIcon = (): ReactNode => (\n <Icon>\n <path d=\"M3 7V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-2\" />\n <path d=\"M11 8 7 12l4 4\" />\n <path d=\"M7 12h10\" />\n </Icon>\n);\n\nexport { CloseIcon, DockIcon, FloatIcon, GripIcon, MaximizeIcon, MinimizeIcon };\n","\"use client\";\n\nimport type { ComponentProps, FocusEvent, KeyboardEvent, MouseEvent, ReactNode } from \"react\";\nimport { useEffect, useMemo, useRef } from \"react\";\n\nimport { useInlineRename } from \"../../hooks/use-inline-rename\";\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { CloseIcon } from \"../tabset-icons\";\n\nimport { useTab, useTabset } from \"./tabset-store\";\n\ntype TabsetRenameInputProps = ComponentProps<\"input\">;\n\nconst RenameEditor = ({\n defaultValue,\n onBlur,\n onKeyDown,\n ref: userRef,\n ...props\n}: TabsetRenameInputProps): ReactNode => {\n const { tab } = useTab();\n const cancelRename = useTabset((state) => state.cancelRename);\n const commitRename = useTabset((state) => state.commitRename);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const rename = useInlineRename({\n currentName: tab.name,\n inputRef,\n onCommit: (name) => commitRename(tab.id, name),\n onDone: cancelRename,\n });\n const refCallback = useMemo(() => mergeRefs<HTMLInputElement>(inputRef, userRef), [userRef]);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>): void => {\n onKeyDown?.(event);\n rename.handleKeyDown(event);\n };\n\n const handleCommitOnBlur = (event: FocusEvent<HTMLInputElement>): void => {\n onBlur?.(event);\n rename.handleBlur(event);\n };\n\n return (\n <input\n aria-label={`Rename ${tab.name}`}\n {...props}\n data-dashfoo=\"tab-rename\"\n defaultValue={defaultValue ?? tab.name}\n onBlur={handleCommitOnBlur}\n onKeyDown={handleKeyDown}\n ref={refCallback}\n type=\"text\"\n />\n );\n};\n\nconst TabsetRenameInput = (props: TabsetRenameInputProps): ReactNode => {\n const { tab } = useTab();\n const editing = useTabset((state) => state.editingTabId === tab.id);\n const registerRenameInput = useTabset((state) => state.registerRenameInput);\n\n useEffect(() => registerRenameInput(), [registerRenameInput]);\n\n if (!editing) {\n return null;\n }\n return <RenameEditor {...props} />;\n};\n\ntype TabsetCloseButtonProps = ComponentProps<\"button\">;\n\nconst TabsetCloseButton = ({ children, onClick, ...props }: TabsetCloseButtonProps): ReactNode => {\n const { index, tab } = useTab();\n const closeTab = useTabset((state) => state.closeTab);\n const editing = useTabset((state) => state.editingTabId === tab.id);\n const tabsClosable = useTabset((state) => state.tabsClosable);\n const visualSelected = useTabset((state) => state.visualSelected);\n\n const closable = tabsClosable && tab.enableClose !== false;\n if (!closable || editing) {\n return null;\n }\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n\n event.stopPropagation();\n closeTab(tab.id);\n };\n\n return (\n <button\n aria-label={`Close ${tab.name}`}\n title={`Close ${tab.name}`}\n {...props}\n data-dashfoo=\"tab-close\"\n onClick={handleClick}\n tabIndex={index === visualSelected ? 0 : -1}\n type=\"button\"\n >\n {children ?? <CloseIcon />}\n </button>\n );\n};\n\nexport { RenameEditor, TabsetCloseButton, TabsetRenameInput };\nexport type { TabsetCloseButtonProps, TabsetRenameInputProps };\n","\"use client\";\n\nimport type { ComponentProps, CSSProperties, KeyboardEvent, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\n\nimport { mergeRefs } from \"../../lib/merge-refs\";\n\nimport { useTabset } from \"./tabset-store\";\n\nconst stripStyle: CSSProperties = { display: \"flex\", flexShrink: 0 };\n\nconst tablistStyle: CSSProperties = { display: \"flex\", minWidth: 0, overflowX: \"auto\" };\n\ntype TabsetTabStripProps = ComponentProps<\"div\">;\n\nconst TabsetTabStrip = ({ style, ...props }: TabsetTabStripProps): ReactNode => (\n <div {...props} data-dashfoo=\"tabstrip\" style={{ ...stripStyle, ...style }} />\n);\n\ntype TabsetTablistProps = ComponentProps<\"div\">;\n\nconst TabsetTablist = ({\n onKeyDown,\n ref: userRef,\n style,\n ...props\n}: TabsetTablistProps): ReactNode => {\n const node = useTabset((state) => state.node);\n const registerTablist = useTabset((state) => state.registerTablist);\n const selectTab = useTabset((state) => state.selectTab);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n onKeyDown?.(event);\n if (event.defaultPrevented) {\n return;\n }\n\n if (!(event.target instanceof HTMLElement) || !event.target.closest('[role=\"tab\"]')) {\n return;\n }\n const count = node.children.length;\n if (count === 0) {\n return;\n }\n const targets: Record<string, number> = {\n ArrowLeft: (node.selected - 1 + count) % count,\n ArrowRight: (node.selected + 1) % count,\n End: count - 1,\n Home: 0,\n };\n const next = targets[event.key];\n if (next === undefined) {\n return;\n }\n event.preventDefault();\n selectTab(next, { focus: true });\n };\n\n const refCallback = useMemo(\n () => mergeRefs<HTMLDivElement>(registerTablist, userRef),\n [registerTablist, userRef],\n );\n\n return (\n <div\n aria-label={node.name ?? \"Tabs\"}\n {...props}\n aria-orientation=\"horizontal\"\n data-dashfoo=\"tablist\"\n onKeyDown={handleKeyDown}\n ref={refCallback}\n role=\"tablist\"\n style={{ ...tablistStyle, ...style }}\n tabIndex={-1}\n />\n );\n};\n\nexport { TabsetTablist, TabsetTabStrip };\nexport type { TabsetTablistProps, TabsetTabStripProps };\n","\"use client\";\n\nimport type { ComponentProps, CSSProperties, MouseEvent, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\nimport { measureFloatRect } from \"../../lib/float-geometry\";\nimport { mergeRefs } from \"../../lib/merge-refs\";\nimport { warnOnce } from \"../../lib/warn-once\";\nimport { useTabsetDraggable } from \"../drag-adapter\";\nimport { useHasFloatLayer } from \"../float-context\";\nimport { FloatIcon, GripIcon, MaximizeIcon } from \"../tabset-icons\";\n\nimport { useTabset } from \"./tabset-store\";\n\nconst toolbarStyle: CSSProperties = {\n alignItems: \"center\",\n display: \"flex\",\n flexShrink: 0,\n marginInlineStart: \"auto\",\n};\n\ntype TabsetToolbarProps = ComponentProps<\"div\">;\n\nconst TabsetToolbar = ({ style, ...props }: TabsetToolbarProps): ReactNode => (\n <div {...props} data-dashfoo=\"tabset-toolbar\" style={{ ...toolbarStyle, ...style }} />\n);\n\ntype TabsetGripProps = ComponentProps<\"button\">;\n\nconst TabsetGrip = ({ children, ref: userRef, ...props }: TabsetGripProps): ReactNode => {\n const activeTabName = useTabset((state) => state.activeTab?.name ?? \"\");\n const isMaximized = useTabset((state) => state.isMaximized);\n const node = useTabset((state) => state.node);\n const draggableTabsets = useLayout((state) => state.draggableTabsets);\n const hidden = !draggableTabsets || isMaximized;\n const { ref } = useTabsetDraggable(node.id, hidden, activeTabName);\n const refCallback = useMemo(() => mergeRefs<HTMLButtonElement>(ref, userRef), [ref, userRef]);\n\n if (hidden) {\n return null;\n }\n\n return (\n <button\n aria-label=\"Move tabset\"\n title=\"Move tabset\"\n {...props}\n data-dashfoo=\"tabset-grip\"\n ref={refCallback}\n type=\"button\"\n >\n {children ?? <GripIcon />}\n </button>\n );\n};\n\ntype TabsetMaximizeButtonProps = ComponentProps<\"button\">;\n\nconst TabsetMaximizeButton = ({\n children,\n onClick,\n ...props\n}: TabsetMaximizeButtonProps): ReactNode => {\n const isMaximized = useTabset((state) => state.isMaximized);\n const showMaximize = useTabset((state) => state.showMaximize);\n const toggleMaximize = useTabset((state) => state.toggleMaximize);\n\n if (!showMaximize) {\n return null;\n }\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n toggleMaximize();\n };\n\n return (\n <button\n aria-label={isMaximized ? \"Restore\" : \"Maximize\"}\n title={isMaximized ? \"Restore tabset\" : \"Maximize tabset\"}\n {...props}\n aria-pressed={isMaximized}\n data-dashfoo=\"tabset-maximize\"\n onClick={handleClick}\n type=\"button\"\n >\n {children ?? <MaximizeIcon maximized={isMaximized} />}\n </button>\n );\n};\n\ntype TabsetFloatButtonProps = ComponentProps<\"button\">;\n\nconst TabsetFloatButton = ({ children, onClick, ...props }: TabsetFloatButtonProps): ReactNode => {\n const floatable = useLayout((state) => state.floatable);\n const dispatch = useLayout((state) => state.dispatch);\n const isMaximized = useTabset((state) => state.isMaximized);\n const node = useTabset((state) => state.node);\n const hasFloatLayer = useHasFloatLayer();\n\n if (!floatable || isMaximized) {\n return null;\n }\n\n if (!hasFloatLayer) {\n warnOnce(\n \"float-no-layer\",\n \"Tabset.FloatButton needs a <Layout.FloatLayer> around the layout (DashfooLayout adds one); the float control is hidden\",\n );\n return null;\n }\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n const geometry = measureFloatRect(event.currentTarget);\n dispatch({ geometry, tabsetId: node.id, type: \"floatTabset\" });\n };\n\n return (\n <button\n aria-label=\"Float panel\"\n title=\"Float panel\"\n {...props}\n data-dashfoo=\"tabset-float\"\n onClick={handleClick}\n type=\"button\"\n >\n {children ?? <FloatIcon />}\n </button>\n );\n};\n\nexport { TabsetFloatButton, TabsetGrip, TabsetMaximizeButton, TabsetToolbar };\nexport type {\n TabsetFloatButtonProps,\n TabsetGripProps,\n TabsetMaximizeButtonProps,\n TabsetToolbarProps,\n};\n","\"use client\";\n\nimport type { TabsetNode } from \"@dashfoo/core\";\nimport type { ReactNode } from \"react\";\n\nimport { useLayout } from \"../../hooks/layout-store\";\n\nimport { TabsetContent } from \"./tabset-content\";\nimport { TabsetOverflowMenu } from \"./tabset-overflow\";\nimport { TabsetRoot } from \"./tabset-root\";\nimport { useTabset } from \"./tabset-store\";\nimport { TabsetTab, TabsetTrigger } from \"./tabset-tab\";\nimport { TabsetCloseButton, TabsetRenameInput } from \"./tabset-tab-controls\";\nimport { TabsetTablist, TabsetTabStrip } from \"./tabset-tablist\";\nimport {\n TabsetFloatButton,\n TabsetGrip,\n TabsetMaximizeButton,\n TabsetToolbar,\n} from \"./tabset-toolbar\";\n\nconst tabsetContent = <TabsetContent />;\n\nconst DefaultTabsetLayout = (): ReactNode => {\n const draggableTabsets = useLayout((state) => state.draggableTabsets);\n const floatable = useLayout((state) => state.floatable);\n const renderTabsetToolbar = useLayout((state) => state.renderTabsetToolbar);\n const tabLocation = useLayout((state) => state.tabLocation);\n const tabStripEnabled = useLayout((state) => state.tabStripEnabled);\n const isMaximized = useTabset((state) => state.isMaximized);\n const node = useTabset((state) => state.node);\n const overflowCount = useTabset((state) => state.overflowItems.length);\n const showMaximize = useTabset((state) => state.showMaximize);\n\n const showToolbar =\n showMaximize ||\n renderTabsetToolbar !== undefined ||\n overflowCount > 0 ||\n (floatable && !isMaximized) ||\n (draggableTabsets && !isMaximized);\n\n const strip = tabStripEnabled ? (\n <TabsetTabStrip>\n <TabsetTablist>\n {node.children.map((tab) => (\n <TabsetTab key={tab.id} tab={tab}>\n <TabsetTrigger />\n <TabsetRenameInput />\n <TabsetCloseButton />\n </TabsetTab>\n ))}\n </TabsetTablist>\n {showToolbar ? (\n <TabsetToolbar>\n <TabsetOverflowMenu />\n <TabsetGrip />\n {renderTabsetToolbar?.(node)}\n <TabsetFloatButton />\n <TabsetMaximizeButton />\n </TabsetToolbar>\n ) : null}\n </TabsetTabStrip>\n ) : null;\n\n return tabLocation === \"bottom\" ? (\n <>\n {tabsetContent}\n {strip}\n </>\n ) : (\n <>\n {strip}\n {tabsetContent}\n </>\n );\n};\n\ntype TabsetViewProps = { node: TabsetNode };\n\nconst TabsetView = ({ node }: TabsetViewProps): ReactNode => (\n <TabsetRoot node={node}>\n <DefaultTabsetLayout />\n </TabsetRoot>\n);\n\nexport { TabsetView };\nexport type { TabsetViewProps };\n","\"use client\";\n\nimport type { Dimension, RowNode, SnapConfig, TabsetNode } from \"@dashfoo/core\";\nimport { snapEnabled, snapSizes } from \"@dashfoo/core\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { Fragment, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n GroupImperativeHandle,\n Layout,\n LayoutChangedMeta,\n Orientation,\n} from \"react-resizable-panels\";\nimport { Group, Panel, Separator } from \"react-resizable-panels\";\n\nimport { useLayout } from \"../hooks/layout-store\";\n\nimport { TabsetView } from \"./tabset/tabset-view\";\n\nconst dimensionToSize = (dimension: Dimension): string => `${dimension.value}${dimension.unit}`;\nconst dimensionToPixels = (dimension: Dimension | undefined): number | undefined =>\n dimension?.unit === \"px\" ? dimension.value : undefined;\n\nconst groupStyle: CSSProperties = { display: \"flex\", flex: 1, minHeight: 0, minWidth: 0 };\nconst WEIGHT_EPSILON = 0.01;\n\ntype LayoutChild = RowNode[\"children\"][number];\n\nconst layoutFromWeights = (children: RowNode[\"children\"], total: number): Layout =>\n children.reduce<Layout>((layout, child) => {\n layout[child.id] = ((child.weight ?? 1) / total) * 100;\n return layout;\n }, {});\n\nconst orderedFromLayout = (layout: Layout, children: RowNode[\"children\"]): Array<number> =>\n children.map((child) => layout[child.id] ?? 0);\n\nconst layoutFromOrdered = (sizes: Array<number>, children: RowNode[\"children\"]): Layout =>\n children.reduce<Layout>((layout, child, index) => {\n layout[child.id] = sizes[index] ?? 0;\n return layout;\n }, {});\n\nconst layoutsMatch = (current: Layout, expected: Layout): boolean => {\n const currentIds = Object.keys(current);\n const expectedIds = Object.keys(expected);\n if (currentIds.length !== expectedIds.length) {\n return false;\n }\n return expectedIds.every(\n (id) => Math.abs((current[id] ?? Number.NaN) - expected[id]) <= WEIGHT_EPSILON,\n );\n};\n\nconst descendantMinSize = (\n child: LayoutChild,\n axis: RowNode[\"orientation\"],\n tabsetMinSize: number,\n): number | undefined => {\n const explicit = dimensionToPixels(child.min);\n if (explicit !== undefined) {\n return explicit;\n }\n if (child.min !== undefined) {\n return undefined;\n }\n if (child.type === \"tabset\") {\n return tabsetMinSize;\n }\n\n const childMinimums: Array<number> = [];\n for (const grandchild of child.children) {\n const minimum = descendantMinSize(grandchild, axis, tabsetMinSize);\n if (minimum === undefined) {\n return undefined;\n }\n childMinimums.push(minimum);\n }\n if (childMinimums.length === 0) {\n return undefined;\n }\n\n return child.orientation === axis\n ? childMinimums.reduce((sum, value) => sum + value, 0)\n : Math.max(...childMinimums);\n};\n\ntype RowViewProps = {\n node: RowNode;\n\n renderTabset?: (node: TabsetNode) => ReactNode;\n};\n\nconst RowView = ({ node, renderTabset }: RowViewProps): ReactNode => {\n const dispatch = useLayout((state) => state.dispatch);\n const resizableSplits = useLayout((state) => state.resizableSplits);\n const tabsetMinSize = useLayout((state) => state.tabsetMinSize);\n const globalSnap = useLayout((state) => state.snap);\n\n const effectiveSnap: SnapConfig | null = node.snap ?? globalSnap;\n const snapActive = snapEnabled(effectiveSnap);\n const orientation: Orientation = node.orientation === \"row\" ? \"horizontal\" : \"vertical\";\n const total = node.children.reduce((sum, child) => sum + (child.weight ?? 1), 0);\n const desiredLayout = useMemo(\n () => layoutFromWeights(node.children, total),\n [node.children, total],\n );\n\n const groupRef = useRef<GroupImperativeHandle | null>(null);\n const groupElement = useRef<HTMLDivElement | null>(null);\n const syncing = useRef(false);\n\n const activeBoundary = useRef<number | null>(null);\n const snapping = useRef(false);\n const snappedBoundaryRef = useRef<number | null>(null);\n const [snappedBoundary, setSnappedBoundary] = useState<number | null>(null);\n\n const setHighlight = (boundary: number | null): void => {\n if (boundary !== snappedBoundaryRef.current) {\n snappedBoundaryRef.current = boundary;\n setSnappedBoundary(boundary);\n }\n };\n\n const setSnapTransition = (active: boolean): void => {\n const element = groupElement.current;\n if (!element) {\n return;\n }\n if (active) {\n element.dataset.dashfooSnapping = \"true\";\n } else {\n delete element.dataset.dashfooSnapping;\n }\n };\n\n useLayoutEffect(() => {\n const group = groupRef.current;\n if (!group) {\n return;\n }\n const current = group.getLayout();\n const samePanelSet =\n Object.keys(current).length === Object.keys(desiredLayout).length &&\n Object.keys(desiredLayout).every((id) => id in current);\n if (!samePanelSet || layoutsMatch(current, desiredLayout)) {\n return;\n }\n\n syncing.current = true;\n group.setLayout(desiredLayout);\n const frame = requestAnimationFrame(() => {\n syncing.current = false;\n });\n return () => {\n cancelAnimationFrame(frame);\n syncing.current = false;\n };\n }, [desiredLayout]);\n\n const handleLayoutChange = (layout: Layout): void => {\n if (snapping.current || syncing.current || !resizableSplits) {\n return;\n }\n if (effectiveSnap === null || !snapActive) {\n return;\n }\n const boundary = activeBoundary.current;\n if (boundary === null) {\n return;\n }\n\n const { sizes, snapped } = snapSizes(\n orderedFromLayout(layout, node.children),\n boundary,\n effectiveSnap,\n );\n setHighlight(snapped ? boundary : null);\n if (!snapped) {\n setSnapTransition(false);\n return;\n }\n\n setSnapTransition(true);\n const group = groupRef.current;\n const target = layoutFromOrdered(sizes, node.children);\n if (!group || layoutsMatch(layout, target)) {\n return;\n }\n snapping.current = true;\n group.setLayout(target);\n snapping.current = false;\n };\n\n const handleLayoutChanged = (layout: Layout, meta: LayoutChangedMeta): void => {\n if (!meta.isUserInteraction) {\n return;\n }\n if (syncing.current) {\n return;\n }\n const boundary = activeBoundary.current;\n activeBoundary.current = null;\n setHighlight(null);\n setSnapTransition(false);\n\n if (!resizableSplits) {\n return;\n }\n let weights = node.children.map((child) => layout[child.id] ?? child.weight ?? 1);\n\n if (boundary !== null && effectiveSnap !== null && snapActive) {\n weights = snapSizes(weights, boundary, effectiveSnap).sizes;\n }\n const weightsChanged = weights.some(\n (weight, index) => Math.abs(weight - (node.children[index]?.weight ?? 1)) > WEIGHT_EPSILON,\n );\n\n if (!weightsChanged) {\n return;\n }\n\n dispatch({\n rowId: node.id,\n type: \"adjustSplit\",\n weights,\n });\n };\n\n return (\n <Group\n data-dashfoo=\"row\"\n disabled={!resizableSplits}\n elementRef={groupElement}\n groupRef={groupRef}\n key={node.id}\n onLayoutChange={snapActive ? handleLayoutChange : undefined}\n onLayoutChanged={handleLayoutChanged}\n orientation={orientation}\n style={groupStyle}\n >\n {node.children.map((child, index) => {\n const percent = ((child.weight ?? 1) / total) * 100;\n let min = child.min ? dimensionToSize(child.min) : undefined;\n if (min === undefined) {\n const minimum = descendantMinSize(child, node.orientation, tabsetMinSize);\n min = minimum === undefined ? undefined : `${minimum}px`;\n }\n const max = child.max ? dimensionToSize(child.max) : undefined;\n\n return (\n <Fragment key={child.id}>\n {index > 0 ? (\n <Separator\n data-dashfoo=\"splitter\"\n data-dashfoo-snapped={snappedBoundary === index - 1 ? \"true\" : undefined}\n disabled={!resizableSplits}\n onPointerDown={\n snapActive && resizableSplits\n ? () => {\n activeBoundary.current = index - 1;\n }\n : undefined\n }\n />\n ) : null}\n <Panel defaultSize={`${percent}%`} id={child.id} maxSize={max} minSize={min}>\n {child.type === \"row\" ? (\n <RowView node={child} renderTabset={renderTabset} />\n ) : (\n (renderTabset?.(child) ?? <TabsetView node={child} />)\n )}\n </Panel>\n </Fragment>\n );\n })}\n </Group>\n );\n};\n\nexport { RowView };\nexport type { RowViewProps };\n","\"use client\";\n\nimport type { Action, Dashfoo, FloatNode, Geometry, GlobalAttributes } from \"@dashfoo/core\";\nimport type { CSSProperties, PointerEvent as ReactPointerEvent, ReactNode } from \"react\";\nimport { useRef, useState } from \"react\";\n\nimport { useLayout } from \"../hooks/layout-store\";\nimport { useInlineRename } from \"../hooks/use-inline-rename\";\nimport type { ResizeEdges, Size } from \"../lib/float-geometry\";\nimport { clampToBounds, resizeRect } from \"../lib/float-geometry\";\n\nimport { DragProvider } from \"./drag-adapter\";\nimport { EDGE_BY_KEY, RESIZE_HANDLES } from \"./float-resize-handles\";\nimport { LayoutRoot } from \"./layout-root\";\nimport { RowView } from \"./row-view\";\nimport { DockIcon, FloatIcon, GripIcon, MinimizeIcon } from \"./tabset-icons\";\n\nconst floatTitle = (node: FloatNode): string => node.name ?? \"Panel\";\n\nconst titleBarStyle: CSSProperties = {\n alignItems: \"center\",\n display: \"flex\",\n flexShrink: 0,\n gap: \"0.375rem\",\n touchAction: \"none\",\n};\n\nconst titleStyle: CSSProperties = {\n flex: 1,\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n};\n\nconst dockButtonStyle: CSSProperties = {\n alignItems: \"center\",\n cursor: \"pointer\",\n display: \"inline-flex\",\n flexShrink: 0,\n};\n\nconst bodyStyle: CSSProperties = { flex: 1, minHeight: 0, position: \"relative\" };\n\nconst CHIP_SIZE: Size = { height: 34, width: 168 };\n\nconst TAP_SLOP = 4;\n\ntype Gesture = {\n bounds: Size;\n edges: ResizeEdges | null;\n pointerId: number;\n start: Geometry;\n startX: number;\n startY: number;\n};\n\ntype TitleProps = { dispatch: (action: Action) => void; node: FloatNode };\n\nconst FloatTitleEditor = ({\n dispatch,\n node,\n onDone,\n}: TitleProps & { onDone: () => void }): ReactNode => {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const { handleBlur, handleKeyDown } = useInlineRename({\n currentName: floatTitle(node),\n inputRef,\n onCommit: (name) => dispatch({ floatId: node.id, name, type: \"renameFloat\" }),\n onDone,\n });\n\n return (\n <input\n aria-label={`Rename ${floatTitle(node)}`}\n data-dashfoo=\"float-rename\"\n defaultValue={floatTitle(node)}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onPointerDown={(event) => event.stopPropagation()}\n ref={inputRef}\n style={titleStyle}\n type=\"text\"\n />\n );\n};\n\nconst FloatTitle = ({\n dispatch,\n node,\n renamable,\n}: TitleProps & { renamable: boolean }): ReactNode => {\n const [editing, setEditing] = useState(false);\n if (renamable && editing) {\n return <FloatTitleEditor dispatch={dispatch} node={node} onDone={() => setEditing(false)} />;\n }\n return (\n <span\n data-dashfoo=\"float-title\"\n onDoubleClick={renamable ? () => setEditing(true) : undefined}\n style={titleStyle}\n title={renamable ? \"Double-click to rename\" : undefined}\n >\n {floatTitle(node)}\n </span>\n );\n};\n\ntype FloatPanelProps = {\n global: GlobalAttributes;\n node: FloatNode;\n onFocus: () => void;\n zIndex: number;\n};\n\nconst FloatPanel = ({ global, node, onFocus, zIndex }: FloatPanelProps): ReactNode => {\n const dispatch = useLayout((state) => state.dispatch);\n const closableTabs = useLayout((state) => state.closableTabs);\n const draggableTabs = useLayout((state) => state.draggableTabs);\n const editable = useLayout((state) => state.editable);\n const renamableTabs = useLayout((state) => state.renamableTabs);\n const resizableSplits = useLayout((state) => state.resizableSplits);\n const keepMounted = useLayout((state) => state.keepMounted);\n const renderTab = useLayout((state) => state.renderTab);\n const renderTabLabel = useLayout((state) => state.renderTabLabel);\n const renderTabsetToolbar = useLayout((state) => state.renderTabsetToolbar);\n const snap = useLayout((state) => state.snap);\n\n const panelRef = useRef<HTMLElement | null>(null);\n const gestureRef = useRef<Gesture | null>(null);\n const latestRef = useRef<Geometry>(node.geometry);\n const movedRef = useRef(false);\n const setPanel = (element: HTMLElement | null): void => {\n panelRef.current = element;\n };\n\n const restore = (): void => {\n if (!editable) {\n return;\n }\n dispatch({ floatId: node.id, minimized: false, type: \"setFloatMinimized\" });\n };\n\n const handlePointerDown = (event: ReactPointerEvent<HTMLElement>): void => {\n const panel = panelRef.current;\n\n if (!panel || !editable) {\n return;\n }\n\n const prior = gestureRef.current;\n if (prior && panel.hasPointerCapture?.(prior.pointerId)) {\n panel.releasePointerCapture(prior.pointerId);\n }\n movedRef.current = false;\n const edgeKey = event.currentTarget.dataset.edge;\n\n const parent = panel.offsetParent as HTMLElement | null;\n const gesture: Gesture = {\n bounds: { height: parent?.clientHeight ?? 0, width: parent?.clientWidth ?? 0 },\n edges: edgeKey ? (EDGE_BY_KEY.get(edgeKey) ?? null) : null,\n pointerId: event.pointerId,\n start: node.geometry,\n startX: event.clientX,\n startY: event.clientY,\n };\n gestureRef.current = gesture;\n latestRef.current = node.geometry;\n\n if (gesture.edges) {\n panel.setPointerCapture(event.pointerId);\n }\n };\n\n const handlePointerUp = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n if (!gesture || event.pointerId !== gesture.pointerId) {\n return;\n }\n gestureRef.current = null;\n\n const panel = panelRef.current;\n if (panel?.hasPointerCapture?.(event.pointerId)) {\n panel.releasePointerCapture(event.pointerId);\n }\n\n if (!movedRef.current) {\n if (node.minimized) {\n restore();\n }\n return;\n }\n dispatch({ floatId: node.id, geometry: latestRef.current, type: \"moveFloat\" });\n };\n\n const handlePointerMove = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n const panel = panelRef.current;\n if (!gesture || !panel || event.pointerId !== gesture.pointerId) {\n return;\n }\n\n if (event.buttons === 0) {\n handlePointerUp(event);\n return;\n }\n const dx = event.clientX - gesture.startX;\n const dy = event.clientY - gesture.startY;\n if (!movedRef.current) {\n if (Math.hypot(dx, dy) <= TAP_SLOP) {\n return;\n }\n movedRef.current = true;\n\n if (!gesture.edges) {\n panel.setPointerCapture(gesture.pointerId);\n }\n }\n const next = gesture.edges\n ? resizeRect(gesture.start, gesture.edges, dx, dy)\n : clampToBounds(\n { ...gesture.start, left: gesture.start.left + dx, top: gesture.start.top + dy },\n gesture.bounds,\n node.minimized ? CHIP_SIZE : undefined,\n );\n\n latestRef.current = next;\n panel.style.left = `${next.left}px`;\n panel.style.top = `${next.top}px`;\n\n if (!node.minimized) {\n panel.style.width = `${next.width}px`;\n panel.style.height = `${next.height}px`;\n }\n };\n\n const handlePointerCancel = (event: ReactPointerEvent): void => {\n const gesture = gestureRef.current;\n const panel = panelRef.current;\n if (!gesture || !panel || event.pointerId !== gesture.pointerId) {\n return;\n }\n gestureRef.current = null;\n if (panel.hasPointerCapture?.(event.pointerId)) {\n panel.releasePointerCapture(event.pointerId);\n }\n if (!movedRef.current) {\n return;\n }\n panel.style.left = `${gesture.start.left}px`;\n panel.style.top = `${gesture.start.top}px`;\n if (!node.minimized) {\n panel.style.width = `${gesture.start.width}px`;\n panel.style.height = `${gesture.start.height}px`;\n }\n };\n\n if (node.minimized) {\n return (\n <button\n aria-label={`Restore ${floatTitle(node)} panel`}\n data-dashfoo=\"float-chip\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n restore();\n }\n }}\n onPointerCancel={handlePointerCancel}\n onPointerDown={handlePointerDown}\n onPointerDownCapture={onFocus}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n ref={setPanel}\n style={{\n left: node.geometry.left,\n pointerEvents: \"auto\",\n position: \"absolute\",\n top: node.geometry.top,\n zIndex,\n }}\n title={floatTitle(node)}\n type=\"button\"\n >\n <FloatIcon />\n <span data-dashfoo=\"float-chip-label\">{floatTitle(node)}</span>\n </button>\n );\n }\n\n const floatModel: Dashfoo = { global, layout: node.layout, version: 1 };\n\n return (\n <div\n data-dashfoo=\"float\"\n onPointerCancel={handlePointerCancel}\n onPointerDownCapture={onFocus}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n ref={setPanel}\n style={{\n height: node.geometry.height,\n left: node.geometry.left,\n\n pointerEvents: \"auto\",\n position: \"absolute\",\n top: node.geometry.top,\n width: node.geometry.width,\n zIndex,\n }}\n >\n <div\n data-dashfoo=\"float-titlebar\"\n onPointerDown={handlePointerDown}\n style={editable ? titleBarStyle : { ...titleBarStyle, cursor: \"default\" }}\n >\n <span aria-hidden=\"true\" data-dashfoo=\"float-grip\">\n <GripIcon />\n </span>\n <FloatTitle dispatch={dispatch} node={node} renamable={editable} />\n {editable && (\n <>\n <button\n aria-label=\"Minimize panel\"\n data-dashfoo=\"float-minimize\"\n onClick={() =>\n dispatch({ floatId: node.id, minimized: true, type: \"setFloatMinimized\" })\n }\n onPointerDown={(event) => event.stopPropagation()}\n style={dockButtonStyle}\n title=\"Minimize panel\"\n type=\"button\"\n >\n <MinimizeIcon />\n </button>\n <button\n aria-label=\"Dock panel back into the main layout\"\n data-dashfoo=\"float-dock\"\n onClick={() => dispatch({ floatId: node.id, type: \"dockFloat\" })}\n onPointerDown={(event) => event.stopPropagation()}\n style={dockButtonStyle}\n title=\"Dock panel back\"\n type=\"button\"\n >\n <DockIcon />\n </button>\n </>\n )}\n </div>\n <div data-dashfoo=\"float-body\" style={bodyStyle}>\n <LayoutRoot\n closableTabs={closableTabs}\n dispatch={dispatch}\n draggableTabs={draggableTabs}\n draggableTabsets={false}\n editable={editable}\n floatable={false}\n keepMounted={keepMounted}\n maximizable={false}\n model={floatModel}\n renamableTabs={renamableTabs}\n renderTab={renderTab}\n renderTabLabel={renderTabLabel}\n renderTabsetToolbar={renderTabsetToolbar}\n resizableSplits={resizableSplits}\n snap={snap ?? undefined}\n >\n <DragProvider>\n <RowView node={node.layout} />\n </DragProvider>\n </LayoutRoot>\n </div>\n {editable &&\n RESIZE_HANDLES.map((handle) => (\n <div\n data-dashfoo=\"float-resize\"\n data-edge={handle.key}\n key={handle.key}\n onPointerDown={handlePointerDown}\n style={{ position: \"absolute\", touchAction: \"none\", zIndex: 1, ...handle.style }}\n />\n ))}\n </div>\n );\n};\n\nexport { FloatPanel, FloatTitleEditor };\nexport type { FloatPanelProps };\n","\"use client\";\n\nimport type { FloatNode, GlobalAttributes } from \"@dashfoo/core\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { useState } from \"react\";\n\nimport { FloatLayerContext } from \"./float-context\";\nimport { FloatPanel } from \"./float-panel\";\n\nconst overlayStyle: CSSProperties = {\n inset: 0,\n\n pointerEvents: \"none\",\n position: \"fixed\",\n\n zIndex: 1,\n};\n\nconst FloatOverlay = ({\n floats,\n global,\n}: {\n floats: Array<FloatNode>;\n global: GlobalAttributes;\n}): ReactNode => {\n const [topId, setTopId] = useState<string | null>(null);\n if (floats.length === 0) {\n return null;\n }\n return (\n <div data-dashfoo=\"float-overlay\" style={overlayStyle}>\n {floats.map((node) => (\n <FloatPanel\n global={global}\n key={node.id}\n node={node}\n onFocus={() => setTopId(node.id)}\n zIndex={node.id === topId ? 2 : 1}\n />\n ))}\n </div>\n );\n};\n\ntype FloatLayerProps = {\n children: ReactNode;\n floats: Array<FloatNode>;\n global: GlobalAttributes;\n};\n\nconst FloatLayer = ({ children, floats, global }: FloatLayerProps): ReactNode => (\n <FloatLayerContext.Provider value>\n {children}\n <FloatOverlay floats={floats} global={global} />\n </FloatLayerContext.Provider>\n);\n\nexport { FloatLayer };\nexport type { FloatLayerProps };\n","\"use client\";\n\nimport { DragProvider } from \"./drag-adapter\";\nimport { FloatLayer } from \"./float-layer\";\nimport { LayoutRoot } from \"./layout-root\";\nimport { RowView } from \"./row-view\";\nimport { TabsetView } from \"./tabset/tabset-view\";\n\nconst Layout = {\n DragLayer: DragProvider,\n FloatLayer,\n Root: LayoutRoot,\n Rows: RowView,\n Tabset: TabsetView,\n} as const;\n\nexport { Layout };\nexport type { DragProviderProps as LayoutDragLayerProps } from \"./drag-adapter\";\nexport type { FloatLayerProps as LayoutFloatLayerProps } from \"./float-layer\";\nexport type { LayoutRootProps } from \"./layout-root\";\nexport type { RowViewProps as LayoutRowsProps } from \"./row-view\";\nexport type { TabsetViewProps as LayoutTabsetProps } from \"./tabset/tabset-view\";\n","\"use client\";\n\nimport type {\n Action,\n Dashfoo,\n DockLocation,\n Orientation,\n SnapConfig,\n TabNode,\n TabsetNode,\n} from \"@dashfoo/core\";\nimport { findTabset, stackModel } from \"@dashfoo/core\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport { forwardRef, useCallback, useContext, useImperativeHandle, useMemo } from \"react\";\n\nimport { SharedDragManagerContext } from \"../hooks/drag-hooks\";\nimport type { PersistConfig, StorageAdapter } from \"../hooks/persistence\";\nimport { localStorageAdapter, usePersistence } from \"../hooks/persistence\";\nimport { useContainerWidth } from \"../hooks/responsive\";\nimport { useDashfooStore } from \"../hooks/store\";\n\nimport { DashfooDragProvider } from \"./drag-root\";\nimport { Layout } from \"./layout\";\n\nconst DEFAULT_PERSIST_DEBOUNCE_MS = 300;\n\ntype PersistInput = string | { debounceMs?: number; key: string; storage?: StorageAdapter };\n\nconst resolvePersist = (\n persist: PersistInput | undefined,\n hasDefaultModel: boolean,\n): PersistConfig | null => {\n if (persist === undefined || !hasDefaultModel) {\n return null;\n }\n if (typeof persist === \"string\") {\n return { debounceMs: DEFAULT_PERSIST_DEBOUNCE_MS, key: persist, storage: localStorageAdapter };\n }\n return {\n debounceMs: persist.debounceMs ?? DEFAULT_PERSIST_DEBOUNCE_MS,\n key: persist.key,\n storage: persist.storage ?? localStorageAdapter,\n };\n};\n\ntype TabComponent = ComponentType<{ node: TabNode }>;\n\nconst warnedComponents = new Set<string>();\n\ntype DashfooHandle = {\n addTab: (\n tab: TabNode,\n target: { index?: number; location?: DockLocation; targetId: string },\n ) => void;\n canRedo: () => boolean;\n canUndo: () => boolean;\n closeTab: (tabId: string) => void;\n dispatch: (action: Action) => void;\n\n dockFloat: (floatId: string) => void;\n\n floatTab: (tabId: string) => void;\n getModel: () => Dashfoo;\n maximizeTabset: (tabsetId: string | null) => void;\n redo: () => void;\n renameTab: (tabId: string, name: string) => void;\n\n resetLayout: () => void;\n selectTab: (tabsetId: string, index: number) => void;\n undo: () => void;\n};\n\ntype DashfooLayoutProps = {\n closableTabs?: boolean;\n components?: Record<string, TabComponent>;\n defaultModel?: Dashfoo;\n draggableTabs?: boolean;\n draggableTabsets?: boolean;\n\n editable?: boolean;\n factory?: (tab: TabNode) => ReactNode;\n\n floatable?: boolean;\n keepMounted?: boolean;\n maximizable?: boolean;\n model?: Dashfoo;\n onAction?: (action: Action) => Action | null;\n onActiveTabsetChange?: (tabsetId: string | undefined) => void;\n onMaximizedTabsetChange?: (tabsetId: string | undefined) => void;\n onModelChange?: (model: Dashfoo, action?: Action) => void;\n persist?: PersistInput;\n renamableTabs?: boolean;\n renderTabLabel?: (tab: TabNode) => ReactNode;\n renderTabsetToolbar?: (tabset: TabsetNode) => ReactNode;\n\n resizableSplits?: boolean;\n responsive?: { maxWidth: number; orientation?: Orientation };\n\n snap?: SnapConfig;\n};\n\nconst DashfooLayout = forwardRef<DashfooHandle, DashfooLayoutProps>((props, ref): ReactNode => {\n const {\n closableTabs = true,\n components,\n defaultModel,\n draggableTabs = true,\n draggableTabsets = true,\n editable = true,\n factory,\n floatable = false,\n keepMounted = false,\n maximizable = true,\n model,\n onAction,\n onActiveTabsetChange,\n onMaximizedTabsetChange,\n onModelChange,\n persist,\n renamableTabs = true,\n renderTabLabel,\n renderTabsetToolbar,\n resizableSplits = true,\n responsive,\n snap,\n } = props;\n\n const persistConfig = useMemo(\n () => resolvePersist(persist, defaultModel !== undefined),\n [persist, defaultModel],\n );\n const persistence = usePersistence(persistConfig, defaultModel);\n\n const handleModelChange = useCallback(\n (next: Dashfoo, action?: Action): void => {\n persistence.save(next);\n onModelChange?.(next, action);\n },\n [onModelChange, persistence],\n );\n\n const store = useDashfooStore({\n defaultModel: persistence.initialModel ?? defaultModel,\n model,\n onAction,\n onActiveTabsetChange,\n onMaximizedTabsetChange,\n onModelChange: handleModelChange,\n });\n\n const hasSharedManager = useContext(SharedDragManagerContext) !== null;\n\n useImperativeHandle(\n ref,\n () => ({\n addTab: (tab, target) =>\n store.dispatch({\n index: target.index,\n location: target.location ?? \"center\",\n tab,\n targetId: target.targetId,\n type: \"addNode\",\n }),\n canRedo: store.canRedo,\n canUndo: store.canUndo,\n closeTab: (tabId) => store.dispatch({ tabId, type: \"deleteTab\" }),\n dispatch: store.dispatch,\n dockFloat: (floatId) => store.dispatch({ floatId, type: \"dockFloat\" }),\n floatTab: (tabId) => store.dispatch({ tabId, type: \"floatTab\" }),\n getModel: () => store.model,\n maximizeTabset: (tabsetId) => store.dispatch({ tabsetId, type: \"setMaximizedTabset\" }),\n redo: store.redo,\n renameTab: (tabId, name) => store.dispatch({ name, tabId, type: \"renameTab\" }),\n resetLayout: () => {\n persistence.clear();\n if (defaultModel !== undefined) {\n store.setModel(defaultModel);\n }\n },\n selectTab: (tabsetId, index) => store.dispatch({ index, tabsetId, type: \"selectTab\" }),\n undo: store.undo,\n }),\n [defaultModel, persistence, store],\n );\n\n const renderTab = useCallback(\n (tab: TabNode): ReactNode => {\n if (factory) {\n return factory(tab);\n }\n const Component = components?.[tab.component];\n if (!Component) {\n if (components && !warnedComponents.has(tab.component)) {\n warnedComponents.add(tab.component);\n\n // oxlint-disable-next-line no-console\n console.warn(`[dashfoo] no component registered for \"${tab.component}\"`);\n }\n return null;\n }\n return <Component node={tab} />;\n },\n [components, factory],\n );\n\n const [containerRef, width] = useContainerWidth();\n const isCompact = responsive !== undefined && width <= responsive.maxWidth;\n const view = useMemo(\n () => (isCompact ? stackModel(store.model, responsive?.orientation) : store.model),\n [isCompact, responsive?.orientation, store.model],\n );\n\n const storeDispatch = store.dispatch;\n const dispatch = useCallback(\n (action: Action): void => {\n if (isCompact && action.type === \"adjustSplit\") {\n return;\n }\n storeDispatch(action);\n },\n [isCompact, storeDispatch],\n );\n\n const maximized = view.maximizedTabsetId ? findTabset(view, view.maximizedTabsetId) : undefined;\n\n const tree = (\n <Layout.FloatLayer floats={store.model.floats ?? []} global={store.model.global}>\n <Layout.DragLayer>\n {maximized ? <Layout.Tabset node={maximized} /> : <Layout.Rows node={view.layout} />}\n </Layout.DragLayer>\n </Layout.FloatLayer>\n );\n\n return (\n <Layout.Root\n closableTabs={closableTabs}\n dispatch={dispatch}\n draggableTabs={isCompact ? false : draggableTabs}\n draggableTabsets={isCompact ? false : draggableTabsets}\n editable={editable}\n floatable={isCompact ? false : floatable}\n keepMounted={keepMounted}\n maximizable={maximizable}\n model={view}\n renamableTabs={renamableTabs}\n renderTab={renderTab}\n renderTabLabel={renderTabLabel}\n renderTabsetToolbar={renderTabsetToolbar}\n resizableSplits={isCompact ? false : resizableSplits}\n rootRef={containerRef}\n snap={snap}\n >\n {hasSharedManager ? tree : <DashfooDragProvider>{tree}</DashfooDragProvider>}\n </Layout.Root>\n );\n});\n\nDashfooLayout.displayName = \"DashfooLayout\";\n\nexport { DashfooLayout };\nexport type { DashfooHandle, DashfooLayoutProps, TabComponent };\n","\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\n\ntype PanelRootProps = ComponentProps<\"div\">;\ntype PanelHeaderProps = ComponentProps<\"div\">;\ntype PanelBodyProps = ComponentProps<\"div\">;\ntype PanelTitleProps = ComponentProps<\"span\">;\ntype PanelIconProps = ComponentProps<\"span\">;\ntype PanelBadgeProps = ComponentProps<\"span\">;\n\nconst PanelRoot = (props: PanelRootProps): ReactNode => <div {...props} data-dashfoo=\"panel\" />;\nconst PanelHeader = (props: PanelHeaderProps): ReactNode => (\n <div {...props} data-dashfoo=\"panel-header\" />\n);\nconst PanelBody = (props: PanelBodyProps): ReactNode => (\n <div {...props} data-dashfoo=\"panel-body\" />\n);\nconst PanelTitle = (props: PanelTitleProps): ReactNode => (\n <span {...props} data-dashfoo=\"panel-title\" />\n);\nconst PanelIcon = (props: PanelIconProps): ReactNode => (\n <span {...props} data-dashfoo=\"panel-icon\" />\n);\nconst PanelBadge = (props: PanelBadgeProps): ReactNode => (\n <span {...props} data-dashfoo=\"panel-badge\" />\n);\n\nconst Panel = {\n Badge: PanelBadge,\n Body: PanelBody,\n Header: PanelHeader,\n Icon: PanelIcon,\n Root: PanelRoot,\n Title: PanelTitle,\n} as const;\n\nexport { Panel };\nexport type {\n PanelBadgeProps,\n PanelBodyProps,\n PanelHeaderProps,\n PanelIconProps,\n PanelRootProps,\n PanelTitleProps,\n};\n","\"use client\";\n\nimport { TabsetContent } from \"./tabset-content\";\nimport { TabsetOverflowMenu } from \"./tabset-overflow\";\nimport { TabsetRoot } from \"./tabset-root\";\nimport { TabsetTab, TabsetTrigger } from \"./tabset-tab\";\nimport { TabsetCloseButton, TabsetRenameInput } from \"./tabset-tab-controls\";\nimport { TabsetTablist, TabsetTabStrip } from \"./tabset-tablist\";\nimport {\n TabsetFloatButton,\n TabsetGrip,\n TabsetMaximizeButton,\n TabsetToolbar,\n} from \"./tabset-toolbar\";\n\nconst Tabset = {\n CloseButton: TabsetCloseButton,\n Content: TabsetContent,\n FloatButton: TabsetFloatButton,\n Grip: TabsetGrip,\n MaximizeButton: TabsetMaximizeButton,\n OverflowMenu: TabsetOverflowMenu,\n RenameInput: TabsetRenameInput,\n Root: TabsetRoot,\n Tab: TabsetTab,\n Tablist: TabsetTablist,\n TabStrip: TabsetTabStrip,\n Toolbar: TabsetToolbar,\n Trigger: TabsetTrigger,\n} as const;\n\nexport { Tabset };\nexport type { TabsetContentProps } from \"./tabset-content\";\nexport type { TabsetRootProps } from \"./tabset-root\";\nexport type { TabsetTabProps, TabsetTriggerProps } from \"./tabset-tab\";\nexport type { TabsetCloseButtonProps, TabsetRenameInputProps } from \"./tabset-tab-controls\";\nexport type { TabsetTablistProps, TabsetTabStripProps } from \"./tabset-tablist\";\nexport type {\n TabsetFloatButtonProps,\n TabsetGripProps,\n TabsetMaximizeButtonProps,\n TabsetToolbarProps,\n} from \"./tabset-toolbar\";\n"],"mappings":"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"}
|