Fixed a few skills

This commit is contained in:
2026-02-19 19:54:18 +00:00
parent cb1c958f68
commit 72d159484f
7 changed files with 79 additions and 9 deletions
+3 -1
View File
@@ -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]" className="md:hidden px-3 py-2 rounded-xl text-xs font-medium max-w-[200px]"
style={{ style={{
position: 'fixed', 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', right: '16px',
background: 'var(--surface)', background: 'var(--surface)',
color: 'var(--text-primary)', color: 'var(--text-primary)',
+3 -2
View File
@@ -45,9 +45,10 @@ export const SKILL_GLOW_STD_DEVIATION = 2.5
export const SKILL_ACTIVE_STROKE_OPACITY = 0.1 export const SKILL_ACTIVE_STROKE_OPACITY = 0.1
// Skill overlap offsets // Skill overlap offsets
export const SKILL_Y_OFFSET_STEP = 25 export const SKILL_Y_OFFSET_STEP = 35
export const SKILL_Y_OFFSET_STEP_MOBILE = 20 export const SKILL_Y_OFFSET_STEP_MOBILE = 26
export const SKILL_Y_GLOBAL_OFFSET_RATIO = -0.05 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 export const SKILL_X_OVERLAP_MAX_RATIO = 1
// Entry animation // Entry animation
export const ENTRY_GUIDE_FADE_MS = 200 export const ENTRY_GUIDE_FADE_MS = 200
+1 -1
View File
@@ -91,7 +91,7 @@ Mathematics A*, Chemistry B, Politics C.
Professional registration required to practise as a pharmacist in Great Britain. Professional registration required to practise as a pharmacist in Great Britain.
## Skills ## 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, 34x daily), [skill-population-health] Population Health (2yr, daily), [skill-nice-ta] NICE TA Implementation (4yr, 12x weekly), [skill-health-system-prescribing] Health System Prescribing Mgmt (2yr, daily), [skill-health-economics] Health Economics (4yr, 12x daily), [skill-clinical-pathways] Clinical Pathways (4yr, daily), [skill-formulary-commissioning] Formulary & Commissioning (4yr, weekly), [skill-community-pharmacy] Community Pharmacy Practice (11yr, as needed) Clinical: [skill-medicines-optimisation] Medicines Optimisation (10yr, 34x daily), [skill-population-health] Population Health (2yr, daily), [skill-nice-ta] NICE TA Implementation (4yr, 12x weekly), [skill-health-system-prescribing] Health System Prescribing Mgmt (2yr, daily), [skill-health-economics] Health Economics (4yr, 12x 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) 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)
+54 -2
View File
@@ -5,6 +5,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'data-analysis', id: 'data-analysis',
name: 'Data Analysis', name: 'Data Analysis',
shortName: 'Data Analysis',
frequency: '4x daily', frequency: '4x daily',
startYear: 2016, startYear: 2016,
yearsOfExperience: 10, yearsOfExperience: 10,
@@ -53,6 +54,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'dashboard-dev', id: 'dashboard-dev',
name: 'Dashboard Development', name: 'Dashboard Development',
shortName: 'Dashboards',
frequency: 'Weekly', frequency: 'Weekly',
startYear: 2023, startYear: 2023,
yearsOfExperience: 3, yearsOfExperience: 3,
@@ -67,7 +69,8 @@ export const skills: SkillMedication[] = [
}, },
{ {
id: 'ai-prompt-engineering', id: 'ai-prompt-engineering',
name: 'AI & Prompt Engineering', name: 'AI Integration & Automation',
shortName: 'AI Integration',
frequency: '4x daily', frequency: '4x daily',
startYear: 2024, startYear: 2024,
yearsOfExperience: 2, yearsOfExperience: 2,
@@ -82,9 +85,10 @@ export const skills: SkillMedication[] = [
{ {
id: 'javascript-typescript', id: 'javascript-typescript',
name: 'JavaScript / TypeScript', name: 'JavaScript / TypeScript',
shortName: 'JS / TS',
frequency: 'As needed', frequency: 'As needed',
startYear: 2020, startYear: 2020,
yearsOfExperience: 6, yearsOfExperience: 4,
category: 'Technical', category: 'Technical',
status: 'Active', status: 'Active',
icon: 'FileCode2', 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) // Clinical (8 skills)
{ {
id: 'medicines-optimisation', id: 'medicines-optimisation',
name: 'Medicines Optimisation', name: 'Medicines Optimisation',
shortName: 'Medicines Opt.',
frequency: '34x daily', frequency: '34x daily',
startYear: 2016, startYear: 2016,
yearsOfExperience: 10, yearsOfExperience: 10,
@@ -115,6 +154,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'population-health', id: 'population-health',
name: 'Population Health', name: 'Population Health',
shortName: 'Pop. Health',
frequency: 'Daily', frequency: 'Daily',
startYear: 2024, startYear: 2024,
yearsOfExperience: 2, yearsOfExperience: 2,
@@ -129,6 +169,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'nice-ta', id: 'nice-ta',
name: 'NICE TA Implementation', name: 'NICE TA Implementation',
shortName: 'NICE TA',
frequency: '12x weekly', frequency: '12x weekly',
startYear: 2022, startYear: 2022,
yearsOfExperience: 4, yearsOfExperience: 4,
@@ -144,6 +185,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'health-system-prescribing', id: 'health-system-prescribing',
name: 'Health System Prescribing Mgmt', name: 'Health System Prescribing Mgmt',
shortName: 'Prescribing Mgmt',
frequency: 'Daily', frequency: 'Daily',
startYear: 2024, startYear: 2024,
yearsOfExperience: 2, yearsOfExperience: 2,
@@ -158,6 +200,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'health-economics', id: 'health-economics',
name: 'Health Economics', name: 'Health Economics',
shortName: 'Health Econ.',
frequency: '12x daily', frequency: '12x daily',
startYear: 2022, startYear: 2022,
yearsOfExperience: 4, yearsOfExperience: 4,
@@ -173,6 +216,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'clinical-pathways', id: 'clinical-pathways',
name: 'Clinical Pathways', name: 'Clinical Pathways',
shortName: 'Pathways',
frequency: 'Daily', frequency: 'Daily',
startYear: 2022, startYear: 2022,
yearsOfExperience: 4, yearsOfExperience: 4,
@@ -188,6 +232,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'formulary-commissioning', id: 'formulary-commissioning',
name: 'Formulary & Commissioning', name: 'Formulary & Commissioning',
shortName: 'Formulary',
frequency: 'Weekly', frequency: 'Weekly',
startYear: 2022, startYear: 2022,
yearsOfExperience: 4, yearsOfExperience: 4,
@@ -203,6 +248,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'community-pharmacy', id: 'community-pharmacy',
name: 'Community Pharmacy Practice', name: 'Community Pharmacy Practice',
shortName: 'Community Pharm.',
frequency: 'As needed', frequency: 'As needed',
startYear: 2015, startYear: 2015,
yearsOfExperience: 11, yearsOfExperience: 11,
@@ -220,6 +266,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'executive-comms', id: 'executive-comms',
name: 'Executive Communication', name: 'Executive Communication',
shortName: 'Exec. Comms',
frequency: 'Bi-monthly', frequency: 'Bi-monthly',
startYear: 2024, startYear: 2024,
yearsOfExperience: 2, yearsOfExperience: 2,
@@ -234,6 +281,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'financial-modelling', id: 'financial-modelling',
name: 'Financial Scenario Modelling', name: 'Financial Scenario Modelling',
shortName: 'Financial Modelling',
frequency: 'Weekly', frequency: 'Weekly',
startYear: 2022, startYear: 2022,
yearsOfExperience: 4, yearsOfExperience: 4,
@@ -249,6 +297,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'budget-management', id: 'budget-management',
name: 'Budget Management', name: 'Budget Management',
shortName: 'Budget Mgmt',
frequency: '2x weekly', frequency: '2x weekly',
startYear: 2024, startYear: 2024,
yearsOfExperience: 2, yearsOfExperience: 2,
@@ -264,6 +313,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'stakeholder-engagement', id: 'stakeholder-engagement',
name: 'Stakeholder Engagement', name: 'Stakeholder Engagement',
shortName: 'Stakeholders',
frequency: 'Daily', frequency: 'Daily',
startYear: 2022, startYear: 2022,
yearsOfExperience: 4, yearsOfExperience: 4,
@@ -279,6 +329,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'change-management', id: 'change-management',
name: 'Change Management', name: 'Change Management',
shortName: 'Change Mgmt',
frequency: 'As needed', frequency: 'As needed',
startYear: 2016, startYear: 2016,
yearsOfExperience: 10, yearsOfExperience: 10,
@@ -289,6 +340,7 @@ export const skills: SkillMedication[] = [
{ {
id: 'healthcare-leadership', id: 'healthcare-leadership',
name: 'Healthcare Leadership', name: 'Healthcare Leadership',
shortName: 'Leadership',
frequency: 'Daily', frequency: 'Daily',
startYear: 2018, startYear: 2018,
yearsOfExperience: 8, yearsOfExperience: 8,
+13 -1
View File
@@ -51,6 +51,8 @@ const timelineEntitySeeds: TimelineEntity[] = [
'sql', 'sql',
'dashboard-dev', 'dashboard-dev',
'ai-prompt-engineering', 'ai-prompt-engineering',
'algorithm-design',
'data-pipelines',
'medicines-optimisation', 'medicines-optimisation',
'population-health', 'population-health',
'nice-ta', 'nice-ta',
@@ -71,6 +73,8 @@ const timelineEntitySeeds: TimelineEntity[] = [
sql: 0.95, sql: 0.95,
'dashboard-dev': 0.8, 'dashboard-dev': 0.8,
'ai-prompt-engineering': 0.85, 'ai-prompt-engineering': 0.85,
'algorithm-design': 0.9,
'data-pipelines': 0.8,
'medicines-optimisation': 0.9, 'medicines-optimisation': 0.9,
'population-health': 0.95, 'population-health': 0.95,
'nice-ta': 0.8, 'nice-ta': 0.8,
@@ -130,6 +134,8 @@ const timelineEntitySeeds: TimelineEntity[] = [
'sql', 'sql',
'dashboard-dev', 'dashboard-dev',
'ai-prompt-engineering', 'ai-prompt-engineering',
'algorithm-design',
'data-pipelines',
'medicines-optimisation', 'medicines-optimisation',
'population-health', 'population-health',
'nice-ta', 'nice-ta',
@@ -150,6 +156,8 @@ const timelineEntitySeeds: TimelineEntity[] = [
sql: 0.9, sql: 0.9,
'dashboard-dev': 0.8, 'dashboard-dev': 0.8,
'ai-prompt-engineering': 0.8, 'ai-prompt-engineering': 0.8,
'algorithm-design': 0.8,
'data-pipelines': 0.75,
'medicines-optimisation': 0.9, 'medicines-optimisation': 0.9,
'population-health': 0.95, 'population-health': 0.95,
'nice-ta': 0.8, 'nice-ta': 0.8,
@@ -204,6 +212,8 @@ const timelineEntitySeeds: TimelineEntity[] = [
'python', 'python',
'sql', 'sql',
'dashboard-dev', 'dashboard-dev',
'algorithm-design',
'data-pipelines',
'medicines-optimisation', 'medicines-optimisation',
'nice-ta', 'nice-ta',
'health-economics', 'health-economics',
@@ -219,6 +229,8 @@ const timelineEntitySeeds: TimelineEntity[] = [
python: 0.8, python: 0.8,
sql: 0.7, sql: 0.7,
'dashboard-dev': 0.6, 'dashboard-dev': 0.6,
'algorithm-design': 0.6,
'data-pipelines': 0.7,
'medicines-optimisation': 0.8, 'medicines-optimisation': 0.8,
'nice-ta': 0.9, 'nice-ta': 0.9,
'health-economics': 0.7, 'health-economics': 0.7,
@@ -509,7 +521,7 @@ export function buildConstellationData(): {
id: skill.id, id: skill.id,
type: 'skill', type: 'skill',
label: skill.name, 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], domain: skillDomainByCategory[skill.category],
})) }))
+4 -2
View File
@@ -13,7 +13,7 @@ import {
SKILL_STROKE_WIDTH, SKILL_STROKE_OPACITY, SKILL_SIZE_ROLE_FACTOR, SKILL_STROKE_WIDTH, SKILL_STROKE_OPACITY, SKILL_SIZE_ROLE_FACTOR,
SKILL_GLOW_STD_DEVIATION, SKILL_GLOW_STD_DEVIATION,
SKILL_Y_OFFSET_STEP, SKILL_Y_OFFSET_STEP_MOBILE, 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' } from '@/components/constellation/constants'
import type { SimNode, SimLink, LayoutParams } from '@/components/constellation/types' import type { SimNode, SimLink, LayoutParams } from '@/components/constellation/types'
@@ -357,7 +357,9 @@ export function useForceSimulation(
homeX = Math.max(skillZoneLeft, Math.min(skillZoneRight, homeX)) 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 } return { ...n, x: homeX, y: homeY, vx: 0, vy: 0, homeX, homeY }
}) })
+1
View File
@@ -128,6 +128,7 @@ export interface KPI {
export interface SkillMedication { export interface SkillMedication {
id: string id: string
name: string name: string
shortName?: string
frequency: string frequency: string
startYear: number startYear: number
yearsOfExperience: number yearsOfExperience: number