Shell polish: storage line, status pill, footer strip, sidebar

Backend:
- apps.core with GET /api/status/ (env, git hash, OS, watched folder,
  worker counts) and a TimingMiddleware adding X-Server-Time-Ms
- status endpoint reports its own server-side assembly time

Frontend:
- top bar shows the storage line (watched folder) and a status pill
  with ENV, git hash, host OS, server time (e621 time once it exists)
- fixed 32px footer strip: storage path, active workers, build version
- collapsible filter sidebar: closed by default, Ctrl/Cmd+B toggle,
  overlay drawer with backdrop blur under 1024px
- rating filters, per-page and sidebar state persist in localStorage
This commit is contained in:
2026-09-17 08:19:27 -05:00
parent 0ff6232ba5
commit 3aa42f3703
14 changed files with 401 additions and 110 deletions
+29
View File
@@ -0,0 +1,29 @@
import { create } from "zustand";
import { persist } from "zustand/middleware";
interface UiState {
sidebarOpen: boolean;
setSidebarOpen: (open: boolean) => void;
toggleSidebar: () => void;
ratings: string[];
setRatings: (ratings: string[]) => void;
perPage: number;
setPerPage: (perPage: number) => void;
}
export const useUi = create<UiState>()(
persist(
(set) => ({
sidebarOpen: false,
setSidebarOpen: (sidebarOpen) => set({ sidebarOpen }),
toggleSidebar: () => set((state) => ({ sidebarOpen: !state.sidebarOpen })),
ratings: [],
setRatings: (ratings) => set({ ratings }),
perPage: 48,
setPerPage: (perPage) => set({ perPage }),
}),
{ name: "j621.ui" },
),
);