6.2 KiB
6.2 KiB
Reference: Tasks 4-6 — TopBar and Sidebar
Concept Reference
All specs below are derived from References/GPSystemconcept.html. Open it in a browser for visual reference.
Task 4: TopBar Component
File: src/components/TopBar.tsx
Structure
┌─────────────────────────────────────────────────────────────┐
│ [🏠] Headhunt Medical Center Remote │ [🔍 Search... Ctrl+K] │ Dr. A.CHARLWOOD · Active Session · 12:23 [Ctrl+K] │
└─────────────────────────────────────────────────────────────┘
Specs
Container:
position: fixed,top: 0,left: 0,right: 0height: var(--topbar-height)(48px)background: var(--surface)(#FFFFFF)border-bottom: 1px solid var(--border)(#D4E0DE)display: flex,align-items: center,justify-content: space-betweenpadding: 0 20pxz-index: 100
Brand (left):
Homeicon from lucide-react (18px, accent color)- Text: "Headhunt Medical Center" — 13px, font-ui, 600 weight, text-primary
- Version badge: "Remote" — 11px, 400 weight, text-tertiary, margin-left 2px
Search bar (center):
- Wrapper:
max-width: 560px,min-width: 400px - Container:
height: 42px,border: 1.5px solid var(--border),border-radius: var(--radius)(8px),padding: 0 14px, white bg - Search icon (16px, tertiary) + input + "Ctrl+K" kbd badge
- Input: 13px, font-body, placeholder "Search records, experience, skills... (Ctrl+K)"
- Hover:
border-color: var(--accent-border) - Focus:
border-color: var(--accent),box-shadow: 0 0 0 3px rgba(13,110,110,0.12) - On click/focus: opens Command Palette (Task 18). Does NOT do inline search.
- Kbd badge: mono font, 10px, tertiary, bg: var(--bg), border, padding 2px 6px, radius 4px
Session info (right):
- Text: "Dr. A.CHARLWOOD · Active Session · [time]" — 12px, text-secondary
- Session pill: mono 11px, tertiary,
background: var(--accent-light),padding: 3px 10px, radius 4px,border: 1px solid var(--accent-border) - Ctrl+K shortcut badge (same style as search bar badge)
Responsive:
- Mobile (<768px): hide center search bar. Show only brand + session info (or hamburger).
- Tablet: search bar may shrink.
Task 5: Sidebar — PersonHeader
File: src/components/Sidebar.tsx
Overall Sidebar Container
width: var(--sidebar-width)(272px)min-width: var(--sidebar-width)background: var(--sidebar-bg)(#F7FAFA)border-right: 1px solid var(--border)(#D4E0DE)overflow-y: auto, custom scrollbar (4px width, transparent track, border-colored thumb)padding: 20px 16pxdisplay: flex,flex-direction: column,gap: 2px
PersonHeader Section
Bordered below: border-bottom: 2px solid var(--accent), padding-bottom: 16px, margin-bottom: 6px
Avatar:
- 52px × 52px circle
background: linear-gradient(135deg, var(--accent), #0A8080)- White text "AC", 700 weight, 18px, centered
box-shadow: 0 2px 8px rgba(13,110,110,0.25)margin-bottom: 12px
Name:
- "CHARLWOOD, Andrew"
- 15px, 700 weight, text-primary,
letter-spacing: -0.01em
Title:
- "Pharmacy Data Technologist"
- 11.5px, mono font, 400 weight, text-secondary
margin-top: 2px
Status badge:
- Inline-flex, gap 5px
margin-top: 8px- 11px, 500 weight, success color (#059669)
background: var(--success-light),border: 1px solid var(--success-border)padding: 3px 9px,border-radius: 20px(pill)- Animated dot: 6px circle, success color,
animation: pulse 2s infinite(opacity 1→0.4→1) - Text: "Open to Opportunities"
Details grid:
display: grid,grid-template-columns: 1fr,gap: 6px,margin-top: 12px- Each row:
display: flex,justify-content: space-between,align-items: center, 11.5px,padding: 2px 0 - Label: text-tertiary, 400 weight
- Value: text-primary, 500 weight, text-align right
- GPhC No. value: mono font, 11px,
letter-spacing: 0.12em→ "2211810" - Education value: "MPharm 2.1 (Hons)"
- Location: "Norwich, Norfolk"
- Phone: link in accent color,
text-decoration: none, underline on hover → "07795 553 088" - Email: link → "andy@charlwood.xyz"
- Registered: "August 2016"
Data source: src/data/patient.ts
Task 6: Sidebar — Tags + Alerts
Section Title Component
Reusable within sidebar. Used for "Tags", "Alerts / Highlights", and any future sections.
font-size: 10px,font-weight: 600,text-transform: uppercase,letter-spacing: 0.08em- Color: text-tertiary
margin-bottom: 10px- Flex row with
::afterpseudo-element:flex: 1,height: 1px,background: var(--border-light),gap: 6px
Tags Section
- Container:
display: flex,flex-wrap: wrap,gap: 5px - Each tag: 10.5px, 500 weight,
padding: 3px 8px,border-radius: 4px, inline-flex,line-height: 1.3 - Color variants:
teal:background: var(--accent-light),color: var(--accent),border: 1px solid var(--accent-border)amber:background: var(--amber-light),color: var(--amber),border: 1px solid var(--amber-border)green:background: var(--success-light),color: var(--success),border: 1px solid var(--success-border)
- Data source:
src/data/tags.ts
Alerts / Highlights Section
- Container:
display: flex,flex-direction: column,gap: 6px - Each flag item:
display: flex,align-items: center,gap: 8px- 11px, 700 weight,
padding: 7px 10px,border-radius: var(--radius-sm)(6px),letter-spacing: 0.02em
- 11px, 700 weight,
- Alert variant (red):
background: var(--alert-light),color: var(--alert),border: 1px solid var(--alert-border)- Icon:
AlertTrianglefrom lucide-react (14px, 2.5 stroke-width)
- Amber variant:
background: var(--amber-light),color: var(--amber),border: 1px solid var(--amber-border)- Icon:
AlertCirclefrom lucide-react (14px, 2.5 stroke-width)
- Icon container: 16px square, flex center, flex-shrink-0
- Data source:
src/data/alerts.ts
Section Padding
Each sidebar section: padding: 14px 0 6px