Updated links

This commit is contained in:
2026-02-19 13:30:54 +00:00
parent 9f2be70fd6
commit 5806f7a134
41 changed files with 57 additions and 1970 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -7,7 +7,7 @@
<title>CVMIS: Charlwood, Andrew</title> <title>CVMIS: Charlwood, Andrew</title>
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;700&family=Plus+Jakarta+Sans:wght@400;500;600;700&family=Inter+Tight:wght@400;500;600&family=Inter:wght@400;500;600&family=Geist+Mono:wght@400;500&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;700&family=Plus+Jakarta+Sans:wght@400;500;600;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<script defer src="https://analytics.charlwood.xyz/script.js" data-website-id="075e79d5-433a-4192-91c0-0b5b9c4334ab"></script> <script defer src="https://analytics.charlwood.xyz/script.js" data-website-id="075e79d5-433a-4192-91c0-0b5b9c4334ab"></script>
</head> </head>
+1 -1
View File
@@ -74,7 +74,7 @@ export function CardHeader({ dotColor, title, rightText }: CardHeaderProps) {
textTransform: 'none', textTransform: 'none',
letterSpacing: 'normal', letterSpacing: 'normal',
color: 'var(--text-tertiary)', color: 'var(--text-tertiary)',
fontFamily: "'Geist Mono', monospace", fontFamily: 'var(--font-geist-mono)',
marginLeft: 'auto', marginLeft: 'auto',
} }
+1 -1
View File
@@ -233,7 +233,7 @@ export function DashboardLayout() {
case 'download': { case 'download': {
// For now, open the CV file or trigger a download // For now, open the CV file or trigger a download
// This can be wired to an actual PDF when available // This can be wired to an actual PDF when available
window.open('/References/CV_v4.md', '_blank') window.open('/Andrew_Charlwood_CV.pdf', '_blank')
break break
} }
case 'panel': { case 'panel': {
+3 -3
View File
@@ -252,7 +252,7 @@ export function LoginScreen({ onComplete }: LoginScreenProps) {
style={{ style={{
width: '100%', width: '100%',
padding: '9px 11px', padding: '9px 11px',
fontFamily: "'Geist Mono', 'Fira Code', monospace", fontFamily: 'var(--font-geist-mono)',
fontSize: 'clamp(13px, 1.2vw, 15px)', fontSize: 'clamp(13px, 1.2vw, 15px)',
backgroundColor: activeField === 'username' ? 'var(--surface, #FFFFFF)' : 'var(--bg-dashboard, #F0F5F4)', backgroundColor: activeField === 'username' ? 'var(--surface, #FFFFFF)' : 'var(--bg-dashboard, #F0F5F4)',
border: activeField === 'username' ? '1px solid var(--accent, #0D6E6E)' : '1px solid var(--border-light, #E4EDEB)', border: activeField === 'username' ? '1px solid var(--accent, #0D6E6E)' : '1px solid var(--border-light, #E4EDEB)',
@@ -294,7 +294,7 @@ export function LoginScreen({ onComplete }: LoginScreenProps) {
style={{ style={{
width: '100%', width: '100%',
padding: '9px 11px', padding: '9px 11px',
fontFamily: "'Geist Mono', 'Fira Code', monospace", fontFamily: 'var(--font-geist-mono)',
fontSize: 'clamp(13px, 1.2vw, 15px)', fontSize: 'clamp(13px, 1.2vw, 15px)',
backgroundColor: activeField === 'password' ? 'var(--surface, #FFFFFF)' : 'var(--bg-dashboard, #F0F5F4)', backgroundColor: activeField === 'password' ? 'var(--surface, #FFFFFF)' : 'var(--bg-dashboard, #F0F5F4)',
border: activeField === 'password' ? '1px solid var(--accent, #0D6E6E)' : '1px solid var(--border-light, #E4EDEB)', border: activeField === 'password' ? '1px solid var(--accent, #0D6E6E)' : '1px solid var(--border-light, #E4EDEB)',
@@ -370,7 +370,7 @@ export function LoginScreen({ onComplete }: LoginScreenProps) {
/> />
<span <span
style={{ style={{
fontFamily: "var(--font-geist-mono, 'Geist Mono', monospace)", fontFamily: 'var(--font-geist-mono)',
fontSize: '12px', fontSize: '12px',
color: connectionState === 'connected' ? 'var(--success, #059669)' : 'var(--alert, #DC2626)', color: connectionState === 'connected' ? 'var(--success, #059669)' : 'var(--alert, #DC2626)',
transition: prefersReducedMotion ? 'none' : 'color 300ms ease', transition: prefersReducedMotion ? 'none' : 'color 300ms ease',
+5 -5
View File
@@ -115,7 +115,7 @@ export function MobileOverviewHeader({ onSearchClick }: MobileOverviewHeaderProp
<div style={{ fontSize: '15px', fontWeight: 700, color: 'var(--text-primary)' }}> <div style={{ fontSize: '15px', fontWeight: 700, color: 'var(--text-primary)' }}>
CHARLWOOD, Andrew CHARLWOOD, Andrew
</div> </div>
<div style={{ fontSize: '12px', fontFamily: 'Geist Mono, monospace', color: 'var(--text-secondary)' }}> <div style={{ fontSize: '12px', fontFamily: 'var(--font-geist-mono)', color: 'var(--text-secondary)' }}>
{sidebarCopy.roleTitle} {sidebarCopy.roleTitle}
</div> </div>
</div> </div>
@@ -130,7 +130,7 @@ export function MobileOverviewHeader({ onSearchClick }: MobileOverviewHeaderProp
].map(({ label, value, mono }) => ( ].map(({ label, value, mono }) => (
<div key={label} style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', fontSize: '13px', padding: '2px 0' }}> <div key={label} style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', fontSize: '13px', padding: '2px 0' }}>
<span style={{ color: 'var(--text-tertiary)' }}>{label}</span> <span style={{ color: 'var(--text-tertiary)' }}>{label}</span>
<span style={{ color: 'var(--text-primary)', fontWeight: 500, textAlign: 'right', fontFamily: mono ? 'Geist Mono, monospace' : undefined, fontSize: mono ? '12px' : undefined, letterSpacing: mono ? '0.12em' : undefined }}> <span style={{ color: 'var(--text-primary)', fontWeight: 500, textAlign: 'right', fontFamily: mono ? 'var(--font-geist-mono)' : undefined, fontSize: mono ? '12px' : undefined, letterSpacing: mono ? '0.12em' : undefined }}>
{value} {value}
</span> </span>
</div> </div>
@@ -167,7 +167,7 @@ export function MobileOverviewHeader({ onSearchClick }: MobileOverviewHeaderProp
<div style={{ display: 'flex', flexDirection: 'column', gap: '6px' }}> <div style={{ display: 'flex', flexDirection: 'column', gap: '6px' }}>
{/* Download CV — full width */} {/* Download CV — full width */}
<a <a
href="/References/CV_v4.md" href="/Andrew_Charlwood_CV.pdf"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
aria-label="Download CV" aria-label="Download CV"
@@ -214,7 +214,7 @@ export function MobileOverviewHeader({ onSearchClick }: MobileOverviewHeaderProp
<Send size={16} /> <Send size={16} />
</button> </button>
<a <a
href="https://linkedin.com/in/andycharlwood" href="https://www.linkedin.com/in/andrewcharlwood/"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
aria-label="LinkedIn profile" aria-label="LinkedIn profile"
@@ -233,7 +233,7 @@ export function MobileOverviewHeader({ onSearchClick }: MobileOverviewHeaderProp
<Linkedin size={16} /> <Linkedin size={16} />
</a> </a>
<a <a
href="https://github.com/andycharlwood" href="https://github.com/andrewcharlwood"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
aria-label="GitHub profile" aria-label="GitHub profile"
+2 -2
View File
@@ -77,7 +77,7 @@ export function PhoneCaptcha({ phone }: PhoneCaptchaProps) {
style={{ style={{
fontSize: '11px', fontSize: '11px',
color: error ? 'var(--alert, #e53935)' : 'var(--text-tertiary)', color: error ? 'var(--alert, #e53935)' : 'var(--text-tertiary)',
fontFamily: 'Geist Mono, monospace', fontFamily: 'var(--font-geist-mono)',
transition: 'color 150ms', transition: 'color 150ms',
}} }}
> >
@@ -99,7 +99,7 @@ export function PhoneCaptcha({ phone }: PhoneCaptchaProps) {
width: '36px', width: '36px',
padding: '3px 4px', padding: '3px 4px',
fontSize: '12px', fontSize: '12px',
fontFamily: 'Geist Mono, monospace', fontFamily: 'var(--font-geist-mono)',
border: `1px solid ${error ? 'var(--alert, #e53935)' : 'var(--border)'}`, border: `1px solid ${error ? 'var(--alert, #e53935)' : 'var(--border)'}`,
borderRadius: '4px', borderRadius: '4px',
background: 'var(--surface)', background: 'var(--surface)',
@@ -100,7 +100,7 @@ function SkillRow({ skill, yearsSuffix, onClick, onHighlight, isDimmedByFocus =
style={{ style={{
fontSize: '12px', fontSize: '12px',
color: 'var(--text-tertiary)', color: 'var(--text-tertiary)',
fontFamily: '"Geist Mono", monospace', fontFamily: 'var(--font-geist-mono)',
}} }}
> >
{skill.frequency} · {skill.yearsOfExperience} {yearsSuffix} {skill.frequency} · {skill.yearsOfExperience} {yearsSuffix}
@@ -182,7 +182,7 @@ function CategorySection({
style={{ style={{
fontSize: '11px', fontSize: '11px',
color: 'var(--text-tertiary)', color: 'var(--text-tertiary)',
fontFamily: '"Geist Mono", monospace', fontFamily: 'var(--font-geist-mono)',
whiteSpace: 'nowrap', whiteSpace: 'nowrap',
}} }}
> >
+5 -5
View File
@@ -310,7 +310,7 @@ export default function Sidebar({ activeSection, onNavigate, onSearchClick }: Si
<div <div
style={{ style={{
fontSize: '13px', fontSize: '13px',
fontFamily: 'Geist Mono, monospace', fontFamily: 'var(--font-geist-mono)',
fontWeight: 400, fontWeight: 400,
color: 'var(--text-secondary)', color: 'var(--text-secondary)',
marginTop: '2px', marginTop: '2px',
@@ -341,7 +341,7 @@ export default function Sidebar({ activeSection, onNavigate, onSearchClick }: Si
style={{ style={{
color: 'var(--text-primary)', color: 'var(--text-primary)',
fontWeight: 500, fontWeight: 500,
fontFamily: 'Geist Mono, monospace', fontFamily: 'var(--font-geist-mono)',
fontSize: '12px', fontSize: '12px',
letterSpacing: '0.12em', letterSpacing: '0.12em',
}} }}
@@ -434,7 +434,7 @@ export default function Sidebar({ activeSection, onNavigate, onSearchClick }: Si
</div> </div>
</div> </div>
<a <a
href="/References/CV_v4.md" href="/Andrew_Charlwood_CV.pdf"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
style={{ style={{
@@ -543,7 +543,7 @@ export default function Sidebar({ activeSection, onNavigate, onSearchClick }: Si
</button> </button>
<div style={{ display: 'flex', gap: '6px' }}> <div style={{ display: 'flex', gap: '6px' }}>
<a <a
href="https://linkedin.com/in/andycharlwood" href="https://www.linkedin.com/in/andrewcharlwood/"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
className="sidebar-control" className="sidebar-control"
@@ -568,7 +568,7 @@ export default function Sidebar({ activeSection, onNavigate, onSearchClick }: Si
LinkedIn LinkedIn
</a> </a>
<a <a
href="https://github.com/andycharlwood" href="https://github.com/andrewcharlwood"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
className="sidebar-control" className="sidebar-control"
+2 -2
View File
@@ -91,7 +91,7 @@ export function SkillsAllDetail({ category }: SkillsAllDetailProps) {
style={{ style={{
fontSize: '10px', fontSize: '10px',
color: 'var(--text-tertiary)', color: 'var(--text-tertiary)',
fontFamily: '"Geist Mono", monospace', fontFamily: 'var(--font-geist-mono)',
whiteSpace: 'nowrap', whiteSpace: 'nowrap',
}} }}
> >
@@ -193,7 +193,7 @@ function SkillRow({ skill, yearsSuffix, onClick }: SkillRowProps) {
style={{ style={{
fontSize: '10.5px', fontSize: '10.5px',
color: 'var(--text-tertiary)', color: 'var(--text-tertiary)',
fontFamily: '"Geist Mono", monospace', fontFamily: 'var(--font-geist-mono)',
}} }}
> >
{skill.frequency} · {skill.yearsOfExperience} {yearsSuffix} {skill.frequency} · {skill.yearsOfExperience} {yearsSuffix}
+1 -1
View File
@@ -9,7 +9,7 @@ export const patient: Patient = {
address: 'Norwich, UK', address: 'Norwich, UK',
phone: '07795553088', phone: '07795553088',
email: 'andy@charlwood.xyz', email: 'andy@charlwood.xyz',
linkedin: 'linkedin.com/in/andycharlwood', linkedin: 'linkedin.com/in/andrewcharlwood',
status: 'Active', status: 'Active',
badge: 'Open to opportunities', badge: 'Open to opportunities',
qualification: 'MPharm (Hons) 2:1', qualification: 'MPharm (Hons) 2:1',
+2 -2
View File
@@ -120,14 +120,14 @@ export const profileContent: DeepReadonly<ProfileContent> = {
subtitle: 'Professional profile', subtitle: 'Professional profile',
keywords: 'view linkedin professional profile social networking', keywords: 'view linkedin professional profile social networking',
type: 'link', type: 'link',
url: 'https://linkedin.com/in/andycharlwood', url: 'https://www.linkedin.com/in/andrewcharlwood/',
}, },
{ {
title: 'View Projects', title: 'View Projects',
subtitle: 'GitHub & portfolio', subtitle: 'GitHub & portfolio',
keywords: 'view projects github portfolio code repositories open source', keywords: 'view projects github portfolio code repositories open source',
type: 'link', type: 'link',
url: 'https://github.com/andycharlwood', url: 'https://github.com/andrewcharlwood',
}, },
], ],
}, },
+31 -3
View File
@@ -66,6 +66,34 @@
font-display: swap; font-display: swap;
} }
/* Monospace — Interval Mono */
@font-face {
font-family: 'Interval Mono';
src: url('/Fonts/IntervalMono/WOFF/TBJInterval-Light.woff2') format('woff2'),
url('/Fonts/IntervalMono/WOFF/TBJInterval-Light.woff') format('woff');
font-weight: 300;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Interval Mono';
src: url('/Fonts/IntervalMono/WOFF/TBJInterval-Regular.woff2') format('woff2'),
url('/Fonts/IntervalMono/WOFF/TBJInterval-Regular.woff') format('woff');
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Interval Mono';
src: url('/Fonts/IntervalMono/WOFF/TBJInterval-Bold.woff2') format('woff2'),
url('/Fonts/IntervalMono/WOFF/TBJInterval-Bold.woff') format('woff');
font-weight: 700;
font-style: normal;
font-display: swap;
}
/* Premium UI fonts — Blumir (alternative) */ /* Premium UI fonts — Blumir (alternative) */
@font-face { @font-face {
font-family: 'Blumir'; font-family: 'Blumir';
@@ -89,8 +117,8 @@
--muted: #94A3B8; --muted: #94A3B8;
--card-bg: #FFFFFF; --card-bg: #FFFFFF;
--radius: 16px; --radius: 16px;
--font-primary: 'Plus Jakarta Sans', system-ui, sans-serif; --font-primary: 'Elvaro Grotesque', system-ui, sans-serif;
--font-secondary: 'Inter Tight', system-ui, sans-serif; --font-secondary: 'Blumir', system-ui, sans-serif;
/* Typography — Elvaro Grotesque primary, Blumir alternative */ /* Typography — Elvaro Grotesque primary, Blumir alternative */
--font-ui: 'Elvaro Grotesque', system-ui, sans-serif; --font-ui: 'Elvaro Grotesque', system-ui, sans-serif;
@@ -131,7 +159,7 @@
--shadow-md: 0 2px 8px rgba(26,43,42,0.08); --shadow-md: 0 2px 8px rgba(26,43,42,0.08);
--shadow-lg: 0 8px 32px rgba(26,43,42,0.12); --shadow-lg: 0 8px 32px rgba(26,43,42,0.12);
--font-body: var(--font-ui); --font-body: var(--font-ui);
--font-mono-dashboard: 'Geist Mono', 'Fira Code', monospace; --font-mono-dashboard: 'Interval Mono', 'Fira Code', monospace;
/* Detail panel */ /* Detail panel */
--panel-narrow: 400px; --panel-narrow: 400px;
+1 -1
View File
@@ -72,7 +72,7 @@ export default {
mono: ['Fira Code', 'monospace'], mono: ['Fira Code', 'monospace'],
ui: ['Elvaro Grotesque', 'system-ui', 'sans-serif'], ui: ['Elvaro Grotesque', 'system-ui', 'sans-serif'],
'ui-alt': ['Blumir', 'system-ui', 'sans-serif'], 'ui-alt': ['Blumir', 'system-ui', 'sans-serif'],
geist: ['Geist Mono', 'Fira Code', 'monospace'], geist: ['Interval Mono', 'Fira Code', 'monospace'],
}, },
boxShadow: { boxShadow: {
// GP System three-tier shadow system // GP System three-tier shadow system
-33
View File
@@ -1,33 +0,0 @@
{
"cachedGrowthBookFeatures": {
"tengu_mcp_tool_search": false,
"tengu_scratch": false,
"tengu_amber_flint": true,
"tengu_disable_bypass_permissions_mode": false,
"tengu_1p_event_batch_config": {
"scheduledDelayMillis": 5000,
"maxExportBatchSize": 200,
"maxQueueSize": 8192
},
"tengu_event_sampling_config": {},
"tengu_log_segment_events": false,
"tengu_log_datadog_events": true,
"tengu_marble_anvil": true,
"tengu_tool_pear": false,
"tengu_scarf_coffee": false,
"tengu_keybinding_customization_release": true,
"tengu_penguins_enabled": true,
"tengu_thinkback": false,
"tengu_chomp_inflection": true
},
"firstStartTime": "2026-02-18T16:02:41.493Z",
"userID": "00a55e1c90694b4627ba826b33cf7ced401ac04b89f0d60336d6762b6f4f70cb",
"opusProMigrationComplete": true,
"sonnet1m45MigrationComplete": true,
"clientDataCache": {
"data": null,
"timestamp": 1771430561577
},
"cachedChromeExtensionInstalled": false,
"changelogLastFetched": 1771430561701
}
@@ -1,3 +0,0 @@
{
"firstStartTime": "2026-02-18T16:02:41.493Z"
}
File diff suppressed because it is too large Load Diff
@@ -1,175 +0,0 @@
2026-02-18T16:02:41.496Z [ERROR] Failed to save config with lock: Error: ENOENT: no such file or directory, lstat '/home/andy/github/portfolio/~/.claude/projects/.claude.json'
2026-02-18T16:02:41.497Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561497
2026-02-18T16:02:41.497Z [DEBUG] Setting permissions for new file: 600
2026-02-18T16:02:41.497Z [DEBUG] Temp file written successfully, size: 50 bytes
2026-02-18T16:02:41.497Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561497 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.497Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.497Z [DEBUG] [init] configureGlobalMTLS starting
2026-02-18T16:02:41.497Z [DEBUG] [init] configureGlobalMTLS complete
2026-02-18T16:02:41.497Z [DEBUG] [init] configureGlobalAgents starting
2026-02-18T16:02:41.497Z [DEBUG] [init] configureGlobalAgents complete
2026-02-18T16:02:41.500Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561500
2026-02-18T16:02:41.500Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.500Z [DEBUG] Temp file written successfully, size: 130 bytes
2026-02-18T16:02:41.500Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.500Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561500 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.500Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.505Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561505
2026-02-18T16:02:41.505Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.505Z [DEBUG] Temp file written successfully, size: 166 bytes
2026-02-18T16:02:41.505Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.505Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561505 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.505Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.507Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561507
2026-02-18T16:02:41.507Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.507Z [DEBUG] Temp file written successfully, size: 205 bytes
2026-02-18T16:02:41.507Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.507Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561507 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.507Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.515Z [DEBUG] Applying permission update: Adding 54 allow rule(s) to destination 'localSettings': ["Bash(powershell -Command \"$lines = Get-Content ''4-vitals-monitor.html''; $before = $lines[0..1757]; $after = $lines[2028..\\($lines.Length-1\\)]; \\($before + $after\\) | Set-Content ''4-vitals-monitor.html'' -Encoding UTF8\")","Bash(powershell -Command \"$lines = Get-Content ''4-vitals-monitor.html''; $before = $lines[0..1757]; $after = $lines[2028..\\($lines.Length-1\\)]; $result = $before + $after; $result | Set-Content ''4-vitals-monitor.html'' -Encoding UTF8\")","Bash(powershell -ExecutionPolicy Bypass -File:*)","Bash(del \"C:\\\\Users\\\\Andy\\\\Ralph Local\\\\Tasks\\\\cv-4-vitals-monitor\\\\remove-lines.ps1\")","Bash(start \"\" \"C:\\\\Users\\\\Andy\\\\Ralph Local\\\\Tasks\\\\cv-4-vitals-monitor\\\\4-vitals-monitor.html\")","Bash(npx skills find:*)","WebSearch","Bash(ls \"C:\\\\Users\\\\Andy\\\\Ralph Local\\\\Tasks\\\\New CV website\\\\designs\"\" 2>nul || echo \"Directory does not exist \")","Bash(npm run typecheck:*)","Bash(npm run dev:*)","Bash(npm run build:*)","Bash(dir:*)","mcp__playwright__browser_snapshot","mcp__playwright__browser_navigate","mcp__playwright__browser_take_screenshot","Bash(npm run lint:*)","Bash(curl:*)","mcp__playwright__browser_click","mcp__playwright__browser_wait_for","mcp__playwright__browser_evaluate","Bash(git add:*)","Bash(git commit -m \"$\\(cat <<''EOF''\nTask 4: Rebuild PatientBanner with premium fonts, tooltip, and animations\n\n- Replace font-inter with font-ui \\(Elvaro Grotesque\\) throughout banner\n- Add custom NHSNumberWithTooltip with Framer Motion animated reveal\n- Add AnimatePresence crossfade between full/condensed banner states\n- Animate mobile overflow menu enter/exit\n- Add SkipButton to App.tsx for boot/ECG phase skip\n- Add shadow-pmr-banner, focus ring styles, prefers-reduced-motion support\n- Fix mobile banner to use patient data instead of hardcoded values\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\nEOF\n\\)\")","Bash(git commit:*)","Bash(ls:*)","Bash(tasklist:*)","Bash(npx -y serve -l 3333 .)","Bash(npx serve:*)","Bash(timeout /t 3 /nobreak)","Bash(jq:*)","Bash(git stash:*)","Bash(npx tsc:*)","mcp__context7__resolve-library-id","Bash(wc:*)","Bash(python3:*)","Bash(pip install:*)","Bash(python scripts/generate_demo_data.py:*)","Bash(sqlite3:*)","Bash(python:*)","Bash(grep:*)","WebFetch(domain:www.embla-carousel.com)","Bash(npm ls:*)","Bash(npm install:*)","mcp__plugin_playwright_playwright__browser_navigate","mcp__plugin_playwright_playwright__browser_take_screenshot","mcp__plugin_playwright_playwright__browser_click","mcp__plugin_playwright_playwright__browser_wait_for","mcp__plugin_playwright_playwright__browser_snapshot","mcp__plugin_playwright_playwright__browser_resize","mcp__plugin_playwright_playwright__browser_evaluate","mcp__plugin_playwright_playwright__browser_press_key","Bash(npx eslint:*)","Bash(git checkout:*)","mcp__plugin_playwright_playwright__browser_hover","mcp__plugin_playwright_playwright__browser_run_code"]
2026-02-18T16:02:41.515Z [DEBUG] [STARTUP] Loading MCP configs...
2026-02-18T16:02:41.540Z [DEBUG] [ToolSearch:optimistic] mode=tst-auto, ENABLE_TOOL_SEARCH=undefined, result=true
2026-02-18T16:02:41.540Z [DEBUG] [STARTUP] Running setup()...
2026-02-18T16:02:41.547Z [DEBUG] [TeammateModeSnapshot] Captured from config: auto
2026-02-18T16:02:41.548Z [DEBUG] Loading skills from: managed=/etc/claude-code/.claude/skills, user=~/.claude/projects/skills, project=[/home/andy/github/portfolio/.claude/skills]
2026-02-18T16:02:41.557Z [DEBUG] Error log sink initialized
2026-02-18T16:02:41.571Z [DEBUG] [STARTUP] setup() completed in 31ms
2026-02-18T16:02:41.571Z [DEBUG] [STARTUP] Loading commands and agents...
2026-02-18T16:02:41.574Z [DEBUG] Loaded 7 unique skills (7 unconditional, 0 conditional, managed: 0, user: 0, project: 7, additional: 0, legacy commands: 0)
2026-02-18T16:02:41.576Z [DEBUG] [Claude in Chrome] Found chrome profiles: Default
2026-02-18T16:02:41.576Z [DEBUG] Found 0 plugins (0 enabled, 0 disabled)
2026-02-18T16:02:41.576Z [DEBUG] getPluginSkills: Processing 0 enabled plugins
2026-02-18T16:02:41.576Z [DEBUG] Total plugin skills loaded: 0
2026-02-18T16:02:41.576Z [DEBUG] Total plugin commands loaded: 0
2026-02-18T16:02:41.576Z [DEBUG] Registered 0 hooks from 0 plugins
2026-02-18T16:02:41.576Z [DEBUG] Total plugin agents loaded: 0
2026-02-18T16:02:41.577Z [DEBUG] getSkills returning: 7 skill dir commands, 0 plugin skills, 2 bundled skills
2026-02-18T16:02:41.578Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561578
2026-02-18T16:02:41.578Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.578Z [DEBUG] Temp file written successfully, size: 282 bytes
2026-02-18T16:02:41.578Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.578Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561578 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.578Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.579Z [DEBUG] [STARTUP] Commands and agents loaded in 8ms
2026-02-18T16:02:41.587Z [DEBUG] [STARTUP] Running showSetupScreens()...
2026-02-18T16:02:41.597Z [DEBUG] [keybindings] KeybindingSetup initialized with 102 bindings, 0 warnings
2026-02-18T16:02:41.648Z [DEBUG] [keybindings] Skipping file watcher - user customization disabled
2026-02-18T16:02:41.664Z [DEBUG] [Claude in Chrome] Extension not found in any browser
2026-02-18T16:02:41.665Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561665
2026-02-18T16:02:41.665Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.665Z [DEBUG] Temp file written successfully, size: 325 bytes
2026-02-18T16:02:41.665Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.665Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561665 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.665Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.667Z [DEBUG] Git remote URL: http://192.168.8.143:3000/admin/portfolio/
2026-02-18T16:02:41.667Z [DEBUG] Could not parse repository from: http://192.168.8.143:3000/admin/portfolio/
2026-02-18T16:02:41.667Z [DEBUG] Parsed repository: null from URL: http://192.168.8.143:3000/admin/portfolio/
2026-02-18T16:02:41.702Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561702
2026-02-18T16:02:41.702Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.702Z [DEBUG] Temp file written successfully, size: 366 bytes
2026-02-18T16:02:41.702Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.702Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561702 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.702Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.784Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561784
2026-02-18T16:02:41.784Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.784Z [DEBUG] Temp file written successfully, size: 438 bytes
2026-02-18T16:02:41.784Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.784Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561784 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.785Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.785Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561785
2026-02-18T16:02:41.785Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.785Z [DEBUG] Temp file written successfully, size: 466 bytes
2026-02-18T16:02:41.785Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.785Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561785 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.785Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.786Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561786
2026-02-18T16:02:41.786Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.787Z [DEBUG] Temp file written successfully, size: 497 bytes
2026-02-18T16:02:41.787Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.787Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561786 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.787Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.787Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561787
2026-02-18T16:02:41.787Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.787Z [DEBUG] Temp file written successfully, size: 549 bytes
2026-02-18T16:02:41.787Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.788Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561787 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.788Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.788Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561788
2026-02-18T16:02:41.788Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.788Z [DEBUG] Temp file written successfully, size: 689 bytes
2026-02-18T16:02:41.788Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.789Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561788 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.790Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.790Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561790
2026-02-18T16:02:41.790Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.790Z [DEBUG] Temp file written successfully, size: 728 bytes
2026-02-18T16:02:41.790Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.790Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561790 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.791Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.791Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561791
2026-02-18T16:02:41.791Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.792Z [DEBUG] Temp file written successfully, size: 767 bytes
2026-02-18T16:02:41.792Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.792Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561791 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.792Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.792Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561792
2026-02-18T16:02:41.792Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.792Z [DEBUG] Temp file written successfully, size: 805 bytes
2026-02-18T16:02:41.792Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.792Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561792 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.793Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.793Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561793
2026-02-18T16:02:41.794Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.794Z [DEBUG] Temp file written successfully, size: 837 bytes
2026-02-18T16:02:41.794Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.794Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561793 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.794Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.794Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561794
2026-02-18T16:02:41.794Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.794Z [DEBUG] Temp file written successfully, size: 867 bytes
2026-02-18T16:02:41.794Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.794Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561794 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.795Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.795Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561795
2026-02-18T16:02:41.795Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.795Z [DEBUG] Temp file written successfully, size: 900 bytes
2026-02-18T16:02:41.795Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.795Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561795 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.795Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.796Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561796
2026-02-18T16:02:41.796Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.796Z [DEBUG] Temp file written successfully, size: 952 bytes
2026-02-18T16:02:41.796Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.796Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561796 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.796Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.797Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561797
2026-02-18T16:02:41.797Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.797Z [DEBUG] Temp file written successfully, size: 988 bytes
2026-02-18T16:02:41.797Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.797Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561797 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.797Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.798Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561798
2026-02-18T16:02:41.798Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.798Z [DEBUG] Temp file written successfully, size: 1018 bytes
2026-02-18T16:02:41.798Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.798Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561798 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.798Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.799Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430561799
2026-02-18T16:02:41.799Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:41.799Z [DEBUG] Temp file written successfully, size: 1054 bytes
2026-02-18T16:02:41.799Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:41.799Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430561799 to ~/.claude/projects/.claude.json
2026-02-18T16:02:41.799Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:41.925Z [DEBUG] High write ratio: blit=928, write=1833 (66.4% writes), screen=36x252
2026-02-18T16:02:51.731Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430571731
2026-02-18T16:02:51.731Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:51.731Z [DEBUG] Temp file written successfully, size: 1054 bytes
2026-02-18T16:02:51.731Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:51.731Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430571731 to ~/.claude/projects/.claude.json
2026-02-18T16:02:51.731Z [DEBUG] File ~/.claude/projects/.claude.json written atomically
2026-02-18T16:02:51.732Z [DEBUG] Writing to temp file: ~/.claude/projects/.claude.json.tmp.254432.1771430571732
2026-02-18T16:02:51.732Z [DEBUG] Preserving file permissions: 100600
2026-02-18T16:02:51.732Z [DEBUG] Temp file written successfully, size: 1054 bytes
2026-02-18T16:02:51.732Z [DEBUG] Applied original permissions to temp file
2026-02-18T16:02:51.732Z [DEBUG] Renaming ~/.claude/projects/.claude.json.tmp.254432.1771430571732 to ~/.claude/projects/.claude.json
2026-02-18T16:02:51.732Z [DEBUG] File ~/.claude/projects/.claude.json written atomically