diff --git a/src/components/canvas/Canvas.tsx b/src/components/canvas/Canvas.tsx index e98a11a..281d809 100644 --- a/src/components/canvas/Canvas.tsx +++ b/src/components/canvas/Canvas.tsx @@ -267,24 +267,30 @@ function Canvas() { }; useEffect(() => { + const container = stageContainerRef.current; + if (!container) return; + const resizeCanvas = () => { - if (stageContainerRef.current) { - setStageSize({ - width: stageContainerRef.current.offsetWidth, - height: stageContainerRef.current.offsetHeight, - }); - } + setStageSize({ + width: container.offsetWidth, + height: container.offsetHeight, + }); }; + const resizeObserver = new ResizeObserver(resizeCanvas); + resizeObserver.observe(container); + resizeCanvas(); + return () => resizeObserver.disconnect(); + }, [stageContainerRef]); + + useEffect(() => { setBlocks(welcomeBlocksData); - window.addEventListener("resize", resizeCanvas); window.addEventListener("keydown", onKeyDown); window.addEventListener("keyup", onKeyUp); return () => { - window.removeEventListener("resize", resizeCanvas); window.removeEventListener("keydown", onKeyDown); window.removeEventListener("keyup", onKeyUp); }; diff --git a/src/components/tool-settings/BlockSelector.tsx b/src/components/tool-settings/BlockSelector.tsx index c8eaf69..c33f82c 100644 --- a/src/components/tool-settings/BlockSelector.tsx +++ b/src/components/tool-settings/BlockSelector.tsx @@ -56,7 +56,7 @@ function BlockSelector({ stageWidth, searchInput }: Props) { return ( setHoverPosition(null)} > diff --git a/src/components/tool-settings/index.tsx b/src/components/tool-settings/index.tsx index fa08374..f0b07ce 100644 --- a/src/components/tool-settings/index.tsx +++ b/src/components/tool-settings/index.tsx @@ -4,29 +4,84 @@ import { SettingsContext } from "@/context/Settings"; import { Input } from "@/components/ui/input"; import { Separator } from "@/components/ui/separator"; +import { ScrollArea } from "@/components/ui/scroll-area"; import ColorPicker from "./ColorPicker"; import Replace from "./Replace"; import Radius from "./Radius"; import BlockSelector from "./BlockSelector"; -import { ScrollArea } from "../ui/scroll-area"; +import { GripVerticalIcon } from "lucide-react"; function ToolSettings() { const { settings } = useContext(SettingsContext); + const [width, setWidth] = useState(288); + const [resizing, setResizing] = useState(false); + const divRef = useRef(null); const [stageWidth, setStageWidth] = useState(0); const [searchInput, setSearchInput] = useState(""); + const onMouseDown = () => { + setResizing(true); + document.body.style.cursor = "ew-resize"; + }; + + const onMouseUp = () => { + setResizing(false); + document.body.style.cursor = "auto"; + }; + + const onMouseMove = (e: MouseEvent) => { + if (!resizing) return; + setWidth(() => Math.min(Math.max(window.innerWidth - e.clientX, 200), 1000)); + }; + useEffect(() => { - if (!divRef.current) return; - setStageWidth(divRef.current.clientWidth); - }, []); + if (resizing) { + document.addEventListener("mousemove", onMouseMove); + document.addEventListener("mouseup", onMouseUp); + } else { + document.removeEventListener("mousemove", onMouseMove); + document.removeEventListener("mouseup", onMouseUp); + } + + return () => { + document.removeEventListener("mousemove", onMouseMove); + document.removeEventListener("mouseup", onMouseUp); + }; + }, [resizing]); + + useEffect(() => { + const div = divRef.current; + if (!div) return; + + const set = () => setStageWidth(div.clientWidth); + + const resizeObserver = new ResizeObserver(set); + resizeObserver.observe(div); + + set(); + + return () => { + resizeObserver.disconnect(); + }; + }, [divRef]); return ( <> {(settings.colorPicker || settings.blockReplacer || settings.radiusChanger || settings.blockSelector) && ( -
+
+
+ +
+ {settings.colorPicker && ( <> @@ -51,7 +106,7 @@ function ToolSettings() { {settings.blockSelector && ( <> setSearchInput(e.target.value)} /> - + diff --git a/src/pages/AppPage.tsx b/src/pages/AppPage.tsx index e87f8bb..09c6f76 100644 --- a/src/pages/AppPage.tsx +++ b/src/pages/AppPage.tsx @@ -18,7 +18,7 @@ function AppPage() { -
+