From 9da833f038e62abc616d798ad5cd37389f9e4632 Mon Sep 17 00:00:00 2001 From: arsam Date: Fri, 18 Sep 2026 23:11:17 +0330 Subject: [PATCH] Import source: src/stores/ui-store Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality. --- src/stores/ui-store.ts | 90 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/stores/ui-store.ts diff --git a/src/stores/ui-store.ts b/src/stores/ui-store.ts new file mode 100644 index 0000000..906455c --- /dev/null +++ b/src/stores/ui-store.ts @@ -0,0 +1,90 @@ +"use client"; + +import { create } from "zustand"; +import { persist } from "zustand/middleware"; +import { favoriteDefaults } from "@/lib/routes"; +import type { Density } from "@/lib/design-tokens"; + +type Theme = "light" | "dark" | "system"; + +export type AccentId = "azure" | "violet" | "emerald" | "sunset" | "rose" | "cyan"; +export type GlassLevel = "off" | "subtle" | "standard" | "heavy"; +export type RadiusScale = "sharp" | "rounded" | "soft"; + +export const appearanceDefaults = { + theme: "dark" as Theme, + accent: "azure" as AccentId, + glass: "subtle" as GlassLevel, + radius: "rounded" as RadiusScale, + ambiance: false, + density: "compact" as Density, +}; + +type UiState = { + sidebarCollapsed: boolean; + mobileSidebarOpen: boolean; + commandOpen: boolean; + density: Density; + theme: Theme; + accent: AccentId; + glass: GlassLevel; + radius: RadiusScale; + ambiance: boolean; + favorites: string[]; + recent: string[]; + toggleSidebar: () => void; + setMobileSidebarOpen: (open: boolean) => void; + setCommandOpen: (open: boolean) => void; + setDensity: (density: Density) => void; + setTheme: (theme: Theme) => void; + setAccent: (accent: AccentId) => void; + setGlass: (glass: GlassLevel) => void; + setRadius: (radius: RadiusScale) => void; + setAmbiance: (ambiance: boolean) => void; + toggleFavorite: (path: string) => void; + rememberRoute: (path: string) => void; + restoreDefaults: () => void; + resetAppearance: () => void; +}; + +export const useUiStore = create()( + persist( + (set, get) => ({ + sidebarCollapsed: false, + mobileSidebarOpen: false, + commandOpen: false, + density: appearanceDefaults.density, + theme: appearanceDefaults.theme, + accent: appearanceDefaults.accent, + glass: appearanceDefaults.glass, + radius: appearanceDefaults.radius, + ambiance: appearanceDefaults.ambiance, + favorites: favoriteDefaults, + recent: ["/dashboard", "/files", "/domains/example.com/dns"], + toggleSidebar: () => set((state) => ({ sidebarCollapsed: !state.sidebarCollapsed })), + setMobileSidebarOpen: (open) => set({ mobileSidebarOpen: open }), + setCommandOpen: (open) => set({ commandOpen: open }), + setDensity: (density) => set({ density }), + setTheme: (theme) => set({ theme }), + setAccent: (accent) => set({ accent }), + setGlass: (glass) => set({ glass }), + setRadius: (radius) => set({ radius }), + setAmbiance: (ambiance) => set({ ambiance }), + toggleFavorite: (path) => { + const favorites = get().favorites; + set({ + favorites: favorites.includes(path) + ? favorites.filter((item) => item !== path) + : [...favorites, path], + }); + }, + rememberRoute: (path) => { + const recent = [path, ...get().recent.filter((item) => item !== path)].slice(0, 8); + set({ recent }); + }, + restoreDefaults: () => set({ favorites: favoriteDefaults, density: "compact" }), + resetAppearance: () => set({ ...appearanceDefaults }), + }), + { name: "coaxyspanel-ui" }, + ), +);