senke
e243e2c41e
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
43d0d7e129
refactor(web): split ChatView into chat-view module
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 03:59:32 +01:00
senke
bdda26ad08
refactor(web): split AuthView into auth-view module
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 03:53:59 +01:00
senke
c92c8d02a4
refactor(web): split AdminView into admin-view module
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 22:31:24 +01:00
senke
bb370397d2
refactor(web): split NotificationsView into notifications-view module
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 22:22:47 +01:00
senke
6833df9dc5
refactor(web): split EducationView into education-view module
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 22:11:13 +01:00
senke
b736de5dc7
refactor(web): split SettingsView into settings-view module
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 21:59:42 +01:00
senke
753191d88b
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
d7c462c8cc
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
0504810f29
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
c2c98ff535
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
6bdb66743e
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
937ec45660
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
e172d67292
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
fb3e5ceb5b
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
4ef6ed9c3b
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
98f90c9863
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
a164ffa214
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
162a3bf0a7
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
9c58ff7818
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
9d85485f30
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
6aad6d7d03
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
c8110d2ca2
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
c17c975b59
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
1744fac6aa
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
98f01e60fe
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
1b4caba44b
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
3811df2961
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
31b3c2e712
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
85c88c5143
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
eead265786
refactor(ui): tooltip module, useTooltip, re-export, tests
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 10:32:14 +01:00
senke
cb58101137
refactor(ui): tabs module, re-export
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 10:12:33 +01:00
senke
80cc76212a
refactor(ui): accordion module, re-export
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 02:33:10 +01:00
senke
9f78576389
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
7b5796a3b6
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
38894d8a1d
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
f724b63e38
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
e2f30ee28a
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
bdcbf277e8
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
946b6721b3
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
41ba59a75f
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
1ea128b60d
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
3886061ec9
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
6fb8745efa
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
648cda6bf3
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
cf9bc76a03
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
b3b206dd2b
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
40f43a9640
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
5f5275f6bb
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
157bda45e2
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
d1ad2639e4
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
01bca2fe08
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
3232e77bcf
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
423b9adb8e
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
58cd96fe2e
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
ab67b3b256
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
185fe03269
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
9aa1549bc7
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
3a991d85b6
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
c5ffa235a2
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
ea7faeb703
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
a056db91fe
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
a13555f58d
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
048393d266
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
48ddd42182
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
44eb0e142f
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
db39d87955
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
15d31cf793
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
c4111ac059
refactor(ui): extract AvatarUpload into avatar-upload module
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:21:02 +01:00
senke
38eab5c205
refactor(ui): extract DatePicker into date-picker module
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:15:11 +01:00
senke
c30049e215
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
a74d51918c
refactor(streaming): extract PlaybackDashboard into playback-dashboard module
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:04:38 +01:00
senke
aec92086dd
refactor(monitoring): extract MonitoringDashboard into monitoring-dashboard module
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:57:39 +01:00
senke
f622fad9fc
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
bc7eabdbbe
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
6f0677fc88
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
796745f57f
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
85abc9900f
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
9dde2eec55
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
b20c9f4c6f
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
bf50ee4588
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
53a97148e3
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
0eda9232df
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
f00c621bb4
test(upload): add UploadModal stories (Default, Open)
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 21:03:15 +01:00
senke
eadc2b7c65
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
1f2e59af8d
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
df6c9c3d2b
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
cc6b77aff4
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
260a787da6
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
d1044b22d4
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
5485415113
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
6f367717a3
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
8a8d2657f7
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
d8ae1d8761
test(chat): add stories and mocks for ChatSidebar
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:07:20 +01:00
senke
d88028a1d4
refactor(chat): decompose ChatSidebar into sub-components
...
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 20:07:09 +01:00
senke
b8f181c801
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
6677455721
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
7255846083
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
9ebaf9acb1
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
f4b6ede605
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