From 50c95c46a5a6e27bd5a5c9390cb621569f60527b Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Sat, 7 Feb 2026 23:26:01 +0500 Subject: [PATCH] docs: add improvement plans --- plans/COMPREHENSIVE_IMPROVEMENT_PLAN.md | 620 ++++++++++++++++++++++++ plans/IMPROVEMENTS_PLAN.md | 155 ++++++ 2 files changed, 775 insertions(+) create mode 100644 plans/COMPREHENSIVE_IMPROVEMENT_PLAN.md create mode 100644 plans/IMPROVEMENTS_PLAN.md diff --git a/plans/COMPREHENSIVE_IMPROVEMENT_PLAN.md b/plans/COMPREHENSIVE_IMPROVEMENT_PLAN.md new file mode 100644 index 0000000..3816145 --- /dev/null +++ b/plans/COMPREHENSIVE_IMPROVEMENT_PLAN.md @@ -0,0 +1,620 @@ +# 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`) + +```typescript +export class ImageService { + // Upload from file (drag-drop, paste, file input) + async uploadFromFile(file: File): Promise; + + // Upload from URL + async uploadFromURL(url: string): Promise; + + // 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 + +```typescript +// 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 diff --git a/plans/IMPROVEMENTS_PLAN.md b/plans/IMPROVEMENTS_PLAN.md new file mode 100644 index 0000000..7cf66ab --- /dev/null +++ b/plans/IMPROVEMENTS_PLAN.md @@ -0,0 +1,155 @@ +# План ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Twitch Panels + +## 🚨 ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ (ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ 1) + +### 1. РСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ downloadAll +**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°**: Ѐункция Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π°, Π½ΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ° ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π² UI +**РСшСниС**: +- Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ PreviewAll для Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° всСх ΠΏΠ°Π½Π΅Π»Π΅ΠΉ +- Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ массив Konva Stage ΠΈΠ· всСх ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² +- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ сохранСниС всСх ΠΏΠ°Π½Π΅Π»Π΅ΠΉ Π² ZIP-Π°Ρ€Ρ…ΠΈΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ jszip +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ прогрСсс-ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ для массового скачивания + +### 2. Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ +**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°**: ImageManager ΠΈ CropInline Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ +**РСшСниС**: +- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Ρ‡Π΅Ρ€Π΅Π· drag-drop, paste ΠΈ URL +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ с cropperjs для ΠΎΠ±Ρ€Π΅Π·ΠΊΠΈ +- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ сохранСниС ΠΎΠ±Ρ€Π΅Π·Π°Π½Π½ΠΎΠ³ΠΎ изобраТСния +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ +- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ яркости/контраста + +### 3. Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π°Π³Π° Π² textConfig.svelte.ts +**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°**: Π’ строкС 35 `this.fontFamily` вмСсто `fontFamily` +**РСшСниС**: Π˜ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ setter для fontFamily + +## ⚠️ Π’Π°ΠΆΠ½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ (ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ 2) + +### 4. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ состояния konvaAllStages +**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°**: ΠŸΡ€ΠΎΡΡ‚Π°Ρ массив Π±Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² управлСния +**РСшСниС**: +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для добавлСния/удалСния Stage +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ +- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ очистку ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ тСкстов + +### 5. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… +**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°**: ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ валидация тСкстов ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ +**РСшСниС**: +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ Π΄Π»ΠΈΠ½Ρ‹ тСкста (MAX_TEXT_LENGTH ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π² константах) +- Π’Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ URL ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ +- ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»ΠΎΠ² (MAX_FILE_SIZE ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π² константах) +- Π’Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ + +### 6. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок +**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°**: НС всС ошибки ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ +**РСшСниС**: +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ error boundaries Π² Svelte ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ +- Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для отобраТСния ошибок +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ увСдомлСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π² UI (toast notifications) +- Π£Π»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ошибок с контСкстом + +### 7. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ +**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°**: ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈ большом количСствС ΠΏΠ°Π½Π΅Π»Π΅ΠΉ +**РСшСниС**: +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ списка ΠΏΠ°Π½Π΅Π»Π΅ΠΉ +- ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ Konva Stage +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π»Π΅Π½ΠΈΠ²ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ +- ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ пСрСрисовку ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ настроСк + +## πŸ”§ Π‘Ρ€Π΅Π΄Π½ΠΈΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ (ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ 3) + +### 8. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ UX/UI +**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°**: НСкоторыС элСмСнты интСрфСйса ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ +**РСшСниС**: +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½Ρ‹Π΅ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ для Π΄ΠΎΠ»Π³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ +- Π£Π»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ связь ΠΏΡ€ΠΈ дСйствиях +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ tooltips для ΠΊΠ½ΠΎΠΏΠΎΠΊ Π±Π΅Π· тСкста +- Π£Π»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½ΡƒΡŽ Π°Π΄Π°ΠΏΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ + +### 9. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ сохранСния/Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² +**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°**: НСт возмоТности ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ +**РСшСниС**: +- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ сохранСниС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² localStorage +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ экспорт/ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² JSON +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сохранСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² + +### 10. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ PreviewAll +**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°**: ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ отобраТаСтся Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ экрана Π±Π΅Π· контроля +**РСшСниС**: +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ для управлСния Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ +- ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ созданиС Stage Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ нСобходимости +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ очистку ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ + +### 11. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ Button ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° +**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°**: Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ стилСй Π² btn-danger +**РСшСниС**: +- ВынСсти ΠΎΠ±Ρ‰ΠΈΠ΅ стили Π² Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс +- Π£Π½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ стилизации Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΊΠ½ΠΎΠΏΠΎΠΊ + +## πŸ“š ДокумСнтация ΠΈ тСсты (ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ 4) + +### 12. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ +**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°**: НСдостаточно Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ +**РСшСниС**: +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ JSDoc ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΊ функциям +- Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ ΠΈ интСрфСйсы +- Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ README с инструкциями ΠΏΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² + +### 13. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Π½ΠΈΠ΅ тСстов +**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°**: ВСсты устарСли ΠΈ Π½Π΅ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ вСсь Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» +**РСшСниС**: +- ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ тСсты для Svelte 5 runes +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ тСсты для всСх состояний (states) +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ тСсты для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ тСсты для downloadService +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ тСсты +- Π£Π»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΊΠΎΠ΄Π° тСстами + +### 14. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ E2E тСстов +**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°**: НСт E2E тСстов для критичСских ΠΏΡƒΡ‚Π΅ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ +**РСшСниС**: +- Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ E2E тСсты для основного workflow +- Π’Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ +- Π’Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ созданиС ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°Π½Π΅Π»Π΅ΠΉ +- Π’Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ скачиваниС ΠΏΠ°Π½Π΅Π»Π΅ΠΉ + +## 🎨 Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ (ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ 5) + +### 15. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΉ +**РСшСниС**: +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π²Π½Ρ‹Π΅ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ/ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΏΠ°Π½Π΅Π»Π΅ΠΉ +- ΠΠ½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΌ +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠΈΠΊΡ€ΠΎ-взаимодСйствия + +### 16. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ доступности (a11y) +**РСшСниС**: +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ARIA labels +- Π£Π»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ keyboard navigation +- ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ†Π²Π΅Ρ‚ΠΎΠ² +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ screen readers + +### 17. Локализация +**РСшСниС**: +- ВынСсти всС тСкстовыС строки Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» +- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… языков +- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ языков + +## πŸ“Š ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ для отслСТивания + +Для ΠΎΡ†Π΅Π½ΠΊΠΈ эффСктивности ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ: +- ВрСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ страницы +- ВрСмя создания ΠΏΠ°Π½Π΅Π»ΠΈ +- ΠŸΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ тСстами (Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 80%) +- ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ошибок Π² production +- ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ NPS + +## 🎯 Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹ΠΉ порядок Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ + +1. **НСдСля 1**: ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ (1-3) +2. **НСдСля 2**: Π’Π°ΠΆΠ½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ (4-7) +3. **НСдСля 3**: Π‘Ρ€Π΅Π΄Π½ΠΈΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ (8-11) +4. **НСдСля 4**: ДокумСнтация ΠΈ тСсты (12-14) +5. **НСдСля 5**: Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ (15-17) + +Π­Ρ‚ΠΎΡ‚ ΠΏΠ»Π°Π½ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ систСматичСски ΡƒΠ»ΡƒΡ‡ΡˆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, начиная с самых критичСских ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈ постСпСнно пСрСходя ΠΊ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹ΠΌ функциям.