Module-specific widgets for the Biometric console, built on shared components
(00-shared/03 ). Only new module components are specified here; everything else
delegates to the shared library. All (planned) until the screens can be built.
Concern Spec
Purpose Show DeviceStatus (biometric-device.schema.ts:7-11)
States active → primaryContainer "Active"; inactive → surfaceVariant "Inactive"; offline → errorContainer "Offline"
Base shared AppBadge + AppChips-style; fixed width 72 dp to prevent row jitter
Semantics text "Device active/inactive/offline"; offline additionally announced "device offline"
Dark/light token-only; no custom colors
Motion 200 ms color transition on state swap
Concern Spec
Purpose One device/job sync summary row (hub card + device detail)
Content icon (check/error/hourglass), "Last sync {relative}" (from lastActivityAt-style field — planned), punch count, optional "Sync now" TextButton
States idle / syncing (spinner, Mo.m-base pulse) / success (check) / failed (error icon + "will retry (4× exp)" — blueprint RETRIES.md:38) / queued (hourglass — job in biometric-sync, queue.constants.ts:7)
Slot compact for list rows; expanded for hub card
Semantics single node; state text in label
Concern Spec
Purpose One biometric_logs row in list/preview (biometric-log.schema.ts:9-19)
Content student avatar+name, deviceId · mode, timestamp (relative + absolute), processed dot (planned field processed, COLLECTIONS.md:1888)
States unprocessed (grey dot) / processed (green dot) / selected (hover/pressed)
Base AppListTile; tap → detail sheet
Semantics "punch, {student}, {time}, processed"
Concern Spec
Purpose Chronological evidence view (verify check-in screen)
Content vertical timeline: dot + line, per punch PunchRow-lite (time, device, mode); day header grouping
Empty "No punches" compact state
Semantics Semantics grouping per day; each punch a node
Concern Spec
Purpose 3-step wizard indicator (Enrollment screen)
Steps 1 Student → 2 Capture → 3 Confirm
States current (filled), done (check), future (disabled); step bar announced; only current/next tappable
Motion progress fill 200 ms; step swap Mo.m-fast
Concern Spec
Purpose "3 of 4 devices active" fleet summary
Content headline count + chip row (Active/Inactive/Offline counts — from planned GET /biometric/devices + DeviceStatus)
States healthy (check icon), degraded (any offline/inactive → warning), empty ("no devices")
Base AppCard; icon color by state
Concern Spec
Purpose biometric-sync queue depth + failures
Content "waiting · failed" counts; failed > 0 → error banner link to Bull-Board
Base AppChips; live-region on refresh
Note meaningless until worker exists (OQ-4) — render "queue unavailable" gracefully
Concern Spec
Purpose Read/edit config object (biometric-device.schema.ts:30-31)
Content collapsible monospace JSON; edit mode with validate+save; never shows device secrets
Base AppCard + disclosure; destructive save confirm
Note blueprint stores device credentials encrypted in integrations (Biometric.md:59) — this viewer shows non-secret config only
AppCard, AppListTile, AppButton, AppFAB, AppMenu, AppDialog, AppSnackbar,
AppSkeleton, AppEmptyState, AppErrorState, AppOfflineBanner, AppBanner,
AppRefreshIndicator, AppBadge, AppChips, AppAvatar, AppTextField,
AppBottomSheet — all per 00-shared/03 , no fork.
Status Token
active primaryContainer / onPrimaryContainer
inactive surfaceVariant / onSurfaceVariant
offline errorContainer / onErrorContainer
processed (log) tertiaryContainer
unprocessed (log) surfaceVariant