# 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