Files
portfolio/PROMPT.md
T

7.2 KiB

Task: Career Constellation Chart & Layout Polish

Visual polish and layout adjustments to the career constellation chart, sidebar, and repeat medications section. 12 discrete changes across 10 files.

Requirements

  • Lower LINK_BASE_OPACITY from 0.080.04
  • Lower LINK_STRENGTH_OPACITY_FACTOR from 0.120.06
  • Makes skill connection lines subtler so job pills are visually clearer

2. White background on hovered job pill (src/hooks/useConstellationHighlight.ts)

  • When a role/education node is the activeNodeId, override its .node-circle fill to #FFFFFF with fill-opacity: 1
  • Currently uses a gradient fill with fill-opacity: 0.25 — make it solid white, fully opaque

3. Move legend to top of chart + increase font size (src/components/constellation/ConstellationLegend.tsx)

  • Position legend as absolutely-positioned overlay at the top of the chart container (not below the SVG)
  • Increase font size from 10px to 12px to match work node label text size
  • Separate the "Hover to explore connections" text from the legend — see item 12

4. Move year labels to right side of chart (src/hooks/useForceSimulation.ts)

  • Keep the current node layout unchanged (roles, skills, timeline line stay where they are)
  • Move year label text elements to the right edge of the chart: position at width - sidePadding, text-anchor: 'end'

5. Change chart fonts to dashboard style (src/hooks/useForceSimulation.ts)

  • Year labels: change font-family from var(--font-geist-mono) to var(--font-ui)
  • Year indicator (animation): same font change

6. Reverse pathway column split to 40/60 (src/index.css)

  • Change .pathway-columns grid from minmax(0, 1.3fr) minmax(0, 1fr) to minmax(0, 2fr) minmax(0, 3fr)
  • This gives 40% to work experience text and 60% to the graph

7. Sidebar: collapses to icon rail when patient summary scrolls out of view (src/components/Sidebar.tsx + src/components/DashboardLayout.tsx)

  • Sidebar already starts expanded on desktop — no change needed there
  • Add IntersectionObserver on the PatientSummaryTile element in DashboardLayout
  • When PatientSummaryTile scrolls out of view, pass a forceCollapsed prop to Sidebar
  • Sidebar collapses to icon rail (same as current mobile rail behaviour with nav buttons + hamburger menu)
  • When PatientSummaryTile scrolls back into view, re-expand the sidebar
  • Only applies on desktop (≥1024px) — mobile behaviour unchanged

8. Change pathway stacking breakpoint from 1024px to 768px (src/index.css)

  • The .pathway-columns two-column layout currently triggers at min-width: 1024px
  • Change this to min-width: 768px so the graph sits beside text on tablets too
  • Sidebar breakpoint remains at 1024px (this only affects pathway columns)
  • Also update .pathway-graph-sticky responsive rule to match the 768px breakpoint

9. Repeat medications: 3-column layout (src/components/RepeatMedicationsSubsection.tsx)

  • Render all 3 category sections (Technical, Healthcare Domain, Strategic & Leadership) side-by-side
  • Use CSS grid: grid-template-columns: repeat(3, 1fr) on md (768px+) screens
  • Stack vertically on mobile (<768px)
  • Remove the marginTop between categories when in grid mode (they'll be in columns)

10. Skills hover → chart highlight (verify only)

  • RepeatMedicationsSubsection already calls onNodeHighlight on hover
  • This flows through DashboardLayouthighlightedNodeIdCareerConstellationuseConstellationHighlight
  • Verify this interaction works end-to-end. If it does, no code change needed.

11. Play/pause button: left edge of chart, visible only when chart is in view (src/components/constellation/PlayPauseButton.tsx + src/components/constellation/CareerConstellation.tsx)

  • Move button to the far-left edge of the chart container (not bottom-right)
  • Use IntersectionObserver on the chart container to track if chart is visible
  • When chart is in viewport: show button at left edge, vertically centered
  • When chart scrolls out of view: hide the button
  • Increase base opacity from 0.6 to 0.85
  • Add slightly stronger border and subtle box-shadow for visibility

12. "Hover to explore connections" text — more visible, top-left above year indicator (src/components/constellation/ConstellationLegend.tsx or src/components/constellation/CareerConstellation.tsx)

  • Separate this text from the legend dot items
  • Position at the top-left of the chart, above the year indicator text
  • Increase opacity from 0.7 to 1
  • Increase font size (match or approach the legend font size)
  • On touch devices, show "Tap to explore connections" instead

Success Criteria

All of the following must be true:

  • npm run lint passes with zero errors
  • npm run typecheck passes with zero errors
  • npm run build completes successfully
  • Link opacity constants lowered (LINK_BASE_OPACITY=0.04, LINK_STRENGTH_OPACITY_FACTOR=0.06)
  • Hovered role/education node gets white fill (#FFFFFF, fill-opacity 1)
  • Legend positioned at top of chart with 12px font size
  • Year labels positioned at right edge of chart with var(--font-ui) font
  • Pathway columns use 40/60 split (2fr/3fr)
  • Sidebar collapses to icon rail when patient summary scrolls out of view (desktop only)
  • Pathway columns go side-by-side at 768px (not 1024px)
  • Repeat medications renders 3 categories in grid columns on md+ screens
  • Play/pause button on left edge of chart, hidden when chart not in view
  • "Hover to explore" text at top-left of chart, full opacity, larger font

Constraints

  • TypeScript strict mode — noUnusedLocals, noUnusedParameters enforced
  • Path alias: @/*src/*
  • Styling: Tailwind utility classes + inline CSSProperties for dynamic/theme values
  • Animations: Framer Motion; respects prefers-reduced-motion
  • Design tokens: Primary teal #00897B, Accent coral #FF6B6B
  • Font tokens: --font-ui (Elvaro Grotesque), --font-geist-mono (Geist Mono)
  • Do not break existing hover/click/keyboard interactions on the constellation
  • Do not alter the D3 force simulation physics or node positioning logic (except year labels)
  • Preserve existing mobile behaviour unless explicitly changed (items 8, 9)

Files to Modify

  1. src/components/constellation/constants.ts
  2. src/hooks/useConstellationHighlight.ts
  3. src/components/constellation/ConstellationLegend.tsx
  4. src/hooks/useForceSimulation.ts
  5. src/index.css
  6. src/components/Sidebar.tsx
  7. src/components/DashboardLayout.tsx
  8. src/components/RepeatMedicationsSubsection.tsx
  9. src/components/constellation/PlayPauseButton.tsx
  10. src/components/constellation/CareerConstellation.tsx

Status

Track progress here. Mark items complete as you go. When all success criteria are met, print LOOP_COMPLETE.

  • Item 1: Link opacity
  • Item 2: White hover pill
  • Item 3: Legend top position
  • Item 4: Year labels right
  • Item 5: Font change
  • Item 6: Column split 40/60
  • Item 7: Sidebar scroll collapse
  • Item 8: Stacking breakpoint 768px
  • Item 9: Medications 3-column
  • Item 10: Skills hover verify
  • Item 11: Play/pause button
  • Item 12: Hover text visibility