@liberfi.io/ui-scaffold 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/draggable/states.ts","../src/components/draggable/useDraggableModalDisclosure.ts","../src/components/draggable/useDraggablePanelDisclosure.ts","../src/components/draggable/DraggableModal.tsx","../src/components/draggable/DraggablePanel.tsx","../src/components/draggable/DraggablePanelProvider.tsx","../src/components/draggable/useDraggableDisclosure.ts","../src/version.ts"],"names":["panelStateFamily","atomFamily","id","atomWithStorage","panelWidthFamily","panelMinWidthFamily","panelMaxWidthFamily","modalOpenFamily","modalShouldStartDraggingFamily","modalSizeFamily","modalRestoreSizeFamily","modalPositionFamily","modalRestorePositionFamily","modalMinimizedFamily","modalMinWidthFamily","modalMaxWidthFamily","lastDraggableTypeFamily","panelOrdersAtom","useDraggableModalDisclosure","isOpen","setIsOpen","useAtom","isMinimized","setIsMinimized","restoreSize","useAtomValue","restorePosition","setSize","useSetAtom","setPosition","setShouldStartDragging","setLastDraggableType","onOpen","useCallback","options","shouldStartDragging","position","size","prev","onClose","useMemo","useDraggablePanelDisclosure","panelState","setPanelState","setPanelWidth","setPanelOrders","left","right","MINIMIZED_SIZE","MAXIMIZED_SIZE","MAXIMIZED_POSITION","DraggableModal","memo","title","minWidth","maxWidth","minHeight","maxHeight","leftSidebar","leftSidebarWidth","rightSidebar","rightSidebarWidth","aspectRatio","showHeader","header","headerHeight","children","t","useTranslation","onOpenPanel","setRestoreSize","setRestorePosition","isDragging","setIsDragging","useState","isResizing","setIsResizing","resizeDirection","setResizeDirection","currentEdge","setCurrentEdge","dockAnimationEdge","setDockAnimationEdge","dockToEdge","setDockToEdge","dockToEdgeTimeoutRef","useRef","panelMinWidth","panelMaxWidth","positionRef","useValueRef","setPositionRef","useCallbackRef","sizeRef","setSizeRef","leftSidebarWidthRef","hasLeftSidebarRef","rightSidebarWidthRef","hasRightSidebarRef","aspectRatioRef","headerHeightRef","minWidthRef","maxWidthRef","minHeightRef","maxHeightRef","isDraggingRef","currentEdgeRef","dockToEdgeRef","onCloseRef","onOpenPanelRef","panelMinWidthRef","panelMaxWidthRef","isMaximized","useEffect","bottom","handleMouseMove","e","handleMouseUp","startInteraction","interactionType","direction","startX","startY","startWidth","startHeight","startPosition","cleanup","deltaX","deltaY","newX","newY","leftOffset","minX","rightOffset","maxX","maxY","edge","calculateNewSize","width","height","constraint","newWidth","newHeight","widthBasedHeight","heightBasedWidth","absDeltaX","absDeltaY","avgHeight","newSize","handleMinimize","handleMaximize","handleResize","throttle","jsxs","Fragment","createPortal","jsx","clsx","StyledTooltip","DraggableIcon","Button","RestoreWindowIcon","MinimizeIcon","UnMaximizeIcon","MaximizeIcon","XCloseIcon","DraggablePanel","setWidth","openModal","closePanel","modalMinWidth","modalMaxWidth","widthRef","isResizingRef","setWidthRef","openModalRef","closePanelRef","modalMinWidthRef","modalMaxWidthRef","handleResizeStart","onResize","distance","onResizeEnd","handleDragStart","onDragMove","onDragEnd","handleClose","ResizeHandle","DraggablePanelProvider","contents","className","classNames","panelOrders","store","getDefaultStore","content","leftOpenPanels","a","b","rightOpenPanels","props","useDraggableDisclosure","isModalOpen","onOpenModal","onCloseModal","isPanelOpen","onClosePanel","lastDraggableType","version_default"],"mappings":"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","file":"index.mjs","sourcesContent":["\"use client\";\n\nimport { atomFamily, atomWithStorage } from \"@liberfi.io/ui\";\n\n/** whether the panel is docked or not */\nexport const panelStateFamily = atomFamily((id: string | null) =>\n atomWithStorage<\"none\" | \"left\" | \"right\">(\n `panelState.${id ?? \"default\"}`,\n \"none\",\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\n/** width of the panel */\nexport const panelWidthFamily = atomFamily((id: string | null) =>\n atomWithStorage(`panelWidth.${id ?? \"default\"}`, 596, undefined, {\n getOnInit: true,\n }),\n);\n\nexport const panelMinWidthFamily = atomFamily((id: string | null) =>\n atomWithStorage(`panelMinWidth.${id ?? \"default\"}`, 320, undefined, {\n getOnInit: true,\n }),\n);\n\nexport const panelMaxWidthFamily = atomFamily((id: string | null) =>\n atomWithStorage(`panelMaxWidth.${id ?? \"default\"}`, 440, undefined, {\n getOnInit: true,\n }),\n);\n\n/** whether the modal is open */\nexport const modalOpenFamily = atomFamily((id: string | null) =>\n atomWithStorage(`modalOpen.${id ?? \"default\"}`, false, undefined, {\n getOnInit: true,\n }),\n);\n\n/** whether the modal should start dragging automatically when opened */\nexport const modalShouldStartDraggingFamily = atomFamily((id: string | null) =>\n atomWithStorage(\n `modalShouldStartDragging.${id ?? \"default\"}`,\n false,\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\n/** size of the modal */\nexport const modalSizeFamily = atomFamily((id: string | null) =>\n atomWithStorage<{ width: number; height: number }>(\n `modalSize.${id ?? \"default\"}`,\n { width: 596, height: 312 },\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\n/** restore size of the modal when maximized or minimized */\nexport const modalRestoreSizeFamily = atomFamily((id: string | null) =>\n atomWithStorage<{ width: number; height: number }>(\n `modalRestoreSize.${id ?? \"default\"}`,\n { width: 596, height: 312 },\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\n/** position of the modal */\nexport const modalPositionFamily = atomFamily((id: string | null) =>\n atomWithStorage<{ x: number; y: number }>(\n `modalPosition.${id ?? \"default\"}`,\n {\n x:\n typeof window !== \"undefined\"\n ? Math.max(0, (window.innerWidth - 596) / 2)\n : 0,\n y:\n typeof window !== \"undefined\"\n ? Math.max(0, (window.innerHeight - 312) / 2)\n : 0,\n },\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\n/** restore position of the modal when maximized or minimized */\nexport const modalRestorePositionFamily = atomFamily((id: string | null) =>\n atomWithStorage<{ x: number; y: number }>(\n `modalRestorePosition.${id ?? \"default\"}`,\n {\n x:\n typeof window !== \"undefined\"\n ? Math.max(0, (window.innerWidth - 596) / 2)\n : 0,\n y:\n typeof window !== \"undefined\"\n ? Math.max(0, (window.innerHeight - 312) / 2)\n : 0,\n },\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\nexport const modalMinimizedFamily = atomFamily((id: string | null) =>\n atomWithStorage<boolean>(\n `modalMinimized.${id ?? \"default\"}`,\n false,\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\nexport const modalMinWidthFamily = atomFamily((id: string | null) =>\n atomWithStorage<number>(`modalMinWidth.${id ?? \"default\"}`, 200, undefined, {\n getOnInit: true,\n }),\n);\n\nexport const modalMaxWidthFamily = atomFamily((id: string | null) =>\n atomWithStorage<number>(\n `modalMaxWidth.${id ?? \"default\"}`,\n typeof window !== \"undefined\" ? window.innerWidth - 40 : 0,\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\nexport const lastDraggableTypeFamily = atomFamily((id: string | null) =>\n atomWithStorage<\"left\" | \"right\" | \"modal\">(\n `lastPanelType.${id ?? \"default\"}`,\n \"modal\",\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\nexport const panelOrdersAtom = atomWithStorage<{\n // left panel open timestamps, latest opened on the left\n left: { [id: string]: number };\n // right panel open timestamps, latest opened on the right\n right: { [id: string]: number };\n}>(\n \"panelOrders\",\n {\n left: {},\n right: {},\n },\n undefined,\n {\n getOnInit: true,\n },\n);\n","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport { useAtom, useAtomValue, useSetAtom } from \"@liberfi.io/ui\";\nimport {\n lastDraggableTypeFamily,\n modalMinimizedFamily,\n modalOpenFamily,\n modalPositionFamily,\n modalRestorePositionFamily,\n modalRestoreSizeFamily,\n modalShouldStartDraggingFamily,\n modalSizeFamily,\n} from \"./states\";\n\nexport type OpenDraggableModalOptions = {\n /** should start dragging automatically when the modal is opened */\n shouldStartDragging?: boolean;\n /** adjust position of the modal when it is opened */\n position?: { x?: number; y?: number };\n /** adjust size of the modal when it is opened */\n size?: { width?: number; height?: number };\n};\n\nexport type UseDraggableModalDisclosureReturnType = {\n isOpen: boolean;\n onOpen: (options?: OpenDraggableModalOptions) => void;\n onClose: () => void;\n};\n\nexport function useDraggableModalDisclosure(\n id: string,\n): UseDraggableModalDisclosureReturnType {\n const [isOpen, setIsOpen] = useAtom(modalOpenFamily(id));\n const [isMinimized, setIsMinimized] = useAtom(modalMinimizedFamily(id));\n const restoreSize = useAtomValue(modalRestoreSizeFamily(id));\n const restorePosition = useAtomValue(modalRestorePositionFamily(id));\n const setSize = useSetAtom(modalSizeFamily(id));\n const setPosition = useSetAtom(modalPositionFamily(id));\n const setShouldStartDragging = useSetAtom(modalShouldStartDraggingFamily(id));\n const setLastDraggableType = useSetAtom(lastDraggableTypeFamily(id));\n\n const onOpen = useCallback(\n (options: OpenDraggableModalOptions = {}) => {\n const { shouldStartDragging, position, size } = options;\n if (position) setPosition((prev) => ({ ...prev, ...position }));\n if (size) setSize((prev) => ({ ...prev, ...size }));\n setShouldStartDragging(shouldStartDragging ?? false);\n setIsOpen(true);\n setLastDraggableType(\"modal\");\n },\n [setIsOpen, setPosition, setSize, setShouldStartDragging],\n );\n\n const onClose = useCallback(() => {\n setIsOpen(false);\n // restore the modal if it is minimized when closing\n if (isMinimized) {\n setSize({ ...restoreSize });\n setPosition({ ...restorePosition });\n setIsMinimized(false);\n }\n }, [\n isMinimized,\n restoreSize,\n restorePosition,\n setIsMinimized,\n setIsOpen,\n setSize,\n setPosition,\n ]);\n\n return useMemo(\n () => ({\n isOpen,\n onOpen,\n onClose,\n }),\n [isOpen, onOpen, onClose],\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport { useAtom, useSetAtom } from \"@liberfi.io/ui\";\nimport {\n lastDraggableTypeFamily,\n panelOrdersAtom,\n panelStateFamily,\n panelWidthFamily,\n} from \"./states\";\n\nexport type OpenDraggablePanelOptions = {\n /** which side the panel is docked on */\n position?: \"left\" | \"right\";\n /** adjust size of the modal when it is opened */\n width?: number;\n};\n\nexport type UseDraggablePanelDisclosureReturnType = {\n isOpen: boolean;\n position?: \"left\" | \"right\";\n onOpen: (options?: OpenDraggablePanelOptions) => void;\n onClose: () => void;\n};\n\nexport function useDraggablePanelDisclosure(\n id: string,\n): UseDraggablePanelDisclosureReturnType {\n const [panelState, setPanelState] = useAtom(panelStateFamily(id));\n const setPanelWidth = useSetAtom(panelWidthFamily(id));\n const setLastDraggableType = useSetAtom(lastDraggableTypeFamily(id));\n const setPanelOrders = useSetAtom(panelOrdersAtom);\n\n const onOpen = useCallback(\n (options: OpenDraggablePanelOptions = {}) => {\n const position = options.position ?? \"left\";\n setPanelWidth(options.width ?? 320);\n setPanelState(position);\n setLastDraggableType(position);\n setPanelOrders(({ left, right }) => {\n if (position === \"left\") {\n return { left: { ...left, [id]: Date.now() }, right };\n } else {\n return { left, right: { ...right, [id]: Date.now() } };\n }\n });\n },\n [id, setPanelState, setPanelWidth],\n );\n\n const onClose = useCallback(() => {\n setPanelState(\"none\");\n }, [setPanelState]);\n\n const isOpen = useMemo(() => panelState !== \"none\", [panelState]);\n\n const position = useMemo(\n () => (panelState !== \"none\" ? panelState : undefined),\n [panelState],\n );\n\n return useMemo(\n () => ({\n isOpen,\n position,\n onOpen,\n onClose,\n }),\n [isOpen, onOpen, onClose],\n );\n}\n","\"use client\";\n\nimport {\n memo,\n useState,\n useEffect,\n useRef,\n PropsWithChildren,\n useMemo,\n useCallback,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useCallbackRef, useValueRef } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n clsx,\n DraggableIcon,\n MaximizeIcon,\n MinimizeIcon,\n RestoreWindowIcon,\n StyledTooltip,\n UnMaximizeIcon,\n useAtom,\n useAtomValue,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\nimport { throttle } from \"@liberfi.io/utils\";\nimport {\n modalMinimizedFamily,\n modalPositionFamily,\n modalRestorePositionFamily,\n modalRestoreSizeFamily,\n modalShouldStartDraggingFamily,\n modalSizeFamily,\n panelMaxWidthFamily,\n panelMinWidthFamily,\n} from \"./states\";\nimport { useDraggableModalDisclosure } from \"./useDraggableModalDisclosure\";\nimport { useDraggablePanelDisclosure } from \"./useDraggablePanelDisclosure\";\n\nconst MINIMIZED_SIZE = {\n width: 200,\n height: 48,\n};\n\nconst MAXIMIZED_SIZE = {\n width: typeof window !== \"undefined\" ? window.innerWidth - 40 : 0,\n height: typeof window !== \"undefined\" ? window.innerHeight - 40 : 0,\n};\n\nconst MAXIMIZED_POSITION = {\n x: 20,\n y: 20,\n};\n\ntype ResizeDirection =\n | \"topLeft\"\n | \"topRight\"\n | \"bottomLeft\"\n | \"bottomRight\"\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\";\n\nexport type DraggableModalProps = PropsWithChildren<{\n /** unique identifier for the modal, must be the same with the panel */\n id: string;\n /** title of the modal */\n title?: React.ReactNode;\n /** constraints for the minimum width */\n minWidth?: number;\n /** constraints for the maximum width */\n maxWidth?: number;\n /** constraints for the minimum height */\n minHeight?: number;\n /** constraints for the maximum height */\n maxHeight?: number;\n /** left sidebar of the modal */\n leftSidebar?: React.ReactNode;\n /** width of the left sidebar */\n leftSidebarWidth?: number;\n /** right sidebar of the modal */\n rightSidebar?: React.ReactNode;\n /** width of the right sidebar */\n rightSidebarWidth?: number;\n /** constraints for the aspect ratio when resizing */\n aspectRatio?: number;\n /** whether to show the header */\n showHeader?: boolean;\n /** custom header content */\n header?: React.ReactNode;\n /** height of the modal header */\n headerHeight?: number;\n}>;\n\nexport const DraggableModal = memo(function DraggablePopup({\n id,\n title,\n minWidth = 504,\n maxWidth = MAXIMIZED_SIZE.width,\n minHeight = 200,\n maxHeight = MAXIMIZED_SIZE.height,\n leftSidebar,\n leftSidebarWidth = 200,\n rightSidebar,\n rightSidebarWidth = 200,\n aspectRatio,\n showHeader = true,\n header,\n headerHeight = 44,\n children,\n}: DraggableModalProps) {\n const { t } = useTranslation();\n\n // control the open state of the modal\n const { isOpen, onClose } = useDraggableModalDisclosure(id);\n\n // control the open state of the panel\n const { onOpen: onOpenPanel } = useDraggablePanelDisclosure(id);\n\n // whether the modal is minimized\n const [isMinimized, setIsMinimized] = useAtom(modalMinimizedFamily(id));\n\n // latest position\n const [position, setPosition] = useAtom(modalPositionFamily(id));\n\n // latest modal size\n const [size, setSize] = useAtom(modalSizeFamily(id));\n\n // restore size when maximized or minimized\n const [restoreSize, setRestoreSize] = useAtom(modalRestoreSizeFamily(id));\n\n // restore position when maximized or minimized\n const [restorePosition, setRestorePosition] = useAtom(\n modalRestorePositionFamily(id),\n );\n\n // start dragging automatically when the component is mounted\n const [shouldStartDragging, setShouldStartDragging] = useAtom(\n modalShouldStartDraggingFamily(id),\n );\n\n // whether the modal is being dragged\n const [isDragging, setIsDragging] = useState(shouldStartDragging);\n\n // whether the modal is being resized\n const [isResizing, setIsResizing] = useState(false);\n\n // direction of the resize\n const [resizeDirection, setResizeDirection] =\n useState<ResizeDirection | null>(null);\n\n // which edge is the modal near\n const [currentEdge, setCurrentEdge] = useState<\"left\" | \"right\" | null>(null);\n\n // which edge to display docking animation\n const [dockAnimationEdge, setDockAnimationEdge] = useState<\n \"left\" | \"right\" | null\n >(null);\n\n // which edge is waiting for the timeout to dock on\n const [dockToEdge, setDockToEdge] = useState<\"left\" | \"right\" | null>(null);\n\n // timeout for docking to the edge\n const dockToEdgeTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const panelMinWidth = useAtomValue(panelMinWidthFamily(id));\n\n const panelMaxWidth = useAtomValue(panelMaxWidthFamily(id));\n\n // refs for props & states to avoid re-rendering\n const positionRef = useValueRef(position);\n const setPositionRef = useCallbackRef(setPosition);\n const sizeRef = useValueRef(size);\n const setSizeRef = useCallbackRef(setSize);\n const leftSidebarWidthRef = useValueRef(leftSidebarWidth);\n const hasLeftSidebarRef = useValueRef(!!leftSidebar);\n const rightSidebarWidthRef = useValueRef(rightSidebarWidth);\n const hasRightSidebarRef = useValueRef(!!rightSidebar);\n const aspectRatioRef = useValueRef(aspectRatio);\n const headerHeightRef = useValueRef(headerHeight);\n const minWidthRef = useValueRef(minWidth);\n const maxWidthRef = useValueRef(maxWidth);\n const minHeightRef = useValueRef(minHeight);\n const maxHeightRef = useValueRef(maxHeight);\n const isDraggingRef = useValueRef(isDragging);\n const currentEdgeRef = useValueRef(currentEdge);\n const dockToEdgeRef = useValueRef(dockToEdge);\n const onCloseRef = useCallbackRef(onClose);\n const onOpenPanelRef = useCallbackRef(onOpenPanel);\n const panelMinWidthRef = useValueRef(panelMinWidth);\n const panelMaxWidthRef = useValueRef(panelMaxWidth);\n\n // whether the modal is maximized\n const isMaximized = useMemo(\n () =>\n size.width === MAXIMIZED_SIZE.width &&\n size.height === MAXIMIZED_SIZE.height,\n [size.width, size.height],\n );\n\n // adjust position to the boundary when the component is mounted\n useEffect(() => {\n if (position.x < 0 || position.y < 0) {\n setPositionRef({\n x: Math.max(0, position.x),\n y: Math.max(0, position.y),\n });\n }\n const right = position.x + size.width;\n const bottom = position.y + size.height;\n if (right > window.innerWidth || bottom > window.innerHeight) {\n setPositionRef({\n x: Math.min(position.x, Math.max(0, window.innerWidth - size.width)),\n y: Math.min(position.y, Math.max(0, window.innerHeight - size.height)),\n });\n }\n }, [id]);\n\n // start dragging automatically when the component is mounted, just follow the mouse movement\n useEffect(() => {\n if (isOpen && shouldStartDragging) {\n setIsDragging(true);\n\n const handleMouseMove = (e: MouseEvent) => {\n setPositionRef({\n x: e.clientX - size.width / 2,\n y: e.clientY - 20,\n });\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n // finish start dragging\n setShouldStartDragging(false);\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n document.body.style.cursor = \"grabbing\";\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.body.style.cursor = \"\";\n };\n }\n }, [isOpen, shouldStartDragging, setShouldStartDragging, size.width]);\n\n const startInteraction = (\n e: React.MouseEvent,\n interactionType: \"drag\" | \"resize\",\n direction?: ResizeDirection,\n ) => {\n // user interaction starts, stop auto-dragging which is triggered when the component is mounted\n setShouldStartDragging(false);\n\n // reset states\n setIsDragging(false);\n setIsResizing(false);\n setResizeDirection(null);\n\n // set states according to interaction type\n if (interactionType === \"drag\") {\n setIsDragging(true);\n } else if (interactionType === \"resize\") {\n setResizeDirection(direction || null);\n setIsResizing(true);\n }\n\n // save start position and size in closure\n const startX = e.clientX;\n const startY = e.clientY;\n const startWidth = sizeRef.current.width;\n const startHeight = sizeRef.current.height;\n const startPosition = { ...positionRef.current };\n\n const cleanup = () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.body.style.cursor = \"\";\n\n setIsDragging(false);\n setIsResizing(false);\n setResizeDirection(null);\n setCurrentEdge(null);\n\n if (dockToEdgeTimeoutRef.current) {\n clearTimeout(dockToEdgeTimeoutRef.current);\n dockToEdgeTimeoutRef.current = null;\n }\n setDockToEdge(null);\n setDockAnimationEdge(null);\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (interactionType === \"drag\") {\n const deltaX = e.clientX - startX;\n const deltaY = e.clientY - startY;\n let newX = startPosition.x + deltaX;\n let newY = startPosition.y + deltaY;\n\n // calculate boundaries\n const leftOffset = hasLeftSidebarRef.current\n ? leftSidebarWidthRef.current\n : 0;\n const minX = 12 + leftOffset;\n\n const rightOffset = hasRightSidebarRef.current\n ? rightSidebarWidthRef.current\n : 0;\n const maxX = window.innerWidth - 12 - startWidth - rightOffset;\n\n // display 44px for header\n const maxY = window.innerHeight - 12 - 44;\n\n // check if near the edge\n const edge = newX <= minX ? \"left\" : newX >= maxX ? \"right\" : null;\n if (edge !== currentEdgeRef.current) {\n setCurrentEdge(edge);\n }\n\n // if is waiting for the timeout to dock on the edge, display the animation\n if (dockToEdgeTimeoutRef.current && edge) {\n setDockAnimationEdge(edge);\n }\n\n // interrupt the timeout if the modal is moved away from the edge\n if (dockToEdgeTimeoutRef.current) {\n if (\n (dockToEdgeRef.current === \"left\" &&\n (newX > minX || edge !== \"left\")) ||\n (dockToEdgeRef.current === \"right\" &&\n (newX < maxX || edge !== \"right\"))\n ) {\n clearTimeout(dockToEdgeTimeoutRef.current);\n dockToEdgeTimeoutRef.current = null;\n setDockToEdge(null);\n setDockAnimationEdge(null);\n }\n }\n\n // wait for the timeout to dock on the edge\n if (!dockToEdgeTimeoutRef.current && edge) {\n if (dockToEdgeRef.current !== edge) {\n setDockToEdge(edge);\n setDockAnimationEdge(edge);\n dockToEdgeTimeoutRef.current = setTimeout(() => {\n if (isDraggingRef.current && currentEdgeRef.current === edge) {\n // still dragging & near the edge, convert to panel\n cleanup();\n // close modal\n onCloseRef();\n // open panel\n onOpenPanelRef({\n position: edge,\n width: Math.min(\n Math.max(sizeRef.current.width, panelMinWidthRef.current),\n panelMaxWidthRef.current,\n ),\n });\n } else {\n setDockToEdge(null);\n }\n }, 350);\n }\n }\n\n // limit within the boundaries\n newX = Math.min(Math.max(newX, 12 + leftOffset), maxX);\n newY = Math.min(Math.max(newY, 12), maxY);\n setPositionRef({ x: newX, y: newY });\n } else if (interactionType === \"resize\" && direction) {\n const deltaX = e.clientX - startX;\n const deltaY = e.clientY - startY;\n\n // calculate new size (considering aspect ratio)\n const calculateNewSize = (\n width: number,\n height: number,\n constraint: \"width\" | \"height\" | \"both\",\n ) => {\n let newWidth = Math.min(\n Math.max(width, minWidthRef.current),\n maxWidthRef.current,\n );\n let newHeight = Math.min(\n Math.max(height, minHeightRef.current),\n maxHeightRef.current,\n );\n\n if (aspectRatioRef.current) {\n if (constraint === \"width\") {\n newHeight = Math.min(\n Math.max(\n width / aspectRatioRef.current + headerHeightRef.current,\n minHeightRef.current,\n ),\n maxHeightRef.current,\n );\n newWidth =\n (newHeight - headerHeightRef.current) * aspectRatioRef.current;\n } else if (constraint === \"height\") {\n newWidth = Math.min(\n Math.max(\n (height - headerHeightRef.current) * aspectRatioRef.current,\n minWidthRef.current,\n ),\n maxWidthRef.current,\n );\n newHeight =\n newWidth / aspectRatioRef.current + headerHeightRef.current;\n } else {\n const widthBasedHeight =\n width / aspectRatioRef.current + headerHeightRef.current;\n const heightBasedWidth =\n (height - headerHeightRef.current) * aspectRatioRef.current;\n const absDeltaX = Math.abs(deltaX);\n const absDeltaY = Math.abs(deltaY);\n\n if (absDeltaX > 1.1 * absDeltaY) {\n newHeight = Math.min(\n Math.max(widthBasedHeight, minHeightRef.current),\n maxHeightRef.current,\n );\n newWidth =\n (newHeight - headerHeightRef.current) *\n aspectRatioRef.current;\n } else if (absDeltaY > 1.1 * absDeltaX) {\n newWidth = Math.min(\n Math.max(heightBasedWidth, minWidthRef.current),\n maxWidthRef.current,\n );\n newHeight =\n newWidth / aspectRatioRef.current + headerHeightRef.current;\n } else {\n const avgHeight = (newHeight + widthBasedHeight) / 2;\n newWidth = Math.min(\n Math.max(\n (newWidth + heightBasedWidth) / 2,\n minWidthRef.current,\n ),\n maxWidthRef.current,\n );\n newHeight = Math.min(\n Math.max(avgHeight, minHeightRef.current),\n maxHeightRef.current,\n );\n newWidth =\n (newHeight - headerHeightRef.current) *\n aspectRatioRef.current;\n }\n }\n\n newWidth = Math.min(\n Math.max(newWidth, minWidthRef.current),\n maxWidthRef.current,\n );\n newHeight = Math.min(\n Math.max(newHeight, minHeightRef.current),\n maxHeightRef.current,\n );\n }\n\n return { width: newWidth, height: newHeight };\n };\n\n // handle the resize direction\n switch (direction) {\n case \"topLeft\": {\n const newSize = calculateNewSize(\n startWidth - deltaX,\n startHeight - deltaY,\n \"both\",\n );\n setSizeRef(newSize);\n setPositionRef({\n x: startPosition.x + (startWidth - newSize.width),\n y: startPosition.y + (startHeight - newSize.height),\n });\n break;\n }\n case \"topRight\": {\n const newSize = calculateNewSize(\n startWidth + deltaX,\n startHeight - deltaY,\n \"both\",\n );\n setSizeRef(newSize);\n setPositionRef({\n x: startPosition.x,\n y: startPosition.y + (startHeight - newSize.height),\n });\n break;\n }\n case \"bottomLeft\": {\n const newSize = calculateNewSize(\n startWidth - deltaX,\n startHeight + deltaY,\n \"both\",\n );\n setSizeRef(newSize);\n setPositionRef({\n x: startPosition.x + (startWidth - newSize.width),\n y: startPosition.y,\n });\n break;\n }\n case \"bottomRight\": {\n setSizeRef(\n calculateNewSize(\n startWidth + deltaX,\n startHeight + deltaY,\n \"both\",\n ),\n );\n break;\n }\n case \"top\": {\n const newSize = calculateNewSize(\n startWidth,\n startHeight - deltaY,\n \"height\",\n );\n setSizeRef(newSize);\n setPositionRef({\n x: startPosition.x,\n y: startPosition.y + (startHeight - newSize.height),\n });\n break;\n }\n case \"bottom\": {\n setSizeRef(\n calculateNewSize(startWidth, startHeight + deltaY, \"height\"),\n );\n break;\n }\n case \"left\": {\n const newSize = calculateNewSize(\n startWidth - deltaX,\n startHeight,\n \"width\",\n );\n setSizeRef(newSize);\n setPositionRef({\n x: startPosition.x + (startWidth - newSize.width),\n y: startPosition.y,\n });\n break;\n }\n case \"right\": {\n setSizeRef(\n calculateNewSize(startWidth + deltaX, startHeight, \"width\"),\n );\n break;\n }\n }\n }\n };\n\n const handleMouseUp = () => {\n // limit the position within the boundaries\n if (position.x < 0 || position.y < 0) {\n setPositionRef({\n x: Math.max(0, position.x),\n y: Math.max(0, position.y),\n });\n }\n cleanup();\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n };\n\n const handleMinimize = useCallback(() => {\n if (isMinimized) {\n // already minimized, restore to the previous size and position\n setSizeRef({ ...restoreSize });\n setPositionRef({ ...restorePosition });\n setIsMinimized(false);\n } else {\n // minimize\n if (isMaximized) {\n // if minimized from maximized directly, use the size and position which is stored before maximized\n setPositionRef({ ...restorePosition });\n } else {\n // otherwise store the current size and position\n setRestoreSize({ ...size });\n setRestorePosition({ ...position });\n }\n setSizeRef({ ...MINIMIZED_SIZE });\n setIsMinimized(true);\n }\n }, [\n isMinimized,\n isMaximized,\n size,\n position,\n restoreSize,\n restorePosition,\n setIsMinimized,\n setRestoreSize,\n setRestorePosition,\n ]);\n\n const handleMaximize = useCallback(() => {\n if (isMaximized) {\n // already maximized, restore to the previous size and position\n setSizeRef({ ...restoreSize });\n setPositionRef({ ...restorePosition });\n } else {\n // maximize\n if (isMinimized) {\n // if maximized from minimized directly, use the stored size and position before minimized\n setIsMinimized(false);\n } else {\n // otherwise store the current size and position\n setRestoreSize({ ...size });\n setRestorePosition({ ...position });\n }\n setSizeRef({ ...MAXIMIZED_SIZE });\n setPositionRef({ ...MAXIMIZED_POSITION });\n }\n }, [\n isMaximized,\n isMinimized,\n size,\n position,\n restoreSize,\n restorePosition,\n setIsMinimized,\n setRestoreSize,\n setRestorePosition,\n ]);\n\n // adjust position to the boundary when the window is resized\n useEffect(() => {\n const handleResize = throttle(() => {\n if (positionRef.current.x < 0 || positionRef.current.y < 0) {\n setPositionRef({\n x: Math.max(0, positionRef.current.x),\n y: Math.max(0, positionRef.current.y),\n });\n }\n const right = positionRef.current.x + sizeRef.current.width;\n const bottom = positionRef.current.y + sizeRef.current.height;\n if (right > window.innerWidth || bottom > window.innerHeight) {\n setPositionRef({\n x: Math.min(\n positionRef.current.x,\n Math.max(0, window.innerWidth - sizeRef.current.width),\n ),\n y: Math.min(\n positionRef.current.y,\n Math.max(0, window.innerHeight - sizeRef.current.height),\n ),\n });\n }\n }, 100);\n\n window.addEventListener(\"resize\", handleResize);\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n };\n }, []);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <>\n {/* Overlay when dragging or resizing */}\n {(isDragging || isResizing) &&\n createPortal(\n <div\n className={clsx(\n \"max-lg:hidden fixed inset-0 z-9999 bg-transparent w-full h-full select-none\",\n isDragging && (dockToEdge ? \"cursor-grabbing\" : \"cursor-move\"),\n !isDragging && {\n \"cursor-ns-resize\":\n resizeDirection === \"top\" || resizeDirection === \"bottom\",\n \"cursor-ew-resize\":\n resizeDirection === \"left\" || resizeDirection === \"right\",\n \"cursor-nwse-resize\":\n resizeDirection === \"topLeft\" ||\n resizeDirection === \"bottomRight\",\n \"cursor-nesw-resize\":\n resizeDirection === \"topRight\" ||\n resizeDirection === \"bottomLeft\",\n \"cursor-auto\": resizeDirection === null,\n },\n )}\n />,\n document.body,\n )}\n\n {/* Modal container */}\n <div\n className={clsx(\n \"max-lg:hidden fixed z-50 left-0 top-0\",\n isDragging ? \"will-change-transform\" : \"will-change-auto\",\n isResizing || isDragging\n ? \"transition-none\"\n : \"transition-transform duration-250 ease-[cubic-bezier(0.16,1,0.3,1)]\",\n )}\n style={{\n transform: `translate(${Math.round(position.x - (leftSidebar ? leftSidebarWidth : 0))}px, ${Math.round(position.y)}px)`,\n }}\n >\n <div className=\"flex relative z-50\">\n {leftSidebar && (\n <div\n className={clsx(\n \"relative mt-1 z-10 transition-all duration-250 ease-[cubic-bezier(0.16,1,0.3,1)]\",\n isDragging\n ? \"opacity-40 translate-x-4\"\n : \"opacity-100 translate-x-0\",\n )}\n style={{\n width: leftSidebarWidth,\n height: isMinimized ? 40 : size.height - 8,\n }}\n >\n {leftSidebar}\n </div>\n )}\n\n {/* modal content */}\n <div\n className={clsx(\n \"z-50 relative bg-content2 border border-border rounded-lg overflow-hidden\",\n isDragging\n ? \"opacity-80 shadow-md scale-102 blur-[0.5px]\"\n : \"opacity-100 shadow-lg scale-100 blur-none\",\n )}\n style={{\n width: size.width,\n height: size.height,\n transition:\n isResizing || isDragging\n ? \"none\"\n : \"transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.2s cubic-bezier(0.33, 1, 0.68, 1), height 0.25s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.2s cubic-bezier(0.33, 1, 0.68, 1)\",\n contain: \"content\",\n }}\n >\n <div\n className={clsx(\n \"w-full h-full\",\n dockAnimationEdge && \"animate-modal-shrink\",\n dockAnimationEdge === \"left\" ? \"origin-left\" : \"origin-right\",\n )}\n style={{ contain: \"paint\" }}\n >\n {/* resize handles */}\n {!isMinimized && (\n <>\n <div\n className=\"absolute top-0 left-0 w-3 h-3 cursor-nw-resize z-20\"\n onMouseDown={(e) =>\n startInteraction(e, \"resize\", \"topLeft\")\n }\n />\n <div\n className=\"absolute top-0 right-0 w-3 h-3 cursor-ne-resize z-20\"\n onMouseDown={(e) =>\n startInteraction(e, \"resize\", \"topRight\")\n }\n />\n <div\n className=\"absolute bottom-0 left-0 w-3 h-3 cursor-sw-resize z-20\"\n onMouseDown={(e) =>\n startInteraction(e, \"resize\", \"bottomLeft\")\n }\n />\n <div\n className=\"absolute bottom-0 right-0 w-3 h-3 cursor-se-resize z-20\"\n onMouseDown={(e) =>\n startInteraction(e, \"resize\", \"bottomRight\")\n }\n />\n <div\n className=\"absolute top-0 left-3 right-3 h-1.5 cursor-n-resize z-20\"\n onMouseDown={(e) => startInteraction(e, \"resize\", \"top\")}\n />\n <div\n className=\"absolute bottom-0 left-3 right-3 h-1.5 cursor-s-resize z-20\"\n onMouseDown={(e) => startInteraction(e, \"resize\", \"bottom\")}\n />\n <div\n className=\"absolute left-0 top-3 bottom-3 w-1.5 cursor-w-resize z-20\"\n onMouseDown={(e) => startInteraction(e, \"resize\", \"left\")}\n />\n <div\n className=\"absolute right-0 top-3 bottom-3 w-1.5 cursor-e-resize z-20\"\n onMouseDown={(e) => startInteraction(e, \"resize\", \"right\")}\n />\n </>\n )}\n\n {/* header */}\n {showHeader && (\n <div\n className=\"relative border-b border-border/80 px-3 gap-4 flex items-center justify-between cursor-move select-none\"\n onMouseDown={(e) => startInteraction(e, \"drag\")}\n style={{ height: headerHeight }}\n >\n {/* drag tooltip */}\n <StyledTooltip\n placement=\"top\"\n closeDelay={0}\n content={t(\"scaffold.draggableModal.snapToEdge\")}\n >\n <DraggableIcon className=\"text-neutral absolute left-1/2 -translate-x-1/2 top-0\" />\n </StyledTooltip>\n\n {header || (\n <>\n <div\n className=\"min-w-0 flex-initial text-sm font-medium truncate cursor-auto\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n {title}\n </div>\n <div\n className=\"flex-none flex items-center justify-end gap-1\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n {/* minimize button */}\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n isIconOnly\n onPress={handleMinimize}\n >\n {isMinimized ? (\n <RestoreWindowIcon\n width={18}\n height={18}\n className=\"text-neutral\"\n />\n ) : (\n <MinimizeIcon\n width={18}\n height={18}\n className=\"text-neutral\"\n />\n )}\n </Button>\n {/* maximize button */}\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n isIconOnly\n onPress={handleMaximize}\n >\n {isMaximized ? (\n <UnMaximizeIcon\n width={18}\n height={18}\n className=\"text-neutral\"\n />\n ) : (\n <MaximizeIcon\n width={18}\n height={18}\n className=\"text-neutral\"\n />\n )}\n </Button>\n {/* close button */}\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n isIconOnly\n onPress={onClose}\n >\n <XCloseIcon\n width={18}\n height={18}\n className=\"text-neutral\"\n />\n </Button>\n </div>\n </>\n )}\n </div>\n )}\n\n {/* content */}\n {!isMinimized && (\n <div\n className={\n showHeader\n ? \"h-[calc(100%-44px)] overflow-hidden\"\n : \"h-full overflow-hidden cursor-move\"\n }\n onMouseDown={\n showHeader ? undefined : (e) => startInteraction(e, \"drag\")\n }\n >\n {children}\n </div>\n )}\n </div>\n </div>\n\n {rightSidebar && (\n <div\n className={clsx(\n \"relative mt-1 z-10 transition-all duration-250 ease-[cubic-bezier(0.16,1,0.3,1)]\",\n isDragging\n ? \"opacity-40 -translate-x-4\"\n : \"opacity-100 translate-x-0\",\n )}\n style={{\n width: rightSidebarWidth,\n height: isMinimized ? 40 : size.height - 8,\n }}\n >\n {rightSidebar}\n </div>\n )}\n </div>\n </div>\n </>\n );\n});\n","\"use client\";\n\nimport { useState, PropsWithChildren } from \"react\";\nimport { useCallbackRef, useValueRef } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n clsx,\n DraggableIcon,\n StyledTooltip,\n useAtom,\n useAtomValue,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\nimport {\n modalMaxWidthFamily,\n modalMinWidthFamily,\n panelStateFamily,\n panelWidthFamily,\n} from \"./states\";\nimport { useDraggableModalDisclosure } from \"./useDraggableModalDisclosure\";\nimport { useDraggablePanelDisclosure } from \"./useDraggablePanelDisclosure\";\n\nexport type DraggablePanelProps = PropsWithChildren<{\n /** unique id for the panel, must be the same with the modal */\n id: string;\n /** title of the modal */\n title?: React.ReactNode;\n /** maximum width of the panel */\n maxWidth?: number;\n /** minimum width of the panel */\n minWidth?: number;\n /** which side the panel is docked on */\n position: \"left\" | \"right\";\n /** whether to show the header */\n showHeader?: boolean;\n /** custom header content */\n header?: React.ReactNode;\n /** height of the modal header */\n headerHeight?: number;\n}>;\n\nexport function DraggablePanel({\n id,\n title,\n maxWidth = 440,\n minWidth = 320,\n position,\n showHeader = true,\n header,\n headerHeight = 44,\n children,\n}: DraggablePanelProps) {\n const { t } = useTranslation();\n\n // whether the panel is docked or not\n const panelState = useAtomValue(panelStateFamily(id));\n\n // whether the panel is being resized or not\n const [isResizing, setIsResizing] = useState(false);\n\n // whether the panel is being dragged or not\n const [isDragging, setIsDragging] = useState(false);\n\n // panel width\n const [width, setWidth] = useAtom(panelWidthFamily(id));\n\n // converting to modal\n const { onOpen: openModal } = useDraggableModalDisclosure(id);\n\n // control the close state of the panel\n const { onClose: closePanel } = useDraggablePanelDisclosure(id);\n\n const modalMinWidth = useAtomValue(modalMinWidthFamily(id));\n\n const modalMaxWidth = useAtomValue(modalMaxWidthFamily(id));\n\n // refs for props & states to avoid re-rendering\n const widthRef = useValueRef(width);\n const maxWidthRef = useValueRef(maxWidth);\n const minWidthRef = useValueRef(minWidth);\n const positionRef = useValueRef(position);\n const isResizingRef = useValueRef(isResizing);\n const isDraggingRef = useValueRef(isDragging);\n const setWidthRef = useCallbackRef(setWidth);\n const openModalRef = useCallbackRef(openModal);\n const closePanelRef = useCallbackRef(closePanel);\n const modalMinWidthRef = useValueRef(modalMinWidth);\n const modalMaxWidthRef = useValueRef(modalMaxWidth);\n\n const handleResizeStart = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizing(true);\n document.body.style.cursor = \"ew-resize\";\n document.body.style.userSelect = \"none\";\n document.body.style.overflow = \"hidden\";\n document.body.style.position = \"fixed\";\n document.body.style.width = \"100%\";\n document.body.style.height = \"100%\";\n\n // save start size & position in closure\n const startX = e.clientX;\n const startWidth = widthRef.current;\n\n const onResize = (e: MouseEvent) => {\n if (!isResizingRef.current) return;\n\n const deltaX = e.clientX - startX;\n\n const distance =\n positionRef.current === \"right\"\n ? startWidth - deltaX\n : startWidth + deltaX;\n\n const width = Math.min(\n Math.max(distance, minWidthRef.current),\n maxWidthRef.current,\n );\n setWidthRef(width);\n };\n\n const onResizeEnd = () => {\n setIsResizing(false);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n document.body.style.overflow = \"\";\n document.body.style.position = \"\";\n document.body.style.width = \"\";\n document.body.style.height = \"\";\n document.removeEventListener(\"mousemove\", onResize);\n document.removeEventListener(\"mouseup\", onResizeEnd);\n };\n\n document.addEventListener(\"mousemove\", onResize);\n document.addEventListener(\"mouseup\", onResizeEnd);\n };\n\n const handleDragStart = (e: React.MouseEvent) => {\n // if the target is a button, don't trigger drag\n if (e.target instanceof HTMLElement && e.target.closest(\"button\")) {\n return;\n }\n e.preventDefault();\n\n setIsDragging(true);\n\n // save start position in closure\n const startX = e.clientX;\n const startY = e.clientY;\n\n const cleanup = () => {\n document.removeEventListener(\"mousemove\", onDragMove);\n document.removeEventListener(\"mouseup\", onDragEnd);\n setIsDragging(false);\n };\n\n const onDragMove = (e: MouseEvent) => {\n if (!isDraggingRef.current) return;\n\n const deltaX = Math.abs(e.clientX - startX);\n const deltaY = Math.abs(e.clientY - startY);\n\n // if the drag distance is greater than 10px, convert to modal\n if (deltaX > 10 || deltaY > 10) {\n cleanup();\n // close the panel\n closePanelRef();\n // open the modal\n openModalRef({\n // modal should follow the cursor\n shouldStartDragging: true,\n position: {\n x: e.clientX - widthRef.current / 2 + 20,\n y: e.clientY - 20,\n },\n // adjust modal's width to the panel's width\n size: {\n width: Math.min(\n Math.max(widthRef.current, modalMinWidthRef.current),\n modalMaxWidthRef.current,\n ),\n },\n });\n }\n };\n\n const onDragEnd = () => {\n cleanup();\n };\n\n document.addEventListener(\"mousemove\", onDragMove);\n document.addEventListener(\"mouseup\", onDragEnd);\n };\n\n const handleClose = () => {\n closePanelRef();\n };\n\n if (panelState !== position) {\n return null;\n }\n\n return (\n <div className=\"max-lg:hidden flex-none flex flex-row overflow-hidden\">\n {/* when the panel is on the right, show the resize handle on the left */}\n {position === \"right\" && (\n <ResizeHandle\n isResizing={isResizing}\n handleResizeStart={handleResizeStart}\n />\n )}\n\n {/* panel content container */}\n <div\n className={clsx(\n \"flex flex-col min-h-0 overflow-hidden bg-content2\",\n isDragging\n ? \"opacity-80 scale-98 blur-[1px]\"\n : \"opacity-100 scale-100 blur-none\",\n )}\n style={{\n width: `${width}px`,\n transition:\n isResizing || isDragging\n ? \"none\"\n : \"transform 0.4s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.2s cubic-bezier(0.33, 1, 0.68, 1), height 0.4s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.2s cubic-bezier(0.33, 1, 0.68, 1)\",\n contain: \"content\",\n }}\n >\n {/* header */}\n {showHeader && (\n <div\n className=\"flex-none relative border-b border-border/80 px-3 gap-4 flex items-center justify-between cursor-move select-none\"\n onMouseDown={handleDragStart}\n style={{ height: headerHeight }}\n >\n {/* drag tooltip */}\n <StyledTooltip\n placement=\"top\"\n closeDelay={0}\n content={t(\"scaffold.draggablePanel.snapToModal\")}\n >\n <DraggableIcon className=\"text-neutral absolute left-1/2 -translate-x-1/2 top-0\" />\n </StyledTooltip>\n\n {header || (\n <>\n <div\n className=\"min-w-0 flex-initial text-sm font-medium truncate cursor-auto\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n {title}\n </div>\n <div\n className=\"flex-none flex items-center justify-end gap-1\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n {/* close button */}\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n isIconOnly\n onPress={handleClose}\n >\n <XCloseIcon\n width={18}\n height={18}\n className=\"text-neutral\"\n />\n </Button>\n </div>\n </>\n )}\n </div>\n )}\n\n <div className=\"flex-auto min-h-0\">{children}</div>\n </div>\n\n {/* when the panel is on the left, show the resize handle on the right */}\n {position === \"left\" && (\n <ResizeHandle\n isResizing={isResizing}\n handleResizeStart={handleResizeStart}\n />\n )}\n </div>\n );\n}\n\ntype ResizeHandleProps = {\n isResizing: boolean;\n handleResizeStart: (e: React.MouseEvent) => void;\n};\n\nfunction ResizeHandle({ isResizing, handleResizeStart }: ResizeHandleProps) {\n return (\n <div className=\"relative\">\n <div className=\"relative w-1 h-full cursor-ew-resize bg-content3/80 hover:bg-content3 transition-colors duration-150 ease-in-out group flex flex-col items-center justify-center gap-1\">\n <i className=\"rounded-full w-0.5 h-0.5 bg-neutral\" />\n <i className=\"rounded-full w-0.5 h-0.5 bg-neutral\" />\n <i className=\"rounded-full w-0.5 h-0.5 bg-neutral\" />\n\n {/* expend click area */}\n <div\n className=\"absolute inset-0 -left-1.5 -right-1.5 cursor-ew-resize\"\n onMouseDown={handleResizeStart}\n />\n </div>\n\n {isResizing && <div className=\"fixed inset-0 z-50 cursor-ew-resize\" />}\n </div>\n );\n}\n","\"use client\";\n\nimport { PropsWithChildren, useEffect, useMemo } from \"react\";\nimport { clsx, getDefaultStore, useAtomValue } from \"@liberfi.io/ui\";\nimport { DraggableModal } from \"./DraggableModal\";\nimport { DraggablePanel } from \"./DraggablePanel\";\nimport {\n modalMaxWidthFamily,\n modalMinWidthFamily,\n panelMaxWidthFamily,\n panelMinWidthFamily,\n panelOrdersAtom,\n panelStateFamily,\n} from \"./states\";\n\nexport type DraggableContentProps = PropsWithChildren<{\n /** unique identifier for both the modal & panel */\n id: string;\n /** title of both the modal & panel */\n title?: React.ReactNode;\n /** whether to show the header for both the modal & panel */\n showHeader?: boolean;\n /** custom header content for both the modal & panel */\n header?: React.ReactNode;\n /** height of the modal header for both the modal & panel */\n headerHeight?: number;\n /** constraints for the minimum width of the modal */\n modalMinWidth?: number;\n /** constraints for the maximum width of the modal */\n modalMaxWidth?: number;\n /** constraints for the minimum width of the panel */\n panelMinWidth?: number;\n /** constraints for the maximum width of the panel */\n panelMaxWidth?: number;\n /** constraints for the minimum height of the modal */\n minHeight?: number;\n /** constraints for the maximum height of the modal */\n maxHeight?: number;\n /** left sidebar of the modal */\n leftSidebar?: React.ReactNode;\n /** width of the left sidebar */\n leftSidebarWidth?: number;\n /** right sidebar of the modal */\n rightSidebar?: React.ReactNode;\n /** width of the right sidebar */\n rightSidebarWidth?: number;\n /** constraints for the aspect ratio when resizing modal */\n aspectRatio?: number;\n}>;\n\nexport type DraggablePanelProviderProps = PropsWithChildren<{\n /** draggable contents */\n contents?: Array<DraggableContentProps>;\n /** root container class name */\n className?: string;\n /** class names slots*/\n classNames?: {\n root?: string;\n left?: string;\n right?: string;\n content?: string;\n };\n}>;\n\nexport function DraggablePanelProvider({\n contents = [],\n className,\n classNames,\n children,\n}: DraggablePanelProviderProps) {\n const panelOrders = useAtomValue(panelOrdersAtom);\n\n // sync panel & order widths\n useEffect(() => {\n const store = getDefaultStore();\n contents.forEach((content) => {\n store.set(panelMinWidthFamily(content.id), content.panelMinWidth ?? 320);\n store.set(panelMaxWidthFamily(content.id), content.panelMaxWidth ?? 440);\n store.set(modalMinWidthFamily(content.id), content.modalMinWidth ?? 504);\n store.set(\n modalMaxWidthFamily(content.id),\n content.modalMaxWidth ?? window.innerWidth - 40,\n );\n });\n }, [contents]);\n\n // latest opened on the left\n const leftOpenPanels = useMemo(\n () =>\n contents\n .filter((content) => {\n const store = getDefaultStore();\n // hasn't been opened on the left\n if (!panelOrders.left[content.id]) return false;\n // whether the panel is opened on the left\n return store.get(panelStateFamily(content.id)) === \"left\";\n })\n .sort((a, b) => panelOrders.left[b.id] - panelOrders.left[a.id]),\n [contents, panelOrders.left],\n );\n\n // latest opened on the right\n const rightOpenPanels = useMemo(\n () =>\n contents\n .filter((content) => {\n const store = getDefaultStore();\n // hasn't been opened on the right\n if (!panelOrders.right[content.id]) return false;\n // whether the panel is opened on the right\n return store.get(panelStateFamily(content.id)) === \"right\";\n })\n .sort(\n (a, b) =>\n (panelOrders.right[a.id] ?? 0) - (panelOrders.right[b.id] ?? 0),\n ),\n [contents, panelOrders.right],\n );\n\n return (\n <>\n <div\n className={clsx(\n \"w-full h-full flex flex-row overflow-hidden\",\n className,\n classNames?.root,\n )}\n >\n {/* left panels */}\n <div\n className={clsx(\"flex-none h-full flex flex-row\", classNames?.left)}\n >\n {leftOpenPanels.map((props) => (\n <DraggablePanel\n key={`left-${props.id}`}\n {...props}\n position=\"left\"\n minWidth={props.panelMinWidth ?? 320}\n maxWidth={props.panelMaxWidth ?? 440}\n />\n ))}\n </div>\n {/* main content */}\n <div className={clsx(\"flex-auto min-w-0 h-full\", classNames?.content)}>\n {children}\n </div>\n {/* right panels */}\n <div\n className={clsx(\"flex-none h-full flex flex-row\", classNames?.right)}\n >\n {rightOpenPanels.map((props) => (\n <DraggablePanel\n key={`right-${props.id}`}\n {...props}\n position=\"right\"\n minWidth={props.panelMinWidth ?? 320}\n maxWidth={props.panelMaxWidth ?? 440}\n />\n ))}\n </div>\n </div>\n {/* modals */}\n {contents.map((props) => (\n <DraggableModal\n key={`modal-${props.id}`}\n {...props}\n minWidth={props.modalMinWidth ?? 504}\n maxWidth={props.modalMaxWidth ?? window.innerWidth - 40}\n />\n ))}\n </>\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport { useAtomValue } from \"@liberfi.io/ui\";\nimport { lastDraggableTypeFamily } from \"./states\";\nimport { useDraggableModalDisclosure } from \"./useDraggableModalDisclosure\";\nimport { useDraggablePanelDisclosure } from \"./useDraggablePanelDisclosure\";\n\nexport type UseDraggableDisclosureReturnType = {\n isOpen: boolean;\n onOpen: () => void;\n onClose: () => void;\n};\n\nexport function useDraggableDisclosure(\n id: string,\n): UseDraggableDisclosureReturnType {\n const {\n isOpen: isModalOpen,\n onOpen: onOpenModal,\n onClose: onCloseModal,\n } = useDraggableModalDisclosure(id);\n\n const {\n isOpen: isPanelOpen,\n onOpen: onOpenPanel,\n onClose: onClosePanel,\n } = useDraggablePanelDisclosure(id);\n\n const lastDraggableType = useAtomValue(lastDraggableTypeFamily(id));\n\n const onOpen = useCallback(() => {\n if (isModalOpen || isPanelOpen) return;\n if (lastDraggableType === \"modal\") {\n onOpenModal();\n } else {\n onOpenPanel({ position: lastDraggableType });\n }\n }, [isModalOpen, isPanelOpen, lastDraggableType, onOpenModal, onOpenPanel]);\n\n const onClose = useCallback(() => {\n if (isModalOpen) {\n onCloseModal();\n } else if (isPanelOpen) {\n onClosePanel();\n }\n }, [isModalOpen, isPanelOpen, onCloseModal, onClosePanel]);\n\n const isOpen = useMemo(\n () => isModalOpen || isPanelOpen,\n [isModalOpen, isPanelOpen],\n );\n\n return useMemo(\n () => ({\n isOpen,\n onOpen,\n onClose,\n }),\n [isOpen, onOpen, onClose],\n );\n}\n","declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-scaffold\"] = \"0.1.0\";\n}\n\nexport default \"0.1.0\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/draggable/states.ts","../src/components/draggable/useDraggableModalDisclosure.ts","../src/components/draggable/useDraggablePanelDisclosure.ts","../src/components/draggable/DraggableModal.tsx","../src/components/draggable/DraggablePanel.tsx","../src/components/draggable/DraggablePanelProvider.tsx","../src/components/draggable/useDraggableDisclosure.ts","../src/version.ts"],"names":["panelStateFamily","atomFamily","id","atomWithStorage","panelWidthFamily","panelMinWidthFamily","panelMaxWidthFamily","modalOpenFamily","modalShouldStartDraggingFamily","modalSizeFamily","modalRestoreSizeFamily","modalPositionFamily","modalRestorePositionFamily","modalMinimizedFamily","modalMinWidthFamily","modalMaxWidthFamily","lastDraggableTypeFamily","panelOrdersAtom","useDraggableModalDisclosure","isOpen","setIsOpen","useAtom","isMinimized","setIsMinimized","restoreSize","useAtomValue","restorePosition","setSize","useSetAtom","setPosition","setShouldStartDragging","setLastDraggableType","onOpen","useCallback","options","shouldStartDragging","position","size","prev","onClose","useMemo","useDraggablePanelDisclosure","panelState","setPanelState","setPanelWidth","setPanelOrders","left","right","MINIMIZED_SIZE","MAXIMIZED_SIZE","MAXIMIZED_POSITION","DraggableModal","memo","title","minWidth","maxWidth","minHeight","maxHeight","leftSidebar","leftSidebarWidth","rightSidebar","rightSidebarWidth","aspectRatio","showHeader","header","headerHeight","children","t","useTranslation","onOpenPanel","setRestoreSize","setRestorePosition","isDragging","setIsDragging","useState","isResizing","setIsResizing","resizeDirection","setResizeDirection","currentEdge","setCurrentEdge","dockAnimationEdge","setDockAnimationEdge","dockToEdge","setDockToEdge","dockToEdgeTimeoutRef","useRef","panelMinWidth","panelMaxWidth","positionRef","useValueRef","setPositionRef","useCallbackRef","sizeRef","setSizeRef","leftSidebarWidthRef","hasLeftSidebarRef","rightSidebarWidthRef","hasRightSidebarRef","aspectRatioRef","headerHeightRef","minWidthRef","maxWidthRef","minHeightRef","maxHeightRef","isDraggingRef","currentEdgeRef","dockToEdgeRef","onCloseRef","onOpenPanelRef","panelMinWidthRef","panelMaxWidthRef","isMaximized","useEffect","bottom","handleMouseMove","e","handleMouseUp","startInteraction","interactionType","direction","startX","startY","startWidth","startHeight","startPosition","cleanup","deltaX","deltaY","newX","newY","leftOffset","minX","rightOffset","maxX","maxY","edge","calculateNewSize","width","height","constraint","newWidth","newHeight","widthBasedHeight","heightBasedWidth","absDeltaX","absDeltaY","avgHeight","newSize","handleMinimize","handleMaximize","handleResize","throttle","jsxs","Fragment","createPortal","jsx","clsx","StyledTooltip","DraggableIcon","Button","RestoreWindowIcon","MinimizeIcon","UnMaximizeIcon","MaximizeIcon","XCloseIcon","DraggablePanel","setWidth","openModal","closePanel","modalMinWidth","modalMaxWidth","widthRef","isResizingRef","setWidthRef","openModalRef","closePanelRef","modalMinWidthRef","modalMaxWidthRef","handleResizeStart","onResize","distance","onResizeEnd","handleDragStart","onDragMove","onDragEnd","handleClose","ResizeHandle","DraggablePanelProvider","contents","className","classNames","panelOrders","store","getDefaultStore","content","leftOpenPanels","a","b","rightOpenPanels","props","useDraggableDisclosure","isModalOpen","onOpenModal","onCloseModal","isPanelOpen","onClosePanel","lastDraggableType","version_default"],"mappings":"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","file":"index.mjs","sourcesContent":["\"use client\";\n\nimport { atomFamily, atomWithStorage } from \"@liberfi.io/ui\";\n\n/** whether the panel is docked or not */\nexport const panelStateFamily = atomFamily((id: string | null) =>\n atomWithStorage<\"none\" | \"left\" | \"right\">(\n `panelState.${id ?? \"default\"}`,\n \"none\",\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\n/** width of the panel */\nexport const panelWidthFamily = atomFamily((id: string | null) =>\n atomWithStorage(`panelWidth.${id ?? \"default\"}`, 596, undefined, {\n getOnInit: true,\n }),\n);\n\nexport const panelMinWidthFamily = atomFamily((id: string | null) =>\n atomWithStorage(`panelMinWidth.${id ?? \"default\"}`, 320, undefined, {\n getOnInit: true,\n }),\n);\n\nexport const panelMaxWidthFamily = atomFamily((id: string | null) =>\n atomWithStorage(`panelMaxWidth.${id ?? \"default\"}`, 440, undefined, {\n getOnInit: true,\n }),\n);\n\n/** whether the modal is open */\nexport const modalOpenFamily = atomFamily((id: string | null) =>\n atomWithStorage(`modalOpen.${id ?? \"default\"}`, false, undefined, {\n getOnInit: true,\n }),\n);\n\n/** whether the modal should start dragging automatically when opened */\nexport const modalShouldStartDraggingFamily = atomFamily((id: string | null) =>\n atomWithStorage(\n `modalShouldStartDragging.${id ?? \"default\"}`,\n false,\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\n/** size of the modal */\nexport const modalSizeFamily = atomFamily((id: string | null) =>\n atomWithStorage<{ width: number; height: number }>(\n `modalSize.${id ?? \"default\"}`,\n { width: 596, height: 312 },\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\n/** restore size of the modal when maximized or minimized */\nexport const modalRestoreSizeFamily = atomFamily((id: string | null) =>\n atomWithStorage<{ width: number; height: number }>(\n `modalRestoreSize.${id ?? \"default\"}`,\n { width: 596, height: 312 },\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\n/** position of the modal */\nexport const modalPositionFamily = atomFamily((id: string | null) =>\n atomWithStorage<{ x: number; y: number }>(\n `modalPosition.${id ?? \"default\"}`,\n {\n x:\n typeof window !== \"undefined\"\n ? Math.max(0, (window.innerWidth - 596) / 2)\n : 0,\n y:\n typeof window !== \"undefined\"\n ? Math.max(0, (window.innerHeight - 312) / 2)\n : 0,\n },\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\n/** restore position of the modal when maximized or minimized */\nexport const modalRestorePositionFamily = atomFamily((id: string | null) =>\n atomWithStorage<{ x: number; y: number }>(\n `modalRestorePosition.${id ?? \"default\"}`,\n {\n x:\n typeof window !== \"undefined\"\n ? Math.max(0, (window.innerWidth - 596) / 2)\n : 0,\n y:\n typeof window !== \"undefined\"\n ? Math.max(0, (window.innerHeight - 312) / 2)\n : 0,\n },\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\nexport const modalMinimizedFamily = atomFamily((id: string | null) =>\n atomWithStorage<boolean>(\n `modalMinimized.${id ?? \"default\"}`,\n false,\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\nexport const modalMinWidthFamily = atomFamily((id: string | null) =>\n atomWithStorage<number>(`modalMinWidth.${id ?? \"default\"}`, 200, undefined, {\n getOnInit: true,\n }),\n);\n\nexport const modalMaxWidthFamily = atomFamily((id: string | null) =>\n atomWithStorage<number>(\n `modalMaxWidth.${id ?? \"default\"}`,\n typeof window !== \"undefined\" ? window.innerWidth - 40 : 0,\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\nexport const lastDraggableTypeFamily = atomFamily((id: string | null) =>\n atomWithStorage<\"left\" | \"right\" | \"modal\">(\n `lastPanelType.${id ?? \"default\"}`,\n \"modal\",\n undefined,\n {\n getOnInit: true,\n },\n ),\n);\n\nexport const panelOrdersAtom = atomWithStorage<{\n // left panel open timestamps, latest opened on the left\n left: { [id: string]: number };\n // right panel open timestamps, latest opened on the right\n right: { [id: string]: number };\n}>(\n \"panelOrders\",\n {\n left: {},\n right: {},\n },\n undefined,\n {\n getOnInit: true,\n },\n);\n","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport { useAtom, useAtomValue, useSetAtom } from \"@liberfi.io/ui\";\nimport {\n lastDraggableTypeFamily,\n modalMinimizedFamily,\n modalOpenFamily,\n modalPositionFamily,\n modalRestorePositionFamily,\n modalRestoreSizeFamily,\n modalShouldStartDraggingFamily,\n modalSizeFamily,\n} from \"./states\";\n\nexport type OpenDraggableModalOptions = {\n /** should start dragging automatically when the modal is opened */\n shouldStartDragging?: boolean;\n /** adjust position of the modal when it is opened */\n position?: { x?: number; y?: number };\n /** adjust size of the modal when it is opened */\n size?: { width?: number; height?: number };\n};\n\nexport type UseDraggableModalDisclosureReturnType = {\n isOpen: boolean;\n onOpen: (options?: OpenDraggableModalOptions) => void;\n onClose: () => void;\n};\n\nexport function useDraggableModalDisclosure(\n id: string,\n): UseDraggableModalDisclosureReturnType {\n const [isOpen, setIsOpen] = useAtom(modalOpenFamily(id));\n const [isMinimized, setIsMinimized] = useAtom(modalMinimizedFamily(id));\n const restoreSize = useAtomValue(modalRestoreSizeFamily(id));\n const restorePosition = useAtomValue(modalRestorePositionFamily(id));\n const setSize = useSetAtom(modalSizeFamily(id));\n const setPosition = useSetAtom(modalPositionFamily(id));\n const setShouldStartDragging = useSetAtom(modalShouldStartDraggingFamily(id));\n const setLastDraggableType = useSetAtom(lastDraggableTypeFamily(id));\n\n const onOpen = useCallback(\n (options: OpenDraggableModalOptions = {}) => {\n const { shouldStartDragging, position, size } = options;\n if (position) setPosition((prev) => ({ ...prev, ...position }));\n if (size) setSize((prev) => ({ ...prev, ...size }));\n setShouldStartDragging(shouldStartDragging ?? false);\n setIsOpen(true);\n setLastDraggableType(\"modal\");\n },\n [setIsOpen, setPosition, setSize, setShouldStartDragging],\n );\n\n const onClose = useCallback(() => {\n setIsOpen(false);\n // restore the modal if it is minimized when closing\n if (isMinimized) {\n setSize({ ...restoreSize });\n setPosition({ ...restorePosition });\n setIsMinimized(false);\n }\n }, [\n isMinimized,\n restoreSize,\n restorePosition,\n setIsMinimized,\n setIsOpen,\n setSize,\n setPosition,\n ]);\n\n return useMemo(\n () => ({\n isOpen,\n onOpen,\n onClose,\n }),\n [isOpen, onOpen, onClose],\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport { useAtom, useSetAtom } from \"@liberfi.io/ui\";\nimport {\n lastDraggableTypeFamily,\n panelOrdersAtom,\n panelStateFamily,\n panelWidthFamily,\n} from \"./states\";\n\nexport type OpenDraggablePanelOptions = {\n /** which side the panel is docked on */\n position?: \"left\" | \"right\";\n /** adjust size of the modal when it is opened */\n width?: number;\n};\n\nexport type UseDraggablePanelDisclosureReturnType = {\n isOpen: boolean;\n position?: \"left\" | \"right\";\n onOpen: (options?: OpenDraggablePanelOptions) => void;\n onClose: () => void;\n};\n\nexport function useDraggablePanelDisclosure(\n id: string,\n): UseDraggablePanelDisclosureReturnType {\n const [panelState, setPanelState] = useAtom(panelStateFamily(id));\n const setPanelWidth = useSetAtom(panelWidthFamily(id));\n const setLastDraggableType = useSetAtom(lastDraggableTypeFamily(id));\n const setPanelOrders = useSetAtom(panelOrdersAtom);\n\n const onOpen = useCallback(\n (options: OpenDraggablePanelOptions = {}) => {\n const position = options.position ?? \"left\";\n setPanelWidth(options.width ?? 320);\n setPanelState(position);\n setLastDraggableType(position);\n setPanelOrders(({ left, right }) => {\n if (position === \"left\") {\n return { left: { ...left, [id]: Date.now() }, right };\n } else {\n return { left, right: { ...right, [id]: Date.now() } };\n }\n });\n },\n [id, setPanelState, setPanelWidth],\n );\n\n const onClose = useCallback(() => {\n setPanelState(\"none\");\n }, [setPanelState]);\n\n const isOpen = useMemo(() => panelState !== \"none\", [panelState]);\n\n const position = useMemo(\n () => (panelState !== \"none\" ? panelState : undefined),\n [panelState],\n );\n\n return useMemo(\n () => ({\n isOpen,\n position,\n onOpen,\n onClose,\n }),\n [isOpen, onOpen, onClose],\n );\n}\n","\"use client\";\n\nimport {\n memo,\n useState,\n useEffect,\n useRef,\n PropsWithChildren,\n useMemo,\n useCallback,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useCallbackRef, useValueRef } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n clsx,\n DraggableIcon,\n MaximizeIcon,\n MinimizeIcon,\n RestoreWindowIcon,\n StyledTooltip,\n UnMaximizeIcon,\n useAtom,\n useAtomValue,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\nimport { throttle } from \"@liberfi.io/utils\";\nimport {\n modalMinimizedFamily,\n modalPositionFamily,\n modalRestorePositionFamily,\n modalRestoreSizeFamily,\n modalShouldStartDraggingFamily,\n modalSizeFamily,\n panelMaxWidthFamily,\n panelMinWidthFamily,\n} from \"./states\";\nimport { useDraggableModalDisclosure } from \"./useDraggableModalDisclosure\";\nimport { useDraggablePanelDisclosure } from \"./useDraggablePanelDisclosure\";\n\nconst MINIMIZED_SIZE = {\n width: 200,\n height: 48,\n};\n\nconst MAXIMIZED_SIZE = {\n width: typeof window !== \"undefined\" ? window.innerWidth - 40 : 0,\n height: typeof window !== \"undefined\" ? window.innerHeight - 40 : 0,\n};\n\nconst MAXIMIZED_POSITION = {\n x: 20,\n y: 20,\n};\n\ntype ResizeDirection =\n | \"topLeft\"\n | \"topRight\"\n | \"bottomLeft\"\n | \"bottomRight\"\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\";\n\nexport type DraggableModalProps = PropsWithChildren<{\n /** unique identifier for the modal, must be the same with the panel */\n id: string;\n /** title of the modal */\n title?: React.ReactNode;\n /** constraints for the minimum width */\n minWidth?: number;\n /** constraints for the maximum width */\n maxWidth?: number;\n /** constraints for the minimum height */\n minHeight?: number;\n /** constraints for the maximum height */\n maxHeight?: number;\n /** left sidebar of the modal */\n leftSidebar?: React.ReactNode;\n /** width of the left sidebar */\n leftSidebarWidth?: number;\n /** right sidebar of the modal */\n rightSidebar?: React.ReactNode;\n /** width of the right sidebar */\n rightSidebarWidth?: number;\n /** constraints for the aspect ratio when resizing */\n aspectRatio?: number;\n /** whether to show the header */\n showHeader?: boolean;\n /** custom header content */\n header?: React.ReactNode;\n /** height of the modal header */\n headerHeight?: number;\n}>;\n\nexport const DraggableModal = memo(function DraggablePopup({\n id,\n title,\n minWidth = 504,\n maxWidth = MAXIMIZED_SIZE.width,\n minHeight = 200,\n maxHeight = MAXIMIZED_SIZE.height,\n leftSidebar,\n leftSidebarWidth = 200,\n rightSidebar,\n rightSidebarWidth = 200,\n aspectRatio,\n showHeader = true,\n header,\n headerHeight = 44,\n children,\n}: DraggableModalProps) {\n const { t } = useTranslation();\n\n // control the open state of the modal\n const { isOpen, onClose } = useDraggableModalDisclosure(id);\n\n // control the open state of the panel\n const { onOpen: onOpenPanel } = useDraggablePanelDisclosure(id);\n\n // whether the modal is minimized\n const [isMinimized, setIsMinimized] = useAtom(modalMinimizedFamily(id));\n\n // latest position\n const [position, setPosition] = useAtom(modalPositionFamily(id));\n\n // latest modal size\n const [size, setSize] = useAtom(modalSizeFamily(id));\n\n // restore size when maximized or minimized\n const [restoreSize, setRestoreSize] = useAtom(modalRestoreSizeFamily(id));\n\n // restore position when maximized or minimized\n const [restorePosition, setRestorePosition] = useAtom(\n modalRestorePositionFamily(id),\n );\n\n // start dragging automatically when the component is mounted\n const [shouldStartDragging, setShouldStartDragging] = useAtom(\n modalShouldStartDraggingFamily(id),\n );\n\n // whether the modal is being dragged\n const [isDragging, setIsDragging] = useState(shouldStartDragging);\n\n // whether the modal is being resized\n const [isResizing, setIsResizing] = useState(false);\n\n // direction of the resize\n const [resizeDirection, setResizeDirection] =\n useState<ResizeDirection | null>(null);\n\n // which edge is the modal near\n const [currentEdge, setCurrentEdge] = useState<\"left\" | \"right\" | null>(null);\n\n // which edge to display docking animation\n const [dockAnimationEdge, setDockAnimationEdge] = useState<\n \"left\" | \"right\" | null\n >(null);\n\n // which edge is waiting for the timeout to dock on\n const [dockToEdge, setDockToEdge] = useState<\"left\" | \"right\" | null>(null);\n\n // timeout for docking to the edge\n const dockToEdgeTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const panelMinWidth = useAtomValue(panelMinWidthFamily(id));\n\n const panelMaxWidth = useAtomValue(panelMaxWidthFamily(id));\n\n // refs for props & states to avoid re-rendering\n const positionRef = useValueRef(position);\n const setPositionRef = useCallbackRef(setPosition);\n const sizeRef = useValueRef(size);\n const setSizeRef = useCallbackRef(setSize);\n const leftSidebarWidthRef = useValueRef(leftSidebarWidth);\n const hasLeftSidebarRef = useValueRef(!!leftSidebar);\n const rightSidebarWidthRef = useValueRef(rightSidebarWidth);\n const hasRightSidebarRef = useValueRef(!!rightSidebar);\n const aspectRatioRef = useValueRef(aspectRatio);\n const headerHeightRef = useValueRef(headerHeight);\n const minWidthRef = useValueRef(minWidth);\n const maxWidthRef = useValueRef(maxWidth);\n const minHeightRef = useValueRef(minHeight);\n const maxHeightRef = useValueRef(maxHeight);\n const isDraggingRef = useValueRef(isDragging);\n const currentEdgeRef = useValueRef(currentEdge);\n const dockToEdgeRef = useValueRef(dockToEdge);\n const onCloseRef = useCallbackRef(onClose);\n const onOpenPanelRef = useCallbackRef(onOpenPanel);\n const panelMinWidthRef = useValueRef(panelMinWidth);\n const panelMaxWidthRef = useValueRef(panelMaxWidth);\n\n // whether the modal is maximized\n const isMaximized = useMemo(\n () =>\n size.width === MAXIMIZED_SIZE.width &&\n size.height === MAXIMIZED_SIZE.height,\n [size.width, size.height],\n );\n\n // adjust position to the boundary when the component is mounted\n useEffect(() => {\n if (position.x < 0 || position.y < 0) {\n setPositionRef({\n x: Math.max(0, position.x),\n y: Math.max(0, position.y),\n });\n }\n const right = position.x + size.width;\n const bottom = position.y + size.height;\n if (right > window.innerWidth || bottom > window.innerHeight) {\n setPositionRef({\n x: Math.min(position.x, Math.max(0, window.innerWidth - size.width)),\n y: Math.min(position.y, Math.max(0, window.innerHeight - size.height)),\n });\n }\n }, [id]);\n\n // start dragging automatically when the component is mounted, just follow the mouse movement\n useEffect(() => {\n if (isOpen && shouldStartDragging) {\n setIsDragging(true);\n\n const handleMouseMove = (e: MouseEvent) => {\n setPositionRef({\n x: e.clientX - size.width / 2,\n y: e.clientY - 20,\n });\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n // finish start dragging\n setShouldStartDragging(false);\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n document.body.style.cursor = \"grabbing\";\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.body.style.cursor = \"\";\n };\n }\n }, [isOpen, shouldStartDragging, setShouldStartDragging, size.width]);\n\n const startInteraction = (\n e: React.MouseEvent,\n interactionType: \"drag\" | \"resize\",\n direction?: ResizeDirection,\n ) => {\n // user interaction starts, stop auto-dragging which is triggered when the component is mounted\n setShouldStartDragging(false);\n\n // reset states\n setIsDragging(false);\n setIsResizing(false);\n setResizeDirection(null);\n\n // set states according to interaction type\n if (interactionType === \"drag\") {\n setIsDragging(true);\n } else if (interactionType === \"resize\") {\n setResizeDirection(direction || null);\n setIsResizing(true);\n }\n\n // save start position and size in closure\n const startX = e.clientX;\n const startY = e.clientY;\n const startWidth = sizeRef.current.width;\n const startHeight = sizeRef.current.height;\n const startPosition = { ...positionRef.current };\n\n const cleanup = () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.body.style.cursor = \"\";\n\n setIsDragging(false);\n setIsResizing(false);\n setResizeDirection(null);\n setCurrentEdge(null);\n\n if (dockToEdgeTimeoutRef.current) {\n clearTimeout(dockToEdgeTimeoutRef.current);\n dockToEdgeTimeoutRef.current = null;\n }\n setDockToEdge(null);\n setDockAnimationEdge(null);\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (interactionType === \"drag\") {\n const deltaX = e.clientX - startX;\n const deltaY = e.clientY - startY;\n let newX = startPosition.x + deltaX;\n let newY = startPosition.y + deltaY;\n\n // calculate boundaries\n const leftOffset = hasLeftSidebarRef.current\n ? leftSidebarWidthRef.current\n : 0;\n const minX = 12 + leftOffset;\n\n const rightOffset = hasRightSidebarRef.current\n ? rightSidebarWidthRef.current\n : 0;\n const maxX = window.innerWidth - 12 - startWidth - rightOffset;\n\n // display 44px for header\n const maxY = window.innerHeight - 12 - 44;\n\n // check if near the edge\n const edge = newX <= minX ? \"left\" : newX >= maxX ? \"right\" : null;\n if (edge !== currentEdgeRef.current) {\n setCurrentEdge(edge);\n }\n\n // if is waiting for the timeout to dock on the edge, display the animation\n if (dockToEdgeTimeoutRef.current && edge) {\n setDockAnimationEdge(edge);\n }\n\n // interrupt the timeout if the modal is moved away from the edge\n if (dockToEdgeTimeoutRef.current) {\n if (\n (dockToEdgeRef.current === \"left\" &&\n (newX > minX || edge !== \"left\")) ||\n (dockToEdgeRef.current === \"right\" &&\n (newX < maxX || edge !== \"right\"))\n ) {\n clearTimeout(dockToEdgeTimeoutRef.current);\n dockToEdgeTimeoutRef.current = null;\n setDockToEdge(null);\n setDockAnimationEdge(null);\n }\n }\n\n // wait for the timeout to dock on the edge\n if (!dockToEdgeTimeoutRef.current && edge) {\n if (dockToEdgeRef.current !== edge) {\n setDockToEdge(edge);\n setDockAnimationEdge(edge);\n dockToEdgeTimeoutRef.current = setTimeout(() => {\n if (isDraggingRef.current && currentEdgeRef.current === edge) {\n // still dragging & near the edge, convert to panel\n cleanup();\n // close modal\n onCloseRef();\n // open panel\n onOpenPanelRef({\n position: edge,\n width: Math.min(\n Math.max(sizeRef.current.width, panelMinWidthRef.current),\n panelMaxWidthRef.current,\n ),\n });\n } else {\n setDockToEdge(null);\n }\n }, 350);\n }\n }\n\n // limit within the boundaries\n newX = Math.min(Math.max(newX, 12 + leftOffset), maxX);\n newY = Math.min(Math.max(newY, 12), maxY);\n setPositionRef({ x: newX, y: newY });\n } else if (interactionType === \"resize\" && direction) {\n const deltaX = e.clientX - startX;\n const deltaY = e.clientY - startY;\n\n // calculate new size (considering aspect ratio)\n const calculateNewSize = (\n width: number,\n height: number,\n constraint: \"width\" | \"height\" | \"both\",\n ) => {\n let newWidth = Math.min(\n Math.max(width, minWidthRef.current),\n maxWidthRef.current,\n );\n let newHeight = Math.min(\n Math.max(height, minHeightRef.current),\n maxHeightRef.current,\n );\n\n if (aspectRatioRef.current) {\n if (constraint === \"width\") {\n newHeight = Math.min(\n Math.max(\n width / aspectRatioRef.current + headerHeightRef.current,\n minHeightRef.current,\n ),\n maxHeightRef.current,\n );\n newWidth =\n (newHeight - headerHeightRef.current) * aspectRatioRef.current;\n } else if (constraint === \"height\") {\n newWidth = Math.min(\n Math.max(\n (height - headerHeightRef.current) * aspectRatioRef.current,\n minWidthRef.current,\n ),\n maxWidthRef.current,\n );\n newHeight =\n newWidth / aspectRatioRef.current + headerHeightRef.current;\n } else {\n const widthBasedHeight =\n width / aspectRatioRef.current + headerHeightRef.current;\n const heightBasedWidth =\n (height - headerHeightRef.current) * aspectRatioRef.current;\n const absDeltaX = Math.abs(deltaX);\n const absDeltaY = Math.abs(deltaY);\n\n if (absDeltaX > 1.1 * absDeltaY) {\n newHeight = Math.min(\n Math.max(widthBasedHeight, minHeightRef.current),\n maxHeightRef.current,\n );\n newWidth =\n (newHeight - headerHeightRef.current) *\n aspectRatioRef.current;\n } else if (absDeltaY > 1.1 * absDeltaX) {\n newWidth = Math.min(\n Math.max(heightBasedWidth, minWidthRef.current),\n maxWidthRef.current,\n );\n newHeight =\n newWidth / aspectRatioRef.current + headerHeightRef.current;\n } else {\n const avgHeight = (newHeight + widthBasedHeight) / 2;\n newWidth = Math.min(\n Math.max(\n (newWidth + heightBasedWidth) / 2,\n minWidthRef.current,\n ),\n maxWidthRef.current,\n );\n newHeight = Math.min(\n Math.max(avgHeight, minHeightRef.current),\n maxHeightRef.current,\n );\n newWidth =\n (newHeight - headerHeightRef.current) *\n aspectRatioRef.current;\n }\n }\n\n newWidth = Math.min(\n Math.max(newWidth, minWidthRef.current),\n maxWidthRef.current,\n );\n newHeight = Math.min(\n Math.max(newHeight, minHeightRef.current),\n maxHeightRef.current,\n );\n }\n\n return { width: newWidth, height: newHeight };\n };\n\n // handle the resize direction\n switch (direction) {\n case \"topLeft\": {\n const newSize = calculateNewSize(\n startWidth - deltaX,\n startHeight - deltaY,\n \"both\",\n );\n setSizeRef(newSize);\n setPositionRef({\n x: startPosition.x + (startWidth - newSize.width),\n y: startPosition.y + (startHeight - newSize.height),\n });\n break;\n }\n case \"topRight\": {\n const newSize = calculateNewSize(\n startWidth + deltaX,\n startHeight - deltaY,\n \"both\",\n );\n setSizeRef(newSize);\n setPositionRef({\n x: startPosition.x,\n y: startPosition.y + (startHeight - newSize.height),\n });\n break;\n }\n case \"bottomLeft\": {\n const newSize = calculateNewSize(\n startWidth - deltaX,\n startHeight + deltaY,\n \"both\",\n );\n setSizeRef(newSize);\n setPositionRef({\n x: startPosition.x + (startWidth - newSize.width),\n y: startPosition.y,\n });\n break;\n }\n case \"bottomRight\": {\n setSizeRef(\n calculateNewSize(\n startWidth + deltaX,\n startHeight + deltaY,\n \"both\",\n ),\n );\n break;\n }\n case \"top\": {\n const newSize = calculateNewSize(\n startWidth,\n startHeight - deltaY,\n \"height\",\n );\n setSizeRef(newSize);\n setPositionRef({\n x: startPosition.x,\n y: startPosition.y + (startHeight - newSize.height),\n });\n break;\n }\n case \"bottom\": {\n setSizeRef(\n calculateNewSize(startWidth, startHeight + deltaY, \"height\"),\n );\n break;\n }\n case \"left\": {\n const newSize = calculateNewSize(\n startWidth - deltaX,\n startHeight,\n \"width\",\n );\n setSizeRef(newSize);\n setPositionRef({\n x: startPosition.x + (startWidth - newSize.width),\n y: startPosition.y,\n });\n break;\n }\n case \"right\": {\n setSizeRef(\n calculateNewSize(startWidth + deltaX, startHeight, \"width\"),\n );\n break;\n }\n }\n }\n };\n\n const handleMouseUp = () => {\n // limit the position within the boundaries\n if (position.x < 0 || position.y < 0) {\n setPositionRef({\n x: Math.max(0, position.x),\n y: Math.max(0, position.y),\n });\n }\n cleanup();\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n };\n\n const handleMinimize = useCallback(() => {\n if (isMinimized) {\n // already minimized, restore to the previous size and position\n setSizeRef({ ...restoreSize });\n setPositionRef({ ...restorePosition });\n setIsMinimized(false);\n } else {\n // minimize\n if (isMaximized) {\n // if minimized from maximized directly, use the size and position which is stored before maximized\n setPositionRef({ ...restorePosition });\n } else {\n // otherwise store the current size and position\n setRestoreSize({ ...size });\n setRestorePosition({ ...position });\n }\n setSizeRef({ ...MINIMIZED_SIZE });\n setIsMinimized(true);\n }\n }, [\n isMinimized,\n isMaximized,\n size,\n position,\n restoreSize,\n restorePosition,\n setIsMinimized,\n setRestoreSize,\n setRestorePosition,\n ]);\n\n const handleMaximize = useCallback(() => {\n if (isMaximized) {\n // already maximized, restore to the previous size and position\n setSizeRef({ ...restoreSize });\n setPositionRef({ ...restorePosition });\n } else {\n // maximize\n if (isMinimized) {\n // if maximized from minimized directly, use the stored size and position before minimized\n setIsMinimized(false);\n } else {\n // otherwise store the current size and position\n setRestoreSize({ ...size });\n setRestorePosition({ ...position });\n }\n setSizeRef({ ...MAXIMIZED_SIZE });\n setPositionRef({ ...MAXIMIZED_POSITION });\n }\n }, [\n isMaximized,\n isMinimized,\n size,\n position,\n restoreSize,\n restorePosition,\n setIsMinimized,\n setRestoreSize,\n setRestorePosition,\n ]);\n\n // adjust position to the boundary when the window is resized\n useEffect(() => {\n const handleResize = throttle(() => {\n if (positionRef.current.x < 0 || positionRef.current.y < 0) {\n setPositionRef({\n x: Math.max(0, positionRef.current.x),\n y: Math.max(0, positionRef.current.y),\n });\n }\n const right = positionRef.current.x + sizeRef.current.width;\n const bottom = positionRef.current.y + sizeRef.current.height;\n if (right > window.innerWidth || bottom > window.innerHeight) {\n setPositionRef({\n x: Math.min(\n positionRef.current.x,\n Math.max(0, window.innerWidth - sizeRef.current.width),\n ),\n y: Math.min(\n positionRef.current.y,\n Math.max(0, window.innerHeight - sizeRef.current.height),\n ),\n });\n }\n }, 100);\n\n window.addEventListener(\"resize\", handleResize);\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n };\n }, []);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <>\n {/* Overlay when dragging or resizing */}\n {(isDragging || isResizing) &&\n createPortal(\n <div\n className={clsx(\n \"max-lg:hidden fixed inset-0 z-9999 bg-transparent w-full h-full select-none\",\n isDragging && (dockToEdge ? \"cursor-grabbing\" : \"cursor-move\"),\n !isDragging && {\n \"cursor-ns-resize\":\n resizeDirection === \"top\" || resizeDirection === \"bottom\",\n \"cursor-ew-resize\":\n resizeDirection === \"left\" || resizeDirection === \"right\",\n \"cursor-nwse-resize\":\n resizeDirection === \"topLeft\" ||\n resizeDirection === \"bottomRight\",\n \"cursor-nesw-resize\":\n resizeDirection === \"topRight\" ||\n resizeDirection === \"bottomLeft\",\n \"cursor-auto\": resizeDirection === null,\n },\n )}\n />,\n document.body,\n )}\n\n {/* Modal container */}\n <div\n className={clsx(\n \"max-lg:hidden fixed z-50 left-0 top-0\",\n isDragging ? \"will-change-transform\" : \"will-change-auto\",\n isResizing || isDragging\n ? \"transition-none\"\n : \"transition-transform duration-250 ease-[cubic-bezier(0.16,1,0.3,1)]\",\n )}\n style={{\n transform: `translate(${Math.round(position.x - (leftSidebar ? leftSidebarWidth : 0))}px, ${Math.round(position.y)}px)`,\n }}\n >\n <div className=\"flex relative z-50\">\n {leftSidebar && (\n <div\n className={clsx(\n \"relative mt-1 z-10 transition-all duration-250 ease-[cubic-bezier(0.16,1,0.3,1)]\",\n isDragging\n ? \"opacity-40 translate-x-4\"\n : \"opacity-100 translate-x-0\",\n )}\n style={{\n width: leftSidebarWidth,\n height: isMinimized ? 40 : size.height - 8,\n }}\n >\n {leftSidebar}\n </div>\n )}\n\n {/* modal content */}\n <div\n className={clsx(\n \"z-50 relative bg-content1 border border-border rounded-lg overflow-hidden\",\n isDragging\n ? \"opacity-80 shadow-md scale-102 blur-[0.5px]\"\n : \"opacity-100 shadow-lg scale-100 blur-none\",\n )}\n style={{\n width: size.width,\n height: size.height,\n transition:\n isResizing || isDragging\n ? \"none\"\n : \"transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.2s cubic-bezier(0.33, 1, 0.68, 1), height 0.25s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.2s cubic-bezier(0.33, 1, 0.68, 1)\",\n contain: \"content\",\n }}\n >\n <div\n className={clsx(\n \"w-full h-full\",\n dockAnimationEdge && \"animate-modal-shrink\",\n dockAnimationEdge === \"left\" ? \"origin-left\" : \"origin-right\",\n )}\n style={{ contain: \"paint\" }}\n >\n {/* resize handles */}\n {!isMinimized && (\n <>\n <div\n className=\"absolute top-0 left-0 w-3 h-3 cursor-nw-resize z-20\"\n onMouseDown={(e) =>\n startInteraction(e, \"resize\", \"topLeft\")\n }\n />\n <div\n className=\"absolute top-0 right-0 w-3 h-3 cursor-ne-resize z-20\"\n onMouseDown={(e) =>\n startInteraction(e, \"resize\", \"topRight\")\n }\n />\n <div\n className=\"absolute bottom-0 left-0 w-3 h-3 cursor-sw-resize z-20\"\n onMouseDown={(e) =>\n startInteraction(e, \"resize\", \"bottomLeft\")\n }\n />\n <div\n className=\"absolute bottom-0 right-0 w-3 h-3 cursor-se-resize z-20\"\n onMouseDown={(e) =>\n startInteraction(e, \"resize\", \"bottomRight\")\n }\n />\n <div\n className=\"absolute top-0 left-3 right-3 h-1.5 cursor-n-resize z-20\"\n onMouseDown={(e) => startInteraction(e, \"resize\", \"top\")}\n />\n <div\n className=\"absolute bottom-0 left-3 right-3 h-1.5 cursor-s-resize z-20\"\n onMouseDown={(e) => startInteraction(e, \"resize\", \"bottom\")}\n />\n <div\n className=\"absolute left-0 top-3 bottom-3 w-1.5 cursor-w-resize z-20\"\n onMouseDown={(e) => startInteraction(e, \"resize\", \"left\")}\n />\n <div\n className=\"absolute right-0 top-3 bottom-3 w-1.5 cursor-e-resize z-20\"\n onMouseDown={(e) => startInteraction(e, \"resize\", \"right\")}\n />\n </>\n )}\n\n {/* header */}\n {showHeader && (\n <div\n className=\"relative border-b border-border/80 px-3 gap-4 flex items-center justify-between cursor-move select-none\"\n onMouseDown={(e) => startInteraction(e, \"drag\")}\n style={{ height: headerHeight }}\n >\n {/* drag tooltip */}\n <StyledTooltip\n placement=\"top\"\n closeDelay={0}\n content={t(\"scaffold.draggableModal.snapToEdge\")}\n >\n <DraggableIcon className=\"text-neutral absolute left-1/2 -translate-x-1/2 top-0\" />\n </StyledTooltip>\n\n {header || (\n <>\n <div\n className=\"min-w-0 flex-initial text-sm font-medium truncate cursor-auto\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n {title}\n </div>\n <div\n className=\"flex-none flex items-center justify-end gap-1\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n {/* minimize button */}\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n isIconOnly\n onPress={handleMinimize}\n >\n {isMinimized ? (\n <RestoreWindowIcon\n width={18}\n height={18}\n className=\"text-neutral\"\n />\n ) : (\n <MinimizeIcon\n width={18}\n height={18}\n className=\"text-neutral\"\n />\n )}\n </Button>\n {/* maximize button */}\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n isIconOnly\n onPress={handleMaximize}\n >\n {isMaximized ? (\n <UnMaximizeIcon\n width={18}\n height={18}\n className=\"text-neutral\"\n />\n ) : (\n <MaximizeIcon\n width={18}\n height={18}\n className=\"text-neutral\"\n />\n )}\n </Button>\n {/* close button */}\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n isIconOnly\n onPress={onClose}\n >\n <XCloseIcon\n width={18}\n height={18}\n className=\"text-neutral\"\n />\n </Button>\n </div>\n </>\n )}\n </div>\n )}\n\n {/* content */}\n {!isMinimized && (\n <div\n className={\n showHeader\n ? \"p-2 h-[calc(100%-44px)] overflow-x-hidden overflow-y-auto\"\n : \"p-2 ph-full overflow-x-hidden overflow-y-auto cursor-move\"\n }\n onMouseDown={\n showHeader ? undefined : (e) => startInteraction(e, \"drag\")\n }\n >\n {children}\n </div>\n )}\n </div>\n </div>\n\n {rightSidebar && (\n <div\n className={clsx(\n \"relative mt-1 z-10 transition-all duration-250 ease-[cubic-bezier(0.16,1,0.3,1)]\",\n isDragging\n ? \"opacity-40 -translate-x-4\"\n : \"opacity-100 translate-x-0\",\n )}\n style={{\n width: rightSidebarWidth,\n height: isMinimized ? 40 : size.height - 8,\n }}\n >\n {rightSidebar}\n </div>\n )}\n </div>\n </div>\n </>\n );\n});\n","\"use client\";\n\nimport { useState, PropsWithChildren } from \"react\";\nimport { useCallbackRef, useValueRef } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n clsx,\n DraggableIcon,\n StyledTooltip,\n useAtom,\n useAtomValue,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\nimport {\n modalMaxWidthFamily,\n modalMinWidthFamily,\n panelStateFamily,\n panelWidthFamily,\n} from \"./states\";\nimport { useDraggableModalDisclosure } from \"./useDraggableModalDisclosure\";\nimport { useDraggablePanelDisclosure } from \"./useDraggablePanelDisclosure\";\n\nexport type DraggablePanelProps = PropsWithChildren<{\n /** unique id for the panel, must be the same with the modal */\n id: string;\n /** title of the modal */\n title?: React.ReactNode;\n /** maximum width of the panel */\n maxWidth?: number;\n /** minimum width of the panel */\n minWidth?: number;\n /** which side the panel is docked on */\n position: \"left\" | \"right\";\n /** whether to show the header */\n showHeader?: boolean;\n /** custom header content */\n header?: React.ReactNode;\n /** height of the modal header */\n headerHeight?: number;\n}>;\n\nexport function DraggablePanel({\n id,\n title,\n maxWidth = 440,\n minWidth = 320,\n position,\n showHeader = true,\n header,\n headerHeight = 44,\n children,\n}: DraggablePanelProps) {\n const { t } = useTranslation();\n\n // whether the panel is docked or not\n const panelState = useAtomValue(panelStateFamily(id));\n\n // whether the panel is being resized or not\n const [isResizing, setIsResizing] = useState(false);\n\n // whether the panel is being dragged or not\n const [isDragging, setIsDragging] = useState(false);\n\n // panel width\n const [width, setWidth] = useAtom(panelWidthFamily(id));\n\n // converting to modal\n const { onOpen: openModal } = useDraggableModalDisclosure(id);\n\n // control the close state of the panel\n const { onClose: closePanel } = useDraggablePanelDisclosure(id);\n\n const modalMinWidth = useAtomValue(modalMinWidthFamily(id));\n\n const modalMaxWidth = useAtomValue(modalMaxWidthFamily(id));\n\n // refs for props & states to avoid re-rendering\n const widthRef = useValueRef(width);\n const maxWidthRef = useValueRef(maxWidth);\n const minWidthRef = useValueRef(minWidth);\n const positionRef = useValueRef(position);\n const isResizingRef = useValueRef(isResizing);\n const isDraggingRef = useValueRef(isDragging);\n const setWidthRef = useCallbackRef(setWidth);\n const openModalRef = useCallbackRef(openModal);\n const closePanelRef = useCallbackRef(closePanel);\n const modalMinWidthRef = useValueRef(modalMinWidth);\n const modalMaxWidthRef = useValueRef(modalMaxWidth);\n\n const handleResizeStart = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizing(true);\n document.body.style.cursor = \"ew-resize\";\n document.body.style.userSelect = \"none\";\n document.body.style.overflow = \"hidden\";\n document.body.style.position = \"fixed\";\n document.body.style.width = \"100%\";\n document.body.style.height = \"100%\";\n\n // save start size & position in closure\n const startX = e.clientX;\n const startWidth = widthRef.current;\n\n const onResize = (e: MouseEvent) => {\n if (!isResizingRef.current) return;\n\n const deltaX = e.clientX - startX;\n\n const distance =\n positionRef.current === \"right\"\n ? startWidth - deltaX\n : startWidth + deltaX;\n\n const width = Math.min(\n Math.max(distance, minWidthRef.current),\n maxWidthRef.current,\n );\n setWidthRef(width);\n };\n\n const onResizeEnd = () => {\n setIsResizing(false);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n document.body.style.overflow = \"\";\n document.body.style.position = \"\";\n document.body.style.width = \"\";\n document.body.style.height = \"\";\n document.removeEventListener(\"mousemove\", onResize);\n document.removeEventListener(\"mouseup\", onResizeEnd);\n };\n\n document.addEventListener(\"mousemove\", onResize);\n document.addEventListener(\"mouseup\", onResizeEnd);\n };\n\n const handleDragStart = (e: React.MouseEvent) => {\n // if the target is a button, don't trigger drag\n if (e.target instanceof HTMLElement && e.target.closest(\"button\")) {\n return;\n }\n e.preventDefault();\n\n setIsDragging(true);\n\n // save start position in closure\n const startX = e.clientX;\n const startY = e.clientY;\n\n const cleanup = () => {\n document.removeEventListener(\"mousemove\", onDragMove);\n document.removeEventListener(\"mouseup\", onDragEnd);\n setIsDragging(false);\n };\n\n const onDragMove = (e: MouseEvent) => {\n if (!isDraggingRef.current) return;\n\n const deltaX = Math.abs(e.clientX - startX);\n const deltaY = Math.abs(e.clientY - startY);\n\n // if the drag distance is greater than 10px, convert to modal\n if (deltaX > 10 || deltaY > 10) {\n cleanup();\n // close the panel\n closePanelRef();\n // open the modal\n openModalRef({\n // modal should follow the cursor\n shouldStartDragging: true,\n position: {\n x: e.clientX - widthRef.current / 2 + 20,\n y: e.clientY - 20,\n },\n // adjust modal's width to the panel's width\n size: {\n width: Math.min(\n Math.max(widthRef.current, modalMinWidthRef.current),\n modalMaxWidthRef.current,\n ),\n },\n });\n }\n };\n\n const onDragEnd = () => {\n cleanup();\n };\n\n document.addEventListener(\"mousemove\", onDragMove);\n document.addEventListener(\"mouseup\", onDragEnd);\n };\n\n const handleClose = () => {\n closePanelRef();\n };\n\n if (panelState !== position) {\n return null;\n }\n\n return (\n <div className=\"max-lg:hidden flex-none flex flex-row overflow-hidden\">\n {/* when the panel is on the right, show the resize handle on the left */}\n {position === \"right\" && (\n <ResizeHandle\n isResizing={isResizing}\n handleResizeStart={handleResizeStart}\n />\n )}\n\n {/* panel content container */}\n <div\n className={clsx(\n \"flex flex-col min-h-0 overflow-hidden bg-content1\",\n isDragging\n ? \"opacity-80 scale-98 blur-[1px]\"\n : \"opacity-100 scale-100 blur-none\",\n )}\n style={{\n width: `${width}px`,\n transition:\n isResizing || isDragging\n ? \"none\"\n : \"transform 0.4s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.2s cubic-bezier(0.33, 1, 0.68, 1), height 0.4s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.2s cubic-bezier(0.33, 1, 0.68, 1)\",\n contain: \"content\",\n }}\n >\n {/* header */}\n {showHeader && (\n <div\n className=\"flex-none relative border-b border-border/80 px-3 gap-4 flex items-center justify-between cursor-move select-none\"\n onMouseDown={handleDragStart}\n style={{ height: headerHeight }}\n >\n {/* drag tooltip */}\n <StyledTooltip\n placement=\"top\"\n closeDelay={0}\n content={t(\"scaffold.draggablePanel.snapToModal\")}\n >\n <DraggableIcon className=\"text-neutral absolute left-1/2 -translate-x-1/2 top-0\" />\n </StyledTooltip>\n\n {header || (\n <>\n <div\n className=\"min-w-0 flex-initial text-sm font-medium truncate cursor-auto\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n {title}\n </div>\n <div\n className=\"flex-none flex items-center justify-end gap-1\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n {/* close button */}\n <Button\n size=\"sm\"\n variant=\"light\"\n radius=\"lg\"\n isIconOnly\n onPress={handleClose}\n >\n <XCloseIcon\n width={18}\n height={18}\n className=\"text-neutral\"\n />\n </Button>\n </div>\n </>\n )}\n </div>\n )}\n\n <div className=\"flex-auto min-h-0 overflow-y-auto p-2\">{children}</div>\n </div>\n\n {/* when the panel is on the left, show the resize handle on the right */}\n {position === \"left\" && (\n <ResizeHandle\n isResizing={isResizing}\n handleResizeStart={handleResizeStart}\n />\n )}\n </div>\n );\n}\n\ntype ResizeHandleProps = {\n isResizing: boolean;\n handleResizeStart: (e: React.MouseEvent) => void;\n};\n\nfunction ResizeHandle({ isResizing, handleResizeStart }: ResizeHandleProps) {\n return (\n <div className=\"relative\">\n <div className=\"relative w-1 h-full cursor-ew-resize bg-content3/80 hover:bg-content3 transition-colors duration-150 ease-in-out group flex flex-col items-center justify-center gap-1\">\n <i className=\"rounded-full w-0.5 h-0.5 bg-neutral\" />\n <i className=\"rounded-full w-0.5 h-0.5 bg-neutral\" />\n <i className=\"rounded-full w-0.5 h-0.5 bg-neutral\" />\n\n {/* expend click area */}\n <div\n className=\"absolute inset-0 -left-1.5 -right-1.5 cursor-ew-resize\"\n onMouseDown={handleResizeStart}\n />\n </div>\n\n {isResizing && <div className=\"fixed inset-0 z-50 cursor-ew-resize\" />}\n </div>\n );\n}\n","\"use client\";\n\nimport { PropsWithChildren, useEffect, useMemo } from \"react\";\nimport { clsx, getDefaultStore, useAtomValue } from \"@liberfi.io/ui\";\nimport { DraggableModal } from \"./DraggableModal\";\nimport { DraggablePanel } from \"./DraggablePanel\";\nimport {\n modalMaxWidthFamily,\n modalMinWidthFamily,\n panelMaxWidthFamily,\n panelMinWidthFamily,\n panelOrdersAtom,\n panelStateFamily,\n} from \"./states\";\n\nexport type DraggableContentProps = PropsWithChildren<{\n /** unique identifier for both the modal & panel */\n id: string;\n /** title of both the modal & panel */\n title?: React.ReactNode;\n /** whether to show the header for both the modal & panel */\n showHeader?: boolean;\n /** custom header content for both the modal & panel */\n header?: React.ReactNode;\n /** height of the modal header for both the modal & panel */\n headerHeight?: number;\n /** constraints for the minimum width of the modal */\n modalMinWidth?: number;\n /** constraints for the maximum width of the modal */\n modalMaxWidth?: number;\n /** constraints for the minimum width of the panel */\n panelMinWidth?: number;\n /** constraints for the maximum width of the panel */\n panelMaxWidth?: number;\n /** constraints for the minimum height of the modal */\n minHeight?: number;\n /** constraints for the maximum height of the modal */\n maxHeight?: number;\n /** left sidebar of the modal */\n leftSidebar?: React.ReactNode;\n /** width of the left sidebar */\n leftSidebarWidth?: number;\n /** right sidebar of the modal */\n rightSidebar?: React.ReactNode;\n /** width of the right sidebar */\n rightSidebarWidth?: number;\n /** constraints for the aspect ratio when resizing modal */\n aspectRatio?: number;\n}>;\n\nexport type DraggablePanelProviderProps = PropsWithChildren<{\n /** draggable contents */\n contents?: Array<DraggableContentProps>;\n /** root container class name */\n className?: string;\n /** class names slots*/\n classNames?: {\n root?: string;\n left?: string;\n right?: string;\n content?: string;\n };\n}>;\n\nexport function DraggablePanelProvider({\n contents = [],\n className,\n classNames,\n children,\n}: DraggablePanelProviderProps) {\n const panelOrders = useAtomValue(panelOrdersAtom);\n\n // sync panel & order widths\n useEffect(() => {\n const store = getDefaultStore();\n contents.forEach((content) => {\n store.set(panelMinWidthFamily(content.id), content.panelMinWidth ?? 320);\n store.set(panelMaxWidthFamily(content.id), content.panelMaxWidth ?? 440);\n store.set(modalMinWidthFamily(content.id), content.modalMinWidth ?? 504);\n store.set(\n modalMaxWidthFamily(content.id),\n content.modalMaxWidth ?? window.innerWidth - 40,\n );\n });\n }, [contents]);\n\n // latest opened on the left\n const leftOpenPanels = useMemo(\n () =>\n contents\n .filter((content) => {\n const store = getDefaultStore();\n // hasn't been opened on the left\n if (!panelOrders.left[content.id]) return false;\n // whether the panel is opened on the left\n return store.get(panelStateFamily(content.id)) === \"left\";\n })\n .sort((a, b) => panelOrders.left[b.id] - panelOrders.left[a.id]),\n [contents, panelOrders.left],\n );\n\n // latest opened on the right\n const rightOpenPanels = useMemo(\n () =>\n contents\n .filter((content) => {\n const store = getDefaultStore();\n // hasn't been opened on the right\n if (!panelOrders.right[content.id]) return false;\n // whether the panel is opened on the right\n return store.get(panelStateFamily(content.id)) === \"right\";\n })\n .sort(\n (a, b) =>\n (panelOrders.right[a.id] ?? 0) - (panelOrders.right[b.id] ?? 0),\n ),\n [contents, panelOrders.right],\n );\n\n return (\n <>\n <div\n className={clsx(\n \"w-full h-full flex flex-row overflow-hidden\",\n className,\n classNames?.root,\n )}\n >\n {/* left panels */}\n <div\n className={clsx(\"flex-none h-full flex flex-row\", classNames?.left)}\n >\n {leftOpenPanels.map((props) => (\n <DraggablePanel\n key={`left-${props.id}`}\n {...props}\n position=\"left\"\n minWidth={props.panelMinWidth ?? 320}\n maxWidth={props.panelMaxWidth ?? 440}\n />\n ))}\n </div>\n {/* main content */}\n <div className={clsx(\"flex-auto min-w-0 h-full\", classNames?.content)}>\n {children}\n </div>\n {/* right panels */}\n <div\n className={clsx(\"flex-none h-full flex flex-row\", classNames?.right)}\n >\n {rightOpenPanels.map((props) => (\n <DraggablePanel\n key={`right-${props.id}`}\n {...props}\n position=\"right\"\n minWidth={props.panelMinWidth ?? 320}\n maxWidth={props.panelMaxWidth ?? 440}\n />\n ))}\n </div>\n </div>\n {/* modals */}\n {contents.map((props) => (\n <DraggableModal\n key={`modal-${props.id}`}\n {...props}\n minWidth={props.modalMinWidth ?? 504}\n maxWidth={props.modalMaxWidth ?? window.innerWidth - 40}\n />\n ))}\n </>\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport { useAtomValue } from \"@liberfi.io/ui\";\nimport { lastDraggableTypeFamily } from \"./states\";\nimport { useDraggableModalDisclosure } from \"./useDraggableModalDisclosure\";\nimport { useDraggablePanelDisclosure } from \"./useDraggablePanelDisclosure\";\n\nexport type UseDraggableDisclosureReturnType = {\n isOpen: boolean;\n onOpen: () => void;\n onClose: () => void;\n};\n\nexport function useDraggableDisclosure(\n id: string,\n): UseDraggableDisclosureReturnType {\n const {\n isOpen: isModalOpen,\n onOpen: onOpenModal,\n onClose: onCloseModal,\n } = useDraggableModalDisclosure(id);\n\n const {\n isOpen: isPanelOpen,\n onOpen: onOpenPanel,\n onClose: onClosePanel,\n } = useDraggablePanelDisclosure(id);\n\n const lastDraggableType = useAtomValue(lastDraggableTypeFamily(id));\n\n const onOpen = useCallback(() => {\n if (isModalOpen || isPanelOpen) return;\n if (lastDraggableType === \"modal\") {\n onOpenModal();\n } else {\n onOpenPanel({ position: lastDraggableType });\n }\n }, [isModalOpen, isPanelOpen, lastDraggableType, onOpenModal, onOpenPanel]);\n\n const onClose = useCallback(() => {\n if (isModalOpen) {\n onCloseModal();\n } else if (isPanelOpen) {\n onClosePanel();\n }\n }, [isModalOpen, isPanelOpen, onCloseModal, onClosePanel]);\n\n const isOpen = useMemo(\n () => isModalOpen || isPanelOpen,\n [isModalOpen, isPanelOpen],\n );\n\n return useMemo(\n () => ({\n isOpen,\n onOpen,\n onClose,\n }),\n [isOpen, onOpen, onClose],\n );\n}\n","declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-scaffold\"] = \"0.1.0\";\n}\n\nexport default \"0.1.0\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@liberfi.io/ui-scaffold",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Page Layout Components for Liberfi React SDK",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"react": "^19.1.1",
|
|
18
18
|
"react-dom": "^19.1.1",
|
|
19
|
-
"@liberfi.io/ui": "0.1.7",
|
|
20
|
-
"@liberfi.io/core": "0.1.5",
|
|
21
19
|
"@liberfi.io/hooks": "0.1.5",
|
|
22
20
|
"@liberfi.io/i18n": "0.1.5",
|
|
23
|
-
"@liberfi.io/utils": "0.1.5"
|
|
21
|
+
"@liberfi.io/utils": "0.1.5",
|
|
22
|
+
"@liberfi.io/core": "0.1.5",
|
|
23
|
+
"@liberfi.io/ui": "0.1.7"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@tailwindcss/cli": "^4.1.13",
|