Files
twitch-panels/plans/COMPREHENSIVE_IMPROVEMENT_PLAN.md
T

19 KiB

Comprehensive Improvement Plan for Twitch Panels Project

Analysis Date: 2025-02-07
Project: Twitch Panels Creator
Tech Stack: Svelte 5, TypeScript, SvelteKit, Konva, Vitest


Executive Summary

This plan outlines all necessary improvements for the Twitch Panels project, categorized by priority and impact. The project has a solid foundation with Svelte 5 runes, proper error handling, and good component structure, but critical gaps exist in image upload functionality and test coverage that must be addressed.

Key Focus Areas:

  1. Complete image loading system (upload, crop, preview)
  2. Rewrite and expand test suite (currently broken/incomplete)
  3. Architectural refinements (service layer, state management)
  4. Code quality (type safety, error handling, accessibility)

🔴 CRITICAL PRIORITY (Must Fix Before Production)

1. Image Loading System - INCOMPLETE

Current State:

  • ImageManager.svelte has UI buttons but no functionality
  • CropInline.svelte exists but is not integrated
  • imageConfig.svelte.ts has hardcoded default image load
  • No actual image upload handlers (drag-drop, paste, URL)
  • Missing image service layer

Required Implementation:

1.1 Create Image Service (src/services/imageService.ts)

export class ImageService {
  // Upload from file (drag-drop, paste, file input)
  async uploadFromFile(file: File): Promise<ImageResult>;

  // Upload from URL
  async uploadFromURL(url: string): Promise<ImageResult>;

  // Validate image (size, format, dimensions)
  validateImage(file: File): ValidationResult;

  // Process image (resize, compress if needed)
  processImage(image: HTMLImageElement): ProcessedImage;

  // Set as background
  setBackground(image: ProcessedImage): void;

  // Reset to default
  resetToDefault(): void;
}

1.2 Implement ImageUpload Component

Create src/components/image/ImageUpload.svelte with:

  • Drag-and-drop zone with visual feedback
  • Paste from clipboard (Ctrl+V)
  • URL input field with validation
  • File input fallback
  • Loading states and error messages

1.3 Integrate Cropper.js

  • Create src/components/image/ImageCropper.svelte wrapper
  • Integrate with CropInline.svelte or replace it
  • Add crop controls (aspect ratio 16:5 for panels)
  • Handle crop completion and update background

1.4 Wire Up ImageManager.svelte

Add onclick handlers to buttons:

  • "Загрузить" → Open file picker or show upload options
  • "Редактировать" → Activate crop mode
  • "Сбросить" → Reset to default background

1.5 Remove Hardcoded Default

  • Move default image loading to a proper initialization
  • Make it configurable or lazy-loaded
  • Add fallback if default image fails to load

2. Test Suite - BROKEN/INCOMPLETE

Current State:

  • downloadService.test.ts has syntax errors (line 92: [{ ...id: "test-panel-2" }])
  • Tests reference non-existent methods (handleDownload, downloadPanels)
  • Only 2 test files exist (errorHandler.test.ts is good, downloadService is broken)
  • Zero component tests
  • Zero integration tests
  • Test coverage is effectively 0%

Required Fixes:

2.1 Fix downloadService.test.ts

// CURRENT BROKEN CODE (line 92):
let panels = [{ ...id: "test-panel-2" }]; // Syntax error!

// SHOULD BE:
let panels: DownloadItem[] = [{
  filename: "test-panel-2",
  stage: mockKonvaStage
}];

Remove or fix tests that call non-existent methods:

  • handleDownload → should be downloadPanel
  • downloadPanels → should be downloadAll

2.2 Expand Test Coverage

Unit Tests Needed:

  • src/services/downloadService.test.ts (fix existing)
  • src/services/imageService.test.ts (new, after creating service)
  • src/lib/utils/errorUtils.test.ts (expand existing)
  • src/states/*.svelte.ts.test.ts (all state files)
  • src/lib/utils/panelStorage.test.ts (if exists)

Component Tests Needed:

  • src/components/image/ImageManager.test.ts
  • src/components/image/ImageUpload.test.ts (after creation)
  • src/components/image/ImageCropper.test.ts (after creation)
  • src/components/text/TextManager.test.ts
  • src/components/text/TextConfig.test.ts
  • src/components/panel/PreviewManager.test.ts
  • src/components/panel/Preview.svelte.test.ts

Integration Tests:

  • Full user flow: upload image → crop → add texts → preview → download
  • Error scenarios: invalid image, network failure, disk full

2.3 Test Quality Standards

  • Target Coverage: 80% overall, 100% for critical paths
  • Mocking: Properly mock external dependencies (file-saver, jszip, cropperjs)
  • Assertions: Test both success and failure cases
  • Cleanup: Ensure proper test isolation

🟡 HIGH PRIORITY (Important for Quality)

3. Architectural Improvements

3.1 Service Layer Completion

Problem: Only downloadService.ts exists. Implementation plan references imageService, panelService, exportService that don't exist.

Solution: Create missing services:

  • src/services/imageService.ts (as described above)
  • src/services/panelService.ts - manage panel creation, validation, metadata
  • Consider merging downloadService into exportService or keep as is

Benefits:

  • Clear separation of concerns
  • Easier testing (services can be unit tested)
  • Reusable business logic

3.2 State Management Review

Current State: Multiple state files using Svelte 5 runes - this is good!

  • imageConfig.svelte.ts - image state
  • textConfig.svelte.ts - text styling state
  • texts.svelte.ts - text list state
  • konvaStage.svelte.ts - single stage
  • konvaAllStages.svelte.ts - array of stages

Issues:

  • imageConfig.svelte.ts:94 hardcodes default image load - should be in component
  • textConfig.svelte.ts:35 has bug: state.fontFamily = this.fontFamily should be state.fontFamily = fontFamily
  • State files mix state creation with side effects

Required Fixes:

  1. Fix textConfig.svelte.ts setter bug
  2. Remove hardcoded image load from imageConfig.svelte.ts - move to component
  3. Consider consolidating related states (e.g., image + crop = imageManagerState)
  4. Add proper cleanup in state destructors if needed

3.3 Component Structure Alignment

Problem: Documentation (COMPONENT_ORGANIZATION.md) references components that don't exist:

  • ImageUpload.svelte (doesn't exist, should be created)
  • ImageCropper.svelte (doesn't exist, should be created)
  • PanelPreview.svelte (exists as Preview.svelte)
  • PanelsList.svelte (doesn't exist, functionality in PreviewManager.svelte)

Solution Options:

  • Option A: Create missing components to match documentation
  • Option B: Update documentation to match reality
  • Recommended: Hybrid - create essential missing components (ImageUpload, ImageCropper), update docs to reflect actual structure

4. Missing Features & UX Improvements

4.1 Panel Persistence

Current State: No localStorage or persistence. Refresh loses all data.

Required:

  • Implement panelStorage.ts utility (referenced in docs but missing)
  • Auto-save to localStorage on state changes
  • Load saved panels on app initialization
  • Add "Clear All" button with confirmation

4.2 User Feedback System

Missing:

  • Loading indicators during image upload/crop
  • Success notifications (toast) after download
  • Error messages displayed to user (currently only console.log)
  • Progress bar for batch downloads

Implementation:

  • Create src/components/feedback/Toast.svelte or use simple notification
  • Add UI state for loading/error/success
  • Use errorUtils to format user-friendly messages

4.3 Accessibility (WCAG 2.1)

Current Gaps:

  • No ARIA labels on buttons
  • No keyboard navigation support
  • No screen reader announcements
  • Color contrast may not meet AA standards

Required:

  • Add aria-label to all icon-only buttons
  • Ensure keyboard navigation works (tab order, focus states)
  • Add role="alert" for error messages
  • Test with screen readers
  • Add high contrast mode support if needed

4.4 Internationalization

Problem: Mixed Russian/English in UI and error messages.

Solution:

  • Standardize on Russian (current UI language)
  • Or implement i18n system (e.g., svelte-i18n)
  • Ensure all user-facing text is consistent
  • Keep error codes in English for debugging

🟢 MEDIUM PRIORITY (Polish & Optimization)

5. Code Quality & Type Safety

5.1 TypeScript Improvements

  • Add stricter tsconfig settings (strict: true, noImplicitAny: true)
  • Define proper return types for all functions
  • Use satisfies operator for type-safe object literals
  • Add // @ts-expect-error only with justification comments

5.2 Error Handling Consistency

Current: Good error type hierarchy exists (AppError, ImageError, etc.) Issues:

  • Not all errors are properly typed
  • Some errors throw strings instead of Error objects
  • Error messages in Russian but codes in English - this is actually good!

Required:

  • Audit all throw statements - should throw AppError subclasses
  • Use createError utility consistently
  • Add error context/details where helpful

5.3 Code Documentation

  • Add JSDoc comments to all public functions and classes
  • Document complex logic (especially image processing)
  • Add inline comments for non-obvious code
  • Update README with setup and usage instructions

5.4 Component Prop Validation

  • Add proper prop types with defaults
  • Use svelte-check to catch type errors
  • Consider runtime validation for user inputs

6. Performance Optimization

6.1 Image Optimization

  • Compress uploaded images (use canvas to resize/compress)
  • Convert to appropriate format (WebP for smaller size)
  • Implement lazy loading for background preview
  • Add image caching strategy

6.2 Konva Rendering Optimization

  • Currently creates new Stage for each panel - this is expensive
  • Consider reusing stages or optimizing layer updates
  • Debounce rapid text changes
  • Use shouldComponentUpdate patterns if available

6.3 Bundle Size

  • Check bundle analyzer (vite-bundle-analyzer)
  • Remove unused dependencies
  • Enable code splitting for large libraries (cropperjs, jszip)
  • Consider dynamic imports for non-critical features

7. Build & Development Experience

7.1 Build Configuration

  • Add bundle analysis to build script
  • Configure proper source maps for debugging
  • Set up environment variable handling
  • Add build size reporting

7.2 Development Tools

  • Add ESLint with Svelte and TypeScript rules
  • Add Prettier for consistent formatting
  • Configure husky + lint-staged for pre-commit hooks
  • Add commit message linting (conventional commits)

7.3 CI/CD (if deploying)

  • GitHub Actions for test automation
  • Automated build and deployment
  • Coverage reporting to Codecov or similar
  • Dependency vulnerability scanning

📋 DETAILED TASK BREAKDOWN

Phase 1: Critical Fixes (Week 1-2)

Task 1.1: Fix Broken Tests (Day 1)

  • Fix syntax error in downloadService.test.ts:92
  • Remove tests for non-existent methods
  • Run test suite and ensure all pass
  • Add missing mocks for file-saver, jszip

Task 1.2: Complete Image Upload UI (Day 2-3)

  • Create ImageUpload.svelte component
  • Implement drag-drop, paste, URL input
  • Add file validation (size, type)
  • Add loading states
  • Wire up ImageManager button handlers

Task 1.3: Implement Image Cropping (Day 4-5)

  • Create ImageCropper.svelte wrapper for cropperjs
  • Integrate with CropInline or replace
  • Add crop aspect ratio constraints (16:5)
  • Handle crop completion and update state
  • Add crop cancellation

Task 1.4: Create Image Service (Day 6-7)

  • Implement imageService.ts with all methods
  • Add proper error handling
  • Write unit tests for imageService
  • Integrate service with components

Task 1.5: Remove Hardcoded Default (Day 8)

  • Move default image loading to component
  • Add fallback if default fails
  • Make default configurable

Phase 2: Testing Expansion (Week 3)

Task 2.1: Component Test Infrastructure (Day 1-2)

  • Set up @testing-library/svelte properly
  • Create test utilities for component rendering
  • Write test for TextManager.svelte
  • Write test for TextConfig.svelte

Task 2.2: Image Component Tests (Day 3-4)

  • Test ImageManager.svelte
  • Test ImageUpload.svelte
  • Test ImageCropper.svelte
  • Test error scenarios

Task 2.3: Panel Component Tests (Day 5-6)

  • Test Preview.svelte
  • Test PreviewManager.svelte
  • Test download functionality
  • Test navigation

Task 2.4: Integration Tests (Day 7-10)

  • Set up Playwright or use Testing Library for full flow
  • Test complete user journey
  • Test error recovery
  • Achieve 80% coverage target

Phase 3: Architecture & Quality (Week 4-5)

Task 3.1: State Management Cleanup (Day 1-2)

  • Fix textConfig.svelte.ts:35 bug
  • Review all state files for similar issues
  • Add proper cleanup where needed
  • Consider state consolidation

Task 3.2: Create Missing Services (Day 3-4)

  • Create panelService.ts for panel management
  • Refactor panel logic from components to service
  • Write tests for panelService
  • Update components to use service

Task 3.3: Implement Persistence (Day 5-6)

  • Create panelStorage.ts utility
  • Implement auto-save on state changes
  • Load saved state on app init
  • Add migration logic for schema changes
  • Write tests for storage

Task 3.4: User Feedback System (Day 7-8)

  • Create Toast notification component
  • Add loading states to all async operations
  • Display errors to users (not just console)
  • Add success confirmations

Task 3.5: Accessibility (Day 9-10)

  • Add ARIA labels to all interactive elements
  • Implement keyboard navigation
  • Test with screen readers
  • Add focus management
  • Verify color contrast

Phase 4: Polish & Optimization (Week 6)

Task 4.1: Code Quality (Day 1-3)

  • Enable strict TypeScript mode
  • Add ESLint + Prettier
  • Fix all linting errors
  • Add JSDoc documentation
  • Update README

Task 4.2: Performance (Day 4-5)

  • Implement image compression
  • Add lazy loading
  • Optimize Konva rendering
  • Analyze and reduce bundle size

Task 4.3: Final Testing & Bug Fixes (Day 6-7)

  • Cross-browser testing
  • Mobile responsiveness check
  • Performance profiling
  • Fix any remaining issues

📊 SUCCESS METRICS

Testing

  • 80%+ code coverage overall
  • 100% coverage for critical paths (download, image upload)
  • All tests passing consistently
  • No broken or skipped tests

Code Quality

  • Zero TypeScript errors in strict mode
  • Zero ESLint errors (or justified exceptions)
  • All public APIs documented
  • Consistent error handling

Functionality

  • Image upload works (drag-drop, paste, URL)
  • Image cropping works with proper constraints
  • All download functions work (single, batch)
  • State persists across page refreshes
  • No memory leaks

User Experience

  • Loading states for all async operations
  • Clear error messages displayed to users
  • Keyboard navigation works
  • Screen reader compatible
  • Responsive design

🎯 QUICK WINS (Can Do Immediately)

These are small improvements that can be done quickly while working on larger tasks:

  1. Fix the obvious test bug (line 92 in downloadService.test.ts) - 5 minutes
  2. Add onclick handlers to ImageManager buttons (even if just console.log for now) - 10 minutes
  3. Fix textConfig.svelte.ts bug (line 35) - 2 minutes
  4. Remove hardcoded default image from state file - 5 minutes
  5. Add basic error display in components (show error state) - 30 minutes
  6. Add loading spinners to buttons during async operations - 1 hour
  7. Add ARIA labels to all buttons - 1 hour
  8. Update README with project description - 30 minutes

📚 REFERENCE MATERIAL

Existing Plans (Already Created)

  • plans/TECHNICAL_DEBT_ANALYSIS.md - Good analysis of debt categories
  • plans/implementation-plan.md - Original implementation tasks
  • plans/PROJECT_PLAN.md - MVP requirements (in Russian)
  • plans/CRITICAL_ISSUES_REMEDIATION_PLAN.md - Similar to this plan

This Plan Builds Upon

  • All existing plans are still valid
  • This plan provides specific, actionable tasks with file references
  • Focuses on immediate critical issues (image loading, tests)
  • Provides concrete implementation details

🚀 IMPLEMENTATION ORDER

Recommended Order (based on dependencies):

  1. Fix broken tests → Establish baseline
  2. Complete image upload → Core feature is broken
  3. Create image service → Needed for testable architecture
  4. Expand test coverage → While implementing features
  5. Fix state bugs → Prevents future issues
  6. Add persistence → Improves UX significantly
  7. User feedback system → Better UX
  8. Accessibility → Compliance and usability
  9. Code quality → Polish
  10. Performance → Final optimization

⚠️ RISKS & MITIGATIONS

Risk Impact Mitigation
Image upload complexity High Break into small tasks, use proven libraries (cropperjs already included)
Test time investment Medium Prioritize critical path tests first, expand gradually
State management bugs Medium Write tests for states before fixing
Accessibility oversight Medium Use automated tools (axe) + manual testing
Performance issues Low Profile before optimizing, focus on bottlenecks

📝 NOTES

  • Svelte 5 runes are being used correctly - keep this pattern
  • Error handling infrastructure is well-designed - reuse it
  • Component structure is mostly good - just needs completion
  • TypeScript usage is decent - improve with strict mode
  • Dependencies are appropriate - no need to change

Next Steps:

  1. Review this plan with the team
  2. Prioritize tasks based on resources
  3. Start with Phase 1, Task 1.1 (fix broken tests)
  4. Create GitHub issues for each task
  5. Track progress against success metrics