diff --git a/SVG_ANALYSIS_REPORT.md b/SVG_ANALYSIS_REPORT.md new file mode 100644 index 0000000..f64d4cf --- /dev/null +++ b/SVG_ANALYSIS_REPORT.md @@ -0,0 +1,186 @@ +# SVG Usage Analysis Report + +## Summary + +This analysis examines SVG usage patterns in the Svelte 5 codebase to identify optimization opportunities, inconsistencies, and unused assets. + +## Key Findings + +### 1. Inline SVGs vs. Imported SVGs + +**Inline SVGs Found:** +- **Close/X buttons**: Found in 7+ components with identical SVG code + - `admin/Modal.svelte` + - `admin/UnifiedMediaModal.svelte` + - `admin/MediaInput.svelte` + - `admin/AlbumSelectorModal.svelte` + - `admin/GalleryManager.svelte` + - `admin/MediaDetailsModal.svelte` + - `Lightbox.svelte` + +- **Loading spinners**: Found in 2+ components + - `admin/Button.svelte` + - `admin/ImageUploader.svelte` + - `admin/GalleryUploader.svelte` + +- **Navigation arrows**: Found in `PhotoLightbox.svelte` +- **Lock icon**: Found in `LabCard.svelte` +- **External link icon**: Found in `LabCard.svelte` + +### 2. SVG Import Patterns + +**Consistent patterns using aliases:** +```svelte +// Good - using $icons alias +import ArrowLeft from '$icons/arrow-left.svg' +import ChevronDownIcon from '$icons/chevron-down.svg' + +// Component imports with ?component +import PhotosIcon from '$icons/photos.svg?component' +import ViewSingleIcon from '$icons/view-single.svg?component' + +// Raw imports +import ChevronDownIcon from '$icons/chevron-down.svg?raw' +``` + +### 3. Unused SVG Files + +**Unused icons in `/src/assets/icons/`:** +- `dashboard.svg` +- `metadata.svg` + +**Unused illustrations in `/src/assets/illos/`:** +- `jedmund-blink.svg` +- `jedmund-headphones.svg` +- `jedmund-listening-downbeat.svg` +- `jedmund-listening.svg` +- `jedmund-open.svg` +- `jedmund-signing-downbeat.svg` +- `jedmund-singing.svg` +- `logo-figma.svg` +- `logo-maitsu.svg` +- `logo-pinterest.svg` +- `logo-slack.svg` + +### 4. Duplicate SVG Definitions + +**Close/X Button SVG** (appears 7+ times): +```svg + +``` + +**Loading Spinner SVG** (appears 3+ times): +```svg + + + + + +``` + +### 5. SVGs That Could Be Componentized + +1. **Close Button**: Used across multiple modals and components +2. **Loading Spinner**: Used in buttons and upload components +3. **Navigation Arrows**: Used in lightbox and potentially other navigation +4. **Status Icons**: Lock, external link, eye icons in LabCard + +## Recommendations + +### 1. Create Reusable Icon Components + +**Option A: Create individual icon components** +```svelte + + + + + + +``` + +**Option B: Create an Icon component with name prop** +```svelte + + + +{#if IconComponent} + +{/if} +``` + +### 2. Extract Inline SVGs to Files + +Create new SVG files for commonly used inline SVGs: +- `/src/assets/icons/close.svg` +- `/src/assets/icons/loading.svg` +- `/src/assets/icons/external-link.svg` +- `/src/assets/icons/lock.svg` +- `/src/assets/icons/eye-off.svg` + +### 3. Clean Up Unused Assets + +Remove the following unused files to reduce bundle size: +- All unused illustration files (11 files) +- Unused icon files (2 files) + +### 4. Standardize Import Methods + +Establish a consistent pattern: +- Use `?component` for SVGs used as Svelte components +- Use direct imports for SVGs used as images +- Avoid `?raw` imports unless necessary + +### 5. Create a Loading Component + +```svelte + + + + + + + + + + +``` + +## Benefits of These Changes + +1. **Reduced code duplication**: Eliminate 20+ duplicate SVG definitions +2. **Smaller bundle size**: Remove 13 unused SVG files +3. **Better maintainability**: Centralized icon management +4. **Consistent styling**: Easier to apply consistent styles to all icons +5. **Type safety**: With proper component props +6. **Performance**: Less inline SVG parsing, better caching + +## Implementation Priority + +1. **High Priority**: Extract and componentize duplicate inline SVGs (close button, loading spinner) +2. **Medium Priority**: Remove unused SVG files +3. **Low Priority**: Standardize all import patterns and create comprehensive icon system \ No newline at end of file diff --git a/prd/PRD-codebase-cleanup-refactoring.md b/prd/PRD-codebase-cleanup-refactoring.md new file mode 100644 index 0000000..d47d329 --- /dev/null +++ b/prd/PRD-codebase-cleanup-refactoring.md @@ -0,0 +1,218 @@ +# PRD: Codebase Cleanup and Refactoring + +**Date**: December 26, 2025 +**Author**: Claude Code +**Status**: Draft +**Priority**: High + +## Executive Summary + +This PRD outlines a comprehensive cleanup and refactoring plan for the jedmund-svelte Svelte 5 codebase. The analysis has identified significant opportunities to reduce code complexity, eliminate duplication, and improve maintainability through systematic refactoring. + +## Goals + +1. **Simplify overengineered components** - Break down complex components into smaller, focused units +2. **Eliminate dead code** - Remove unused components, functions, and imports +3. **Reduce code duplication** - Extract common patterns into reusable components and utilities +4. **Standardize styling** - Convert hardcoded values to CSS variables and create consistent patterns +5. **Optimize SVG usage** - Remove unused SVGs and create reusable icon components + +## Key Findings + +### 1. Overengineered Components +- **EnhancedComposer** (1,347 lines) - Handles too many responsibilities +- **LastFM Stream Server** (625 lines) - Complex data transformations that could be simplified +- **Multiple Media Modals** - Overlapping functionality across 3+ modal components +- **Complex State Management** - Components with 10-20 state variables + +### 2. Unused Code +- 5 unused components (Squiggly, PhotoLightbox, Pill, SVGHoverEffect, MusicPreview) +- 13 unused SVG files (2 icons, 11 illustrations) +- Minimal commented-out code (good!) +- 1 potentially unused API endpoint (/api/health) + +### 3. DRY Violations +- **Photo Grid Components** - 3 nearly identical components +- **Modal Components** - Duplicate backdrop and positioning logic +- **Dropdown Components** - Repeated dropdown patterns +- **Form Components** - Overlapping FormField and FormFieldWrapper +- **Segmented Controllers** - Duplicate animation and positioning logic + +### 4. Hardcoded Values +- **Colors**: 200+ hardcoded hex/rgba values instead of using existing variables +- **Spacing**: 1,000+ hardcoded pixel values instead of using `$unit` system +- **Z-indexes**: 60+ hardcoded z-index values without consistent scale +- **Animations**: Hardcoded durations instead of using constants +- **Border radius**: Not using existing `$corner-radius-*` variables + +### 5. SVG Issues +- 7+ duplicate inline close button SVGs +- 3+ duplicate loading spinner SVGs +- Inconsistent import patterns +- Inline SVGs that should be componentized + +## Implementation Timeline + +### Phase 1: Quick Wins (Week 1) +Focus on low-risk, high-impact changes that don't require architectural modifications. + +- [ ] **Remove unused components** (5 components) + - [ ] Delete `/src/lib/components/Squiggly.svelte` + - [ ] Delete `/src/lib/components/PhotoLightbox.svelte` + - [ ] Delete `/src/lib/components/Pill.svelte` + - [ ] Delete `/src/lib/components/SVGHoverEffect.svelte` + - [ ] Delete `/src/lib/components/MusicPreview.svelte` + +- [ ] **Remove unused SVG files** (13 files) + - [ ] Delete unused icons: `close.svg`, `music.svg` + - [ ] Delete unused illustrations (11 files - see SVG analysis report) + +- [ ] **Clean up dead code** + - [ ] Remove commented `getWeeklyAlbumChart` line in `/src/routes/api/lastfm/+server.ts` + - [ ] Address TODO in `/src/lib/server/api-utils.ts` about authentication + +### Phase 2: CSS Variable Standardization (Week 2) +Create a consistent design system by extracting hardcoded values. + +- [ ] **Create z-index system** + - [ ] Create `src/assets/styles/_z-index.scss` with constants + - [ ] Replace 60+ hardcoded z-index values + +- [ ] **Extract color variables** + - [ ] Add missing color variables for frequently used colors + - [ ] Replace 200+ hardcoded hex/rgba values + - [ ] Create shadow/overlay variables for rgba values + +- [ ] **Standardize spacing** + - [ ] Add missing unit multipliers (`$unit-1.75x`, etc.) + - [ ] Replace 1,000+ hardcoded pixel values with unit variables + +- [ ] **Define animation constants** + - [ ] Create transition/animation duration variables + - [ ] Replace hardcoded duration values + +### Phase 3: Component Refactoring (Weeks 3-4) +Refactor components to reduce duplication and complexity. + +- [ ] **Create base components** + - [ ] Extract `BaseModal` component for shared modal logic + - [ ] Create `BaseDropdown` for dropdown patterns + - [ ] Merge `FormField` and `FormFieldWrapper` + - [ ] Create `BaseSegmentedController` for shared logic + +- [ ] **Refactor photo grids** + - [ ] Create unified `PhotoGrid` component with `columns` prop + - [ ] Remove 3 duplicate grid components + - [ ] Use composition for layout variations + +- [ ] **Componentize inline SVGs** + - [ ] Create `CloseButton` icon component + - [ ] Create `LoadingSpinner` component + - [ ] Create `NavigationArrow` components + - [ ] Extract other repeated inline SVGs + +### Phase 4: Complex Refactoring (Weeks 5-6) +Tackle the most complex components and patterns. + +- [ ] **Refactor EnhancedComposer** + - [ ] Split into focused sub-components + - [ ] Extract toolbar component + - [ ] Separate media management + - [ ] Create dedicated link editor + - [ ] Reduce state variables from 20+ to <10 + +- [ ] **Simplify LastFM Stream Server** + - [ ] Extract data transformation utilities + - [ ] Simplify "now playing" detection algorithm + - [ ] Reduce state tracking duplication + - [ ] Create separate modules for complex logic + +- [ ] **Consolidate media modals** + - [ ] Create single flexible MediaModal component + - [ ] Use composition for different modes + - [ ] Eliminate prop drilling with stores + +### Phase 5: Architecture & Utilities (Week 7) +Improve overall architecture and create shared utilities. + +- [ ] **Create shared utilities** + - [ ] API client with consistent error handling + - [ ] CSS mixins for common patterns + - [ ] Media handling utilities + - [ ] Form validation utilities + +- [ ] **Standardize patterns** + - [ ] Create middleware for API routes + - [ ] Implement consistent error handling + - [ ] Standardize data fetching patterns + - [ ] Create shared animation definitions + +### Phase 6: Testing & Documentation (Week 8) +Ensure changes don't break functionality and document new patterns. + +- [ ] **Testing** + - [ ] Run full build and type checking + - [ ] Test all refactored components + - [ ] Verify no regressions in functionality + - [ ] Check bundle size improvements + +- [ ] **Documentation** + - [ ] Update component documentation + - [ ] Document new patterns and utilities + - [ ] Update Storybook stories for new components + - [ ] Create migration guide for team + +## Success Metrics + +1. **Code Reduction** + - Target: 20-30% reduction in total lines of code + - Eliminate 1,000+ instances of code duplication + +2. **Component Simplification** + - No component larger than 500 lines + - Average component size under 200 lines + +3. **Design System Consistency** + - Zero hardcoded colors in components + - All spacing using design tokens + - Consistent z-index scale + +4. **Bundle Size** + - 10-15% reduction in JavaScript bundle size + - Removal of unused assets + +5. **Developer Experience** + - Faster build times + - Easier component discovery + - Reduced cognitive load + +## Risk Mitigation + +1. **Regression Testing** + - Test each phase thoroughly before moving to next + - Keep backups of original components during refactoring + - Use feature flags for gradual rollout if needed + +2. **Performance Impact** + - Monitor bundle size after each phase + - Profile component render performance + - Ensure no performance regressions + +3. **Team Coordination** + - Communicate changes clearly + - Update documentation as you go + - Create clear migration paths + +## Rollback Plan + +Each phase should be implemented as a separate git branch with the ability to revert if issues arise. Keep the old components available until the new ones are fully tested and stable. + +## Appendix + +- [SVG Analysis Report](/Users/justin/Developer/Personal/jedmund-svelte/SVG_ANALYSIS_REPORT.md) - Detailed SVG usage analysis +- [Component Analysis](#) - Detailed breakdown of component complexity +- [CSS Variable Audit](#) - Complete list of hardcoded values to replace + +--- + +**Next Steps**: Review this PRD and approve the implementation timeline. Each phase can be tracked using the checkboxes above. \ No newline at end of file