Module-specific widgets for the dashboard. Shared primitives live in
00-shared/03 (AppCard, AppSkeleton, AppEmptyState, AppErrorState,
AppRefreshIndicator, AppOfflineBanner, AppSnackbar, AppBadge,
AppChips, AppCharts, SegmentedButton family). Everything here composes
those primitives; token names per 00-shared/02.
value from payload leaf (dashboard.service.ts:50-70); formatting at call site (NumberFormat, INR for totalDueAmount:68)
Layout
AppCard; value headlineMedium; label bodySmall onSurfaceVariant; TrendIndicator under value; optional trailing drill icon
States
normal; zero (value 0 → muted hint line, e.g. "Invite your first student"); loading (parent renders AppSkeleton instead — card never shows while loading); stale (StaleBanner owned by screen, card gets surfaceContainerLow tint)
A11y
semantics node: label, value value-first ("93 percent, Attendance"); button when onTap; 48 dp min
Motion
press Mo-m-fast ripple; value change AnimatedSwitcher 200 ms