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 |
|