From 962729ae9242a1917ed23193a4ea6f591dd8ec27 Mon Sep 17 00:00:00 2001 From: Andy Charlwood Date: Sun, 15 Feb 2026 01:44:02 +0000 Subject: [PATCH] Supporting info for login screen rework --- .claude/settings.local.json | 3 +- LogoReveal/frame 1.jpg | Bin 0 -> 6740 bytes LogoReveal/frame 1.jpg:Zone.Identifier | Bin 0 -> 25 bytes LogoReveal/frame 2.jpg | Bin 0 -> 9140 bytes LogoReveal/frame 2.jpg:Zone.Identifier | Bin 0 -> 25 bytes LogoReveal/frame 3.jpg | Bin 0 -> 10159 bytes LogoReveal/frame 3.jpg:Zone.Identifier | Bin 0 -> 25 bytes LogoReveal/frame 4.jpg | Bin 0 -> 21343 bytes LogoReveal/frame 4.jpg:Zone.Identifier | Bin 0 -> 25 bytes LogoReveal/frame 5.jpg | Bin 0 -> 23413 bytes LogoReveal/frame 5.jpg:Zone.Identifier | Bin 0 -> 25 bytes .../2026-02-14-dashboard-restructure/prd.json | 307 +++++ .../progress.txt | 1168 +++++++++++++++++ .../2026-02-14-responsive-scaling/prd.json | 238 ++++ .../progress.txt | 944 +++++++++++++ .../prd.json | 236 ++++ .../progress.txt | 217 +++ Ralph/prd.json | 200 +++ Ralph/progress.txt | 890 +------------ current_login.jpg | Bin 0 -> 108866 bytes cvmis-logo.svg | 25 + goal_login.jpg | Bin 0 -> 111068 bytes logged_in.jpg | Bin 0 -> 316652 bytes package-lock.json | 212 ++- package.json | 1 + scripts/ralph/CLAUDE.md | 104 ++ scripts/ralph/progress.txt | 3 + scripts/ralph/ralph.sh | 165 +++ tasks/prd-dashboard-restructure.md | 193 +++ tasks/prd-login-screen-rework.md | 197 +++ tasks/prd-responsive-scaling.md | 220 ++++ tasks/prd-typography-spacing-rework.md | 215 +++ 32 files changed, 4685 insertions(+), 853 deletions(-) create mode 100644 LogoReveal/frame 1.jpg create mode 100644 LogoReveal/frame 1.jpg:Zone.Identifier create mode 100644 LogoReveal/frame 2.jpg create mode 100644 LogoReveal/frame 2.jpg:Zone.Identifier create mode 100644 LogoReveal/frame 3.jpg create mode 100644 LogoReveal/frame 3.jpg:Zone.Identifier create mode 100644 LogoReveal/frame 4.jpg create mode 100644 LogoReveal/frame 4.jpg:Zone.Identifier create mode 100644 LogoReveal/frame 5.jpg create mode 100644 LogoReveal/frame 5.jpg:Zone.Identifier create mode 100644 Ralph/archive/2026-02-14-dashboard-restructure/prd.json create mode 100644 Ralph/archive/2026-02-14-dashboard-restructure/progress.txt create mode 100644 Ralph/archive/2026-02-14-responsive-scaling/prd.json create mode 100644 Ralph/archive/2026-02-14-responsive-scaling/progress.txt create mode 100644 Ralph/archive/2026-02-15-typography-spacing-rework/prd.json create mode 100644 Ralph/archive/2026-02-15-typography-spacing-rework/progress.txt create mode 100644 Ralph/prd.json create mode 100644 current_login.jpg create mode 100644 cvmis-logo.svg create mode 100644 goal_login.jpg create mode 100644 logged_in.jpg create mode 100644 scripts/ralph/CLAUDE.md create mode 100644 scripts/ralph/progress.txt create mode 100755 scripts/ralph/ralph.sh create mode 100644 tasks/prd-dashboard-restructure.md create mode 100644 tasks/prd-login-screen-rework.md create mode 100644 tasks/prd-responsive-scaling.md create mode 100644 tasks/prd-typography-spacing-rework.md diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 6784f0f..99a2fbc 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -28,7 +28,8 @@ "Bash(tasklist:*)", "Bash(npx -y serve -l 3333 .)", "Bash(npx serve:*)", - "Bash(timeout /t 3 /nobreak)" + "Bash(timeout /t 3 /nobreak)", + "Bash(jq:*)" ] } } diff --git a/LogoReveal/frame 1.jpg b/LogoReveal/frame 1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..654b58554eec6ddb1d7276e5aaa5723a593828ad GIT binary patch literal 6740 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 literal 0 HcmV?d00001 diff --git a/LogoReveal/frame 1.jpg:Zone.Identifier b/LogoReveal/frame 1.jpg:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 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 DWFTIZ literal 0 HcmV?d00001 diff --git a/LogoReveal/frame 5.jpg:Zone.Identifier b/LogoReveal/frame 5.jpg:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 dcma!!%Fjy;DN4*MPD?F{<>dl#JyUFr831@K2x 'ecg' -> 'login' -> 'pmr' +- Phase type defined in `src/types/index.ts` as `'boot' | 'ecg' | 'login' | 'pmr'` +- BootSequence.tsx handles terminal animation — LOCKED +- ECGAnimation.tsx handles heartbeat + letter tracing + flatline exit — LOCKED +- LoginScreen.tsx bridges to dashboard (was PMRInterface, now DashboardLayout) + +### Data Architecture (CORRECT — do not modify existing files) +- All data files are populated with accurate CV content from References/CV_v4.md +- 5 consultation entries (roles), 18 medications (skills with prescribingHistory), 11 problems (achievements), 6 investigations (projects), 5 documents (education) +- Types are properly defined in pmr.ts — Consultation, Medication, Problem, Investigation, Document, Patient, ViewId +- New types needed: Tag, Alert, KPI, SkillMedication (Task 2) + +### Lucide Icons Typing +- Use `LucideIcon` type from `lucide-react` for icon maps, NOT `React.ComponentType<{ size: number }>` — the latter causes TS errors with ForwardRefExoticComponent + +### Known Dependencies +- React 18.3.1, TypeScript, Vite +- Tailwind CSS for utility classes +- Framer Motion 11.15.0 for animations +- Lucide React 0.468.0 for icons +- fuse.js 7.0.0 (already installed) for fuzzy search + +### Typography +- Elvaro Grotesque (`font-ui`) — primary UI font, 7 weights (300-900), loaded from Fonts/ directory +- Blumir (`font-ui-alt`) — alternative, variable font (100-700) +- Geist Mono (`font-geist`) — timestamps, data values, coded entries +- Fira Code (`font-mono`) — boot/ECG terminal only +- Do NOT use Inter, Roboto, DM Sans, or system defaults +- DM Sans in the concept HTML is a PLACEHOLDER — use Elvaro Grotesque +- Font mapping was corrected in Task 1: Elvaro = font-ui (primary), Blumir = font-ui-alt (alternative) + +### Design Tokens +- Dashboard background: use `--bg-dashboard` (#F0F5F4), NOT `--bg` (#FFFFFF which is for boot/ECG) +- Three-tier shadows: `--shadow-sm` (resting), `--shadow-md` (hover/interactive), `--shadow-lg` (overlays) +- Border tiers: `--border` (#D4E0DE, structural), `--border-light` (#E4EDEB, cards) +- Accent: `--accent` (#0D6E6E teal), `--accent-hover` (#0A8080), `--accent-light` (rgba 0.08), `--accent-border` (rgba 0.18) +- Status colors each have base + light + border variants (success, amber, alert, purple) +- Tailwind: `pmr-*` prefix for all dashboard colors (e.g., `bg-pmr-bg`, `text-pmr-accent`, `border-pmr-border-light`) +- Tailwind shadows: `shadow-pmr-sm`, `shadow-pmr-md`, `shadow-pmr-lg` +- Tailwind radius: `rounded-card` (8px), `rounded-card-sm` (6px), `rounded-login` (12px) + +### Dashboard Layout +- DashboardLayout.tsx is the main container for the pmr phase — replaces PMRInterface +- Three-zone: TopBar (fixed, z-100, 48px) + Sidebar (fixed left, 272px) + Main (scrollable card grid) +- Card grid: CSS Grid `repeat(2, 1fr)` gap 16px, responsive 1fr at ≤900px via `.dashboard-grid` class +- Entrance: three separate Framer Motion variants (topbar → sidebar → content), staggered with delays +- Sidebar: default export (`import Sidebar from './Sidebar'`), TopBar: named export (`import { TopBar } from './TopBar'`) +- Background color transition: DashboardLayout covers App.tsx's `bg-black` with `var(--bg-dashboard)` + `minHeight: 100vh` + +### Tile Expansion Pattern +- Framer Motion `AnimatePresence` + `motion.div` with `initial={{ height: 0 }}`, `animate={{ height: 'auto' }}`, `exit={{ height: 0 }}` +- `overflow: hidden` on the motion.div +- `prefers-reduced-motion` checked at module scope: `const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches` +- Transition: `prefersReducedMotion ? { duration: 0 } : { duration: 0.2, ease: 'easeOut' }` +- State: `expandedItemId: string | null` per tile component +- Keyboard: Enter/Space toggle, Escape collapse +- `role="button"`, `tabIndex={0}`, `aria-expanded` on clickable items +- Colored left border (2px) on expanded content panel +- CareerActivity maps activity→consultation via `consultationId`, CoreSkills maps skill→medication by name match + +### Command Palette +- `CommandPalette.tsx` renders at DashboardLayout level (z-index 1000, fixed overlay) +- Triggered by Ctrl+K (global listener in DashboardLayout) or TopBar search bar click +- Data model: `PaletteItem` with `PaletteAction` union (scroll, expand, link, download) +- `buildPaletteData()` returns 24 items across 6 sections, `buildSearchIndex()` wraps fuse.js +- `groupBySection()` maintains section order: Experience → Core Skills → Active Projects → Achievements → Education → Quick Actions +- All tiles have `data-tile-id` attribute (via Card `tileId` prop) for scroll targeting +- CSS animations in index.css: `palette-overlay-in`, `palette-modal-in` with `prefers-reduced-motion` overrides +- Legacy search exports (`SearchResult`, `buildLegacySearchIndex`, `groupResultsBySection`) kept for ClinicalSidebar backward compat — remove in Task 21 + +### Visual Review +- Dev server runs on `http://localhost:5173` throughout the loop +- App has boot→ECG→login→dashboard sequence (~15s on first load) +- If browser tools fail, skip visual review and note in iteration log — don't block progress + +## Manual Intervention — 2026-02-13 +### Reason: Complete redesign — replacing CareerRecord PMR with GP System Dashboard +### Changes made: +- **IMPLEMENTATION_PLAN.md**: Completely rewritten with 21 new tasks for GP System dashboard overhaul +- **guardrails.md**: Completely rewritten for new design direction (teal palette, tile-based layout, 8px radius, new shadow system) +- **progress.txt**: This intervention entry added +- **CLAUDE.md**: Will be updated by Task 3 in the new plan (architecture, colors, components, styling) + +### Previous plan status: 15/15 tasks completed (all checked off) +### New plan: 21 tasks across 4 phases (Foundation → Core Layout → Dashboard Tiles → Interactions → Polish) + +### What's being replaced: +- `PatientBanner.tsx` → `TopBar.tsx` (white top bar with search and session info) +- `ClinicalSidebar.tsx` → `Sidebar.tsx` (light background #F7FAFA, person header, tags, alerts only) +- `PMRInterface.tsx` → `DashboardLayout.tsx` (topbar + sidebar + scrollable card grid) +- All 7 `views/*.tsx` files → Dashboard tile components in `src/components/tiles/` +- Color palette: dark sidebar (#1E293B) + NHS Blue (#005EB8) → light sidebar (#F7FAFA) + teal (#0D6E6E) +- Navigation: sidebar-nav view-switching → single scrollable dashboard with expandable tiles +- Patient banner scroll condensation → removed (no banner, just topbar) + +### What's preserved: +- Boot sequence (BootSequence.tsx) — LOCKED +- ECG animation (ECGAnimation.tsx) — LOCKED +- Login screen (LoginScreen.tsx) — unchanged +- Font setup: Elvaro Grotesque (primary UI), Blumir (alt), Geist Mono (data), Fira Code (terminal only) +- All data files in src/data/ — content unchanged, new data files added +- fuse.js dependency — reused for command palette search +- App.tsx phase management (boot → ecg → login → pmr) — pmr phase now renders DashboardLayout + +### Context for next iteration: +- The reference design is `References/GPSystemconcept.html` — READ THIS before starting any visual task +- The old PMR components STILL EXIST in the codebase. Don't delete them yet — some expand/collapse patterns and data rendering can be reused inside tile expansion (Task 16). Cleanup happens in Task 21. +- Login screen still transitions to `#1E293B` background. The new dashboard has `#F0F5F4` background. The LoginScreen.tsx may need a background color update, or the transition can be handled in DashboardLayout's entrance animation. +- The concept HTML uses DM Sans font — this is a PLACEHOLDER. Production uses Elvaro Grotesque (font-ui). Do not switch to DM Sans. +- The concept's command palette has a comprehensive data model — use it as reference for building the palette in Task 18. +- Tile interactions (expansion, KPI flip) are in Phase 3. Tiles in Phase 2 should be built as static/display-only first, with data attributes or props that Phase 3 can hook into. + +### New guardrails added: +- Accent color: teal #0D6E6E (replacing NHS Blue #005EB8 as primary interactive color) +- Border radius: 8px for cards (was 4px) +- Shadow system: three-tier (sm/md/lg) replacing single pmr shadow +- Sidebar: light background, PersonHeader + Tags + Alerts ONLY (projects, skills, education moved to tiles) +- Layout: TopBar + Sidebar + Card Grid (replacing PatientBanner + ClinicalSidebar + view switching) +- Tile ordering: Patient Summary → Latest Results + Core Skills → Last Consultation → Career Activity → Education → Projects +- Skills frequency: user-specified values (Data Analysis=twice daily, etc.) + +## Iteration Log + +### Iteration 1 — Task 1: Update design tokens and Tailwind config +**Status:** Complete +**Changes:** +- Updated `src/index.css`: Added full GP System Dashboard token set (colors, shadows, layout vars, status colors with light/border variants). Kept legacy `--pmr-*` aliases for backward compat. Updated values of legacy tokens to match new palette (e.g., `--pmr-content` → `#F0F5F4`, `--pmr-sidebar` → `#F7FAFA`, `--pmr-radius` → `8px`). +- Updated `tailwind.config.js`: New pmr color tokens (bg, surface, sidebar, accent, text-primary/secondary/tertiary, border/border-light, success, amber, alert, purple). Three-tier shadow system (pmr-sm/md/lg). Border-radius updated (card=8px, card-sm=6px, login=12px). +- **Fixed font-ui/font-ui-alt swap**: Previous iterations had Blumir as `font-ui` and Elvaro as `font-ui-alt` — this was backwards. Now corrected: Elvaro Grotesque = `font-ui` (primary), Blumir = `font-ui-alt` (alternative). No components were using these classes directly, so no breakage. +- Used `--bg-dashboard` for the dashboard background (not `--bg`) to avoid conflicting with the existing `--bg: #FFFFFF` used by boot/ECG phases. +**Learnings:** +- The `--bg` CSS var is used for boot/ECG phases (#FFFFFF). Dashboard background uses `--bg-dashboard` (#F0F5F4) to avoid collision. +- No existing components reference `font-ui` or `font-ui-alt` Tailwind classes, so the font swap was safe. +- The old shadow tokens (`pmr-hover`, `pmr-banner`) were not referenced in any component code. +**Quality checks:** typecheck ✓, lint ✓ (1 pre-existing warning), build ✓ +**Visual review:** Not applicable (token-only changes, no visual components yet) + +### Iteration 2 — Task 2: Create new data files and update types +**Status:** Complete +**Changes:** +- Created `src/data/profile.ts` — personal statement extracted from CV_v4.md (exact match) +- Created `src/data/tags.ts` — 5 sidebar tags with color variants (teal, amber, green) +- Created `src/data/alerts.ts` — 2 sidebar alert flags (£14.6M savings, £220M budget) with severity and lucide-react icon names +- Created `src/data/kpis.ts` — 4 KPI metrics (Budget, Savings, Years, Team Size) with values, labels, subs, color variants, and explanation text for flip cards +- Created `src/data/skills.ts` — 5 technical skills as "SkillMedication" entries with user-specified frequencies (Data Analysis="Twice daily", Python="Daily", SQL="Daily", Power BI="Once weekly", JS/TS="When required"), plus years, proficiency, category, status, and lucide-react icon names +- Updated `src/types/pmr.ts` — added 4 new interfaces: Tag, Alert, KPI, SkillMedication +**Learnings:** +- All new data files follow the established pattern: import types, export const array +- Icon names are stored as strings (lucide-react icon names) — components will dynamically import them +- Skills frequency strings are user-specified values (not standardized enum like old Medication type) +- KPI explanations are substantial text blocks for flip card backs — these will be displayed in full when users flip the cards +- All CV numbers/dates verified against CV_v4.md — £220M, £14.6M, 9+ years, team of 12, start years for skills +**Quality checks:** typecheck ✓, lint ✓ (1 pre-existing warning), build ✓ +**Visual review:** Not applicable (data-only changes, no visual components yet) + +### Iteration 3 — Task 4: Build TopBar component +**Status:** Complete +**Changes:** +- Created `src/components/TopBar.tsx` — fixed 48px header with three zones: + - Left: Home icon (lucide-react, 18px, accent) + "Headhunt Medical Center" (13px, 600 weight) + "Remote" version badge (11px, tertiary) + - Center: Search bar button (max-width 560px, min-width 400px, 42px height) with Search icon, placeholder text, Ctrl+K kbd badge. On click triggers `onSearchClick` prop (for command palette in Task 18). Hidden on mobile (<768px). Hover/focus border transitions to accent color with focus ring. + - Right: "Dr. A.CHARLWOOD" text (hidden on <640px) + "Active Session · [time]" pill badge (Geist Mono, accent-light bg, accent-border) +- Component uses CSS custom properties from Task 1 tokens (--surface, --border, --accent, --text-primary, --text-secondary, --text-tertiary, --bg-dashboard, --accent-light, --accent-border) +- Live time updates every 60 seconds using setInterval +- Search bar is a `