feat(statistics-deck): deck shell — zero-scroll frame, top bar, period picker, profiles, keyboard, data-quality marker #133
Labels
No labels
blocked
bug
enhancement
high-priority
low-priority
needs-info
needs-triage
ready-for-agent
ready-for-human
referenced
research
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
gabogg/hikcentral#133
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of the statistics deck UI, implementing the accepted RFC
docs/architecture/rfc-statistics-deck-display-model.md(#80). This issue is the shell shared by the three period views; the views themselves are split by period (Day, Week, Month issues, each blocked by this one).Scope
Replace the
#content-statisticsplaceholder inapp/static/index.htmlwith the deck shell, as its own module underapp/static/js/src/ui/(not more code inapp.js), with frontend tests undertests/frontend/.Zero-scroll frame (RFC §3.1, §3.5): deck root
height: 100dvh; overflow: hidden,minmax(0, Nfr)rows,min-height: 0panels; the per-profile row splits (Room 12/55/33, Desk 17/50/33, Laptop 26/74). Below 760 CSS px the deck stacks into one column and scrolls, the only exception.Top bar, 38 px (RFC §3.4): it replaces the app header, HUD ribbon and deck selector while the deck is shown. It holds:
WEEK MON 14 – SUN 20 SEP 2026 ▾) and the Day / Week / Month tabs;viewerrole;?help.Period picker (RFC §5.1) from
GET /api/statistics/periods?granularity=: a calendar for Day, a list for Week and Month, the covered-days count for Partial Periods. It marks periods with marked days. Numpad-/+step to the previous / next period. Each tab keeps its own choice and opens on the latest complete period; a reload returns to the latest; the deep link (URL) carries the chosen period.Layout profiles (RFC §3.3): the choice is stored per browser (
localStorage, wrapped in try/catch) and defaults to Room. Never inferred from resolution.Language (RFC §5.2): the deck's own switch, stored per browser and defaulting to the app's current language. All deck copy goes through
i18n.js. Period labels are formatted on the client from the structured fields (start,end,iso_week, …).Keyboard (RFC §3.4), matched by
KeyboardEvent.code:.: picker;-/+: previous / next period;*: data-quality detail;/: help.The
/help shows the numpad diagram and the marker legend.Data-quality marker frame (RFC §4.1):
*/ click detail panel, with plain-language lines and no internal codes;Always on, amber only. The counts come from the period quality (#129).
Graph plumbing: Chart.js (vendored,
chart.umd.min.js) instances that redraw to their box and thin out axis labels instead of overflowing. There are shared styles for the Estimate dashed outline and the Unreliable grey hatching. No confidence-margin bands.Navigation:
analyticstab and F5 goes to the deck. Do the swap together with #130, which moves the calibration tools first, so no admin tool becomes unreachable.Acceptance
Depends on #129 (tier counts) for live badge data. The UI can be built against fixtures first. Admin tab swap: with #130. Refs #80, #121.
🤖 Generated with Claude Code