@oberoncms/core
Version:
OberonCMS is a cloud deployable CMS written in typescript based on the Puck visual editor
35 lines (28 loc) • 1.16 kB
text/typescript
import { useLayoutEffect, useRef, useState } from "react"
export const useFitZoom = (targetWidth: number | "100%") => {
const [scale, setScale] = useState(1)
const [scaledHeight, setScaledHeight] = useState<string | number>("100%") // Added state
const containerRef = useRef<HTMLDivElement>(null)
useLayoutEffect(() => {
const element = containerRef.current
if (!element) return
// Use ResizeObserver to track dynamic changes (window resize, sidebar toggle, etc.)
const observer = new ResizeObserver((entries) => {
for (const entry of entries) {
const containerHeight = element.getBoundingClientRect().height
if (targetWidth === "100%" || targetWidth === 0) {
setScale(1)
setScaledHeight(containerHeight)
return
}
const containerWidth = entry.contentRect.width
const newScale = Math.min(containerWidth / targetWidth, 1)
setScale(newScale)
setScaledHeight(containerHeight / newScale)
}
})
observer.observe(element)
return () => observer.disconnect()
}, [targetWidth])
return { ref: containerRef, scale, scaledHeight }
}