Skip to content

UI component inventory — Evidence Ledger

Source: agentic-workflows-v2/ui/src/ Audited: 2026-07-14 System: Evidence Ledger

This inventory describes the production component boundaries after the Evidence Ledger strangler migration. A component is specialized when generic abstraction would reduce semantic fidelity, accessibility, or performance.

Application and layout

Component Responsibility
App Lazy routes, Suspense, skip link, responsive shell, redirect, toaster
AppErrorBoundary Last-resort render failure with safe recovery
Sidebar Desktop evidence index and mobile bottom navigation
ConsoleHeader Current section/path, health and search affordances
CliStrip Intentionally dark command/status utility strip
BTopBar Compact breadcrumb/action band retained as a specialized route header

BTopBar, CLI text, and identifiers keep monospace because they represent machine paths or commands. They consume canonical Evidence Ledger colors and spacing through compatibility aliases; they do not define a separate theme.

Routed pages

Page Capability boundary
DashboardPage Aggregate health, recent evidence, first-run guidance
RunsPage Bounded run ledger, filters, live tail, keyboard inspector
RunDetailPage Permanent run evidence, DAG, I/O, evaluation, replay
LivePage WebSocket execution, transport state, bounded event/output views
WorkflowsPage Searchable workflow registry
WorkflowDetailPage DAG, schema inputs, routing/runtime/evaluation launch
WorkflowEditorPage Visual/YAML round trip, validation, diff, explicit save
DatasetsPage Source/dataset/sample browsing and run deep link
EvaluationsPage Scores, rubrics, judge/gate truth, replay comparison
ModelFinderPage URL-backed Model Router workspace
NotFoundPage Unknown-route recovery

SettingsPage remains a direct-component compatibility wrapper for tests and embedding. Production /settings redirects to the Providers tab; it is not a second product surface. PrototypeLabPage is not imported by production.

Model Router features

Component Real behavior
ModelFinderPage Models, Providers, Tiers, Packs, Playground, Hardware tabs
ProviderPanel Create/edit, env-name credential reference, toggle, probe, guarded delete
TierBoard Reorder/reset chains, model capability metadata, dry-run explanation
ModelPacksPanel Create/version/validate/activate/duplicate/import/export/archive/bind
ChatPlaygroundPanel Abortable SSE chat with text/image input and text/image output
ProviderProbeList All-provider status card grid plus searchable, collapsed live model catalog
finder/hardware panels Live discovery, filters, recommendations, operator override

Runs and launch

Component Responsibility
RunConfigForm Schema inputs, media, runtime, exact pack, direct model, eval/batch
RunList Reusable bounded run rows
RunDetailPanel Evidence tabs plus recorded routing provenance
JsonViewer Bounded, escaped structured data
DurationDisplay Human-readable timing

RunConfigForm uses native file/select controls where native form semantics are required. Their surfaces use the same tokens and visible focus rules as owned inputs. This is a documented specialized-control exception, not an independent visual foundation.

DAG, live, evaluation, and data features

  • DAG components retain React Flow for pan/zoom, nodes, edges, mini maps, and live status. Their list equivalents and inspectors remain semantic HTML.
  • Live components reduce WebSocket events, expose transport and workflow state, bound history, and preserve reconnect/out-of-order behavior.
  • Evaluation components render scorelines, rubric layers, gate failures, judge-skip truth, and comparable run evidence without fabricating confidence.
  • Dataset components preserve server paging, source provenance, compatibility checks, and sample-to-run links.

Shared state and evidence components

Existing components/common/ and components/states/ components remain specialized composition helpers for scorelines, empty/loading/error states, code/JSON evidence, and compact route headers. They inherit el-* values via the compatibility token map. New generic interaction behavior must use an owned primitive instead of adding another helper.

Owned shadcn/ui primitives

The following source is committed and may be changed locally:

accordion       alert-dialog    badge           button
checkbox        collapsible     command         dialog
dropdown-menu   input           popover         resizable
scroll-area     select          separator       sheet
skeleton        sonner          switch          table
tabs            textarea        tooltip

Evidence Ledger customizations include 2 px radii, 40 px standard controls, warm raised input surfaces, ink text, orange focus treatment, hairline tables, editorial dialog titles, and warm overlays. Radix supplies behavior; the repo owns appearance and composition.

Icons and feedback

Lucide supplies interface icons and is tree-shaken. Icons do not replace text for primary actions and icon-only controls have accessible names. Sonner is the single transient notification policy for mutation outcomes; persistent errors remain in the page near their cause.

Styling ownership

Source Purpose
styles/tokens.css Canonical light/dark semantic values and temporary aliases
styles/globals.css Typography, page canvas, focus, base browser behavior
tailwind.config.js Semantic utility bridge for shadcn and application code
route/component CSS Specialized graph/layout mechanics only

New product code should use el-* or shadcn semantic classes. b-* is a temporary strangler compatibility namespace and must not receive new visual semantics.

Test ownership

Component tests live in ui/src/__tests__/. Critical interaction coverage includes loading/empty/error states, run keyboard flows, stream reduction, workflow round trip, provider safeguards, tier mutation, pack lifecycle, multimodal chat, exact pack launch, and provenance display. Cross-route browser flows live under ui/e2e/.