# Implementation Workflow: Adding Depth to the GP Clinical Record > Generated: Feb 2026 > Source: `Ralph/depth-requirements.md` + `Ralph/depth-design.md` > Prerequisite: Task 21 (cleanup) from current plan should be completed first --- ## Dependency Graph ``` Phase 1: Core Infrastructure T1 ─── Types & CSS foundations T2 ─── DetailPanelContext + DetailPanel component ──── depends on T1 T3 ─── useFocusTrap hook ─────────────────────────── depends on T1 T4 ─── SubNav + useActiveSection update ──────────── depends on T1 T5 ─── DashboardLayout restructure ──────────────── depends on T2, T3, T4 Phase 2: Data Expansion T6 ─── Expand skills.ts (5 → ~20, categorised) ──── depends on T1 T7 ─── Add KPI stories to kpis.ts ────────────────── depends on T1 T8 ─── Create constellation.ts data ──────────────── depends on T6 T9 ─── Create educationExtras.ts ─────────────────── depends on T1 Phase 3: Tile Modifications (parallel where possible) T10 ─── LatestResultsTile (bigger numbers, panel) ─── depends on T2, T7 T11 ─── CoreSkillsTile (full width, categorised) ──── depends on T2, T6 T12 ─── ProjectsTile (half width, card grid) ──────── depends on T2 T13 ─── LastConsultationTile (panel trigger) ──────── depends on T2 T14 ─── CareerActivityTile (panel triggers, hover) ── depends on T2 T15 ─── EducationTile (richer content, panel) ─────── depends on T2, T9 T16 ─── PatientSummaryTile (structured presentation)─ depends on T5 Phase 4: Detail Panel Renderers T17 ─── KPIDetail renderer ────────────────────────── depends on T10 T18 ─── ConsultationDetail renderer ───────────────── depends on T13, T14 T19 ─── ProjectDetail renderer ────────────────────── depends on T12 T20 ─── SkillDetail + SkillsAllDetail renderers ───── depends on T11 T21 ─── EducationDetail renderer ──────────────────── depends on T15 Phase 5: Career Constellation (D3.js) T22 ─── Install d3, scaffold CareerConstellation ──── depends on T8 T23 ─── D3 force graph rendering ──────────────────── depends on T22 T24 ─── Hover/click interactions → detail panel ───── depends on T23, T18, T20 T25 ─── Constellation accessibility ───────────────── depends on T23 Phase 6: Login Refresh T26 ─── LoginScreen visual restyle ────────────────── independent T27 ─── Username → a.recruiter + connection status ── depends on T26 T28 ─── Post-login loading state ──────────────────── depends on T27 T29 ─── TopBar session name update ────────────────── depends on T28 Phase 7: Polish & Integration T30 ─── CommandPalette updates for new content ────── depends on T17-T21 T31 ─── Responsive testing (panels, sub-nav) ──────── depends on T5, T2 T32 ─── prefers-reduced-motion audit ──────────────── depends on all T33 ─── Final visual review + cleanup ─────────────── depends on all ``` --- ## Pre-Flight: Complete Task 21 (Cleanup) Before starting depth work, the current plan's final task must be done: - [ ] Remove unused old components (PatientBanner, ClinicalSidebar, Breadcrumb, MobileBottomNav, PMRInterface) - [ ] Remove old view files (`src/components/views/*.tsx`) - [ ] Remove old portfolio components (Contact, Education, Experience, FloatingNav, Footer, Hero, Projects, Skills) - [ ] Remove unused hooks (useScrollCondensation if unused) - [ ] Verify no dead imports - [ ] `npm run build` clean **Checkpoint:** Clean build with zero unused components. --- ## Phase 1: Core Infrastructure ### Task 1: Types & CSS Foundations **Files:** `src/types/pmr.ts`, `src/index.css` **Effort:** Small Add all new TypeScript types and CSS custom properties needed by subsequent tasks. **Types to add (`src/types/pmr.ts`):** - `SkillCategory` — `'Technical' | 'Domain' | 'Leadership'` - `KPIStory` — context, role, outcomes[], period - Augment `KPI` with optional `story?: KPIStory` - `ConstellationNode` — id, type, label, domain, org data - `ConstellationLink` — source, target, strength - `DetailPanelContent` — discriminated union (kpi | skill | skills-all | consultation | project | education | career-role) - `EducationExtra` — documentId, extracurriculars, researchDescription, programmeDetail - Add `category?: SkillCategory` field to `SkillMedication` **CSS to add (`src/index.css`):** ```css --subnav-height: 36px; --panel-narrow: 400px; --panel-wide: 60vw; --backdrop-blur: 4px; --backdrop-bg: rgba(26,43,42,0.15); ``` Plus panel animation keyframes (`panel-slide-in`, `panel-slide-out`, `backdrop-fade-in`) with `prefers-reduced-motion` overrides. **Validation:** `npm run typecheck` passes. --- ### Task 2: DetailPanelContext + DetailPanel Component **New files:** `src/contexts/DetailPanelContext.tsx`, `src/components/DetailPanel.tsx` **Depends on:** T1 **Effort:** Medium **DetailPanelContext (`src/contexts/DetailPanelContext.tsx`):** - `DetailPanelContextValue`: `{ content, openPanel, closePanel, isOpen }` - `DetailPanelProvider` wraps children, manages state - Width mapping: deterministic from `content.type` (narrow for kpi/skill/education, wide for consultation/project/career-role) - Title mapping: derived from content data **DetailPanel (`src/components/DetailPanel.tsx`):** - Full-screen backdrop (`backdrop-filter: blur(4px)`, click to close) - Panel slides from right (`translateX(100%)` → `translateX(0)`, 250ms ease-out) - Adaptive width: `var(--panel-narrow)` or `var(--panel-wide)` based on content type - Header: close button (X, lucide `X` icon) + dot + section title - Scrollable content area renders `{children}` (or delegates to content renderers) - Close triggers: backdrop click, Escape key, X button - `aria-modal="true"`, `role="dialog"`, `aria-labelledby` - Mobile: both widths become 100vw - `prefers-reduced-motion`: instant appear, no slide **Integration:** Initially renders placeholder content ("Detail panel for {type}"). Real content renderers come in Phase 4. **Validation:** Panel opens/closes correctly with keyboard and mouse. `npm run typecheck` + `npm run build`. --- ### Task 3: useFocusTrap Hook **New file:** `src/hooks/useFocusTrap.ts` **Depends on:** T1 **Effort:** Small - `useFocusTrap(containerRef: RefObject, isActive: boolean): void` - When active: Tab/Shift+Tab cycle within container, first focusable element receives focus - When deactivated: focus returns to the element that was focused before trap activated - Used by DetailPanel (and already used by CommandPalette — consider if CommandPalette can share this hook) **Validation:** Tab cycling confirmed in DetailPanel. Focus returns correctly on close. --- ### Task 4: SubNav + useActiveSection Update **New file:** `src/components/SubNav.tsx` **Modified file:** `src/hooks/useActiveSection.ts` **Depends on:** T1 **Effort:** Medium **SubNav component:** - Fixed/sticky below TopBar (`top: 48px`, `z-index: 99`) - 5 sections: Overview | Skills | Experience | Projects | Education - Click → smooth-scroll to `[data-tile-id="${tileId}"]` - Active tab: teal underline (2px), text colour `var(--accent)` - Inactive: `var(--text-secondary)` - Height: 36px, background `var(--surface)`, bottom border - Tabs: 13px, font-weight 500, gap 24px - Teal underline slides with 200ms transition **useActiveSection update:** - Observe `data-tile-id` attributes on tile elements - Map tile IDs to section IDs (patient-summary→overview, core-skills→skills, etc.) - Use IntersectionObserver with appropriate thresholds **Tile `data-tile-id` attributes:** Ensure each tile's Card has this attribute. May need to add `tileId` prop to Card if not already present. **Validation:** Scroll triggers correct active tab. Click scrolls to correct section. `npm run build`. --- ### Task 5: DashboardLayout Restructure **Modified file:** `src/components/DashboardLayout.tsx` **Depends on:** T2, T3, T4 **Effort:** Medium **Changes:** 1. Wrap with `DetailPanelProvider` (in App.tsx or DashboardLayout) 2. Add `SubNav` between TopBar and content 3. Reorder tiles: - PatientSummaryTile (full width) - LatestResultsTile (half) + ProjectsTile (half) — side by side - CoreSkillsTile (full width) — was half, now full - LastConsultationTile (full width) - CareerActivityTile (full width) - EducationTile (full width) 4. Render `DetailPanel` alongside CommandPalette 5. Adjust margin-top: `calc(var(--topbar-height) + var(--subnav-height))` 6. Add `data-tile-id` attributes to tile wrappers **Validation:** Layout renders correctly with new tile order. SubNav visible. Detail panel renders. No visual regressions. `npm run build`. **Checkpoint:** Core infrastructure complete. Detail panel opens (with placeholder content), sub-nav works, new tile order in place. --- ## Phase 2: Data Expansion ### Task 6: Expand Skills Data **Modified file:** `src/data/skills.ts` **Depends on:** T1 **Effort:** Medium Expand from 5 → ~20 skills across 3 categories. Each skill retains the medication metaphor. **Categories:** - **Technical (8):** Data Analysis, Python, SQL, Power BI, JavaScript/TypeScript, Excel, Algorithm Design, Data Pipelines - **Healthcare Domain (6):** Medicines Optimisation, Population Health, NICE TA Implementation, Health Economics, Clinical Pathways, Controlled Drugs - **Strategic & Leadership (7):** Budget Management, Stakeholder Engagement, Pharmaceutical Negotiation, Team Development, Change Management, Financial Modelling, Executive Communication Each skill: `id`, `name`, `genericName`, `frequency`, `startYear`, `yearsOfExperience`, `status`, `proficiency`, `category` **Source:** CV_v4.md Core Competencies section. **Validation:** Types check. Existing CoreSkillsTile still renders (it will show all skills or first 5 depending on current implementation). --- ### Task 7: Add KPI Stories **Modified file:** `src/data/kpis.ts` **Depends on:** T1 **Effort:** Small Add `story` field to each of the 4 KPIs: 1. **£220M** — prescribing budget, forecasting models, ICB board accountability 2. **£14.6M** — efficiency programme, data analysis identification, over-target by Oct 2025 3. **9+ Years** — career span Aug 2016–present, progression narrative 4. **1.2M** — population served, Norfolk & Waveney ICS scope **Source:** CV_v4.md role descriptions. **Validation:** Types check. Existing tile unaffected (story field is optional). --- ### Task 8: Create Constellation Data **New file:** `src/data/constellation.ts` **Depends on:** T6 (needs skill IDs) **Effort:** Medium Define role-skill mapping for the D3 graph: - 6 role nodes (Paydens → Tesco Duty → Tesco Manager → NHS HCD → NHS Deputy → NHS Interim) - Skill nodes (from expanded skills data) - Links connecting skills to roles with strength values - Colour assignments: role nodes get org colours, skill nodes get domain colours **Validation:** Types check. Data importable. --- ### Task 9: Create Education Extras **New file:** `src/data/educationExtras.ts` **Depends on:** T1 **Effort:** Small Expanded detail for education entries: - MPharm: extracurriculars (Pharmacy Society President, Ultimate Frisbee VP, Alzheimer's Society), research project description - Mary Seacole: programme detail (change management, healthcare leadership, system-level thinking) - A-Levels: no extras needed **Source:** CV_v4.md Education section. **Validation:** Types check. Data importable. **Checkpoint:** All data expanded and ready for consumption by tiles and detail renderers. --- ## Phase 3: Tile Modifications Tasks in this phase can be done in parallel where dependencies allow. ### Task 10: LatestResultsTile — Remove Flip, Add Panel **Modified file:** `src/components/tiles/LatestResultsTile.tsx` **Modified file:** `src/index.css` (remove flip CSS if dedicated) **Depends on:** T2, T7 **Effort:** Medium **Changes:** 1. Remove CSS perspective flip animation entirely 2. Remove `.metric-card`, `.metric-card-inner`, `.metric-card-front`, `.metric-card-back` CSS classes 3. Replace with clickable KPI cards: - Headline number at 28-32px, bold (700), coloured by variant - Label at 12px, weight 500 - Sub-text at 10px, Geist Mono, tertiary 4. Click → `openPanel({ type: 'kpi', kpi })` 5. Hover: border colour shift + shadow deepens 6. Keyboard: Enter/Space triggers panel **Validation:** KPIs display with bigger numbers. Click opens detail panel (placeholder). No flip remnants. `npm run build`. --- ### Task 11: CoreSkillsTile — Full Width, Categorised **Modified file:** `src/components/tiles/CoreSkillsTile.tsx` **Depends on:** T2, T6 **Effort:** Large **Changes:** 1. Change from half-width to full-width (`full` prop on Card) 2. Display skills grouped by category (Technical, Healthcare Domain, Strategic & Leadership) 3. Category headers: thin divider line + label (styled like sidebar section dividers) 4. Show top 3-4 skills per category on the dashboard 5. "View all" button per category → `openPanel({ type: 'skills-all', category })` 6. Individual skill click → `openPanel({ type: 'skill', skill })` 7. Retain medication metaphor (frequency, status badge) 8. Remove single-expand accordion for skills (replaced by panel interaction) **Validation:** Skills display in 3 categories. View all opens panel. Individual click opens panel. `npm run build`. --- ### Task 12: ProjectsTile — Half Width, Card Grid **Modified file:** `src/components/tiles/ProjectsTile.tsx` **Depends on:** T2 **Effort:** Medium **Changes:** 1. Change from full-width to half-width (remove `full` prop) 2. Position alongside LatestResultsTile in the grid (handled by T5 layout reorder) 3. Compact card layout: status dot + name + year (right-aligned) 4. Tech stack as small inline tags 5. Click → `openPanel({ type: 'project', investigation })` 6. Remove in-place expansion (replaced by panel) 7. Hover: border shift, shadow deepens **Validation:** Projects render in half-width alongside KPIs. Click opens panel. `npm run build`. --- ### Task 13: LastConsultationTile — Panel Trigger **Modified file:** `src/components/tiles/LastConsultationTile.tsx` **Depends on:** T2 **Effort:** Small **Changes:** 1. Add "View full record" button/link at the bottom 2. Click → `openPanel({ type: 'consultation', consultation })` 3. Make the tile header area clickable too 4. Keep existing inline content (header info row, achievements preview) **Validation:** Click opens panel. Existing content unchanged. `npm run build`. --- ### Task 14: CareerActivityTile — Panel Triggers, Hover **Modified file:** `src/components/tiles/CareerActivityTile.tsx` **Depends on:** T2 **Effort:** Medium **Changes:** 1. Timeline items: click → `openPanel({ type: 'career-role', consultation })` (for role entries) 2. Remove in-place accordion expansion (replaced by panel) 3. Hover preview: items lift slightly on hover, show 1-2 lines of preview text 4. Keep colour-coded dots and entry type styling 5. Reserve space for CareerConstellation embed (Phase 5) **Note:** Extended timeline back to school (2009) — add education entries (Highworth Grammar, UEA) to the timeline data if not already present. **Validation:** Click opens panel for role items. Hover shows preview. No accordion. `npm run build`. --- ### Task 15: EducationTile — Richer Content, Panel **Modified file:** `src/components/tiles/EducationTile.tsx` **Depends on:** T2, T9 **Effort:** Small **Changes:** 1. Show richer inline content: research project score (75.1%), OSCE score (80%), A-level grades 2. Each education entry clickable → `openPanel({ type: 'education', document })` 3. Hover: border shift **Validation:** Richer content visible. Click opens panel. `npm run build`. --- ### Task 16: PatientSummaryTile — Structured Presentation **Modified file:** `src/components/tiles/PatientSummaryTile.tsx` **Depends on:** T5 **Effort:** Small **Changes:** 1. Use full profile paragraph from CV_v4.md (verify `profile.ts` has complete text) 2. Pull out key highlights as a visual strip (years of experience, population served, budget) 3. Break up wall of text with hierarchy (bold key phrases, structured paragraphs) **Validation:** Profile reads well, not a wall of text. Highlight strip visible. `npm run build`. **Checkpoint:** All tiles modified. Dashboard shows new layout with panel triggers on all interactive elements. Detail panel opens with placeholder content for each type. --- ## Phase 4: Detail Panel Renderers ### Task 17: KPIDetail Renderer **New file:** `src/components/detail/KPIDetail.tsx` **Depends on:** T10 **Effort:** Medium **Content:** - Headline number (large, coloured by variant) - Context paragraph (from `kpi.story.context`) - "Your role" paragraph (from `kpi.story.role`) - Outcome bullets (from `kpi.story.outcomes`) - Period badge (from `kpi.story.period`) **Wire into DetailPanel:** When `content.type === 'kpi'`, render ``. **Validation:** Panel renders full KPI story. Content matches CV_v4.md. `npm run build`. --- ### Task 18: ConsultationDetail Renderer **New file:** `src/components/detail/ConsultationDetail.tsx` **Depends on:** T13, T14 **Effort:** Medium **Content:** - Role title + organisation + dates - History paragraph (from `consultation.history`) - Achievement bullets (from `consultation.examination`) - Plan/outcomes (from `consultation.plan`) - Coded entries badges (from `consultation.codedEntries`) **Validation:** Panel renders full role detail. `npm run build`. --- ### Task 19: ProjectDetail Renderer **New file:** `src/components/detail/ProjectDetail.tsx` **Depends on:** T12 **Effort:** Medium **Content:** - Project name + year + status badge - Methodology description - Tech stack tags - Results bullets - External link button (if `investigation.link` exists) **Validation:** Panel renders full project detail. External link works. `npm run build`. --- ### Task 20: SkillDetail + SkillsAllDetail Renderers **New files:** `src/components/detail/SkillDetail.tsx`, `src/components/detail/SkillsAllDetail.tsx` **Depends on:** T11 **Effort:** Medium **SkillDetail:** - Skill name + frequency + status badge - Proficiency bar (visual) - Years of experience - "Used in" section: roles that used this skill (from constellation mapping, or hardcoded until T8 data available) **SkillsAllDetail:** - Full categorised list grouped by Technical / Domain / Leadership - Each skill row clickable → switches panel to individual SkillDetail - Category headers matching tile styling **Validation:** Both renderers work. Skill click within SkillsAll switches to SkillDetail. `npm run build`. --- ### Task 21: EducationDetail Renderer **New file:** `src/components/detail/EducationDetail.tsx` **Depends on:** T15 **Effort:** Small **Content:** - Title + institution + dates + classification - Research project description (if MPharm, from `educationExtras`) - Extracurricular activities (from `educationExtras`) - Programme detail (if Mary Seacole, from `educationExtras`) - Notes from document data **Validation:** Panel renders education detail with extras. `npm run build`. **Checkpoint:** All detail panel content renderers complete. Every interactive element in the dashboard opens its corresponding rich detail view. --- ## Phase 5: Career Constellation (D3.js) ### Task 22: Install D3, Scaffold CareerConstellation **Modified file:** `package.json` (add `d3`, `@types/d3`) **New file:** `src/components/CareerConstellation.tsx` (scaffold) **Depends on:** T8 **Effort:** Small - `npm install d3 @types/d3` - Create component with `useRef` for the SVG container - Render an empty SVG with viewBox, correct container sizing - Import constellation data **Validation:** Component renders empty SVG. d3 imports resolve. `npm run build`. --- ### Task 23: D3 Force Graph Rendering **Modified file:** `src/components/CareerConstellation.tsx` **Depends on:** T22 **Effort:** Large **Implement the force-directed graph:** - `d3.forceSimulation` with charge, link, x (chronological), y (centred), collision forces - Role nodes: 24px radius, org colour fill, white text - Skill nodes: 10px radius, domain colour-coded (clinical=green, technical=teal, leadership=amber) - Links: thin lines (1px), `var(--border)`, opacity 0.3 - Container: full width of CareerActivityTile, 400px desktop / 300px tablet / 250px mobile - SVG with responsive viewBox - Subtle radial gradient background **D3 integration pattern:** - D3 operates imperatively via `useEffect` on the SVG ref - React handles wrapper, D3 handles graph - No React state for node positions (performance) **Validation:** Graph renders with nodes and links. Nodes positioned chronologically. `npm run build`. --- ### Task 24: Constellation Interactions → Detail Panel **Modified file:** `src/components/CareerConstellation.tsx` **Depends on:** T23, T18, T20 **Effort:** Medium **Hover interactions:** - Hover role → connected skill nodes scale up, links brighten to `var(--accent)`, non-connected nodes fade to 0.15 opacity - Hover skill → all connected role nodes highlight, link paths illuminate - Tooltip with node name on hover **Click interactions:** - Click role → `onRoleClick(id)` → opens ConsultationDetail panel - Click skill → `onSkillClick(id)` → opens SkillDetail panel **Validation:** Hover highlighting works correctly. Click opens correct detail panels. --- ### Task 25: Constellation Accessibility **Modified file:** `src/components/CareerConstellation.tsx` **Depends on:** T23 **Effort:** Medium - `role="img"` on SVG with `aria-label` - Screen-reader-only text description of graph structure - Keyboard navigation: Tab through role nodes, Enter to open detail - `prefers-reduced-motion`: disable force simulation animation, render static final layout - Focus indicators on nodes when keyboard-navigating **Validation:** Screen reader describes graph. Keyboard nav works. Reduced motion shows static layout. `npm run build`. **Checkpoint:** Career Constellation complete and integrated into CareerActivityTile. Interactive, accessible, visually impressive. --- ## Phase 6: Login Refresh ### Task 26: LoginScreen Visual Restyle **Modified file:** `src/components/LoginScreen.tsx` **Depends on:** None (independent) **Effort:** Medium **Colour changes:** - `#005EB8` → `#0D6E6E` (shield icon bg, active field border, cursor, button) - `#004D9F` → `#0A8080` (button hover) - `#004494` → `#085858` (button pressed) - Background: `#1E293B` → keep or lighten to `#1A2B2A` **Typography:** - Ensure Elvaro Grotesque is used (not DM Sans or system defaults) - Shadows should match three-tier system **Validation:** Login looks cohesive with dashboard. Teal accents throughout. `npm run build`. --- ### Task 27: Username → a.recruiter + Connection Status **Modified file:** `src/components/LoginScreen.tsx` **Depends on:** T26 **Effort:** Medium **Username change:** - Typed username: `a.recruiter` (not `A.CHARLWOOD`) - Password typing remains as dots **Connection status indicator (below login button):** - New state: `ConnectionState = 'connecting' | 'connected'` - Initial: red dot + "Awaiting secure connection..." - After ~2000ms: green dot + "Secure connection established" - Dot: 6px circle, colour transitions with 300ms ease-out - Text: 10px, Geist Mono, tertiary colour - Login button disabled until BOTH `typingComplete` AND `connectionState === 'connected'` **Validation:** Username types as `a.recruiter`. Connection dot transitions red→green. Button enables correctly. --- ### Task 28: Post-Login Loading State **Modified file:** `src/components/LoginScreen.tsx` **Depends on:** T27 **Effort:** Small - On login click: `isLoading = true` - Card content replaces with: spinner + "Loading clinical records..." - Duration: ~600ms - Then calls `onComplete()` → dashboard materialises **Validation:** Brief loading state visible between login click and dashboard. Feels purposeful, not slow. --- ### Task 29: TopBar Session Name Update **Modified file:** `src/components/TopBar.tsx` **Depends on:** T28 **Effort:** Tiny - Change session display: `Dr. A.CHARLWOOD` → `A.RECRUITER` - Geist Mono font (should already be the case) **Validation:** TopBar shows `A.RECRUITER`. `npm run build`. **Checkpoint:** Login flow refreshed with teal aesthetic, recruiter narrative, connection status, and loading state. --- ## Phase 7: Polish & Integration ### Task 30: CommandPalette Updates **Modified file:** `src/components/CommandPalette.tsx`, `src/lib/search.ts` **Depends on:** T17-T21 **Effort:** Medium - Update search index to include expanded skills (20 skills vs 5) - Add "View [X] detail" actions that open the detail panel directly - Ensure palette results link to panel opens, not just scroll-to-section - Update grouping if new content types warrant it **Validation:** Search finds all 20 skills. Selecting a result opens the detail panel. `npm run build`. --- ### Task 31: Responsive Testing **Modified file:** Various **Depends on:** T5, T2 **Effort:** Medium - DetailPanel: both `narrow` and `wide` become 100vw on mobile (<768px) - SubNav: test on tablet/mobile (may need horizontal scroll or hamburger) - Constellation: test at 300px/250px heights on smaller screens - Projects + KPIs: stack vertically on mobile (grid fallback) - Touch targets: all interactive elements ≥48px **Validation:** Test at 375px, 768px, 1024px, 1440px breakpoints. No overflow, no hidden content. --- ### Task 32: prefers-reduced-motion Audit **Modified file:** Various **Depends on:** All phases **Effort:** Small Verify every new animation respects `prefers-reduced-motion: reduce`: - DetailPanel slide → instant appear - Backdrop fade → instant - SubNav underline transition → instant - Constellation force simulation → static layout - Connection status dot transition → instant - Post-login spinner → static indicator - Hover shadows/borders → can keep (non-motion) **Validation:** Enable `prefers-reduced-motion` in browser. No animations visible except hover state changes. --- ### Task 33: Final Visual Review + Cleanup **Depends on:** All phases **Effort:** Medium - Visual review against `References/GPSystemconcept.html` (where applicable) - Content verification against `References/CV_v4.md` - Dead import cleanup - Unused CSS removal (old flip card styles) - Console warning check - `npm run typecheck` — zero errors - `npm run lint` — pass (pre-existing warning OK) - `npm run build` — clean **Final checkpoint:** Complete depth enhancement. All features working, accessible, responsive, and polished. --- ## Summary | Phase | Tasks | New Files | Modified Files | Effort | |-------|-------|-----------|----------------|--------| | 1. Core Infrastructure | T1-T5 | 3 | 3 | Medium-Large | | 2. Data Expansion | T6-T9 | 2 | 2 | Medium | | 3. Tile Modifications | T10-T16 | 0 | 7 | Large | | 4. Detail Renderers | T17-T21 | 6 | 1 | Medium | | 5. Career Constellation | T22-T25 | 1 | 1 | Large | | 6. Login Refresh | T26-T29 | 0 | 2 | Medium | | 7. Polish | T30-T33 | 0 | Several | Medium | | **Total** | **33 tasks** | **12 new files** | **~16 modified** | | ### Parallelisation Opportunities - **T2, T3, T4** can be built in parallel (all depend only on T1) - **T6, T7, T9** can be built in parallel (all depend only on T1) - **T10-T15** can be built in parallel (all depend on T2 + their data task) - **T17-T21** can be built in parallel (each depends on its tile task) - **T26-T29** (login refresh) is independent of Phases 2-5, can run in parallel ### Critical Path T1 → T2 → T5 → T10 → T17 (shortest path to first visible depth feature) T1 → T6 → T8 → T22 → T23 → T24 (path to constellation) ### New Dependency ```bash npm install d3 @types/d3 ``` --- ## Next Step Use `/sc:implement` or begin manual implementation following this workflow phase by phase.