Home mosaic, multi-select delete, offline banner and loading states

- Home puts the dashboards beside the flows: two equal-height columns,
  capped and scrollable, most recently worked on first. Each tile is a
  schematic footprint built from the stored widget placements.
- Flows and dashboards can be picked by long press or ctrl-click; the
  create button becomes a trash and one dialog covers the batch.
- The offline banner is drawn on the body so it centres on the viewport,
  and the live socket now releases the offline latch a stray 503 set.
- A boot spinner before React's first commit, a router pending screen for
  code-split pages, and skeletons where an empty list used to flash.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018tULRZJUkZsw7rMJ3h4xvu
This commit is contained in:
2026-08-22 12:02:14 +02:00
co-authored by Claude Opus 5
parent 6d84316ce5
commit f17d51c12f
13 changed files with 837 additions and 89 deletions
+9 -1
View File
@@ -10,6 +10,7 @@ import { StrictMode } from "react"
import ReactDOM from "react-dom/client"
import { toast } from "sonner"
import { ApiError, OpenAPI } from "./client"
import { PageLoading } from "./components/Common/Loading"
import { ThemeProvider } from "./components/theme-provider"
import { Toaster } from "./components/ui/sonner"
import "./index.css"
@@ -100,7 +101,14 @@ const queryClient = new QueryClient({
},
})
const router = createRouter({ routeTree, basepath: portal?.basePath })
const router = createRouter({
routeTree,
basepath: portal?.basePath,
// Routes are code-split, so going somewhere new fetches a chunk first. Under
// the threshold that arrives faster than a spinner would be worth looking at.
defaultPendingComponent: PageLoading,
defaultPendingMs: 250,
})
declare module "@tanstack/react-router" {
interface Register {
router: typeof router