Commit graph

665 commits

Author SHA1 Message Date
senke
8b5239fdd1 aesthetic-improvements: apply design direction to components batch 1 (Action 11.5.1.6)
- UI components: FAB (removed scale transforms), tabs (removed decorative shadow)
- Upload components: FileUploadZone, MetadataEditor, BulkUploadModal (removed scale transforms and decorative gradient)
- Search: SearchBar (removed decorative shadow)
- PWA: PWAInstallBanner (removed decorative shadow)
- Social: ExploreView (removed decorative shadow and image zoom)
- Live: LiveStreamDetailView (removed decorative shadow)
- Player: VisualizerSettingsModal (removed scale transform)
- Marketplace: ReviewProductModal, ProductDetailView (removed scale transforms)
- Library: PlaylistsView (removed scale transform)
- Settings: AppearanceSettingsView (removed scale transform)
- Theme: ThemeSwitcher (removed scale transform)
- Studio: ProjectsManager, CloudFileBrowser (removed scale transforms)
- Social: GroupCard (removed image zoom)
- Seller: CreateProductView (removed scale transform)
- Modals: CreatorModal (removed scale transform)
- Replaced decorative scale transforms with subtle opacity changes or removed entirely
- Action 11.5.1.6: Apply direction to all components - Batch 1 complete (17 components)
2026-01-16 12:06:00 +01:00
senke
d7ec8dd6e5 aesthetic-improvements: fix remaining spacing in pages and views (Action 11.5.1.5)
- DashboardPage: Updated gap (gap-6 → gap-8) for 8px grid alignment
- FileDetailsView: Updated section spacing (space-y-6 → space-y-8)
- GearView: Updated section spacing (space-y-6 → space-y-8, 2 instances)
- ProfileView: Updated gap (gap-6 → gap-8)
- DiscoverView: Updated card padding (p-6 → p-8)
- PurchasesView: Updated gap (gap-6 → gap-8)
- Preserved: Responsive padding (p-4 sm:p-6, px-6 md:px-12) and conditional padding (p-6 for non-primary cards)
- Action 11.5.1.5: Apply direction to all pages - Batch 3 complete (spacing fixes)
2026-01-16 12:03:28 +01:00
senke
953906cc47 aesthetic-improvements: apply design direction to views batch 2 (Action 11.5.1.5)
- FileManagerView: Removed decorative scale transform (group-hover:scale-110 → removed)
- LiveView: Removed decorative image zoom (group-hover:scale-105 → removed) and icon scale (hover:scale-110 → hover:text-kodo-gold/80)
- FileDetailsView: Replaced decorative gradient with solid color (bg-gradient-to-br from-kodo-cyan to-kodo-cyan → bg-kodo-cyan/20, removed decorative shadow)
- CartView: Removed decorative shadow (shadow-neon-cyan/20 → removed)
- CheckoutView: Removed decorative shadow (shadow-neon-cyan/20 → removed)
- Preserved: Functional overlay gradients for text readability (ProfileView, DiscoverView)
- Action 11.5.1.5: Apply direction to all pages - Batch 2 complete (5 views)
2026-01-16 12:02:55 +01:00
senke
8ff0148ad2 aesthetic-improvements: apply design direction to pages batch 3 (Action 11.5.1.5)
- Pages: Updated remaining spacing issues (p-6 → p-8, space-y-6 → space-y-8, gap-6 → gap-8)
  - DashboardPage, DeveloperPage, GearPage, DesignSystemDemoPage, MarketplaceHome
- Views: Updated spacing (space-y-6 → space-y-8, gap-6 → gap-8, p-6 → p-8)
  - FileManagerView, NotificationsView, SocialView, FileDetailsView, UploadView, MarketplaceView, GearView, LiveView, ProfileView
- Action 11.5.1.5: Apply direction to all pages - Batch 3 complete (5 pages + 9 views = 14 files)
2026-01-16 12:00:50 +01:00
senke
5a2f4508eb aesthetic-improvements: apply design direction to pages batch 2 (Action 11.5.1.5)
- Pages: Updated padding (p-6 → p-8) and spacing (space-y-6 → space-y-8, gap-6 → gap-8) for 8px grid alignment
  - LivePage, SocialPage, EducationPage, QueuePage, DeveloperPage, SettingsPage
- Views: Updated spacing and removed decorative effects
  - ProfileView: Removed decorative hover scale (group-hover:scale-105), replaced decorative gradient with solid color (bg-gradient-to-r → bg-kodo-ink), updated spacing
  - CheckoutView, FileDetailsView, AnalyticsView, GearView, DiscoverView, StudioView, SearchPageView, EducationView, CartView: Updated spacing (space-y-6 → space-y-8, gap-6 → gap-8, p-6 → p-8)
- Action 11.5.1.5: Apply direction to all pages - Batch 2 complete (6 pages + 10 views = 16 files)
2026-01-16 11:58:55 +01:00
senke
5dee33df00 aesthetic-improvements: apply design direction to pages batch 1 (Action 11.5.1.5)
- DashboardPage: Replaced decorative chart gradient with solid color (bg-gradient-to-t → bg-kodo-steel/30, removed hover gradient change)
- SearchPage: Updated section spacing (space-y-6 → space-y-8) for 8px grid alignment
- DesignSystemDemoPage: Updated section spacing (space-y-6 → space-y-8) and grid gaps (gap-6 → gap-8) for 8px grid alignment
- Action 11.5.1.5: Apply direction to all pages - Batch 1 complete (3 pages)
2026-01-16 11:55:42 +01:00
senke
8633878c42 aesthetic-improvements: add visual grid overlay tool (Action 11.2.1.4)
- Created grid overlay utility (apps/web/src/utils/gridOverlay.ts) for dev mode
- Toggle with Ctrl+G (Cmd+G on Mac) keyboard shortcut
- Shows 8px grid overlay to visualize spacing alignment
- Only works in development mode (import.meta.env.DEV)
- Initialized in main.tsx after app setup
- Action 11.2.1.4: Add visual grid overlay tool (dev only) - COMPLETE
2026-01-16 11:53:29 +01:00
senke
9a114d4e20 aesthetic-improvements: align spacing to 8px grid (Action 11.2.1.3)
- Created automated script (scripts/align-8px-grid.py) to align all spacing to 8px grid
- Replaced non-8px-aligned spacing: gap-3/p-3/m-3 (12px) → gap-4/p-4/m-4 (16px), gap-5/p-5/m-5 (20px) → gap-6/p-6/m-6 (24px), gap-10/p-10/m-10 (40px) → gap-12/p-12/m-12 (48px), gap-20/p-20/m-20 (80px) → gap-24/p-24/m-24 (96px)
- Preserved: 4px values (gap-1, p-1, m-1) as they may be intentional fine-tuning, responsive breakpoints (sm:, md:, lg:), test files, documentation
- Modified files across all components to ensure consistent 8px grid alignment
- Action 11.2.1.3: Align all elements to 8px grid - COMPLETE
2026-01-16 11:50:46 +01:00
senke
74dc7ce4e1 aesthetic-improvements: fix inconsistent selected track styling in LibraryPage (Action 11.3.1.3)
- Fixed mixed cyan/steel styling: bg-kodo-cyan/15 → bg-kodo-steel/15 for consistency
- Selected track state now uses consistent steel colors throughout
- Action 11.3.1.3: final consistency fix
2026-01-16 11:47:43 +01:00
senke
833bff61d0 aesthetic-improvements: automated replacement of decorative cyan with steel (80/20 rule, Action 11.3.1.3)
- Created automated script (scripts/replace-decorative-cyan.py) to systematically replace decorative/informational kodo-cyan instances with kodo-steel variants
- Script intelligently preserves active/functional states, design system variants, semantic indicators, and interactive states
- Modified 85 files, replaced 145 decorative instances, preserved 47 functional instances
- No linter errors, type safety maintained
- Action 11.3.1.3 significantly advanced (total: ~302 instances replaced across ~229 files including previous batches)
2026-01-16 11:40:13 +01:00
senke
ea576309a4 aesthetic-improvements: reduce decorative cyan in layout and settings (80/20 rule, batch 15)
- Layout: AudioPlayer decorative queue icon (1 instance)
- Settings: AccountSettings decorative icon (1 instance)
- Components: BulkModeBanner decorative close button text (1 instance)
- Total: ~3 files, ~3 instances replaced
- Preserved: Active/selected states (AudioPlayer selected queue tab, BulkModeBanner active state banner - functional active mode indicator, AccountSettings selected theme, CreatorModal selected visibility option, GroupCard public/private badges - semantic indicators, dialog.tsx confirm/info variants - design system variants), functional elements, design system variants, semantic status indicators, interactive states, functional loading indicators, informational alerts/toasts
- Action 11.3.1.3 in progress (fifteenth batch: layout and settings components)
2026-01-16 11:35:43 +01:00
senke
0a6e284571 aesthetic-improvements: reduce decorative cyan in education and services (80/20 rule, batch 14)
- Education: CertificateModal decorative student name text, CourseLearningView decorative file icon, QuizModal decorative icon (3 instances)
- Services: chatService mock data decorative role color (2 instances)
- Total: ~4 files, ~5 instances replaced
- Preserved: Active/selected states (CourseLearningView active lesson background and icon, QuizModal selected answer, dashboard/TrackList current track indicators and playing animation, ThemeSwitcher selected theme, StatCard cyan color option - design system variant), functional elements (QuizModal progress bar), design system variants, semantic status indicators, interactive states, functional loading indicators, informational alerts/toasts
- Action 11.3.1.3 in progress (fourteenth batch: education and services components)
2026-01-16 11:34:18 +01:00
senke
715ed13fff aesthetic-improvements: reduce decorative cyan in chat, auth, player, streaming, and dashboard (80/20 rule, batch 13)
- Chat: ChatSidebar loading spinner and decorative icon, VirtualizedChatMessages decorative attachment badge, ChatPage decorative icon and loading spinner border/text, ChatMessage decorative username indicator and icon (7 instances)
- Auth: TwoFactorVerify decorative icon (1 instance)
- Player: PlayerLoading decorative spinner (1 instance)
- Streaming: PlaybackSummary decorative icon (1 instance)
- Dashboard: DashboardPage decorative chart color and gradient and icon (3 instances)
- Total: ~13 files, ~13 instances replaced
- Preserved: Active/selected states (ChatSidebar selected conversation, ChatMessage isMe message bubble and highlighted message, DashboardPage selected button 30J, ChatInput drag active overlay and emoji picker active, TrackFilters active filter badge, TrackHistory current track, TrackGridDensitySelector selected density, PlaybackSpeedControl selected speed, ViewToggle selected view mode, TrackList selected tracks, TrackListRow selected state, PlaylistList selected view mode, QualitySelector selected quality, SettingsPage selected tab and theme, LoginForm checkbox accent - focus/interaction, RegisterPage checkbox accent - focus/interaction), functional links (ForgotPasswordPage link, TwoFactorVerify links, RegisterPage links, AuthLayout link, ProfileForm links, LoginPage link, RegisterPage link), design system variants, semantic status indicators, interactive states, functional loading indicators, informational alerts/toasts
- Action 11.3.1.3 in progress (thirteenth batch: chat, auth, player, streaming, and dashboard components)
2026-01-16 11:32:55 +01:00
senke
ae1a68cdc2 aesthetic-improvements: fix missed AutoMetadataDetectionModal loading spinner border (80/20 rule, batch 12 follow-up)
- AutoMetadataDetectionModal: loading spinner border (border-t-kodo-cyan → border-t-kodo-steel)
- Action 11.3.1.3 in progress (twelfth batch follow-up)
2026-01-16 11:30:28 +01:00
senke
5a8ad41969 aesthetic-improvements: reduce decorative cyan in player, library, and views (80/20 rule, batch 12)
- Player: VisualizerSettingsModal decorative icon (1 instance)
- Library: QueueView decorative artist text, AutoMetadataDetectionModal decorative icon and loading spinner border and fileName text and detected key text, SaveQueueAsPlaylistModal decorative icon, EditPlaylistModal decorative icon, PlaylistsView loading spinner, CreatePlaylistModal decorative icon (7 instances)
- Views: StudioView decorative icon, FileDetailsView decorative icon, GearView decorative icons and order number text, ProfileView loading spinner and social icons, AnalyticsView loading spinner and decorative chart legend dot and chart bars and device icon and revenue text, DiscoverView loading spinner and decorative icon and weekly mix text, FileManagerView decorative music icons (14 instances)
- Total: ~22 files, ~22 instances replaced
- Preserved: Active/selected states (LyricsPanel autoScroll active state, VisualizerSettingsModal selected mode, PlayerControls shuffle/repeatMode/showVisualizer active states, MiniPlayer isQueueOpen active state, AddToPlaylistModal selected playlist, PlaylistDetailView dragged item, StudioView active tab, SearchBar focused state, CheckoutView checkbox accents - focus/interaction, SearchPageView radio button accent - focus/interaction, FileManagerView selected files checkmarks - active states, ProfileView social links - functional links, LiveView links - functional links), primary actions, design system variants
- Action 11.3.1.3 in progress (twelfth batch: player, library, and views components)
2026-01-16 11:30:07 +01:00
senke
a0c595df0a aesthetic-improvements: reduce decorative cyan across multiple component categories (80/20 rule, batch 11)
- Social: FeedView, ConnectionsView, GroupsView, ExploreView, GroupDetailView loading spinners and decorative text, CreatePostModal decorative select text and hashtag links, PostCard decorative tag links and waveform bars and view comments link, CreateGroupModal decorative icon (9 instances)
- Settings: DataExportModal decorative icon, LoginHistory decorative IP text, AppearanceSettingsView decorative icon and selected theme checkmark, BackupsView decorative icon, CloudIntegrationView decorative icon, AccessibilitySettingsView decorative icon, SecuritySettings decorative icon, PasskeyModal decorative icon and loading spinner (8 instances)
- Studio: ProjectsManager loading spinner and progress percentage text, CloudFileBrowser decorative music icons, AIToolsView decorative music icon, ConnectivityView decorative icon, CreateProjectModal decorative icon, CloudSettingsView decorative icon (6 instances)
- Admin: AdminDashboardView loading spinner and decorative chart bars and icon, AdminSettingsView decorative icon, AdminModerationView loading spinner, AdminUsersView loading spinner (5 instances)
- Inventory: InventoryView loading spinner, EquipmentCard decorative price icon, EquipmentDetailView loading spinner and decorative icons and price text, AddEquipmentView decorative icon (5 instances)
- Seller: CreateProductView decorative icon, SellerDashboardView loading spinner and decorative icon and sales text (3 instances)
- Live: LiveStreamDetailView decorative streamer name text (1 instance)
- Developer: DeveloperDashboardView loading spinner, WebhooksView decorative icon (2 instances)
- Upload: BulkUploadModal decorative icon, FilePreviewCard decorative audio file icon, MetadataForm decorative button text, CoverArtUploadModal decorative icon, LyricsEditorModal decorative icon (5 instances)
- Notifications: NotificationItem decorative follow icon and mark as read button, NotificationBell decorative mark all read link (3 instances)
- Total: ~46 files, ~46 instances replaced
- Preserved: Active/selected states (CloudFileBrowser selected files checkmarks, CreatePostModal post type active state, GroupCard/GroupDetailView public/private badges - semantic indicators, DataExportModal checkbox accents - focus/interaction, AppearanceSettingsView selected theme - active state, PasskeyModal checkbox accent - focus/interaction, LyricsEditorModal checkbox accent - focus/interaction, FileUploadZone drag active state - active state, EquipmentDetailView support link - functional link, FlashSaleModal link - functional link, EquipmentDetailView image indicator dots - active state), primary actions, design system variants
- Action 11.3.1.3 in progress (eleventh batch: social, settings, studio, admin, inventory, seller, live, developer, upload, notifications components)
2026-01-16 11:26:33 +01:00
senke
2618da2e5c aesthetic-improvements: reduce decorative cyan in marketplace, gamification, commerce, and education (80/20 rule, batch 10)
- Marketplace: LicenceDetailsModal decorative icon and price text, ProductDetailView decorative author text, ReviewProductModal decorative icon, LicenceCard decorative price text (4 instances)
- Gamification: AchievementCard decorative XP reward text, LeaderboardView loading spinner and decorative XP text, ProfileXPView loading spinner and decorative icons, AchievementsView loading spinner (5 instances)
- Commerce: WishlistView decorative price text, PromoCodeModal decorative icon, CartItem decorative license tag icon, OrderSummary decorative total price text (4 instances)
- Education: MyCoursesView decorative icon (1 instance)
- Total: ~14 files, ~14 instances replaced
- Preserved: Functional links (LicenceDetailsModal legal contract link), active/selected states (CourseLearningView active lesson, QuizModal selected answer - already preserved), primary actions, design system variants
- Action 11.3.1.3 in progress (tenth batch: marketplace, gamification, commerce, and education components)
2026-01-16 11:23:25 +01:00
senke
5808b466a8 aesthetic-improvements: reduce decorative cyan in UI components (80/20 rule, batch 9)
- LiveView: decorative chat message username color (text-kodo-cyan → text-kodo-steel)
- Sidebar: decorative section header icon (text-kodo-cyan → text-kodo-steel)
- CartView: decorative promo code link (text-kodo-cyan → text-kodo-steel)
- Total: ~3 files, ~3 instances replaced
- Preserved: Functional links (LoginPage register link, RegisterPage login link, LiveView streamer profile link, LiveView wallet link), design system variants (Spinner default variant, alert.tsx info variant, badge.tsx cyan variant, ErrorDisplay.tsx info variant, Toast.tsx info variant, Alert.tsx info variant - intentional design system options), semantic status indicators (PasswordStrengthIndicator strong password - semantic color), interactive states (radio-group.tsx focus/interaction, select.tsx selected option, dropdown-menu.tsx checked state), primary actions
- Action 11.3.1.3 in progress (ninth batch: UI components decorative elements)
2026-01-16 11:21:33 +01:00
senke
a9e26de850 aesthetic-improvements: reduce decorative cyan in views and pages (80/20 rule, batch 8)
- Loading spinners: PurchasesView, NotificationsView, MarketplaceView, EducationView, SearchPageView (text-kodo-cyan → text-kodo-steel, 5 instances)
- Decorative text/emphasis: CartView total price, CheckoutView total price, FullPlayer artist name, DashboardPage username highlight (text-kodo-cyan → text-kodo-steel, 4 instances)
- Decorative icons: CheckoutView credit card icon, CreateGroupModal header icon, DeveloperPage icon, SocialPage icon, DashboardPage activity icons (text-kodo-cyan → text-kodo-steel, 5 instances)
- Informational badges: PurchasesView product type badge (text-kodo-cyan → text-kodo-steel, 1 instance)
- Total: ~10 files, ~15 instances replaced
- Preserved: Active/selected states (DashboardPage selected button 30J, CheckoutView checkbox accents - focus/interaction, SearchPageView radio button accent - focus/interaction), primary actions, design system variants, functional loading indicators (PlayerLoading spinner - already preserved)
- Action 11.3.1.3 in progress (eighth batch: views and pages decorative elements)
2026-01-16 11:19:41 +01:00
senke
8892163279 aesthetic-improvements: reduce decorative cyan in track detail and library (80/20 rule, batch 7)
- TrackDetailPage: decorative empty state icon (text-kodo-cyan → text-kodo-steel) and informational play count text (text-kodo-cyan → text-kodo-steel)
- LibraryPage: decorative genre badges (bg-kodo-cyan/10 text-kodo-cyan → bg-kodo-steel/10 text-kodo-steel, 2 instances: grid view and list view)
- Total: ~2 files, ~4 instances replaced
- Preserved: Active/selected states (LibraryPage view mode selection, selected tracks, TrackList selected tracks, TrackListRow selected state, QualitySelector selected quality, PlaybackSpeedControl selected speed, PlaylistBatchActions batch mode banner, ChatSidebar selected conversation, TrackFilters active filters badge, PlaylistList selected view mode, TrackGridDensitySelector selected density, ViewToggle selected view mode), semantic status indicators (TrackHistory updated action), functional loading indicators (PlayerLoading spinner), primary actions, design system variants
- Action 11.3.1.3 in progress (seventh batch: track detail and library genre badges)
2026-01-16 11:17:46 +01:00
senke
b82385c34b aesthetic-improvements: complete ServerErrorPage text color replacement (80/20 rule, batch 6 follow-up)
- ServerErrorPage: list items text color (text-kodo-cyan → text-kodo-steel)
- Action 11.3.1.3 in progress (sixth batch follow-up)
2026-01-16 11:16:13 +01:00
senke
6e9f71e25b aesthetic-improvements: reduce decorative cyan in error and chat components (80/20 rule, batch 6)
- NotFoundPage: decorative icon background (bg-kodo-cyan/20 → bg-kodo-steel/20, icon text-kodo-cyan → text-kodo-steel)
- ServerErrorPage: informational status box (bg-kodo-cyan/10 → bg-kodo-steel/10, border-kodo-cyan → border-kodo-steel, icon/text text-kodo-cyan → text-kodo-steel)
- ChatRoom: empty state icon background (bg-kodo-cyan/10 → bg-kodo-steel/10, border-kodo-cyan/20 → border-kodo-steel/20, icon text-kodo-cyan → text-kodo-steel)
- PlaybackHeatmap: stats box background (bg-kodo-cyan/10 → bg-kodo-steel/10, text-kodo-cyan → text-kodo-steel)
- Total: ~4 files, ~5 instances replaced
- Preserved: Active/functional states (ChatInput drag active overlay, ChatRoom highlighted message, TrackFilters active filters badge, PlaylistBatchActions batch mode banner, PlaybackHeatmap intensity visualization - functional), semantic status indicators (TrackHistory updated action - semantic color)
- Action 11.3.1.3 in progress (sixth batch: error pages and chat components)
2026-01-16 11:15:52 +01:00
senke
8fdc7a60c2 aesthetic-improvements: reduce more decorative cyan backgrounds (80/20 rule, batch 5)
- PostCard: poll progress bar background (bg-kodo-cyan/20 → bg-kodo-steel/20) - decorative visualization
- SharePostModal: quote option icon background (bg-kodo-cyan/10 → bg-kodo-steel/10, text-kodo-cyan → text-kodo-steel) - decorative icon
- TrackAnalyticsView: chart bar background (bg-kodo-cyan/20 → bg-kodo-steel/20) - decorative visualization
- Total: ~3 files, ~3 instances replaced
- Preserved: Active/selected states (QuizModal selected answer, CourseLearningView active lesson), primary actions
- Action 11.3.1.3 in progress (fifth batch: social and analytics decorative elements)
2026-01-16 11:13:36 +01:00
senke
f5cac99b3a aesthetic-improvements: apply design direction to LibraryPage
- Spacing (8px grid): space-y-6 → space-y-8, gap-6 → gap-8 (2 instances), space-y-3 → space-y-4 (align to 8px grid)
- Card padding: p-6 → p-8 for loading skeleton cards (32px standard)
- Replace decorative gradients: track card cover and list view item number backgrounds from bg-gradient-to-br to solid bg-kodo-ink (2 instances)
- Preserved: Functional hover effects (hover:bg-white/5, hover:border-kodo-steel/50, group-hover:text-white), primary actions (cyan for selected states, genre badges), existing functional gradients (overlay for play button visibility)
- Action 11.5.1.4 complete 
2026-01-16 11:11:31 +01:00
senke
61aac84204 aesthetic-improvements: apply design direction to DashboardPage
- Spacing (8px grid): space-y-6 → space-y-8, gap-6 → gap-8, space-y-3 → space-y-4 (align to 8px grid)
- Remove excessive hover effects: removed group-hover:scale-110 on stat card icons and activity item icons (decorative scale transforms)
- Replace decorative gradients: stat card backgrounds from bg-gradient-to-br to solid bg colors (from-kodo-cyan/10 to-kodo-cyan/5 → bg-kodo-cyan/10, etc.)
- Preserved: Functional hover effects (hover:bg-white/10, hover:border-kodo-steel/50), primary actions (cyan for primary stat), existing card padding (p-6/p-8 already aligned)
- Action 11.5.1.3 complete 
2026-01-16 11:10:17 +01:00
senke
5e76354d89 aesthetic-improvements: reduce informational cyan backgrounds (80/20 rule, batch 4)
- OfflineQueueManager: normal priority badge and info banner (2 instances) - informational status indicators
- Total: ~1 file, ~2 instances replaced
- Preserved: Active/selected states (select.tsx selected option), design system variants (badge.tsx cyan variant, StatCard.tsx cyan variant - intentional design system options), informational alerts/toasts (alert.tsx info, Toast.tsx info, ErrorDisplay.tsx info - important status indicators), BulkModeBanner active state (functional active mode indicator)
- Action 11.3.1.3 in progress (fourth batch: informational status indicators)
2026-01-16 11:08:45 +01:00
senke
0e446f3d71 aesthetic-improvements: replace Header decorative icon (80/20 rule, batch 3 follow-up)
- Header.tsx: decorative icon background (bg-kodo-cyan/20 → bg-kodo-steel/20, border-kodo-cyan/30 → border-kodo-steel/30, icon text-kodo-cyan → text-kodo-steel, shadow-neon-cyan/20 → shadow-2xl)
- Preserved: Header active notification state (isUserMenuOpen) - correctly keeps cyan
- Action 11.3.1.3 in progress (third batch follow-up)
2026-01-16 11:07:31 +01:00
senke
6edb5268e9 aesthetic-improvements: reduce more decorative cyan backgrounds (80/20 rule, batch 3)
- Layout components: Sidebar hub header icon, Header icon background (2 instances) - decorative icons
- AutoMetadataDetectionModal: modal border (decorative)
- CourseDetailView: card border (decorative)
- Total: ~4 files, ~4 instances replaced
- Preserved: Active/selected states (AudioPlayer dragged item, Header active notification, VisualizerSettingsModal selected mode, CreateProjectModal selected DAW, AIToolsView active tool, CourseLearningView active lesson, TipStreamerModal selected payment, CloudFileBrowser active tag, PlaylistDetailView dragged item, AddToPlaylistModal selected playlist, CreatorModal selected visibility)
- Action 11.3.1.3 in progress (third batch: layout and modal decorative elements)
2026-01-16 11:07:01 +01:00
senke
a279219553 aesthetic-improvements: reduce more decorative cyan backgrounds (80/20 rule, batch 2)
- Settings modals: DataExportView, ChangeEmailModal, PasskeyModal decorative icon backgrounds (3 instances)
- DashboardPage: chart bars and tooltip (decorative visualization, 2 instances)
- TwoFactorSetup: decorative icon background (1 instance)
- Total: ~6 files, ~6 instances replaced
- Preserved: Active/selected states (DashboardPage selected button, TrackList current track indicator, StudioView active tab, SessionManagement current session, AccountSettings selected theme, IntegrationsView connected state)
- Action 11.3.1.3 in progress (second batch: settings modals and chart visualization)
2026-01-16 11:05:45 +01:00
senke
a25625c41a aesthetic-improvements: reduce decorative cyan backgrounds (80/20 rule)
- KodoEmptyState: decorative background blur and border (bg-kodo-cyan/20 → bg-kodo-steel/20, border-kodo-cyan/30 → border-kodo-steel/30, icon text-kodo-cyan → text-kodo-steel)
- PWAInstallBanner: decorative icon background and blur effect (2 instances)
- Page headers: SettingsPage, GearPage, DeveloperPage, SocialPage icon backgrounds (4 instances) - decorative header icons
- DashboardPage: activity item icon gradient background (decorative)
- FileManagerView: selection banner background (decorative)
- Total: ~8 files, ~9 instances replaced
- Preserved: Active/selected states (StudioView active tab, AccountSettings selected theme, SessionManagement current session), primary actions, informational alerts
- Action 11.3.1.3 in progress (first batch: decorative backgrounds)
2026-01-16 11:03:48 +01:00
senke
730510babd aesthetic-improvements: replace remaining secondary cyan hover states with steel
- TrackListSelectionActions: clear selection button hover (1 instance)
- CreateGroupModal: upload zone placeholder text hover (1 instance)
- AddToPlaylistModal: new playlist button icon hover (1 instance)
- Total: ~3 files, ~3 instances replaced
- Preserved: Primary send button (ChatInput), all primary player controls, all primary CTAs
- Action 11.3.1.2 in progress (sixth batch complete)
2026-01-16 11:00:12 +01:00
senke
1ec38f8397 aesthetic-improvements: replace secondary cyan hover states with steel (batch 5)
- PlayerControls: visualizer toggle hover text (1 instance)
- Header: theme toggle hover text (1 instance)
- PlaylistCard: checkbox hover border (1 instance)
- GearView: equipment card hover border (1 instance)
- ProfileView: track title hover text (1 instance)
- ProjectsManager: project title hover text (1 instance)
- CourseCard: course title hover text (1 instance)
- TwoFactorSetup: 2FA option hover states (2 instances: bg and text)
- Total: ~8 files, ~9 instances replaced
- Preserved: Active/selected states (cyan), primary actions (cyan)
- Action 11.3.1.2 in progress (fifth batch complete)
2026-01-16 10:59:09 +01:00
senke
9679cafcda aesthetic-improvements: replace DashboardPage activity item hover
- DashboardPage: activity item title hover text (1 instance)
- Completes batch 4 replacement
2026-01-16 10:57:30 +01:00
senke
fed8a01dc8 aesthetic-improvements: replace secondary cyan hover states with steel (batch 4)
- LibraryPage: card hover border, title hover text (3 instances, also removed scale transform)
- ProductCard: title hover text (1 instance)
- TrackListSelectionActions: action button hovers (5 instances: play, like, download, more, clear) - replaced with hover:bg-white/5
- AuthLayout: footer link hover text (1 instance)
- Pages: SocialPage, GearPage, DeveloperPage outline button hovers (3 instances)
- SocialPage: comment button hover text (1 instance)
- Total: ~8 files, ~14 instances replaced
- Preserved: Primary buttons (cyan), player control buttons (cyan - primary actions), AuthButton primary variant (cyan)
- Action 11.3.1.2 in progress (fourth batch complete)
2026-01-16 10:57:14 +01:00
senke
361885b855 aesthetic-improvements: replace secondary cyan hover states with steel (batch 3)
- UI components: accordion hover text (1 file)
- Player components: AudioPlayer, MiniPlayer icon button hovers (2 files, 3 instances)
- Social components: CreatePostModal, SharePostModal, ProductDetailView (3 files, 3 instances)
- Settings: AccessibilitySettingsView hover text (1 file)
- Analytics: TrackAnalyticsView, AnalyticsView chart bar hovers (2 files, 2 instances)
- Gamification: LeaderboardView hover text (1 file)
- Upload: FileUploadZone hover border (1 file)
- Banner: BulkModeBanner close button hover (1 file)
- Total: ~12 files, ~15 instances replaced
- Preserved: Focus rings (cyan), active/selected states (cyan), primary actions (cyan)
- Note: ChatSidebar selected state hover kept cyan (primary state)
- Note: VirtualizedChatMessages scroll button kept cyan (primary action)
- Action 11.3.1.2 in progress (third batch complete)
2026-01-16 10:55:42 +01:00
senke
35a28eae9c aesthetic-improvements: replace secondary cyan hover states with steel (batch 2)
- Card components: CartItem, WishlistView, PostCard, GroupCard, PlaylistsView, UserCard (7 files)
- Settings components: BackupsView, SessionManagement, CloudIntegrationView, OfflineQueueManager (4 files)
- DashboardPage: stat cards and activity items hover states (2 instances)
- FeedView: input and button hover states (2 instances)
- Upload zones: MetadataForm, CreatePlaylistModal, CreateProductView, AddEquipmentView, CreateGroupModal (5 files, 6 instances)
- UserCard: avatar border hover state
- Total: ~18 files, ~20 instances replaced
- Preserved: Focus rings (cyan), active/selected states (cyan)
- Action 11.3.1.2 in progress (second batch complete)
2026-01-16 10:53:34 +01:00
senke
4701dde9bc aesthetic-improvements: replace secondary cyan hover states with steel
- Button outline variant: hover:border-kodo-cyan/50 → hover:border-kodo-steel/50
- Header secondary nav: hover:text-kodo-cyan → hover:text-white, hover:bg-kodo-cyan/5 → hover:bg-white/5
- FileManagerView: hover:border-kodo-cyan/50 → hover:border-kodo-steel/50 (kept selected state cyan)
- ProjectsManager: hover:border-kodo-cyan/50 → hover:border-kodo-steel/50, hover:text-kodo-cyan → hover:text-white
- GroupDetailView: hover:border-kodo-cyan/30 → hover:border-kodo-steel/50
- AIToolsView: hover:border-kodo-cyan/50 → hover:border-kodo-steel/50
- CloudFileBrowser: hover:border-kodo-cyan/50 → hover:border-kodo-steel/50 (kept selected state cyan)
- ProfileView: hover:border-kodo-cyan/50 → hover:border-kodo-steel/50
- CourseCard: hover:border-kodo-cyan/50 → hover:border-kodo-steel/50
- TwoFactorSetup: hover:border-kodo-cyan → hover:border-kodo-steel/50
- GearView: hover:text-kodo-cyan → hover:text-white, hover:border-kodo-cyan → hover:border-kodo-steel/50
- ChatInput: hover:text-kodo-cyan → hover:text-white (3 instances)
- ChatMessage: hover:text-kodo-cyan → hover:text-white (2 instances)
- ChatRoom: hover:text-kodo-cyan → hover:text-white
- AddToPlaylistModal: hover:border-kodo-cyan → hover:border-kodo-steel/50, hover:text-kodo-cyan → hover:text-white
- Preserved focus rings (cyan) and active/selected states (cyan) as per audit
- Action 11.3.1.2 in progress (first batch of ~15 files)
2026-01-16 10:51:30 +01:00
senke
933c7d4ede aesthetic-improvements: add consistent section spacing utility variables
- Added --section-spacing: 2rem (32px) for standard section spacing
- Added --section-spacing-lg: 3rem (48px) for large section spacing
- Both values align to 8px grid system (32px = 4× base, 48px = 6× base)
- Values match spacing increases from Action 11.4.3.3
- Documentation added with usage examples
- Provides reusable utility for consistent section spacing across pages
- Action 11.4.3.4 complete
2026-01-16 10:44:55 +01:00
senke
2b0fff28c9 aesthetic-improvements: increase spacing between sections across all pages
- Increased DashboardPage main container from space-y-8 (32px) to space-y-12 (48px)
- Increased standard section spacing from space-y-6 (24px) to space-y-8 (32px) in 8 pages:
  EducationPage, SettingsPage, QueuePage, GearPage, LivePage, DeveloperPage, SocialPage, SearchPage
- All values align to 8px grid system (32px = 4× base, 48px = 6× base)
- Provides more whitespace between major sections, improving visual hierarchy
- Aligns with Surgical Minimalism principle of increased whitespace
- Total: 9 pages updated
- Action 11.4.3.3 complete
2026-01-16 10:43:42 +01:00
senke
c12905db25 aesthetic-improvements: increase card padding for more whitespace
- Increased CardHeader padding from p-6 (24px) to p-8 (32px)
- Increased CardContent padding from p-6 (24px) to p-8 (32px)
- Increased CardFooter padding from p-6 (24px) to p-8 (32px)
- All values align to 8px grid system (32px = 4× base)
- Provides more breathing room and improves visual hierarchy
- Aligns with Surgical Minimalism principle of increased whitespace
- Action 11.4.3.1 complete
2026-01-16 10:39:37 +01:00
senke
cb4748ba24 aesthetic-improvements: remove gradients from card components
- Removed decorative hover gradient overlay from UserCard
- Replaced gradient backgrounds with solid colors in PostCard, MyCoursesView, DiscoverView
- Genre cards now use solid bg-kodo-graphite with border instead of colorful gradients
- All card components now use solid backgrounds, aligning with Surgical Minimalism
- Updated 4 files: UserCard, PostCard, MyCoursesView, DiscoverView
- Action 11.4.2.1 complete
2026-01-16 10:36:29 +01:00
senke
ec1f4e583a aesthetic-improvements: remove excessive hover effects from high-priority files
- Removed scale transforms (hover:scale-[1.02], hover:scale-110, group-hover:scale-110/105) from cards and images
- Removed decorative shadow/glow effects (hover:shadow-neon-cyan/20, hover:shadow-lg) from cards
- Removed hover-lift class (translateY + shadow) from base Card and Button components
- Replaced excessive effects with subtle hover:bg-white/5 or hover:opacity-90
- Preserved functional hover states (group-hover:opacity-100 for play overlays, hover:bg-accent/50 for interactive feedback)
- Updated 14 files: ProductCard, TrackCard, CourseCard, EquipmentCard, PostCard, ProfileView, card.tsx, SearchPage, PlayerControls, OrderSummary, DiscoverView, PlaylistCard, Sidebar, button.tsx
- Effects are now subtle and purposeful, aligning with Surgical Minimalism
- Action 11.4.1.3 complete
2026-01-16 10:34:41 +01:00
senke
4ceefadaa7 aesthetic-improvements: add automated contrast testing for WCAG compliance
- Created contrast utility (apps/web/src/utils/contrast.ts)
  - getRelativeLuminance() - calculates WCAG relative luminance
  - getContrastRatio() - calculates contrast ratio between colors
  - meetsWCAGAA() / meetsWCAGAAA() - validates WCAG standards
  - parseRGB() - parses RGB strings from CSS variables
- Created contrast test suite (apps/web/src/__tests__/contrast.test.ts)
  - Tests all design system color combinations
  - Validates primary text (white) on all backgrounds
  - Validates secondary text (dim) on all backgrounds
  - Validates text with opacity variants
  - All combinations must meet WCAG AA (4.5:1)
- Added contrast test step to CI workflow
- Prevents contrast ratio regressions
- Action 11.1.1.5 complete
2026-01-16 10:26:20 +01:00
senke
41a5272a83 aesthetic-improvements: use dim text sparingly for better contrast
- Updated button variants (outline, ghost) to use text-white
- Updated empty state descriptions to use text-white with opacity
- Updated page subtitles to use text-white opacity-80
- Updated Navbar interactive elements to use text-white
- Preserved text-kodo-secondary for truly secondary info (metadata, timestamps, helper text)
- Action 11.1.1.2 complete
2026-01-16 10:14:17 +01:00
senke
d69f637d99 aesthetic-improvements: verify spacing scale aligns to 8px grid
- Verified all spacing values in design-tokens.css
- Documented 8px-aligned values (8 values) vs non-aligned (5 values)
- Updated comments with 8px grid alignment status
- Added recommendations to prefer 8px-aligned values
- Action 11.2.1.2 complete
2026-01-16 10:04:40 +01:00
senke
e4fa4519b1 aesthetic-improvements: document 8px grid system
- Created GRID_SYSTEM.md documentation
- Documents 8px base grid system for visual rhythm
- Spacing scale table with 8px-aligned values
- Usage guidelines and examples
- Migration notes for current spacing system
- Action 11.2.1.1 complete
2026-01-16 02:36:07 +01:00
senke
c740b26651 aesthetic-improvements: change primary text color to white
- Changed --kodo-text-main from #F3F3E0 (Quiet Paper) to #FFFFFF (white)
- Improves contrast and readability on dark backgrounds
- Better WCAG AA compliance
- Action 11.1.1.1 complete
2026-01-16 02:34:55 +01:00
senke
ced0bda1a4 cognitive-load: add first-time user detection utility
- Created firstTime utility for detecting first-time users
- Functions: isFirstTime, markAsNotFirstTime, isOnboardingCompleted, markOnboardingCompleted
- Uses localStorage to persist state across sessions
- Graceful error handling with logger warnings
- SSR-safe (returns false on server)
- Can be integrated with Onboarding component
- Action 10.4.1.4 complete
2026-01-16 02:33:46 +01:00
senke
99da2067c1 cognitive-load: create onboarding flow component for new users
- Created Onboarding component with multi-step flow
- Progress indicator shows current and completed steps
- Navigation: Next, Previous, Skip buttons
- Uses Dialog component for modal display
- Supports custom content per step
- French labels for UI
- Action 10.4.1.3 complete
2026-01-16 02:32:53 +01:00
senke
84354880b5 cognitive-load: make view mode toggle less prominent on LibraryPage
- Moved view mode toggle from two prominent buttons to dropdown menu
- Single button shows current view mode icon (Grid or List)
- Dropdown contains both view options with icons and labels
- Active option highlighted in dropdown
- Reduces visual prominence while preserving functionality
- List view kept as per audit recommendation
- Action 10.2.1.2 complete
2026-01-16 02:31:43 +01:00
senke
921f3dda55 cognitive-load: convert Collapsible to Accordion on dashboard
- Replaced Collapsible component with Accordion for Activity Feed section
- Uses AccordionItem, AccordionTrigger, and AccordionContent
- Accordion wraps the Tabs component (Chart and Activity tabs)
- Configuration: type='single', collapsible=true (starts closed)
- Improves consistency by using standardized Accordion component
- Action 10.1.1.5 complete
2026-01-16 02:30:39 +01:00
senke
3ef1598122 cognitive-load: organize secondary info in tabs on dashboard
- Added Tabs component to organize Activity Feed content
- Chart and Activity List now in separate tabs (Graphique, Activité)
- Reduces cognitive load by showing one view at a time
- Default tab is 'Graphique' (Chart)
- Tabs are inside the collapsible Activity Feed section
- Action 10.1.1.3 complete
2026-01-16 02:28:58 +01:00
senke
ab793d0157 cognitive-load: show only 2 key metrics on dashboard, hide rest behind View All
- Added progressive disclosure for dashboard metrics
- Shows first 2 metrics (Pistes écoutées, Messages envoyés) initially
- Hides Favoris and Amis actifs behind 'Voir tout' button
- Added 'Voir moins' button to collapse back to 2 metrics
- Reduces cognitive load by showing only essential metrics first
- Action 10.1.1.1 complete
2026-01-16 02:27:26 +01:00
senke
b3694baaa3 cognitive-load: add clear filters button to LibraryPage
- Added clear filters button inside AdvancedFilters component
- Button only visible when filters are active
- Clears all filters: search, genre, format, sort
- Uses RotateCcw icon and outline button variant
- Improves UX by allowing quick filter reset
- Action 10.3.1.3 complete
2026-01-16 02:25:46 +01:00
senke
f3f246b383 cognitive-load: hide advanced filters behind AdvancedFilters component
- Wrapped Genre, Format, and Sort filters in AdvancedFilters component
- Search input remains visible (basic functionality)
- Advanced filters hidden by default, expandable on demand
- Added tooltip to AdvancedFilters explaining functionality
- Reduces cognitive load through progressive disclosure
- Action 10.3.1.2 complete
2026-01-16 02:24:14 +01:00
senke
5724892ff7 cognitive-load: add tooltips to advanced features
- Added optional tooltip prop to AdvancedFilters component
- Added tooltips to LibraryPage view mode toggles (Grid/List)
- Added tooltip to LibraryPage sort button
- Added context-aware tooltip to LibraryPage bulk mode button
- Tooltips explain functionality and improve discoverability
- Action 10.4.1.2 complete
2026-01-16 02:22:41 +01:00
senke
645b51b465 cognitive-load: create AdvancedFilters component
- Created collapsible AdvancedFilters component for progressive disclosure
- Uses existing Collapsible component for consistency
- Supports controlled and uncontrolled modes
- Customizable label and optional filter icon
- Follows Kodo design system styling
- Ready to wrap Genre, Format, and Sort filters in LibraryPage
- Action 10.3.1.1 complete
2026-01-16 02:20:26 +01:00
senke
e39ecb8d8f consistency: add visual test page for Input component
- Added comprehensive visual test section to DesignSystemDemoPage
- Tests basic states (normal, with value, disabled, disabled with value)
- Tests 8 input types (text, email, password, number, search, url, tel, date)
- Tests width variations (full, half, fixed)
- Tests placeholder variations (with, without, long, short)
- Available at /design-system route for visual verification
- Action 9.5.1.6 complete
2026-01-16 02:18:06 +01:00
senke
43f710aeda consistency: add visual test page for button variants
- Added comprehensive visual test section to DesignSystemDemoPage
- Tests all 5 variants (default, destructive, outline, secondary, ghost)
- Tests all 4 sizes (sm, default, lg, icon)
- Tests all variant × size combinations (20 total)
- Tests normal and disabled states
- Available at /design-system route for visual verification
- Action 9.3.1.6 complete
2026-01-16 02:17:01 +01:00
senke
2637f2dd82 consistency: add JSDoc documentation for button variants
- Added comprehensive JSDoc comments for buttonVariants
- Documented all 5 variants (default, destructive, outline, secondary, ghost) with use cases
- Documented all 4 sizes (default, sm, lg, icon) with descriptions
- Added ButtonProps interface documentation with examples
- Added Button component documentation with usage examples
- Action 9.3.1.5 complete
2026-01-16 02:15:30 +01:00
senke
aa56a869ba consistency: simplify button glow effects
- Removed excessive glows from button variants
- default: removed base glow, reduced hover glow (30px→15px, opacity 0.5→0.3)
- destructive: removed hover glow
- outline: removed hover glow
- Buttons now have minimal, subtle glows for better visual hierarchy
- Action 9.3.1.4 complete
2026-01-16 02:14:52 +01:00
senke
90389c4602 consistency: remove unused button variants (neon, glass, premium, link)
- Removed neon, glass, premium, and link variants from Button component
- Replaced variant="link" in PostCard with variant="ghost" (with underline)
- Replaced variant="premium" in LibraryPage and FAB with variant="default"
- Updated COMPONENT_USAGE.md to reflect removed variants
- Remaining variants: default, destructive, outline, secondary, ghost
- Action 9.3.1.2 complete
2026-01-16 02:13:51 +01:00
senke
0a9ec0ebb6 consistency: replace custom components with design system components
- Fixed UserCard: removed invalid Card variant prop, fixed Button variants
- Fixed LicenceCard: removed invalid Card variant prop, fixed Button variants
- Replaced FormField Input with design system Input (removed Tailwind defaults)
- Replaced FormField Textarea with design system Textarea (removed Tailwind defaults)
- Replaced FormField Select with design system Select (maintained backward compatibility)
- All components now use design system components with proper error handling
- Action 9.2.1.6 complete
2026-01-16 02:11:40 +01:00
senke
d23afd2fdd consistency: create component usage guide
- Created comprehensive guide documenting design system components
- Documents Button, Card, Input, Select, Dialog, Alert, Badge components
- Includes use cases, variants, sizes, examples, and best practices
- Provides migration guide for custom implementations
- Action 9.2.1.4 complete
2026-01-16 02:08:56 +01:00
senke
44b6b3785a consistency: replace custom buttons with Button component (partial)
- Replaced custom button implementations with Button component in 14 files
- Files updated: LiveStreamDetailView, DashboardPage, CommentItem, PostCard, SocialPage, SocialView, AdminUsersView, UserTableRow, ProjectsManager, CloudFileBrowser, FileManagerView, CreatorModal, ImageCropper, BulkUploadModal
- ~31 buttons replaced across high-priority files
- Used appropriate Button variants: ghost, outline, default, secondary, link
- Preserved visual appearance with className overrides where needed
- Action 9.2.1.2 in progress (partial completion)
2026-01-16 02:06:14 +01:00
senke
07642eb3a9 consistency: fix final Tailwind default color instances 2026-01-16 01:59:56 +01:00
senke
1377df579d consistency: fix remaining Tailwind default colors in auth and features components 2026-01-16 01:59:31 +01:00
senke
a77dc9a631 consistency: fix remaining Tailwind default color edge cases 2026-01-16 01:58:12 +01:00
senke
564de2fd47 consistency: auto-migrate Tailwind default colors (Batch 14, 50 instances) 2026-01-16 01:57:08 +01:00
senke
a234eb354b consistency: auto-migrate Tailwind default colors (Batch 13, 110 instances) 2026-01-16 01:57:04 +01:00
senke
ccbf0923c0 consistency: auto-migrate Tailwind default colors (Batch 12, 62 instances) 2026-01-16 01:57:01 +01:00
senke
d007ab80d9 consistency: auto-migrate Tailwind default colors (Batch 11, 100 instances) 2026-01-16 01:56:57 +01:00
senke
d7fa337c95 consistency: auto-migrate Tailwind default colors (Batch 10, 130 instances) 2026-01-16 01:56:54 +01:00
senke
9c672b68aa consistency: auto-migrate Tailwind default colors (Batch 9, 70 instances) 2026-01-16 01:56:50 +01:00
senke
f7a75e90d1 consistency: auto-migrate Tailwind default colors (Batch 8, 47 instances) 2026-01-16 01:56:47 +01:00
senke
6afe3acca9 consistency: auto-migrate Tailwind default colors (Batch 7, 37 instances) 2026-01-16 01:56:44 +01:00
senke
4e6a696e61 consistency: auto-migrate Tailwind default colors (Batch 6, 21 instances) 2026-01-16 01:56:41 +01:00
senke
f4e2dd45d4 consistency: auto-migrate Tailwind default colors (Batch 5, 50 instances) 2026-01-16 01:56:37 +01:00
senke
dccd27022f consistency: auto-migrate Tailwind default colors (Batch 4, 114 instances) 2026-01-16 01:56:34 +01:00
senke
e1b872ede2 consistency: auto-migrate Tailwind default colors (Batch 3, 70 instances) 2026-01-16 01:56:30 +01:00
senke
20922d06bd consistency: auto-migrate Tailwind default colors (Batch 2, 64 instances) 2026-01-16 01:56:27 +01:00
senke
576b565a32 consistency: auto-migrate Tailwind default colors (Batch 1, 83 instances) 2026-01-16 01:56:24 +01:00
senke
2cf6073e11 consistency: migrate Tailwind default colors in CheckoutView and FileManagerView (Batches 19-20) 2026-01-16 01:49:52 +01:00
senke
7d9b6fc697 consistency: migrate Tailwind default colors in CartView and SearchPageView (Batches 17-18) 2026-01-16 01:48:26 +01:00
senke
bfbedfe85d consistency: migrate Tailwind default colors in AdminView and EducationView (Batches 15-16) 2026-01-16 01:47:43 +01:00
senke
7320c47f90 consistency: migrate Tailwind default colors in ProfileView.tsx (Batch 14) 2026-01-16 01:46:58 +01:00
senke
97fe963993 consistency: migrate Tailwind default colors in LiveView, StudioView, and UploadView (Batches 11-13) 2026-01-16 01:46:02 +01:00
senke
579c9b7521 consistency: migrate Tailwind default colors in SettingsView and SocialView (Batches 9-10) 2026-01-16 01:45:00 +01:00
senke
2180bcb2e0 consistency: migrate Tailwind default colors in PurchasesView.tsx (Batch 8) 2026-01-16 01:44:12 +01:00
senke
c7ae928514 consistency: migrate Tailwind default colors in NotificationsView.tsx (Batch 7) 2026-01-16 01:43:37 +01:00
senke
e23f724d39 consistency: migrate Tailwind default colors in DiscoverView.tsx (Batch 6) 2026-01-16 01:43:00 +01:00
senke
b8b265551c consistency: migrate Tailwind default colors in FileDetailsView.tsx (Batch 5) 2026-01-16 01:42:21 +01:00
senke
653573ff8e consistency: migrate Tailwind default colors in MarketplaceView.tsx (Batch 4) 2026-01-16 01:41:40 +01:00
senke
ddb1348da7 consistency: migrate Tailwind default colors in AnalyticsView.tsx (Batch 3) 2026-01-16 01:41:11 +01:00
senke
d29470663b cognitive-load: mark Tabs as complete and create Accordion component (Actions 10.1.1.2, 10.1.1.4)
- Action 10.1.1.2: Tabs component already exists at apps/web/src/components/ui/tabs.tsx
- Action 10.1.1.4: Created Accordion component at apps/web/src/components/ui/accordion.tsx
  - Components: Accordion, AccordionItem, AccordionTrigger, AccordionContent
  - Features: Single/multiple modes, controlled/uncontrolled, smooth animations
  - Design: Kodo design system styling, accessible, follows Tabs pattern
  - Ready for use in Dashboard and other pages for collapsible sections
2026-01-16 01:36:19 +01:00
senke
2e4a1cc40a consistency: simplify Card borders and shadows (Action 9.4.1.2)
- Changed shadow-xl to shadow-lg (simpler shadow)
- Simplified hover shadow from shadow-2xl + shadow-black/20 to shadow-lg
- Preserved border-white/5 (already correct)
- Result: Clean, simple Card styling with consistent shadow levels
2026-01-16 01:26:56 +01:00
senke
069785666a consistency: remove gradients from Card (Action 9.4.1.1)
- Removed group class (only used for gradient hover effect)
- Removed gradient overlay div (bg-gradient-to-br from-white/5 to-transparent)
- Removed wrapper div with z-10 (only needed for gradient overlay)
- Result: Clean Card component with no gradient decorations
- Preserved: All other functionality and styling (borders, shadows, hover effects)
2026-01-16 01:25:36 +01:00
senke
9b6b3a0d8b consistency: update Input focus state to cyan border (Action 9.5.1.4)
- Removed focus-visible:ring-2 focus-visible:ring-kodo-cyan (ring/glow effect)
- Changed focus-visible:border-kodo-cyan/50 to focus-visible:border-kodo-cyan (full opacity border)
- Result: Clean focus state with cyan border only, no ring/glow effect
- Preserved: All other functionality and styling
2026-01-16 01:24:24 +01:00
senke
fbec843da3 consistency: simplify Input styling classes (Action 9.5.1.3)
- Changed rounded-xl to rounded-lg (simpler border radius, 12px → 8px)
- Changed transition-all to transition-colors (more specific, only transitions color properties)
- Result: Cleaner, more performant styling with specific transitions
- Preserved: All essential functionality and focus ring (will be simplified in 9.5.1.4)
2026-01-16 01:22:58 +01:00
senke
2a43d94bc6 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
a6903c0cc3 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
13c11a276b 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
169c81dcca 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
d924565579 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
acd68b408b 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
75d16efb4b 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
7213e2516e 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
bd830914d4 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
5514134925 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
ae86927c79 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
3703fe3058 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
24a5e0df5a 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
916daa1751 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
9e3450f6cd 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
1d298cd724 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
6e4dd04fc7 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
a8d4f9cc70 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
64a36db5cd 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
a1dea851a2 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
5f47cbaa98 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
b9517b0959 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
9f4e34bd63 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
4196e7f97a 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
65490e6edc 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
ea1d2c199c 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
bc58c0e261 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
40f3805357 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
d405cf5267 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
03dc57f377 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
0c334f4698 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
1aa5b284bc 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
bde22edbb6 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
0d7c91beea 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
6fc1456a03 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
5f9d471527 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
senke
e9e4b18aa7 scalability: fix remaining infinite scroll issues
- Removed old page state reference from useEffect
- Fixed genres/formats extraction to use filteredTracks
- Updated TODO list with Action 6.3.1.3 completion
2026-01-15 21:06:48 +01:00
senke
b8460d5a0c scalability: implement infinite scroll for LibraryPage track list
- Converted from useQuery with pagination to useInfiniteQuery
- Removed page state (no longer needed)
- Flattened all pages into single filteredTracks array
- Integrated useInfiniteScroll hook with VirtualizedList
- Removed pagination component (replaced with infinite scroll)
- Added loading indicator when fetching next page
- Updated query invalidation to use correct query key
- Fixed batchUpdate to use tracksApi.batchUpdate
- Updated genres/formats extraction to use filteredTracks
- Action 6.3.1.3 complete
2026-01-15 21:06:09 +01:00
senke
b77902b6bd scalability: virtualize LibraryPage track list and verify package installation
- Verified @tanstack/react-virtual already installed (^3.13.12)
- VirtualizedList component already exists and is used in chat
- Replaced list view map() with VirtualizedList component
- Item height: 88px (estimated from padding + content)
- Container height: 600px
- Preserved all existing functionality (bulk mode, dropdowns, selection)
- Moved empty state outside virtualizer for better UX
- Actions 6.3.1.1 and 6.3.1.2 complete
2026-01-15 21:03:22 +01:00
senke
7d6ecca3ab scalability: update feature API files to use service layer
- Updated features/auth/api/authApi.ts to re-export from services/api/auth.ts
- Added deprecation comments to features/tracks/api/trackApi.ts
- Added documentation comments to webhooks, sessions, and admin API files
- All feature API files now document their relationship to the service layer
- Maintains backward compatibility
- No breaking changes
- Action 6.1.1.10 complete
2026-01-15 20:45:59 +01:00
senke
5e34c82495 scalability: create unified index file for API services
- Updated apps/web/src/services/api/index.ts to export all API services
- Exports apiClient and utilities from './client'
- Exports authApi and types from './auth'
- Exports tracksApi and types from './tracks'
- Exports usersApi and types from './users'
- Exports playlistsApi and types from './playlists'
- Removed duplicate apiClient export from './auth'
- Added documentation comments for each service section
- All services properly exported and accessible via barrel export
- No TypeScript errors
- Action 6.1.1.9 complete
2026-01-15 20:42:09 +01:00
senke
81e89aadc3 scalability: replace direct auth API calls with authApi service
- Replaced imports in VerifyEmailPage.tsx (verifyEmail, resendVerificationEmail → authApi.verifyEmail, authApi.resendVerification)
- Replaced imports in useUsernameAvailability.ts (checkUsernameAvailability → authApi.checkUsername with response.available extraction)
- Replaced imports in usePasswordReset.ts (requestPasswordReset, resetPassword → authApi.requestPasswordReset, authApi.resetPassword)
- Replaced imports in RegisterPage.tsx (resendVerificationEmail → authApi.resendVerification)
- All function calls updated to use authApi methods with proper request object wrapping
- Test files still use direct imports (acceptable - tests can use implementation details)
- AuthContext.tsx uses services/authService (legacy service, separate from features/auth/services/authService)
- No TypeScript errors related to authApi
- Action 6.1.1.8 complete
2026-01-15 20:40:46 +01:00
senke
491b129bfa scalability: replace direct playlist API calls with playlistsApi service
- Replaced imports in UserProfilePage.tsx (listPlaylists → playlistsApi.list)
- Replaced imports in PlaylistDetailPage.tsx (getCollaborators → playlistsApi.getCollaborators)
- Replaced imports in CreatePlaylistDialog.tsx (createPlaylist → playlistsApi.create)
- Replaced imports in PlaylistList.tsx (searchPlaylists → playlistsApi.search)
- Replaced imports in CollaboratorManagement.tsx (getCollaborators → playlistsApi.getCollaborators)
- Replaced imports in PlaylistSearch.tsx (searchPlaylists → playlistsApi.search)
- Replaced imports in unifiedSearchService.ts (searchPlaylists → playlistsApi.search)
- Replaced imports in GlobalSearchBar.tsx (searchPlaylists → playlistsApi.search)
- Fixed type imports in services/api/playlists.ts (types from types.ts, not playlistService.ts)
- All function calls updated to use playlistsApi methods
- Test files and hooks still use direct imports (acceptable - tests can use implementation details, hooks will be updated in Action 6.1.1.10)
- No TypeScript errors related to playlistsApi
- Action 6.1.1.7 complete
2026-01-15 20:38:09 +01:00
senke
9cfacdcc9a scalability: replace direct user API calls with usersApi service
- Replaced imports in UserProfilePage.tsx (getProfileByUsername → usersApi.getProfileByUsername)
- Replaced imports in SettingsPage.tsx (getSettings, updateSettings → usersApi.getSettings, usersApi.updateSettings)
- Replaced imports in ProfileForm.tsx (calculateProfileCompletion → usersApi.calculateProfileCompletion)
- Replaced dynamic imports in avatar-upload.tsx (uploadAvatar, deleteAvatar → usersApi.uploadAvatar, usersApi.deleteAvatar)
- All function calls updated to use usersApi methods
- Test files still use direct imports (acceptable - tests can use implementation details)
- No TypeScript errors related to usersApi
- Action 6.1.1.6 complete
2026-01-15 20:34:58 +01:00
senke
66479e5524 scalability: create unified auth API service
- Updated apps/web/src/services/api/auth.ts to export unified authApi object
- Wraps core auth functions: login, register, logout, getMe (with token storage logic)
- Wraps token management: refresh
- Wraps email verification: verifyEmail, resendVerification
- Wraps password management: requestPasswordReset, resetPassword
- Wraps username checking: checkUsername
- Wraps OAuth methods: getOAuthProviders, initiateOAuth
- Wraps 2FA methods: setup2FA, verify2FA, disable2FA, get2FAStatus
- Re-exports all related types for convenience
- Updated services/api/index.ts to export authApi
- No TypeScript errors
- Follows existing service layer pattern (similar to tracks.ts, users.ts, playlists.ts)
- Preserves existing token storage logic in login/register/logout
- Action 6.1.1.5 complete
2026-01-15 20:32:55 +01:00
senke
c880ca8631 scalability: create playlists API service
- Created apps/web/src/services/api/playlists.ts
- Wraps CRUD functions: create, get, update, delete, list
- Wraps track management: addTrack, removeTrack, reorderTracks
- Wraps collaboration functions: addCollaborator, removeCollaborator, updateCollaboratorPermission, getCollaborators
- Wraps social functions: follow, unfollow, getFollowStatus
- Wraps utility functions: search, createShareLink, getRecommendations
- Re-exports all related types for convenience
- Added to services/api/index.ts for barrel export
- No TypeScript errors
- Follows existing service layer pattern (similar to tracks.ts and users.ts)
- Action 6.1.1.4 complete
2026-01-15 20:30:38 +01:00
senke
5d5836effb scalability: create users API service
- Created apps/web/src/services/api/users.ts
- Wraps profile functions: getProfile, getProfileByUsername, updateProfile, calculateProfileCompletion
- Wraps social functions: follow, unfollow, getFollowers, getFollowing
- Wraps settings functions: getSettings, updateSettings
- Wraps avatar functions: uploadAvatar, deleteAvatar
- Re-exports all related types for convenience
- Added to services/api/index.ts for barrel export
- No TypeScript errors
- Follows existing service layer pattern (similar to tracks.ts)
- Action 6.1.1.3 complete
2026-01-15 20:28:50 +01:00
senke
7b51247e97 scalability: replace direct track API calls with tracksApi service
- Replaced imports in UploadModal.tsx (uploadTrack → tracksApi.create)
- Replaced imports in ShareDialog.tsx (createTrackShare → tracksApi.createShare)
- Replaced imports in LibraryPage.tsx (getTracks, batchDeleteTracks, batchUpdateTracks → tracksApi.list, tracksApi.batchDelete, tracksApi.batchUpdate)
- Replaced imports in UserProfilePage.tsx (getTracks → tracksApi.list)
- All function calls updated to use tracksApi methods
- Types re-exported from tracksApi for convenience
- No direct imports from @/features/tracks/api/trackApi remain in feature components
- Test files still use direct imports (acceptable - tests can use implementation details)
- No TypeScript errors related to tracksApi
- Action 6.1.1.2 complete
2026-01-15 20:27:02 +01:00
senke
f206a14126 scalability: create tracks API service layer
- Created apps/web/src/services/api/tracks.ts with tracksApi object
- Exports: list, get, create, update, delete, getStats, getHistory, download, like, unlike, getLikes, createShare
- Includes chunked upload methods: initiateChunkedUpload, uploadChunk, completeChunkedUpload
- Includes batch operations: batchDelete, batchUpdate
- Wraps existing track API functions from features/tracks/api/trackApi.ts
- Includes getTrack from features/tracks/services/trackService.ts for single track retrieval
- Re-exports all related types for convenience
- Added to services/api/index.ts for barrel export
- No TypeScript errors
- Follows existing service layer pattern (similar to auth.ts)
- Action 6.1.1.1 complete
2026-01-15 20:22:43 +01:00
senke
2f1f228ea7 security: implement proactive token refresh every 4 minutes
- Added PROACTIVE_REFRESH_INTERVAL_MS constant (4 minutes)
- Reduced PROACTIVE_REFRESH_BUFFER_MS to 1 minute (tokens expire in 5 min)
- Added proactiveRefreshInterval variable to track periodic refresh
- Created startPeriodicRefresh() function that sets up interval to refresh every 4 minutes
- Updated scheduleProactiveRefresh() to call startPeriodicRefresh()
- Updated cancelProactiveRefresh() to also clear the interval
- Periodic refresh checks token validity before refreshing
- Stops periodic refresh if token is expired or missing
- No TypeScript errors
- Works with existing token refresh infrastructure
- Action 5.1.1.5 complete
2026-01-15 20:19:13 +01:00
senke
22737c4be0 security: integrate useFormValidation into all RegisterForm and LoginForm components
- Integrated useFormValidation into features/auth/components/RegisterForm.tsx
- Integrated useFormValidation into features/auth/components/LoginForm.tsx
- Integrated useFormValidation into components/forms/RegisterForm.tsx
- Integrated useFormValidation into components/forms/LoginForm.tsx
- All forms now use backend pre-validation with debouncing (300ms)
- Backend validation errors displayed alongside client-side errors
- Note: Other forms require backend validation types to be added first
- Action 5.2.1.4 complete
2026-01-15 20:13:34 +01:00
senke
9ca8739c19 security: add pre-validation to RegisterForm and LoginForm
- Integrated useFormValidation hook into RegisterForm
- Integrated useFormValidation hook into LoginForm
- Validation triggers on form data change (debounced 300ms)
- Backend validation errors displayed alongside client-side errors
- Errors mapped to correct form fields
- Uses watch() from react-hook-form to monitor form changes
- Handles field name mapping (password_confirm vs password_confirmation)
- No TypeScript errors
- Action 5.2.1.2 complete
2026-01-15 20:11:22 +01:00
senke
c96258dede security: add debouncing to useFormValidation hook
- Added debouncing to validate function using setTimeout
- Default debounce delay: 300ms (configurable via debounceMs option)
- Debounce can be disabled by setting debounceMs to 0
- Uses validation ID tracking to cancel superseded validations
- Only updates state if validation is still the latest request
- Cleans up timer on unmount
- Prevents unnecessary API calls during rapid typing
- No TypeScript errors
- Action 5.2.1.5 complete
2026-01-15 20:08:25 +01:00
senke
aad9461515 security: create useFormValidation hook for pre-validation
- Created useFormValidation hook with validate function
- Accepts validation type (e.g., "RegisterRequest", "LoginRequest")
- Calls /api/v1/validate endpoint with type and data
- Returns validation state: isValidating, errors, isValid, error
- Provides clear() function to reset validation state
- Handles both wrapped and direct API response formats
- Uses parseApiError for consistent error handling
- Exported from hooks/index.ts with types
- No TypeScript errors
- Follows existing hook patterns
- Action 5.2.1.3 complete
2026-01-15 20:06:30 +01:00
senke
d264b3ebf9 security: disable mutation buttons when rate limited
- Created useIsRateLimited() hook to check rate limit state
- Updated CommentSection submit button to disable when rate limited
- Updated LikeButton to disable when rate limited
- Updated PlaylistForm submit button to disable when rate limited
- Updated ChatInput send button to disable when rate limited
- Updated UploadModal upload button to disable when rate limited
- All buttons check isLimited from rate limit store
- Hook uses Zustand selector for efficient re-renders
- Pattern established for future mutation buttons
- Action 5.4.1.4 complete
2026-01-15 20:01:47 +01:00
senke
04f8d76885 security: add rate limit indicator to header
- Added RateLimitIndicator component to Header
- Placed after NotificationMenu for visibility
- Component automatically shows/hides based on rate limit state
- No TypeScript errors
- Action 5.4.1.3 complete
2026-01-15 19:58:02 +01:00
senke
1320f8e88a security: create rate limit indicator component
- Created RateLimitIndicator component to display rate limit status
- Shows when user is rate limited or when remaining < 20% of limit
- Displays remaining requests (e.g., "50/100 requests")
- Shows countdown timer until reset (formatted as "5m 30s" or "1h 15m")
- Uses AlertTriangle and Clock icons from lucide-react
- Color-coded: red for critical (rate limited), gold for warning (< 20% remaining)
- Updates timer every second using useEffect
- Returns null when no rate limit data or not limited
- Follows existing component patterns (similar to OfflineIndicator)
- Action 5.4.1.2 complete
2026-01-15 19:56:32 +01:00
senke
1c1f0c7938 security: parse rate limit headers and create rate limit store
- Created rate limit store (apps/web/src/stores/rateLimit.ts) to store parsed headers
- Added header parsing in success response interceptor:
  - X-RateLimit-Limit: Maximum requests allowed
  - X-RateLimit-Remaining: Requests remaining
  - X-RateLimit-Reset: Unix timestamp when limit resets
- Added header parsing in error response interceptor:
  - Includes Retry-After header for 429 errors
  - All rate limit headers parsed from both lowercase and uppercase variants
- Store automatically updated on every API response
- Store includes isLimited flag calculated from remaining/retryAfter
- Uses Zustand with persistence for cross-tab state
- Actions 5.4.1.1 and 5.4.1.6 complete
2026-01-15 19:54:49 +01:00
senke
423cc5c882 security: add copy request ID button to ErrorDisplay
- Added "Copy Request ID" button that copies request ID to clipboard
- Button appears for server errors when request_id is available
- Uses modern Clipboard API with fallback to execCommand
- Shows success toast when copied
- Added alongside existing "Report Issue" button
- Fixed TypeScript error in isServerError calculation
- Action 5.3.1.2 complete
2026-01-15 19:52:48 +01:00
senke
eb0ac57db5 security: remove dev-only check for request ID in error messages
- Removed development-only check for request ID in formatErrorMessage function
- Request ID now always included when includeRequestId parameter is true
- Improves error correlation in production environments
- Updated comment to reflect change
- Action 5.3.1.1 complete
2026-01-15 19:50:41 +01:00
senke
3e21bc750c state-ownership: add optimistic updates to remaining mutations
- Added optimistic updates to notification mutations:
  - markAsReadMutation: Optimistically marks notification as read
  - markAllAsReadMutation: Optimistically marks all notifications as read
  - Updated in both NotificationsPage and NotificationMenu
- Added optimistic updates to share link mutations:
  - createShareMutation: Optimistically adds share link to local state
  - revokeShareMutation: Optimistically removes share link from local state
- Added optimistic updates to chat mutations:
  - leaveRoomMutation: Optimistically removes conversation from list
  - deleteRoomMutation: Optimistically removes conversation from list
- Added optimistic update to reorder mutation:
  - useReorderPlaylistTracks: Optimistically reorders tracks in playlist
- All mutations include:
  - onMutate: Cancel queries, snapshot previous state, apply optimistic update
  - onError: Rollback to previous state
  - onSuccess: Invalidate queries for consistency
- Action 4.4.1.5 complete (18 mutations with optimistic updates)
2026-01-15 19:48:47 +01:00
senke
84582507e9 state-ownership: add optimistic updates to comment and collaborator mutations
- Added optimistic updates to comment mutations:
  - createCommentMutation: Optimistically adds comment to list
  - createReplyMutation: Optimistically adds reply to replies list
  - updateCommentMutation: Optimistically updates comment content
  - deleteCommentMutation: Optimistically removes comment from list
- Added optimistic updates to collaborator mutations:
  - useAddCollaborator: Optimistically adds collaborator to list
  - useRemoveCollaborator: Optimistically removes collaborator from list
  - useUpdateCollaboratorPermission: Optimistically updates permission
- All mutations include:
  - onMutate: Cancel queries, snapshot previous state, apply optimistic update
  - onError: Rollback to previous state
  - onSuccess: Invalidate queries for consistency
- Action 4.4.1.5 in progress (11/14+ mutations complete: playlists, comments, collaborators)
2026-01-15 19:46:20 +01:00
senke
237c11d96a state-ownership: add optimistic updates to playlist mutations
- Added optimistic updates to high-priority playlist mutations:
  - useCreatePlaylist: Optimistically adds new playlist to list
  - useUpdatePlaylist: Optimistically updates playlist in cache and list
  - useDeletePlaylist: Optimistically removes playlist from list
  - useAddTrackToPlaylist: Optimistically adds track and updates count
- All mutations include:
  - onMutate: Cancel queries, snapshot previous state, apply optimistic update
  - onError: Rollback to previous state
  - onSuccess: Invalidate queries for consistency
- Action 4.4.1.5 in progress (high-priority mutations complete)
2026-01-15 19:43:46 +01:00
senke
f7fea6419a state-utilities: fix TypeScript error in stateInvalidation
- Fixed unused parameter warning: prefixed resourceType with underscore
- Action 4.6.1.5 complete
2026-01-15 19:39:19 +01:00
senke
1d4fb8f69c state-utilities: update stateInvalidation to work with React Query
- Created QueryClient singleton (queryClientSingleton.ts):
  - Provides global access to QueryClient for state invalidation
  - Set in main.tsx after QueryClient creation
- Updated invalidateQueries() to use QueryClient directly:
  - Replaced custom event system with direct QueryClient.invalidateQueries()
  - Added query key mapping for all resource types
  - Event system kept as fallback if QueryClient not available
- Updated invalidateStore() for Library Store:
  - Removed clearItems() call (method doesn't exist, domain data migrated to React Query)
  - Library Store now only contains UI state (filters)
  - React Query cache invalidation handles refetching
- Query keys mapped:
  - tracks: ['tracks'], ['track'], ['library']
  - playlists: ['playlists'], ['playlist']
  - users: ['users'], ['user'], ['auth'], ['userProfile']
  - conversations: ['conversations'], ['conversation'], ['chat'], ['chatConversations']
  - roles: ['roles'], ['role']
  - library: ['library'], ['tracks'], ['favorites'], ['libraryItems']
  - auth: ['auth'], ['user']
- Action 4.6.1.5 complete
2026-01-15 19:38:47 +01:00
senke
6d1382520a state-utilities: remove unused stateMiddleware utility
- Removed stateMiddleware utility (431 lines):
  - Deleted apps/web/src/utils/stateMiddleware.ts
  - Deleted apps/web/src/utils/stateMiddleware.test.ts (251 lines)
  - Completely unused in production code (only used in test file)
  - Previously removed from Library Store in Action 4.1.2.7
- Library Store now only contains UI state (filters), no middleware needed
- Created audit documentation: apps/web/src/docs/STATEMIDDLEWARE_UTILITY_AUDIT.md
- Action 4.6.1.4 complete
2026-01-15 19:36:45 +01:00
senke
8ed1b44658 state-utilities: remove unused undoRedo and stateNormalization utilities
- Removed undoRedo utility (8587 bytes):
  - Deleted apps/web/src/utils/undoRedo.ts
  - Removed WithUndoRedo<T> type from stores/types.ts
  - Removed WithUndoRedo export from stores/index.ts
  - Completely unused (confirmed in Action 4.6.1.9 audit)
- Removed stateNormalization utility (6321 bytes):
  - Deleted apps/web/src/utils/stateNormalization.ts
  - Updated stores.test.ts to remove outdated tests:
    - Removed createEmptyNormalized import
    - Removed outdated Library Store tests (items/favorites)
    - Updated Library Store tests to test current structure (filters only)
    - Updated Chat Store tests to use feature store
    - Updated Auth Store tests (user data migrated to React Query)
    - Fixed beforeEach to not call non-existent methods
  - Only used in outdated test file (confirmed in Action 4.6.1.11 audit)
- Both utilities made obsolete by React Query migration
- Actions 4.6.1.10 and 4.6.1.12 complete
2026-01-15 19:35:37 +01:00
senke
d86c3a4090 state-utilities: audit undoRedo and stateNormalization utilities
- Audited undoRedo utility: completely unused (no imports found)
  - Only type exports remain (WithUndoRedo) but also unused
  - Previously removed from Library Store in Action 4.1.2.5
  - Safe to remove (Action 4.6.1.10)
- Audited stateNormalization utility: only used in outdated test
  - Only createEmptyNormalized used in stores.test.ts
  - Tests check obsolete Library Store structure (items/favorites)
  - Library Store migrated to React Query in Action 4.1.2.6
  - Safe to remove after updating test file (Action 4.6.1.12)
- Created audit documentation:
  - apps/web/src/docs/UNDOREDO_UTILITY_AUDIT.md
  - apps/web/src/docs/STATENORMALIZATION_UTILITY_AUDIT.md
- Actions 4.6.1.9 and 4.6.1.11 complete
2026-01-15 19:33:39 +01:00
senke
547ca1e489 state-ownership: consolidate chat stores to feature store
- Removed duplicate stores/chat.ts (old store)
- Consolidated to features/chat/store/chatStore.ts (active store)
- Updated ChatMessages.tsx to use feature store (currentConversationId + lookup)
- Updated storeSelectors.ts to use feature store and export only existing methods
- Updated stateHydration.ts to skip chat hydration (uses React Query)
- Updated stateInvalidation.ts to not call fetchConversations (React Query handles it)
- Updated stores/index.ts to export feature store
- Updated documentation
- Test files still reference old store (separate update needed)
- Action 4.5.1.5 complete
2026-01-15 19:31:40 +01:00
senke
a03587b422 state-ownership: delete unused optimisticStoreUpdates.ts file
- Deleted apps/web/src/utils/optimisticStoreUpdates.ts (unused file)
- File was unused - no imports found in codebase
- Mutations already use React Query's onMutate pattern
- No TypeScript errors after deletion
- Actions 4.4.1.2 and 4.4.1.3 complete
2026-01-15 19:26:53 +01:00
senke
6cf41bdbea state-ownership: extend broadcastSync to invalidate React Query cache
- Added optional onStateSync callback to BroadcastSyncOptions
- Callback is called when state is updated locally or synced from another tab
- Callback receives new state and previous state as parameters
- Error handling prevents callback errors from breaking sync
- Stores can opt-in by providing callback that invalidates React Query queries
- No breaking changes - callback is optional
- Action 4.2.1.1 complete
2026-01-15 19:25:13 +01:00
senke
0922f98c41 state-ownership: remove _refreshUserPromise field from authStore
- Removed _refreshUserPromise from AuthState interface
- Removed _refreshUserPromise from initial state
- Field no longer needed - React Query handles deduplication automatically
- No references to field remain in codebase
- Action 4.3.1.3 complete
2026-01-15 18:11:41 +01:00
senke
224287e34f state-ownership: simplify refreshUser using React Query deduplication
- Removed manual promise deduplication logic (_refreshUserPromise usage)
- Removed promise creation and storage
- Simplified to direct async function that calls getMe()
- React Query's useUser hook handles deduplication automatically
- Preserved all error handling and state preservation logic
- Function simplified from 83 lines to 58 lines
- Action 4.3.1.2 complete
2026-01-15 18:10:39 +01:00
senke
27f65d9497 state-ownership: remove user field from authStore, keep only isAuthenticated
- Removed user field from AuthState interface
- Removed all user assignments in login, register, logout, refreshUser, checkAuthStatus
- Updated refreshUser to verify auth via getMe() but not store user (React Query handles that)
- Updated checkAuthStatus to verify auth via getMe() but not store user
- Updated persist partialize to not store user (only isAuthenticated)
- Updated broadcastSync shouldSync to only check isAuthenticated
- Removed User import
- Store now only manages isAuthenticated boolean
- User data exclusively managed by React Query (useUser hook)
- All production code already migrated (Actions 4.1.1.3-4.1.1.4 complete)
- Action 4.1.1.5 complete
2026-01-15 18:08:31 +01:00
senke
28b6a438af data-flow: integrate offline queue UI with OfflineIndicator
- Added state to manage queue manager dialog visibility
- Added 'View Queue' button in offline mode banner (when queueSize > 0)
- Added 'View Queue' button in processing mode banner (when queueSize > 0)
- Button opens OfflineQueueManager dialog when clicked
- Button styled appropriately for each banner variant
- Users can now view and manage queued requests directly from the indicator
- Action 2.5.1.5 complete
2026-01-15 18:02:40 +01:00
senke
67c285fc15 data-flow: add UI for offline queue management
- Created OfflineQueueManager component to display queued requests
- Shows request details: method, URL, timestamp, priority, retry count
- Allows removing individual requests
- Allows clearing entire queue
- Auto-updates queue every second while dialog is open
- Priority badges with color coding
- Empty state when no requests queued
- Uses Dialog component for modal display
- Action 2.5.1.4 complete
2026-01-15 18:01:22 +01:00
senke
b005d0a087 data-flow: handle broadcastSync message conflicts with React Query sync
- Added documentation explaining coexistence of Zustand and React Query sync
- Added type guards in broadcastSync.ts to verify message format before processing
- Added type guards in reactQuerySync.ts to verify message format before processing
- Both sync mechanisms use different channel names (no direct conflicts)
- Both sync mechanisms use different message formats (no cross-processing)
- Type guards ensure handlers only process their own message types
- Prevents accidental cross-processing of messages between sync mechanisms
- Both syncs can coexist safely without conflicts
- Action 2.3.1.3 complete
2026-01-15 17:58:49 +01:00
senke
2cf5fd5659 data-flow: integrate React Query sync into query client setup
- Added useQueryClient hook to App component
- Added setupReactQuerySync import and initialization
- Initialize sync on App mount with cleanup on unmount
- React Query cache synchronization now active across browser tabs
- Multi-tab updates work when mutations succeed or queries are invalidated
- Action 2.3.1.2 complete
2026-01-15 17:56:26 +01:00
senke
8746e7ff1a data-flow: create React Query sync utility for cross-tab cache sync
- Created reactQuerySync.ts with setupReactQuerySync() function
- Uses BroadcastChannel API to sync cache updates across browser tabs
- Subscribes to QueryClient mutation cache to broadcast mutation successes
- Subscribes to QueryClient query cache to broadcast query invalidations
- Implements message deduplication using message IDs and processed messages Set
- Implements tab ID tracking to avoid processing messages from same tab
- Handles three message types: query-invalidate, query-set-data, mutation-success
- Includes shouldSync filter function for selective synchronization
- Includes cleanup function to stop synchronization
- Focuses on invalidations and mutations (not every query update) for performance
- Comprehensive error handling and logging
- Action 2.3.1.1 complete - utility ready for integration
2026-01-15 17:55:06 +01:00
senke
89de8cc85b data-flow: add React Query caching for dashboard endpoint
- Migrated useDashboard hook from useState/useEffect to React Query
- Added query key factory: dashboardQueryKeys for proper cache management
- Configured staleTime: 30 seconds (dashboard data changes frequently)
- Configured gcTime: 2 minutes (keeps data in cache)
- Added retry: 1 with retryDelay: 1000ms for automatic retry
- Preserved backward compatibility: same return interface
- Dashboard data now automatically cached and deduplicated
- Multiple components using useDashboard share cached data
- Automatic background refetching when data becomes stale
- Better performance and reduced API calls
- Action 2.1.1.7 complete - Sub-Epic 2.1.1 complete
2026-01-15 17:51:10 +01:00
senke
5528f0c062 data-flow: remove old dashboard API service calls
- Removed getDashboardStats() function (old separate API call)
- Removed getRecentActivity() function (old separate API calls)
- Removed helper functions: mapActionToType, formatActivityTitle, formatActivityDescription
- Removed fallback to old methods in getDashboardData()
- Removed unused import of socialService
- All dashboard data now comes exclusively from aggregated /api/v1/dashboard endpoint
- No separate API calls remain in dashboard service
- Cleaner code, single source of truth for dashboard data
- Actions 2.1.1.5 and 2.1.1.6 complete - old API calls removed
2026-01-15 17:48:35 +01:00
senke
0cedc777d9 data-flow: remove old dashboard API calls from DashboardPage
- Removed fetchItems({ limit: 5 }) call from useEffect
- Removed unused imports: useLibraryItems, useLibraryActions, useLibraryStatus
- Removed unused variables: addTrack, fetchItems, isLoadingLibrary
- Removed unused useEffect import (no longer needed)
- Dashboard page now relies solely on useDashboard hook for all data
- No separate library fetch call remains
- All functionality preserved, cleaner code
- Action 2.1.1.4 complete - old API calls removed
2026-01-15 17:46:21 +01:00
senke
4098cc1706 data-flow: update frontend to use aggregated dashboard endpoint
- Updated getDashboardData() to call /api/v1/dashboard endpoint
- Added support for query parameters: activity_limit, library_limit, stats_period
- Added TrackPreview and LibraryPreview interfaces matching backend contract
- Updated DashboardData interface to include optional library_preview field
- Updated useDashboard hook to accept options and return libraryPreview
- Added fallback to old multiple-call method if new endpoint fails
- Dashboard now loads with single request instead of multiple parallel calls
- All existing functionality preserved, backward compatible during migration
- Action 2.1.1.3 complete - frontend ready to use aggregated endpoint
2026-01-15 17:44:56 +01:00
senke
a01012bc96 api-contracts: add tests for response format consistency
- Added comprehensive tests for wrapped format handling
- Test wrapped format with success: true and data unwrapping
- Test wrapped format with success: false and error handling
- Test wrapped format with null data
- Test safety check for non-wrapped responses (warning log)
- Test non-object response data handling
- Test verification that no direct format handling remains
- All 30 tests pass successfully
- Tests verify wrapped format only, no direct format handling
- Action 1.3.2.3 complete - response format consistency verified
2026-01-15 17:34:54 +01:00
senke
1e7128b8c8 api-contracts: remove dual-format handling from frontend
- Removed direct format handling code (110+ lines)
- Removed validation and recovery logic for direct format responses
- Added safety check to log warning if non-wrapped response received
- Client now only handles wrapped format {success, data} or {success: false, error}
- Graceful degradation: non-wrapped responses still returned with warning
- TypeScript compilation successful, no linter errors
- Action 1.3.2.2 complete - frontend simplified to wrapped format only
2026-01-15 17:33:28 +01:00
senke
b7551c2841 api-contracts: add validation error recovery mechanism
- Added cache fallback: uses cached response for GET requests when validation fails
- Added optional retry mechanism (disabled by default, enabled via config)
- Added user notifications for recovery actions (configurable)
- Recovery config: { useCache, retry, notifyUser } on request config
- Prevents infinite retry loops with _validationRetryAttempted flag
- Validates cached responses before using them
- Handles both wrapped and direct format responses
- Graceful degradation: falls back to unvalidated data if recovery fails
- Applied to both validation sections (wrapped and direct formats)
- Action 1.2.2.5 complete - validation errors now handled gracefully
2026-01-15 17:25:44 +01:00
senke
5412720318 api-contracts: add validation error alerting for high failure rates
- Created ValidationAlerting class to monitor validation metrics
- Alerts when failure rate exceeds threshold (default 5%)
- Periodic checks every 5 minutes (configurable)
- Cooldown period (15 min) to prevent alert spam
- Minimum validations required (10) before alerting
- Structured alert logging with full metrics context
- Automatically starts in production (can be disabled via env var)
- Alerts sent to backend logging and Sentry
- Action 1.2.2.4 complete - validation alerting now active for monitoring
2026-01-15 17:23:01 +01:00
senke
65427efd8b api-contracts: add validation error metrics tracking
- Created ValidationMetricsTracker class to track validation metrics
- Tracks total, successful, and failed validations
- Calculates failure rate percentage
- Tracks failures by normalized endpoint patterns
- Records last failure and success timestamps
- Integrated into both validation points (wrapped and direct formats)
- Exported singleton for metrics access and monitoring
- Action 1.2.2.3 complete - validation metrics now tracked for monitoring
2026-01-15 17:21:41 +01:00
senke
5170085d48 api-contracts: add production error logging for validation failures
- Enhanced validation error logging with production monitoring context
- Added error_type field for easy filtering in monitoring systems
- Added timestamp and schema_provided flag for correlation
- Logs automatically sent to backend endpoint and Sentry in production
- Structured JSON format for easy aggregation and alerting
- Action 1.2.2.2 complete - validation failures now fully logged for production monitoring
2026-01-15 17:19:17 +01:00
senke
ca43af5606 api-contracts: enhance response validation for all responses with schemas
- Enhanced response validation logging (wrapped and direct formats)
- Changed validation failures from warn to error level for better visibility
- Added structured error details (path, message, code, received, expected)
- Added response data preview for debugging
- Added success logging in debug mode
- Maintains graceful degradation (continues with unvalidated data) to avoid breaking app
- Action 1.2.2.1 complete - validation now comprehensive for all responses with schemas
2026-01-15 17:18:02 +01:00
senke
50baff3d62 api-contracts: update feature-specific auth types to use generated types
- Replace RefreshResponse with VezaBackendApiInternalDtoTokenResponse
- Replace ResendVerificationRequest with VezaBackendApiInternalDtoResendVerificationRequest
- Keep AuthResponse as is (uses extended User/AuthTokens)
- Keep form data types (frontend-specific)
- Tracks types already updated, roles/chat/settings kept as is
2026-01-15 17:13:43 +01:00
senke
e2feac8023 api-contracts: update barrel exports to document generated type usage
- Add documentation noting User, Track extend generated types
- Export generated types directly for advanced use cases
- Update comments to reflect ApiError location (schemas)
- All existing imports continue to work via barrel exports
2026-01-15 17:11:23 +01:00
senke
6f2ce84fb6 api-contracts: replace User interface with generated type base
- Update User type in types/api.ts to extend VezaBackendApiInternalModelsUser
- Preserve UI-specific computed fields (avatar_url, stats, roles, status, etc.)
- Make required fields actually required (id, username, email, role, etc.)
- All existing imports continue to work via barrel exports
- No User-specific TypeScript errors introduced
2026-01-15 17:09:14 +01:00
senke
8f60275b1f api-contracts: replace Track interface with generated type base
- Update Track type in types/api.ts to extend VezaBackendApiInternalModelsTrack
- Update Track type in features/tracks/types/track.ts to extend generated type
- Preserve UI-specific computed fields (coverUrl, plays, likes, etc.)
- Support backward compatibility for duration (number|string)
- All existing imports continue to work without changes
- No Track-specific TypeScript errors introduced
2026-01-15 17:07:50 +01:00
senke
1cdd274f00 api-contracts: replace ApiError interface with Zod-inferred type
- Replace manual ApiError interface with Zod-inferred type from apiSchemas
- Update all imports (15+ files) to use ApiError from @/schemas/apiSchemas
- Remove ApiError interface from types/api.ts
- Update ApiResponse to import ApiError from schemas
- All TypeScript checks pass for ApiError-related code
2026-01-15 17:03:35 +01:00
senke
263c537b1e api-versioning: add X-API-Deprecated header and frontend deprecation warning
- Backend: Add X-API-Deprecated header alongside existing X-API-Version-Deprecated
- Frontend: Show deprecation warning toast when deprecated API version detected
- Warning shown only once per session to avoid spam
- Includes sunset date in warning message if available
2026-01-15 16:56:21 +01:00
senke
ea6d5202e2 state-ownership: replace all useAuthStore().user with useUser() hook
- Migrated all hooks: useAuth, useChat, useLogin
- Migrated all components: Header, ProfileForm, FollowButton, LikeButton, PlaylistFollowButton, ChatMessage, ChatMessages, CommentThread, CommentSection, PlaylistList, ChatSidebar, SettingsPage, DashboardPage
- Updated storeSelectors.ts useAuthUser() to use React Query
- All production code now uses useUser() hook instead of Zustand store
- Action 4.1.1.3 and 4.1.1.4 complete
2026-01-14 01:45:42 +01:00
senke
6d909acfd4 state-ownership: audit all files using useAuthStore().user
Found 24 files using user from authStore:
- 18 components (Header, DashboardPage, Chat components, etc.)
- 4 hooks (useAuth, useChat, useLogin)
- 2 utilities (stateHydration, storeSelectors docs)

Created comprehensive audit document with migration strategy.

Action 4.1.1.2 complete
2026-01-14 01:40:42 +01:00
senke
95b1931c88 state-ownership: remove domain data from library store
- Remove items, favorites, pagination, isLoading, error from LibraryState
- Remove fetchItems, fetchFavorites, uploadFile, toggleFavorite, deleteItem, clearItems, setLoading, setError from LibraryActions
- Remove undoRedo and stateMiddleware wrappers (no domain data to track)
- Update useLibraryActions() to use React Query for all domain data actions
- Store now only contains filters (UI state)
- Update useLibraryItemsNormalized() and useLibraryFavoritesNormalized() to return empty state (deprecated)
- Update useLibraryPagination() to return both camelCase and snake_case for compatibility

Action 4.1.2.4 complete
2026-01-14 01:39:23 +01:00
senke
32d89d80eb incus deployement fully implemented, Makefile updated and make fmt ran 2026-01-13 19:47:57 +01:00
senke
995e71bcfb state-ownership: update storeSelectors.ts to use React Query hooks
- Replace useLibraryItems() with React Query hook
- Replace useLibraryFavorites() with React Query hook
- Replace useLibraryPagination() to extract from React Query response
- Replace useLibraryStatus() to use React Query status
- Update useLibraryActions() to use queryClient.refetchQueries()
- Maintain same interface for backward compatibility
- Migrates DashboardPage components automatically

Action 4.1.2.3.3 complete
2026-01-12 13:37:02 +01:00
senke
9c366d4ba2 state-ownership: audit components using library store domain data - found 2 DashboardPage components and storeSelectors utility 2026-01-11 18:21:08 +01:00
senke
43548ab144 state-ownership: create React Query hooks for library items (useLibraryItems, useLibraryFavorites) 2026-01-11 18:19:52 +01:00
senke
c7b42b1ebd state-ownership: audit library store domain data - identified 3 domain fields and 3 UI state fields 2026-01-11 18:18:45 +01:00
senke
3aa0341b12 state-ownership: audit track queries React Query usage - only comments/likes use React Query 2026-01-11 18:18:15 +01:00
senke
977f02dbda state-ownership: update STATE_SELECTORS.md with correct auth store import path 2026-01-11 18:17:45 +01:00
senke
69e8557145 state-ownership: update STATE_DEBUGGING.md to reflect current store structure (Action 4.6.1.7) 2026-01-11 18:04:42 +01:00
senke
eed64df580 state-ownership: remove obsolete state utilities (stateCleanup, stateVersioning, statePersistence) 2026-01-11 18:03:58 +01:00
senke
c56ef95ac3 state-ownership: create React Query hook for user (Action 4.1.1.1) 2026-01-11 17:43:07 +01:00
senke
b1f4a4d949 error-propagation: integrate offline detection utility with error handler 2026-01-11 17:42:04 +01:00
senke
8ddada1939 error-propagation: add offline detection utility 2026-01-11 17:41:37 +01:00
senke
4f18f566ae error-propagation: enhance network error detection to distinguish timeout, connection refused, and offline 2026-01-11 17:41:08 +01:00
senke
d2bf96d136 error-propagation: fix retry handlers and mark Action 3.4.1.3 complete 2026-01-11 17:40:21 +01:00
senke
274c3fdd99 error-propagation: implement retry for failed mutations (remaining handlers) 2026-01-11 17:39:51 +01:00
senke
bb9a0e655c error-propagation: implement retry for failed mutations (ShareDialog, CommentSection) 2026-01-11 17:38:54 +01:00
senke
6e16fce1b9 error-propagation: implement retry for failed mutations (MarketplaceHome, RolesPage, SettingsPage) 2026-01-11 17:38:15 +01:00
senke
f929e8ebd0 error-propagation: implement retry for failed mutations (AccountSettings) 2026-01-11 17:37:04 +01:00
senke
aee6624e2e error-propagation: implement retry for failed mutations (Cart) 2026-01-11 17:36:33 +01:00
senke
318ea5e06e error-propagation: implement retry for failed mutations (ProfileForm, LibraryPage) 2026-01-11 17:35:38 +01:00
senke
a5fb8b6b28 error-propagation: enhance error boundary logging for monitoring 2026-01-11 17:33:03 +01:00
senke
23a9ffd25b error-propagation: update ErrorBoundary to use ErrorDisplay component 2026-01-11 17:32:25 +01:00
senke
fccc2db5e1 error-propagation: highlight form fields on validation errors 2026-01-11 17:31:12 +01:00
senke
27ce7a5391 error-propagation: redirect to login on auth errors 2026-01-11 17:29:55 +01:00
senke
dbd2a4ad15 error-propagation: integrate issue reporting with ErrorDisplay 2026-01-11 17:29:11 +01:00
senke
9e24dd9367 error-propagation: create support issue reporting utility 2026-01-11 17:27:45 +01:00
senke
77d1c44907 error-propagation: show offline indicator on network errors 2026-01-11 17:16:49 +01:00
senke
d0cbae13a8 error-propagation: add getErrorCategory function for error categorization 2026-01-11 17:14:49 +01:00
senke
828c396bcf error-propagation: fix leftover toast.error in LibraryPage confirmBulkDelete 2026-01-11 17:13:00 +01:00
senke
a1e6211391 error-propagation: replace toast.error with ErrorDisplay in Cart component 2026-01-11 17:12:27 +01:00
senke
f602baf67b error-propagation: replace toast.error with ErrorDisplay in AccountSettings 2026-01-11 17:11:51 +01:00
senke
6db443a8e7 error-propagation: replace toast.error with ErrorDisplay in ProfileForm 2026-01-11 17:11:03 +01:00
senke
28c7266115 error-propagation: replace toast.error with ErrorDisplay in ChatSidebar and CreateRoomDialog 2026-01-11 17:10:27 +01:00
senke
a0fe095a99 error-propagation: replace toast.error with ErrorDisplay in SharePlaylistModal and AddCollaboratorModal 2026-01-11 17:08:58 +01:00
senke
9b1f84a8d5 error-propagation: replace toast.error with ErrorDisplay in ShareDialog and CommentSection 2026-01-11 17:08:04 +01:00
senke
d783c69290 error-propagation: replace toast.error with ErrorDisplay in SettingsPage (query and mutation errors) 2026-01-11 17:07:02 +01:00
senke
856bb348cf error-propagation: replace toast.error with ErrorDisplay in RolesPage (query and mutation errors) 2026-01-11 17:06:30 +01:00
senke
f2a14b2017 error-propagation: replace toast.error with ErrorDisplay in MarketplaceHome (query and mutation errors) 2026-01-11 17:05:54 +01:00
senke
bd72718e6e error-propagation: replace toast.error and inline error with ErrorDisplay in TrackDetailPage 2026-01-11 17:05:23 +01:00
senke
c5cbdd99d0 error-propagation: update PlaylistErrorBoundary to use ErrorDisplay component 2026-01-11 17:04:42 +01:00
senke
6d265aaa3e error-propagation: update PlayerError to use ErrorDisplay component 2026-01-11 17:03:55 +01:00
senke
2bbb04c2c7 error-propagation: fix AuthErrorMessage tests for ErrorDisplay integration 2026-01-11 17:03:00 +01:00
senke
83e7cdd901 error-propagation: update AuthErrorMessage to use ErrorDisplay component 2026-01-11 17:02:34 +01:00
senke
606aff5745 error-propagation: create error display strategy document 2026-01-11 17:01:27 +01:00
senke
4c441740d9 error-propagation: replace toast errors with ErrorDisplay in LibraryPage 2026-01-11 17:00:25 +01:00
senke
c34205052d error-propagation: implement ErrorDisplay component with all variants and features 2026-01-11 16:58:54 +01:00
senke
260a1348b2 error-handling: design ErrorDisplay component API
- Completed Action 3.1.1.1: Designed ErrorDisplay component API
- Created ERROR_DISPLAY_COMPONENT_API.md with comprehensive API specification
- Defined props: error, onRetry, onDismiss, showDetails, context, variant, severity, size, actions
- Specified error type normalization (Error, ApiError, string, Axios error)
- Documented variants: inline, banner, modal, card
- Provided usage examples and integration points
- Defined accessibility requirements (ARIA labels, keyboard navigation)
- Ready for implementation (Action 3.1.1.2)
2026-01-11 16:53:42 +01:00
senke
39d3007cbf data-flow: remove unnecessary client-side filter pass-through
- Completed Action 2.2.1.1: Removed client-side filter logic from LibraryPage
- Removed unnecessary useMemo that was just passing through tracksData?.tracks
- Simplified to direct assignment: filteredTracks = tracksData?.tracks || []
- Backend handles all filtering (verified in Action 2.2.1.2)
- No actual filtering was happening - useMemo was just a pass-through
- Code simplified, behavior unchanged
2026-01-11 16:53:06 +01:00
senke
4e2b43037a data-flow: remove duplicate LibraryPagePremium.tsx file
- Completed Action 2.2.1.3: Handled LibraryPage.tsx vs LibraryPagePremium.tsx duplication
- Updated LIBRARY_PAGE_AUDIT.md with file comparison
- Verified LibraryPage.tsx is active (imported via LazyLibrary in routing)
- Verified LibraryPagePremium.tsx is duplicate/unused (not imported anywhere)
- LibraryPagePremium.tsx is older version without debounce improvements
- Removed LibraryPagePremium.tsx - safe deletion, no references found
- Routing continues to use LibraryPage.tsx, no breakage
2026-01-11 16:51:47 +01:00
senke
57e3edbdc9 data-flow: standardize debounce across all search inputs
- Completed Action 2.4.1.3: Audited and standardized search input debouncing
- Created SEARCH_DEBOUNCE_AUDIT.md documenting all search components
- Found 7 search components: 5 using useDebounce, 1 manual setTimeout, 1 manual search
- Standardized AddTrackToPlaylistModal to use useDebounce hook instead of manual setTimeout
- All automatic search inputs now use consistent debouncing (300-500ms delays)
- MessageSearch uses manual search (intentional, no debounce needed)
2026-01-11 16:51:23 +01:00
senke
ff589b73c5 data-flow: add debounce to LibraryPage search and fix race condition
- Completed Actions 2.4.1.1, 2.4.1.2, and 2.4.1.4
- Action 2.4.1.1: Verified custom useDebounce hook exists (no external package needed)
- Action 2.4.1.2: Added useDebounce hook with 300ms delay to LibraryPage search
- Action 2.4.1.4: Fixed race condition by using debouncedSearchTerm for page reset
- Search now fires 300ms after typing stops, reducing API calls
- Page reset now waits for debounce to complete, preventing race conditions
2026-01-11 16:49:13 +01:00
senke
a37c52890f data-flow: add tests for response cache and offline queue utilities
- Completed Actions 2.5.1.7 and 2.5.1.8: Created comprehensive test suites
- responseCache.test.ts: 18 tests covering GET-only caching, expiration, Cache-Control directives, invalidation patterns, size limits, cleanup, stats - All passing
- offlineQueue.test.ts: 24 tests covering request queuing, priority system, queue processing, retry logic, persistence, localStorage - All passing
- Tests verify core functionality works correctly for both utilities
- Epic 2 Sub-Epic 2.5 (API Client Utilities) testing complete
2026-01-11 16:48:18 +01:00