SPB Git
1.3 KB · 12 lines typescript
1"use client";2import { create } from "zustand";3import { persist } from "zustand/middleware";4interface UI { sidebarOpen: boolean; aiOpen: boolean; aiWidth: number; focusMode: boolean; theme: "system" | "light" | "dark"; paletteOpen: boolean; aiContext: { pageId?: string | null; selection?: string | null; conversationId?: string | null; prefill?: string | null } ;5  set: (p: Partial<UI>) => void; toggleSidebar: () => void; toggleAI: () => void; openAI: (ctx?: UI["aiContext"]) => void; setTheme: (t: UI["theme"]) => void }6export const useUI = create<UI>()(persist((set, get) => ({7  sidebarOpen: true, aiOpen: false, aiWidth: 400, focusMode: false, theme: "system", paletteOpen: false, aiContext: {},8  set: (p) => set(p), toggleSidebar: () => set({ sidebarOpen: !get().sidebarOpen }), toggleAI: () => set({ aiOpen: !get().aiOpen }),9  openAI: (ctx) => set({ aiOpen: true, aiContext: { ...get().aiContext, ...(ctx ?? {}) } }),10  setTheme: (theme) => { set({ theme }); if (typeof document !== "undefined") { const dark = theme === "dark" || (theme === "system" && matchMedia("(prefers-color-scheme: dark)").matches); document.documentElement.classList.toggle("dark", dark); localStorage.setItem("note-theme", theme); } },11}), { name: "note-ui", partialize: (s) => ({ sidebarOpen: s.sidebarOpen, aiWidth: s.aiWidth, theme: s.theme }) }));12
Files · main
Menu

Theme