diff --git a/src/components/SubNav.tsx b/src/components/SubNav.tsx deleted file mode 100644 index 444b266..0000000 --- a/src/components/SubNav.tsx +++ /dev/null @@ -1,96 +0,0 @@ -interface NavSection { - id: string - label: string - tileId: string // data-tile-id to scroll to -} - -interface SubNavProps { - activeSection: string - onSectionClick: (sectionId: string) => void -} - -const sections: NavSection[] = [ - { id: 'overview', label: 'Overview', tileId: 'patient-summary' }, - { id: 'skills', label: 'Skills', tileId: 'section-skills' }, - { id: 'experience', label: 'Experience', tileId: 'section-experience' }, - { id: 'projects', label: 'Significant Interventions', tileId: 'projects' }, - { id: 'education', label: 'Education', tileId: 'section-education' }, -] - -export function SubNav({ activeSection, onSectionClick }: SubNavProps) { - const handleSectionClick = (section: NavSection) => { - // Scroll to the tile - const tileEl = document.querySelector(`[data-tile-id="${section.tileId}"]`) - if (tileEl) { - tileEl.scrollIntoView({ behavior: 'smooth', block: 'start' }) - } - // Notify parent of section change - onSectionClick(section.id) - } - - return ( - - ) -} diff --git a/src/components/TopBar.tsx b/src/components/TopBar.tsx deleted file mode 100644 index 46cbace..0000000 --- a/src/components/TopBar.tsx +++ /dev/null @@ -1,208 +0,0 @@ -import { useState, useEffect } from 'react' -import { Search } from 'lucide-react' -import { CvmisLogo } from './CvmisLogo' - -interface TopBarProps { - onSearchClick?: () => void -} - -export function TopBar({ onSearchClick }: TopBarProps) { - const [currentTime, setCurrentTime] = useState(() => formatTime(new Date())) - - useEffect(() => { - const interval = setInterval(() => { - setCurrentTime(formatTime(new Date())) - }, 60_000) - return () => clearInterval(interval) - }, []) - - return ( -
- {/* Skip to main content link (only visible on focus) */} - { - e.currentTarget.style.top = '0' - }} - onBlur={(e) => { - e.currentTarget.style.top = '-40px' - }} - > - Skip to main content - - {/* Brand */} -
- - - Headhunt Medical Center - - - HMC - - - Remote - -
- - {/* Search bar (center) — triggers command palette, no inline search */} - - - {/* Session info (right) */} -
- - A.RECRUITER - - - Active Session · {currentTime} - - - {currentTime} - -
-
- ) -} - -function formatTime(date: Date): string { - return date.toLocaleTimeString('en-GB', { - hour: '2-digit', - minute: '2-digit', - hour12: false, - }) -} diff --git a/src/data/problems.ts b/src/data/problems.ts deleted file mode 100644 index c479bd7..0000000 --- a/src/data/problems.ts +++ /dev/null @@ -1,111 +0,0 @@ -import type { Problem } from '@/types/pmr' - -export const problems: Problem[] = [ - { - id: 'prob-budget', - code: 'MGT001', - description: '£220M prescribing budget oversight and management', - since: 'Jul 2024', - status: 'Active', - narrative: 'Responsible for managing the £220M prescribing budget for NHS Norfolk & Waveney ICB. Developed sophisticated forecasting models identifying cost pressures and enabling proactive financial planning. This is an ongoing responsibility requiring continuous monitoring and strategic intervention.', - linkedConsultations: ['deputy-head-2024'], - }, - { - id: 'prob-sql-transform', - code: 'TRN001', - description: 'Patient-level SQL analytics transformation', - since: '2025', - status: 'In Progress', - narrative: 'Leading transformation from practice-level data to patient-level SQL analytics, enabling targeted interventions and a self-serve model for the wider team. This foundational change will unlock previously impossible analysis at population scale.', - linkedConsultations: ['interim-head-2025', 'deputy-head-2024'], - }, - { - id: 'prob-data-literacy', - code: 'LEA001', - description: 'Team data literacy programme', - since: 'Jul 2024', - status: 'In Progress', - narrative: 'Educating colleagues on data interpretation and analytics best practices, improving data fluency across the team through training, documentation, and self-serve tools. Ongoing initiative to build sustainable analytical capability.', - linkedConsultations: ['deputy-head-2024'], - }, - { - id: 'prob-efficiency', - code: 'EFF001', - description: 'Manual prescribing analysis inefficiency', - resolved: 'Oct 2025', - status: 'Resolved', - outcome: 'Python algorithm: 14,000 pts, £2.6M/yr', - narrative: 'Built Python-based switching algorithm using real-world GP prescribing data to automatically identify patients on expensive drugs suitable for cost-effective alternatives. Compressed months of manual analysis into 3 days. Identified 14,000 patients and £2.6M in annual savings, with £2M on target for delivery this financial year.', - linkedConsultations: ['interim-head-2025'], - }, - { - id: 'prob-efficiency-target', - code: 'EFF002', - description: '£14.6M efficiency target identification and delivery', - resolved: 'Oct 2025', - status: 'Resolved', - outcome: 'Over-target performance achieved', - narrative: 'Identified and prioritised a £14.6M efficiency programme through comprehensive data analysis. Achieved over-target performance by October 2025 through targeted, evidence-based interventions across the integrated care system.', - linkedConsultations: ['interim-head-2025'], - }, - { - id: 'prob-blueteq-backlog', - code: 'AUT001', - description: 'Blueteq form creation backlog', - resolved: '2023', - status: 'Resolved', - outcome: '70% reduction, 200hrs saved', - narrative: 'Developed software automating Blueteq prior approval form creation. Achieved 70% reduction in required forms, 200 hours immediate savings, and ongoing 7–8 hours weekly efficiency gains.', - linkedConsultations: ['high-cost-drugs-2022'], - }, - { - id: 'prob-asthma-screening', - code: 'INN001', - description: 'Asthma screening scalability', - resolved: '2019', - status: 'Resolved', - outcome: 'National rollout: ~300 branches, ~£1M', - narrative: 'Identified and shared an asthma screening process that was adopted nationally across the Tesco pharmacy estate (~300 branches). Reduced pharmacist time from approximately 60 hours to 6 hours per store per month, enabling the network to claim approximately £1M in revenue.', - linkedConsultations: ['pharmacy-manager-2017'], - }, - { - id: 'prob-incentive-calc', - code: 'AUT002', - description: 'Incentive scheme manual calculation', - resolved: '2025', - status: 'Resolved', - outcome: 'Automated: 50% Rx reduction in 2 months', - narrative: 'Automated incentive scheme analysis, improving accuracy and targeting precision whilst enabling a novel GP payment system linking rewards to delivered savings. Achieved 50% reduction in targeted prescribing within the first two months of deployment.', - linkedConsultations: ['interim-head-2025'], - }, - { - id: 'prob-hcd-tracking', - code: 'DAT001', - description: 'High-cost drug spend tracking gaps', - resolved: '2023', - status: 'Resolved', - outcome: 'Blueteq-secondary care data integration', - narrative: 'Integrated Blueteq data with secondary care activity databases, resolving critical data-matching limitations and enabling accurate high-cost drug spend tracking across the system.', - linkedConsultations: ['high-cost-drugs-2022'], - }, - { - id: 'prob-pathway-opacity', - code: 'VIS001', - description: 'Patient pathway opacity', - resolved: '2023', - status: 'Resolved', - outcome: 'Sankey chart analysis tool', - narrative: 'Created Python-based Sankey chart analysis tool visualising patient journeys through high-cost drug pathways, enabling trusts to audit compliance and identify improvement opportunities.', - linkedConsultations: ['high-cost-drugs-2022'], - }, - { - id: 'prob-opioid-monitoring', - code: 'MON001', - description: 'Population opioid exposure monitoring', - resolved: '2024', - status: 'Resolved', - outcome: 'CD monitoring system: OME tracking', - narrative: 'Developed Python-based controlled drug monitoring system calculating oral morphine equivalents across all opioid prescriptions to track patient-level exposure over time, identifying high-risk patients and potential diversion—enabling previously impossible patient safety analysis at population scale.', - linkedConsultations: ['deputy-head-2024'], - }, -] diff --git a/src/lib/profile-content.ts b/src/lib/profile-content.ts index 8c5b6c4..0d6dc72 100644 --- a/src/lib/profile-content.ts +++ b/src/lib/profile-content.ts @@ -5,16 +5,11 @@ import type { EducationCopyEntry, ExperienceEducationUICopy, LatestResultsCopy, - ProfileContent, QuickActionCopyEntry, SidebarCopy, SkillsUICopy, } from '@/types/profile-content' -export function getProfileContent(): DeepReadonly { - return profileContent -} - export function getProfileSummaryText(): string { return profileContent.profile.patientSummaryNarrative } diff --git a/src/lib/theme-colors.ts b/src/lib/theme-colors.ts index d8d9e77..ba2f005 100644 --- a/src/lib/theme-colors.ts +++ b/src/lib/theme-colors.ts @@ -7,8 +7,6 @@ export const DOT_COLORS = { purple: '#7C3AED', } as const -export type DotColorName = keyof typeof DOT_COLORS - /** KPI color variants (subset of DOT_COLORS) */ export const KPI_COLORS: Record<'green' | 'amber' | 'teal', string> = { green: DOT_COLORS.green, diff --git a/src/lib/utils.ts b/src/lib/utils.ts index efa114c..2503131 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,12 +1,3 @@ -export function calculateSkillOffset(level: number, radius: number): number { - const circumference = 2 * Math.PI * radius - return circumference * (1 - level / 100) -} - -export function formatBootLine(text: string): string { - return text -} - export function hexToRgba(hex: string, opacity: number): string { const r = parseInt(hex.slice(1, 3), 16) const g = parseInt(hex.slice(3, 5), 16) diff --git a/src/types/index.ts b/src/types/index.ts index 64356a7..f1b3af1 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,41 +1 @@ -export interface Skill { - name: string - level: number - category: 'Technical' | 'Clinical' | 'Strategic' - color: 'teal' | 'coral' -} - -export interface Experience { - role: string - org: string - date: string - bullets: string[] - isCurrent?: boolean -} - -export interface Education { - degree: string - institution: string - period: string - detail: string -} - -export interface Project { - title: string - description: string - link?: string -} - -export interface ContactItem { - icon: 'phone' | 'mail' | 'linkedin' | 'mapPin' - value: string - label: string - href?: string -} - export type Phase = 'boot' | 'ecg' | 'login' | 'pmr' - -export interface BootLine { - html: string - delay: number -} diff --git a/src/types/pmr.ts b/src/types/pmr.ts index 4924b16..d9a70dc 100644 --- a/src/types/pmr.ts +++ b/src/types/pmr.ts @@ -48,34 +48,6 @@ export interface PrescribingHistoryEntry { description: string } -export interface Medication { - id: string - name: string - dose: number - frequency: 'Daily' | 'Weekly' | 'Monthly' | 'As needed' - startYear: number - status: 'Active' | 'Historical' - category: 'Active' | 'Clinical' | 'PRN' - prescribingHistory: PrescribingHistoryEntry[] -} - -export interface Problem { - id: string - code: string - description: string - since?: string - resolved?: string - status: 'Active' | 'In Progress' | 'Resolved' - outcome?: string - narrative?: string - linkedConsultations?: string[] -} - -export interface InvestigationResult { - label: string - value: string -} - export interface Investigation { id: string name: string @@ -123,23 +95,6 @@ export interface Patient { registrationYear: string } -export type ViewId = 'summary' | 'consultations' | 'medications' | 'problems' | 'investigations' | 'documents' | 'referrals' - -export interface NavItem { - id: ViewId - label: string - icon: string -} - -export interface ReferralFormData { - priority: 'Urgent' | 'Routine' | 'Two-Week Wait' - referrerName: string - referrerEmail: string - referrerOrg?: string - reason: string - contactMethod: 'Email' | 'Phone' | 'LinkedIn' -} - export interface Tag { label: string colorVariant: 'teal' | 'amber' | 'green' @@ -171,6 +126,7 @@ export interface SkillMedication { category: 'Technical' | 'Domain' | 'Leadership' status: 'Active' | 'Historical' icon: string + prescribingHistory?: PrescribingHistoryEntry[] } // Skill categories for grouped display