Commit graph

1099 commits

Author SHA1 Message Date
senke
ea036d060f style(player): remove remaining kodo in AudioPlayerFull
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 14:14:17 +01:00
senke
9f593582d7 style(discover): remove remaining kodo in DiscoverView Trending, Genres, types
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 14:13:58 +01:00
senke
6b2a41d18e fix(settings): AccountSettingsPreferencesCard syntax and remaining kodo
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 14:12:39 +01:00
senke
698a2c0a9d style(ui): elevate OptimizedImage to SaaS Premium and update test
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 14:05:38 +01:00
senke
63919ce983 style(discover): elevate DiscoverView to SaaS Premium
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 14:05:04 +01:00
senke
5657c30e9d style(player): elevate AudioPlayer to SaaS Premium
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 14:04:13 +01:00
senke
168ef7abf3 style(file-details): elevate FileDetailsView to SaaS Premium
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 14:03:36 +01:00
senke
ddc568222b style(seller): elevate CreateProductView to SaaS Premium
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 14:03:00 +01:00
senke
9e5f280010 style(settings): elevate AccountSettings cards to SaaS Premium
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 14:02:15 +01:00
senke
0c0593cfff style(admin): elevate AdminDashboardView stories to SaaS Premium
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 14:01:29 +01:00
senke
550f7dbc5b style(checkout): elevate CheckoutView BillingCard and Header to SaaS Premium
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 14:01:11 +01:00
senke
c4366b9e74 fix(views): remove remaining kodo in Purchases/Cart/Live/Marketplace/Social
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 14:00:55 +01:00
senke
84cdcf395c style(views): elevate CheckoutView to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:46:39 +01:00
senke
39cea43cc1 style(views): elevate LiveView to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:45:38 +01:00
senke
7eacfb0e7f style(views): elevate AnalyticsView to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:44:52 +01:00
senke
3da74c6012 style(views): elevate MarketplaceView to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:44:12 +01:00
senke
c01f3bbf11 style(views): elevate SocialView to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:43:31 +01:00
senke
4f6a2e0999 style(views): elevate PurchasesView to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:42:37 +01:00
senke
822751fb6e style(views): elevate CartView to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:41:56 +01:00
senke
e7ed774d34 style(views): elevate SettingsView to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:41:19 +01:00
senke
1a0c93d35a style(views): elevate EducationView to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:40:54 +01:00
senke
d00d08b6dc style(views): elevate NotificationsView to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:40:29 +01:00
senke
991371e461 style(views): elevate AdminView to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:40:12 +01:00
senke
80cff54be4 style(views): elevate AuthView to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:39:51 +01:00
senke
51b5498f89 style(views): elevate ChatView to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:39:38 +01:00
senke
daa64dcc0a style(library): elevate Library to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:39:18 +01:00
senke
2530198fb7 style(ui): elevate Button to SaaS Premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:38:52 +01:00
senke
9ae3e1d5a3 style(tracks): align story decorators with KŌDŌ tokens
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:17:00 +01:00
senke
c7ffd271f8 style(track-detail-page): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:16:07 +01:00
senke
2ae565a360 style(TrackCard): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:14:35 +01:00
senke
3eb5ee7dbb style(TrackListRow): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:13:34 +01:00
senke
a60e35f02a style(track-search): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:12:01 +01:00
senke
6cbcda455e style(TrackListContainer): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:11:47 +01:00
senke
6463ffb6cf style(UploadQuota): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:10:05 +01:00
senke
4433ec8c9c style(track-grid): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:08:39 +01:00
senke
40a9fa6e56 style(TrackStatsDisplay): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:07:10 +01:00
senke
df26e35623 style(TrackSort): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:05:27 +01:00
senke
cc6dff94fe style(ShareDialog): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:04:19 +01:00
senke
636ccb06d4 style(LikeButton): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:03:10 +01:00
senke
0757e0eb2e style(TrackListSelectionActions): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 09:01:35 +01:00
senke
e862516c1b style(ViewToggle): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 08:59:38 +01:00
senke
26a497464e style(track-search-filters): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 08:58:24 +01:00
senke
a9d13be10f style(track-list-pagination): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 08:56:06 +01:00
senke
8db8c5e6ca style(track-filters): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 08:54:49 +01:00
senke
ac863c31de style(comment-thread): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 08:52:35 +01:00
senke
58d47f3e38 style(track-history): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 08:49:21 +01:00
senke
c9cef0f36d style(tracks): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 08:35:52 +01:00
senke
4b2d86414b style(comments): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 08:13:59 +01:00
senke
e3dbbbb032 style(ui): elevate visual fidelity to premium standards
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 08:03:28 +01:00
senke
276229a0e4 feat(tracks): use TrackListSkeleton for loading state and add Error story
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 07:40:16 +01:00
senke
0527eb76e5 test(comments): add comprehensive stories and MSW mocks
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 07:33:05 +01:00
senke
9573b8261c feat(comments): add high-fidelity skeletons and Framer Motion transitions
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 07:32:49 +01:00
senke
65e8a69db2 refactor(comments): modularize CommentSection with atomic sub-components
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 07:32:37 +01:00
senke
1c4b35a51e refactor(tracks): split TrackDetailPage into module with Hero, CoverAndActions, Info, Tabs, Skeleton, NotFound
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 06:57:32 +01:00
senke
df9d5f9be8 refactor(playlists): split PlaylistDetailPage into module with Hero, CoverAndInfo, ActionsBar, Tabs, Skeleton, NotFound
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 06:46:30 +01:00
senke
7d13c23d72 refactor(playlists): split PlaylistActions into module (buttons, edit dialog, skeleton)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 06:09:51 +01:00
senke
6f7156f035 refactor(web): split EquipmentDetailView into module (nav, gallery, specs, header, warranty, docs, service, skeleton)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 05:46:16 +01:00
senke
79eed88e57 refactor(web): split TrackListPagination into module (info, nav, utils, skeleton)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 05:03:53 +01:00
senke
27c8b9940e refactor(web): split PlaylistAnalytics into module (stat cards, main/advanced, error, skeleton)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 04:53:54 +01:00
senke
aafb4b083a refactor(web): split VirtualizedChatMessages into module (item, empty, loading, scroll btn, skeleton)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 04:44:26 +01:00
senke
d7d22b705e refactor(web): split LibraryPage into module (toolbar, empty, grid, list, skeleton)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 04:31:06 +01:00
senke
0bec3183d9 refactor(web): split router into module (PublicRoute, ProtectedLayoutRoute, routeConfig)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 04:16:37 +01:00
senke
d11aa1d3a2 refactor(web): split ChatView into chat-view module
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 03:59:32 +01:00
senke
de3e704373 refactor(web): split AuthView into auth-view module
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 03:53:59 +01:00
senke
86450a93ab refactor(web): split AdminView into admin-view module
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 22:31:24 +01:00
senke
b4cca23ec9 refactor(web): split NotificationsView into notifications-view module
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 22:22:47 +01:00
senke
abc4386495 refactor(web): split EducationView into education-view module
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 22:11:13 +01:00
senke
6ccf3db0e1 refactor(web): split SettingsView into settings-view module
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 21:59:42 +01:00
senke
dcf89cb2da refactor(web): split CartView into cart-view module
- types: CartViewProps, CartDiscount
- useCartView: useCartStore, showPromo, discount, tax/finalTotal, handleApplyPromo
- CartViewEmpty, CartViewHeader, CartViewSummary, CartViewSecure, CartViewSkeleton
- PromoCodeModal in orchestrator; min-h-[60vh] -> min-h-layout-page-sm
- Stories: Default, Empty, Loading (Skeleton); decorator min-h-layout-page
- Re-export from CartView.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 21:49:55 +01:00
senke
de2144f34f refactor(web): split PurchasesView into purchases-view module
- types: PurchasesViewProps, Purchase
- usePurchasesView: commerceService.getPurchases, search, refund, download
- PurchasesViewHeader, PurchasesViewItem, PurchasesViewList, PurchasesViewSkeleton
- RefundRequestModal in orchestrator; Loading renders Skeleton
- Stories: Default, Empty (initialPurchases []), Loading (Skeleton)
- Re-export from PurchasesView.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 21:42:35 +01:00
senke
b6b2791b76 refactor(web): split SocialView into social-view module
- types: SocialViewProps, SocialTabKey
- useSocialView: feedTracks (trackService.list), activeTab, playTrack
- SocialViewSidebar, SocialViewFeed, SocialViewFeedItem, SocialViewTrending, SocialViewSkeleton
- Loading renders Skeleton; decorator min-h-layout-page
- Re-export from SocialView.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 21:34:18 +01:00
senke
9a8af12b6b refactor(web): split MarketplaceView into marketplace-view module
- types: MarketplaceViewProps, MarketplaceCategory; useMarketplaceView with marketplaceService/fallback
- MarketplaceViewHeader, MarketplaceViewCategories, MarketplaceViewSidebar, MarketplaceViewGrid, MarketplaceViewSkeleton
- allProducts for ProductDetailView similarProducts; min-h-screen -> min-h-layout-page
- Stories: Default, Loading (Skeleton); decorator min-h-layout-page
- Re-export from MarketplaceView.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 18:42:16 +01:00
senke
461fd9cf6a refactor(web): split AnalyticsView into analytics-view module
- types: AnalyticsViewProps, DateRangeKey, GlobalStats, TopTrackRow, TrafficSource, DeviceStats, ChartHoverData
- useAnalyticsView: dateRange, stats, topTracks, trafficSources, deviceStats, loading, hoveredData, handleExport
- AnalyticsViewHeader, AnalyticsViewKpiGrid, AnalyticsViewChart, AnalyticsViewOrigins, AnalyticsViewPlatforms, AnalyticsViewTopTracks, AnalyticsViewSkeleton
- Data via analyticsService; loading renders Skeleton
- text-[10px] -> text-xs, tracking-[0.2em] -> tracking-wide
- Stories: Default, Loading (Skeleton); decorator min-h-layout-page
- Re-export from AnalyticsView.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 18:33:42 +01:00
senke
30df8c99ea refactor(web): split LiveView into live-view module
- types.ts: LiveViewProps, LiveViewChatMessage; mockData: FEATURED_STREAM, CHAT_MESSAGES
- useLiveView: stream, chatMessages, msgInput, handleSend, addToast
- LiveViewPlayer, LiveViewStreamInfo, LiveViewRecommended, LiveViewChat, LiveViewSkeleton
- Layout h-[calc(100vh-120px)] -> min-h-layout-main; text-[10px] -> text-xs
- Stories: Default, Loading (Skeleton); decorator min-h-layout-page
- Re-export from LiveView.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 18:15:41 +01:00
senke
0a56cb5fe0 refactor(web): split CheckoutView into checkout-view module
- types.ts: CheckoutViewProps, CheckoutFormState, INITIAL_CHECKOUT_FORM
- useCheckoutView: form state, cart/tax, handlePurchase, onComplete
- CheckoutViewHeader, CheckoutViewBillingCard, CheckoutViewPaymentCard,
  CheckoutViewOrderSummary, CheckoutViewSkeleton
- CheckoutView orchestrator; re-export from CheckoutView.tsx
- Stories: Loading (Skeleton), Default, Processing, Success
- Decorator min-h-screen -> min-h-layout-page

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 18:04:13 +01:00
senke
0226b55ef4 refactor(web): split AdminDashboardView into admin-dashboard-view module
- types: DashboardStats, UploadItem, AuditLogItem, StatCardProps, Report
- useAdminDashboardView: fetchData, handleAction, triggerProtocol
- Header, StatCard, TrafficCard, ProtocolsCard, NodeHealthCard, Tabs
- AdminDashboardSkeleton for Loading state
- max-w-layout-content, text-xs, gap-0.5 (no arbitrary values)
- Stories: Default, Loading (Skeleton). Decorator min-h-layout-page
- Re-export from AdminDashboardView.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 17:54:02 +01:00
senke
4c8211c449 refactor(web): split AccountSettings (components/settings/account) into module
- account-settings/types: AccountSettingsUserMock, AccountSettingsToggles
- useAccountSettingsPage: view, modals, user, toggles, theme, setThemeOption
- IdentityCard, PreferencesCard, NotificationsCard, PrivacyCard, DangerCard
- AccountSettingsSkeleton for Loading state
- Privacy labels text-xs (no text-[10px])
- Theme selection: isOptionSelected(theme, variant)
- Stories: Default, Loading (Skeleton). Decorator min-h-layout-page
- Re-export from AccountSettings.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 17:42:57 +01:00
senke
30f8f8108e refactor(web): split ChatInterface into chat-interface module
- types.ts: ChatInterfaceProps
- useChatInterface: state, wsService, loadMessages, loadChatStats, handleSendMessage, formatTimestamp
- ChatInterfaceHeader, ChatInterfaceMessages, ChatInterfaceInput
- ChatInterfaceSkeleton for Loading state
- Stories: Default, ProductionRoom, Loading (Skeleton)
- Decorator h-[600px] -> min-h-layout-page
- Re-export from ChatInterface.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 14:24:41 +01:00
senke
f61067e685 refactor(web): split CreateProductView into create-product-view module
- types.ts: LicenseConfig
- useCreateProductView: form state, updateLicense, handlePublish, handleSaveDraft
- CreateProductViewHeader, CoverCard, FilesCard, DetailsCard, PricingCard
- CreateProductViewSkeleton for Loading state
- Textarea min-h-24 (no arbitrary value)
- MSW: POST marketplace/products for Storybook
- Stories: Default, Loading (Skeleton)
- Re-export from CreateProductView.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 14:16:38 +01:00
senke
ef520fba53 refactor(web): split FileDetailsView into file-details-view module
- types.ts: FileDetailsViewProps, ActivityItem, VersionItem
- mockData.ts: MOCK_ACTIVITY, MOCK_VERSIONS, getMockFile
- useFileDetailsView.ts: hook returning file, activity, versions
- FileDetailsViewHeader, Preview, Metadata, Activity, Versions, Storage
- FileDetailsViewSkeleton for Loading state
- Layout: min-h-layout-page-sm, badge text-xs
- Imports use @/ for Storybook resolution
- Stories: Default, Loading (Skeleton)
- Re-export from FileDetailsView.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 14:05:44 +01:00
senke
0ddbe99652 refactor(web): split VirtualizedList into virtualized-list module
- virtualized-list/types.ts: VirtualizedListProps
- virtualized-list/useInfiniteScroll.ts: useInfiniteScroll hook
- virtualized-list/useScrollPosition.ts: useScrollPosition hook
- virtualized-list/VirtualizedList.tsx: main component
- Re-export from virtualized-list.tsx via ./virtualized-list/index
- Test mock extended with getTotalSize, measureElement, key on virtual items
- 4 tests pass

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 13:55:06 +01:00
senke
9761965a07 refactor(web): split AudioContext into context/audio-context module
- types.ts: VisualizerSettings, AudioContextType
- mockTracks.ts: mock track data for initial state
- useAudioContextValue.ts: all state, effects, and actions
- AudioContext.tsx: createContext, useAudio, AudioProvider
- Re-export from context/AudioContext.tsx (useAudio, AudioProvider, VisualizerSettings)
- Fix toggleMute to toggle isMuted (was incorrectly toggling isPlaying)
- 12 tests pass

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 13:46:29 +01:00
senke
f10331bb03 refactor(player): decompose AudioPlayer into audio-player module
- Add audio-player/ with useAudioPlayerLifecycle, AudioPlayerCompact, AudioPlayerFull, AudioPlayerSkeleton
- Re-export and default export from AudioPlayer.tsx
- Story Loading uses AudioPlayerSkeleton; 20 tests pass

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 13:37:04 +01:00
senke
ad7840627f refactor(library): decompose UploadModal into upload-modal module
- Add upload-modal/ with useLibraryUploadModal, UploadModalForm, UploadModalFooter, types
- Re-export UploadModal from UploadModal.tsx
- Form ids for a11y (library-upload-*); trigger role=button tabIndex=0

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 13:26:19 +01:00
senke
5c54de2ced refactor(views): decompose DiscoverView into discover-view module
- Add discover-view/ with useDiscoverView, Hero, Trending, NewReleases, Genres, Skeleton, Error
- Re-export DiscoverView from DiscoverView.tsx
- Loading: Skeleton instead of h-[50vh] spinner; Error: min-h-layout-page-sm
- Conformity: UPDATED badge text-[10px] -> text-xs
- Stories: Default, Loading (Skeleton), Error

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 13:19:25 +01:00
senke
a96c3bbedc refactor(profile): decompose UserProfilePage into user-profile-page module
- Add user-profile-page/ with useUserProfilePage, Hero, Header, Tabs, Skeleton, Error
- Re-export UserProfilePage from UserProfilePage.tsx
- Stories: Default (/u/demo), Loading (Skeleton), NotFound (/u/notfound)
- MSW: GET /api/v1/users/by-username/:username (404 for notfound)
- Tests: mock useUserProfilePage, ToastProvider; 7 tests pass

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 13:10:33 +01:00
senke
7091b9f97e refactor(social): GroupDetailView module, useGroupDetailView, Header, Members, Events, Sidebar, Skeleton, stories
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 12:34:57 +01:00
senke
abdd4fbc3e refactor(settings): EditProfile module, useEditProfile, ImagesCard, IdentityCard, Sidebar, Skeleton, cropUtils, stories
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 11:45:16 +01:00
senke
5ebb5d3894 refactor(forms): FormBuilder module, useFormBuilder, FormBuilderFieldWidget, re-export, stories, a11y id
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 11:36:20 +01:00
senke
10e9e4fe43 refactor(monitoring): MonitoringDashboardContent split into Header, Stats, ValidationCard, ErrorsCard, PerformanceCard
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 11:27:54 +01:00
senke
32c421483b refactor(data): Table module, useTable, TableHeadRow, TableBodyRows, re-export, stories, tests
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 11:22:47 +01:00
senke
30bc6476d4 refactor(ui): tooltip module, useTooltip, re-export, tests
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 10:32:14 +01:00
senke
28c9cb7601 refactor(ui): tabs module, re-export
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 10:12:33 +01:00
senke
4aea06d333 refactor(ui): accordion module, re-export
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 02:33:10 +01:00
senke
a4085f3db4 refactor(ui): dropdown-menu module, dropdown controlled open, re-export
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 02:27:29 +01:00
senke
266f2619c9 refactor(views): StudioView module, re-export, stories
- Module studio-view: types, useStudioView, Header, Sidebar, NavButton,
  Content, ProjectsSwitch, Skeleton, orchestrator StudioView
- Re-export from StudioView.tsx
- Stories: Default, Projects, Loading (Skeleton); decorator min-h-layout-main
- Fix: h-[calc(100vh-140px)] -> min-h-layout-main, w-[65%] -> w-2/3

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 02:17:36 +01:00
senke
225149dc17 refactor(studio): CloudSettingsView module, re-export, stories
- Module cloud-settings-view: types, useCloudSettingsView, Quota,
  Preferences, Skeleton, orchestrator CloudSettingsView
- Re-export from CloudSettingsView.tsx
- Stories: Default, Loading (Skeleton); decorator min-h-layout-page

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 02:11:33 +01:00
senke
a18aea7174 refactor(studio): AIToolsView module, re-export, stories
- Module ai-tools-view: types, constants (AI_TOOLS), useAIToolsView,
  ToolGrid, Workspace, Skeleton, orchestrator AIToolsView
- Re-export from AIToolsView.tsx
- Stories: Default, Loading (Skeleton); decorator min-h-layout-page,
  no local ToastProvider (use StorybookDecorator)
- Fix: text-[10px] -> text-xs, min-h-[400px] -> min-h-layout-page-sm

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 02:07:05 +01:00
senke
502b62f364 refactor(studio): ConnectivityView module, re-export, stories
- Module connectivity-view: types, useConnectivityView, WebDAV, Webhooks,
  Skeleton, orchestrator ConnectivityView
- Re-export from ConnectivityView.tsx
- Stories: Default, Loading (Skeleton); decorator min-h-layout-page
- Fix: text-[10px] -> text-xs (Mount Password hint)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 02:02:00 +01:00
senke
98480c347a refactor(studio): GoLiveView module, re-export, stories
- Module go-live-view: types, useGoLiveView, Header, Preview, StreamInfo,
  EncoderSetup, QuickInstructions, MicLevel, Skeleton, orchestrator
- Re-export from GoLiveView.tsx
- Stories: Default, Loading (Skeleton); decorator min-h-layout-main
- Fix: text-[10px] -> text-xs, w-[60%] -> w-3/5

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 01:57:22 +01:00
senke
4e43e62e92 refactor(studio): CreateProjectModal module, re-export, stories
- Module create-project-modal: types, useCreateProjectModal, Header,
  Form, Footer, Skeleton, orchestrator CreateProjectModal
- Re-export from projects/CreateProjectModal.tsx
- Stories: Default, Loading (Skeleton); decorator min-h-layout-story

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 01:51:25 +01:00
senke
c1b9f557e6 refactor(studio): ProjectsManager module, re-export, stories
- Module projects-manager: types, useProjectsManager, Header, FilterBar,
  Card, AddCard, Empty, Skeleton, orchestrator ProjectsManager
- Re-export from studio/ProjectsManager.tsx
- Stories: Default, Loading (Skeleton), Empty; decorator min-h-layout-main

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 01:44:40 +01:00
senke
f0d3a2786c refactor(tracks): TrackHistory module, re-export, stories, tests
- Module track-history: types, useTrackHistory, Header, Empty, ItemRow, Pagination, Skeleton, trackHistoryUtils
- Re-export from TrackHistory.tsx
- Stories: Default, Loading, Empty, Error (MSW)
- Tests: mock @/features/tracks/services/trackHistoryService, formatHistoryDate defensive, pagination/error tests fixed

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 01:34:58 +01:00
senke
d5bf3030a5 refactor(settings): TwoFactorSetup module, re-export, stories
- Module two-factor-setup: types, useTwoFactorSetup, Header, Step1/2/3, Skeleton
- Re-export from TwoFactorSetup.tsx
- Stories: Default, Step1, Step2, Loading (Skeleton), Error (MSW)
- Decorator: min-h-layout-page-sm

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 01:25:43 +01:00
senke
539118504b refactor(views): UploadView module, re-export, stories
- Module upload-view: types, useUploadView, Stepper, Step1/2/3, Skeleton
- Layout: min-h-layout-page, max-h-96 (no arbitrary values)
- Re-export from UploadView.tsx
- Stories: Default, Loading (Skeleton), Empty, Error

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 01:12:24 +01:00
senke
5f8fc508f0 refactor(playlists): AddCollaboratorModal module, re-export, stories, tests
- Module add-collaborator-modal: types, useAddCollaboratorModal, Form, Skeleton
- Re-export from AddCollaboratorModal.tsx
- Stories: Default, Loading (Skeleton), Error (MSW)
- Tests: validation/mutation via ErrorDisplay, retry, no toast assertions

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 01:04:24 +01:00
senke
e37b58bd00 refactor(playlists): découper SharePlaylistModal en module
- Module share-playlist-modal/ : useSharePlaylistModal, Content, Skeleton
- ErrorDisplay + retry (max 3), Spinner pour chargement
- Stories : Default, Loading, Error (MSW 500)
- Tests : useCreateShareLink mock, playlistId string
- Re-export depuis SharePlaylistModal.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 00:57:48 +01:00
senke
9ad729f461 refactor(playlists): découper CreatePlaylistDialog en module
- Module create-playlist-dialog/ : schema zod, useCreatePlaylistDialog,
  CreatePlaylistDialogForm, CreatePlaylistDialogSkeleton
- Bouton Créer avec Spinner (remplace Loader2)
- Stories : Default, Loading
- Tests : assertion createPlaylist(object), erreur avec Error
- Re-export depuis CreatePlaylistDialog.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 00:52:51 +01:00
senke
dc12e6aca6 refactor(playlists): découper PlaylistSearch en module
- Module playlist-search/ : usePlaylistSearch, Bar, Filters, Results, Skeleton
- Chargement avec Spinner (remplace Loader2)
- PLAYLIST_SEARCH activé en Storybook (VITE_STORYBOOK)
- MSW : GET /api/v1/playlists/search
- Stories : Default, Loading, Empty, Error
- Tests : Vitest + mock playlistsApi, useToast stable
- Re-export depuis PlaylistSearch.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 00:47:28 +01:00
senke
e7365f44b4 refactor(playlists): découper PlaylistBatchActions en module
- Module playlist-batch-actions/ : usePlaylistBatchActions, exportUtils,
  Bar, Buttons, DeleteDialog, Skeleton
- Boutons min-h-11 (remplace min-h-[44px])
- Stories : Default, SingleSelection, Loading
- Tests : mocks URL + Playlist id/user_id en string
- Re-export depuis PlaylistBatchActions.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 00:37:06 +01:00
senke
19b2b00332 refactor(playlists): découper AddTrackToPlaylistModal en module
- Module add-track-to-playlist-modal/ : useAddTrackToPlaylistModal, Search,
  List, TrackRow, Footer, Skeleton
- Liste max-h-96 (layout), Spinner pour chargement
- Stories : Default (useArgs), Loading (Skeleton)
- Re-export depuis AddTrackToPlaylistModal.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 00:22:09 +01:00
senke
691d798322 refactor(playlists): PlaylistTrackList module with hook, subcomponents, skeleton
- Add playlist-track-list/ with usePlaylistTrackList, Empty, SortableItem, Skeleton, utils
- Prop isLoading for skeleton state
- Re-export from PlaylistTrackList.tsx and PlaylistTrackListSkeleton.tsx
- Stories: Default, Loading (Skeleton), Empty, Reordering (with mock data)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 00:14:19 +01:00
senke
9060ae6752 refactor(notifications): NotificationMenu module with hook, subcomponents, skeleton
- Add notification-menu/ with useNotificationMenu, Trigger, Dropdown, List, Item, Skeleton
- Dropdown max-h-96 (no arbitrary max-h-[500px])
- Props notificationsOverride, isLoadingOverride, errorOverride for Storybook
- Re-export from NotificationMenu.tsx
- Stories: Default, Loading, Empty, Error, Skeleton

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 00:07:19 +01:00
senke
74ed02b414 refactor(library): LibraryManager module with hook, subcomponents, skeleton
- Add library-manager/ with useLibraryManager, Header, Toolbar, Error, Empty, Content, Stats, Skeleton
- Layout min-h-layout-page (no arbitrary h-[600px])
- Props tracksOverride, errorOverride, isLoadingOverride for Storybook
- Re-export from LibraryManager.tsx
- Stories: Default, Loading (Skeleton), Empty, Error

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 00:00:35 +01:00
senke
45971e7a07 refactor(education): CourseDetailView module with hook, subcomponents, skeleton
- Add course-detail-view/ with useCourseDetailView, Header, Tabs, Sidebar, Skeleton
- Stories: Default, Loading (Skeleton), Empty, Enrolled
- Re-export from CourseDetailView.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 23:52:24 +01:00
senke
bfd95f2ce8 refactor(education): CourseLearningView module with hook, subcomponents, skeleton
- Add course-learning-view/ with useCourseLearningView, Header, Player, Tabs, Sidebar, Skeleton
- Layout min-h-layout-main, no arbitrary values
- Re-export from CourseLearningView.tsx
- Stories: Default, Loading (Skeleton), Empty, Complete

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 23:45:58 +01:00
senke
f901a78438 refactor(marketplace): split ProductDetailView into module (Header, Gallery, Info, Licenses, Description, Reviews, Similar, Skeleton)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 23:38:09 +01:00
senke
7d3ce8a7f0 refactor(streaming): split PlaybackHeatmap into module (Header, Stats, Grid, Skeleton, Error, Empty)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 23:31:06 +01:00
senke
8c8891d29f refactor(studio): split ProjectDetailView into module (Header, Tabs, Overview, Files, Settings, Sidebar, Skeleton)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 23:24:39 +01:00
senke
1e58725c95 refactor(auth): split SessionsPage into module (Header, Content, Skeleton, stories)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 23:19:06 +01:00
senke
9f97bbfc0b refactor(tracks): split TrackSearchFilters into module (Basic, Advanced, Skeleton)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 23:09:36 +01:00
senke
3cf40619fa refactor(settings): extract AccountSettings into account-settings module
- Add account-settings/ with useAccountSettings, AccountSettingsErrorBanner,
  AccountSettingsPasswordCard, AccountSettingsExportCard, AccountSettingsDeleteCard,
  AccountSettingsSkeleton
- Re-export from AccountSettings.tsx for backward compatibility
- Stories: Default, Loading (skeleton, min-h-layout-story); remove ToastProvider

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 23:04:16 +01:00
senke
6677bde6fe refactor(ui): extract Dialog into dialog module
- Add dialog/ with types, Dialog, DialogHeader, DialogBody, DialogFooter,
  DialogContent, DialogDescription, DialogTitle, DialogTrigger, DialogSkeleton
- Re-export from dialog.tsx via dialog/index for backward compatibility
- Stories: Default, Alert, Composition (max-w-md), Loading (DialogSkeleton)
- Test: assert Kodo destructive classes (text-kodo-red) for alert variant

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:59:48 +01:00
senke
2134d27058 refactor(playlists): extract PlaylistList into playlist-list module
- Add playlist-list/ with usePlaylistList, PlaylistListToolbar, PlaylistListEmpty,
  PlaylistListError, types; keep PlaylistListSkeleton at components level
- Re-export from PlaylistList.tsx for backward compatibility
- Stories: Default, Grid, Empty (MSW), Loading (skeleton, min-h-layout-story)
- Replace min-h-[44px] with min-h-11; no arbitrary values
- Tests: assert French labels and Pagination text; fix skeleton test

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:54:54 +01:00
senke
c71da0bc92 refactor(tracks): extract TrackFilters into track-filters module
- Add track-filters/ with useTrackFilters, TrackFiltersHeader, TrackFiltersSearch,
  TrackFiltersGrid, TrackFiltersClear, TrackFiltersSkeleton, types
- Re-export from TrackFilters.tsx for backward compatibility
- Stories: Default, Collapsible, Loading (skeleton)
- Layout primitive min-h-layout-story for skeleton; no arbitrary values

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:46:11 +01:00
senke
27970f34c9 refactor(player): extract AudioPlayer into audio-player module
- types, useAudioPlayerEffects, AudioPlayerTrackInfo, AudioPlayerControls
- AudioPlayerProgress, AudioPlayerVolume, AudioPlayerSkeleton
- Stories: Default (mock store), Skeleton
- Re-export from AudioPlayer.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:40:06 +01:00
senke
97f00097cc refactor(ui): extract DataList into data-list module
- types, DataListSkeleton, DataListEmpty, DataListError, DataList
- Remove duplicate Modal/Dropdown from DataList.tsx (exist in modal.tsx/dropdown.tsx)
- Stories: Default, Loading, Empty, Error, Skeleton (min-h-layout-story)
- Re-export from DataList.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:35:53 +01:00
senke
345597bcda refactor(ui): extract OptimizedImage into optimized-image module
- types, generateImageSources, BlurPlaceholder, useImageFormatSupport
- OptimizedImage, OptimizedImageSkeleton, useImagePreloader, ResponsiveImage
- Stories: Default, WithPlaceholder, ErrorState, Loading (skeleton)
- Re-export from optimized-image.tsx; tests adapted to loading state

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:31:35 +01:00
senke
91a6ff290a fix(ui): call onAvatarUpdated('') after successful avatar delete
Ensures parents that rely on onAvatarUpdated get the empty URL when
avatar is removed. Aligns with profile feature test contract.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:24:50 +01:00
senke
9efb239b39 refactor(ui): extract AvatarUpload into avatar-upload module
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:21:02 +01:00
senke
2fff1eb488 refactor(ui): extract DatePicker into date-picker module
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:15:11 +01:00
senke
c8e6e82a5c refactor(share): extract ShareLinkManager into share-link-manager module
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:09:31 +01:00
senke
5cf8cbfc0e refactor(streaming): extract PlaybackDashboard into playback-dashboard module
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:04:38 +01:00
senke
deba9f4c6c refactor(monitoring): extract MonitoringDashboard into monitoring-dashboard module
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:57:39 +01:00
senke
bc289680bf refactor(auth): extract RegisterPage into register-page module
- Add register-page/ with useRegisterPage, RegisterPageForm,
  RegisterPageVerificationNotice, RegisterPageSkeleton
- Layout primitives (min-h-layout-page-sm), tokens (success, destructive)
- Stories: Default, Loading, WithError; re-export from pages/RegisterPage

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:50:17 +01:00
senke
88a347dfd1 refactor(views): extract FileManagerView into file-manager-view module
- Add file-manager-view/ with useFileManagerView, Header, Toolbar, Table, Grid,
  Empty, Skeleton; types and mockFiles
- Layout primitives (min-h-layout-page-sm), no arbitrary values
- Stories: Default, Loading, Empty
- Re-export from FileManagerView.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:45:01 +01:00
senke
e1c073bf9c refactor(search): extract SearchPage into feature module
- Add features/search/components/search-page/ with useSearchPage, Header,
  Discovery, Empty, Error, Results, Skeleton
- Layout primitives only (min-h-layout-page, max-w-6xl)
- Stories: Default, Loading, Empty, Error; MSW handler for SearchResults shape

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:39:31 +01:00
senke
b4ad28183f fix(views): use layout primitive in NotificationsView loading state
Replace arbitrary h-[50vh] with min-h-layout-page-sm per .cursorrules

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:32:33 +01:00
senke
c75e7eb9bd refactor(notifications): extract NotificationsPage into feature module
- Add features/notifications/components/notifications-page/ with:
  - useNotificationsPage (query + mark read / mark all read mutations)
  - NotificationsPageHeader, NotificationsPageFilters, NotificationsPageItem
  - NotificationsPageEmpty, NotificationsPageError, NotificationsPageSkeleton
  - types (FilterType, NotificationTypeFilter, NOTIFICATION_TYPE_LABELS)
- Page re-exports from module; stories moved to component (Default, Loading, Error, Empty)
- MSW handler: notifications response shape aligned with notificationService (data.notifications)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:32:19 +01:00
senke
4cab15c6f2 chore(studio): remove legacy CloudFileBrowser from components/studio
CloudFileBrowser lives in features/studio/components/cloud-file-browser/.
StudioView already imports from there.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:20:36 +01:00
senke
8cb0072163 test(ui): add Select stories (Default, Empty, Disabled, Grouped, MultiSelect), fix tests for listbox/option
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:16:30 +01:00
senke
1ca1130dcf refactor(ui): decompose Select into select module
- Add select/ with useSelect, types, SelectTrigger, SelectDropdownContent,
  SelectOptionItem; min-w-48 max-h-72 (no arbitrary values)
- Remove monolithic select.tsx; entry point is select/index.ts
- Backward compatible: imports from './select' resolve to module

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:16:19 +01:00
senke
13b3812167 test(ui): add FileUpload stories (Default, Empty, Error, Disabled, etc.)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:09:21 +01:00
senke
bfe3d17927 refactor(ui): decompose FileUpload into file-upload module
- Add file-upload/ with useFileUpload, types, utils, and presentational
  components: FileUploadDropzone, FileUploadErrorList, FileUploadFileList
- Remove monolithic file-upload.tsx; entry point is file-upload/index.ts
- Backward compatible: imports from './file-upload' resolve to module

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:09:08 +01:00
senke
4397751a69 test(upload): add UploadModal stories (Default, Open)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:03:15 +01:00
senke
0ff8146413 refactor(upload): decompose UploadModal into upload-modal module
- Add upload-modal/ with useUploadModal, constants, and presentational
  components: Dropzone, FileDisplay, Progress, ErrorAlert, MetadataForm
- Re-export from UploadModal.tsx for backward compatibility

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:03:07 +01:00
senke
4490e78ff6 docs(ui): update audit report and mark LazyComponent as refactored in FRONTEND_DEEP_DIVE_AUDIT
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:49:46 +01:00
senke
2c0cf88077 test(ui): add LazyErrorFallback and LazyComponent stories; fix LazyComponent tests for fallback text
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:49:17 +01:00
senke
b4eb640b1d refactor(ui): decompose LazyComponent into lazy-component module with LazyErrorFallback, LazyErrorBoundary, createLazyComponent
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:48:36 +01:00
senke
d7aaa0e69c docs(views): update audit report and mark GearView as refactored in FRONTEND_DEEP_DIVE_AUDIT
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:40:12 +01:00
senke
6b2ebe67b5 test(views): add GearView stories Default, Loading, Empty, Error and GearViewSkeleton
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:38:59 +01:00
senke
f5a29db060 refactor(views): decompose GearView into gear-view module with useGearView and sub-components
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:38:45 +01:00
senke
1eb766d0fa docs(views): update audit report and mark ProfileView as refactored in FRONTEND_DEEP_DIVE_AUDIT
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:31:26 +01:00
senke
fcf65be277 test(views): add ProfileView stories Default, Loading, Error and ProfileViewSkeleton
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:30:50 +01:00
senke
a06f5b40bb refactor(views): decompose ProfileView into profile-view module with hook and sub-components
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:30:36 +01:00
senke
335faefe17 docs(user): update audit report and mark ProfileForm as refactored in FRONTEND_DEEP_DIVE_AUDIT
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:21:28 +01:00
senke
5607150ad0 test(user): add ProfileForm stories (Default, Loading, Error) and Skeleton; fix tests and MSW completion handler
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:21:05 +01:00
senke
899b83b7a3 refactor(user): decompose ProfileForm into profile-form module with hook and sub-components
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:20:49 +01:00
senke
96ed1a73dc docs(chat): update audit report for ChatSidebar refactor
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:07:31 +01:00
senke
e62478c43e test(chat): add stories and mocks for ChatSidebar
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:07:20 +01:00
senke
45779abb82 refactor(chat): decompose ChatSidebar into sub-components
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:07:09 +01:00
senke
ad366ad9da test(search): add stories Loading/Empty/Error and fix Search tests
- Stories: Loading, Empty, Error; decorator max-w-2xl min-h-layout-story
- SearchSkeleton.stories; fix tests: waitFor, Enter for history, keyboard nav query

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 19:45:52 +01:00
senke
4c20b39449 refactor(search): decompose Search into sub-components
- Add features/search/components/search: types, useSearchSuggestions,
  SearchInput, SearchDropdown, SearchSkeleton
- Search.tsx orchestrator; re-export from components/search for GlobalSearchBar
- No console.log; logger only; layout primitives in stories

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 19:45:41 +01:00
senke
937dae9a6a fix(storybook): ignore net::ERR_ABORTED on iframe in audit (navigation false positive)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 19:32:39 +01:00
senke
8835b5d1c5 test(tracks): add stories and mocks for CommentThread
- Stories: EmptyReplies, LoadingReplies, ReplyError; decorator uses max-w-2xl, min-h-layout-story
- CommentThreadSkeleton.stories.tsx
- MSW: PUT */api/v1/comments/:id for update; useUser mock in CommentThread.test

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 19:20:58 +01:00
senke
ae86c0a123 refactor(tracks): decompose CommentThread into sub-components
- Add comment-thread module: types, useCommentReplies, useCommentActions
- Presentational components: CommentThreadHeader, CommentThreadContent,
  CommentThreadActions, CommentReplyForm, CommentRepliesList
- CommentThreadSkeleton for Loading state
- CommentThread.tsx becomes orchestrator (~170 lines); re-export from module
- FE-COMP-012 preserved; no breaking change for CommentSection

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 19:20:47 +01:00
senke
9093c66917 feat(ui): implement skeleton-first loading and grid/list orchestration for CloudFileBrowser 2026-02-05 19:04:03 +01:00
senke
cf3f03b2eb refactor(studio): modularize CloudFileBrowser with FileTable, FileGrid and FileToolbar 2026-02-05 19:04:00 +01:00
senke
c112b4b66a test(msw): add inventory gear handlers for deterministic story testing 2026-02-05 18:18:17 +01:00
senke
3c775d8bb4 feat(ui): implement grid/list view orchestration with synchronized skeletons for GearView 2026-02-05 18:18:13 +01:00
senke
40e999f094 refactor(ui): create atomic gear module with Header, Filters, Grid, and Modal 2026-02-05 18:18:09 +01:00
senke
30340a0dab refactor(ui): modularize ProfileView into Header, Stats, and Tabs components 2026-02-05 14:32:20 +01:00
senke
2964cec09a chore(dx): add .cursorrules and design system audit documentation 2026-02-05 14:20:06 +01:00
senke
fded6f7b64 refactor(ui): decompose ProfileForm into atomic sub-components (Avatar, Identity, Social, Actions, Security) 2026-02-05 14:16:01 +01:00
senke
c377b57e6a docs(storybook): final comparison 67%→0%, contract update, silent toasts in Storybook 2026-02-05 13:39:59 +01:00
senke
634adbca13 chore(storybook): add test:storybook script for local audit 2026-02-05 13:39:56 +01:00
senke
9a27c5ef63 ci(storybook): add audit workflow and exit 1 on audit failures 2026-02-05 13:39:53 +01:00
senke
8e8bf7202e chore(storybook): set MSW onUnhandledRequest to 'error' to block unhandled network requests 2026-02-05 13:22:03 +01:00
senke
37895e6fef chore(storybook): reclassify story hierarchy (App/Pages, Layouts, UI, Features, Docs/Failures) and enable autodocs 2026-02-05 13:21:54 +01:00
senke
3e8480a312 docs(storybook): clarify global decorator guarantees nav/auth context (Phase 3)
All stories run under AuthProvider and MemoryRouter; no story should
crash on missing useContext for auth or router.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 13:08:45 +01:00
senke
e772d81226 refactor(storybook): remove duplicate providers from stories (Phase 2)
Stories no longer wrap with QueryClientProvider, ToastProvider,
ThemeProvider, or MemoryRouter; global StorybookDecorator provides them.
- Route-specific pages use parameters.router.initialEntries
  (ResetPasswordPage, VerifyEmailPage) or minimal MemoryRouter+Route
  where useParams is needed (TrackDetailPage, PlaylistDetailPage).
- Stories that seeded query cache use useQueryClient() from global
  decorator (FollowButton, CollaboratorManagement, CommentSection).
- Navbar, AuthLayout, DashboardLayout, Header, and 25+ story files
  simplified to layout divs only.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 13:08:17 +01:00
senke
75c9a4fcd4 feat(storybook): global StorybookDecorator in decorators.tsx (Phase 2)
Single decorator provides: I18nextProvider(i18n), ThemeProvider,
QueryClientProvider(retry:false), ToastProvider, AudioProvider,
AuthProvider, MemoryRouter. Stories can set parameters.router.initialEntries
for route-specific views. preview.tsx uses StorybookDecorator only.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 13:01:49 +01:00
senke
11021a2c3a chore(storybook): audit script filter sb-manager/sb-addons + comparison report
- Filter requestfailed to ignore /sb-manager/, /sb-addons/, /index.json,
  /project.json so the audit counts only app/API failures.
- Add STORYBOOK_AUDIT_COMPARISON.md: before 641 stories / 1250 errors,
  after 0 app errors (Phase 1 validated).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 12:41:08 +01:00
senke
b8a8234069 docs(storybook): document MSW/same-origin contract in preview
Storybook must be run via npm run storybook so VITE_API_URL stays
relative and VITE_STORYBOOK is set; avoids accidental real API calls.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 12:28:04 +01:00
senke
4d82136038 fix(storybook): mark ErrorBoundary error stories for audit allowlist
WithError and WithCustomFallback set parameters.storybookAudit.expectConsoleErrors
so audit/CI can treat their console errors as intentional (failure demo).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 12:17:50 +01:00
senke
f8b4bc3b52 fix(storybook): mock dicebear and transparenttextures in MSW
Prevent external asset requests during Storybook so no network
dependency and deterministic rendering. Return 1x1 SVG placeholder.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 12:17:14 +01:00
senke
7545998830 fix(storybook): fix auth/me shape and add dashboard, sessions, roles handlers
- auth/me: return data.user so authService.getCurrentUser() gets response.data.user
- Add GET /api/v1/dashboard for dashboardService (stats, recent_activity, library_preview)
- Add GET /api/v1/sessions/stats for sessionsApi
- Add GET /api/v1/roles and /roles/:id for admin views
- Remove console.log from audit/stats handler

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 12:16:56 +01:00
senke
fde40585a1 fix(storybook): disable logger network send in Storybook
Set VITE_STORYBOOK=true for storybook dev/build so the logger never
sends POST to /logs/frontend in the isolated UI environment. Prevents
94+ failed network requests in audit and keeps Storybook hermetic.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 12:16:23 +01:00
senke
765497ea31 fix(storybook): remediate crashes and improve mock stability
- Add global AuthProvider and QueryClientProvider
- Fix Loader2 reference error in CommentThread
- Fix coverUrl crash in ProductCard
- Fix double-slash URL bug in logger
- Improve MSW handlers and environment config
2026-02-04 19:33:00 +01:00
senke
83b9ce2192 fix(frontend): remove redundant api version path in logger endpoint 2026-02-04 10:18:47 +01:00
senke
e7da63479a fix(storybook): add global AuthProvider to preview.tsx 2026-02-04 10:17:19 +01:00
senke
b26593a000 fix(storybook): update MSW handlers to be cookie-compatible and add missing logs endpoint 2026-02-04 10:15:11 +01:00
senke
60acef5147 feat(storybook): integrate msw for data mocking 2026-02-04 01:01:45 +01:00
senke
158e343e50 chore(storybook): add audit report (clean pass) 2026-02-04 00:55:10 +01:00
senke
9b4e66cd43 chore(storybook): improve configuration and cleanup 2026-02-04 00:44:40 +01:00
senke
0e9b206389 stabilisation: fix commit 2026-02-03 09:56:11 +01:00
senke
c38a189207 refactor(cart): migrate CheckoutView and MarketplaceView to useCartStore and fix stories 2026-02-03 09:50:51 +01:00
senke
0bcf56c41a refactor(cart): migrate CartView and CartItem to useCartStore 2026-02-03 09:46:01 +01:00
senke
54def06bde refactor(cart): migrate Navbar to useCartStore and remove CartProvider decorator 2026-02-03 09:42:59 +01:00
senke
01c4e1bff3 refactor(cart): migrate WishlistView to useCartStore 2026-02-03 09:40:54 +01:00
senke
f9ded822dc chore(test): disable broken storybook plugin in vitest config 2026-02-03 09:37:16 +01:00
senke
a91117aec0 docs(cart): list all CartContext consumers 2026-02-03 09:32:21 +01:00
senke
c73165196c feat(storybook): complete comprehensive ui coverage for auth, player, tracks, and groups 2026-02-02 20:55:57 +01:00
senke
d42a7b3c24 feat(storybook): complete UI coverage with Batches 26-30
- Batch 26 (Tracks List/Grid): added stories for row, grid, sort, toggle, skeleton, empty states.
- Batch 27 (Dashboard): added stories for ActivityGraph, TrackList widget.
- Batch 28 (Education): added stories for CourseCard, MyCoursesView, QuizModal, CertificateModal.
- Batch 29 (Inventory): added stories for EquipmentCard, InventoryView.
- Batch 30 (Seller/Live): added stories for SellerDashboardView, FlashSaleModal, LiveStreamDetailView, TipStreamerModal.
- Verified build and fixed AudioProvider/service dependencies.
2026-02-02 20:47:47 +01:00
senke
5ed179cfa8 feat(storybook): add stories for Auth, Player, Tracks, Dashboard (Batches 22-25)
- Batch 22 (Auth/Settings): OAuthButtons, PasswordStrengthIndicator, ThemeSwitcher, TwoFactorSettings
- Batch 23 (Player): TimeDisplay, RepeatShuffleButtons, NextPreviousButtons, QualitySelector
- Batch 24 (Tracks): LikeButton, TrackFilters, TrackStatsDisplay
- Batch 25 (Dashboard): StatCard
- Fixed build issues with sonner dependencies.
2026-02-02 20:42:51 +01:00
senke
38acc2326d feat(storybook): add stories for Feedback and Playlist components (Batches 20-21)
- Batch 20 (Feedback): Alert, Toast
- Batch 21 (Playlists): PlaylistCard, PlaylistHeader, AddTrackToPlaylistModal
- Verified successful build.
2026-02-02 20:38:52 +01:00
senke
f4424d6267 feat(storybook): add stories for Social, Notifications, and Modals (Batches 17-19)
- Batch 17 (Social): PostCard, CommentItem
- Batch 18 (Notifications): NotificationItem, NotificationBell, NotificationMenu
- Batch 19 (Modals): CreatorModal
- Fix: remove duplicate import in api.ts
- Verified successful build.
2026-02-02 20:33:45 +01:00
senke
b0be0068c8 feat(storybook): achieve total UI coverage (Batches 13-16)
- Batch 13 (Library/Profile): UploadModal, FollowButton
- Batch 14 (Settings): AccountSettings, NotificationSettings
- Batch 15 (Layout): DashboardLayout, Header, Sidebar
- Batch 16 (Search): SearchBar, Search
- Verified successful build of all stories.
2026-02-02 20:29:46 +01:00
senke
27c6e6b67f feat(storybook): expanded coverage for feature components (batches 10-12)
- Batch 10 (Auth): AuthButton, AuthInput, LoginForm, RegisterForm
- Batch 11 (Chat): ChatMessage, ChatInput, TypingIndicator
- Batch 12 (Player/Tracks): PlayPauseButton, VolumeControl, ProgressBar, TrackCard
- Achieved extensive functional component coverage.
2026-02-02 20:19:10 +01:00
senke
2c9c39a8a1 feat(storybook): complete UI component coverage (batches 6-9)
- Batch 6: FAB, FormField, FloatingInput, AvatarUpload
- Batch 7: Modal, ConfirmationDialog, ImageViewerModal, ErrorDisplay, LoadingState
- Batch 8: DataList, WaveformVisualizer, OptimizedImage, VirtualizedList
- Batch 9: ImageCropper, LoadingSpinner, FocusTrap
- Achieved total coverage for src/components/ui
2026-02-02 19:50:45 +01:00
senke
7587253741 feat(storybook): expanded coverage for visual and feedback components (batch 5)
- Added stories for: Spinner, KodoEmptyState, HelpText, AstralBackground
- Increased coverage for utility and visual components
2026-02-02 19:46:27 +01:00
senke
b6079ff7e8 feat(storybook): expanded coverage for structural components (batch 4)
- Added stories for: Label, Skeleton, ScrollArea, Toast, Collapsible, Sidebar
- Covered layout and feedback components
2026-02-02 19:44:58 +01:00
senke
f5fca6557a feat(storybook): expanded coverage for complex form & data components (batch 3)
- Added stories for: DatePicker, Select, RadioGroup, FileUpload, Table
- Achieved high coverage for core UI components
2026-02-02 19:41:12 +01:00
senke
4322f26fbb feat(storybook): expanded coverage for complex UI components (batch 2)
- Added stories for: Accordion, Tabs, Textarea, Tooltip, Dialog, DropdownMenu
- Covered various interactive states and sub-components
2026-02-02 19:39:50 +01:00
senke
f597e8792a feat(storybook): expanded coverage for core UI components (batch 1)
- Added stories for: Button, Avatar, Switch, Slider, Alert, Progress
- Consolidated Button component to src/components/ui/button.tsx
- Removed legacy src/components/Button.tsx
2026-02-02 19:37:52 +01:00
senke
31c9f2af0c feat: global update including storybook setup and backend fixes
- Web: Setup Storybook, added addons, configured Tailwind, added stories for UI components.
- Backend: Updated API router, database, workers, and auth in common.
- Stream Server: Removed SQLx queries and updated auth.
- Docs & Scripts: Updated documentation and recovery scripts.
2026-02-02 19:34:14 +01:00
senke
ef217b96c7 feat(auth): add centralized AuthProvider component
Created AuthProvider React component to centralize auth initialization
logic and eliminate race conditions.

Features:
- Single source of truth for auth initialization
- Checks for tokens on mount (TokenStorage.hasTokens())
- Calls refreshUser() if tokens exist
- Shows loading screen while auth initializing
- Always sets ready state (prevents stuck loading)
- Comprehensive error handling and logging
- Optional custom loading component prop

Benefits:
- Eliminates race condition: router no longer renders before auth ready
- Centralizes auth logic (was scattered in App.tsx, interceptors)
- Reusable across different app entry points
- Clean separation of concerns

Usage:

Impact: Reduces auth-related race conditions, improves code maintainability.

Fixes: P3.1 from audit AUDIT_TEMP_29_01_2026.md
2026-01-29 23:42:26 +01:00
senke
e814bd2235 config(prod): add frontend production environment file
Created .env.production for frontend with absolute API URLs for
production deployment.

Configuration:
- VITE_API_URL: https://api.veza.com/api/v1
- VITE_WS_URL: wss://api.veza.com/ws
- VITE_STREAM_URL: https://api.veza.com/stream
- VITE_UPLOAD_URL: https://api.veza.com/upload
- VITE_API_VERSION: v1

Features:
- Absolute URLs (required for production, no Vite proxy)
- HTTPS/WSS for secure connections
- Validation alerting enabled
- Deployment notes included

Usage:
- Local testing: Update URLs to local domains, npm run build, npm run preview
- Production: Update to real domains, ensure CORS configured

Impact: Frontend can now be deployed to production with proper API URLs.

Fixes: P2.2 from audit AUDIT_TEMP_29_01_2026.md
2026-01-29 23:23:04 +01:00
senke
0d7586692f config(dev): add Vite proxy for API requests
Added proxy configuration to forward /api requests to backend
on localhost:8080 during development.

Benefits:
- Eliminates CORS errors in dev (requests are same-origin)
- No need for CORS_ALLOWED_ORIGINS in dev environment
- Matches production behavior (frontend and API on same domain)
- Simplifies local development setup

Configuration:
- Target: http://localhost:8080
- changeOrigin: true (modifies Host header)
- secure: false (allows self-signed certs in dev)

Impact: Dev environment more stable, no CORS configuration needed.

Fixes: P2.1 from audit AUDIT_TEMP_29_01_2026.md
2026-01-29 23:22:32 +01:00
senke
236fbe2826 fix(auth): prevent race condition on app initialization
Added isAuthReady state to prevent router from rendering before auth
state is initialized. This eliminates login redirect loops and ensures
deterministic auth behavior.

Changes:
- Added isAuthReady state (default: false)
- New useEffect to initialize auth before rendering
- Waits for refreshUser() to complete if tokens exist
- Shows loading screen while auth is initializing
- Always sets isAuthReady=true in finally block

Loading screen:
- Simple centered spinner with "Chargement..." text
- Uses Tailwind classes for styling
- Matches app theme (bg-background, text-muted-foreground)

Behavior:
- App loads → Check for tokens → If yes, await refreshUser()
- Only after auth check completes, render router
- Prevents "flash of login page" for authenticated users
- Eliminates race condition: router no longer renders before auth ready

Impact: Fixes intermittent login loops, improves UX on page refresh.

Fixes: P1.2 from audit AUDIT_TEMP_29_01_2026.md
2026-01-29 23:19:01 +01:00
senke
3a99bfe1a3 fix(csrf): add retry mechanism for 403 CSRF errors
Added response interceptor to handle 403 errors caused by expired or
invalid CSRF tokens. When a mutation fails with 403, the interceptor:

1. Detects if error is CSRF-related (checks error message for csrf/token/forbidden)
2. Refreshes the CSRF token via csrfService.ensureToken()
3. Updates request headers with new token
4. Retries the request once

Features:
- Only retries once per request (via _csrfRetry flag)
- Skips retry for /csrf-token and /auth/* endpoints
- Logs all CSRF refresh attempts for debugging
- Falls through to original error if refresh fails
- Handles both error.error and error.message formats

TypeScript fixes:
- Cast originalRequest to any for _csrfRetry property
- Safely access error data with type checking

Impact: Eliminates 403 errors on POST/PUT/DELETE when CSRF token expires.
Users no longer need to manually refresh page to get new CSRF token.

Fixes: P1.3 from audit AUDIT_TEMP_29_01_2026.md
2026-01-29 23:18:08 +01:00
senke
aae5a75e08 fix(auth): limit refresh token attempts to prevent infinite loops
Added refresh attempt counter with MAX_REFRESH_ATTEMPTS=3 to prevent
infinite refresh loops when token refresh repeatedly fails.

Changes:
- Added refreshAttempts counter and MAX_REFRESH_ATTEMPTS constant
- Check counter before attempting refresh, logout if max reached
- Increment counter on each refresh attempt
- Reset counter to 0 on successful refresh
- Log attempt number in all refresh-related logs
- Show user-friendly error message after max attempts

Behavior:
- After 3 failed refresh attempts, user is logged out automatically
- Prevents infinite 401 → refresh → 401 loops
- Uses logoutLocal() to avoid triggering another API call
- Displays clear error message: "Session expired after multiple attempts"

Impact: Eliminates infinite refresh loops, improves UX on persistent auth failures.

Fixes: P1.4 from audit AUDIT_TEMP_29_01_2026.md
2026-01-29 23:16:37 +01:00
senke
f56e81361e improving UI: improve audio player phase 1 2026-01-26 19:18:52 +01:00
senke
d0c270314e improving UI: adding API doc to Developer Page 2026-01-26 14:12:17 +01:00
senke
fee6904e7e feat(frontend): complete design system migration and cleanup old pages 2026-01-25 12:33:46 +01:00
senke
ebf293a4c0 refactor of veza frontend ui- batch 1 2026-01-22 17:23:11 +01:00
senke
3ed37df147 refactor(frontend): improve sidebar and library ui with design system
- Update Sidebar to use Design System Button component and consistent styling
- Refactor LibraryPage to use Card variants (glass/gaming) for track grid
- Ensure consistent button usage across key UI components
- Fix type errors in DashboardPage
2026-01-18 22:40:59 +01:00
senke
ec4abd945e refactor(frontend): enhance ui with design system components
- Refactor DashboardPage to use StatCard, new Button variants, and glassmorphism cards
- Update DashboardLayout to include AstralBackground for premium visual effect
- Style GlobalPlayer with glass-hud utility classes
- Fix type errors in LoginPage by using local Card shim
2026-01-18 22:36:15 +01:00
senke
eccc4e5e89 refactor(frontend): improve ui using design system
- Refactor Navbar, ChatInput, RegisterPage, and CreatePlaylistDialog to use @veza/design-system components
- Shim local UI components (Button, Input, Card) to align with Design System API and styles
- Fix hundreds of type errors by exporting missing components (SearchInput, FileUpload) and adding missing props (icon, variant)
2026-01-18 22:27:53 +01:00
senke
420b0f4e9b stabilized but still broken MVP VERSION 2026-01-18 16:28:22 +01:00
senke
575531e9a2 fix: Improve button click handling and error management
- Add explicit event prevention in onClick handler
- Add type='button' to prevent form submission
- Improve error handling in handleGenerate
- Reset loading state after successful generation
- Ensure button click events are properly handled
2026-01-18 14:49:59 +01:00
senke
3450b7998a fix: Change Button variant from 'primary' to 'default'
- Button component uses 'default' variant for primary actions, not 'primary'
- Fixes issue where Generate Key button wasn't working
- Ensures button is properly styled and clickable
2026-01-18 14:49:32 +01:00
senke
04bb1ca660 fix: Prevent modal from closing on backdrop click when showing generated key
- Disable backdrop click to close when in step 2 (showing generated key)
- Ensures user can copy the key before modal closes
- Only allow closing via Done button after key is generated
2026-01-18 14:46:55 +01:00
senke
9373fcf953 fix: Add key property to ApiKey interface
- Add optional key property to ApiKey interface to match service response
- Fixes TypeScript error in handleCreateKey function
2026-01-18 14:46:33 +01:00
senke
fcdf15dacc fix: Make API key creation and generation buttons functional
- Update CreateAPIKeyModal to properly handle async operations
- Add loading states and form validation
- Wait for API response before showing generated key
- Add proper error handling and user feedback
- Disable buttons during generation
- Return full key from service for display in modal
- Fix Input component usage (add proper label wrapper)
- Ensure form validation works (name required, at least one scope)
2026-01-18 14:46:16 +01:00
senke
b2664f4cd3 fix: Add frame-src to CSP to allow Swagger UI iframe
- Add frame-src directive to CSP_POLICY and CSP_POLICY_DEV in csp.ts
- Add frame-src to Vite dev server CSP headers
- Allows loading Swagger UI iframe from backend (localhost:8080)
- Fixes Content-Security-Policy violation blocking Swagger documentation
2026-01-18 14:03:02 +01:00
senke
d73ff4df21 fix: Utiliser iframe pour charger Swagger UI HTML directement
- Ajouter option useIframe pour charger /swagger/index.html dans un iframe
- Cela évite les problèmes avec /swagger/doc.json qui retourne 500
- Swagger UI HTML fonctionne correctement et affiche toute la documentation
- Garder le composant React comme fallback si nécessaire
2026-01-18 13:58:03 +01:00
senke
52f65cf3d8 fix: Corriger erreur de syntaxe dans SwaggerUI (backtick supplémentaire) 2026-01-18 13:56:06 +01:00
senke
93564a88cd fix: Nettoyer code inutilisé dans SwaggerUI 2026-01-18 13:55:50 +01:00
senke
5dedc2ce4e fix: Corriger URL Swagger et finaliser implémentation DeveloperPage
- Ajouter fallback pour Swagger UI si doc.json ne fonctionne pas
- Améliorer message d'erreur avec bouton pour ouvrir Swagger UI directement
- Les fonctionnalités API Keys et Usage Stats sont maintenant complètes et fonctionnelles
- Tous les onglets de DeveloperPage sont maintenant implémentés
2026-01-18 13:55:28 +01:00
senke
5832ffb0c8 feat: Implémenter fonctionnalités API Keys et Usage Stats dans DeveloperPage
- Corriger URL Swagger pour utiliser /docs/swagger.json
- Implémenter onglet API Keys avec liste, création et révocation
- Implémenter onglet Usage Stats avec métriques et graphiques
- Intégrer developerService pour charger les données
- Ajouter CreateAPIKeyModal fonctionnel
- Corriger CreateAPIKeyModal pour utiliser le nouveau système de toast
- Ajouter gestion d'erreurs et états de chargement
- Les fonctionnalités API Keys et Usage Stats sont maintenant complètes
2026-01-18 13:54:32 +01:00
senke
39749f6b52 fix: Améliorer gestion d'erreurs dans SwaggerUI
- Ajouter état d'erreur avec UI de fallback
- Ajouter boutons Retry et Open in New Tab en cas d'erreur
- Corriger types TypeScript pour supportedSubmitMethods
- Nettoyer les variables inutilisées
2026-01-18 13:51:34 +01:00
senke
2ff64b01c8 feat: Intégrer Swagger UI dans la page Developer API
- Installer swagger-ui-react et swagger-ui-dist
- Créer composant SwaggerUI avec styles personnalisés pour le thème Kodo
- Ajouter système d'onglets dans DeveloperPage (Documentation, API Keys, Usage Stats)
- Configurer Swagger UI pour charger /swagger/doc.json depuis le backend
- Ajouter support de l'authentification Bearer token dans les requêtes Swagger
- Personnaliser les styles pour correspondre au design system Kodo
- La documentation complète de l'API est maintenant accessible directement dans l'interface
2026-01-18 13:50:47 +01:00
senke
3fcb517cda fix: Corriger erreurs dans SocialPage
- Corriger utilisation de useToast (retourne directement l'objet toast)
- Normaliser l'affichage de post.author (gérer string et object)
- Normaliser les nouveaux posts créés pour correspondre au format existant
- Corrige 'toast.success is not a function' et 'Objects are not valid as a React child'
2026-01-18 13:46:30 +01:00
senke
3db5670df0 fix: Corriger CreatePostModal pour utiliser le nouveau système de toast
- Remplacer l'ancien ToastContext par le hook useToast de @/hooks/useToast
- Mettre à jour les appels addToast() en toast.info()
- Corrige l'erreur 'useToast must be used within a ToastProvider'
2026-01-18 13:37:20 +01:00
senke
426972a751 docs: Mettre à jour BUTTONS_STATUS.md avec Create Post et Create Channel
- Create Post dans SocialPage est maintenant fonctionnel
- Create Channel dans ChatSidebar est fonctionnel
- Documentation mise à jour
2026-01-18 13:35:05 +01:00
senke
237a71a183 fix: Implémenter fonctionnalité Create Post dans SocialPage
- Remplacer toast placeholder par ouverture du modal CreatePostModal
- Intégrer socialService.createPost pour créer des posts
- Ajouter gestion d'erreurs avec logger
- Le bouton Create Post ouvre maintenant le modal fonctionnel
2026-01-18 13:34:44 +01:00
senke
d66c13aaa5 fix: Corriger problèmes de superposition (layering) des composants
- Ajouter margin-left au contenu principal pour compenser la sidebar fixe
- Margin dynamique basé sur l'état ouvert/fermé de la sidebar
- Augmenter z-index du dropdown de recherche à z-[110] pour être au-dessus du header (z-100)
- Ajouter z-index au wrapper de recherche dans Header
- Le contenu principal ne se superpose plus avec la sidebar
- Le dropdown de recherche s'affiche correctement au-dessus de tous les éléments
2026-01-18 13:32:17 +01:00
senke
4dfc36fa91 fix: Améliorer z-index du champ de recherche et des icônes
- Ajouter z-index plus élevé pour le champ de recherche et ses icônes
- Assurer que les icônes ne bloquent pas les interactions
- Corriger problème d'affichage où le texte était masqué
2026-01-18 13:30:54 +01:00
senke
e52fe57230 fix: Corriger affichage de la page de recherche
- Ajouter z-index relatif pour éviter que les overlays masquent le contenu
- Assurer que les Cards et le contenu de recherche sont au-dessus des overlays
- Corriger problème d'affichage où le champ de recherche et les messages étaient masqués
2026-01-18 13:30:34 +01:00
senke
c5a3f8206d fix: Corriger extraction des données de recherche depuis réponse API imbriquée
- Gérer la structure imbriquée response.data.data.pagination et response.data.data.tracks
- Ajouter fallback pour structure plate si nécessaire
- Corriger extraction pour tracks et users search
- Les résultats de recherche s'affichent maintenant correctement
2026-01-18 13:29:02 +01:00
senke
69059ab2ca fix: Corriger erreur de recherche quand PLAYLIST_SEARCH est désactivé
- Désactiver la query de playlists si la feature n'est pas activée
- Ne pas considérer comme erreur si PLAYLIST_SEARCH est désactivé
- Retourner des résultats vides pour playlists si feature désactivée
- Corriger l'affichage d'erreur qui apparaissait même avec des résultats vides valides
2026-01-18 12:40:31 +01:00
senke
ddc244405c feat: Ajouter logs de debug pour la recherche globale
- Logs détaillés dans GlobalSearchBar pour fetchSuggestions
- Logs pour chaque étape de la recherche (tracks, playlists, users)
- Logs de performance avec durée des requêtes
- Logs dans Search component pour interactions utilisateur
- Logs pour navigation et sélection de résultats
- Utilisation de console.log avec préfixes [🔍] pour faciliter le filtrage dans DevTools
2026-01-18 12:38:53 +01:00
senke
886a39ef87 fix: Améliorer style du composant Search dans Header
- Ajouter support pour className bg-transparent dans Search
- Corriger padding pour éviter chevauchement avec icônes
2026-01-18 12:37:07 +01:00
senke
b547d3e80e fix: Corriger fonctionnalité de recherche globale
- Supprimer appel automatique de onSearch à chaque changement de query
- onSearch est maintenant appelé seulement lors de la soumission (Enter ou clic)
- Gérer feature flag PLAYLIST_SEARCH désactivé pour éviter erreurs
- Améliorer gestion des erreurs dans fetchSuggestions
- Corriger style du composant Search dans le Header
- Supprimer icône Search dupliquée dans Header
2026-01-18 12:36:44 +01:00
senke
bd29ddb40d fix: Corriger positionnement layout et ajouter handlers aux boutons
- Corriger positionnement sidebar (top-20 au lieu de top-24 pour correspondre au header)
- Ajuster padding-top du main (pt-20 au lieu de pt-24)
- Ajouter handlers onClick à tous les boutons sans fonctionnalité
- LivePage: Go Live, Browse Live Sessions
- GearPage: Add Gear, Add Your First Gear
- EducationPage: Browse Courses, View Courses
- QueuePage: Shuffle, Repeat, Browse Library
- SocialPage: Like, Comment, Share, Discover Artists
- DeveloperPage: Generate API Key, View Documentation
- Créer document BUTTONS_STATUS.md pour tracking
2026-01-18 12:34:22 +01:00
senke
57abe332a2 fix: Corriger layout, sidebar et gestion erreurs marketplace
- Ajouter padding-top au contenu principal pour compenser le header fixe
- Ajouter bouton toggle pour plier/déplier le sidebar (desktop et mobile)
- Corriger z-index pour éviter chevauchement header/sidebar
- Corriger routes du menu sidebar pour correspondre aux routes définies
- Améliorer gestion erreurs 500 marketplace (empty state au lieu d'erreur)
- Préserver httpStatus dans erreurs API pour détection correcte
2026-01-18 12:30:56 +01:00
senke
03c04f00e2 edge-cases: add performance test for many conversations (100+) 2026-01-16 15:20:54 +01:00
senke
8816d5194f edge-cases: add performance test for large track lists (1000+ tracks) 2026-01-16 15:19:24 +01:00
senke
69ae100845 edge-cases: add performance test for large playlists (100+ tracks) 2026-01-16 15:18:28 +01:00
senke
42220d9f1a implicit-tasks: fix E2E test syntax errors and verify selectors compatible with Epic 7-11 UI changes 2026-01-16 15:16:53 +01:00
senke
4ebecaeb4b implicit-tasks: update unit tests after type changes - fix Track mocks to use string IDs and creator_id 2026-01-16 15:12:37 +01:00
senke
406d2a63ec implicit-tasks: update documentation with correct store paths after migration 2026-01-16 14:57:33 +01:00
senke
b9ee533dc2 implicit-tasks: verify ESLint rules and create comprehensive README (Implicit 6.1, 8.1)
- Verified ESLint rules are correct after Epic 9 component changes
  - Typography, spacing, color, and button component rules all in place
  - Rules working correctly (tested with npm run lint)
- Created comprehensive apps/web/README.md with:
  - Quick start and setup steps
  - Type generation instructions (npm run generate:types)
  - Validation scripts documentation (validate:schemas, validate:types, validate:all)
  - All npm scripts documented
  - Project structure, design system, ESLint rules
  - Troubleshooting guide
- All setup tasks complete, README now documents all new scripts and workflows
2026-01-16 14:47:35 +01:00
senke
6df13393e5 implicit-tasks: fix broken import in backend-types.ts (Implicit 1.1)
- Fixed broken import path in apps/web/src/types/backend-types.ts
- Removed incorrect import of PostType from non-existent relative path
- PostType is not exported from socialService and not used in backend-types.ts
- Verified no other broken imports found
- All imports valid after cleanup tasks and file moves/deletions
2026-01-16 14:40:59 +01:00
senke
1c8317549e edge-cases: implement Edge 3.1 - handle concurrent state updates
- Enhanced optimistic update utilities with concurrent update handling documentation
- cancelQueries in onMutate prevents refetches from overwriting optimistic updates
- setQueryData is atomic, so optimistic updates are safe even with concurrent mutations
- Added comments explaining how React Query handles concurrent mutations
- React Query automatically queues mutations, cancelQueries provides additional safety
- For critical resources, developers can use mutateAsync and await for sequential execution
- Prevents race conditions in concurrent state updates
2026-01-16 14:38:13 +01:00
senke
2451a1e667 implicit-tasks: add type generation and validation scripts to package.json
- Added generate:types script (runs generate-types.sh)
- Added validate:schemas script (runs schema validation tests)
- Added validate:types script (runs TypeScript type checking)
- Added validate:all script (runs both type checking and schema validation)
- Improves developer workflow with easy-to-use scripts
2026-01-16 14:36:56 +01:00
senke
7e3b4f472e edge-cases: implement Edge 6.1 - handle stale data in React Query cache
- Set default staleTime: 1 minute (data considered fresh for 1 minute)
- Set default gcTime: 5 minutes (data kept in cache for 5 minutes)
- Enabled refetchOnMount: true (refetch stale data when component mounts)
- Enabled refetchOnReconnect: true (refetch stale data when network reconnects)
- Kept refetchOnWindowFocus: false (intentional - avoid unnecessary refetches)
- Individual hooks can override these defaults with their own staleTime values
- Ensures stale data is automatically refreshed appropriately
2026-01-16 14:35:42 +01:00
senke
bf96bdc711 edge-cases: mark Edge 6.2 as complete - conflict handling in optimistic updates 2026-01-16 14:33:56 +01:00
senke
3723301709 edge-cases: implement Edge 6.2 - handle data conflicts in optimistic updates
- Added isConflictError() helper to detect HTTP 409 Conflict errors
- Added getConflictMessage() helper for user-friendly conflict messages
- Enhanced createOptimisticUpdate() with conflict handling
- Enhanced createArrayOptimisticUpdate() with conflict handling
- Enhanced createToggleOptimisticUpdate() with conflict handling
- Shows user-friendly conflict messages via toast
- Supports custom onConflict handler for advanced conflict resolution
- Configurable showConflictMessage option (default: true)
- Logs conflicts for monitoring
- All optimistic update utilities now handle conflicts gracefully
2026-01-16 14:33:10 +01:00
senke
4918f6c9d6 monitoring: implement Monitor 3 - set up user analytics tracking
- Implemented analyticsService.recordEvent() method
- Uses backend /analytics/events endpoint for event tracking
- Fails silently to avoid disrupting user experience
- Logs events in development mode for debugging
- Error tracking already handled by Sentry (Monitor 5)
- Components can track feature usage via analyticsService.recordEvent()
- Complete user analytics system for tracking feature usage and interactions
2026-01-16 14:28:50 +01:00
senke
1e97e4305c monitoring: implement Monitor 7 - create monitoring dashboard
- Created MonitoringDashboard component to visualize system metrics
- Added monitoring tab to AdminDashboardPage (/admin route)
- Displays validation metrics (total, successful, failed, failure rate)
- Shows top 5 endpoints with most validation failures
- Displays Sentry error tracking status and configuration
- Shows performance monitoring information
- Auto-refreshes metrics every 30 seconds
- Manual refresh button available
- Links to Sentry dashboard when configured
- Complete monitoring solution for system health visibility
2026-01-16 14:27:05 +01:00
senke
1f04a71d2a edge-cases: implement Edge 5.1 and 5.2 - browser compatibility fallbacks
- Edge 5.1: Verified BroadcastChannel fallback already implemented (returns null, logs warning)
- Edge 5.2: Created safe storage utility for localStorage/sessionStorage
- safeLocalStorage and safeSessionStorage automatically fall back to in-memory storage
- Handles private browsing mode and quota exceeded errors gracefully
- Tests availability before use
- Logs warnings when fallback is used
- Provides utility functions to check support
- Improves reliability in all browser environments
2026-01-16 14:21:03 +01:00
senke
72cde021fc edge-cases: implement Edge 2.1 - handle partial network failures
- Created NetworkFailureTracker to track success/failure patterns
- Detects partial failures: HTTP 206, timeout after partial transfer, intermittent connectivity
- Detects complete failures: connection refused, network unreachable, all requests fail
- Enhanced error messages to distinguish partial vs complete failures
- Partial failures: show intermittent connectivity message
- Complete failures: show no connection message
- Retry logic: partial failures more retryable (if idempotent)
- Logs partial/complete failures for monitoring
- Tracks request patterns in 30-second window (last 10 requests)
- Improves user experience with clearer error messages
2026-01-16 13:08:14 +01:00
senke
5dc558bbc3 implicit: implement Implicit 9.1 - document all environment variables
- Created .env.example with all required environment variables
- Documented API, WebSocket, Stream, Upload configurations
- Documented application configuration (name, version)
- Documented debug mode and MSW settings
- Documented optional variables (FCM, Sentry)
- All variables include descriptions and default values
- Helps developers set up the project correctly
2026-01-16 13:02:51 +01:00
senke
f62feffcbe edge-cases: implement Edge 1.5 - use EmptyState component everywhere
- Replaced KodoEmptyState in DashboardPage with EmptyState
- Replaced all custom empty states in SearchPage with EmptyState:
  - No results found state
  - No tracks found state
  - No playlists found state
  - No users found state
  - Start searching state
- All empty states now use the standard EmptyState component
- Consistent UI and behavior across all empty states
2026-01-16 13:00:54 +01:00
senke
db113d3cc0 edge-cases: implement Edge 3.3 - handle tab switching during operations
- Created useTabVisibility hook to track tab visibility state
- Provides whenVisible(), whenHidden(), onVisible() utilities
- Executes callbacks when visibility changes
- Created useLongRunningOperation hook for managing long-running operations
- Operations can continue when tab is hidden (configurable)
- Provides start(), stop(), isRunning() control functions
- Supports abort controller for cancellation
- Cleanup on unmount
- All hooks are properly typed and documented with examples
2026-01-16 12:59:29 +01:00
senke
1a9caf7415 edge-cases: implement Edge 3.2 - handle rapid user interactions
- Created useDebouncedCallback hook for debouncing callbacks
- Created useThrottledCallback hook for throttling callbacks
- Created usePreventDoubleClick hook for preventing double-clicks
- All hooks are properly typed and documented with examples
- Components can use these hooks to prevent rapid interactions
- Existing ButtonLoading component already disables buttons during loading
2026-01-16 12:58:21 +01:00
senke
e2f849fd8f edge-cases: implement Edge 2.3 - handle slow network connections
- Added slow request detection with 1 second threshold
- Tracks request timing in request interceptor
- Detects and marks slow requests (> SLOW_REQUEST_THRESHOLD)
- Logs slow requests in dev mode with duration
- Provides utility functions:
  - isSlowRequest() - check if request is slow
  - getRequestDuration() - get request duration in ms
- Components can use these utilities to show additional loading feedback
- React Query already provides isLoading/isFetching for loading states
2026-01-16 12:51:14 +01:00
senke
848fbcf3f6 edge-cases: implement Edge 2.2 - handle request cancellation
- Enhanced createCancellableRequest() with better error handling
- Enhanced createRequestWithTimeout() with proper cancellation support
- Added Edge 2.2 documentation comments
- Cancelled requests are handled gracefully:
  - Don't trigger retries
  - Don't show error toasts
  - Properly rejected with cancellation errors
- AbortController signals fully supported
- Helper functions prevent aborting already-aborted signals
2026-01-16 12:49:40 +01:00
senke
743de757ea edge-cases: improve empty state handling in LibraryPage (Edge 1.1, 1.3)
- Replaced custom empty state div with EmptyState component
- Added EmptyState import from @/components/ui/empty-state
- Improved empty state UI with icon, title, description, and action button
- Different messages for empty list vs empty search results
- Added upload action button when no tracks (not in search mode)
- Fixed pre-existing errors: added useInfiniteQuery import, fixed tracksData reference
- Edge 1.4: Marked as complete (EmptyState component already exists)
- Edge 1.1 & 1.3: In progress - improved empty state handling
2026-01-16 12:44:19 +01:00
senke
bed9119122 cleanup: remove deprecated unused functions (Cleanup 17)
- Removed useLibraryItemsNormalized() - deprecated, no imports found
- Removed useLibraryFavoritesNormalized() - deprecated, no imports found
- Functions were marked @deprecated and only returned empty states
- Migration to React Query completed, these functions no longer needed
- Cleanup 17: In progress - removed deprecated dead code
2026-01-16 12:41:37 +01:00
senke
a9e7805cae cleanup: remove obsolete TODO and update Cleanup 14 status
- Removed obsolete TODO in useChat.ts: fetchHistory function already implemented
- Updated EXHAUSTIVE_TODO_LIST.md: Cleanup 14 marked as COMPLETE
- Summary: Fixed 1 TODO, improved 1 TODO, removed 1 obsolete TODO
- Preserved backend-dependent and architectural TODOs per audit recommendations
2026-01-16 12:31:57 +01:00
senke
c172c3b865 cleanup: address simple TODO comments (Cleanup 14)
- Fixed ChatRoom.tsx: Implemented current user ID check for isMe
  - Added useUser hook to get current user
  - Replaced hardcoded isMe=false with proper user ID comparison
- Improved TwoFactorVerify.tsx: Enhanced TODO comment with specific action items
  - Clarified that verify() is for setup, not login
  - Added FIXME with clear explanation of the issue
  - Documented that parent should handle verification
- Cleanup 14: In progress - addressing simple, safe TODOs
2026-01-16 12:31:40 +01:00
senke
905bd423c3 cleanup: remove obsolete test file (Cleanup 3)
- Removed stores/auth.test.ts - references deleted stores/auth.ts
- File imports from './auth' which doesn't exist (verified in Cleanup 4)
- Auth store is now at features/auth/store/authStore.ts
- Cleanup 3: In progress - removed obsolete auth test file
2026-01-16 12:26:52 +01:00
senke
51ca1e36d7 fix: add missing logger import in toast.ts
- Added logger import that was missing from Cleanup 12
- Fixes 'logger is not defined' error
- Cleanup 16: Verifying no unused variables in production code
2026-01-16 12:21:33 +01:00
senke
f2c630644e cleanup: remove unused imports (Cleanup 15 - batch 1)
- ESLint --fix automatically removed unused imports:
  - services/api/client.ts: Removed unused import
  - utils/formValidation.ts: Removed unused import
  - e2e/global-setup.ts: Fixed unused imports
- Cleanup 15: In progress - automated fixes applied
2026-01-16 12:19:06 +01:00
senke
71323bdd46 cleanup: audit TODO comments (Cleanup 13)
- Created TODO_COMMENTS_AUDIT.md documenting findings
- Found 26 TODO/FIXME/XXX/HACK comments total (excluding generated files)
- Categorized: Backend dependencies (preserve), Implementation needed (action), Bugs (fix), Refactor/migration (improve)
- High priority: Fix TwoFactorVerify.tsx authentication bug
- Medium priority: Implement play functionality, fix test issues
- Low priority: Backend-dependent features, architectural improvements
- Cleanup 13: Audit complete - Ready for Cleanup 14
2026-01-16 12:17:10 +01:00
senke
c89771895d cleanup: add missing logger import in OfflineQueueManager
- Added logger import to OfflineQueueManager.tsx
- Fixes missing import after console.error replacement
- Cleanup 10-12: Complete
2026-01-16 12:15:53 +01:00
senke
6a0bd12936 cleanup: audit and replace console statements with logger (Cleanup 10-12)
- Created CONSOLE_STATEMENTS_AUDIT.md documenting findings
- Found 33 console statements total (excluding generated files)
- Replaced production console.error with logger.error:
  - main.tsx: Initialization error logging
  - config/env.ts: Environment validation error logging
  - OfflineQueueManager.tsx: Queue operation error logging (2 instances)
  - toast.ts: Toast module loading error logging
- Preserved: Logger implementation, test mocks, JSDoc examples, dev-only utilities
- Cleanup 10: Audit complete
- Cleanup 11-12: Replace console.log/error/warn - COMPLETE (production code only)
2026-01-16 12:15:20 +01:00
senke
229327973e cleanup: remove remaining commented code in ImageCropper
- Removed commented alternative import statement
- Cleanup 9: Complete (8 files cleaned)
2026-01-16 12:14:00 +01:00
senke
aa0c462a79 cleanup: remove obsolete commented-out code (Cleanup 9)
- AuthView: Removed commented imports and JSX for non-existent EmailVerification/ResetPasswordForm components (functionality handled by separate pages)
- SettingsView: Removed commented useTheme hook
- CheckoutView: Removed commented total calculation
- LazyComponent: Removed commented ErrorBoundary import
- ImageCropper: Removed commented alternative import (already using correct import)
- EditPlaylistModal: Removed commented isCollaborative state
- ExploreView: Removed commented GENRES array
- Preserved: Documentation comments, explanatory comments, TODO comments
- Cleanup 9: Complete (7 files cleaned)
2026-01-16 12:13:39 +01:00
senke
481d4ceae7 cleanup: audit commented-out code (Cleanup 8)
- Created COMMENTED_CODE_AUDIT.md documenting findings
- Found ~4,329 commented lines total (mostly documentation)
- Actual commented-out code blocks are minimal
- Excluded generated files and documentation comments
- Ready for manual review in Cleanup 9
- Cleanup 8: Complete
2026-01-16 12:12:38 +01:00
senke
74f6952ba2 cleanup: remove obsolete backup UI components directory (Cleanup 2)
- Removed apps/web/src/components/ui.backup/ directory
- Verified no imports or references to ui.backup in codebase
- Directory contained 50+ backup component files no longer needed
- Cleanup 1: LibraryPage.tsx.old already removed (verified)
- Cleanup 2: Complete
2026-01-16 12:11:37 +01:00
senke
2d7ffe3b49 aesthetic-improvements: fix remaining decorative transforms batch 5 (Action 11.5.1.6)
- Library: PlaylistsView (removed decorative translate transform)
- Views: GearView (removed decorative translate transform)
- PWA: PWAInstallBanner (removed decorative translate transform)
- Replaced decorative transforms with subtle opacity changes or removed entirely
- Preserved: Functional overlay gradients for text readability (all remaining gradients are functional)
- Action 11.5.1.6: Apply direction to all components - Batch 5 complete (3 components)
2026-01-16 12:08:36 +01:00
senke
647ebae2fa aesthetic-improvements: fix remaining decorative effects in components batch 4 (Action 11.5.1.6)
- Studio: ProjectsManager (removed decorative translate transform)
- Inventory: AddEquipmentView (removed decorative scale transform)
- Layout: Header (removed decorative shadow), Navbar (removed decorative gradients, 2 instances)
- Library: PlaylistDetailView (replaced decorative gradient with solid color, fixed padding p-6 → p-8)
- Layout: AudioPlayer (replaced subtle decorative gradient with solid color)
- Replaced decorative transforms with subtle opacity changes or removed entirely
- Replaced decorative gradients with solid colors
- Action 11.5.1.6: Apply direction to all components - Batch 4 complete (6 components)
2026-01-16 12:08:21 +01:00
senke
5fe4c57e9d aesthetic-improvements: fix decorative gradient in ThemeSwitcher (Action 11.5.1.6)
- ThemeSwitcher: Replaced decorative gradient with solid color (bg-gradient-to-br from-kodo-cyan to-kodo-magenta → bg-kodo-cyan)
- Preserved: Functional overlay gradients for text readability (LiveStreamDetailView, ExploreView, ImageViewerModal, PWAInstallBanner)
- Action 11.5.1.6: Apply direction to all components - Batch 3 complete (gradient fix)
2026-01-16 12:07:15 +01:00
senke
4b047d160a aesthetic-improvements: fix spacing in components batch 2 (Action 11.5.1.6)
- Modals: CreatorModal (p-6 → p-8, space-y-6 → space-y-8)
- Seller: CreateProductView (space-y-6 → space-y-8, 2 instances)
- Social: ExploreView, GroupCard (space-y-6 → space-y-8, p-6 → p-8)
- Studio: ProjectsManager, CloudFileBrowser (space-y-6 → space-y-8, gap-6 → gap-8)
- Theme: ThemeSwitcher (space-y-6 → space-y-8, p-6 → p-8)
- Settings: AppearanceSettingsView (p-6 → p-8, space-y-6 → space-y-8)
- Library: PlaylistsView (space-y-6 → space-y-8)
- Upload: TagSuggestionsModal, LyricsEditorModal, BulkUploadModal (p-6 → p-8, space-y-6 → space-y-8)
- UI: modal, dialog, ImageCropper (p-6 → p-8)
- All spacing now aligned to 8px grid (32px standard padding)
- Action 11.5.1.6: Apply direction to all components - Batch 2 complete (spacing fixes)
2026-01-16 12:06:56 +01:00
senke
51c38a95db 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
6dde4dd4b4 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