nextuiq
Version:
NextUIQ is a modern, lightweight, and developer-friendly UI component library for React and Next.js. Built with TypeScript and Tailwind CSS, it offers customizable, accessible, and performance-optimized components with built-in dark mode, theme customizat
56 lines (53 loc) • 1.98 kB
JavaScript
import { j as jsxRuntimeExports } from './index46.mjs';
import React__default, { createContext, useState, useCallback, useEffect, useContext } from 'react';
const SidebarContext = createContext(void 0);
const useSidebar = () => {
const context = useContext(SidebarContext);
if (!context) {
throw new Error("useSidebar must be used within a SidebarProvider");
}
return context;
};
const SidebarProvider = ({ children }) => {
const [isExpanded, setIsExpanded] = useState(true);
const [isMobileOpen, setIsMobileOpen] = useState(false);
const [isMobile, setIsMobile] = useState(false);
const [isHovered, setIsHovered] = useState(false);
const [activeItem, setActiveItem] = useState(null);
const [openSubmenu, setOpenSubmenu] = useState(null);
const handleResize = useCallback(() => {
const mobile = window.innerWidth < 768;
setIsMobile(mobile);
if (!mobile) {
setIsMobileOpen(false);
}
}, []);
useEffect(() => {
handleResize();
window.addEventListener("resize", handleResize);
return () => window.removeEventListener("resize", handleResize);
}, [handleResize]);
const toggleSidebar = useCallback(() => {
setIsExpanded((prev) => !prev);
}, []);
const toggleMobileSidebar = useCallback(() => {
setIsMobileOpen((prev) => !prev);
}, []);
const toggleSubmenu = useCallback((item) => {
setOpenSubmenu((prev) => prev === item ? null : item);
}, []);
const contextValue = React__default.useMemo(() => ({
isExpanded: isMobile ? false : isExpanded,
isMobileOpen,
isHovered,
activeItem,
openSubmenu,
toggleSidebar,
toggleMobileSidebar,
setIsHovered,
setActiveItem,
toggleSubmenu
}), [isMobile, isExpanded, isMobileOpen, isHovered, activeItem, openSubmenu, toggleSidebar, toggleMobileSidebar, toggleSubmenu]);
return /* @__PURE__ */ jsxRuntimeExports.jsx(SidebarContext.Provider, { value: contextValue, children });
};
export { SidebarProvider, useSidebar };