From 72d159484f271aa5392b8fae715013510a69207c Mon Sep 17 00:00:00 2001 From: Andy Charlwood Date: Thu, 19 Feb 2026 19:54:18 +0000 Subject: [PATCH] Fixed a few skills --- src/components/ChatWidget.tsx | 4 +- src/components/constellation/constants.ts | 5 +- src/data/llm-prompt.ts | 2 +- src/data/skills.ts | 56 ++++++++++++++++++++++- src/data/timeline.ts | 14 +++++- src/hooks/useForceSimulation.ts | 6 ++- src/types/pmr.ts | 1 + 7 files changed, 79 insertions(+), 9 deletions(-) diff --git a/src/components/ChatWidget.tsx b/src/components/ChatWidget.tsx index 1fe6f9b..e1ae5af 100644 --- a/src/components/ChatWidget.tsx +++ b/src/components/ChatWidget.tsx @@ -736,7 +736,9 @@ export function ChatWidget({ onAction }: ChatWidgetProps) { className="md:hidden px-3 py-2 rounded-xl text-xs font-medium max-w-[200px]" style={{ position: 'fixed', - bottom: isMobileNav ? undefined : 'calc(16px + 48px + 10px)', + bottom: isMobileNav + ? 'calc(56px + env(safe-area-inset-bottom) + 16px + 48px + 10px)' + : 'calc(16px + 48px + 10px)', right: '16px', background: 'var(--surface)', color: 'var(--text-primary)', diff --git a/src/components/constellation/constants.ts b/src/components/constellation/constants.ts index 10fdd62..bddbf55 100644 --- a/src/components/constellation/constants.ts +++ b/src/components/constellation/constants.ts @@ -45,9 +45,10 @@ export const SKILL_GLOW_STD_DEVIATION = 2.5 export const SKILL_ACTIVE_STROKE_OPACITY = 0.1 // Skill overlap offsets -export const SKILL_Y_OFFSET_STEP = 25 -export const SKILL_Y_OFFSET_STEP_MOBILE = 20 +export const SKILL_Y_OFFSET_STEP = 35 +export const SKILL_Y_OFFSET_STEP_MOBILE = 26 export const SKILL_Y_GLOBAL_OFFSET_RATIO = -0.05 +export const SKILL_Y_CENTER_BLEND = 0.55 export const SKILL_X_OVERLAP_MAX_RATIO = 1 // Entry animation export const ENTRY_GUIDE_FADE_MS = 200 diff --git a/src/data/llm-prompt.ts b/src/data/llm-prompt.ts index 994288f..0ff03a3 100644 --- a/src/data/llm-prompt.ts +++ b/src/data/llm-prompt.ts @@ -91,7 +91,7 @@ Mathematics A*, Chemistry B, Politics C. Professional registration required to practise as a pharmacist in Great Britain. ## Skills -Technical: [skill-data-analysis] Data Analysis (10yr, 4x daily), [skill-python] Python (8yr, 3x daily), [skill-sql] SQL (3yr, 3x daily), [skill-dashboard-dev] Dashboard Development (3yr, weekly), [skill-ai-prompt-engineering] AI & Prompt Engineering (2yr, 4x daily), [skill-javascript-typescript] JavaScript/TypeScript (6yr, as needed) +Technical: [skill-data-analysis] Data Analysis (10yr, 4x daily), [skill-python] Python (8yr, 3x daily), [skill-sql] SQL (3yr, 3x daily), [skill-dashboard-dev] Dashboard Development (3yr, weekly), [skill-ai-prompt-engineering] AI Integration & Automation (2yr, 4x daily), [skill-javascript-typescript] JavaScript/TypeScript (4yr, as needed), [skill-algorithm-design] Algorithm Design (8yr, weekly), [skill-data-pipelines] Data Pipelines (3yr, weekly) Clinical: [skill-medicines-optimisation] Medicines Optimisation (10yr, 3–4x daily), [skill-population-health] Population Health (2yr, daily), [skill-nice-ta] NICE TA Implementation (4yr, 1–2x weekly), [skill-health-system-prescribing] Health System Prescribing Mgmt (2yr, daily), [skill-health-economics] Health Economics (4yr, 1–2x daily), [skill-clinical-pathways] Clinical Pathways (4yr, daily), [skill-formulary-commissioning] Formulary & Commissioning (4yr, weekly), [skill-community-pharmacy] Community Pharmacy Practice (11yr, as needed) Strategic: [skill-executive-comms] Executive Communication (2yr, bi-monthly), [skill-financial-modelling] Financial Scenario Modelling (4yr, weekly), [skill-budget-management] Budget Management (2yr, 2x weekly), [skill-stakeholder-engagement] Stakeholder Engagement (4yr, daily), [skill-change-management] Change Management (10yr, as needed), [skill-healthcare-leadership] Healthcare Leadership (8yr, daily) diff --git a/src/data/skills.ts b/src/data/skills.ts index 387a8f1..e39c9b8 100644 --- a/src/data/skills.ts +++ b/src/data/skills.ts @@ -5,6 +5,7 @@ export const skills: SkillMedication[] = [ { id: 'data-analysis', name: 'Data Analysis', + shortName: 'Data Analysis', frequency: '4x daily', startYear: 2016, yearsOfExperience: 10, @@ -53,6 +54,7 @@ export const skills: SkillMedication[] = [ { id: 'dashboard-dev', name: 'Dashboard Development', + shortName: 'Dashboards', frequency: 'Weekly', startYear: 2023, yearsOfExperience: 3, @@ -67,7 +69,8 @@ export const skills: SkillMedication[] = [ }, { id: 'ai-prompt-engineering', - name: 'AI & Prompt Engineering', + name: 'AI Integration & Automation', + shortName: 'AI Integration', frequency: '4x daily', startYear: 2024, yearsOfExperience: 2, @@ -82,9 +85,10 @@ export const skills: SkillMedication[] = [ { id: 'javascript-typescript', name: 'JavaScript / TypeScript', + shortName: 'JS / TS', frequency: 'As needed', startYear: 2020, - yearsOfExperience: 6, + yearsOfExperience: 4, category: 'Technical', status: 'Active', icon: 'FileCode2', @@ -95,10 +99,45 @@ export const skills: SkillMedication[] = [ ], }, + { + id: 'algorithm-design', + name: 'Algorithm Design', + shortName: 'Algorithms', + frequency: 'Weekly', + startYear: 2018, + yearsOfExperience: 8, + category: 'Technical', + status: 'Active', + icon: 'GitBranch', + prescribingHistory: [ + { year: 2018, description: 'Started: Automation logic for pharmacy processes' }, + { year: 2022, description: 'Increased: Blueteq form generation, clinical rule engines' }, + { year: 2024, description: 'Advanced: CD monitoring OME calculations, switching algorithm (14,000 patients)' }, + { year: 2025, description: 'Current: Incentive scheme automation, population-level patient identification' }, + ], + }, + { + id: 'data-pipelines', + name: 'Data Pipelines', + shortName: 'Pipelines', + frequency: 'Weekly', + startYear: 2023, + yearsOfExperience: 3, + category: 'Technical', + status: 'Active', + icon: 'Workflow', + prescribingHistory: [ + { year: 2023, description: 'Started: ETL processes for Blueteq integration' }, + { year: 2024, description: 'Increased: dm+d standardisation, morphine conversions' }, + { year: 2025, description: 'Current: ICS-wide data infrastructure' }, + ], + }, + // Clinical (8 skills) { id: 'medicines-optimisation', name: 'Medicines Optimisation', + shortName: 'Medicines Opt.', frequency: '3–4x daily', startYear: 2016, yearsOfExperience: 10, @@ -115,6 +154,7 @@ export const skills: SkillMedication[] = [ { id: 'population-health', name: 'Population Health', + shortName: 'Pop. Health', frequency: 'Daily', startYear: 2024, yearsOfExperience: 2, @@ -129,6 +169,7 @@ export const skills: SkillMedication[] = [ { id: 'nice-ta', name: 'NICE TA Implementation', + shortName: 'NICE TA', frequency: '1–2x weekly', startYear: 2022, yearsOfExperience: 4, @@ -144,6 +185,7 @@ export const skills: SkillMedication[] = [ { id: 'health-system-prescribing', name: 'Health System Prescribing Mgmt', + shortName: 'Prescribing Mgmt', frequency: 'Daily', startYear: 2024, yearsOfExperience: 2, @@ -158,6 +200,7 @@ export const skills: SkillMedication[] = [ { id: 'health-economics', name: 'Health Economics', + shortName: 'Health Econ.', frequency: '1–2x daily', startYear: 2022, yearsOfExperience: 4, @@ -173,6 +216,7 @@ export const skills: SkillMedication[] = [ { id: 'clinical-pathways', name: 'Clinical Pathways', + shortName: 'Pathways', frequency: 'Daily', startYear: 2022, yearsOfExperience: 4, @@ -188,6 +232,7 @@ export const skills: SkillMedication[] = [ { id: 'formulary-commissioning', name: 'Formulary & Commissioning', + shortName: 'Formulary', frequency: 'Weekly', startYear: 2022, yearsOfExperience: 4, @@ -203,6 +248,7 @@ export const skills: SkillMedication[] = [ { id: 'community-pharmacy', name: 'Community Pharmacy Practice', + shortName: 'Community Pharm.', frequency: 'As needed', startYear: 2015, yearsOfExperience: 11, @@ -220,6 +266,7 @@ export const skills: SkillMedication[] = [ { id: 'executive-comms', name: 'Executive Communication', + shortName: 'Exec. Comms', frequency: 'Bi-monthly', startYear: 2024, yearsOfExperience: 2, @@ -234,6 +281,7 @@ export const skills: SkillMedication[] = [ { id: 'financial-modelling', name: 'Financial Scenario Modelling', + shortName: 'Financial Modelling', frequency: 'Weekly', startYear: 2022, yearsOfExperience: 4, @@ -249,6 +297,7 @@ export const skills: SkillMedication[] = [ { id: 'budget-management', name: 'Budget Management', + shortName: 'Budget Mgmt', frequency: '2x weekly', startYear: 2024, yearsOfExperience: 2, @@ -264,6 +313,7 @@ export const skills: SkillMedication[] = [ { id: 'stakeholder-engagement', name: 'Stakeholder Engagement', + shortName: 'Stakeholders', frequency: 'Daily', startYear: 2022, yearsOfExperience: 4, @@ -279,6 +329,7 @@ export const skills: SkillMedication[] = [ { id: 'change-management', name: 'Change Management', + shortName: 'Change Mgmt', frequency: 'As needed', startYear: 2016, yearsOfExperience: 10, @@ -289,6 +340,7 @@ export const skills: SkillMedication[] = [ { id: 'healthcare-leadership', name: 'Healthcare Leadership', + shortName: 'Leadership', frequency: 'Daily', startYear: 2018, yearsOfExperience: 8, diff --git a/src/data/timeline.ts b/src/data/timeline.ts index 1e9d783..81d8ac2 100644 --- a/src/data/timeline.ts +++ b/src/data/timeline.ts @@ -51,6 +51,8 @@ const timelineEntitySeeds: TimelineEntity[] = [ 'sql', 'dashboard-dev', 'ai-prompt-engineering', + 'algorithm-design', + 'data-pipelines', 'medicines-optimisation', 'population-health', 'nice-ta', @@ -71,6 +73,8 @@ const timelineEntitySeeds: TimelineEntity[] = [ sql: 0.95, 'dashboard-dev': 0.8, 'ai-prompt-engineering': 0.85, + 'algorithm-design': 0.9, + 'data-pipelines': 0.8, 'medicines-optimisation': 0.9, 'population-health': 0.95, 'nice-ta': 0.8, @@ -130,6 +134,8 @@ const timelineEntitySeeds: TimelineEntity[] = [ 'sql', 'dashboard-dev', 'ai-prompt-engineering', + 'algorithm-design', + 'data-pipelines', 'medicines-optimisation', 'population-health', 'nice-ta', @@ -150,6 +156,8 @@ const timelineEntitySeeds: TimelineEntity[] = [ sql: 0.9, 'dashboard-dev': 0.8, 'ai-prompt-engineering': 0.8, + 'algorithm-design': 0.8, + 'data-pipelines': 0.75, 'medicines-optimisation': 0.9, 'population-health': 0.95, 'nice-ta': 0.8, @@ -204,6 +212,8 @@ const timelineEntitySeeds: TimelineEntity[] = [ 'python', 'sql', 'dashboard-dev', + 'algorithm-design', + 'data-pipelines', 'medicines-optimisation', 'nice-ta', 'health-economics', @@ -219,6 +229,8 @@ const timelineEntitySeeds: TimelineEntity[] = [ python: 0.8, sql: 0.7, 'dashboard-dev': 0.6, + 'algorithm-design': 0.6, + 'data-pipelines': 0.7, 'medicines-optimisation': 0.8, 'nice-ta': 0.9, 'health-economics': 0.7, @@ -509,7 +521,7 @@ export function buildConstellationData(): { id: skill.id, type: 'skill', label: skill.name, - shortLabel: skill.name.length > 16 ? skill.name.replace('Management', 'Mgmt') : undefined, + shortLabel: skill.shortName ?? (skill.name.length > 16 ? skill.name.replace('Management', 'Mgmt') : undefined), domain: skillDomainByCategory[skill.category], })) diff --git a/src/hooks/useForceSimulation.ts b/src/hooks/useForceSimulation.ts index c0e6daf..ede3d29 100644 --- a/src/hooks/useForceSimulation.ts +++ b/src/hooks/useForceSimulation.ts @@ -13,7 +13,7 @@ import { SKILL_STROKE_WIDTH, SKILL_STROKE_OPACITY, SKILL_SIZE_ROLE_FACTOR, SKILL_GLOW_STD_DEVIATION, SKILL_Y_OFFSET_STEP, SKILL_Y_OFFSET_STEP_MOBILE, - SKILL_Y_GLOBAL_OFFSET_RATIO, SKILL_X_OVERLAP_MAX_RATIO, + SKILL_Y_GLOBAL_OFFSET_RATIO, SKILL_Y_CENTER_BLEND, SKILL_X_OVERLAP_MAX_RATIO, } from '@/components/constellation/constants' import type { SimNode, SimLink, LayoutParams } from '@/components/constellation/types' @@ -357,7 +357,9 @@ export function useForceSimulation( homeX = Math.max(skillZoneLeft, Math.min(skillZoneRight, homeX)) } - const homeY = (skillBaseY.get(n.id) ?? height * 0.5) + (skillYOffset.get(n.id) ?? 0) - height * SKILL_Y_GLOBAL_OFFSET_RATIO + const rawHomeY = (skillBaseY.get(n.id) ?? height * 0.5) + (skillYOffset.get(n.id) ?? 0) - height * SKILL_Y_GLOBAL_OFFSET_RATIO + const belowCenter = height * 0.6 + const homeY = rawHomeY * (1 - SKILL_Y_CENTER_BLEND) + belowCenter * SKILL_Y_CENTER_BLEND return { ...n, x: homeX, y: homeY, vx: 0, vy: 0, homeX, homeY } }) diff --git a/src/types/pmr.ts b/src/types/pmr.ts index 0e7d7a1..86ec3b7 100644 --- a/src/types/pmr.ts +++ b/src/types/pmr.ts @@ -128,6 +128,7 @@ export interface KPI { export interface SkillMedication { id: string name: string + shortName?: string frequency: string startYear: number yearsOfExperience: number