feat: add composable sidebar primitives

This commit is contained in:
Jesse_Chen
2026-07-17 17:17:10 +08:00
parent 5aac5fd95d
commit c45f21e8d8
6 changed files with 406 additions and 0 deletions
@@ -0,0 +1,31 @@
"use client";
import { useEffect, useState } from "react";
import { sidebarViewportForWidth, type SidebarViewport } from "@/lib/sidebar-state";
type SidebarViewportState = {
readonly viewport: SidebarViewport;
readonly ready: boolean;
};
const initialViewportState: SidebarViewportState = {
viewport: "desktop",
ready: false,
};
export function useSidebarViewport(): SidebarViewportState {
const [state, setState] = useState(initialViewportState);
useEffect(() => {
const updateViewport = () => {
setState({ viewport: sidebarViewportForWidth(window.innerWidth), ready: true });
};
updateViewport();
window.addEventListener("resize", updateViewport);
return () => window.removeEventListener("resize", updateViewport);
}, []);
return state;
}