react-panel-layout 0.4.2 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FloatingPanelFrame-6W5OexYe.js +98 -0
- package/dist/FloatingPanelFrame-6W5OexYe.js.map +1 -0
- package/dist/FloatingPanelFrame-D9Cp2al1.cjs +2 -0
- package/dist/FloatingPanelFrame-D9Cp2al1.cjs.map +1 -0
- package/dist/GridLayout-BzrIDrC9.js +1465 -0
- package/dist/GridLayout-BzrIDrC9.js.map +1 -0
- package/dist/GridLayout-ZrOhoLLB.cjs +2 -0
- package/dist/GridLayout-ZrOhoLLB.cjs.map +1 -0
- package/dist/PanelSystemContext.d.ts +9 -0
- package/dist/components/grid/GridLayerList.d.ts +3 -0
- package/dist/components/grid/GridLayout.d.ts +5 -0
- package/dist/components/paneling/FloatingPanelFrame.d.ts +4 -0
- package/dist/components/window/FloatingWindow.d.ts +15 -0
- package/dist/config/panelRouter.d.ts +2 -2
- package/dist/config.cjs +1 -1
- package/dist/config.cjs.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/constants/styles.d.ts +3 -1
- package/dist/floating.cjs +1 -1
- package/dist/floating.js +1 -1
- package/dist/hooks/ContentCacheContext.d.ts +59 -0
- package/dist/hooks/useContainerScroll.d.ts +23 -0
- package/dist/hooks/useContentCache.d.ts +67 -0
- package/dist/hooks/useDocumentScroll.d.ts +13 -0
- package/dist/hooks/useScrollContainer.d.ts +21 -0
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +950 -878
- package/dist/index.js.map +1 -1
- package/dist/modules/grid/GridLayoutContext.d.ts +5 -0
- package/dist/modules/grid/resizeHandles.d.ts +14 -0
- package/dist/modules/grid/trackUtils.d.ts +29 -0
- package/dist/modules/grid/useGridTracks.d.ts +6 -15
- package/dist/modules/grid/useLayerInteractions.d.ts +2 -1
- package/dist/modules/window/useFloatingState.d.ts +9 -0
- package/dist/pivot.cjs +1 -1
- package/dist/pivot.js +1 -1
- package/dist/sticky-header/StickyHeader.d.ts +53 -0
- package/dist/sticky-header/index.d.ts +7 -0
- package/dist/sticky-header/types.d.ts +50 -0
- package/dist/sticky-header.cjs +2 -0
- package/dist/sticky-header.cjs.map +1 -0
- package/dist/sticky-header.js +198 -0
- package/dist/sticky-header.js.map +1 -0
- package/dist/styles-CA2_zLZt.js +52 -0
- package/dist/{styles-DcG3aIFx.cjs.map → styles-CA2_zLZt.js.map} +1 -1
- package/dist/styles-PsqGOEJP.cjs +2 -0
- package/dist/styles-PsqGOEJP.cjs.map +1 -0
- package/dist/types.d.ts +79 -4
- package/dist/useIsomorphicLayoutEffect-DGRNF4Lf.cjs +2 -0
- package/dist/useIsomorphicLayoutEffect-DGRNF4Lf.cjs.map +1 -0
- package/dist/useIsomorphicLayoutEffect-DhmEnmZ_.js +6 -0
- package/dist/useIsomorphicLayoutEffect-DhmEnmZ_.js.map +1 -0
- package/dist/usePivot-BS-DGfwd.cjs +2 -0
- package/dist/usePivot-BS-DGfwd.cjs.map +1 -0
- package/dist/usePivot-BvOGxLQQ.js +124 -0
- package/dist/usePivot-BvOGxLQQ.js.map +1 -0
- package/dist/utils/css.d.ts +19 -0
- package/package.json +6 -1
- package/dist/FloatingPanelFrame-SOrLGjZd.js +0 -67
- package/dist/FloatingPanelFrame-SOrLGjZd.js.map +0 -1
- package/dist/FloatingPanelFrame-XtBcHANI.cjs +0 -2
- package/dist/FloatingPanelFrame-XtBcHANI.cjs.map +0 -1
- package/dist/GridLayout-CLvW8jID.js +0 -1352
- package/dist/GridLayout-CLvW8jID.js.map +0 -1
- package/dist/GridLayout-qufTyOQM.cjs +0 -2
- package/dist/GridLayout-qufTyOQM.cjs.map +0 -1
- package/dist/styles-DcG3aIFx.cjs +0 -2
- package/dist/styles-w0ZixggV.js +0 -51
- package/dist/styles-w0ZixggV.js.map +0 -1
- package/dist/usePivot-C8q0pMgW.cjs +0 -2
- package/dist/usePivot-C8q0pMgW.cjs.map +0 -1
- package/dist/usePivot-z9gumDf-.js +0 -97
- package/dist/usePivot-z9gumDf-.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GridLayout-qufTyOQM.cjs","sources":["../src/hooks/useIntersectionObserver.tsx","../src/components/window/Drawer.tsx","../src/hooks/useTransitionState.ts","../src/modules/window/useDrawerState.ts","../src/components/window/DrawerLayers.tsx","../src/modules/grid/GridLayoutContext.tsx","../src/PanelSystemContext.tsx","../src/modules/grid/LayerInstanceContext.tsx","../src/components/window/PopupLayerPortal.tsx","../src/components/grid/GridLayerResizeHandles.tsx","../src/components/pivot/PivotLayer.tsx","../src/components/grid/GridLayerList.tsx","../src/hooks/useEffectEvent.ts","../src/hooks/useDocumentPointerEvents.ts","../src/modules/resizer/useResizeDrag.ts","../src/hooks/useElementComponentWrapper.tsx","../src/components/resizer/ResizeHandle.tsx","../src/components/grid/GridTrackResizeHandle.tsx","../src/modules/grid/useGridPlacements.ts","../src/modules/grid/useGridTracks.ts","../src/utils/math.ts","../src/modules/grid/useLayerInteractions.tsx","../src/components/grid/GridLayout.tsx"],"sourcesContent":["/**\n * @file Shared useIntersectionObserver hook with cached observer instances.\n */\nimport * as React from \"react\";\n\nconst createIdGenerator = () => {\n const map = new Map<object, number>();\n return (ref: object | null | undefined) => {\n if (!ref) {\n return undefined;\n }\n const existing = map.get(ref);\n if (existing !== undefined) {\n return existing;\n }\n const nextId = map.size;\n map.set(ref, nextId);\n return nextId;\n };\n};\n\nconst getId = createIdGenerator();\ntype Unobserve = () => void;\ntype Callback = (entry: IntersectionObserverEntry) => void;\ntype SharedObserver = {\n observe: (target: Element, callback: Callback) => Unobserve;\n};\nconst observerCache = new Map<string, SharedObserver>();\nconst getSharedObserver = (options: IntersectionObserverInit) => {\n const observerKey = `ovs-threshold:${options.threshold}-rootMargin:${options.rootMargin}-root:${getId(options.root)}`;\n\n if (observerCache.has(observerKey)) {\n return observerCache.get(observerKey)!;\n }\n const observer = new (class {\n #callbackMap = new Map<Element, Callback>();\n #intersectionObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n const callback = this.#callbackMap.get(entry.target);\n if (callback) {\n callback(entry);\n }\n });\n }, options);\n observe(target: Element, callback: Callback) {\n this.#callbackMap.set(target, callback);\n this.#intersectionObserver.observe(target);\n return () => {\n this.#callbackMap.delete(target);\n this.#intersectionObserver.unobserve(target);\n };\n }\n })();\n observerCache.set(observerKey, observer);\n\n return observer;\n};\nconst voidClientRect = Object.freeze({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n}) as DOMRectReadOnly;\n/**\n * Observe intersection changes for a given element reference using shared observers.\n *\n * @param ref - Ref holding the element to observe.\n * @param options - Intersection observer configuration.\n * @returns Latest intersection entry snapshot with sensible defaults.\n */\nexport function useIntersectionObserver<T extends HTMLElement>(\n ref: React.RefObject<T | null>,\n { threshold = 0, rootMargin = \"0px\", root = null }: IntersectionObserverInit,\n): {\n readonly boundingClientRect: DOMRectReadOnly;\n readonly intersectionRatio: number;\n readonly intersectionRect: DOMRectReadOnly;\n readonly isIntersecting: boolean;\n readonly rootBounds: DOMRectReadOnly | null;\n readonly target: Element | null;\n readonly time: DOMHighResTimeStamp;\n} {\n const [intersection, setIntersection] = React.useState<IntersectionObserverEntry | null>(null);\n\n React.useEffect(() => {\n const target = ref.current;\n if (!target) {\n return;\n }\n\n const observer = getSharedObserver({\n threshold,\n rootMargin,\n root,\n });\n\n return observer.observe(target, (entry) => {\n setIntersection({\n isIntersecting: entry.isIntersecting,\n boundingClientRect: entry.boundingClientRect,\n intersectionRatio: entry.intersectionRatio,\n intersectionRect: entry.intersectionRect,\n rootBounds: entry.rootBounds,\n target: entry.target,\n time: entry.time,\n });\n });\n }, [ref, threshold, rootMargin, root]);\n\n return React.useMemo(() => {\n return {\n isIntersecting: intersection?.isIntersecting ?? false,\n boundingClientRect: intersection?.boundingClientRect ?? voidClientRect,\n intersectionRatio: intersection?.intersectionRatio ?? 0,\n intersectionRect: intersection?.intersectionRect ?? voidClientRect,\n rootBounds: intersection?.rootBounds ?? null,\n target: intersection?.target ?? ref.current,\n time: intersection?.time ?? 0,\n };\n }, [intersection, ref]);\n}\n","/**\n * @file Drawer component\n *\n * Mobile-friendly slide-in panel with backdrop support.\n */\nimport * as React from \"react\";\nimport type { DrawerBehavior, WindowPosition } from \"../../types\";\nimport {\n FloatingPanelContent,\n FloatingPanelFrame,\n FloatingPanelHeader,\n FloatingPanelTitle,\n} from \"../paneling/FloatingPanelFrame\";\nimport {\n DRAWER_HEADER_PADDING_Y,\n DRAWER_HEADER_PADDING_X,\n DRAWER_HEADER_GAP,\n DRAWER_CLOSE_BUTTON_FONT_SIZE,\n DRAWER_CONTENT_PADDING,\n COLOR_DRAWER_BACKDROP,\n DRAWER_TRANSITION_DURATION,\n DRAWER_TRANSITION_EASING,\n} from \"../../constants/styles\";\n\nconst drawerBackdropStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n background: COLOR_DRAWER_BACKDROP,\n};\n\nconst drawerBaseStyle: React.CSSProperties = {\n willChange: \"transform\",\n};\n\nconst drawerPlacementStyles: Record<string, React.CSSProperties> = {\n left: {\n top: 0,\n bottom: 0,\n left: 0,\n transform: \"translateX(-100%)\",\n },\n right: {\n top: 0,\n bottom: 0,\n right: 0,\n transform: \"translateX(100%)\",\n },\n top: {\n top: 0,\n left: 0,\n right: 0,\n transform: \"translateY(-100%)\",\n },\n bottom: {\n bottom: 0,\n left: 0,\n right: 0,\n transform: \"translateY(100%)\",\n },\n};\n\nconst computeTransitionValue = (\n mode: DrawerBehavior[\"transitionMode\"] | undefined,\n duration: DrawerBehavior[\"transitionDuration\"],\n easing: DrawerBehavior[\"transitionEasing\"],\n): string | undefined => {\n if (mode === \"none\") {\n return undefined;\n }\n\n const durationValue = duration ?? DRAWER_TRANSITION_DURATION;\n const easingValue = easing ?? DRAWER_TRANSITION_EASING;\n\n return `transform ${durationValue} ${easingValue}`;\n};\n\nexport type DrawerProps = {\n id: string;\n config: DrawerBehavior;\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode;\n zIndex?: number;\n width?: string | number;\n height?: string | number;\n position?: WindowPosition;\n};\n\ntype DrawerViewProps = {\n header?: DrawerBehavior[\"header\"];\n dismissible: boolean;\n onClose: () => void;\n chrome: boolean;\n children: React.ReactNode;\n};\n\nconst shouldShowCloseButton = (dismissible: boolean, showClose: boolean): boolean => {\n if (!dismissible) {\n return false;\n }\n return showClose;\n};\n\nconst closeButtonStyle: React.CSSProperties = {\n marginLeft: \"auto\",\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontSize: DRAWER_CLOSE_BUTTON_FONT_SIZE,\n};\n\nconst DrawerHeaderView: React.FC<{\n header?: DrawerBehavior[\"header\"];\n dismissible: boolean;\n onClose: () => void;\n}> = ({ header, dismissible, onClose }) => {\n if (!header) {\n return null;\n }\n\n const showCloseButton = header.showCloseButton ?? true;\n const shouldShowClose = shouldShowCloseButton(dismissible, showCloseButton);\n\n return (\n <React.Activity mode={header ? \"visible\" : \"hidden\"}>\n <FloatingPanelHeader\n style={{ padding: `${DRAWER_HEADER_PADDING_Y} ${DRAWER_HEADER_PADDING_X}`, gap: DRAWER_HEADER_GAP }}\n >\n <React.Activity mode={header ? \"visible\" : \"hidden\"}>\n <FloatingPanelTitle>{header.title}</FloatingPanelTitle>\n </React.Activity>\n <React.Activity mode={shouldShowClose ? \"visible\" : \"hidden\"}>\n <button style={closeButtonStyle} onClick={onClose} aria-label=\"Close drawer\" type=\"button\">\n ×\n </button>\n </React.Activity>\n </FloatingPanelHeader>\n </React.Activity>\n );\n};\n\nconst DrawerView: React.FC<DrawerViewProps> = ({ header, dismissible, onClose, chrome, children }) => {\n if (!chrome) {\n return <>{children}</>;\n }\n\n return (\n <FloatingPanelFrame style={{ height: \"100%\", borderRadius: 0 }}>\n <DrawerHeaderView header={header} dismissible={dismissible} onClose={onClose} />\n <FloatingPanelContent\n style={{ padding: DRAWER_CONTENT_PADDING, flex: 1, display: \"flex\", flexDirection: \"column\" }}\n >\n {children}\n </FloatingPanelContent>\n </FloatingPanelFrame>\n );\n};\n\nexport const Drawer: React.FC<DrawerProps> = ({\n id,\n config,\n isOpen,\n onClose,\n children,\n zIndex,\n width,\n height,\n position,\n}) => {\n const {\n dismissible = true,\n header,\n chrome = true,\n inline = false,\n transitionMode = \"css\",\n transitionDuration,\n transitionEasing,\n } = config;\n\n const resolvePlacement = React.useCallback((pos?: WindowPosition): \"left\" | \"right\" | \"top\" | \"bottom\" => {\n if (!pos) {\n return \"right\";\n }\n if (pos.left !== undefined) {\n return \"left\";\n }\n if (pos.right !== undefined) {\n return \"right\";\n }\n if (pos.top !== undefined) {\n return \"top\";\n }\n if (pos.bottom !== undefined) {\n return \"bottom\";\n }\n return \"right\";\n }, []);\n\n const placement = resolvePlacement(position);\n\n const openTransforms: Record<string, string> = {\n left: \"translateX(0)\",\n right: \"translateX(0)\",\n top: \"translateY(0)\",\n bottom: \"translateY(0)\",\n };\n\n const drawerStyle = React.useMemo((): React.CSSProperties => {\n const transitionValue = computeTransitionValue(transitionMode, transitionDuration, transitionEasing);\n\n const style: React.CSSProperties = {\n ...drawerBaseStyle,\n ...(inline ? { position: \"absolute\" } : { position: \"fixed\" }),\n ...drawerPlacementStyles[placement],\n transform: isOpen ? openTransforms[placement] : drawerPlacementStyles[placement].transform,\n transition: transitionValue,\n };\n\n if (zIndex !== undefined) {\n style.zIndex = zIndex;\n }\n\n if (width !== undefined) {\n style.width = typeof width === \"number\" ? `${width}px` : width;\n }\n if (height !== undefined) {\n style.height = typeof height === \"number\" ? `${height}px` : height;\n }\n\n return style;\n }, [height, inline, isOpen, placement, transitionDuration, transitionEasing, transitionMode, width, zIndex]);\n\n const ariaLabel = header?.title ?? config.ariaLabel ?? \"Drawer\";\n\n const backdropStyle = React.useMemo((): React.CSSProperties => {\n const base = inline ? { ...drawerBackdropStyle, position: \"absolute\" as const } : drawerBackdropStyle;\n const transitionValue = transitionMode === \"none\" ? undefined : `opacity ${transitionDuration ?? \"220ms\"} ease`;\n return {\n ...base,\n opacity: isOpen ? 1 : 0,\n pointerEvents: isOpen ? \"auto\" : \"none\",\n transition: transitionValue,\n zIndex: zIndex !== undefined ? zIndex - 1 : undefined,\n };\n }, [inline, isOpen, transitionDuration, transitionMode, zIndex]);\n\n return (\n <>\n <div style={backdropStyle} onClick={dismissible ? onClose : undefined} />\n <div\n data-layer-id={id}\n data-placement={placement}\n style={drawerStyle}\n role=\"dialog\"\n aria-modal={dismissible ? true : undefined}\n aria-hidden={isOpen ? undefined : true}\n aria-label={ariaLabel}\n >\n <DrawerView header={header} dismissible={dismissible} onClose={onClose} chrome={chrome}>\n {children}\n </DrawerView>\n </div>\n </>\n );\n};\n","/**\n * @file Generic transition state management with animation support.\n */\nimport * as React from \"react\";\n\nexport type TransitionMode = \"none\" | \"css\";\n\nexport type TransitionOptions = {\n mode?: TransitionMode;\n element?: React.RefObject<HTMLElement>;\n duration?: number;\n};\n\nexport type UseTransitionStateOptions = {\n onOpen?: (id: string) => void;\n onClose?: (id: string) => void;\n onTransitionEnd?: (id: string, isOpen: boolean) => void;\n};\n\nconst waitForTransitionEnd = (el: HTMLElement, timeout: number): Promise<void> =>\n new Promise((resolve) => {\n // eslint-disable-next-line no-restricted-syntax -- mutable flag needed for deduplication\n let resolved = false;\n const done = () => {\n if (resolved) {return;}\n resolved = true;\n el.removeEventListener(\"transitionend\", handler);\n resolve();\n };\n const handler = (e: TransitionEvent) => {\n if (e.target === el) {done();}\n };\n el.addEventListener(\"transitionend\", handler);\n setTimeout(done, timeout + 50);\n });\n\nexport const runTransition = async (\n update: () => void,\n mode: TransitionMode,\n el: HTMLElement | null | undefined,\n duration: number,\n): Promise<void> => {\n switch (mode) {\n case \"none\":\n update();\n return;\n\n case \"css\":\n update();\n if (el) {await waitForTransitionEnd(el, duration);}\n return;\n }\n};\n\nexport const useTransitionState = (options?: UseTransitionStateOptions) => {\n const [states, setStates] = React.useState<Record<string, boolean>>({});\n const optionsRef = React.useRef(options);\n optionsRef.current = options;\n\n const update = React.useCallback(\n async (id: string, isOpen: boolean, transitionOptions?: TransitionOptions) => {\n const { mode = \"none\", element, duration = 300 } = transitionOptions ?? {};\n\n const applyState = () => {\n setStates((prev) => {\n if (prev[id] === isOpen) {return prev;}\n return { ...prev, [id]: isOpen };\n });\n };\n\n await runTransition(applyState, mode, element?.current, duration);\n\n const opts = optionsRef.current;\n if (isOpen) {\n opts?.onOpen?.(id);\n } else {\n opts?.onClose?.(id);\n }\n opts?.onTransitionEnd?.(id, isOpen);\n },\n [],\n );\n\n const state = React.useCallback((id: string): boolean => states[id] ?? false, [states]);\n const open = React.useCallback(\n (id: string, opts?: TransitionOptions) => update(id, true, opts),\n [update],\n );\n const close = React.useCallback(\n (id: string, opts?: TransitionOptions) => update(id, false, opts),\n [update],\n );\n\n return { state, open, close };\n};\n","/**\n * @file Hook for managing drawer state (controlled/uncontrolled)\n */\nimport * as React from \"react\";\nimport {\n type TransitionMode,\n type TransitionOptions,\n runTransition,\n} from \"../../hooks/useTransitionState\";\nimport type { LayerDefinition } from \"../../types\";\n\nconst parseDuration = (value: string | undefined): number => {\n if (!value) {return 300;}\n const match = value.match(/(\\d+)/);\n return match ? parseInt(match[1], 10) : 300;\n};\n\nexport const useDrawerState = (layers: LayerDefinition[]) => {\n const [drawerStates, setDrawerStates] = React.useState<Record<string, boolean>>(() => {\n const initial: Record<string, boolean> = {};\n layers.forEach((layer) => {\n if (layer.drawer) {\n initial[layer.id] = layer.drawer.defaultOpen ?? false;\n }\n });\n return initial;\n });\n\n const layerMap = React.useMemo(() => {\n const map = new Map<string, LayerDefinition>();\n layers.forEach((layer) => map.set(layer.id, layer));\n return map;\n }, [layers]);\n\n const updateState = React.useCallback(\n async (layerId: string, isOpen: boolean, options?: TransitionOptions) => {\n const layer = layerMap.get(layerId);\n if (!layer?.drawer) {return;}\n\n const mode: TransitionMode = options?.mode ?? layer.drawer.transitionMode ?? \"css\";\n const duration = options?.duration ?? parseDuration(layer.drawer.transitionDuration);\n const element = options?.element?.current;\n\n const applyState = () => {\n if (layer.drawer?.open === undefined) {\n setDrawerStates((prev) => {\n if (prev[layerId] === isOpen) {return prev;}\n return { ...prev, [layerId]: isOpen };\n });\n }\n layer.drawer?.onStateChange?.(isOpen);\n };\n\n await runTransition(applyState, mode, element, duration);\n },\n [layerMap],\n );\n\n const state = React.useCallback(\n (layerId: string): boolean => {\n const layer = layerMap.get(layerId);\n if (layer?.drawer?.open !== undefined) {\n return layer.drawer.open;\n }\n return drawerStates[layerId] ?? false;\n },\n [layerMap, drawerStates],\n );\n\n const open = React.useCallback(\n (id: string, options?: TransitionOptions) => updateState(id, true, options),\n [updateState],\n );\n\n const close = React.useCallback(\n (id: string, options?: TransitionOptions) => updateState(id, false, options),\n [updateState],\n );\n\n return { state, open, close };\n};\n","/**\n * @file DrawerLayers component\n */\nimport * as React from \"react\";\nimport type { LayerDefinition } from \"../../types\";\nimport { Drawer } from \"./Drawer\";\nimport { useDrawerState } from \"../../modules/window/useDrawerState\";\n\nexport type DrawerLayersProps = {\n layers: LayerDefinition[];\n};\n\nexport const DrawerLayers: React.FC<DrawerLayersProps> = ({ layers }) => {\n const drawer = useDrawerState(layers);\n\n const drawerLayers = React.useMemo(() => layers.filter((layer) => layer.drawer), [layers]);\n\n const closeHandlers = React.useMemo(() => {\n const handlers = new Map<string, () => void>();\n drawerLayers.forEach((layer) => {\n handlers.set(layer.id, () => drawer.close(layer.id));\n });\n return handlers;\n }, [drawerLayers, drawer.close]);\n\n return (\n <>\n {drawerLayers.map((layer) => {\n if (!layer.drawer) {\n return null;\n }\n\n const isOpen = drawer.state(layer.id);\n const onClose = closeHandlers.get(layer.id);\n\n if (!onClose) {\n return null;\n }\n\n return (\n <Drawer\n key={layer.id}\n id={layer.id}\n config={layer.drawer}\n isOpen={isOpen}\n onClose={onClose}\n zIndex={layer.zIndex}\n width={layer.width}\n height={layer.height}\n position={layer.position}\n >\n {layer.component}\n </Drawer>\n );\n })}\n </>\n );\n};\n","/**\n * @file Context provider for grid layer rendering helpers.\n */\nimport * as React from \"react\";\nimport type { LayerDefinition } from \"../../types\";\n\nexport type GridLayerHandleProps = React.HTMLAttributes<HTMLElement> & {\n \"data-drag-handle\": \"true\";\n};\n\nexport type ResizeHandleConfig =\n | {\n key: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n variant: \"corner\";\n horizontal: \"left\" | \"right\";\n vertical: \"top\" | \"bottom\";\n }\n | {\n key: \"left\" | \"right\" | \"top\" | \"bottom\";\n variant: \"edge\";\n horizontal?: \"left\" | \"right\";\n vertical?: \"top\" | \"bottom\";\n };\n\nexport type GridLayerRenderState = {\n style: React.CSSProperties;\n isResizable: boolean;\n isResizing: boolean;\n onResizeHandlePointerDown: (config: ResizeHandleConfig, event: React.PointerEvent<HTMLDivElement>) => void;\n};\n\nexport type GridLayoutContextValue = {\n handleLayerPointerDown: (event: React.PointerEvent<HTMLDivElement>) => void;\n getLayerRenderState: (layer: LayerDefinition) => GridLayerRenderState;\n getLayerHandleProps: (layerId: string) => GridLayerHandleProps;\n};\n\nconst GridLayoutContext = React.createContext<GridLayoutContextValue | null>(null);\n\nexport const GridLayoutProvider: React.FC<\n React.PropsWithChildren<{ value: GridLayoutContextValue }>\n> = ({ value, children }) => {\n return <GridLayoutContext.Provider value={value}>{children}</GridLayoutContext.Provider>;\n};\n\nexport const useGridLayoutContext = (): GridLayoutContextValue => {\n const context = React.useContext(GridLayoutContext);\n if (!context) {\n throw new Error(\"useGridLayoutContext must be used within a GridLayoutProvider.\");\n }\n return context;\n};\n","/**\n * @file PanelSystemContext\n *\n * Core provider for panel definitions and registry. Grid-specific layout and\n * interactions are composed by UI layers (e.g., GridLayout) on top of this.\n */\nimport * as React from \"react\";\nimport type { PanelLayoutConfig, LayerDefinition } from \"./types\";\n\nexport type PanelSystemContextValue = {\n config: PanelLayoutConfig;\n style?: React.CSSProperties;\n layers: {\n /** Raw panel definitions (no grid normalization). */\n defs: LayerDefinition[];\n /** Fast lookup map by id for consumers. */\n layerById: Map<string, LayerDefinition>;\n };\n};\n\nconst PanelSystemContext = React.createContext<PanelSystemContextValue | null>(null);\n\nexport const usePanelSystem = (): PanelSystemContextValue => {\n const ctx = React.useContext(PanelSystemContext);\n if (!ctx) {\n throw new Error(\"usePanelSystem must be used within a PanelSystemProvider.\");\n }\n return ctx;\n};\n\nexport type PanelSystemProviderProps = React.PropsWithChildren<{\n config: PanelLayoutConfig;\n layers: LayerDefinition[];\n style?: React.CSSProperties;\n}>;\n\nexport const PanelSystemProvider: React.FC<PanelSystemProviderProps> = ({ config, layers, style, children }) => {\n const layerById = React.useMemo(() => {\n const map = new Map<string, LayerDefinition>();\n layers.forEach((layer) => {\n map.set(layer.id, layer);\n });\n return map;\n }, [layers]);\n\n const value = React.useMemo<PanelSystemContextValue>(\n () => ({\n config,\n style,\n layers: {\n defs: layers,\n layerById,\n },\n }),\n [config, style, layers, layerById],\n );\n\n return <PanelSystemContext.Provider value={value}>{children}</PanelSystemContext.Provider>;\n};\n","/**\n * @file Context exposing the current grid layer id and helpers to child components.\n */\nimport * as React from \"react\";\nimport type { LayerDefinition } from \"../../types\";\nimport { usePanelSystem } from \"../../PanelSystemContext\";\nimport { useGridLayoutContext, type GridLayerHandleProps } from \"./GridLayoutContext\";\n\ntype LayerInstanceContextValue = {\n layerId: string;\n};\n\nconst LayerInstanceContext = React.createContext<LayerInstanceContextValue | null>(null);\n\nexport type LayerInstanceProviderProps = React.PropsWithChildren<LayerInstanceContextValue>;\n\nexport const LayerInstanceProvider: React.FC<LayerInstanceProviderProps> = ({ layerId, children }) => {\n const value = React.useMemo(() => ({ layerId }), [layerId]);\n return <LayerInstanceContext.Provider value={value}>{children}</LayerInstanceContext.Provider>;\n};\n\nexport const useLayerInstance = (): LayerInstanceContextValue => {\n const value = React.useContext(LayerInstanceContext);\n if (!value) {\n throw new Error(\"useLayerInstance must be used within a LayerInstanceProvider.\");\n }\n return value;\n};\n\n/**\n * Convenience: read the current layer definition from the core registry.\n */\nexport const useCurrentLayerDefinition = (): LayerDefinition => {\n const { layerId } = useLayerInstance();\n const { layers } = usePanelSystem();\n const def = layers.layerById.get(layerId);\n if (!def) {\n throw new Error(`Layer definition not found for id: ${layerId}`);\n }\n return def;\n};\n\n/**\n * Convenience: get drag handle props, pre-bound to the current layer.\n */\nexport const useCurrentLayerHandleProps = (): GridLayerHandleProps => {\n const { layerId } = useLayerInstance();\n const { getLayerHandleProps } = useGridLayoutContext();\n return React.useMemo(() => getLayerHandleProps(layerId), [getLayerHandleProps, layerId]);\n};\n\n/**\n * Compatibility helper for existing code using useLayerDragHandle.\n * Prefer useCurrentLayerHandleProps for direct access.\n */\nexport const useLayerDragHandleProps = useCurrentLayerHandleProps;\n","/**\n * @file Renders floating layers inside a dedicated browser popup window.\n */\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { LayerDefinition, PopupWindowOptions, WindowPosition, WindowBounds } from \"../../types\";\nimport { LayerInstanceProvider } from \"../../modules/grid/LayerInstanceContext\";\n\nconst ensureNumericOffset = (value: number | string | undefined, key: keyof WindowPosition, layerId: string): number => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n throw new Error(`Popup layer \"${layerId}\" requires a numeric \"${key}\" value.`);\n};\n\nconst resolvePopupAnchor = (position: WindowPosition | undefined, layerId: string): { left: number; top: number } => {\n if (!position) {\n throw new Error(`Popup layer \"${layerId}\" must define position (left/top).`);\n }\n return {\n left: ensureNumericOffset(position.left, \"left\", layerId),\n top: ensureNumericOffset(position.top, \"top\", layerId),\n };\n};\n\nconst numericFeature = (value: number): string => {\n return `${Math.round(value)}`;\n};\n\nconst booleanFeature = (value: boolean | undefined): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n return value ? \"yes\" : \"no\";\n};\n\nconst buildWindowFeatures = (\n layerId: string,\n position: WindowPosition | undefined,\n width: number | string | undefined,\n height: number | string | undefined,\n options: PopupWindowOptions | undefined,\n): string => {\n const features: Record<string, string> = {};\n const anchor = resolvePopupAnchor(position, layerId);\n\n if (typeof width !== \"number\" || typeof height !== \"number\") {\n throw new Error(`Popup layer \"${layerId}\" requires numeric width/height.`);\n }\n features.width = numericFeature(width);\n features.height = numericFeature(height);\n features.left = numericFeature(anchor.left);\n features.top = numericFeature(anchor.top);\n\n const overrides = options?.features;\n if (overrides) {\n const toolbar = booleanFeature(overrides.toolbar);\n const menubar = booleanFeature(overrides.menubar);\n const location = booleanFeature(overrides.location);\n const status = booleanFeature(overrides.status);\n const resizable = booleanFeature(overrides.resizable);\n const scrollbars = booleanFeature(overrides.scrollbars);\n\n if (toolbar !== undefined) {\n features.toolbar = toolbar;\n }\n if (menubar !== undefined) {\n features.menubar = menubar;\n }\n if (location !== undefined) {\n features.location = location;\n }\n if (status !== undefined) {\n features.status = status;\n }\n if (resizable !== undefined) {\n features.resizable = resizable;\n }\n if (scrollbars !== undefined) {\n features.scrollbars = scrollbars;\n }\n }\n\n return Object.entries(features)\n .map(([key, value]) => `${key}=${value}`)\n .join(\",\");\n};\n\nconst applyBoundsToWindow = (\n popupWindow: Window,\n layerId: string,\n position: WindowPosition | undefined,\n width: number | string | undefined,\n height: number | string | undefined,\n) => {\n const anchor = resolvePopupAnchor(position, layerId);\n if (typeof width !== \"number\" || typeof height !== \"number\") {\n throw new Error(`Popup layer \"${layerId}\" requires numeric width/height.`);\n }\n popupWindow.moveTo(Math.round(anchor.left), Math.round(anchor.top));\n popupWindow.resizeTo(Math.round(width), Math.round(height));\n};\n\ntype PopupLayerPortalProps = {\n layer: LayerDefinition;\n};\n\nexport const PopupLayerPortal: React.FC<PopupLayerPortalProps> = ({ layer }) => {\n const floating = layer.floating;\n if (!floating) {\n throw new Error(`Layer \"${layer.id}\" is missing floating configuration required for popup mode.`);\n }\n const mode = floating.mode ?? \"embedded\";\n if (mode !== \"popup\") {\n throw new Error(`PopupLayerPortal received layer \"${layer.id}\" that is not configured for popup mode.`);\n }\n\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const popupWindowRef = React.useRef<Window | null>(null);\n const [isMounted, setIsMounted] = React.useState(false);\n\n React.useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const features = buildWindowFeatures(layer.id, layer.position, layer.width, layer.height, floating.popup);\n const windowName = floating.popup?.name ?? layer.id;\n const createdWindow = resolvePopupWindow(\n windowName,\n features,\n {\n position: layer.position,\n size: { width: layer.width as number, height: layer.height as number },\n },\n floating.popup,\n );\n\n if (!createdWindow) {\n throw new Error(`Failed to open popup window for layer \"${layer.id}\".`);\n }\n\n const openedWindow = createdWindow;\n\n popupWindowRef.current = openedWindow;\n\n if (floating.popup?.focus !== false) {\n openedWindow.focus();\n }\n\n if (!openedWindow.document.title) {\n openedWindow.document.title = layer.id;\n }\n openedWindow.document.body.innerHTML = \"\";\n const mountNode = openedWindow.document.createElement(\"div\");\n mountNode.dataset.layerId = layer.id;\n openedWindow.document.body.appendChild(mountNode);\n containerRef.current = mountNode;\n setIsMounted(true);\n\n applyBoundsToWindow(openedWindow, layer.id, layer.position, layer.width, layer.height);\n\n const handleBeforeUnload = () => {\n popupWindowRef.current = null;\n containerRef.current = null;\n setIsMounted(false);\n };\n openedWindow.addEventListener(\"beforeunload\", handleBeforeUnload);\n\n return () => {\n openedWindow.removeEventListener(\"beforeunload\", handleBeforeUnload);\n if (floating.popup?.closeOnUnmount !== false) {\n openedWindow.close();\n }\n popupWindowRef.current = null;\n containerRef.current = null;\n setIsMounted(false);\n };\n }, [\n floating.popup?.closeOnUnmount,\n floating.popup?.features?.location,\n floating.popup?.features?.menubar,\n floating.popup?.features?.resizable,\n floating.popup?.features?.scrollbars,\n floating.popup?.features?.status,\n floating.popup?.features?.toolbar,\n floating.popup?.focus,\n floating.popup?.name,\n layer.id,\n ]);\n\n React.useEffect(() => {\n const popupWindow = popupWindowRef.current;\n if (!popupWindow) {\n return;\n }\n applyBoundsToWindow(popupWindow, layer.id, layer.position, layer.width, layer.height);\n }, [layer.position?.left, layer.position?.top, layer.height, layer.width, layer.id]);\n\n if (!isMounted || !containerRef.current) {\n return null;\n }\n\n return createPortal(<LayerInstanceProvider layerId={layer.id}>{layer.component}</LayerInstanceProvider>, containerRef.current);\n};\n\nconst resolvePopupWindow = (\n windowName: string,\n features: string,\n bounds: WindowBounds,\n options: PopupWindowOptions | undefined,\n): Window | null => {\n const customFactory = options?.createWindow;\n if (customFactory) {\n return customFactory({ name: windowName, features, bounds });\n }\n return window.open(\"\", windowName, features);\n};\n","/**\n * @file Presentational resize handles for floating layers (corner + edge).\n */\nimport * as React from \"react\";\nimport { GRID_LAYER_CORNER_HIT_SIZE, GRID_LAYER_EDGE_HIT_THICKNESS } from \"../../constants/styles\";\n\nconst resizeHandleBaseStyle: React.CSSProperties = {\n position: \"absolute\",\n pointerEvents: \"auto\",\n boxSizing: \"border-box\",\n background: \"transparent\",\n border: \"none\",\n};\n\nconst cornerHandleStyle: React.CSSProperties = {\n ...resizeHandleBaseStyle,\n width: GRID_LAYER_CORNER_HIT_SIZE,\n height: GRID_LAYER_CORNER_HIT_SIZE,\n zIndex: 2,\n};\n\nconst edgeHandleStyle: React.CSSProperties = {\n ...resizeHandleBaseStyle,\n zIndex: 1,\n};\n\nconst cornerPositions: Record<string, React.CSSProperties> = {\n \"top-left\": {\n top: 0,\n left: 0,\n transform: \"translate(-50%, -50%)\",\n cursor: \"nwse-resize\",\n },\n \"top-right\": {\n top: 0,\n right: 0,\n transform: \"translate(50%, -50%)\",\n cursor: \"nesw-resize\",\n },\n \"bottom-left\": {\n bottom: 0,\n left: 0,\n transform: \"translate(-50%, 50%)\",\n cursor: \"nesw-resize\",\n },\n \"bottom-right\": {\n bottom: 0,\n right: 0,\n transform: \"translate(50%, 50%)\",\n cursor: \"nwse-resize\",\n },\n};\n\nconst edgePositions: Record<string, React.CSSProperties> = {\n left: {\n top: GRID_LAYER_CORNER_HIT_SIZE,\n bottom: GRID_LAYER_CORNER_HIT_SIZE,\n left: 0,\n width: GRID_LAYER_EDGE_HIT_THICKNESS,\n transform: \"translateX(-50%)\",\n cursor: \"ew-resize\",\n },\n right: {\n top: GRID_LAYER_CORNER_HIT_SIZE,\n bottom: GRID_LAYER_CORNER_HIT_SIZE,\n right: 0,\n width: GRID_LAYER_EDGE_HIT_THICKNESS,\n transform: \"translateX(50%)\",\n cursor: \"ew-resize\",\n },\n top: {\n left: GRID_LAYER_CORNER_HIT_SIZE,\n right: GRID_LAYER_CORNER_HIT_SIZE,\n top: 0,\n height: GRID_LAYER_EDGE_HIT_THICKNESS,\n transform: \"translateY(-50%)\",\n cursor: \"ns-resize\",\n },\n bottom: {\n left: GRID_LAYER_CORNER_HIT_SIZE,\n right: GRID_LAYER_CORNER_HIT_SIZE,\n bottom: 0,\n height: GRID_LAYER_EDGE_HIT_THICKNESS,\n transform: \"translateY(50%)\",\n cursor: \"ns-resize\",\n },\n};\n\nexport type HorizontalEdge = \"left\" | \"right\";\nexport type VerticalEdge = \"top\" | \"bottom\";\n\nexport type ResizeHandleConfig =\n | {\n key: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n variant: \"corner\";\n horizontal: HorizontalEdge;\n vertical: VerticalEdge;\n }\n | {\n key: \"left\" | \"right\" | \"top\" | \"bottom\";\n variant: \"edge\";\n horizontal?: HorizontalEdge;\n vertical?: VerticalEdge;\n };\n\nconst RESIZE_HANDLE_CONFIGS: ReadonlyArray<ResizeHandleConfig> = [\n { key: \"top-left\", variant: \"corner\", horizontal: \"left\", vertical: \"top\" },\n { key: \"top-right\", variant: \"corner\", horizontal: \"right\", vertical: \"top\" },\n { key: \"bottom-left\", variant: \"corner\", horizontal: \"left\", vertical: \"bottom\" },\n { key: \"bottom-right\", variant: \"corner\", horizontal: \"right\", vertical: \"bottom\" },\n { key: \"left\", variant: \"edge\", horizontal: \"left\" },\n { key: \"right\", variant: \"edge\", horizontal: \"right\" },\n { key: \"top\", variant: \"edge\", vertical: \"top\" },\n { key: \"bottom\", variant: \"edge\", vertical: \"bottom\" },\n];\n\nexport type GridLayerResizeHandlesProps = {\n layerId: string;\n onPointerDown: (config: ResizeHandleConfig, event: React.PointerEvent<HTMLDivElement>) => void;\n};\n\nexport const GridLayerResizeHandles: React.FC<GridLayerResizeHandlesProps> = ({ layerId, onPointerDown }) => {\n return (\n <>\n {RESIZE_HANDLE_CONFIGS.map((config) => {\n const baseStyle = config.variant === \"corner\" ? cornerHandleStyle : edgeHandleStyle;\n const positionStyle = config.variant === \"corner\" ? cornerPositions[config.key] : edgePositions[config.key];\n const combinedStyle = { ...baseStyle, ...positionStyle };\n const datasetProps =\n config.variant === \"corner\" ? { \"data-resize-corner\": config.key } : { \"data-resize-edge\": config.key };\n return (\n <div\n key={config.key}\n role=\"presentation\"\n aria-hidden=\"true\"\n style={combinedStyle}\n {...datasetProps}\n data-layer-id={layerId}\n onPointerDown={(event) => onPointerDown(config, event)}\n />\n );\n })}\n </>\n );\n};\n","/**\n * @file PivotLayer component for rendering pivot behavior within GridLayout.\n * This component bridges the usePivot hook with the GridLayout layer system.\n */\nimport * as React from \"react\";\nimport type { PivotBehavior } from \"../../types\";\nimport { usePivot } from \"../../modules/pivot\";\n\nexport type PivotLayerProps = {\n pivot: PivotBehavior;\n};\n\n/**\n * Internal component that renders pivot content using React.Activity.\n * Used by GridLayerList when a layer has pivot behavior.\n */\nexport const PivotLayer: React.FC<PivotLayerProps> = ({ pivot }) => {\n const { Outlet } = usePivot({\n items: pivot.items,\n activeId: pivot.activeId,\n defaultActiveId: pivot.defaultActiveId,\n onActiveChange: pivot.onActiveChange,\n transitionMode: pivot.transitionMode,\n });\n\n return <Outlet />;\n};\n","/**\n * @file Layer list rendering inside the grid layout.\n */\nimport * as React from \"react\";\nimport type { LayerDefinition } from \"../../types\";\nimport { useGridLayoutContext } from \"../../modules/grid/GridLayoutContext\";\nimport type { ResizeHandleConfig } from \"../../modules/grid/GridLayoutContext\";\nimport { LayerInstanceProvider } from \"../../modules/grid/LayerInstanceContext\";\nimport { PopupLayerPortal } from \"../window/PopupLayerPortal\";\nimport { GridLayerResizeHandles } from \"./GridLayerResizeHandles\";\nimport { PivotLayer } from \"../pivot/PivotLayer\";\n\ntype GridLayerListProps = {\n layers: LayerDefinition[];\n};\n\n/**\n * Renders layer content - either PivotLayer for pivot behavior or the raw component.\n */\nconst LayerContent = React.memo<{ layer: LayerDefinition }>(({ layer }) => {\n if (layer.pivot) {\n return <PivotLayer pivot={layer.pivot} />;\n }\n return <>{layer.component}</>;\n});\nLayerContent.displayName = \"LayerContent\";\n\n/**\n * Renders resize handles if the layer is resizable.\n */\nconst LayerResizeHandles = React.memo<{\n layerId: string;\n isResizable: boolean;\n onPointerDown: (config: ResizeHandleConfig, event: React.PointerEvent<HTMLDivElement>) => void;\n}>(({ layerId, isResizable, onPointerDown }) => {\n if (!isResizable) {\n return null;\n }\n return <GridLayerResizeHandles layerId={layerId} onPointerDown={onPointerDown} />;\n});\nLayerResizeHandles.displayName = \"LayerResizeHandles\";\n\n/**\n * Renders a single embedded layer (non-popup).\n */\nconst EmbeddedLayer = React.memo<{\n layer: LayerDefinition;\n handleLayerPointerDown: (e: React.PointerEvent<HTMLDivElement>) => void;\n}>(({ layer, handleLayerPointerDown }) => {\n const { getLayerRenderState } = useGridLayoutContext();\n const { style, isResizable, isResizing, onResizeHandlePointerDown } = getLayerRenderState(layer);\n\n const gridPlacementStyle = React.useMemo<React.CSSProperties>(() => {\n const placement: React.CSSProperties = {};\n if (layer.gridArea) {\n placement.gridArea = layer.gridArea;\n }\n if (layer.gridRow) {\n placement.gridRow = layer.gridRow;\n }\n if (layer.gridColumn) {\n placement.gridColumn = layer.gridColumn;\n }\n return placement;\n }, [layer.gridArea, layer.gridRow, layer.gridColumn]);\n\n const combinedStyle = React.useMemo<React.CSSProperties>(() => {\n const baseStyle = { ...style, ...gridPlacementStyle };\n return isResizable ? { ...baseStyle, position: \"relative\" } : baseStyle;\n }, [style, gridPlacementStyle, isResizable]);\n\n return (\n <div\n data-layer-id={layer.id}\n data-draggable={Boolean(layer.floating?.draggable)}\n data-resizable={isResizable}\n data-resizing={isResizing}\n style={combinedStyle}\n onPointerDown={handleLayerPointerDown}\n >\n <LayerInstanceProvider layerId={layer.id}>\n <LayerContent layer={layer} />\n </LayerInstanceProvider>\n <LayerResizeHandles layerId={layer.id} isResizable={isResizable} onPointerDown={onResizeHandlePointerDown} />\n </div>\n );\n});\nEmbeddedLayer.displayName = \"EmbeddedLayer\";\n\nexport const GridLayerList: React.FC<GridLayerListProps> = ({ layers }) => {\n const { handleLayerPointerDown } = useGridLayoutContext();\n\n return (\n <>\n {layers.map((layer) => {\n const floatingMode = layer.floating?.mode ?? \"embedded\";\n if (layer.floating && floatingMode === \"popup\") {\n return <PopupLayerPortal key={layer.id} layer={layer} />;\n }\n return <EmbeddedLayer key={layer.id} layer={layer} handleLayerPointerDown={handleLayerPointerDown} />;\n })}\n </>\n );\n};\n","/**\n * @file useEffectEvent hook - Stable event handler for Effects\n *\n * This hook allows you to extract event handlers from Effects without causing them to re-run.\n * The returned function is stable and can be safely used in effect dependencies.\n *\n * @see https://react.dev/learn/separating-events-from-effects#declaring-an-effect-event\n */\nimport * as React from \"react\";\n\n/**\n * Extract event handlers from Effects to avoid unnecessary re-runs\n *\n * @example\n * ```tsx\n * function Component({ onEvent }) {\n * const onEventHandler = useEffectEvent(onEvent);\n *\n * React.useEffect(() => {\n * // onEventHandler is stable, but always calls the latest onEvent\n * const cleanup = subscribe(onEventHandler);\n * return cleanup;\n * }, []); // No need to include onEvent in dependencies\n * }\n * ```\n */\nexport function useEffectEvent<Args extends unknown[], Return>(\n fn: ((...args: Args) => Return) | undefined,\n): (...args: Args) => Return | undefined {\n const ref = React.useRef<typeof fn>(fn);\n ref.current = fn;\n\n return React.useCallback((...args: Args): Return | undefined => {\n const currentFn = ref.current;\n if (currentFn) {\n return currentFn(...args);\n }\n return undefined;\n }, []);\n}\n","/**\n * @file Hooks for managing document-level pointer events with proper cleanup\n */\nimport * as React from \"react\";\nimport { useEffectEvent } from \"./useEffectEvent\";\n\nexport type UseDocumentPointerEventsOptions = {\n onMove?: (e: PointerEvent) => void;\n onUp?: (e: PointerEvent) => void;\n onCancel?: (e: PointerEvent) => void;\n};\n\n/**\n * Custom hook for managing document-level pointer events with proper cleanup\n * This pattern is commonly used for drag operations that need to continue\n * even when the pointer moves outside the original element\n */\nexport function useDocumentPointerEvents(enabled: boolean, handlers: UseDocumentPointerEventsOptions) {\n const handleMoveEvent = useEffectEvent(handlers.onMove);\n const handleUpEvent = useEffectEvent(handlers.onUp);\n const handleCancelEvent = useEffectEvent(handlers.onCancel);\n\n React.useEffect(() => {\n if (!enabled) {\n return;\n }\n\n if (handlers.onMove) {\n document.addEventListener(\"pointermove\", handleMoveEvent, { passive: false });\n }\n if (handlers.onUp) {\n document.addEventListener(\"pointerup\", handleUpEvent);\n }\n if (handlers.onCancel) {\n document.addEventListener(\"pointercancel\", handleCancelEvent);\n }\n\n // Cleanup function\n return () => {\n if (handlers.onMove) {\n document.removeEventListener(\"pointermove\", handleMoveEvent);\n }\n if (handlers.onUp) {\n document.removeEventListener(\"pointerup\", handleUpEvent);\n }\n if (handlers.onCancel) {\n document.removeEventListener(\"pointercancel\", handleCancelEvent);\n }\n };\n }, [enabled, handlers.onMove, handlers.onUp, handlers.onCancel, handleMoveEvent, handleUpEvent, handleCancelEvent]);\n}\n\n/**\n * Hook for capturing pointer during drag operations\n * This ensures that pointer events are delivered to the capturing element\n * even when the pointer moves outside its boundaries\n */\nexport function usePointerCapture(elementRef: React.RefObject<HTMLElement | null>, enabled: boolean, pointerId?: number) {\n React.useEffect(() => {\n const element = elementRef.current;\n if (!enabled || !element || pointerId === undefined) {\n return;\n }\n\n // Capture pointer\n element.setPointerCapture(pointerId);\n\n // Release capture on cleanup\n return () => {\n if (element.hasPointerCapture && element.hasPointerCapture(pointerId)) {\n element.releasePointerCapture(pointerId);\n }\n };\n }, [elementRef, enabled, pointerId]);\n}\n\n/**\n * Hook for preventing default pointer events during operations\n * Useful for preventing text selection, context menus, etc. during drag operations\n */\nexport function usePreventPointerDefaults(\n elementRef: React.RefObject<HTMLElement | null>,\n enabled: boolean,\n events: string[] = [\"pointerdown\", \"pointermove\", \"pointerup\"],\n) {\n React.useEffect(() => {\n const element = elementRef.current;\n if (!enabled || !element) {\n return;\n }\n\n const preventDefault = (e: Event) => {\n e.preventDefault();\n };\n\n // Add listeners\n events.forEach((eventType) => {\n element.addEventListener(eventType, preventDefault, { passive: false });\n });\n\n // Cleanup\n return () => {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, preventDefault);\n });\n };\n }, [elementRef, enabled, events]);\n}\n\n/**\n * Hook that combines multiple pointer event patterns for drag operations\n */\nexport function useDragPointerEvents(\n elementRef: React.RefObject<HTMLElement | null>,\n enabled: boolean,\n options: {\n onMove?: (e: PointerEvent) => void;\n onUp?: (e: PointerEvent) => void;\n onCancel?: (e: PointerEvent) => void;\n pointerId?: number;\n capturePointer?: boolean;\n preventDefaults?: boolean;\n },\n) {\n const { onMove, onUp, onCancel, pointerId, capturePointer = true, preventDefaults = true } = options;\n\n // Document-level event handlers\n useDocumentPointerEvents(enabled, { onMove, onUp, onCancel });\n\n // Pointer capture\n const shouldCapturePointer = enabled ? capturePointer : false;\n usePointerCapture(elementRef, shouldCapturePointer, pointerId);\n\n // Prevent defaults\n const shouldPreventDefaults = enabled ? preventDefaults : false;\n usePreventPointerDefaults(elementRef, shouldPreventDefaults);\n}\n","/**\n * @file Shared logic for draggable resize handles.\n */\nimport * as React from \"react\";\nimport { useDragPointerEvents } from \"../../hooks/useDocumentPointerEvents\";\nimport { useEffectEvent } from \"../../hooks/useEffectEvent\";\n\nexport type ResizeDragAxis = \"x\" | \"y\";\n\nexport type UseResizeDragOptions = {\n /** Axis along which the drag should compute deltas */\n axis: ResizeDragAxis;\n /** Callback invoked with the delta value when dragging */\n onResize?: (delta: number) => void;\n};\n\nexport type UseResizeDragResult<TElement extends HTMLElement> = {\n /** Ref to attach to the draggable element */\n ref: React.RefObject<TElement | null>;\n /** Pointer down handler to initiate dragging */\n onPointerDown: (event: React.PointerEvent<TElement>) => void;\n /** Whether a drag interaction is currently active */\n isDragging: boolean;\n};\n\n/**\n * Provides unified pointer handling for resize-capable UI elements.\n *\n * @param options - Configuration for the drag interaction.\n * @returns Handlers and state for wiring into a draggable element.\n */\nexport const useResizeDrag = <TElement extends HTMLElement = HTMLElement>(\n options: UseResizeDragOptions,\n): UseResizeDragResult<TElement> => {\n const elementRef = React.useRef<TElement | null>(null);\n const pointerIdRef = React.useRef<number | null>(null);\n const previousCoordinateRef = React.useRef<number>(0);\n const [isDragging, setIsDragging] = React.useState(false);\n\n const emitResize = useEffectEvent((delta: number) => {\n options.onResize?.(delta);\n });\n\n const getCoordinate = React.useCallback(\n (event: PointerEvent | React.PointerEvent) => {\n return options.axis === \"x\" ? event.clientX : event.clientY;\n },\n [options.axis],\n );\n\n const handlePointerDown = React.useCallback(\n (event: React.PointerEvent<TElement>) => {\n event.preventDefault();\n elementRef.current = event.currentTarget;\n pointerIdRef.current = event.pointerId;\n previousCoordinateRef.current = getCoordinate(event);\n setIsDragging(true);\n },\n [getCoordinate],\n );\n\n const handlePointerMove = React.useCallback(\n (event: PointerEvent) => {\n const coordinate = getCoordinate(event);\n const delta = coordinate - previousCoordinateRef.current;\n if (delta === 0) {\n return;\n }\n previousCoordinateRef.current = coordinate;\n emitResize(delta);\n },\n [getCoordinate, emitResize],\n );\n\n const handlePointerUp = React.useCallback(() => {\n setIsDragging(false);\n pointerIdRef.current = null;\n }, []);\n\n useDragPointerEvents(elementRef as React.RefObject<HTMLElement | null>, isDragging, {\n onMove: handlePointerMove,\n onUp: handlePointerUp,\n pointerId: pointerIdRef.current ?? undefined,\n capturePointer: true,\n preventDefaults: false,\n });\n\n return {\n ref: elementRef,\n onPointerDown: handlePointerDown,\n isDragging,\n };\n};\n\n","/**\n * @file Hook for building wrapper components that accept either an element or a component override.\n */\nimport * as React from \"react\";\n\ntype WrapperProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype CloneableProps = WrapperProps & {\n ref?: React.Ref<HTMLDivElement>;\n};\n\ntype UseElementComponentWrapperOptions = {\n element?: React.ReactElement<WrapperProps>;\n component?: React.ComponentType<WrapperProps & { ref?: React.Ref<HTMLDivElement> }>;\n};\n\ntype WrapperComponent = React.ForwardRefExoticComponent<\n React.PropsWithChildren<WrapperProps> & React.RefAttributes<HTMLDivElement>\n>;\n\nconst createWrapperComponent = ({\n element,\n component: Component,\n}: UseElementComponentWrapperOptions): WrapperComponent =>\n React.forwardRef<HTMLDivElement, React.PropsWithChildren<WrapperProps>>(({ children, ...rest }, forwardedRef) => {\n if (element) {\n return React.cloneElement(\n element,\n { ...rest, ref: forwardedRef } as CloneableProps,\n children ?? element.props.children\n );\n }\n if (Component) {\n return (\n <Component {...rest} ref={forwardedRef}>\n {children}\n </Component>\n );\n }\n return (\n <div {...rest} ref={forwardedRef}>\n {children}\n </div>\n );\n });\n\n/**\n * Memoizes a wrapper component that can render either a provided element, a provided component, or a default tag.\n * @returns Wrapper component honoring the overrides.\n */\nexport function useElementComponentWrapper({\n element,\n component,\n}: UseElementComponentWrapperOptions): WrapperComponent {\n return React.useMemo(\n () =>\n createWrapperComponent({\n element,\n component,\n }),\n [component, element]\n );\n}\n","/**\n * @file Resize handle component\n */\nimport * as React from \"react\";\nimport { useResizeDrag } from \"../../modules/resizer/useResizeDrag\";\nimport {\n RESIZE_HANDLE_THICKNESS,\n RESIZE_HANDLE_Z_INDEX,\n COLOR_RESIZE_HANDLE_IDLE,\n COLOR_RESIZE_HANDLE_ACTIVE,\n COLOR_RESIZE_HANDLE_HOVER,\n} from \"../../constants/styles\";\nimport { useElementComponentWrapper } from \"../../hooks/useElementComponentWrapper\";\n\ntype ResizeHandleDirection = \"horizontal\" | \"vertical\";\n\nexport type ResizeHandleProps = {\n /** Direction of resize */\n direction: ResizeHandleDirection;\n /** Callback when resize occurs */\n onResize?: (delta: number) => void;\n /** Custom component for the handle */\n component?: React.ComponentType<React.HTMLAttributes<HTMLDivElement> & { ref?: React.Ref<HTMLDivElement> }>;\n /** Custom element for the handle */\n element?: React.ReactElement<React.HTMLAttributes<HTMLDivElement>>;\n /** Optional children rendered inside the handle */\n children?: React.ReactNode;\n};\n\nconst baseResizeHandleStyle: React.CSSProperties = {\n position: \"absolute\",\n zIndex: RESIZE_HANDLE_Z_INDEX,\n};\n\nconst sizeStylesByDirection: Record<ResizeHandleDirection, React.CSSProperties> = {\n vertical: {\n width: RESIZE_HANDLE_THICKNESS,\n height: \"100%\",\n top: 0,\n cursor: \"col-resize\",\n },\n horizontal: {\n width: \"100%\",\n height: RESIZE_HANDLE_THICKNESS,\n left: 0,\n cursor: \"row-resize\",\n },\n};\n\ntype ResizeHandleVisualState = \"idle\" | \"hovered\" | \"dragging\";\n\nconst backgroundByVisualState: Record<ResizeHandleVisualState, string> = {\n idle: COLOR_RESIZE_HANDLE_IDLE,\n hovered: COLOR_RESIZE_HANDLE_HOVER,\n dragging: COLOR_RESIZE_HANDLE_ACTIVE,\n};\n\n/**\n * ResizeHandle - Draggable handle for resizing grid areas\n */\nexport const ResizeHandle: React.FC<ResizeHandleProps> = ({\n direction,\n onResize,\n component: Component,\n element,\n children,\n}) => {\n const axis = direction === \"vertical\" ? \"x\" : \"y\";\n const { ref, isDragging, onPointerDown } = useResizeDrag<HTMLDivElement>({ axis, onResize });\n const [isHovered, setIsHovered] = React.useState(false);\n const handlePointerEnter = React.useCallback(() => {\n setIsHovered(true);\n }, []);\n const handlePointerLeave = React.useCallback(() => {\n setIsHovered(false);\n }, []);\n\n const Wrapper = useElementComponentWrapper({\n element,\n component: Component,\n });\n const visualState: ResizeHandleVisualState = React.useMemo(() => {\n if (isDragging) {\n return \"dragging\";\n }\n if (isHovered) {\n return \"hovered\";\n }\n return \"idle\";\n }, [isDragging, isHovered]);\n\n const style = React.useMemo(() => {\n return {\n ...baseResizeHandleStyle,\n ...sizeStylesByDirection[direction],\n backgroundColor: backgroundByVisualState[visualState],\n touchAction: \"none\",\n };\n }, [direction, visualState]);\n\n return (\n <Wrapper\n ref={ref}\n style={style}\n role=\"separator\"\n aria-orientation={direction}\n aria-hidden={undefined}\n data-resize-handle=\"true\"\n data-direction={direction}\n data-is-dragging={isDragging ? \"true\" : undefined}\n onPointerDown={onPointerDown}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={handlePointerLeave}\n >\n {children}\n </Wrapper>\n );\n};\n","/**\n * @file Internal renderer for grid resize handles.\n */\nimport * as React from \"react\";\nimport { ResizeHandle } from \"../resizer/ResizeHandle\";\nimport { GRID_HANDLE_THICKNESS } from \"../../constants/styles\";\n\ntype TrackDirection = \"row\" | \"col\";\n\ntype GridTrackResizeHandleProps = {\n direction: TrackDirection;\n trackIndex: number;\n align: \"start\" | \"end\";\n gap: number;\n span: { start: number; end: number };\n onResize: (direction: TrackDirection, index: number, delta: number) => void;\n};\n\nconst resizeHandleWrapperBaseStyle: React.CSSProperties = {\n position: \"absolute\",\n pointerEvents: \"auto\",\n};\n\nexport const GridTrackResizeHandle: React.FC<GridTrackResizeHandleProps> = ({\n direction,\n trackIndex,\n align,\n gap,\n span,\n onResize,\n}) => {\n const resizeDirection = direction === \"col\" ? \"vertical\" : \"horizontal\";\n\n const handleResize = React.useCallback(\n (delta: number) => {\n const signedDelta = align === \"start\" ? -delta : delta;\n onResize(direction, trackIndex, signedDelta);\n },\n [align, direction, trackIndex, onResize],\n );\n\n const placementStyle = React.useMemo<React.CSSProperties>(() => {\n if (direction === \"col\") {\n return {\n gridColumn: `${trackIndex + 1} / ${trackIndex + 2}`,\n gridRow: `${span.start} / ${span.end}`,\n };\n }\n return {\n gridRow: `${trackIndex + 1} / ${trackIndex + 2}`,\n gridColumn: `${span.start} / ${span.end}`,\n };\n }, [direction, trackIndex, span]);\n\n const wrapperStyle = React.useMemo<React.CSSProperties>(() => {\n const halfGap = Math.max(0, gap) / 2;\n const offset = halfGap + GRID_HANDLE_THICKNESS / 2;\n\n if (direction === \"col\") {\n return {\n ...resizeHandleWrapperBaseStyle,\n width: GRID_HANDLE_THICKNESS,\n height: \"100%\",\n top: 0,\n bottom: 0,\n ...(align === \"start\" ? { left: -offset } : { right: -offset }),\n };\n }\n\n return {\n ...resizeHandleWrapperBaseStyle,\n width: \"100%\",\n height: GRID_HANDLE_THICKNESS,\n left: 0,\n right: 0,\n ...(align === \"start\" ? { top: -offset } : { bottom: -offset }),\n };\n }, [align, direction, gap]);\n\n return (\n <div data-resizable=\"true\" style={{ ...placementStyle, position: \"relative\", pointerEvents: \"none\" }}>\n <div data-direction={resizeDirection} data-align={align} data-handle=\"true\" style={wrapperStyle}>\n <ResizeHandle direction={resizeDirection} onResize={handleResize} />\n </div>\n </div>\n );\n};\n","/**\n * @file Hooks for deriving grid placements and layer collections.\n */\nimport * as React from \"react\";\nimport type { LayerDefinition, PanelLayoutConfig } from \"../../types\";\n\ntype GridPlacement = {\n gridArea: string;\n gridRow: string;\n gridColumn: string;\n};\n\nconst computeGridPlacements = (areas: PanelLayoutConfig[\"areas\"]): Map<string, GridPlacement> => {\n type Bounds = {\n rowStart: number;\n rowEnd: number;\n colStart: number;\n colEnd: number;\n };\n\n const boundsByArea = new Map<string, Bounds>();\n\n areas.forEach((row, rowIndex) => {\n row.forEach((area, colIndex) => {\n if (!area || area === \".\") {\n return;\n }\n\n const existing = boundsByArea.get(area);\n if (existing) {\n const nextBounds: Bounds = {\n rowStart: Math.min(existing.rowStart, rowIndex),\n rowEnd: Math.max(existing.rowEnd, rowIndex),\n colStart: Math.min(existing.colStart, colIndex),\n colEnd: Math.max(existing.colEnd, colIndex),\n };\n\n boundsByArea.set(area, nextBounds);\n return;\n }\n\n const initialBounds: Bounds = {\n rowStart: rowIndex,\n rowEnd: rowIndex,\n colStart: colIndex,\n colEnd: colIndex,\n };\n\n boundsByArea.set(area, initialBounds);\n });\n });\n\n const placements = new Map<string, GridPlacement>();\n boundsByArea.forEach((bounds, area) => {\n const rowStart = bounds.rowStart + 1;\n const rowEnd = bounds.rowEnd + 2;\n const colStart = bounds.colStart + 1;\n const colEnd = bounds.colEnd + 2;\n\n const placement: GridPlacement = {\n gridArea: area,\n gridRow: `${rowStart} / ${rowEnd}`,\n gridColumn: `${colStart} / ${colEnd}`,\n };\n\n placements.set(area, placement);\n });\n\n return placements;\n};\n\nconst normalizeLayerForGrid = (\n layer: LayerDefinition,\n placements: Map<string, GridPlacement>,\n): LayerDefinition => {\n const mode = layer.positionMode ?? \"grid\";\n if (mode !== \"grid\") {\n return layer;\n }\n\n const placementKey = layer.gridArea ?? layer.id;\n const placement = placements.get(placementKey);\n\n if (!placement) {\n return layer;\n }\n\n const needsGridArea = !layer.gridArea;\n const needsRow = !layer.gridRow;\n const needsColumn = !layer.gridColumn;\n\n if (!needsGridArea && !needsRow && !needsColumn) {\n return layer;\n }\n\n return {\n ...layer,\n gridArea: needsGridArea ? placement.gridArea : layer.gridArea,\n gridRow: needsRow ? placement.gridRow : layer.gridRow,\n gridColumn: needsColumn ? placement.gridColumn : layer.gridColumn,\n };\n};\n\nexport const useGridPlacements = (\n config: PanelLayoutConfig,\n layers: LayerDefinition[],\n): {\n normalizedLayers: LayerDefinition[];\n visibleLayers: LayerDefinition[];\n regularLayers: LayerDefinition[];\n layerById: Map<string, LayerDefinition>;\n} => {\n const placements = React.useMemo(() => computeGridPlacements(config.areas), [config.areas]);\n\n const normalizedLayers = React.useMemo(() => {\n return layers.map((layer) => normalizeLayerForGrid(layer, placements));\n }, [layers, placements]);\n\n const visibleLayers = React.useMemo(\n () => normalizedLayers.filter((layer) => layer.visible !== false),\n [normalizedLayers],\n );\n\n const regularLayers = React.useMemo(\n () => visibleLayers.filter((layer) => !layer.drawer),\n [visibleLayers],\n );\n\n const layerById = React.useMemo(() => {\n const map = new Map<string, LayerDefinition>();\n normalizedLayers.forEach((layer) => {\n map.set(layer.id, layer);\n });\n return map;\n }, [normalizedLayers]);\n\n return {\n normalizedLayers,\n visibleLayers,\n regularLayers,\n layerById,\n };\n};\n","/**\n * @file Track sizing and resize handle hooks for the grid layout.\n */\nimport * as React from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport type { GridTrack, PanelLayoutConfig } from \"../../types\";\n\nexport type TrackHandleConfig = {\n trackIndex: number;\n align: \"start\" | \"end\";\n span: { start: number; end: number };\n};\n\ntype ParsedGap = {\n rowGap: number;\n columnGap: number;\n};\n\n// Inline track template utilities (previously in helpers)\ntype TrackDirection = \"row\" | \"col\";\n\nconst createTrackKey = (direction: TrackDirection, index: number): string => {\n return `${direction}-${index}`;\n};\n\nconst getTrackSize = (\n track: GridTrack,\n trackSizes: Record<string, number>,\n direction: TrackDirection,\n index: number,\n): string => {\n const key = createTrackKey(direction, index);\n const currentSize = trackSizes[key];\n if (currentSize !== undefined) {\n return `${currentSize}px`;\n }\n return track.size;\n};\n\nconst buildTrackTemplateString = (\n tracks: GridTrack[],\n trackSizes: Record<string, number>,\n direction: TrackDirection,\n): string => {\n return tracks.map((track, index) => getTrackSize(track, trackSizes, direction, index)).join(\" \");\n};\n\nconst extractInitialTrackSizes = (tracks: GridTrack[], direction: TrackDirection): Record<string, number> => {\n return tracks.reduce<Record<string, number>>((acc, track, index) => {\n if (track.resizable && track.size.endsWith(\"px\")) {\n acc[createTrackKey(direction, index)] = parseInt(track.size, 10);\n }\n return acc;\n }, {});\n};\n\n// Inline resize utils\nconst applyConstraints = (size: number, minSize?: number, maxSize?: number): number => {\n const withMinConstraint = minSize !== undefined ? Math.max(size, minSize) : size;\n const withMaxConstraint = maxSize !== undefined ? Math.min(withMinConstraint, maxSize) : withMinConstraint;\n return withMaxConstraint;\n};\n\nconst calculateNewTrackSize = (currentSize: number, delta: number, track: GridTrack): number => {\n const newSize = currentSize + delta;\n return applyConstraints(newSize, track.minSize, track.maxSize);\n};\n\nconst createTrackSizeUpdater = (\n direction: TrackDirection,\n index: number,\n currentSize: number,\n delta: number,\n track: GridTrack,\n) => {\n const key = createTrackKey(direction, index);\n return (prev: Record<string, number>): Record<string, number> => {\n const newSize = calculateNewTrackSize(currentSize, delta, track);\n return { ...prev, [key]: newSize };\n };\n};\n\n/**\n * Computes the valid row span for a column boundary.\n * Returns the contiguous range of rows where the adjacent areas differ.\n */\nconst computeColumnBoundarySpan = (\n areas: string[][],\n boundaryIndex: number,\n): { start: number; end: number } => {\n const rowCount = areas.length;\n\n // Find rows where left and right areas differ at this boundary\n const validRows: number[] = [];\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n const row = areas[rowIndex];\n const leftArea = row[boundaryIndex];\n const rightArea = row[boundaryIndex + 1];\n if (leftArea !== rightArea) {\n validRows.push(rowIndex);\n }\n }\n\n if (validRows.length === 0) {\n // Fallback: full span if no valid rows found (shouldn't happen for resizable columns)\n return { start: 1, end: rowCount + 1 };\n }\n\n // Convert to 1-indexed grid lines\n const minRow = Math.min(...validRows);\n const maxRow = Math.max(...validRows);\n return { start: minRow + 1, end: maxRow + 2 };\n};\n\n/**\n * Computes the valid column span for a row boundary.\n * Returns the contiguous range of columns where the adjacent areas differ.\n */\nconst computeRowBoundarySpan = (\n areas: string[][],\n boundaryIndex: number,\n): { start: number; end: number } => {\n const topRow = areas[boundaryIndex];\n const bottomRow = areas[boundaryIndex + 1];\n const colCount = topRow?.length ?? 0;\n\n // Find columns where top and bottom areas differ at this boundary\n const validCols: number[] = [];\n for (let colIndex = 0; colIndex < colCount; colIndex++) {\n const topArea = topRow?.[colIndex];\n const bottomArea = bottomRow?.[colIndex];\n if (topArea !== bottomArea) {\n validCols.push(colIndex);\n }\n }\n\n if (validCols.length === 0) {\n // Fallback: full span if no valid columns found\n return { start: 1, end: colCount + 1 };\n }\n\n // Convert to 1-indexed grid lines\n const minCol = Math.min(...validCols);\n const maxCol = Math.max(...validCols);\n return { start: minCol + 1, end: maxCol + 2 };\n};\n\nconst computeColumnResizeHandles = (\n tracks: GridTrack[],\n areas: string[][],\n): TrackHandleConfig[] => {\n if (tracks.length === 0) {\n return [];\n }\n\n const rowCount = areas.length;\n\n if (tracks.length === 1) {\n const onlyTrack = tracks[0];\n if (onlyTrack?.resizable) {\n const fullSpan = { start: 1, end: rowCount + 1 };\n return [{ trackIndex: 0, align: \"end\", span: fullSpan }];\n }\n return [];\n }\n\n const handles: TrackHandleConfig[] = [];\n\n const boundaryIndexes = Array.from({ length: tracks.length - 1 }, (_, index) => index);\n boundaryIndexes.forEach((boundaryIndex) => {\n const leftTrack = tracks[boundaryIndex];\n const rightTrack = tracks[boundaryIndex + 1];\n\n if (rightTrack?.resizable) {\n const span = computeColumnBoundarySpan(areas, boundaryIndex);\n handles.push({ trackIndex: boundaryIndex + 1, align: \"start\", span });\n return;\n }\n\n if (leftTrack?.resizable) {\n const span = computeColumnBoundarySpan(areas, boundaryIndex);\n handles.push({ trackIndex: boundaryIndex, align: \"end\", span });\n }\n });\n\n return handles;\n};\n\nconst computeRowResizeHandles = (\n tracks: GridTrack[],\n areas: string[][],\n): TrackHandleConfig[] => {\n if (tracks.length === 0) {\n return [];\n }\n\n const colCount = areas[0]?.length ?? 0;\n\n if (tracks.length === 1) {\n const onlyTrack = tracks[0];\n if (onlyTrack?.resizable) {\n const fullSpan = { start: 1, end: colCount + 1 };\n return [{ trackIndex: 0, align: \"end\", span: fullSpan }];\n }\n return [];\n }\n\n const handles: TrackHandleConfig[] = [];\n\n const boundaryIndexes = Array.from({ length: tracks.length - 1 }, (_, index) => index);\n boundaryIndexes.forEach((boundaryIndex) => {\n const topTrack = tracks[boundaryIndex];\n const bottomTrack = tracks[boundaryIndex + 1];\n\n if (bottomTrack?.resizable) {\n const span = computeRowBoundarySpan(areas, boundaryIndex);\n handles.push({ trackIndex: boundaryIndex + 1, align: \"start\", span });\n return;\n }\n\n if (topTrack?.resizable) {\n const span = computeRowBoundarySpan(areas, boundaryIndex);\n handles.push({ trackIndex: boundaryIndex, align: \"end\", span });\n }\n });\n\n return handles;\n};\n\nconst parseGap = (gapValue?: string): ParsedGap => {\n if (!gapValue) {\n return { rowGap: 0, columnGap: 0 };\n }\n\n const tokens = gapValue\n .split(/\\s+/)\n .map((token) => token.trim())\n .filter(Boolean);\n\n const parseToken = (token: string): number => {\n const match = token.match(/^(-?\\d+(?:\\.\\d+)?)px$/);\n if (!match) {\n return 0;\n }\n return Number.parseFloat(match[1]);\n };\n\n if (tokens.length === 1) {\n const parsed = parseToken(tokens[0]);\n return { rowGap: parsed, columnGap: parsed };\n }\n\n return {\n rowGap: parseToken(tokens[0]),\n columnGap: parseToken(tokens[1]),\n };\n};\n\nconst getGapStyle = (gap?: string): React.CSSProperties => {\n return gap !== undefined ? { gap } : {};\n};\n\nconst resolveCurrentTrackSize = (\n trackSizes: Record<string, number>,\n track: GridTrack,\n direction: TrackDirection,\n trackIndex: number,\n): number => {\n const key = createTrackKey(direction, trackIndex);\n const storedSize = trackSizes[key];\n\n if (storedSize !== undefined) {\n return storedSize;\n }\n\n if (track.size.endsWith(\"px\")) {\n return Number.parseInt(track.size, 10);\n }\n\n return 300;\n};\n\nexport const useGridTracks = (\n config: PanelLayoutConfig,\n styleProp?: React.CSSProperties,\n): {\n columnHandles: TrackHandleConfig[];\n rowHandles: TrackHandleConfig[];\n gapSizes: ParsedGap;\n gridStyle: React.CSSProperties;\n handleResize: (direction: TrackDirection, trackIndex: number, delta: number) => void;\n} => {\n const [trackSizes, setTrackSizes] = React.useState<Record<string, number>>(() => ({\n ...extractInitialTrackSizes(config.columns, \"col\"),\n ...extractInitialTrackSizes(config.rows, \"row\"),\n }));\n\n useIsomorphicLayoutEffect(() => {\n const nextSizes = {\n ...extractInitialTrackSizes(config.columns, \"col\"),\n ...extractInitialTrackSizes(config.rows, \"row\"),\n };\n\n setTrackSizes((prev) => {\n const allKeys = new Set([...Object.keys(prev), ...Object.keys(nextSizes)]);\n const hasChanges = Array.from(allKeys).some((key) => {\n return prev[key] !== nextSizes[key];\n });\n\n return hasChanges ? nextSizes : prev;\n });\n }, [config.columns, config.rows]);\n\n const areasString = React.useMemo(() => {\n return config.areas.map((row) => `\"${row.join(\" \")}\"`).join(\" \");\n }, [config.areas]);\n\n const gapSizes = React.useMemo(() => parseGap(config.gap), [config.gap]);\n const columnHandles = React.useMemo(\n () => computeColumnResizeHandles(config.columns, config.areas),\n [config.columns, config.areas],\n );\n const rowHandles = React.useMemo(\n () => computeRowResizeHandles(config.rows, config.areas),\n [config.rows, config.areas],\n );\n\n const gridStyle = React.useMemo((): React.CSSProperties => {\n return {\n ...config.style,\n ...styleProp,\n gridTemplateAreas: areasString,\n gridTemplateRows: buildTrackTemplateString(config.rows, trackSizes, \"row\"),\n gridTemplateColumns: buildTrackTemplateString(config.columns, trackSizes, \"col\"),\n ...getGapStyle(config.gap),\n };\n }, [areasString, config.columns, config.gap, config.rows, config.style, styleProp, trackSizes]);\n\n const handleResize = React.useCallback(\n (direction: TrackDirection, trackIndex: number, delta: number) => {\n const tracks = direction === \"row\" ? config.rows : config.columns;\n const track = tracks[trackIndex];\n if (!track || !track.resizable) {\n return;\n }\n\n const currentSize = resolveCurrentTrackSize(trackSizes, track, direction, trackIndex);\n setTrackSizes(createTrackSizeUpdater(direction, trackIndex, currentSize, delta, track));\n },\n [config.columns, config.rows, trackSizes],\n );\n\n return {\n columnHandles,\n rowHandles,\n gapSizes,\n gridStyle,\n handleResize,\n };\n};\n","/**\n * @file Primitive math helpers shared across modules.\n */\n\nexport const clampNumber = (\n value: number,\n min: number = Number.NEGATIVE_INFINITY,\n max: number = Number.POSITIVE_INFINITY,\n): number => {\n return Math.min(Math.max(value, min), max);\n};\n\nexport const toFiniteNumberOr = (value: number | undefined, fallback: number): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n return value;\n};\n","/**\n * @file Drag and resize interaction management for floating grid layers.\n */\nimport * as React from \"react\";\nimport { useDocumentPointerEvents } from \"../../hooks/useDocumentPointerEvents\";\nimport { useEffectEvent } from \"../../hooks/useEffectEvent\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport type { LayerDefinition, WindowPosition, WindowSize } from \"../../types\";\nimport { clampNumber } from \"../../utils/math\";\n// Inline style computation previously in layerStyles to keep hook-local logic\nimport type { CSSProperties } from \"react\";\nimport type { GridLayerHandleProps, GridLayoutContextValue, ResizeHandleConfig } from \"./GridLayoutContext\";\n// UI components should not be imported here; expose pointer handlers instead.\n\ntype LayerSize = {\n width: number;\n height: number;\n};\n\ntype DragState = {\n pointerStartX: number;\n pointerStartY: number;\n initialTranslationX: number;\n initialTranslationY: number;\n baseLeft: number;\n baseTop: number;\n layerId: string;\n pointerId: number;\n target: HTMLElement;\n};\n\ntype HorizontalEdge = \"left\" | \"right\";\ntype VerticalEdge = \"top\" | \"bottom\";\n\ntype ResizeState = {\n layerId: string;\n pointerId: number;\n horizontalEdge?: HorizontalEdge;\n verticalEdge?: VerticalEdge;\n startX: number;\n startY: number;\n startWidth: number;\n startHeight: number;\n startPosition: { x: number; y: number };\n baseLeft: number;\n baseTop: number;\n minWidth?: number;\n maxWidth?: number;\n minHeight?: number;\n maxHeight?: number;\n target: HTMLElement;\n};\n\n// ------------------------------------------------------------------------------------------\n// Inline layer style computation (was layerStyles.ts)\n// ------------------------------------------------------------------------------------------\nconst resolvePositionMode = (layer: LayerDefinition): LayerDefinition[\"positionMode\"] => {\n if (layer.positionMode) {\n return layer.positionMode;\n }\n if (layer.floating) {\n const floatingMode = layer.floating.mode ?? \"embedded\";\n return floatingMode === \"embedded\" ? \"absolute\" : \"relative\";\n }\n return \"grid\";\n};\n\nconst getPositionModeStyle = (mode: LayerDefinition[\"positionMode\"]): CSSProperties => {\n return { position: mode === \"grid\" ? \"relative\" : mode };\n};\n\nconst getGridAreaStyle = (layer: LayerDefinition, mode: LayerDefinition[\"positionMode\"]): CSSProperties => {\n if (mode !== \"grid\") {\n return {};\n }\n return {\n gridArea: layer.gridArea,\n gridRow: layer.gridRow,\n gridColumn: layer.gridColumn,\n };\n};\n\nconst getAbsolutePositionStyle = (position?: WindowPosition | LayerDefinition[\"position\"]): CSSProperties => {\n if (!position) {\n return {};\n }\n\n return {\n top: position.top,\n right: position.right,\n bottom: position.bottom,\n left: position.left,\n };\n};\n\nconst getZIndexStyle = (zIndex?: number): CSSProperties => {\n return zIndex !== undefined ? { zIndex } : {};\n};\n\nconst getDimensionsStyle = (width?: number | string, height?: number | string): CSSProperties => {\n return {\n width,\n height,\n };\n};\n\nconst getPointerEventsStyle = (layer: LayerDefinition, mode: LayerDefinition[\"positionMode\"]): CSSProperties => {\n if (layer.pointerEvents !== undefined) {\n if (typeof layer.pointerEvents === \"boolean\") {\n return { pointerEvents: layer.pointerEvents ? \"auto\" : \"none\" };\n }\n return { pointerEvents: layer.pointerEvents };\n }\n\n if (mode === \"absolute\" || mode === \"fixed\") {\n return { pointerEvents: \"auto\" };\n }\n\n return {};\n};\n\nconst resolveEffectivePosition = (\n layer: LayerDefinition,\n): WindowPosition | LayerDefinition[\"position\"] | undefined => {\n return layer.position;\n};\n\nconst resolveEffectiveSize = (\n layer: LayerDefinition,\n): {\n width?: number | string;\n height?: number | string;\n} => {\n return {\n width: layer.width,\n height: layer.height,\n };\n};\n\nconst resolveEffectiveZIndex = (layer: LayerDefinition): number | undefined => {\n return layer.zIndex;\n};\n\nconst buildLayerStyleObject = (layer: LayerDefinition): CSSProperties => {\n const resolvedMode = resolvePositionMode(layer);\n const effectivePosition = resolveEffectivePosition(layer);\n const effectiveSize = resolveEffectiveSize(layer);\n const effectiveZIndex = resolveEffectiveZIndex(layer);\n\n return {\n ...layer.style,\n ...getPositionModeStyle(resolvedMode),\n ...getGridAreaStyle(layer, resolvedMode),\n ...getAbsolutePositionStyle(effectivePosition),\n ...getZIndexStyle(effectiveZIndex),\n ...getDimensionsStyle(effectiveSize.width, effectiveSize.height),\n ...getPointerEventsStyle(layer, resolvedMode),\n };\n};\n\nconst resolveFloatingMode = (layer: LayerDefinition): \"embedded\" | \"popup\" | null => {\n const floating = layer.floating;\n if (!floating) {\n return null;\n }\n const mode = floating.mode ?? \"embedded\";\n return mode;\n};\n\nconst getEmbeddedFloatingConfig = (layer: LayerDefinition) => {\n const mode = resolveFloatingMode(layer);\n if (mode !== \"embedded\") {\n return null;\n }\n return layer.floating ?? null;\n};\n\nconst isInteractiveElement = (target: EventTarget | null): target is HTMLElement => {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n return [\"INPUT\", \"TEXTAREA\", \"SELECT\", \"BUTTON\"].includes(target.tagName);\n};\n\n\nconst clampDimension = (value: number, min?: number, max?: number): number => {\n const resolvedMin = min ?? Number.NEGATIVE_INFINITY;\n const resolvedMax = max ?? Number.POSITIVE_INFINITY;\n return clampNumber(value, resolvedMin, resolvedMax);\n};\n\nconst ensureNumericOffset = (value: number | string | undefined, key: keyof WindowPosition, layerId: string): number => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n throw new Error(\n `Floating layer \"${layerId}\" must provide a numeric \"${key}\" value when draggable mode is enabled.`,\n );\n};\n\nconst resolveDragAnchor = (layer: LayerDefinition): { left: number; top: number } => {\n const floating = getEmbeddedFloatingConfig(layer);\n if (!floating) {\n throw new Error(`Floating layer \"${layer.id}\" is missing floating configuration required for dragging.`);\n }\n const position = layer.position;\n if (!position) {\n throw new Error(`Floating layer \"${layer.id}\" must define position with left and top values.`);\n }\n return {\n left: ensureNumericOffset(position.left, \"left\", layer.id),\n top: ensureNumericOffset(position.top, \"top\", layer.id),\n };\n};\n\nconst resolveFloatingConstraints = (\n layer: LayerDefinition,\n): { minWidth?: number; maxWidth?: number; minHeight?: number; maxHeight?: number } => {\n const floating = getEmbeddedFloatingConfig(layer);\n if (!floating) {\n return {};\n }\n return floating.constraints ?? {};\n};\n\nconst resolveHorizontalSizeCandidate = (\n edge: HorizontalEdge | undefined,\n startSize: number,\n delta: number,\n): number => {\n if (!edge) {\n return startSize;\n }\n return edge === \"left\" ? startSize - delta : startSize + delta;\n};\n\nconst resolveVerticalSizeCandidate = (edge: VerticalEdge | undefined, startSize: number, delta: number): number => {\n if (!edge) {\n return startSize;\n }\n return edge === \"top\" ? startSize - delta : startSize + delta;\n};\n\nconst resolveHorizontalPosition = (\n edge: HorizontalEdge | undefined,\n startPosition: number,\n delta: number,\n): number => {\n if (!edge || edge === \"right\") {\n return startPosition;\n }\n return startPosition + delta;\n};\n\nconst resolveVerticalPosition = (\n edge: VerticalEdge | undefined,\n startPosition: number,\n delta: number,\n): number => {\n if (!edge || edge === \"bottom\") {\n return startPosition;\n }\n return startPosition + delta;\n};\n\nconst findLayerElementById = (element: HTMLElement | null, layerId: string): HTMLElement | null => {\n if (!element) {\n return null;\n }\n if (element.dataset.layerId === layerId) {\n return element;\n }\n return findLayerElementById(element.parentElement, layerId);\n};\n\nconst findAncestor = (\n element: HTMLElement | null,\n predicate: (node: HTMLElement) => boolean,\n stopPredicate?: (node: HTMLElement) => boolean,\n): HTMLElement | null => {\n if (!element) {\n return null;\n }\n if (stopPredicate?.(element)) {\n return null;\n }\n if (predicate(element)) {\n return element;\n }\n return findAncestor(element.parentElement, predicate, stopPredicate);\n};\n\nconst findDragHandleElement = (target: EventTarget | null): HTMLElement | null => {\n if (!(target instanceof HTMLElement)) {\n return null;\n }\n\n return findAncestor(\n target,\n (node) => node.dataset.dragHandle === \"true\",\n (node) => node.dataset.dragIgnore === \"true\",\n );\n};\n\nconst isResizeControl = (target: EventTarget | null): boolean => {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n return (\n findAncestor(\n target,\n (node) => node.dataset.resizeCorner !== undefined || node.dataset.resizeEdge !== undefined,\n ) !== null\n );\n};\n\nconst shouldRenderFloatingResize = (layer: LayerDefinition): boolean => {\n const floating = getEmbeddedFloatingConfig(layer);\n if (!floating) {\n return false;\n }\n return floating.resizable === true;\n};\n\nconst getLayerSizeFromDefinition = (layer: LayerDefinition): LayerSize | null => {\n const floating = getEmbeddedFloatingConfig(layer);\n if (!floating) {\n return null;\n }\n const size = getNumericLayerSize(layer);\n if (!size) {\n throw new Error(`Floating layer \"${layer.id}\" must define width and height when resizable or draggable.`);\n }\n return {\n width: size.width,\n height: size.height,\n };\n};\n\n// No-op placeholder: rendering is handled in component layer\n\nconst computeResizableLayerSizes = (\n layers: LayerDefinition[],\n previousSizes: Record<string, LayerSize>,\n activeResizeLayerId: string | null,\n): { sizes: Record<string, LayerSize>; changed: boolean } => {\n const nextSizes = layers\n .filter(shouldRenderFloatingResize)\n .reduce<Record<string, LayerSize>>((accumulator, layer) => {\n if (activeResizeLayerId === layer.id) {\n const existing = previousSizes[layer.id];\n if (existing) {\n accumulator[layer.id] = existing;\n return accumulator;\n }\n }\n\n const parsedSize = getLayerSizeFromDefinition(layer);\n if (!parsedSize) {\n return accumulator;\n }\n\n accumulator[layer.id] = parsedSize;\n return accumulator;\n }, {});\n\n const previousKeys = Object.keys(previousSizes);\n const nextKeys = Object.keys(nextSizes);\n\n const keysChangedByLength = previousKeys.length !== nextKeys.length;\n const keysChangedByMissing = previousKeys.some((key) => {\n return !Object.prototype.hasOwnProperty.call(nextSizes, key);\n });\n const keysChanged = keysChangedByLength ? true : keysChangedByMissing;\n\n const sizeChanged = nextKeys.some((key) => {\n const previous = previousSizes[key];\n const next = nextSizes[key];\n if (!previous || !next) {\n return true;\n }\n return previous.width !== next.width || previous.height !== next.height;\n });\n\n const changed = keysChanged ? true : sizeChanged;\n\n return {\n sizes: nextSizes,\n changed,\n };\n};\n\ntype UseLayerInteractionsArgs = {\n layers: LayerDefinition[];\n layerById: Map<string, LayerDefinition>;\n};\n\nexport const useLayerInteractions = ({\n layers,\n layerById,\n}: UseLayerInteractionsArgs): {\n providerValue: GridLayoutContextValue;\n draggingLayerId: string | null;\n resizingLayerId: string | null;\n} => {\n const [draggingLayerId, setDraggingLayerId] = React.useState<string | null>(null);\n const [resizingLayerId, setResizingLayerId] = React.useState<string | null>(null);\n\n const [layerPositions, setLayerPositions] = React.useState<Record<string, { x: number; y: number }>>({});\n const [layerSizes, setLayerSizes] = React.useState<Record<string, LayerSize>>({});\n\n const dragStartRef = React.useRef<DragState | null>(null);\n const resizeStartRef = React.useRef<ResizeState | null>(null);\n\n const notifyFloatingMove = useEffectEvent((layerId: string, position: WindowPosition) => {\n const layer = layerById.get(layerId);\n const floating = layer?.floating;\n floating?.onMove?.(position);\n });\n\n const notifyFloatingResize = useEffectEvent((layerId: string, size: WindowSize) => {\n const layer = layerById.get(layerId);\n const floating = layer?.floating;\n floating?.onResize?.(size);\n });\n\n useIsomorphicLayoutEffect(() => {\n const { sizes, changed } = computeResizableLayerSizes(layers, layerSizes, resizingLayerId);\n if (!changed) {\n return;\n }\n setLayerSizes(sizes);\n }, [layers, resizingLayerId]);\n\n const beginLayerDrag = React.useCallback(\n (layerId: string, layer: LayerDefinition, target: HTMLElement, event: React.PointerEvent) => {\n const anchor = resolveDragAnchor(layer);\n const translation = layerPositions[layerId] ?? { x: 0, y: 0 };\n const dragState: DragState = {\n pointerStartX: event.clientX,\n pointerStartY: event.clientY,\n initialTranslationX: translation.x,\n initialTranslationY: translation.y,\n baseLeft: anchor.left,\n baseTop: anchor.top,\n layerId,\n pointerId: event.pointerId,\n target: target as HTMLElement,\n };\n\n if (dragState.target.setPointerCapture) {\n try {\n dragState.target.setPointerCapture(dragState.pointerId);\n } catch {\n // Ignore pointer capture errors\n }\n }\n\n dragStartRef.current = dragState;\n setDraggingLayerId(layerId);\n },\n [layerPositions],\n );\n\n const handleLayerPointerDown = React.useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n const target = event.target;\n const dragHandle = findDragHandleElement(target);\n if (!dragHandle) {\n return;\n }\n\n const layerId = dragHandle.closest('[data-layer-id]')?.getAttribute(\"data-layer-id\");\n if (!layerId) {\n return;\n }\n const layer = layerById.get(layerId);\n if (!layer) {\n return;\n }\n const floating = getEmbeddedFloatingConfig(layer);\n if (!floating || floating.draggable !== true) {\n return;\n }\n\n if (isInteractiveElement(event.target)) {\n return;\n }\n\n if (isResizeControl(event.target)) {\n return;\n }\n\n if (dragHandle) {\n const layerElement = findLayerElementById(dragHandle as HTMLElement, layerId);\n if (!layerElement) {\n return;\n }\n beginLayerDrag(layerId, layer, layerElement, event);\n return;\n }\n },\n [beginLayerDrag, layerById],\n );\n\n const handleDragHandlePointerDown = React.useCallback(\n (layerId: string, event: React.PointerEvent<HTMLElement>) => {\n const layer = layerById.get(layerId);\n const floating = layer ? getEmbeddedFloatingConfig(layer) : null;\n if (!layer || !floating || floating.draggable !== true) {\n return;\n }\n\n if (isInteractiveElement(event.target)) {\n return;\n }\n\n if (isResizeControl(event.target)) {\n return;\n }\n\n const layerElement = findLayerElementById(event.currentTarget as HTMLElement, layerId);\n if (!layerElement) {\n return;\n }\n\n beginLayerDrag(layerId, layer, layerElement, event);\n },\n [beginLayerDrag, layerById],\n );\n\n const handleResizePointerDown = React.useCallback(\n (layerId: string, config: ResizeHandleConfig, event: React.PointerEvent<HTMLDivElement>) => {\n const layer = layerById.get(layerId);\n if (!layer || !shouldRenderFloatingResize(layer)) {\n return;\n }\n\n const sizeEntry = layerSizes[layerId] ?? getLayerSizeFromDefinition(layer);\n if (!sizeEntry) {\n return;\n }\n\n const baseAnchor = resolveDragAnchor(layer);\n const constraints = resolveFloatingConstraints(layer);\n\n const initialPosition = layerPositions[layerId] ?? { x: 0, y: 0 };\n\n event.stopPropagation();\n event.preventDefault();\n\n if (event.currentTarget.setPointerCapture) {\n try {\n event.currentTarget.setPointerCapture(event.pointerId);\n } catch {\n // Pointer capture may be unsupported; ignore gracefully.\n }\n }\n\n resizeStartRef.current = {\n layerId,\n pointerId: event.pointerId,\n horizontalEdge: config.horizontal,\n verticalEdge: config.vertical,\n startX: event.clientX,\n startY: event.clientY,\n startWidth: sizeEntry.width,\n startHeight: sizeEntry.height,\n startPosition: initialPosition,\n baseLeft: baseAnchor.left,\n baseTop: baseAnchor.top,\n minWidth: constraints.minWidth,\n maxWidth: constraints.maxWidth,\n minHeight: constraints.minHeight,\n maxHeight: constraints.maxHeight,\n target: event.currentTarget,\n };\n\n setResizingLayerId(layerId);\n },\n [layerById, layerPositions, layerSizes],\n );\n\n const handleDragPointerMove = React.useCallback(\n (event: PointerEvent) => {\n const dragStart = dragStartRef.current;\n if (!dragStart) {\n return;\n }\n\n const deltaX = event.clientX - dragStart.pointerStartX;\n const deltaY = event.clientY - dragStart.pointerStartY;\n const newPos = {\n x: dragStart.initialTranslationX + deltaX,\n y: dragStart.initialTranslationY + deltaY,\n };\n\n setLayerPositions((prev) => ({ ...prev, [dragStart.layerId]: newPos }));\n notifyFloatingMove(dragStart.layerId, {\n left: dragStart.baseLeft + newPos.x,\n top: dragStart.baseTop + newPos.y,\n });\n },\n [notifyFloatingMove],\n );\n\n const handleResizePointerMove = React.useCallback(\n (event: PointerEvent) => {\n const resizeStart = resizeStartRef.current;\n if (!resizeStart || resizeStart.pointerId !== event.pointerId) {\n return;\n }\n\n const layer = layerById.get(resizeStart.layerId);\n if (!layer) {\n return;\n }\n\n const deltaX = event.clientX - resizeStart.startX;\n const deltaY = event.clientY - resizeStart.startY;\n\n const widthCandidate = resolveHorizontalSizeCandidate(resizeStart.horizontalEdge, resizeStart.startWidth, deltaX);\n const heightCandidate = resolveVerticalSizeCandidate(resizeStart.verticalEdge, resizeStart.startHeight, deltaY);\n\n const nextWidth = clampDimension(widthCandidate, resizeStart.minWidth, resizeStart.maxWidth);\n const nextHeight = clampDimension(heightCandidate, resizeStart.minHeight, resizeStart.maxHeight);\n\n const widthDelta = resizeStart.startWidth - nextWidth;\n const heightDelta = resizeStart.startHeight - nextHeight;\n\n const nextPositionX = resolveHorizontalPosition(\n resizeStart.horizontalEdge,\n resizeStart.startPosition.x,\n widthDelta,\n );\n const nextPositionY = resolveVerticalPosition(resizeStart.verticalEdge, resizeStart.startPosition.y, heightDelta);\n\n const currentSize = layerSizes[resizeStart.layerId];\n const nextSize: WindowSize = { width: nextWidth, height: nextHeight };\n const sizeChanged =\n !currentSize || currentSize.width !== nextWidth || currentSize.height !== nextHeight;\n if (sizeChanged) {\n setLayerSizes((prev) => ({\n ...prev,\n [resizeStart.layerId]: nextSize,\n }));\n notifyFloatingResize(resizeStart.layerId, nextSize);\n }\n\n const currentPosition = layerPositions[resizeStart.layerId] ?? { x: 0, y: 0 };\n const nextPosition = { x: nextPositionX, y: nextPositionY };\n const positionChanged =\n currentPosition.x !== nextPosition.x || currentPosition.y !== nextPosition.y;\n if (positionChanged) {\n setLayerPositions((prev) => ({\n ...prev,\n [resizeStart.layerId]: nextPosition,\n }));\n notifyFloatingMove(resizeStart.layerId, {\n left: resizeStart.baseLeft + nextPosition.x,\n top: resizeStart.baseTop + nextPosition.y,\n });\n }\n },\n [layerById, layerPositions, layerSizes, notifyFloatingMove, notifyFloatingResize],\n );\n\n const finishDrag = React.useCallback((event: PointerEvent) => {\n const dragStart = dragStartRef.current;\n if (dragStart) {\n if (dragStart.pointerId === event.pointerId && dragStart.target.releasePointerCapture) {\n try {\n dragStart.target.releasePointerCapture(dragStart.pointerId);\n } catch {\n // Ignore release errors (e.g., already released).\n }\n }\n dragStartRef.current = null;\n }\n setDraggingLayerId(null);\n }, []);\n\n const finishResize = React.useCallback((event: PointerEvent) => {\n const resizeStart = resizeStartRef.current;\n if (resizeStart) {\n if (resizeStart.pointerId === event.pointerId && resizeStart.target.releasePointerCapture) {\n try {\n resizeStart.target.releasePointerCapture(resizeStart.pointerId);\n } catch {\n // Ignore pointer capture release errors.\n }\n }\n resizeStartRef.current = null;\n }\n setResizingLayerId(null);\n }, []);\n\n useDocumentPointerEvents(draggingLayerId !== null, {\n onMove: handleDragPointerMove,\n onUp: finishDrag,\n onCancel: finishDrag,\n });\n\n useDocumentPointerEvents(resizingLayerId !== null, {\n onMove: handleResizePointerMove,\n onUp: finishResize,\n onCancel: finishResize,\n });\n\n const buildDraggableLayerStyle = React.useCallback(\n (layer: LayerDefinition): React.CSSProperties => {\n const baseStyle = buildLayerStyleObject(layer);\n\n const floating = getEmbeddedFloatingConfig(layer);\n if (!floating || floating.draggable !== true) {\n return baseStyle;\n }\n\n const position = layerPositions[layer.id];\n const isDragging = draggingLayerId === layer.id;\n const isResizing = resizingLayerId === layer.id;\n const transformStyle = position ? { transform: `translate(${position.x}px, ${position.y}px)` } : {};\n const storedSize = layerSizes[layer.id];\n const fallbackSize = shouldRenderFloatingResize(layer) ? getLayerSizeFromDefinition(layer) : null;\n const sizeRecord = storedSize ?? fallbackSize;\n const sizeStyle = sizeRecord ? { width: `${sizeRecord.width}px`, height: `${sizeRecord.height}px` } : {};\n const cursorStyle = isDragging || isResizing ? { cursor: \"grabbing\" } : {};\n\n return {\n ...baseStyle,\n ...sizeStyle,\n ...transformStyle,\n ...cursorStyle,\n };\n },\n [draggingLayerId, layerPositions, layerSizes, resizingLayerId],\n );\n\n const getResizeHandleState = React.useCallback(\n (layer: LayerDefinition): { isResizable: boolean; onPointerDown?: (config: ResizeHandleConfig, event: React.PointerEvent<HTMLDivElement>) => void } => {\n const canResize = shouldRenderFloatingResize(layer);\n if (!canResize) {\n return { isResizable: false };\n }\n\n const storedLayerSize = layerSizes[layer.id];\n const fallbackLayerSize = getLayerSizeFromDefinition(layer);\n const sizeForHandle = storedLayerSize ?? fallbackLayerSize;\n const show = sizeForHandle !== null;\n if (!show) {\n return { isResizable: false };\n }\n\n const onPointerDown = (config: ResizeHandleConfig, event: React.PointerEvent<HTMLDivElement>) => {\n handleResizePointerDown(layer.id, config, event);\n };\n\n return { isResizable: true, onPointerDown };\n },\n [handleResizePointerDown, layerSizes],\n );\n\n const getLayerRenderState = React.useCallback(\n (layer: LayerDefinition) => {\n const { isResizable, onPointerDown } = getResizeHandleState(layer);\n const style = buildDraggableLayerStyle(layer);\n const isResizing = resizingLayerId === layer.id;\n\n return {\n style,\n isResizable,\n isResizing,\n onResizeHandlePointerDown: (config: ResizeHandleConfig, event: React.PointerEvent<HTMLDivElement>) => {\n if (onPointerDown) {\n onPointerDown(config, event);\n }\n },\n };\n },\n [buildDraggableLayerStyle, getResizeHandleState, resizingLayerId],\n );\n\n const getLayerHandleProps = React.useCallback(\n (layerId: string): GridLayerHandleProps => {\n return {\n \"data-drag-handle\": \"true\",\n role: \"button\",\n \"aria-roledescription\": \"Drag handle\",\n \"aria-label\": \"Drag layer\",\n onPointerDown: (event: React.PointerEvent<HTMLElement>) => {\n handleDragHandlePointerDown(layerId, event);\n },\n };\n },\n [handleDragHandlePointerDown],\n );\n\n const providerValue = React.useMemo<GridLayoutContextValue>(\n () => ({\n handleLayerPointerDown,\n getLayerRenderState,\n getLayerHandleProps,\n }),\n [getLayerHandleProps, getLayerRenderState, handleLayerPointerDown],\n );\n\n return {\n providerValue,\n draggingLayerId,\n resizingLayerId,\n };\n};\n\n/* Debug note: Reviewed GridLayout.module.css and LayerInstanceContext to keep drag handle integration consistent. */\nconst getNumericLayerSize = (layer: LayerDefinition): LayerSize | undefined => {\n if (typeof layer.width === \"number\" && typeof layer.height === \"number\") {\n return { width: layer.width, height: layer.height };\n }\n return undefined;\n};\n","/**\n * @file Top-level grid layout component that consumes PanelSystemContext core.\n */\nimport * as React from \"react\";\nimport { useIntersectionObserver } from \"../../hooks/useIntersectionObserver\";\nimport type { LayerDefinition, PanelLayoutConfig } from \"../../types\";\nimport { DrawerLayers } from \"../window/DrawerLayers\";\nimport { GridLayerList } from \"./GridLayerList\";\nimport { GridTrackResizeHandle } from \"./GridTrackResizeHandle\";\nimport { PanelSystemProvider, usePanelSystem } from \"../../PanelSystemContext\";\nimport { useGridPlacements } from \"../../modules/grid/useGridPlacements\";\nimport { useGridTracks } from \"../../modules/grid/useGridTracks\";\nimport { useLayerInteractions } from \"../../modules/grid/useLayerInteractions\";\nimport { GridLayoutProvider } from \"../../modules/grid/GridLayoutContext\";\n\nconst gridLayoutBaseStyle: React.CSSProperties = {\n display: \"grid\",\n width: \"100%\",\n height: \"100%\",\n};\n\nconst gridLayoutDraggingStyle: React.CSSProperties = {\n touchAction: \"none\",\n WebkitTouchCallout: \"none\",\n WebkitUserSelect: \"none\",\n userSelect: \"none\",\n};\n\nexport type GridLayoutProps = {\n config: PanelLayoutConfig;\n layers: LayerDefinition[];\n style?: React.CSSProperties;\n};\n\nexport const GridLayout: React.FC<GridLayoutProps> = ({ config, layers, style: styleProp }) => {\n const gridRef = React.useRef<HTMLDivElement | null>(null);\n const { isIntersecting } = useIntersectionObserver(gridRef, { threshold: 0 });\n\n return (\n <PanelSystemProvider config={config} layers={layers} style={styleProp}>\n <GridLayoutInner gridRef={gridRef} isIntersecting={isIntersecting} />\n </PanelSystemProvider>\n );\n};\n\nconst GridLayoutInner: React.FC<{\n gridRef: React.RefObject<HTMLDivElement | null>;\n isIntersecting: boolean;\n}> = ({ gridRef, isIntersecting }) => {\n const { config, style, layers } = usePanelSystem();\n const { normalizedLayers, visibleLayers, regularLayers, layerById } = useGridPlacements(config, layers.defs);\n const { columnHandles, rowHandles, gapSizes, gridStyle, handleResize } = useGridTracks(config, style);\n const { providerValue, draggingLayerId, resizingLayerId } = useLayerInteractions({\n layers: normalizedLayers,\n layerById,\n });\n\n const isDraggingOrResizing = draggingLayerId ? true : Boolean(resizingLayerId);\n const combinedStyle = React.useMemo(() => {\n return {\n ...gridLayoutBaseStyle,\n ...gridStyle,\n ...(isDraggingOrResizing ? gridLayoutDraggingStyle : {}),\n };\n }, [gridStyle, isDraggingOrResizing]);\n\n return (\n <>\n <div\n ref={gridRef}\n style={combinedStyle}\n data-dragging={Boolean(draggingLayerId)}\n data-resizing={Boolean(resizingLayerId)}\n data-visible={isIntersecting}\n >\n <GridLayoutProvider value={providerValue}>\n <GridLayerList layers={regularLayers} />\n </GridLayoutProvider>\n\n {columnHandles.map(({ trackIndex, align, span }) => (\n <GridTrackResizeHandle\n key={`col-${trackIndex}:${align}`}\n direction=\"col\"\n trackIndex={trackIndex}\n align={align}\n gap={gapSizes.columnGap}\n span={span}\n onResize={handleResize}\n />\n ))}\n\n {rowHandles.map(({ trackIndex, align, span }) => (\n <GridTrackResizeHandle\n key={`row-${trackIndex}:${align}`}\n direction=\"row\"\n trackIndex={trackIndex}\n align={align}\n gap={gapSizes.rowGap}\n span={span}\n onResize={handleResize}\n />\n ))}\n </div>\n\n <DrawerLayers layers={visibleLayers} />\n </>\n );\n};\n\n/* Debug note: Refactored to consume PanelSystemContext core for consistent separation. */\n"],"names":["createIdGenerator","map","ref","existing","nextId","getId","observerCache","getSharedObserver","options","observerKey","observer","#callbackMap","#intersectionObserver","entries","entry","callback","target","voidClientRect","useIntersectionObserver","threshold","rootMargin","root","intersection","setIntersection","React","drawerBackdropStyle","COLOR_DRAWER_BACKDROP","drawerBaseStyle","drawerPlacementStyles","computeTransitionValue","mode","duration","easing","durationValue","DRAWER_TRANSITION_DURATION","easingValue","DRAWER_TRANSITION_EASING","shouldShowCloseButton","dismissible","showClose","closeButtonStyle","DRAWER_CLOSE_BUTTON_FONT_SIZE","DrawerHeaderView","header","onClose","showCloseButton","shouldShowClose","jsxs","FloatingPanelHeader","DRAWER_HEADER_PADDING_Y","DRAWER_HEADER_PADDING_X","DRAWER_HEADER_GAP","jsx","FloatingPanelTitle","DrawerView","chrome","children","FloatingPanelFrame","FloatingPanelContent","DRAWER_CONTENT_PADDING","Drawer","id","config","isOpen","zIndex","width","height","position","inline","transitionMode","transitionDuration","transitionEasing","placement","pos","openTransforms","drawerStyle","transitionValue","style","ariaLabel","backdropStyle","base","Fragment","waitForTransitionEnd","el","timeout","resolve","resolved","done","handler","e","runTransition","update","useTransitionState","states","setStates","optionsRef","transitionOptions","element","prev","opts","state","open","close","parseDuration","value","match","useDrawerState","layers","drawerStates","setDrawerStates","initial","layer","layerMap","updateState","layerId","DrawerLayers","drawer","drawerLayers","closeHandlers","handlers","GridLayoutContext","GridLayoutProvider","useGridLayoutContext","context","PanelSystemContext","usePanelSystem","ctx","PanelSystemProvider","layerById","LayerInstanceContext","LayerInstanceProvider","useLayerInstance","ensureNumericOffset","key","resolvePopupAnchor","numericFeature","booleanFeature","buildWindowFeatures","features","anchor","overrides","toolbar","menubar","location","status","resizable","scrollbars","applyBoundsToWindow","popupWindow","PopupLayerPortal","floating","containerRef","popupWindowRef","isMounted","setIsMounted","windowName","createdWindow","resolvePopupWindow","openedWindow","mountNode","handleBeforeUnload","createPortal","bounds","customFactory","resizeHandleBaseStyle","cornerHandleStyle","GRID_LAYER_CORNER_HIT_SIZE","edgeHandleStyle","cornerPositions","edgePositions","GRID_LAYER_EDGE_HIT_THICKNESS","RESIZE_HANDLE_CONFIGS","GridLayerResizeHandles","onPointerDown","baseStyle","positionStyle","combinedStyle","datasetProps","event","PivotLayer","pivot","Outlet","usePivot","LayerContent","LayerResizeHandles","isResizable","EmbeddedLayer","handleLayerPointerDown","getLayerRenderState","isResizing","onResizeHandlePointerDown","gridPlacementStyle","GridLayerList","floatingMode","useEffectEvent","fn","args","currentFn","useDocumentPointerEvents","enabled","handleMoveEvent","handleUpEvent","handleCancelEvent","usePointerCapture","elementRef","pointerId","usePreventPointerDefaults","events","preventDefault","eventType","useDragPointerEvents","onMove","onUp","onCancel","capturePointer","preventDefaults","useResizeDrag","pointerIdRef","previousCoordinateRef","isDragging","setIsDragging","emitResize","delta","getCoordinate","handlePointerDown","handlePointerMove","coordinate","handlePointerUp","createWrapperComponent","Component","rest","forwardedRef","useElementComponentWrapper","component","baseResizeHandleStyle","RESIZE_HANDLE_Z_INDEX","sizeStylesByDirection","RESIZE_HANDLE_THICKNESS","backgroundByVisualState","COLOR_RESIZE_HANDLE_IDLE","COLOR_RESIZE_HANDLE_HOVER","COLOR_RESIZE_HANDLE_ACTIVE","ResizeHandle","direction","onResize","axis","isHovered","setIsHovered","handlePointerEnter","handlePointerLeave","Wrapper","visualState","resizeHandleWrapperBaseStyle","GridTrackResizeHandle","trackIndex","align","gap","span","resizeDirection","handleResize","signedDelta","placementStyle","wrapperStyle","offset","GRID_HANDLE_THICKNESS","computeGridPlacements","areas","boundsByArea","row","rowIndex","area","colIndex","nextBounds","initialBounds","placements","rowStart","rowEnd","colStart","colEnd","normalizeLayerForGrid","placementKey","needsGridArea","needsRow","needsColumn","useGridPlacements","normalizedLayers","visibleLayers","regularLayers","createTrackKey","index","getTrackSize","track","trackSizes","currentSize","buildTrackTemplateString","tracks","extractInitialTrackSizes","acc","applyConstraints","size","minSize","maxSize","withMinConstraint","calculateNewTrackSize","newSize","createTrackSizeUpdater","computeColumnBoundarySpan","boundaryIndex","rowCount","validRows","leftArea","rightArea","minRow","maxRow","computeRowBoundarySpan","topRow","bottomRow","colCount","validCols","topArea","bottomArea","minCol","maxCol","computeColumnResizeHandles","handles","_","leftTrack","computeRowResizeHandles","topTrack","parseGap","gapValue","tokens","token","parseToken","parsed","getGapStyle","resolveCurrentTrackSize","storedSize","useGridTracks","styleProp","setTrackSizes","useIsomorphicLayoutEffect","nextSizes","allKeys","areasString","gapSizes","columnHandles","rowHandles","gridStyle","clampNumber","min","max","toFiniteNumberOr","fallback","resolvePositionMode","getPositionModeStyle","getGridAreaStyle","getAbsolutePositionStyle","getZIndexStyle","getDimensionsStyle","getPointerEventsStyle","resolveEffectivePosition","resolveEffectiveSize","resolveEffectiveZIndex","buildLayerStyleObject","resolvedMode","effectivePosition","effectiveSize","effectiveZIndex","resolveFloatingMode","getEmbeddedFloatingConfig","isInteractiveElement","clampDimension","resolvedMin","resolvedMax","resolveDragAnchor","resolveFloatingConstraints","resolveHorizontalSizeCandidate","edge","startSize","resolveVerticalSizeCandidate","resolveHorizontalPosition","startPosition","resolveVerticalPosition","findLayerElementById","findAncestor","predicate","stopPredicate","findDragHandleElement","node","isResizeControl","shouldRenderFloatingResize","getLayerSizeFromDefinition","getNumericLayerSize","computeResizableLayerSizes","previousSizes","activeResizeLayerId","accumulator","parsedSize","previousKeys","nextKeys","keysChangedByLength","keysChangedByMissing","keysChanged","sizeChanged","previous","next","useLayerInteractions","draggingLayerId","setDraggingLayerId","resizingLayerId","setResizingLayerId","layerPositions","setLayerPositions","layerSizes","setLayerSizes","dragStartRef","resizeStartRef","notifyFloatingMove","notifyFloatingResize","sizes","changed","beginLayerDrag","translation","dragState","dragHandle","layerElement","handleDragHandlePointerDown","handleResizePointerDown","sizeEntry","baseAnchor","constraints","initialPosition","handleDragPointerMove","dragStart","deltaX","deltaY","newPos","handleResizePointerMove","resizeStart","widthCandidate","heightCandidate","nextWidth","nextHeight","widthDelta","heightDelta","nextPositionX","nextPositionY","nextSize","currentPosition","nextPosition","finishDrag","finishResize","buildDraggableLayerStyle","transformStyle","fallbackSize","sizeRecord","sizeStyle","getResizeHandleState","storedLayerSize","fallbackLayerSize","getLayerHandleProps","gridLayoutBaseStyle","gridLayoutDraggingStyle","GridLayout","gridRef","isIntersecting","GridLayoutInner","providerValue","isDraggingOrResizing"],"mappings":"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"}
|
package/dist/styles-DcG3aIFx.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const _="var(--rpl-color-resize-handle-idle, rgba(255, 255, 255, 0.12))",E="var(--rpl-color-resize-handle-hover, rgba(33, 150, 243, 0.35))",R="var(--rpl-color-resize-handle-active, rgba(33, 150, 243, 0.55))",A="var(--rpl-color-drop-suggest-border, rgba(90, 150, 255, 0.9))",D="var(--rpl-color-drop-suggest-bg, rgba(90, 150, 255, 0.15))",O="var(--rpl-color-insert-guide, rgba(120, 160, 255, 0.95))",r="var(--rpl-color-insert-guide-shadow, 0 0 0 2px rgba(120, 160, 255, 0.2))",I="var(--rpl-color-surface, #fff)",N="var(--rpl-color-surface-2, #fafafa)",T="var(--rpl-color-border, #e5e7eb)",a="var(--rpl-color-muted-fg, #6b7280)",S="var(--rpl-shadow-card, 0 2px 10px rgba(0, 0, 0, 0.08))",o="var(--rpl-color-drawer-backdrop, rgba(0, 0, 0, 0.5))",s="var(--rpl-drawer-transition-duration, 220ms)",n="var(--rpl-drawer-transition-easing, cubic-bezier(0.22, 1, 0.36, 1))",G="var(--rpl-pivot-animation-enter, none)",L="var(--rpl-pivot-animation-leave, none)",t="var(--rpl-radius-suggest, 6px)",e="var(--rpl-size-suggest-border, 2px)";const p="var(--rpl-size-resize-handle-thickness, 4px)",c="var(--rpl-size-split-handle-thickness, 6px)",l="var(--rpl-z-overlay, 9998)",P="var(--rpl-z-tabdrag-overlay, 9999)",i=p,C="var(--rpl-z-resize-handle, 1000)",d=4,H="var(--rpl-size-grid-layer-corner-hit, 14px)",v="var(--rpl-size-grid-layer-edge-hit-thickness, 12px)",g=l,F=e,U=t,B=A,W=D,Z=6,x=P,b="var(--rpl-space-tab-drag-preview-offset-x, 12px)",V="var(--rpl-space-tab-drag-preview-offset-y, 12px)",f="var(--rpl-size-tab-drag-insert-guide-width, 2px)",h="var(--rpl-radius-tab-drag-insert-guide, 1px)",z=O,u=r,X="var(--rpl-radius-floating-panel, 8px)",w="var(--rpl-space-floating-panel-gap, 8px)",K="var(--rpl-space-floating-panel-header-padding-y, 8px)",Y="var(--rpl-space-floating-panel-header-padding-x, 12px)",M="var(--rpl-space-floating-panel-content-padding, 12px)",y="var(--rpl-size-floating-panel-meta-font, 12px)",m="var(--rpl-space-floating-panel-controls-gap, 6px)",k=I,j=N,q=T,J=a,Q=S,$="var(--rpl-space-drawer-header-padding-y, 10px)",__="var(--rpl-space-drawer-header-padding-x, 12px)",E_="var(--rpl-space-drawer-header-gap, 8px)",R_="var(--rpl-space-drawer-content-padding, 12px)",A_="var(--rpl-size-drawer-close-button-font, 18px)",D_=c,O_="var(--rpl-size-horizontal-divider-width, 4px)";exports.COLOR_DRAWER_BACKDROP=o;exports.COLOR_RESIZE_HANDLE_ACTIVE=R;exports.COLOR_RESIZE_HANDLE_HOVER=E;exports.COLOR_RESIZE_HANDLE_IDLE=_;exports.CSS_VAR_PREFIX="rpl";exports.DRAWER_CLOSE_BUTTON_FONT_SIZE=A_;exports.DRAWER_CONTENT_PADDING=R_;exports.DRAWER_HEADER_GAP=E_;exports.DRAWER_HEADER_PADDING_X=__;exports.DRAWER_HEADER_PADDING_Y=$;exports.DRAWER_TRANSITION_DURATION=s;exports.DRAWER_TRANSITION_EASING=n;exports.DROP_SUGGEST_BG_COLOR=W;exports.DROP_SUGGEST_BORDER_COLOR=B;exports.DROP_SUGGEST_BORDER_RADIUS=U;exports.DROP_SUGGEST_BORDER_WIDTH=F;exports.DROP_SUGGEST_PADDING_PX=Z;exports.DROP_SUGGEST_Z_INDEX=g;exports.FLOATING_PANEL_BORDER_COLOR=q;exports.FLOATING_PANEL_BORDER_RADIUS=X;exports.FLOATING_PANEL_CONTENT_PADDING=M;exports.FLOATING_PANEL_CONTROLS_GAP=m;exports.FLOATING_PANEL_GAP=w;exports.FLOATING_PANEL_HEADER_PADDING_X=Y;exports.FLOATING_PANEL_HEADER_PADDING_Y=K;exports.FLOATING_PANEL_META_FONT_SIZE=y;exports.FLOATING_PANEL_MUTED_FG_COLOR=J;exports.FLOATING_PANEL_SHADOW=Q;exports.FLOATING_PANEL_SURFACE_2_COLOR=j;exports.FLOATING_PANEL_SURFACE_COLOR=k;exports.GRID_HANDLE_THICKNESS=d;exports.GRID_LAYER_CORNER_HIT_SIZE=H;exports.GRID_LAYER_EDGE_HIT_THICKNESS=v;exports.HORIZONTAL_DIVIDER_WIDTH=O_;exports.PIVOT_ANIMATION_ENTER=G;exports.PIVOT_ANIMATION_LEAVE=L;exports.RESIZE_HANDLE_THICKNESS=i;exports.RESIZE_HANDLE_Z_INDEX=C;exports.SPLIT_HANDLE_THICKNESS=D_;exports.TAB_DRAG_INSERT_GUIDE_BORDER_RADIUS=h;exports.TAB_DRAG_INSERT_GUIDE_COLOR=z;exports.TAB_DRAG_INSERT_GUIDE_SHADOW=u;exports.TAB_DRAG_INSERT_GUIDE_WIDTH=f;exports.TAB_DRAG_OVERLAY_Z_INDEX=x;exports.TAB_DRAG_PREVIEW_OFFSET_X=b;exports.TAB_DRAG_PREVIEW_OFFSET_Y=V;
|
|
2
|
-
//# sourceMappingURL=styles-DcG3aIFx.cjs.map
|
package/dist/styles-w0ZixggV.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
const I = "rpl", l = "var(--rpl-color-resize-handle-idle, rgba(255, 255, 255, 0.12))", N = "var(--rpl-color-resize-handle-hover, rgba(33, 150, 243, 0.35))", T = "var(--rpl-color-resize-handle-active, rgba(33, 150, 243, 0.55))", a = "var(--rpl-color-drop-suggest-border, rgba(90, 150, 255, 0.9))", _ = "var(--rpl-color-drop-suggest-bg, rgba(90, 150, 255, 0.15))", r = "var(--rpl-color-insert-guide, rgba(120, 160, 255, 0.95))", s = "var(--rpl-color-insert-guide-shadow, 0 0 0 2px rgba(120, 160, 255, 0.2))", E = "var(--rpl-color-surface, #fff)", o = "var(--rpl-color-surface-2, #fafafa)", R = "var(--rpl-color-border, #e5e7eb)", n = "var(--rpl-color-muted-fg, #6b7280)", e = "var(--rpl-shadow-card, 0 2px 10px rgba(0, 0, 0, 0.08))", S = "var(--rpl-color-drawer-backdrop, rgba(0, 0, 0, 0.5))", i = "var(--rpl-drawer-transition-duration, 220ms)", G = "var(--rpl-drawer-transition-easing, cubic-bezier(0.22, 1, 0.36, 1))", L = "var(--rpl-pivot-animation-enter, none)", d = "var(--rpl-pivot-animation-leave, none)", t = "var(--rpl-radius-suggest, 6px)", O = "var(--rpl-size-suggest-border, 2px)";
|
|
2
|
-
const D = "var(--rpl-size-resize-handle-thickness, 4px)", p = "var(--rpl-size-split-handle-thickness, 6px)", A = "var(--rpl-z-overlay, 9998)", c = "var(--rpl-z-tabdrag-overlay, 9999)", v = D, g = "var(--rpl-z-resize-handle, 1000)", C = 4, P = "var(--rpl-size-grid-layer-corner-hit, 14px)", H = "var(--rpl-size-grid-layer-edge-hit-thickness, 12px)", x = A, U = O, F = t, b = a, f = _, h = 6, B = c, z = "var(--rpl-space-tab-drag-preview-offset-x, 12px)", Z = "var(--rpl-space-tab-drag-preview-offset-y, 12px)", u = "var(--rpl-size-tab-drag-insert-guide-width, 2px)", W = "var(--rpl-radius-tab-drag-insert-guide, 1px)", w = r, V = s, K = "var(--rpl-radius-floating-panel, 8px)", y = "var(--rpl-space-floating-panel-gap, 8px)", X = "var(--rpl-space-floating-panel-header-padding-y, 8px)", Y = "var(--rpl-space-floating-panel-header-padding-x, 12px)", m = "var(--rpl-space-floating-panel-content-padding, 12px)", M = "var(--rpl-size-floating-panel-meta-font, 12px)", k = "var(--rpl-space-floating-panel-controls-gap, 6px)", j = E, q = o, J = R, Q = n, $ = e, aa = "var(--rpl-space-drawer-header-padding-y, 10px)", _a = "var(--rpl-space-drawer-header-padding-x, 12px)", ra = "var(--rpl-space-drawer-header-gap, 8px)", sa = "var(--rpl-space-drawer-content-padding, 12px)", Ea = "var(--rpl-size-drawer-close-button-font, 18px)", oa = p, Ra = "var(--rpl-size-horizontal-divider-width, 4px)";
|
|
3
|
-
export {
|
|
4
|
-
f as A,
|
|
5
|
-
U as B,
|
|
6
|
-
S as C,
|
|
7
|
-
i as D,
|
|
8
|
-
b as E,
|
|
9
|
-
$ as F,
|
|
10
|
-
H as G,
|
|
11
|
-
Ra as H,
|
|
12
|
-
h as I,
|
|
13
|
-
Z as J,
|
|
14
|
-
V as K,
|
|
15
|
-
w as L,
|
|
16
|
-
W as M,
|
|
17
|
-
u as N,
|
|
18
|
-
B as O,
|
|
19
|
-
L as P,
|
|
20
|
-
I as Q,
|
|
21
|
-
v as R,
|
|
22
|
-
oa as S,
|
|
23
|
-
z as T,
|
|
24
|
-
j as a,
|
|
25
|
-
J as b,
|
|
26
|
-
K as c,
|
|
27
|
-
q as d,
|
|
28
|
-
X as e,
|
|
29
|
-
Y as f,
|
|
30
|
-
y as g,
|
|
31
|
-
M as h,
|
|
32
|
-
Q as i,
|
|
33
|
-
k as j,
|
|
34
|
-
m as k,
|
|
35
|
-
d as l,
|
|
36
|
-
G as m,
|
|
37
|
-
sa as n,
|
|
38
|
-
ra as o,
|
|
39
|
-
aa as p,
|
|
40
|
-
_a as q,
|
|
41
|
-
Ea as r,
|
|
42
|
-
P as s,
|
|
43
|
-
T as t,
|
|
44
|
-
N as u,
|
|
45
|
-
l as v,
|
|
46
|
-
g as w,
|
|
47
|
-
C as x,
|
|
48
|
-
x as y,
|
|
49
|
-
F as z
|
|
50
|
-
};
|
|
51
|
-
//# sourceMappingURL=styles-w0ZixggV.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"styles-w0ZixggV.js","sources":["../src/constants/styles.ts"],"sourcesContent":["/**\n * @file Style constants for library components\n *\n * These constants reference CSS variables defined in variables.css.\n * This allows users to override theme values via CSS while maintaining\n * type-safe constants in TypeScript.\n *\n * All CSS variables use the unified prefix: --rpl- (react-panel-layout)\n * Users can override these via CSS variables (--rpl-*)\n *\n * @example\n * // In your CSS:\n * :root {\n * --rpl-color-primary: #ff0000;\n * }\n */\n\n// ========================================\n// CSS VARIABLE PREFIX\n// ========================================\n\n/**\n * Unified CSS variable prefix for all react-panel-layout variables\n * All theme variables use this prefix: --rpl-*\n */\nexport const CSS_VAR_PREFIX = 'rpl';\n\n// ========================================\n// COLORS\n// ========================================\n\n/**\n * Tab colors - used in TabBar component\n */\nexport const COLOR_TAB_FG = \"var(--rpl-color-tab-fg, #d5d7de)\";\nexport const COLOR_TAB_ACTIVE_BG = \"var(--rpl-color-tab-active-bg, #2b2d35)\";\nexport const COLOR_TABBAR_BG = \"var(--rpl-color-tabbar-bg, #1e1f24)\";\n\n/**\n * Panel colors - used in panel layouts\n */\nexport const COLOR_PANEL_BORDER = \"var(--rpl-color-panel-border, rgba(0, 0, 0, 0.3))\";\nexport const COLOR_PANEL_BG = \"var(--rpl-color-panel-bg, #0b0b0c)\";\n\n/**\n * Primary color - used for resize handles, highlights\n */\nexport const COLOR_PRIMARY = \"var(--rpl-color-primary, #2196f3)\";\nexport const COLOR_RESIZE_HANDLE_IDLE = \"var(--rpl-color-resize-handle-idle, rgba(255, 255, 255, 0.12))\";\nexport const COLOR_RESIZE_HANDLE_HOVER = \"var(--rpl-color-resize-handle-hover, rgba(33, 150, 243, 0.35))\";\nexport const COLOR_RESIZE_HANDLE_ACTIVE = \"var(--rpl-color-resize-handle-active, rgba(33, 150, 243, 0.55))\";\n\n/**\n * Drop suggestion overlay colors\n */\nexport const COLOR_DROP_SUGGEST_BORDER = \"var(--rpl-color-drop-suggest-border, rgba(90, 150, 255, 0.9))\";\nexport const COLOR_DROP_SUGGEST_BG = \"var(--rpl-color-drop-suggest-bg, rgba(90, 150, 255, 0.15))\";\n\n/**\n * Tab drag overlay colors\n */\nexport const COLOR_TABDRAG_BG = \"var(--rpl-color-tabdrag-bg, rgba(34, 36, 42, 0.95))\";\nexport const COLOR_TABDRAG_FG = \"var(--rpl-color-tabdrag-fg, #e9ebf0)\";\nexport const COLOR_TABDRAG_BORDER = \"var(--rpl-color-tabdrag-border, rgba(120, 160, 255, 0.6))\";\nexport const COLOR_TABDRAG_SHADOW = \"var(--rpl-color-tabdrag-shadow, 0 6px 20px rgba(0, 0, 0, 0.35))\";\n\n/**\n * Insert guide colors\n */\nexport const COLOR_INSERT_GUIDE = \"var(--rpl-color-insert-guide, rgba(120, 160, 255, 0.95))\";\nexport const COLOR_INSERT_GUIDE_SHADOW = \"var(--rpl-color-insert-guide-shadow, 0 0 0 2px rgba(120, 160, 255, 0.2))\";\n\n/**\n * Node editor / floating panel colors\n * These are used by Drawer and FloatingPanelFrame components\n */\nexport const COLOR_NODE_EDITOR_SURFACE = \"var(--rpl-color-surface, #fff)\";\nexport const COLOR_NODE_EDITOR_SURFACE_2 = \"var(--rpl-color-surface-2, #fafafa)\";\nexport const COLOR_NODE_EDITOR_BORDER = \"var(--rpl-color-border, #e5e7eb)\";\nexport const COLOR_NODE_EDITOR_MUTED_FG = \"var(--rpl-color-muted-fg, #6b7280)\";\nexport const COLOR_NODE_EDITOR_CARD_SHADOW = \"var(--rpl-shadow-card, 0 2px 10px rgba(0, 0, 0, 0.08))\";\nexport const COLOR_DRAWER_BACKDROP = \"var(--rpl-color-drawer-backdrop, rgba(0, 0, 0, 0.5))\";\n\n/**\n * Drawer transitions\n */\nexport const DRAWER_TRANSITION_DURATION = \"var(--rpl-drawer-transition-duration, 220ms)\";\nexport const DRAWER_TRANSITION_EASING = \"var(--rpl-drawer-transition-easing, cubic-bezier(0.22, 1, 0.36, 1))\";\n\n/**\n * Pivot animations\n * User defines @keyframes in their CSS and references via these tokens.\n * - Enter: Applied when content becomes active\n * - Leave: Applied when content becomes inactive\n */\nexport const PIVOT_ANIMATION_ENTER = \"var(--rpl-pivot-animation-enter, none)\";\nexport const PIVOT_ANIMATION_LEAVE = \"var(--rpl-pivot-animation-leave, none)\";\n\n// ========================================\n// SIZING & SPACING\n// ========================================\n\n/**\n * Tab sizing\n */\nexport const SIZE_TAB_FONT = \"var(--rpl-size-tab-font, 12px)\";\nexport const SPACE_TAB_PADDING_Y = \"var(--rpl-space-tab-padding-y, 4px)\";\nexport const SPACE_TAB_PADDING_X = \"var(--rpl-space-tab-padding-x, 8px)\";\n\n/**\n * Tabbar spacing\n */\nexport const SPACE_TABBAR_GAP = \"var(--rpl-space-tabbar-gap, 6px)\";\nexport const SPACE_TABBAR_PADDING_Y = \"var(--rpl-space-tabbar-padding-y, 4px)\";\nexport const SPACE_TABBAR_PADDING_X = \"var(--rpl-space-tabbar-padding-x, 6px)\";\n\n/**\n * Border radius (decorative, using CSS variables)\n */\nexport const RADIUS_TAB = \"var(--rpl-radius-tab, 4px)\";\nexport const RADIUS_SUGGEST = \"var(--rpl-radius-suggest, 6px)\";\n\n/**\n * Border widths\n */\nexport const SIZE_SUGGEST_BORDER = \"var(--rpl-size-suggest-border, 2px)\";\n\n/**\n * Handle thicknesses\n * Note: SIZE_GRID_HANDLE_THICKNESS is kept as number for JavaScript calculations\n */\nexport const SIZE_GRID_HANDLE_THICKNESS = 4; // Used in GridTrackResizeHandle.tsx for offset calculation\nexport const SIZE_RESIZE_HANDLE_THICKNESS = \"var(--rpl-size-resize-handle-thickness, 4px)\";\nexport const SIZE_SPLIT_HANDLE_THICKNESS = \"var(--rpl-size-split-handle-thickness, 6px)\";\n\n/**\n * Drop suggest padding\n */\nexport const SPACE_DROP_SUGGEST_PADDING = \"var(--rpl-space-drop-suggest-padding, 6px)\";\n\n// ========================================\n// Z-INDEXES\n// ========================================\n\nexport const Z_OVERLAY = \"var(--rpl-z-overlay, 9998)\";\nexport const Z_TABDRAG_OVERLAY = \"var(--rpl-z-tabdrag-overlay, 9999)\";\nexport const Z_DIALOG_OVERLAY = \"var(--rpl-z-dialog-overlay, 10000)\";\n\n// ========================================\n// COMPONENT-SPECIFIC CONSTANTS\n// ========================================\n\n/**\n * Resize Handle\n */\nexport const RESIZE_HANDLE_THICKNESS = SIZE_RESIZE_HANDLE_THICKNESS;\nexport const RESIZE_HANDLE_Z_INDEX = \"var(--rpl-z-resize-handle, 1000)\";\n\n/**\n * Grid Track Resize Handle\n */\nexport const GRID_HANDLE_THICKNESS = SIZE_GRID_HANDLE_THICKNESS;\n\n/**\n * Grid Layer Resize Handles\n */\nexport const GRID_LAYER_CORNER_HIT_SIZE = \"var(--rpl-size-grid-layer-corner-hit, 14px)\";\nexport const GRID_LAYER_EDGE_HIT_THICKNESS = \"var(--rpl-size-grid-layer-edge-hit-thickness, 12px)\";\n\n/**\n * Drop Suggest Overlay\n */\nexport const DROP_SUGGEST_Z_INDEX = Z_OVERLAY;\nexport const DROP_SUGGEST_BORDER_WIDTH = SIZE_SUGGEST_BORDER;\nexport const DROP_SUGGEST_BORDER_RADIUS = RADIUS_SUGGEST;\nexport const DROP_SUGGEST_BORDER_COLOR = COLOR_DROP_SUGGEST_BORDER;\nexport const DROP_SUGGEST_BG_COLOR = COLOR_DROP_SUGGEST_BG;\nexport const DROP_SUGGEST_PADDING = SPACE_DROP_SUGGEST_PADDING;\nexport const DROP_SUGGEST_PADDING_PX = 6;\n\n/**\n * Tab Drag Overlay\n */\nexport const TAB_DRAG_OVERLAY_Z_INDEX = Z_TABDRAG_OVERLAY;\nexport const TAB_DRAG_PREVIEW_OFFSET_X = \"var(--rpl-space-tab-drag-preview-offset-x, 12px)\";\nexport const TAB_DRAG_PREVIEW_OFFSET_Y = \"var(--rpl-space-tab-drag-preview-offset-y, 12px)\";\nexport const TAB_DRAG_PREVIEW_BORDER_RADIUS = \"var(--rpl-radius-tab-drag-preview, 6px)\";\nexport const TAB_DRAG_PREVIEW_PADDING_Y = \"var(--rpl-space-tab-drag-preview-padding-y, 4px)\";\nexport const TAB_DRAG_PREVIEW_PADDING_X = \"var(--rpl-space-tab-drag-preview-padding-x, 8px)\";\nexport const TAB_DRAG_PREVIEW_FONT_SIZE = \"var(--rpl-size-tab-drag-preview-font, 12px)\";\nexport const TAB_DRAG_INSERT_GUIDE_WIDTH = \"var(--rpl-size-tab-drag-insert-guide-width, 2px)\";\nexport const TAB_DRAG_INSERT_GUIDE_BORDER_RADIUS = \"var(--rpl-radius-tab-drag-insert-guide, 1px)\";\nexport const TAB_DRAG_PREVIEW_BG_COLOR = COLOR_TABDRAG_BG;\nexport const TAB_DRAG_PREVIEW_FG_COLOR = COLOR_TABDRAG_FG;\nexport const TAB_DRAG_PREVIEW_BORDER_COLOR = COLOR_TABDRAG_BORDER;\nexport const TAB_DRAG_PREVIEW_SHADOW = COLOR_TABDRAG_SHADOW;\nexport const TAB_DRAG_INSERT_GUIDE_COLOR = COLOR_INSERT_GUIDE;\nexport const TAB_DRAG_INSERT_GUIDE_SHADOW = COLOR_INSERT_GUIDE_SHADOW;\n\n/**\n * Dialog Overlay\n */\nexport const DIALOG_OVERLAY_Z_INDEX = Z_DIALOG_OVERLAY;\n\n/**\n * Floating Panel Frame\n */\nexport const FLOATING_PANEL_BORDER_RADIUS = \"var(--rpl-radius-floating-panel, 8px)\";\nexport const FLOATING_PANEL_GAP = \"var(--rpl-space-floating-panel-gap, 8px)\";\nexport const FLOATING_PANEL_HEADER_PADDING_Y = \"var(--rpl-space-floating-panel-header-padding-y, 8px)\";\nexport const FLOATING_PANEL_HEADER_PADDING_X = \"var(--rpl-space-floating-panel-header-padding-x, 12px)\";\nexport const FLOATING_PANEL_CONTENT_PADDING = \"var(--rpl-space-floating-panel-content-padding, 12px)\";\nexport const FLOATING_PANEL_META_FONT_SIZE = \"var(--rpl-size-floating-panel-meta-font, 12px)\";\nexport const FLOATING_PANEL_CONTROLS_GAP = \"var(--rpl-space-floating-panel-controls-gap, 6px)\";\nexport const FLOATING_PANEL_SURFACE_COLOR = COLOR_NODE_EDITOR_SURFACE;\nexport const FLOATING_PANEL_SURFACE_2_COLOR = COLOR_NODE_EDITOR_SURFACE_2;\nexport const FLOATING_PANEL_BORDER_COLOR = COLOR_NODE_EDITOR_BORDER;\nexport const FLOATING_PANEL_MUTED_FG_COLOR = COLOR_NODE_EDITOR_MUTED_FG;\nexport const FLOATING_PANEL_SHADOW = COLOR_NODE_EDITOR_CARD_SHADOW;\n\n/**\n * Drawer\n */\nexport const DRAWER_HEADER_PADDING_Y = \"var(--rpl-space-drawer-header-padding-y, 10px)\";\nexport const DRAWER_HEADER_PADDING_X = \"var(--rpl-space-drawer-header-padding-x, 12px)\";\nexport const DRAWER_HEADER_GAP = \"var(--rpl-space-drawer-header-gap, 8px)\";\nexport const DRAWER_CONTENT_PADDING = \"var(--rpl-space-drawer-content-padding, 12px)\";\nexport const DRAWER_CLOSE_BUTTON_FONT_SIZE = \"var(--rpl-size-drawer-close-button-font, 18px)\";\nexport const DRAWER_SURFACE_COLOR = COLOR_NODE_EDITOR_SURFACE;\nexport const DRAWER_BORDER_COLOR = COLOR_NODE_EDITOR_BORDER;\nexport const DRAWER_SHADOW = COLOR_NODE_EDITOR_CARD_SHADOW;\n\n/**\n * Split Handles\n */\nexport const SPLIT_HANDLE_THICKNESS = SIZE_SPLIT_HANDLE_THICKNESS;\n\n/**\n * HorizontalDivider\n */\nexport const HORIZONTAL_DIVIDER_WIDTH = \"var(--rpl-size-horizontal-divider-width, 4px)\";\nexport const HORIZONTAL_DIVIDER_HIT_AREA_OFFSET = \"var(--rpl-space-horizontal-divider-hit-area-offset, 4px)\";\n"],"names":["CSS_VAR_PREFIX","COLOR_RESIZE_HANDLE_IDLE","COLOR_RESIZE_HANDLE_HOVER","COLOR_RESIZE_HANDLE_ACTIVE","COLOR_DROP_SUGGEST_BORDER","COLOR_DROP_SUGGEST_BG","COLOR_INSERT_GUIDE","COLOR_INSERT_GUIDE_SHADOW","COLOR_NODE_EDITOR_SURFACE","COLOR_NODE_EDITOR_SURFACE_2","COLOR_NODE_EDITOR_BORDER","COLOR_NODE_EDITOR_MUTED_FG","COLOR_NODE_EDITOR_CARD_SHADOW","COLOR_DRAWER_BACKDROP","DRAWER_TRANSITION_DURATION","DRAWER_TRANSITION_EASING","PIVOT_ANIMATION_ENTER","PIVOT_ANIMATION_LEAVE","RADIUS_SUGGEST","SIZE_SUGGEST_BORDER","SIZE_RESIZE_HANDLE_THICKNESS","SIZE_SPLIT_HANDLE_THICKNESS","Z_OVERLAY","Z_TABDRAG_OVERLAY","RESIZE_HANDLE_THICKNESS","RESIZE_HANDLE_Z_INDEX","GRID_HANDLE_THICKNESS","GRID_LAYER_CORNER_HIT_SIZE","GRID_LAYER_EDGE_HIT_THICKNESS","DROP_SUGGEST_Z_INDEX","DROP_SUGGEST_BORDER_WIDTH","DROP_SUGGEST_BORDER_RADIUS","DROP_SUGGEST_BORDER_COLOR","DROP_SUGGEST_BG_COLOR","DROP_SUGGEST_PADDING_PX","TAB_DRAG_OVERLAY_Z_INDEX","TAB_DRAG_PREVIEW_OFFSET_X","TAB_DRAG_PREVIEW_OFFSET_Y","TAB_DRAG_INSERT_GUIDE_WIDTH","TAB_DRAG_INSERT_GUIDE_BORDER_RADIUS","TAB_DRAG_INSERT_GUIDE_COLOR","TAB_DRAG_INSERT_GUIDE_SHADOW","FLOATING_PANEL_BORDER_RADIUS","FLOATING_PANEL_GAP","FLOATING_PANEL_HEADER_PADDING_Y","FLOATING_PANEL_HEADER_PADDING_X","FLOATING_PANEL_CONTENT_PADDING","FLOATING_PANEL_META_FONT_SIZE","FLOATING_PANEL_CONTROLS_GAP","FLOATING_PANEL_SURFACE_COLOR","FLOATING_PANEL_SURFACE_2_COLOR","FLOATING_PANEL_BORDER_COLOR","FLOATING_PANEL_MUTED_FG_COLOR","FLOATING_PANEL_SHADOW","DRAWER_HEADER_PADDING_Y","DRAWER_HEADER_PADDING_X","DRAWER_HEADER_GAP","DRAWER_CONTENT_PADDING","DRAWER_CLOSE_BUTTON_FONT_SIZE","SPLIT_HANDLE_THICKNESS","HORIZONTAL_DIVIDER_WIDTH"],"mappings":"AAyBO,MAAMA,IAAiB,OAuBjBC,IAA2B,kEAC3BC,IAA4B,kEAC5BC,IAA6B,mEAK7BC,IAA4B,iEAC5BC,IAAwB,8DAaxBC,IAAqB,4DACrBC,IAA4B,4EAM5BC,IAA4B,kCAC5BC,IAA8B,uCAC9BC,IAA2B,oCAC3BC,IAA6B,sCAC7BC,IAAgC,0DAChCC,IAAwB,wDAKxBC,IAA6B,gDAC7BC,IAA2B,uEAQ3BC,IAAwB,0CACxBC,IAAwB,0CAwBxBC,IAAiB,kCAKjBC,IAAsB;AAO5B,MAAMC,IAA+B,gDAC/BC,IAA8B,+CAW9BC,IAAY,8BACZC,IAAoB,sCAUpBC,IAA0BJ,GAC1BK,IAAwB,oCAKxBC,IAAwB,GAKxBC,IAA6B,+CAC7BC,IAAgC,uDAKhCC,IAAuBP,GACvBQ,IAA4BX,GAC5BY,IAA6Bb,GAC7Bc,IAA4B5B,GAC5B6B,IAAwB5B,GAExB6B,IAA0B,GAK1BC,IAA2BZ,GAC3Ba,IAA4B,oDAC5BC,IAA4B,oDAK5BC,IAA8B,oDAC9BC,IAAsC,gDAKtCC,IAA8BlC,GAC9BmC,IAA+BlC,GAU/BmC,IAA+B,yCAC/BC,IAAqB,4CACrBC,IAAkC,yDAClCC,IAAkC,0DAClCC,IAAiC,yDACjCC,IAAgC,kDAChCC,IAA8B,qDAC9BC,IAA+BzC,GAC/B0C,IAAiCzC,GACjC0C,IAA8BzC,GAC9B0C,IAAgCzC,GAChC0C,IAAwBzC,GAKxB0C,KAA0B,kDAC1BC,KAA0B,kDAC1BC,KAAoB,2CACpBC,KAAyB,iDACzBC,KAAgC,kDAQhCC,KAAyBtC,GAKzBuC,KAA2B;"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const d=require("react/jsx-runtime"),j=require("react"),y=require("./styles-DcG3aIFx.cjs");function R(s){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(s){for(const o in s)if(o!=="default"){const u=Object.getOwnPropertyDescriptor(s,o);Object.defineProperty(e,o,u.get?u:{enumerable:!0,get:()=>s[o]})}}return e.default=s,Object.freeze(e)}const n=R(j),C=typeof window<"u"&&typeof window.document<"u",w=C?n.useLayoutEffect:n.useEffect,N={position:"absolute",inset:0,width:"100%",height:"100%"},S=n.memo(({id:s,isActive:e,transitionMode:o,children:u})=>{const i=n.useRef(null),r=n.useRef(e);w(()=>{if(o!=="css"||!i.current)return;const a=i.current,c=r.current;r.current=e,c!==e&&(a.style.animation="none",a.offsetHeight,a.style.animation="")},[e,o]);const l=n.useMemo(()=>{const a={...N,pointerEvents:e?"auto":"none",opacity:e?1:0};return o==="css"&&(a.animation=e?y.PIVOT_ANIMATION_ENTER:y.PIVOT_ANIMATION_LEAVE),a},[e,o]),f=d.jsx("div",{ref:i,"data-pivot-content":s,"data-active":e?"true":"false",style:l,children:u});return o==="none"?d.jsx(n.Activity,{mode:e?"visible":"hidden",children:f}):f}),E=n.createContext(null),A=n.memo(()=>{const s=n.useContext(E);if(!s)throw new Error("PivotOutlet must be used within usePivot");const[,e]=n.useReducer(r=>r+1,0);n.useEffect(()=>s.subscribe(e),[s]);const{items:o,activeId:u,transitionMode:i}=s.getState();return d.jsx(d.Fragment,{children:o.map(r=>d.jsx(S,{id:r.id,isActive:r.id===u,transitionMode:i,children:r.content},r.id))})});function _(s){const{items:e,activeId:o,defaultActiveId:u,onActiveChange:i,transitionMode:r="css"}=s,l=o!==void 0,[f,a]=n.useState(()=>{if(u!==void 0)return u;const t=e.find(v=>v.disabled!==!0);if(!t)throw new Error("usePivot: No enabled items provided");return t.id}),c=l?o:f,m=n.useCallback(t=>{const v=e.find(x=>x.id===t);v&&(v.disabled||(l||a(t),i?.(t)))},[e,l,i]),O=n.useCallback(t=>t===c,[c]),P=n.useCallback(t=>({"data-pivot-item":t,"data-active":t===c?"true":"false","aria-selected":t===c,tabIndex:t===c?0:-1,onClick:()=>{m(t)}}),[c,m]),b=n.useMemo(()=>({position:"relative",width:"100%",height:"100%"}),[]),h=n.useRef({items:e,activeId:c,transitionMode:r});h.current={items:e,activeId:c,transitionMode:r};const p=n.useRef(new Set);n.useEffect(()=>{p.current.forEach(t=>t())},[c,r]);const I=n.useMemo(()=>({getState:()=>h.current,subscribe:t=>(p.current.add(t),()=>p.current.delete(t))}),[]),g=n.useMemo(()=>{const t=()=>d.jsx(E.Provider,{value:I,children:d.jsx("div",{style:b,"data-pivot-container":!0,children:d.jsx(A,{})})});return t.displayName="PivotOutlet",t},[I,b]);return{activeId:c,setActiveId:m,isActive:O,getItemProps:P,Outlet:g}}exports.useIsomorphicLayoutEffect=w;exports.usePivot=_;
|
|
2
|
-
//# sourceMappingURL=usePivot-C8q0pMgW.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"usePivot-C8q0pMgW.cjs","sources":["../src/hooks/useIsomorphicLayoutEffect.ts","../src/modules/pivot/PivotContent.tsx","../src/modules/pivot/usePivot.tsx"],"sourcesContent":["/**\n * @file useIsomorphicLayoutEffect - SSR-safe version of useLayoutEffect\n *\n * Uses useLayoutEffect on the client and useEffect on the server to avoid warnings\n * during server-side rendering (e.g., with Next.js)\n */\nimport * as React from \"react\";\n\n/**\n * Check if we're running in a browser environment\n */\nconst isBrowser = typeof window !== \"undefined\" && typeof window.document !== \"undefined\";\n\n/**\n * SSR-safe version of useLayoutEffect\n *\n * - Client: Uses useLayoutEffect for synchronous layout updates\n * - Server: Uses useEffect to avoid SSR warnings\n *\n * @example\n * ```tsx\n * useIsomorphicLayoutEffect(() => {\n * // This runs synchronously after DOM mutations on the client\n * // but safely falls back to useEffect on the server\n * measureElement();\n * }, [deps]);\n * ```\n */\nexport const useIsomorphicLayoutEffect = isBrowser ? React.useLayoutEffect : React.useEffect;\n","/**\n * @file PivotContent component for rendering pivot items with CSS animations.\n *\n * Override via CSS custom properties:\n * - --rpl-pivot-animation-enter: Animation when becoming active\n * - --rpl-pivot-animation-leave: Animation when becoming inactive\n *\n * User defines @keyframes in their CSS and references via these tokens.\n * Example:\n * @keyframes pivotEnter {\n * from { opacity: 0; }\n * to { opacity: 1; }\n * }\n * :root { --rpl-pivot-animation-enter: pivotEnter 150ms ease-out forwards; }\n */\nimport * as React from \"react\";\nimport { PIVOT_ANIMATION_ENTER, PIVOT_ANIMATION_LEAVE } from \"../../constants/styles\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\n\nexport type PivotContentProps = {\n id: string;\n isActive: boolean;\n transitionMode: \"css\" | \"none\";\n children: React.ReactNode;\n};\n\nconst baseStyle: React.CSSProperties = {\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n};\n\n/**\n * Renders pivot content with CSS animation support.\n *\n * When transitionMode=\"css\": Applies enter/leave animations.\n * When transitionMode=\"none\": Uses React.Activity for memory optimization.\n */\nexport const PivotContent: React.FC<PivotContentProps> = React.memo(({ id, isActive, transitionMode, children }) => {\n const ref = React.useRef<HTMLDivElement>(null);\n const prevActiveRef = React.useRef(isActive);\n\n // Restart animation on state change by removing and re-adding animation\n useIsomorphicLayoutEffect(() => {\n if (transitionMode !== \"css\" || !ref.current) {\n return;\n }\n\n const el = ref.current;\n const wasActive = prevActiveRef.current;\n prevActiveRef.current = isActive;\n\n // Only restart if state actually changed\n if (wasActive === isActive) {\n return;\n }\n\n // Force animation restart: remove animation, trigger reflow, re-add\n el.style.animation = \"none\";\n void el.offsetHeight; // Force reflow\n el.style.animation = \"\";\n }, [isActive, transitionMode]);\n\n const style = React.useMemo<React.CSSProperties>(() => {\n const s: React.CSSProperties = {\n ...baseStyle,\n pointerEvents: isActive ? \"auto\" : \"none\",\n opacity: isActive ? 1 : 0,\n };\n\n if (transitionMode === \"css\") {\n s.animation = isActive ? PIVOT_ANIMATION_ENTER : PIVOT_ANIMATION_LEAVE;\n }\n\n return s;\n }, [isActive, transitionMode]);\n\n const content = (\n <div ref={ref} data-pivot-content={id} data-active={isActive ? \"true\" : \"false\"} style={style}>\n {children}\n </div>\n );\n\n if (transitionMode === \"none\") {\n return <React.Activity mode={isActive ? \"visible\" : \"hidden\"}>{content}</React.Activity>;\n }\n\n return content;\n});\n","/**\n * @file Headless hook for managing Pivot (content switching) behavior.\n */\nimport * as React from \"react\";\nimport type { UsePivotOptions, UsePivotResult, PivotItemProps, PivotItem } from \"./types\";\nimport { PivotContent } from \"./PivotContent\";\n\n/**\n * Context for sharing pivot state with Outlet component.\n * Uses a ref-based approach to avoid re-creating the Outlet component.\n */\ntype PivotOutletContextValue = {\n getState: () => {\n items: ReadonlyArray<PivotItem>;\n activeId: string;\n transitionMode: \"css\" | \"none\";\n };\n subscribe: (callback: () => void) => () => void;\n};\n\nconst PivotOutletContext = React.createContext<PivotOutletContextValue | null>(null);\n\n/**\n * Stable Outlet component that subscribes to state changes.\n * This prevents remounting when activeId changes.\n */\nconst PivotOutletInner: React.FC = React.memo(() => {\n const ctx = React.useContext(PivotOutletContext);\n if (!ctx) {\n throw new Error(\"PivotOutlet must be used within usePivot\");\n }\n\n const [, forceUpdate] = React.useReducer((x) => x + 1, 0);\n\n React.useEffect(() => {\n return ctx.subscribe(forceUpdate);\n }, [ctx]);\n\n const { items, activeId, transitionMode } = ctx.getState();\n\n return (\n <>\n {items.map((item) => (\n <PivotContent key={item.id} id={item.id} isActive={item.id === activeId} transitionMode={transitionMode}>\n {item.content}\n </PivotContent>\n ))}\n </>\n );\n});\n\n/**\n * Headless hook for managing content switching within a scope.\n * Provides behavior only - UI is fully customizable.\n *\n * @example\n * ```tsx\n * const { activeId, getItemProps, Outlet } = usePivot({\n * items: [\n * { id: 'home', label: 'Home', content: <HomePage /> },\n * { id: 'settings', label: 'Settings', content: <SettingsPage /> }\n * ],\n * defaultActiveId: 'home'\n * });\n *\n * return (\n * <div>\n * <nav>\n * {items.map((item) => (\n * <button key={item.id} {...getItemProps(item.id)}>{item.label}</button>\n * ))}\n * </nav>\n * <Outlet />\n * </div>\n * );\n * ```\n */\nexport function usePivot<TId extends string = string>(options: UsePivotOptions<TId>): UsePivotResult<TId> {\n const { items, activeId: controlledActiveId, defaultActiveId, onActiveChange, transitionMode = \"css\" } = options;\n\n const isControlled = controlledActiveId !== undefined;\n\n const [uncontrolledActiveId, setUncontrolledActiveId] = React.useState<TId>(() => {\n if (defaultActiveId !== undefined) {\n return defaultActiveId;\n }\n const firstEnabled = items.find((item) => item.disabled !== true);\n if (!firstEnabled) {\n throw new Error(\"usePivot: No enabled items provided\");\n }\n return firstEnabled.id;\n });\n\n const activeId = isControlled ? controlledActiveId : uncontrolledActiveId;\n\n const setActiveId = React.useCallback(\n (id: TId) => {\n const target = items.find((item) => item.id === id);\n if (!target) {\n return;\n }\n if (target.disabled) {\n return;\n }\n if (!isControlled) {\n setUncontrolledActiveId(id);\n }\n onActiveChange?.(id);\n },\n [items, isControlled, onActiveChange],\n );\n\n const isActive = React.useCallback((id: TId): boolean => id === activeId, [activeId]);\n\n const getItemProps = React.useCallback(\n (id: TId): PivotItemProps => ({\n \"data-pivot-item\": id,\n \"data-active\": (id === activeId ? \"true\" : \"false\") as \"true\" | \"false\",\n \"aria-selected\": id === activeId,\n tabIndex: id === activeId ? 0 : -1,\n onClick: () => {\n setActiveId(id);\n },\n }),\n [activeId, setActiveId],\n );\n\n const containerStyle: React.CSSProperties = React.useMemo(\n () => ({\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n }),\n [],\n );\n\n // Store state in a ref for stable getState function\n const stateRef = React.useRef({\n items,\n activeId,\n transitionMode,\n });\n\n // Update ref when state changes\n stateRef.current = {\n items,\n activeId,\n transitionMode,\n };\n\n // Subscribers for state changes\n const subscribersRef = React.useRef(new Set<() => void>());\n\n // Notify subscribers when activeId changes\n React.useEffect(() => {\n subscribersRef.current.forEach((callback) => callback());\n }, [activeId, transitionMode]);\n\n // Stable context value (never changes)\n const contextValue = React.useMemo<PivotOutletContextValue>(\n () => ({\n getState: () => stateRef.current,\n subscribe: (callback) => {\n subscribersRef.current.add(callback);\n return () => subscribersRef.current.delete(callback);\n },\n }),\n [],\n );\n\n // Stable Outlet component (reference never changes)\n const Outlet = React.useMemo(() => {\n const OutletComponent: React.FC = () => (\n <PivotOutletContext.Provider value={contextValue}>\n <div style={containerStyle} data-pivot-container>\n <PivotOutletInner />\n </div>\n </PivotOutletContext.Provider>\n );\n OutletComponent.displayName = \"PivotOutlet\";\n return OutletComponent;\n }, [contextValue, containerStyle]);\n\n return { activeId, setActiveId, isActive, getItemProps, Outlet };\n}\n"],"names":["isBrowser","useIsomorphicLayoutEffect","React","baseStyle","PivotContent","id","isActive","transitionMode","children","ref","prevActiveRef","el","wasActive","style","s","PIVOT_ANIMATION_ENTER","PIVOT_ANIMATION_LEAVE","content","jsx","PivotOutletContext","PivotOutletInner","ctx","forceUpdate","x","items","activeId","Fragment","item","usePivot","options","controlledActiveId","defaultActiveId","onActiveChange","isControlled","uncontrolledActiveId","setUncontrolledActiveId","firstEnabled","setActiveId","target","getItemProps","containerStyle","stateRef","subscribersRef","callback","contextValue","Outlet","OutletComponent"],"mappings":"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"}
|