UNPKG

@flanksource/clicky-ui

Version:

Flanksource Clicky UI — React component library built on shadcn/ui with light/dark and density theming.

55 lines (54 loc) 1.87 kB
import { jsx } from "react/jsx-runtime"; import { useContext, createContext, useState, useEffect, useCallback, useMemo } from "react"; const STORAGE_KEY = "clicky-ui-density"; const DATA_ATTR = "data-density"; const DensityContext = createContext(null); function readStored() { if (typeof window === "undefined") return null; const raw = window.localStorage.getItem(STORAGE_KEY); return raw === "compact" || raw === "comfortable" || raw === "spacious" ? raw : null; } function apply(density) { if (typeof document === "undefined") return; document.documentElement.setAttribute(DATA_ATTR, density); } function DensityProvider({ children, defaultDensity = "comfortable", storageKey = STORAGE_KEY }) { const [density, setDensityState] = useState(() => { if (typeof window === "undefined") return defaultDensity; return readStored() ?? defaultDensity; }); useEffect(() => { apply(density); if (typeof window !== "undefined") { window.localStorage.setItem(storageKey, density); } }, [density, storageKey]); const setDensity = useCallback((next) => setDensityState(next), []); const value = useMemo( () => ({ density, setDensity }), [density, setDensity] ); return /* @__PURE__ */ jsx(DensityContext.Provider, { value, children }); } function useDensity() { const ctx = useContext(DensityContext); if (!ctx) throw new Error("useDensity must be used inside <DensityProvider>"); return ctx; } function useDensityValue() { const ctx = useContext(DensityContext); if (ctx) return ctx.density; if (typeof document === "undefined") return "comfortable"; const raw = document.documentElement.getAttribute("data-density"); return raw === "compact" || raw === "spacious" ? raw : "comfortable"; } export { DensityProvider, useDensity, useDensityValue }; //# sourceMappingURL=use-density.js.map