# Progress Log — Career Constellation Refinement # Branch: ralph/constellation-refinement # Started: 2026-02-16 ## Codebase Patterns - CareerConstellation.tsx (~868 lines) is a D3 force-directed graph with React overlay buttons for accessibility - D3 simulation uses forceSimulation with charge, link, x, y, and collide forces - Module-level window.matchMedia reads for prefersReducedMotion and supportsCoarsePointer - DashboardLayout manages constellation state: highlightedNodeId, pinnedNodeId via callbacks - Work experience data in src/data/consultations.ts, constellation-specific data in src/data/constellation.ts - CSS layout: .pathway-columns grid — first column is .chronology-stream (work experience), second is .pathway-graph-sticky (constellation graph) - Current grid: minmax(0, 1.85fr) minmax(0, 1fr) at desktop — work experience ~65%, graph ~35% - containerHeight prop drives graph height on desktop; on mobile (viewport < 1024px) uses MOBILE_FALLBACK_HEIGHT (360px) - Use window.innerWidth for breakpoint checks, not container.clientWidth — the SVG container overflows on mobile - Design tokens in index.css :root — use var(--accent), var(--border-light), var(--text-tertiary), etc. - SVG shadows: use with in , apply to groups via .attr('filter', 'url(#filter-id)') - Role nodes are pill-shaped rects (ROLE_WIDTH=104, ROLE_HEIGHT=32, ROLE_RX=16) with orgColor badge styling - Skill nodes use SKILL_RADIUS_DEFAULT (7) resting, SKILL_RADIUS_ACTIVE (11) highlighted — D3 transitions, not CSS - Link lines are elements with quadratic bezier curves — tick handler sets d attr - Accessibility buttons are React