diff --git a/resources/js/components/custom/use-tailwind-breakpoint.jsx b/resources/js/components/custom/use-tailwind-breakpoint.jsx new file mode 100644 index 0000000..211fef8 --- /dev/null +++ b/resources/js/components/custom/use-tailwind-breakpoint.jsx @@ -0,0 +1,41 @@ +import { useEffect, useState } from 'react'; + +// Hardcoded breakpoints based on your Tailwind config +const breakpoints = { + xxxxs: 0, + xxxs: 275, + xxs: 320, + xs: 475, + sm: 640, + md: 768, + lg: 1024, + xl: 1280, + '2xl': 1400, +}; + +const getCurrentBreakpoint = () => { + if (typeof window === 'undefined') return null; // Handle SSR + + const sortedBreakpoints = Object.entries(breakpoints).sort((a, b) => b[1] - a[1]); + + return sortedBreakpoints.find(([_, width]) => window.innerWidth >= width)?.[0] || 'xxs'; +}; + +const useTailwindBreakpoint = () => { + const [breakpoint, setBreakpoint] = useState(null); + + useEffect(() => { + const handleResize = () => { + setBreakpoint(getCurrentBreakpoint()); + }; + + handleResize(); // Set initial breakpoint + window.addEventListener('resize', handleResize); + + return () => window.removeEventListener('resize', handleResize); + }, []); + + return breakpoint; +}; + +export default useTailwindBreakpoint; diff --git a/resources/js/modules/editor/editor.tsx b/resources/js/modules/editor/editor.tsx index e6265ed..89add36 100644 --- a/resources/js/modules/editor/editor.tsx +++ b/resources/js/modules/editor/editor.tsx @@ -1,14 +1,68 @@ -import { useState } from "react" +import { useState, useEffect, useLayoutEffect } from "react" import EditSidebar from "./partials/edit-sidebar" import EditorCanvas from "./partials/editor-canvas" - import EditorHeader from "./partials/editor-header" import EditorControls from "./partials/editor-controls" +// Shared responsive hook +const useResponsiveWidth = (maxWidth = 350) => { + const [width, setWidth] = useState(350); + + const calculateWidth = () => { + const viewportWidth = window.innerWidth; + const padding = 32; + const availableWidth = viewportWidth - padding; + const constrainedWidth = Math.min(availableWidth, maxWidth); + setWidth(constrainedWidth); + }; + + useLayoutEffect(() => { + calculateWidth(); + }, [maxWidth]); + + useEffect(() => { + calculateWidth(); + + const handleResize = () => calculateWidth(); + + window.addEventListener('resize', handleResize); + window.addEventListener('orientationchange', handleResize); + + // ResizeObserver for more reliable detection + let resizeObserver; + if (window.ResizeObserver) { + resizeObserver = new ResizeObserver(calculateWidth); + resizeObserver.observe(document.body); + } + + // MutationObserver for dev tools + let mutationObserver; + if (window.MutationObserver) { + mutationObserver = new MutationObserver(() => { + setTimeout(calculateWidth, 50); + }); + mutationObserver.observe(document.documentElement, { + attributes: true, + attributeFilter: ['style'] + }); + } + + return () => { + window.removeEventListener('resize', handleResize); + window.removeEventListener('orientationchange', handleResize); + if (resizeObserver) resizeObserver.disconnect(); + if (mutationObserver) mutationObserver.disconnect(); + }; + }, [maxWidth]); + + return width; +}; + const Editor = () => { const [isEditSidebarOpen, setIsEditSidebarOpen] = useState(false) - const maxWidth = 350; + const maxWidth = 325; + const responsiveWidth = useResponsiveWidth(maxWidth); const handleEditClick = () => { setIsEditSidebarOpen(!isEditSidebarOpen) @@ -18,18 +72,23 @@ const Editor = () => { setIsEditSidebarOpen(false) } - - return ( -