You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Notion-like, content-first UI. All dashboard routes use a shared page frame (PageTemplate): title, description, actions, optional filter row, and content. Empty/loading/error states are consistent per archetype.
Page archetypes
Archetype
Use case
Empty
Loading
Error
dashboard
Overview: metrics, charts, activity
"No data yet" — run search/query
Spinner + "Loading…"
ErrorState + retry
search
Search/explore: semantic, warehouse, catalog, KG
"Nothing to show" — try search/catalog
Spinner + "Loading…"
ErrorState + retry
builder
Visual builder: workflows, notion blocks
"Start from scratch" — add nodes/blocks
Spinner + "Loading…"
ErrorState + retry
list-detail
Admin/list: users, API keys, integrations, settings
React Query: Single QueryClient in Providers; no duplication in DashboardLayout.
Lazy-load: WorkflowBuilder (ReactFlow), LazyBlockEditor (TipTap), LazyLineChart / LazyBarChart etc. via next/dynamic.
Virtualize: DataTable uses @tanstack/react-virtual when virtualize and data.length >= virtualizeThreshold (default 50). Set virtualize and virtualizeThreshold for large lists.
Bundle analysis: npm run build:analyze (ANALYZE=true next build).
Accessibility & quality gates
Focus & keyboard: focus-visible rings on interactive elements (globals.css fallback + component-level). Skip link to #main-content; main has id="main-content" and tabIndex={-1} for programmatic focus.
ARIA: Form inputs use aria-invalid, aria-describedby; errors use role="alert". Breadcrumbs aria-label="Breadcrumb", aria-current="page". Buttons/controls have aria-label where needed.
Loading / empty / error: PageTemplate + PageStates per archetype (PageStateLoading, PageStateEmpty, PageStateError). Use status and overrides (emptyTitle, errorMessage, onRetry) consistently.
Quality gates per archetype
Dashboard: loading skeleton (metric cards + chart placeholders); empty "No data yet"; error + retry.
Search: loading skeleton (bars + result area); empty "Nothing to show"; error + retry.
Builder: loading spinner; empty "Start from scratch"; error + retry.