Dashboard Patterns — Home, Orders, Order Details
The three core screens, all reading from mock core/data/ services behind a
backend-swappable seam (OrdersService, DashboardService).
Home (features/home)
The operator's daily landing screen — faithful port of the design import, with the design's off-domain placeholder copy replaced by drayage-TMS copy:
- God's Eye View — a dark stylized (non-geospatial) map card: labelled route pins
(
PINS, tone-colored dots + labels), map-control chips (plus/minus/sun/compassicons), and the Live Activity Stream — a list of.home__stream-cardentries (hand-styled, nottip-activity-item, since the stream lives inside the dark map card with its own accent-border styling). - AI hero —
tip-input(shape="pill" size="lg") with a projectedtip-button [trailing]"Generate" action;tip-avatar+ greeting line. - Requires Your Attention —
tip-card variant="highlight" accent="gold"wrapping an alert (LFD/demurrage copy) with Snooze/Resolvetip-buttons. - Getting Started — plain
tip-cardwith atip-progress-bar(onboardingProgress) and a manually-rendered step list (nottip-activity-item— steps have a done/current check-circle, not a tone accent).
Orders (features/orders)
All Orders — 6 tip-stat-card KPI tiles (Total inverse, Arriving, Pick-Up
highlight w/ progress + [footnote], Delivered, Returned, Dropped) sourced from
DashboardService.cards(), 1:1 with the backend's dashboard-card contract. Below, one
tip-card [padding]="'0'" hosts:
- Toolbar —
tip-inputsearch + fourtip-selectfilters (Date Range, Status, Carrier, Port) bound toOrdersService's filter signals, plus Export/Addtip-buttons. - Table — native
<table>(not a DS component) withtip-checkboxrow selection,tip-badgestatus, mono container numbers, an LFD pill with countdown, and a driver-dispatch cell (tip-avatar+ status dot, or an "Assign Driver" affordance). - Loading → data → empty — a
loadingsignal (mirroring the design'ssetTimeout(…, 1100)shimmer) rendersSKELETON_ROW_COUNTshimmer rows viatip-skeleton; once loaded, an empty filtered result renderstip-empty-state(icon="search-x") inside a full-colspancell instead of table rows. - Row click →
router.navigate(['/orders', row.id]); the row's own checkbox cell calls$event.stopPropagation()so selecting a row doesn't also navigate.
Order Details (features/order-details)
/orders/:id single-order drill-down, resolved via OrdersService.getById(id()) off the
route param (toSignal over route.paramMap), with the JSX source's own field-level
|| 'default' fallbacks reproduced exactly so the page never shows blank fields for a
partially-mocked order:
- Header — mono order id,
tip-badge [tone]="statusTone()", type, customer, created date; Export/Edit/Dispatchtip-buttons. - Milestone stepper — a static
STEPSarray (Booked → Returned; not derived from the order), each dot done/current/pending. - Left column — Shipment Details facts grid (8 rows,
monoflag per row) inside atip-card; Shipment Timeline as a list oftip-activity-itemfed byMOCK_ORDER_TIMELINE(core/data/mock-data.ts). - Right column — LFD/Demurrage Shield (
tip-card accent="gold"+tip-progress-bargold fill), Driver Dispatch (tip-avatar status="online"+ facts), Documents list (icon + name + mono filename +tip-badgeemerald/neutralfor Parsed/On file).
Shared conventions across all three
- KPI/stat figures are pre-computed by the service layer (never aggregated client-side) — mirrors the backend spec's server-side dashboard-card math (design principle 3, sub-second performance).
OnPush+ signals throughout; noNgRxyet (deferred until cross-feature shared state is needed — seeapp/frontend/README.md).- Static view scaffolding (stepper steps, documents, timeline) that isn't yet backed by the order/dashboard models is called out in code comments as "not derived from the order record" — keep that distinction when wiring real data in a future increment.