# Progress Log — Typography & Spacing Scale Rework # Branch: ralph/dashboard-restructure # Started: 2026-02-14 ## Codebase Patterns ### Project Structure - Components in `src/components/`, tiles in `src/components/tiles/` - Detail renderers in `src/components/detail/` - Data files in `src/data/` - Types in `src/types/pmr.ts` and `src/types/index.ts` - Hooks in `src/hooks/`, Contexts in `src/contexts/`, Lib in `src/lib/` - Path alias: `@/` maps to `./src/` ### Phase Management - App.tsx controls phase: 'boot' -> 'ecg' -> 'login' -> 'pmr' - BootSequence.tsx, ECGAnimation.tsx — LOCKED, do not modify - LoginScreen.tsx bridges to dashboard ### Typography - Elvaro Grotesque (`font-ui`) — primary UI font - Blumir (`font-ui-alt`) — alternative variable font - Geist Mono (`font-geist`) — timestamps, data values - Fira Code (`font-mono`) — boot/ECG terminal only - Do NOT use Inter, Roboto, DM Sans, or system defaults ### Design Tokens (index.css) - --sidebar-width: 272px (target: 304px) - --topbar-height: 48px (target: 56px) - --subnav-height: 36px (target: 42px) - Dashboard grid gap: 12/16px (target: 14/20px) - Card padding: 20px (target: 24px) ### Known Dependencies - React 18.3.1, TypeScript, Vite, Tailwind CSS - Framer Motion 11.15.0, Lucide React 0.468.0, fuse.js 7.0.0 ### Key Files for This Feature - src/index.css — CSS custom properties, grid gap - src/components/Card.tsx — Card padding, CardHeader sizing - src/components/TopBar.tsx — brand, search, session text - src/components/SubNav.tsx — tab text, height - src/components/Sidebar.tsx — all sidebar content sizing - src/components/tiles/PatientSummaryTile.tsx — profile text, KPI cards - src/components/DashboardLayout.tsx — LastConsultationSubsection, main content padding - src/components/tiles/ProjectsTile.tsx — project items, tech tags - src/components/EducationSubsection.tsx — education entries - src/components/WorkExperienceSubsection.tsx — role items, expanded content - src/components/RepeatMedicationsSubsection.tsx — skill rows, category sections - src/components/ParentSection.tsx — parent heading sizing ### Sizing Context - Target display: 2560x1440 (QHD) - Current body text: 13px → target: 15px - Current labels/metadata: 9-10px → target: 11-12px minimum - Current sidebar details: 11-11.5px → target: 13px - No text below 11px anywhere in dashboard --- ## 2026-02-14 — US-019 - Updated --sidebar-width 272px→304px, --topbar-height 48px→56px, --subnav-height 36px→42px in index.css - Updated .dashboard-grid gap from 12px→14px (mobile), 16px→20px (tablet/desktop) - Updated Card.tsx: padding 20px→24px, CardHeader title fontSize 12px→13px, rightText fontSize 10px→11px, dot 8px→9px, marginBottom 16px→18px - Files changed: src/index.css, src/components/Card.tsx - **Learnings for future iterations:** - CSS vars (--sidebar-width, --topbar-height, --subnav-height) propagate automatically to TopBar, Sidebar, DashboardLayout — no additional changes needed - Card padding and CardHeader sizing affect every tile in the dashboard since all tiles use these components - Dashboard grid gap is defined in 3 media query blocks in index.css: base (mobile), 768px (tablet), 1024px (desktop) --- ## 2026-02-14 — US-020 - Scaled TopBar: brand text 13px→15px, 'Remote' label 11px→12px, search text 13px→14px, search height 42px→46px, Ctrl+K kbd 10px→11px, A.RECRUITER 12px→13px, session badge 11px→12px, skip-link 13px→14px, Home icon 18→20, Search icon 16→17 - Scaled SubNav: tab fontSize 13px→14px, minHeight 36px→42px - Files changed: src/components/TopBar.tsx, src/components/SubNav.tsx - **Learnings for future iterations:** - TopBar has two brand spans: one for desktop (sm:inline) and one for mobile (sm:hidden) — both need fontSize updates - TopBar session badge also has two spans: one for xs+ (xs:inline) and one for mobile (xs:hidden) — both need updating - SubNav height is controlled by both the CSS var (--subnav-height) and the button minHeight — both should match - SubNav uses sticky positioning with top: var(--topbar-height), so it automatically adjusts when topbar height changes --- ## 2026-02-14 — US-018 - Changed initial Phase state from 'boot' to 'pmr' in src/App.tsx (line 47) - Boot/ECG/login phases remain in code — only the default state changed - App now loads directly to DashboardLayout on refresh - Files changed: src/App.tsx - **Learnings for future iterations:** - Phase state is a simple string union on line 47 of App.tsx: `useState('boot'|'ecg'|'login'|'pmr')` - US-028 will revert this exact change back to 'boot' ---