import { create } from "zustand" export type SettingsTab = "models" | "appearance" | "advanced" | "about" export type MobileView = "canvas" | "chat" interface UiState { /** Desktop: the floating chat panel is open */ panelOpen: boolean /** Phones: which half of the app is visible */ mobileView: MobileView settingsOpen: boolean settingsTab: SettingsTab /** Version shown in the compare dialog, or null when closed */ compareVersionId: string | null sessionsOpen: boolean saveDialogOpen: boolean /** Bumped to ask the composer to take focus */ focusComposerToken: number /** Bumped when templates are saved, so template lists reload */ templatesVersion: number setPanelOpen: (open: boolean) => void togglePanel: () => void setMobileView: (view: MobileView) => void openSettings: (tab?: SettingsTab) => void setSettingsOpen: (open: boolean) => void setSettingsTab: (tab: SettingsTab) => void openCompare: (versionId: string) => void closeCompare: () => void setSessionsOpen: (open: boolean) => void setSaveDialogOpen: (open: boolean) => void focusComposer: () => void bumpTemplates: () => void } export const useUiStore = create((set) => ({ panelOpen: true, mobileView: "chat", settingsOpen: false, settingsTab: "models", compareVersionId: null, sessionsOpen: false, saveDialogOpen: false, focusComposerToken: 0, templatesVersion: 0, setPanelOpen: (open) => set({ panelOpen: open }), togglePanel: () => set((state) => ({ panelOpen: !state.panelOpen })), setMobileView: (view) => set({ mobileView: view }), openSettings: (tab) => set((state) => ({ settingsOpen: true, settingsTab: tab ?? state.settingsTab, })), setSettingsOpen: (open) => set({ settingsOpen: open }), setSettingsTab: (tab) => set({ settingsTab: tab }), openCompare: (versionId) => set({ compareVersionId: versionId }), closeCompare: () => set({ compareVersionId: null }), setSessionsOpen: (open) => set({ sessionsOpen: open }), setSaveDialogOpen: (open) => set({ saveDialogOpen: open }), focusComposer: () => set((state) => ({ panelOpen: true, mobileView: "chat", focusComposerToken: state.focusComposerToken + 1, })), bumpTemplates: () => set((state) => ({ templatesVersion: state.templatesVersion + 1 })), }))