Commit graph

437 commits

Author SHA1 Message Date
senke
06ac7cc216 consistency: remove unnecessary decorations from Input (Action 9.5.1.2)
- Removed backdrop-blur-sm (unnecessary visual effect)
- Removed ring-offset-kodo-void (not needed)
- Removed hover:border-white/15 (subtle hover effect)
- Removed focus-visible:bg-black/30 (focus background change)
- Result: Cleaner Input styling with 4 unnecessary decorations removed
- Preserved: Essential functionality and focus ring (will be simplified in 9.5.1.4)
2026-01-16 01:21:36 +01:00
senke
411ab9eadd consistency: audit Input component styling (Action 9.5.1.1)
- Created comprehensive INPUT_COMPONENT_STYLING_AUDIT.md
- Documented all 25+ styling classes with categorization
- Identified 5 key issues:
  - Complex focus state (ring + border redundant)
  - Unnecessary backdrop-blur-sm decoration
  - Overly broad transition-all
  - Subtle hover effect
  - Complex border radius
- Analyzed usage: 100+ files import Input component
- Provided Priority 1-3 recommendations for simplification
- Created proposed simplified version with Kodo colors
- Ready for Action 9.5.1.2 (remove unnecessary decorations)
2026-01-16 01:20:06 +01:00
senke
b29f659180 consistency: migrate Tailwind default colors to Kodo (Action 9.1.1.3 - batch 2)
Migrated high-usage feature components:
- TrackFilters.tsx: Replaced all gray/blue colors with kodo colors (39 instances)
- PlaybackHeatmap.tsx: Replaced heatmap gradient colors with kodo colors (28 instances)

Progress: 132 instances migrated total (1,492 → 1,360 remaining)
Batch 1: 65 instances (Alert, Toast, PasswordStrengthIndicator, GearView)
Batch 2: 67 instances (TrackFilters, PlaybackHeatmap)
2026-01-16 01:18:04 +01:00
senke
6fa1c62f56 consistency: migrate Tailwind default colors to Kodo (Action 9.1.1.3 - batch 1)
Migrated high-priority reusable components and view files:
- Alert.tsx: Replaced blue/green/yellow/red with kodo-cyan/lime/gold/red
- Toast.tsx: Replaced blue/green/yellow/red with kodo-cyan/lime/gold/red
- PasswordStrengthIndicator.tsx: Replaced red/orange/yellow/blue/green with kodo colors
- GearView.tsx: Replaced all gray colors with kodo-content-dim/kodo-steel/kodo-graphite

Progress: 65 instances migrated (1,492 → 1,427 remaining)
Using color mapping from TAILWIND_COLORS_AUDIT.md
2026-01-16 01:14:39 +01:00
senke
7a85fd0584 consistency: audit Tailwind default color usage (Action 9.1.1.2)
- Created comprehensive TAILWIND_COLORS_AUDIT.md documenting all Tailwind default colors
- Found 1,492 instances across 235 files
- Most common: text-gray-* (992), bg-gray-* (146), border-gray-* (107)
- Documented color distribution, top 20 classes, and mapping guide
- Identified top 20 files requiring migration
- Created migration priority guide (High/Medium/Low)
- Documented special cases (test files, component libraries)
- Ready for Action 9.1.1.3 (migration to Kodo colors)
2026-01-16 01:10:57 +01:00
senke
006765ab86 consistency: create color usage guide (Action 9.1.1.1)
- Created comprehensive COLOR_USAGE.md documenting Kodo design system colors
- Documents all background, accent, semantic, and text colors with usage guidelines
- Includes 80/20 rule, color hierarchy, do's and don'ts
- Provides code examples and migration notes from Tailwind defaults
- References color definition files for developers

This guide ensures consistent color usage across the application and helps
developers choose the right colors for their components.
2026-01-16 01:08:51 +01:00
senke
f606a4cd57 security: cleanup obsolete token validation code (Action 5.1.1.6)
- Remove obsolete error logging in api/auth.ts that expected tokens in localStorage
- Fix tokenRefresh.ts periodic refresh to not check tokens (httpOnly cookies not accessible)
- Mark Actions 5.1.1.6-5.1.1.9 as complete in TODO list

Actions 5.1.1.7-5.1.1.9 were already completed in previous actions:
- 5.1.1.7: TokenStorage already returns null (httpOnly cookies not readable)
- 5.1.1.8: tokenRefresh already works with cookies
- 5.1.1.9: All token access goes through TokenStorage

No localStorage.getItem/setItem calls for tokens remain (only removeItem for cleanup)
2026-01-16 01:06:11 +01:00
senke
b895e08d15 security: migrate access token to httpOnly cookie (Actions 5.1.1.1-5.1.1.3)
Backend changes (Action 5.1.1.1):
- Set access_token cookie in Login, Register, and Refresh handlers
- Cookie uses same configuration as refresh_token (httpOnly, Secure, SameSite)
- Expiry matches AccessTokenTTL (5 minutes)
- Update logout handler to clear access_token cookie

Backend middleware (Action 5.1.1.1):
- Update auth middleware to read access token from cookie first
- Fallback to Authorization header for backward compatibility
- Update OptionalAuth with same cookie-first logic

Frontend changes (Actions 5.1.1.2 & 5.1.1.3):
- Remove localStorage token storage from TokenStorage service
- TokenStorage now returns null for getAccessToken/getRefreshToken (httpOnly cookies not accessible)
- Remove Authorization header logic from API client
- Remove token expiration checks (can't check httpOnly cookies from JS)
- Update AuthContext to remove localStorage usage
- Update tokenRefresh to work without reading tokens from JS
- Simplify refresh logic: periodic refresh every 4 minutes (no expiration checks)

Security improvements:
- Access tokens no longer exposed to XSS attacks (httpOnly cookies)
- Tokens automatically sent with requests via withCredentials: true
- Backend reads tokens from cookies, not Authorization headers
- All users will need to re-login after deployment (breaking change)

Breaking change: All users must re-login after deployment
2026-01-16 01:03:23 +01:00
senke
c063b9723a ui: enhance selected items highlighting (Action 8.4.1.3)
- Grid view: Added bg-kodo-cyan/10 background, stronger ring (ring-kodo-cyan/40), shadow with cyan glow
- List view: Added bg-kodo-cyan/15 background, border-l-4 border-kodo-cyan left border, subtle shadow
- Both views now have more prominent visual indication when selected
- Maintains existing hover and focus states
- Part of Action 8.4.1.3: Highlight selected items clearly
2026-01-16 00:52:31 +01:00
senke
b72d70dff5 ui: add BulkModeBanner to LibraryPage (Action 8.4.1.2)
- Imported BulkModeBanner component
- Added banner at top of content area (before header)
- Banner shows when isBulkMode is true
- Displays selectedTracks.size count
- onClose handler disables bulk mode and clears selection
- Banner appears above ErrorDisplay for proper visual hierarchy
- Part of Action 8.4.1.2: Show banner in LibraryPage when bulk mode active
2026-01-16 00:51:26 +01:00
senke
0bcb1209d6 ui: create BulkModeBanner component (Action 8.4.1.1)
- Created reusable BulkModeBanner component for bulk selection mode
- Displays selected item count with proper French pluralization
- Uses Kodo design system (cyan theme, consistent styling)
- Includes close button to exit bulk mode
- Accessibility: role="status", aria-live="polite", aria-atomic="true"
- Follows existing component patterns (similar to Alert component)
- Component returns null when inactive or no items selected
- Part of Action 8.4.1.1: Create bulk mode banner component
2026-01-16 00:50:01 +01:00
senke
511937aee6 ui: use Spinner component in loading states (Action 8.3.1.5 partial)
- Replaced Loader2 with Spinner in high-leverage locations:
  - LibraryPage (addToPlaylist)
  - CommentSection (create comment)
  - CommentThread (reply, edit)
  - PlaylistForm (submit)
  - AddCollaboratorModal
  - CollaboratorList (remove)
  - PlaylistFollowButton
  - PlaylistActions (edit, delete)
  - PlaylistBatchActions (share, delete)
  - SharePlaylistModal
  - AddTrackToPlaylistModal
  - ShareLinkManager (create)
- Spinner provides consistent Kodo design system styling
- Remaining Loader2 usages can be migrated incrementally
- Part of Action 8.3.1.5: Use Spinner in loading states
2026-01-16 00:48:39 +01:00
senke
38f79cbbe8 ui: create Spinner component for inline loading states (Action 8.3.1.4)
- Created Spinner.tsx component for inline use in buttons and UI elements
- Size variants: sm, md, lg
- Color variants: default (kodo-cyan), muted, white, current
- Uses Loader2 from lucide-react with Kodo design system styling
- Includes accessibility attributes (sr-only label)
- Different from LoadingSpinner (which is for full-page states)
- Task 8.3.1.4 complete
2026-01-16 00:46:12 +01:00
senke
8d5f543efd ui: add loading states to revoke share link and reorder tracks (Action 8.3.1.3 partial)
- Added isLoading prop to ConfirmationDialog for revoke share link
- Disabled drag-and-drop context when reorder mutation is pending
- Uses mutation.isPending to show loading state
- Follows existing patterns for loading states
- Part of Action 8.3.1.3: Add loading states to all mutation buttons
2026-01-16 00:44:30 +01:00
senke
3110dc7789 ui: add loading state to delete comment button (Action 8.3.1.3 partial)
- Added isLoading prop to ConfirmationDialog for delete comment
- Uses deleteCommentMutation.isPending to show loading state
- Follows existing pattern for confirmation dialogs
- Part of Action 8.3.1.3: Add loading states to all mutation buttons
- Many buttons already have loading states (verified during implementation)
2026-01-16 00:44:08 +01:00
senke
4ed04ef356 docs: audit all mutation buttons (Action 8.3.1.2)
- Created comprehensive audit document: MUTATION_BUTTONS_AUDIT.md
- Identified 28 mutation buttons across 9 categories
- 5 buttons already have loading states (18%)
- 23 buttons missing loading states (82%)
- Categorized by priority: High (8), Medium (11), Low (4)
- Documented existing patterns and recommendations
- Task 8.3.1.2 complete
2026-01-16 00:42:49 +01:00
senke
b2aaa8d337 ui: add loading state to addToPlaylist button (Action 8.3.1.1)
- Added Loader2 import from lucide-react
- Added disabled prop to DropdownMenuItem using mutation.isPending
- Shows spinner and 'Ajout en cours...' text when loading
- Follows React Query mutation pattern (isPending)
- All playlist items disabled during any add operation
- Task 8.3.1.1 complete
2026-01-16 00:41:45 +01:00
senke
cc4d641926 ui: add focus states for keyboard navigation (Action 8.2.1.4)
- Added focus-visible states to view mode toggles
- Added focus-visible states to FeedView buttons
- Added focus-visible states to logout buttons (red ring for destructive action)
- Added focus-visible states to Dashboard time period buttons
- Added focus-visible states to Collapsible trigger
- Added focus-visible states to track cards (grid and list views)
- Added focus-visible states to navigation links (Sidebar, Header)
- Added tabIndex={0} to clickable cards for keyboard navigation
- Button component already has focus-visible states
- Consistent focus pattern: ring-2 ring-kodo-cyan with offset
- Task 8.2.1.4 complete
2026-01-16 00:38:37 +01:00
senke
d1743ad845 ui: add hover states and cursor-pointer to high-priority clickable elements (Action 8.2.1.3)
- Added cursor-pointer to view mode toggles (LibraryPage)
- Added cursor-pointer and transition-colors to FeedView buttons
- Added cursor-pointer to logout buttons (Sidebar, Header)
- Added cursor-pointer to Dashboard time period buttons
- Added cursor-pointer to Collapsible trigger button
- Button component already has cursor-pointer built-in
- Navigation links already have hover states
- Updated audit document with progress
- High-priority areas complete, remaining elements can be addressed incrementally
- Task 8.2.1.3 complete
2026-01-16 00:36:35 +01:00
senke
7594c94f38 docs: audit all interactive elements (Action 8.2.1.2)
- Created comprehensive audit document: apps/web/docs/INTERACTIVE_ELEMENTS_AUDIT.md
- Identified 10 categories of interactive elements
- Found 500+ interactive elements across codebase
- Documented patterns: good, needs improvement, missing
- Prioritized areas for hover/focus state improvements
- Task 8.2.1.2 complete
2026-01-16 00:35:01 +01:00
senke
422676f7eb ui: add enhanced hover states to track cards (Action 8.2.1.1)
- Added hover:shadow-lg and hover:shadow-kodo-cyan/20 for depth
- Added hover:scale-[1.02] for subtle lift effect
- Grid view cards now have enhanced visual feedback on hover
- List view items already had hover states (hover:bg-white/5)
- All track cards have cursor-pointer and smooth transitions
- Task 8.2.1.1 complete
2026-01-16 00:34:19 +01:00
senke
e726ce7d3c library: ensure consistent upload behavior (Action 8.1.1.4)
- Added support for action=upload query parameter in LibraryPage
- Dashboard FAB navigates to /library?action=upload, opens modal
- LibraryPage header button directly opens modal
- Both buttons result in same behavior (upload modal opens)
- Query parameter cleaned from URL after modal closes
- Task 8.1.1.4 complete
2026-01-16 00:33:41 +01:00
senke
b5406c46ea library: remove duplicate upload buttons (Action 8.1.1.3)
- Removed LibraryPage empty state buttons (grid and list views)
- Removed LibraryManager header and empty state buttons
- Kept Dashboard FAB (primary) and LibraryPage header button (secondary)
- Result: Only 2 upload buttons remain, consistent behavior
- Empty state messages preserved, users can use header button
- Task 8.1.1.3 complete
2026-01-16 00:32:57 +01:00
senke
02f84fa1f0 docs: determine primary upload button location (Action 8.1.1.2)
- Primary: Dashboard FAB (global, always accessible, most prominent)
- Secondary: LibraryPage header button (contextual, always visible)
- To remove: LibraryPage empty state buttons (redundant)
- To remove: LibraryManager buttons (component unused - legacy code)
- Updated audit document with decision rationale
- Task 8.1.1.2 complete
2026-01-16 00:32:05 +01:00
senke
4988b97af0 docs: audit all upload buttons (Action 8.1.1.1)
- Found 6 upload button instances across 3 components
- Created comprehensive audit document: apps/web/docs/UPLOAD_BUTTONS_AUDIT.md
- Identified duplicates: empty state buttons redundant with header buttons
- Primary candidates: Dashboard FAB and LibraryPage header button
- Recommendations for removal documented
- Task 8.1.1.1 complete
2026-01-16 00:31:34 +01:00
senke
c6ce2f0291 library: move filters to sidebar
- Restructured layout to use flex with sidebar and main content
- Moved filters (search, genre, format, sort) to Sidebar component
- Sidebar positioned on left, collapsible, open by default
- Main content area now uses flex-1 for better space utilization
- Filters organized vertically with labels for better UX
- Task 7.4.1.2 complete
2026-01-16 00:30:04 +01:00
senke
08b070b5c6 ui: create generic Sidebar component for filters and content
- Created reusable Sidebar component in ui/ (separate from navigation Sidebar)
- Supports left/right positioning and collapsible functionality
- Customizable width, title, and icon
- Mobile backdrop support
- Smooth animations and transitions
- Controlled and uncontrolled modes
- SidebarCard variant for Card-styled sidebars
- Task 7.4.1.1 complete
2026-01-16 00:27:58 +01:00
senke
f3445634ac dashboard: replace Upload button with FAB
- Removed Upload button from header section
- Added FAB component at bottom-right position
- FAB shows 'Upload Track' label with backdrop blur
- Large size (64px) with Plus icon
- Premium variant with enhanced glow effects
- Always visible, floating above content
- Task 7.3.1.8 complete
2026-01-16 00:27:18 +01:00
senke
6a9dc53535 ui: create FAB (Floating Action Button) component
- Created FAB component with fixed positioning
- Supports 4 positions (bottom-right, bottom-left, top-right, top-left)
- Size variants (sm, md, lg) with circular shape
- Optional label with backdrop blur
- Enhanced glow effects and hover animations
- Uses premium variant for prominence
- High z-index for visibility
- Task 7.3.1.7 complete
2026-01-16 00:26:43 +01:00
senke
278428cd17 dashboard: use Collapsible component for activity feed
- Wrapped activity feed section in Collapsible component
- Activity feed collapsed by default (defaultOpen={false})
- Trigger shows Activity icon and 'Activité récente' title
- Maintains existing card structure and styling
- Users can expand/collapse to view activity feed
- Task 7.3.1.6 complete
2026-01-16 00:26:10 +01:00
senke
156c3be7ce ui: create reusable Collapsible component
- Created Collapsible component with controlled/uncontrolled modes
- Added CollapsibleCard variant for Card-styled collapsibles
- Supports smooth animations, ARIA attributes, and customizable styling
- Follows existing UI component patterns and Kodo design system
- Task 7.3.1.5 complete
2026-01-16 00:25:20 +01:00
senke
acca7d4369 dashboard: make Upload button most prominent
- Changed variant from default to premium (enhanced gradient/glow)
- Increased size from h-12 to h-14 (56px)
- Increased padding from px-8 to px-10
- Increased text from text-base to text-lg
- Changed font-weight to font-bold
- Increased icon size from w-4 h-4 to w-5 h-5
- Enhanced shadow glow effects
- Task 7.3.1.3 complete
2026-01-16 00:24:30 +01:00
senke
0d779a3b0a dashboard: reduce welcome message size for better hierarchy
- Changed welcome message from text-4xl to text-2xl
- Reduces visual prominence, allowing primary stat to be focal point
- Maintains font-bold for hierarchy
- Task 7.3.1.2 complete
2026-01-16 00:23:46 +01:00
senke
2f6850fa5b dashboard: make primary stat (tracks played) large and prominent
- Primary stat now spans 2 columns on md/lg screens
- Increased value text from text-3xl to text-6xl (2x larger)
- Increased icon size from w-5 h-5 to w-8 h-8
- Increased padding and text sizes throughout for prominence
- Task 7.3.1.1 complete
2026-01-16 00:23:17 +01:00
senke
320468fb1c spacing: create comprehensive SPACING_GUIDE.md
- Created complete spacing system guide in apps/web/docs/SPACING_GUIDE.md
- Documented numeric and semantic spacing scales with full value tables
- Included usage guidelines, best practices, and common patterns
- Added migration guide for replacing arbitrary values
- Documented ESLint enforcement and related documentation
- Task 7.2.1.7 complete
2026-01-16 00:22:30 +01:00
senke
4d07306017 spacing: document spacing usage and fix numbering
- Added comprehensive documentation comments to design-tokens.css explaining spacing scale usage
- Documented numeric vs semantic scale, recommended usage patterns, and available utilities
- Fixed numbering conflict in TODO list (renumbered duplicate 7.2.1.3/7.2.1.4 to 7.2.1.5/7.2.1.6/7.2.1.7)
- Marked Action 7.2.1.5 (Create spacing utility classes) as complete - utilities auto-generated by Tailwind v4
- Task 7.2.1.6 complete
2026-01-16 00:21:52 +01:00
senke
b13a4fb80e spacing: add ESLint rule to enforce spacing scale
- Added no-restricted-syntax rule for arbitrary spacing values
- Warns on gap-[...], p-[...], m-[...], px-[...], py-[...], mx-[...], my-[...], space-[xy]-[...] with arbitrary sizes
- Validates spacing scale: 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24
- Follows same pattern as typography rule
- Task 7.2.1.4 complete
2026-01-16 00:20:23 +01:00
senke
7383b59bcd spacing: replace arbitrary spacing values with scale
- Replaced gap-7 → gap-6, gap-9 → gap-8, gap-11 → gap-12 in Grid.tsx
- Replaced px-9 → px-8 in Search.tsx
- Standardized arbitrary values (7, 9, 11) to follow 4px base scale
- Most spacing (2,761 instances) already uses valid scale values
- Task 7.2.1.3 complete
2026-01-15 23:59:08 +01:00
senke
390ed09d2f spacing: audit all spacing classes usage
- Audited 2,761 spacing class instances across 366 files
- Categorized by type: gap (1,314), padding (1,041), padding x/y (784), space-between (611), margin (217)
- Identified inconsistencies: all numeric values, no semantic classes, arbitrary values
- Created comprehensive audit report with recommendations
- Task 7.2.1.2 complete
2026-01-15 23:57:33 +01:00
senke
4d2d0ce57d spacing: add semantic spacing scale to design tokens
- Added semantic spacing variables (xs through xxl)
- Preserved existing numeric spacing scale
- Added documentation for semantic vs numeric usage
- Provides both precise control and design system consistency
- Task 7.2.1.1 complete
2026-01-15 23:56:21 +01:00
senke
420f5d5489 typography: standardize paragraph text sizes
- Standardized 9 paragraphs without explicit sizes
- Added text-sm to secondary/description text (7 instances)
- Added text-base to body text (2 instances)
- Established standard: text-base for body, text-sm for secondary
- Verified 490 paragraphs across 207 files follow type scale
- Created standardization plan document
- Task 7.1.2.4 complete
2026-01-15 23:55:35 +01:00
senke
f0e16e37d8 typography: standardize h2-h6 heading elements
- Standardized h2 elements: 19 instances from text-3xl/text-xl to text-2xl
- Standardized h3 elements: 4 instances from text-2xl to text-xl
- Established consistent hierarchy: h1(text-3xl), h2(text-2xl), h3(text-xl)
- Preserved special cases: demo pages, responsive patterns, stat value displays
- Created standardization plan document
- Task 7.1.2.3 complete
2026-01-15 23:54:05 +01:00
senke
8ff2195e66 visual-hierarchy: complete audit of all h1 elements
- Audited 55 h1 elements across 52 files
- Documented size distribution: text-3xl (26), text-2xl (16), text-4xl (10), etc.
- Identified inconsistencies: 6 different sizes used for h1 elements
- Found 11+ files with text-2xl h1 that should be text-3xl for consistency
- Documented responsive patterns and special cases
- Provided recommendations for standardization
- Created comprehensive audit report in apps/web/docs/H1_ELEMENTS_AUDIT_REPORT.md
- Action 7.1.2.1 complete
2026-01-15 21:26:39 +01:00
senke
bd9a33908d visual-hierarchy: add ESLint rule to enforce type scale usage
- Added no-restricted-syntax rule to warn on arbitrary text sizes (text-[...px], text-[...rem])
- Rule matches both string literals and template literals
- Warns developers to use type scale classes (text-xs through text-4xl)
- Includes guidance about SVG chart text exceptions
- Rule tested and confirmed working
- Helps prevent future arbitrary text sizes from being introduced
- Action 7.1.1.5 complete
2026-01-15 21:23:31 +01:00
senke
3ab8bdf07d visual-hierarchy: update typography replacement guide with complete analysis
- Documented all remaining arbitrary text sizes (9px, 10px, 11px instances)
- Noted that 99.8% of text already uses scale correctly
- Documented edge cases for design review
- Guide now complete with full inventory
2026-01-15 21:20:51 +01:00
senke
8b553860c3 visual-hierarchy: replace arbitrary text sizes with scale classes
- Replaced text-[9px] with text-xs in WishlistView.tsx
- Replaced font-size: 11px with var(--text-xs) in badge-avatar.css
- Analyzed all text sizing: 1,891 usages already use scale correctly
- Documented edge cases: SVG chart text and intentional 10px sizes kept as-is
- Created TYPOGRAPHY_REPLACEMENT_GUIDE.md with full analysis
- 99.8% of text already uses scale - only 2 safe replacements made
- Action 7.1.1.4 complete
2026-01-15 21:20:06 +01:00
senke
192d5a1855 visual-hierarchy: complete typography audit of all text size classes
- Audited 1,891 text size class usages across 342 files
- Documented usage distribution: text-sm (870), text-xs (596), text-2xl (130), etc.
- Identified top 10 files with highest usage
- Analyzed usage patterns by component type (pages, forms, cards, navigation)
- Identified inconsistencies in heading hierarchies and body text sizes
- Provided recommendations for standardization
- Created comprehensive audit report in apps/web/docs/TYPOGRAPHY_AUDIT_REPORT.md
- Action 7.1.1.3 complete
2026-01-15 21:17:59 +01:00
senke
e2b5254466 visual-hierarchy: create Tailwind config and verify text size utilities
- Created apps/web/tailwind.config.ts with documentation
- Verified text size utilities (text-xs through text-4xl) already working
- Confirmed 1871+ usages of text size classes throughout codebase
- Tailwind v4 automatically generates utilities from CSS variables in @theme
- All utilities functional via design-tokens.css
- Action 7.1.1.2 complete
2026-01-15 21:15:59 +01:00
senke
1dbe4c3121 scalability: handle infinite scroll edge cases
- Added end of list indicator when all tracks loaded (hasNextPage false)
- Shows track count in end of list message
- Added error handling for infinite scroll errors (errors after initial load)
- Shows retry button when error occurs during scroll
- Only shows error indicator when tracks already loaded (not initial error)
- Edge cases now handled gracefully
- Action 6.3.1.5 complete
2026-01-15 21:11:01 +01:00
senke
b77771d360 scalability: enhance loading indicator for infinite scroll
- Replaced basic text indicator with LoadingState component
- Uses inline variant with spinner and text
- Size: sm (appropriate for bottom of list)
- Text: 'Chargement de plus de pistes...'
- Styled with kodo-secondary for theme consistency
- Centered with proper padding for visibility
- Action 6.3.1.4 complete
2026-01-15 21:08:32 +01:00