From b34ecb89e2cf39ddf4b519790ef47336981e0946 Mon Sep 17 00:00:00 2001 From: Andy Charlwood Date: Mon, 16 Feb 2026 13:27:51 +0000 Subject: [PATCH] clean up --- .../ACCESSIBILITY.md | 111 +++ .../DESIGN-SYSTEM-TEMPLATE.md | 577 ++++++++++++++ .../MOTION-SPEC.md | 72 ++ .../RESPONSIVE-DESIGN.md | 90 +++ .../bencium-innovative-ux-designer/SKILL.md | 718 ++++++++++++++++++ CLAUDE.md | 218 ------ current_login.jpg | Bin 108866 -> 0 bytes 7 files changed, 1568 insertions(+), 218 deletions(-) create mode 100644 .agent/.agent/skills/bencium-innovative-ux-designer/ACCESSIBILITY.md create mode 100644 .agent/.agent/skills/bencium-innovative-ux-designer/DESIGN-SYSTEM-TEMPLATE.md create mode 100644 .agent/.agent/skills/bencium-innovative-ux-designer/MOTION-SPEC.md create mode 100644 .agent/.agent/skills/bencium-innovative-ux-designer/RESPONSIVE-DESIGN.md create mode 100644 .agent/.agent/skills/bencium-innovative-ux-designer/SKILL.md delete mode 100644 CLAUDE.md delete mode 100644 current_login.jpg diff --git a/.agent/.agent/skills/bencium-innovative-ux-designer/ACCESSIBILITY.md b/.agent/.agent/skills/bencium-innovative-ux-designer/ACCESSIBILITY.md new file mode 100644 index 0000000..d514f4e --- /dev/null +++ b/.agent/.agent/skills/bencium-innovative-ux-designer/ACCESSIBILITY.md @@ -0,0 +1,111 @@ +# Accessibility Essentials + +Accessibility enables creativity - it's a foundation, not a limitation. WCAG 2.1 AA compliance. + +## Core Principles (POUR) + +- **Perceivable**: Content must be perceivable (alt text, contrast, captions) +- **Operable**: UI must be keyboard/touch accessible +- **Understandable**: Clear, predictable behavior +- **Robust**: Works with assistive technologies + +## Contrast Requirements + +| Element | Minimum Ratio | +|---------|---------------| +| Normal text | 4.5:1 | +| Large text (18pt+) | 3:1 | +| UI components | 3:1 | + +**Tools**: Chrome DevTools Accessibility tab, WebAIM Contrast Checker + +## Keyboard Navigation + +```tsx +// All interactive elements need focus states + + +// Custom elements need tabindex and key handlers +
(e.key === 'Enter' || e.key === ' ') && handleClick()} +> + Custom Button +
+``` + +**Essentials:** +- Tab through entire interface +- Enter/Space activates elements +- Escape closes modals +- Visible focus indicators always + +## Essential ARIA + +```tsx +// Buttons without text + + +// Expandable elements + + +// Live regions for dynamic content +
{statusMessage}
+
{errorMessage}
+ +// Form errors + +{hasError && } +``` + +## Semantic HTML + +```tsx +// Use semantic elements, not divs +
+

...

+ + +// Heading hierarchy (never skip levels) +

Page Title

+

Section

+

Subsection

+``` + +## Touch Targets + +- Minimum **44x44px** for all interactive elements +- Adequate spacing between targets +- `touch-manipulation` CSS for responsive touch + +## Screen Reader Content + +```tsx +// Hidden but announced +Additional context + +// Skip link + + Skip to main content + +``` + +## Quick Checklist + +- [ ] Keyboard: Can tab through everything +- [ ] Focus: Visible focus indicators +- [ ] Contrast: 4.5:1 for text +- [ ] Alt text: All images have appropriate alt +- [ ] Headings: Logical h1-h6 hierarchy +- [ ] Forms: Labels associated with inputs +- [ ] Errors: Announced to screen readers +- [ ] Touch: 44px minimum targets + +## Resources + +- [WCAG 2.1 Quick Reference](https://www.w3.org/WAI/WCAG21/quickref/) +- [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/) +- [ARIA Authoring Practices](https://www.w3.org/WAI/ARIA/apg/) diff --git a/.agent/.agent/skills/bencium-innovative-ux-designer/DESIGN-SYSTEM-TEMPLATE.md b/.agent/.agent/skills/bencium-innovative-ux-designer/DESIGN-SYSTEM-TEMPLATE.md new file mode 100644 index 0000000..e968748 --- /dev/null +++ b/.agent/.agent/skills/bencium-innovative-ux-designer/DESIGN-SYSTEM-TEMPLATE.md @@ -0,0 +1,577 @@ +# Design System Template + +Meta-framework for understanding what's fixed, project-specific, and adaptable in your design system. + +## Purpose + +This template helps you distinguish between: +- **Fixed Elements**: Universal rules that never change +- **Project-Specific Elements**: Filled in for each project based on brand +- **Adaptable Elements**: Context-dependent implementations + +--- + +## I. FIXED ELEMENTS + +These foundations remain consistent across all projects, regardless of brand or context. + +### 1. Spacing Scale + +**Fixed System:** +``` +4px, 8px, 12px, 16px, 24px, 32px, 48px, 64px, 96px +``` + +**Usage:** +- Margins, padding, gaps between elements +- Mathematical relationships ensure visual harmony +- Use multipliers of base unit (4px) + +**Why Fixed:** +Consistent spacing creates visual rhythm regardless of brand personality. + +### 2. Grid System + +**Fixed Structure:** +- **12-column grid** for most layouts (divisible by 2, 3, 4, 6) +- **16-column grid** for data-heavy interfaces +- **Gutters**: 16px (mobile), 24px (tablet), 32px (desktop) + +**Why Fixed:** +Grid provides structural order. Brand personality shows through color, typography, content—not grid structure. + +### 3. Accessibility Standards + +**Fixed Requirements:** +- **WCAG 2.1 AA** compliance minimum +- **Contrast**: 4.5:1 for normal text, 3:1 for large text +- **Touch targets**: Minimum 44×44px +- **Keyboard navigation**: All interactive elements accessible +- **Screen reader**: Semantic HTML, ARIA labels where needed + +**Why Fixed:** +Accessibility is not negotiable. It's a baseline requirement for ethical, legal, and usable products. + +### 4. Typography Hierarchy Logic + +**Fixed Structure:** +- **Mathematical scaling**: 1.25x (major third) or 1.333x (perfect fourth) +- **Hierarchy levels**: Display → H1 → H2 → H3 → Body → Small → Caption +- **Line height**: 1.5x for body text, 1.2-1.3x for headlines +- **Line length**: 45-75 characters optimal + +**Why Fixed:** +Mathematical relationships create predictable, harmonious hierarchy. Specific fonts change, but the logic doesn't. + +### 5. Component Architecture + +**Fixed Patterns:** +- **Button states**: Default, Hover, Active, Focus, Disabled +- **Form structure**: Label above input, error below, helper text optional +- **Modal pattern**: Overlay + centered content + close mechanism +- **Card structure**: Container → Header → Body → Footer (optional) + +**Why Fixed:** +Users expect consistent component behavior. Architecture is fixed; appearance is project-specific. + +### 6. Animation Timing Framework + +**Fixed Physics Profiles:** +- **Lightweight** (icons, chips): 150ms +- **Standard** (cards, panels): 300ms +- **Weighty** (modals, pages): 500ms + +**Fixed Easing:** +- **Ease-out**: Entrances (fast start, slow end) +- **Ease-in**: Exits (slow start, fast end) +- **Ease-in-out**: Transitions (smooth both ends) + +**Why Fixed:** +Natural physics feel consistent across brands. Duration and easing create that feeling. + +--- + +## II. PROJECT-SPECIFIC ELEMENTS + +Fill in these for each project based on brand personality and purpose. + +### 1. Brand Color System + +**Template Structure:** + +``` +NEUTRALS (4-5 colors): +- Background lightest: _______ (e.g., slate-50 or warm-white) +- Surface: _______ (e.g., slate-100) +- Border/divider: _______ (e.g., slate-300) +- Text secondary: _______ (e.g., slate-600) +- Text primary: _______ (e.g., slate-900) + +ACCENTS (1-3 colors): +- Primary (main CTA): _______ (e.g., teal-500) +- Secondary (alternative action): _______ (optional) +- Status colors: + - Success: _______ (green-ish) + - Warning: _______ (amber-ish) + - Error: _______ (red-ish) + - Info: _______ (blue-ish) +``` + +**Questions to Answer:** +- What emotion should the brand evoke? (Trust, excitement, calm, urgency) +- Warm or cool neutrals? +- Conservative or bold accents? + +**Examples:** + +**Project A: Fintech App** +``` +Neutrals: Cool greys (slate-50 → slate-900) +Primary: Deep blue (#0A2463) – trust, professionalism +Success: Muted green (#10B981) +Why: Financial products need trust, not playfulness +``` + +**Project B: Creative Community** +``` +Neutrals: Warm greys with beige undertones +Primary: Coral (#FF6B6B) – energy, creativity +Success: Teal (#06D6A0) – fresh, unexpected +Why: Creative spaces should feel inviting, not corporate +``` + +**Project C: Healthcare Platform** +``` +Neutrals: Pure greys (minimal color temperature) +Primary: Soft blue (#4A90E2) – calm, clinical +Success: Medical green (#38A169) +Why: Healthcare needs clarity and calm, not distraction +``` + +### 2. Typography Pairing + +**Template:** + +``` +HEADLINE FONT: _______ +- Weight: _______ (e.g., Bold 700) +- Use case: H1, H2, display text +- Personality: _______ (geometric/humanist/serif/etc.) + +BODY FONT: _______ +- Weight: _______ (e.g., Regular 400, Medium 500) +- Use case: Paragraphs, UI text +- Personality: _______ (neutral/readable/efficient) + +OPTIONAL ACCENT FONT: _______ +- Weight: _______ +- Use case: _______ (special headlines, callouts) +``` + +**Pairing Logic:** +- Serif + Sans-serif (classic, editorial) +- Geometric + Humanist (modern + warm) +- Display + System (distinctive + efficient) + +**Examples:** + +**Project A: Editorial Platform** +``` +Headline: Playfair Display (Serif, Bold 700) +Body: Inter (Sans-serif, Regular 400) +Why: Serif headlines = trustworthy, editorial feel +``` + +**Project B: Tech Startup** +``` +Headline: DM Sans (Sans-serif, Bold 700) +Body: DM Sans (Regular 400, Medium 500) +Why: Single-font system = modern, efficient, cohesive +``` + +**Project C: Luxury Brand** +``` +Headline: Cormorant Garamond (Serif, Light 300) +Body: Lato (Sans-serif, Regular 400) +Why: Elegant serif + readable sans = sophisticated +``` + +### 3. Tone of Voice + +**Template:** + +``` +BRAND PERSONALITY: +- Formal ↔ Casual: _______ (1-10 scale) +- Professional ↔ Friendly: _______ (1-10 scale) +- Serious ↔ Playful: _______ (1-10 scale) +- Authoritative ↔ Conversational: _______ (1-10 scale) + +MICROCOPY EXAMPLES: +- Button label (submit form): _______ +- Error message (invalid email): _______ +- Success message (saved): _______ +- Empty state: _______ + +ANIMATION PERSONALITY: +- Speed: _______ (quick/moderate/slow) +- Feel: _______ (precise/smooth/bouncy) +``` + +**Examples:** + +**Project A: Banking App** +``` +Personality: Formal (8), Professional (9), Serious (8) +Button: "Submit Application" +Error: "Email address format is invalid" +Success: "Application submitted successfully" +Animation: Quick (precise, efficient, no-nonsense) +``` + +**Project B: Social App** +``` +Personality: Casual (8), Friendly (9), Playful (7) +Button: "Let's go!" +Error: "Hmm, that email doesn't look right" +Success: "Nice! You're all set 🎉" +Animation: Moderate (smooth, friendly bounce) +``` + +### 4. Animation Speed & Feel + +**Template:** + +``` +SPEED PREFERENCE: +- UI interactions: _______ (100-150ms / 150-200ms / 200-300ms) +- State changes: _______ (200ms / 300ms / 400ms) +- Page transitions: _______ (300ms / 500ms / 700ms) + +ANIMATION STYLE: +- Easing preference: _______ (sharp / standard / bouncy) +- Movement type: _______ (minimal / smooth / expressive) +``` + +**Examples:** + +**Project A: Trading Platform** +``` +Speed: Fast (100ms UI, 200ms states, 300ms pages) +Style: Sharp easing, minimal movement +Why: Traders need speed, not distraction +``` + +**Project B: Wellness App** +``` +Speed: Slow (200ms UI, 400ms states, 500ms pages) +Style: Smooth easing, gentle movement +Why: Calm, relaxing experience matches brand +``` + +--- + +## III. ADAPTABLE ELEMENTS + +Context-dependent implementations that vary based on use case. + +### 1. Component Variations + +**Button Variants:** +- **Primary**: Full background color (high emphasis) +- **Secondary**: Outline only (medium emphasis) +- **Tertiary**: Text only (low emphasis) +- **Destructive**: Red-ish (danger actions) +- **Ghost**: Minimal (navigation, toolbars) + +**Adaptation Rules:** +- Primary: Main CTA, one per screen section +- Secondary: Alternative actions +- Tertiary: Less important actions, multiple allowed +- Use brand colors, but hierarchy logic is fixed + +### 2. Responsive Breakpoints + +**Fixed Ranges:** +- XS: 0-479px (small phones) +- SM: 480-767px (large phones) +- MD: 768-1023px (tablets) +- LG: 1024-1439px (laptops) +- XL: 1440px+ (desktop) + +**Adaptable Implementations:** + +**Simple Content Site:** +``` +XS-SM: Single column +MD: 2 columns +LG-XL: 3 columns max +Why: Content-focused, don't overwhelm +``` + +**Dashboard/Data App:** +``` +XS: Collapsed, cards stack +SM: Simplified sidebar +MD: Full sidebar + main content +LG-XL: Sidebar + main + right panel +Why: Data apps need more screen real estate +``` + +### 3. Dark Mode Palette + +**Adaptation Strategy:** + +Not a simple inversion. Dark mode needs adjusted contrast: + +**Light Mode:** +``` +Background: #FFFFFF (white) +Text: #0F172A (slate-900) → 21:1 contrast +``` + +**Dark Mode (Adapted):** +``` +Background: #0F172A (slate-900) +Text: #E2E8F0 (slate-200) → 15.8:1 contrast (still AA, but softer) +``` + +**Why Adapt:** +Pure white on pure black is too harsh. Dark mode needs slightly lower contrast for eye comfort. + +### 4. Loading States + +**Context-Dependent:** + +**Fast operations (<500ms):** +- No loading indicator (feels instant) + +**Medium operations (500ms-2s):** +- Spinner or skeleton screen + +**Long operations (>2s):** +- Progress bar with percentage +- Or: Skeleton + estimated time + +**Interactive Operations:** +- Button shows spinner inside (don't disable, show state) + +### 5. Error Handling Strategy + +**Context-Dependent:** + +**Form Errors:** +``` +Validate: On blur (after user leaves field) +Display: Inline below field +Recovery: Clear error on fix +``` + +**API Errors:** +``` +Transient (network): Show retry button +Permanent (404): Show helpful message + next steps +Critical (500): Contact support option +``` + +**Data Errors:** +``` +Missing: Show empty state with action +Corrupt: Show error boundary with reload +Invalid: Highlight + explain what's wrong +``` + +--- + +## DECISION TREE + +When implementing a feature, ask: + +### Is this... + +**FIXED?** +- Does it affect structure, accessibility, or universal UX? +- Examples: Spacing scale, grid, contrast ratios, component architecture +- **Action**: Use the fixed system, no variation + +**PROJECT-SPECIFIC?** +- Does it express brand personality or purpose? +- Examples: Colors, typography, tone of voice, animation feel +- **Action**: Fill in the template for this project + +**ADAPTABLE?** +- Does it depend on context, content, or use case? +- Examples: Component variants, responsive behavior, error handling +- **Action**: Choose appropriate variation based on context + +--- + +## EXAMPLE: Implementing a "Submit" Button + +### Fixed Elements (Always the same): +- Touch target: 44px minimum height +- Padding: 16px horizontal (from spacing scale) +- States: Default, Hover, Active, Focus, Disabled +- Animation: 150ms ease-out (lightweight profile) + +### Project-Specific (Filled per project): +- **Project A (Bank)**: Dark blue background, white text, "Submit Application" +- **Project B (Social)**: Coral background, white text, "Let's Go!" +- **Project C (Healthcare)**: Soft blue background, white text, "Continue" + +### Adaptable (Context-dependent): +- **Form context**: Primary button (full color) +- **Toolbar context**: Ghost button (text only) +- **Danger context**: Destructive variant (red-ish) + +--- + +## VALIDATION CHECKLIST + +Before finalizing a design, check: + +### Fixed Elements +- [ ] Uses spacing scale (4/8/12/16/24/32/48/64/96px) +- [ ] Follows grid system (12 or 16 columns) +- [ ] Meets WCAG AA contrast (4.5:1 normal, 3:1 large) +- [ ] Touch targets ≥ 44px +- [ ] Typography follows mathematical scale +- [ ] Components follow standard architecture + +### Project-Specific Elements +- [ ] Brand colors filled in and intentional +- [ ] Typography pairing chosen and justified +- [ ] Tone of voice defined and consistent +- [ ] Animation speed matches brand personality + +### Adaptable Elements +- [ ] Component variants appropriate for context +- [ ] Responsive behavior fits content type +- [ ] Loading states match operation duration +- [ ] Error handling fits error type + +--- + +## PROJECT KICKOFF TEMPLATE + +Use this to start a new project: + +``` +PROJECT NAME: _______________________ +PURPOSE: ____________________________ + +BRAND PERSONALITY: +- Primary emotion: _______ +- Warm or cool: _______ +- Formal or casual: _______ +- Conservative or bold: _______ + +COLORS (fill the template): +- Neutral base: _______ +- Primary accent: _______ +- Status colors: _______ / _______ / _______ + +TYPOGRAPHY (fill the template): +- Headline font: _______ +- Body font: _______ +- Pairing rationale: _______ + +TONE: +- Button labels style: _______ +- Error message style: _______ +- Success message style: _______ + +ANIMATION: +- Speed preference: _______ (fast/moderate/slow) +- Feel preference: _______ (sharp/smooth/bouncy) + +TARGET DEVICES: +- Primary: _______ (mobile/desktop/both) +- Secondary: _______ +``` + +--- + +## MAINTAINING CONSISTENCY + +### Documentation +- Keep this template updated as system evolves +- Document WHY choices were made, not just WHAT + +### Communication +- Share with designers: "Here's what varies vs. what's fixed" +- Share with developers: "Here are the design tokens" + +### Tooling +- Use CSS variables for project-specific values +- Use Tailwind config for spacing scale +- Use design tokens in Figma/Storybook + +### Reviews +- Audit: Does new work follow fixed elements? +- Validate: Are project-specific elements intentional? +- Question: Are adaptations justified by context? + +--- + +## EXAMPLES OF COMPLETE SYSTEMS + +### System A: B2B SaaS (Conservative) + +**Fixed**: Standard spacing, 12-col grid, WCAG AA, major third type scale +**Project-Specific**: +- Colors: Cool greys + corporate blue +- Typography: DM Sans (headlines + body) +- Tone: Professional, formal +- Animation: Quick, precise (150ms) +**Adaptable**: +- Dashboard gets multi-panel layout +- Forms are extensive (use progressive disclosure) +- Errors show detailed technical info + +### System B: Consumer Social App (Playful) + +**Fixed**: Same spacing/grid/accessibility/type logic +**Project-Specific**: +- Colors: Warm greys + vibrant coral +- Typography: Poppins (headlines) + Inter (body) +- Tone: Casual, friendly, playful +- Animation: Moderate, bouncy (200ms) +**Adaptable**: +- Mobile-first (most users on phones) +- Forms are minimal (progressive profiling) +- Errors are friendly, not technical + +### System C: Healthcare Platform (Clinical) + +**Fixed**: Same foundational structure +**Project-Specific**: +- Colors: Pure greys + medical blue +- Typography: System fonts (SF Pro / Segoe) +- Tone: Clear, authoritative, calm +- Animation: Slow, smooth (300ms) +**Adaptable**: +- Desktop-first (clinical use at workstations) +- Forms are complex (HIPAA compliance) +- Errors are precise with next steps + +--- + +## KEY TAKEAWAY + +**The system flexibility framework lets you:** +- Maintain consistency (fixed elements) +- Express brand personality (project-specific) +- Adapt to context (adaptable elements) + +**Without this framework:** +- Designers reinvent spacing every project +- Components feel inconsistent across products +- Brand personality overrides accessibility +- Context-blind implementations feel wrong + +**With this framework:** +- Speed: Start from proven foundations +- Consistency: Fixed elements guarantee it +- Flexibility: Express unique brand identity +- Context: Adapt without breaking system diff --git a/.agent/.agent/skills/bencium-innovative-ux-designer/MOTION-SPEC.md b/.agent/.agent/skills/bencium-innovative-ux-designer/MOTION-SPEC.md new file mode 100644 index 0000000..e37e363 --- /dev/null +++ b/.agent/.agent/skills/bencium-innovative-ux-designer/MOTION-SPEC.md @@ -0,0 +1,72 @@ +# Motion Specification + +Motion should surprise and delight while serving function. Animation is a creative tool. + +## Easing Curves + +| Easing | CSS | Use For | +|--------|-----|---------| +| **Ease-out** | `cubic-bezier(0.0, 0.0, 0.2, 1)` | Entrances, appearing | +| **Ease-in** | `cubic-bezier(0.4, 0.0, 1, 1)` | Exits, disappearing | +| **Ease-in-out** | `cubic-bezier(0.4, 0.0, 0.2, 1)` | State changes, transforms | +| **Spring** | `cubic-bezier(0.68, -0.55, 0.265, 1.55)` | Playful, attention-grabbing | +| **Linear** | `linear` | Spinners, continuous loops | + +## Duration by Element Weight + +| Weight | Duration | Examples | +|--------|----------|----------| +| **Lightweight** | 150ms | Icons, badges, chips | +| **Standard** | 300ms | Cards, panels, list items | +| **Weighty** | 500ms | Modals, page transitions | + +## Duration by Interaction + +| Interaction | Duration | +|-------------|----------| +| Button press | 100ms | +| Hover state | 150ms | +| Tooltip appear | 200ms | +| Tab switch | 250ms | +| Modal open | 300ms | +| Page transition | 400ms | + +## Common Patterns + +```tsx +// Hover transition (CSS) + +``` + +### Example 2: Typography Hierarchy + +**Question First:** +``` +For this content hierarchy, I'm thinking: +- Headline: Large, bold, attention-grabbing +- Subheading: Medium, regular weight +- Body: Smaller, optimized for reading + +Should we go bold and contemporary, or subtle and refined? +``` + +**Implementation After Approval:** +```tsx +
+

+ Headline Here +

+

+ Supporting subheading +

+

+ Body text optimized for readability with proper line height. +

+
+``` + +### Example 3: Unique Color Palette Suggestion + +**Presenting Options:** +``` +I'd like to suggest three color directions that break from typical SaaS patterns: + +1. **Warm Earth Tones** + - Base: Warm grey (#E8E2DC) + - Accent: Terracotta (#C86E4B) + - For: Organic, trustworthy feel + +2. **Cool Midnight** + - Base: Deep navy (#1A2332) + - Accent: Cyan (#4ECDC4) + - For: Modern, tech-forward feel + +3. **Soft Pastels** + - Base: Soft pink (#FFE5E5) + - Accent: Sage green (#9DB5A4) + - For: Calm, approachable feel + +Which direction feels right for your brand? +``` + +## Common Patterns to Avoid + +❌ **NEVER:** +- Use Inter, Roboto, Arial, Space Grotesk as primary fonts +- Use generic SaaS blue (#3B82F6) or purple gradients on white +- Copy Apple's design language or use glass morphism +- Create cookie-cutter layouts that look AI-generated +- Skip asking about context before designing +- Converge on common choices across generations (vary everything!) +- Use animations that delay user actions +- Create cluttered interfaces where elements compete + +✅ **ALWAYS:** +- Ask about purpose, tone, constraints, differentiation FIRST +- Then commit BOLDLY to a distinctive aesthetic direction +- Use unexpected, characterful typography choices +- Create atmosphere: shadows, gradients, textures, grain (when intentional) +- Dominant colors with sharp accents (not timid, evenly-distributed palettes) +- Provide immediate feedback for interactions +- Test with real devices +- Validate accessibility (it enables creativity, not limits it) +- Remember: Claude is capable of extraordinary creative work - don't hold back! + +## Version History + +- v2.0.0 (2025-11-22): Creative liberation update - bold aesthetics, shadows/gradients allowed, Design Thinking protocol +- v1.0.0 (2025-10-18): Initial release with comprehensive UI/UX design guidance + +## References + +For additional context, see: +- **Anthropic Frontend Aesthetics Cookbook**: https://github.com/anthropics/claude-cookbooks/blob/main/coding/prompting_for_frontend_aesthetics.ipynb +- WCAG 2.1 Guidelines: https://www.w3.org/WAI/WCAG21/quickref/ +- Google Fonts: https://fonts.google.com/ +- Tailwind CSS Docs: https://tailwindcss.com/docs +- Shadcn UI Components: https://ui.shadcn.com/ + +**Progressive Disclosure Files:** +- ACCESSIBILITY.md - Accessibility essentials (WCAG AA baseline) +- MOTION-SPEC.md - Animation timing and easing +- RESPONSIVE-DESIGN.md - Mobile-first breakpoints and patterns diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index efddce0..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,218 +0,0 @@ -# CLAUDE.md - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## Project Overview - -Interactive CV/portfolio for Andy Charlwood, presented as a GP clinical record system. The concept: *what if a GP surgery's patient record system were redesigned by a luxury product studio?* The structure and metaphor of a real clinical system (tiles as record sections, status indicators, medication-style skill entries, alerts) — but elevated with refined typography, considered motion, and a modern light aesthetic. - -**This is NOT a faithful NHS system clone.** It's a showcase portfolio that *evokes* the feel of clinical software while being distinctly beautiful. The clinical metaphor is the creative conceit; the execution should feel premium and contemporary. - -Built as a React SPA with TypeScript and Vite. - -**Reference design:** `References/GPSystemconcept.html` — the visual and structural target for the dashboard. - -## Commands - -- `npm run dev` — Start dev server (localhost:5173) -- `npm run build` — TypeScript compile + Vite production build -- `npm run typecheck` — TypeScript type checking only (`tsc --noEmit`) -- `npm run lint` — ESLint -- `npm run preview` — Preview production build - -No test framework is configured. - -## Architecture - -### Four-Phase UI Flow - -`App.tsx` manages a `Phase` state (`'boot'` → `'ecg'` → `'login'` → `'pmr'`). Each phase renders exclusively: - -1. **BootSequence** — Terminal typing animation (~4s), green-on-black aesthetic. Fira Code font, matrix-green palette. **Locked — do not change.** -2. **ECGAnimation** — Canvas-based heartbeat animation with mask-based letter tracing. Background transitions from black to `#1E293B`. **Locked — do not change.** -3. **LoginScreen** — Animated login card on dark background. Types credentials at a natural pace, then presents an interactive "Log In" button for the user to click. Login transitions to the dashboard. -4. **DashboardLayout** — The main portfolio experience: TopBar + Sidebar + scrollable tile-based dashboard. - -### Dashboard Layout (Post-Login) - -The dashboard uses a three-zone layout: - -``` -┌─────────────────────────────────────────────────────┐ -│ TopBar (fixed, 48px) — brand, search, session │ -├──────────┬──────────────────────────────────────────┤ -│ │ │ -│ Sidebar │ Card Grid (scrollable) │ -│ (272px) │ ┌─────────────────────────────────┐ │ -│ │ │ Patient Summary (full width) │ │ -│ Person │ ├────────────────┬────────────────┤ │ -│ Header │ │ Latest Results │ Repeat Meds │ │ -│ │ │ (KPIs) │ (Core Skills) │ │ -│ Tags │ ├────────────────┴────────────────┤ │ -│ │ │ Last Consultation (full width) │ │ -│ Alerts │ ├─────────────────────────────────┤ │ -│ │ │ Career Activity (full width) │ │ -│ │ ├─────────────────────────────────┤ │ -│ │ │ Education (full width) │ │ -│ │ ├─────────────────────────────────┤ │ -│ │ │ Projects (full width) │ │ -│ │ └─────────────────────────────────┘ │ -└──────────┴──────────────────────────────────────────┘ -``` - -**No view switching.** The dashboard is a single scrollable page of tiles. Users scroll to see all sections. Detail drill-down happens by expanding tiles in-place (accordion pattern). - -### Key Patterns - -- **Canvas ECG**: `ECGAnimation.tsx` does imperative canvas drawing with requestAnimationFrame — flatline → 3 heartbeats (40px→60px→100px) → mask-based letter tracing → exit. **Locked — do not change.** -- **TopBar**: `TopBar.tsx` — fixed at top, brand + search trigger + session info. Search bar triggers Command Palette on click/Ctrl+K. -- **Sidebar**: `Sidebar.tsx` — light background, contains PersonHeader (avatar, name, title, status, details), Tags, and Alerts only. Skills, Projects, Education are in the main content tiles. -- **Card Grid**: CSS Grid, 2 columns on desktop (gap 16px), 1 column on mobile. Tiles use a reusable `Card` component with consistent styling. -- **Tile Expansion**: Career Activity items, Project items, and Skill items expand in-place with height-only animation (200ms, ease-out). Single-expand accordion — only one item open at a time. -- **KPI Flip Cards**: Latest Results metrics flip on click to show explanation text. CSS perspective transform, 400ms. -- **Command Palette**: Ctrl+K opens a Spotlight-style search overlay. Fuzzy search via fuse.js. Keyboard navigation (arrow keys, Enter, Escape). -- **Staggered entrance**: TopBar slides down → Sidebar slides from left → Content fades in. Quick (200-300ms). -- **Expandable content**: Height-only animation, 200ms ease-out. Content grows/shrinks — no opacity fade. -- **Responsive breakpoints**: Desktop (full sidebar + 2-col grid), Tablet (collapsed/hidden sidebar + 1-col), Mobile (no sidebar, stacked tiles). - -### Path Aliases - -`@/` maps to `./src/` (configured in both `vite.config.ts` and `tsconfig.json`). - -### Type System - -All data types live in `src/types/index.ts` and `src/types/pmr.ts`. Strict TypeScript — no `any` types. One component per file with typed props interfaces. - -## Design Direction: GP System Dashboard - -The aesthetic direction is a **modern GP system dashboard** — the precision and information density of a medical records system, but with a light, contemporary, premium feel. Think: a healthcare SaaS product redesigned by a Swiss product studio. - -### Tone - -- **Precise, not cold.** Every element has a reason. Spacing is generous but intentional. -- **Light, not washed out.** Warm sage background, clean white surfaces, deliberate color accents. -- **Technical, not sterile.** Monospace data, status indicators, and coded entries create authentic texture. -- **Elegant, not decorative.** No gratuitous ornament. Beauty comes from proportion, contrast, and type. - -### Typography - -Typography is the primary vehicle for premium feel. Avoid generic system fonts. - -- **UI / Body:** - - **Elvaro Grotesque** (primary, `font-ui`) — Modern grotesque sans-serif. 7 weights (300-900). Institutional credibility with premium feel. Slightly condensed proportions suit data-dense UI. - - **Blumir** (alternative, `font-ui-alt`) — Geometric-humanist hybrid. Variable font (100-700). More refined/luxurious feel. - - Both fonts sourced from Envato (licensed), stored in `Fonts/`. **Do not use Inter, Roboto, DM Sans, or system defaults.** - - Font files: Elvaro `Fonts/Elvaro Grotesque Sans Family/WOFF/TBJElvaro-*.woff2`, Blumir `Fonts/blumir-font-family/WOFF/Blumir-VF.woff2` -- **Monospace / Data**: Geist Mono for timestamps, session info, GPhC number, dates, coded entries. Creates "technical texture." -- **Terminal phase**: Fira Code — locked, do not change. -- **Type scale**: Tight. Headings 15-18px, body 12.5-14px, labels 10-12px. Precision over drama. -- **Weight hierarchy**: Use weight (400/500/600/700) rather than size to establish hierarchy. - -### Color Palette - -The palette anchors on teal as the primary accent, with a light sidebar + warm content background. - -- **Teal `#0D6E6E`** — Primary accent. Active states, links, avatar gradient, interactive elements. Hover: `#0A8080`. Light: `rgba(10,128,128,0.08)`. -- **Background `#F0F5F4`** — Warm sage. The content area feels organic, not flat gray. -- **Sidebar `#F7FAFA`** — Very light. Right border `#D4E0DE` separates from content. -- **TopBar `#FFFFFF`** — White surface. Bottom border `#D4E0DE`. -- **Cards `#FFFFFF`** — White with shadow-sm and border-light. Hover deepens to shadow-md. -- **Status colors**: Success `#059669`, Amber `#D97706`, Alert `#DC2626`, Purple `#7C3AED` — each with light bg and border variants. Always paired with text labels. -- **Text**: Primary `#1A2B2A`, Secondary `#5B7A78`, Tertiary `#8DA8A5`. Use full range for hierarchy. -- **Borders**: Structural `#D4E0DE`, Cards/inner `#E4EDEB`. - -### Shadows & Depth - -Three-tier shadow system for layered depth: - -- **Cards (resting)**: `0 1px 2px rgba(26,43,42,0.05)` — gentle, always present. -- **Cards (hover/interactive)**: `0 2px 8px rgba(26,43,42,0.08)` — slightly lifted. -- **Overlays (command palette, modals)**: `0 8px 32px rgba(26,43,42,0.12)` — clearly elevated. -- **Hover states**: Shadow deepens + border color strengthens. Subtle, not dramatic. - -### Motion - -Motion should feel considered and premium, never flashy: - -- **Entrance animations**: Dashboard materializes in sequence — TopBar slides down → Sidebar slides from left → Content fades in. Quick (200-300ms) with easing. -- **Login typing**: 80ms/char for username, 60ms/dot for password. Natural, readable pace. After typing completes, "Log In" button becomes interactive — user clicks to proceed. -- **Login transition**: On button click, card scales slightly and fades. Transition to dashboard layout. -- **Tile expansion**: Height-only animation, 200ms ease-out. Content grows/shrinks — no opacity fade. -- **KPI flip**: CSS perspective rotateY, 400ms ease-in-out. Click to flip, click to flip back. -- **Command palette**: Scale 0.97→1.0 + translateY entrance, 200ms. Backdrop fade. -- **Hover states**: Subtle, immediate. Border color shifts, shadow deepens. Think: OS-level responsiveness. -- **`prefers-reduced-motion`**: All animations skip to final state. No exceptions. - -### Spatial Composition - -- **Generous but structured.** Cards have 20px padding. Tile grid has 16px gap. Sections breathe. -- **Clear visual hierarchy.** Card headers: uppercase, small (12px), tracked-out, secondary color with colored dot indicator. -- **Two-column grid** on desktop, single column on mobile. Full-width tiles span both columns. -- **Sidebar sections** separated by thin divider titles (10px, uppercase, tertiary, with line extending right). - -### What Makes It Memorable - -The distinctiveness comes from the *clinical metaphor applied to a modern interface*: -- A light, professional sidebar with clinical-style person header and alert flags -- Skills presented as "Repeat Medications" with frequency dosing (twice daily, when required) -- KPI metrics that flip to reveal explanations, like interactive test results -- Career history as a clinical timeline with color-coded entry types -- The boot sequence → ECG → login flow is theatrical in a way that real clinical software never is -- Command palette (Ctrl+K) for searching records, like a clinical search tool - -## Styling - -Tailwind CSS with custom design tokens in `tailwind.config.js`: -- **Color tokens**: PMR-prefixed tokens (`pmr-accent`, `pmr-bg`, `pmr-surface`, `pmr-sidebar`, `pmr-text-primary`, etc.) -- **Fonts**: `font-ui` (Elvaro Grotesque), `font-ui-alt` (Blumir), `font-geist` (Geist Mono), `font-mono` (Fira Code for terminal) -- **Breakpoints**: xs 480px, sm 640px, md 768px, lg 1024px, xl 1280px -- **Border radius**: 8px default for cards/tiles (`var(--radius)`). 6px for inner elements (`var(--radius-sm)`). 12px exception for login card and command palette. -- **Shadows**: `shadow-sm`, `shadow-md`, `shadow-lg` tokens matching three-tier system. -- CSS custom properties in `index.css` for both boot/ECG phase tokens and dashboard phase tokens. -- Inline styles only for dynamic values that Tailwind can't express. - -## Guardrails - -- **Boot sequence**: Text, colors, and timing must match `References/concept.html` exactly. **Do not modify.** -- **ECG animation**: Timing, amplitudes, color transitions, and mask-based text reveal must match the concept reference. **Do not modify.** -- **Reference design**: `References/GPSystemconcept.html` is the visual and structural target for the dashboard. -- **CV content**: Sourced from `References/CV_v4.md` — roles, dates, and achievement numbers must be accurate. -- **Icons**: Via `lucide-react`, not unicode symbols. -- **Accessibility**: WCAG 2.1 AA compliance. Semantic HTML, ARIA attributes, keyboard navigation, `prefers-reduced-motion` support throughout. Status indicators always paired with text labels. -- **No generic aesthetics**: Every design decision should feel intentional. If a component could appear in any random SaaS template, it needs more character. -- **Fonts**: Elvaro Grotesque (primary) or Blumir (alt). Never Inter, Roboto, DM Sans, or system defaults. DM Sans appears in the concept HTML as a placeholder only. - -## Project Structure - -``` -src/ -├── components/ # One component per file (PascalCase) -│ ├── tiles/ # Dashboard tile components (PatientSummaryTile, LatestResultsTile, etc.) -│ ├── views/ # Legacy PMR views (being replaced by tiles — may be referenced during transition) -│ ├── TopBar.tsx # Fixed top bar (brand, search trigger, session) -│ ├── Sidebar.tsx # Light sidebar (person header, tags, alerts) -│ ├── DashboardLayout.tsx # Main layout (topbar + sidebar + card grid) -│ ├── Card.tsx # Reusable card component with header -│ ├── CommandPalette.tsx # Ctrl+K search overlay -│ └── ... # Boot, ECG, Login (unchanged) -├── contexts/ # React contexts (AccessibilityContext) -├── data/ # Static data files -│ ├── patient.ts # Person details -│ ├── consultations.ts # Career roles (used in Last Consultation + Career Activity) -│ ├── medications.ts # Legacy skill data -│ ├── problems.ts # Achievements -│ ├── investigations.ts # Projects -│ ├── documents.ts # Education entries -│ ├── profile.ts # Personal statement -│ ├── tags.ts # Sidebar tags -│ ├── alerts.ts # Sidebar alert flags -│ ├── kpis.ts # KPI metrics for Latest Results -│ └── skills.ts # Skills with frequency/years (medication metaphor) -├── hooks/ # Custom hooks (camelCase, use* prefix) -├── lib/ # Utility functions (search.ts for fuse.js) -├── types/ # TypeScript interfaces (index.ts, pmr.ts) -├── App.tsx # Phase manager (root component) -└── index.css # Global styles + Tailwind directives -Ralph/ # Implementation plan, guardrails, progress tracking -References/ # Source content (concept.html, GPSystemconcept.html, CV_v4.md) -``` diff --git a/current_login.jpg b/current_login.jpg deleted file mode 100644 index 2d0884061a3cb163567a85a2ee295bea1066e731..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108866 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 z 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