2026-01-07 09:31:02 +00:00
|
|
|
import React, { useState } from 'react';
|
|
|
|
|
import { Button } from '../ui/button';
|
|
|
|
|
import { LiveStream } from '../../types';
|
2026-01-13 18:47:57 +00:00
|
|
|
import {
|
|
|
|
|
Users,
|
|
|
|
|
Heart,
|
|
|
|
|
Share2,
|
|
|
|
|
DollarSign,
|
|
|
|
|
Send,
|
|
|
|
|
Radio,
|
|
|
|
|
Settings,
|
|
|
|
|
ArrowLeft,
|
2026-01-07 09:31:02 +00:00
|
|
|
} from 'lucide-react';
|
2026-01-26 13:12:17 +00:00
|
|
|
import { useToast } from '../../components/feedback/ToastProvider';
|
2026-01-07 09:31:02 +00:00
|
|
|
import { TipStreamerModal } from './modals/TipStreamerModal';
|
|
|
|
|
|
|
|
|
|
interface LiveStreamDetailViewProps {
|
2026-01-13 18:47:57 +00:00
|
|
|
streamId: string;
|
|
|
|
|
onBack: () => void;
|
2026-01-07 09:31:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Mock Stream Data
|
|
|
|
|
const MOCK_STREAM: LiveStream = {
|
2026-01-13 18:47:57 +00:00
|
|
|
id: 's1',
|
|
|
|
|
title: 'Late Night DnB Production 🎧 | Feedback Session',
|
|
|
|
|
streamer: 'Neuro_Glitch',
|
|
|
|
|
viewers: 1240,
|
|
|
|
|
thumbnailUrl: 'https://picsum.photos/id/140/1200/800',
|
|
|
|
|
tags: ['Production', 'Ableton', 'DnB'],
|
|
|
|
|
isLive: true,
|
|
|
|
|
category: 'Production',
|
2026-01-07 09:31:02 +00:00
|
|
|
};
|
|
|
|
|
|
2026-01-13 18:47:57 +00:00
|
|
|
export const LiveStreamDetailView: React.FC<LiveStreamDetailViewProps> = ({
|
|
|
|
|
streamId: _streamId,
|
|
|
|
|
onBack,
|
|
|
|
|
}) => {
|
2026-01-07 09:31:02 +00:00
|
|
|
const { addToast } = useToast();
|
|
|
|
|
const [chatInput, setChatInput] = useState('');
|
|
|
|
|
const [showTipModal, setShowTipModal] = useState(false);
|
|
|
|
|
const [messages, setMessages] = useState([
|
2026-01-13 18:47:57 +00:00
|
|
|
{
|
|
|
|
|
id: 1,
|
|
|
|
|
user: 'BassHead99',
|
|
|
|
|
text: 'That Reese bass is filthy! 🤮🔥',
|
|
|
|
|
color: 'text-kodo-cyan',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: 2,
|
|
|
|
|
user: 'Studio_Rat',
|
|
|
|
|
text: 'What VST is that?',
|
ui(tokens): migrate text-kodo-content-dim to text-muted-foreground (35 files, 160 instances)
Replace legacy hardcoded `text-kodo-content-dim` (Gray-400, theme-unaware)
with semantic `text-muted-foreground` across 35 user-facing components.
This ensures all secondary/muted text adapts correctly to light/dark theme
changes instead of staying fixed at a single gray value.
Covers: SearchBar, PlaylistsView, NotificationBell, TrackAnalyticsView,
LiveStreamDetailView, LicenceCard, FilePreviewCard, PasswordStrengthIndicator,
NotificationItem, TrackList, CourseCard, GroupCard, AchievementCard, XPBar,
EquipmentCard, SellerDashboardView, APIPlaygroundView, DeveloperDashboardView,
CreatorModal, AddToPlaylistModal, LicenceDetailsModal, QuizModal,
CertificateModal, FlashSaleModal, CreateAPIKeyModal, LyricsEditorModal,
WatermarkSettingsModal, ProfileXPView, LeaderboardView, PostCard,
ExploreView, FeedView, MessageSearch, TypingIndicator, PlaylistTrackItem.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 23:03:33 +00:00
|
|
|
color: 'text-muted-foreground',
|
2026-01-13 18:47:57 +00:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: 3,
|
|
|
|
|
user: 'Neuro_Glitch',
|
|
|
|
|
text: "It's Phase Plant, just initializing now.",
|
|
|
|
|
color: 'text-kodo-gold font-bold',
|
|
|
|
|
},
|
2026-01-07 09:31:02 +00:00
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const handleSendChat = () => {
|
2026-01-13 18:47:57 +00:00
|
|
|
if (!chatInput.trim()) return;
|
|
|
|
|
setMessages([
|
|
|
|
|
...messages,
|
|
|
|
|
{ id: Date.now(), user: 'You', text: chatInput, color: 'text-white' },
|
|
|
|
|
]);
|
|
|
|
|
setChatInput('');
|
2026-01-07 09:31:02 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handleTip = (amount: number, message: string) => {
|
2026-01-13 18:47:57 +00:00
|
|
|
addToast(`Sent $${amount} to ${MOCK_STREAM.streamer}`, 'success');
|
|
|
|
|
setMessages([
|
|
|
|
|
...messages,
|
|
|
|
|
{
|
|
|
|
|
id: Date.now(),
|
|
|
|
|
user: 'System',
|
|
|
|
|
text: `You tipped $${amount}: ${message}`,
|
2026-02-08 23:14:40 +00:00
|
|
|
color: 'text-success font-bold italic',
|
2026-01-13 18:47:57 +00:00
|
|
|
},
|
|
|
|
|
]);
|
2026-01-07 09:31:02 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
aesthetic-improvements: align spacing to 8px grid (Action 11.2.1.3)
- Created automated script (scripts/align-8px-grid.py) to align all spacing to 8px grid
- Replaced non-8px-aligned spacing: gap-3/p-3/m-3 (12px) → gap-4/p-4/m-4 (16px), gap-5/p-5/m-5 (20px) → gap-6/p-6/m-6 (24px), gap-10/p-10/m-10 (40px) → gap-12/p-12/m-12 (48px), gap-20/p-20/m-20 (80px) → gap-24/p-24/m-24 (96px)
- Preserved: 4px values (gap-1, p-1, m-1) as they may be intentional fine-tuning, responsive breakpoints (sm:, md:, lg:), test files, documentation
- Modified files across all components to ensure consistent 8px grid alignment
- Action 11.2.1.3: Align all elements to 8px grid - COMPLETE
2026-01-16 10:50:46 +00:00
|
|
|
<div className="flex flex-col h-[calc(100vh-6rem)] -m-6 md:-m-12 bg-black animate-fadeIn overflow-hidden">
|
2026-01-13 18:47:57 +00:00
|
|
|
{/* Header Overlay (Fade in/out logic usually here) */}
|
|
|
|
|
<div className="absolute top-0 left-0 right-0 p-4 z-20 flex justify-between items-start pointer-events-none">
|
|
|
|
|
<Button
|
|
|
|
|
variant="ghost"
|
|
|
|
|
size="sm"
|
|
|
|
|
className="bg-black/50 backdrop-blur pointer-events-auto text-white hover:bg-black/70"
|
|
|
|
|
onClick={onBack}
|
|
|
|
|
>
|
|
|
|
|
<ArrowLeft className="w-4 h-4 mr-2" /> Back
|
|
|
|
|
</Button>
|
|
|
|
|
</div>
|
2026-01-07 09:31:02 +00:00
|
|
|
|
2026-01-13 18:47:57 +00:00
|
|
|
<div className="flex flex-1 overflow-hidden">
|
|
|
|
|
{/* Video Player Area */}
|
|
|
|
|
<div className="flex-1 bg-black relative flex items-center justify-center">
|
|
|
|
|
{/* Simulated Video */}
|
|
|
|
|
<div className="absolute inset-0">
|
|
|
|
|
<img
|
|
|
|
|
src={MOCK_STREAM.thumbnailUrl}
|
|
|
|
|
className="w-full h-full object-cover opacity-80"
|
|
|
|
|
/>
|
|
|
|
|
<div className="absolute inset-0 bg-gradient-to-t from-black via-transparent to-black/30"></div>
|
|
|
|
|
</div>
|
2026-01-07 09:31:02 +00:00
|
|
|
|
2026-01-13 18:47:57 +00:00
|
|
|
{/* Stream Info Overlay */}
|
|
|
|
|
<div className="absolute bottom-0 left-0 right-0 p-6 bg-gradient-to-t from-black to-transparent pt-24">
|
|
|
|
|
<div className="flex items-end justify-between">
|
|
|
|
|
<div className="flex items-center gap-4">
|
2026-02-08 23:17:14 +00:00
|
|
|
<div className="w-14 h-14 rounded-full border-2 border-destructive p-0.5">
|
2026-01-13 18:47:57 +00:00
|
|
|
<img
|
|
|
|
|
src="https://picsum.photos/id/100/100"
|
|
|
|
|
className="w-full h-full rounded-full object-cover"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<div>
|
2026-01-15 22:54:05 +00:00
|
|
|
<h1 className="text-3xl font-bold text-white mb-1">
|
2026-01-13 18:47:57 +00:00
|
|
|
{MOCK_STREAM.title}
|
|
|
|
|
</h1>
|
aesthetic-improvements: align spacing to 8px grid (Action 11.2.1.3)
- Created automated script (scripts/align-8px-grid.py) to align all spacing to 8px grid
- Replaced non-8px-aligned spacing: gap-3/p-3/m-3 (12px) → gap-4/p-4/m-4 (16px), gap-5/p-5/m-5 (20px) → gap-6/p-6/m-6 (24px), gap-10/p-10/m-10 (40px) → gap-12/p-12/m-12 (48px), gap-20/p-20/m-20 (80px) → gap-24/p-24/m-24 (96px)
- Preserved: 4px values (gap-1, p-1, m-1) as they may be intentional fine-tuning, responsive breakpoints (sm:, md:, lg:), test files, documentation
- Modified files across all components to ensure consistent 8px grid alignment
- Action 11.2.1.3: Align all elements to 8px grid - COMPLETE
2026-01-16 10:50:46 +00:00
|
|
|
<div className="flex items-center gap-4 text-sm">
|
aesthetic-improvements: reduce decorative cyan across multiple component categories (80/20 rule, batch 11)
- Social: FeedView, ConnectionsView, GroupsView, ExploreView, GroupDetailView loading spinners and decorative text, CreatePostModal decorative select text and hashtag links, PostCard decorative tag links and waveform bars and view comments link, CreateGroupModal decorative icon (9 instances)
- Settings: DataExportModal decorative icon, LoginHistory decorative IP text, AppearanceSettingsView decorative icon and selected theme checkmark, BackupsView decorative icon, CloudIntegrationView decorative icon, AccessibilitySettingsView decorative icon, SecuritySettings decorative icon, PasskeyModal decorative icon and loading spinner (8 instances)
- Studio: ProjectsManager loading spinner and progress percentage text, CloudFileBrowser decorative music icons, AIToolsView decorative music icon, ConnectivityView decorative icon, CreateProjectModal decorative icon, CloudSettingsView decorative icon (6 instances)
- Admin: AdminDashboardView loading spinner and decorative chart bars and icon, AdminSettingsView decorative icon, AdminModerationView loading spinner, AdminUsersView loading spinner (5 instances)
- Inventory: InventoryView loading spinner, EquipmentCard decorative price icon, EquipmentDetailView loading spinner and decorative icons and price text, AddEquipmentView decorative icon (5 instances)
- Seller: CreateProductView decorative icon, SellerDashboardView loading spinner and decorative icon and sales text (3 instances)
- Live: LiveStreamDetailView decorative streamer name text (1 instance)
- Developer: DeveloperDashboardView loading spinner, WebhooksView decorative icon (2 instances)
- Upload: BulkUploadModal decorative icon, FilePreviewCard decorative audio file icon, MetadataForm decorative button text, CoverArtUploadModal decorative icon, LyricsEditorModal decorative icon (5 instances)
- Notifications: NotificationItem decorative follow icon and mark as read button, NotificationBell decorative mark all read link (3 instances)
- Total: ~46 files, ~46 instances replaced
- Preserved: Active/selected states (CloudFileBrowser selected files checkmarks, CreatePostModal post type active state, GroupCard/GroupDetailView public/private badges - semantic indicators, DataExportModal checkbox accents - focus/interaction, AppearanceSettingsView selected theme - active state, PasskeyModal checkbox accent - focus/interaction, LyricsEditorModal checkbox accent - focus/interaction, FileUploadZone drag active state - active state, EquipmentDetailView support link - functional link, FlashSaleModal link - functional link, EquipmentDetailView image indicator dots - active state), primary actions, design system variants
- Action 11.3.1.3 in progress (eleventh batch: social, settings, studio, admin, inventory, seller, live, developer, upload, notifications components)
2026-01-16 10:26:33 +00:00
|
|
|
<span className="text-kodo-steel font-bold">
|
2026-01-13 18:47:57 +00:00
|
|
|
{MOCK_STREAM.streamer}
|
|
|
|
|
</span>
|
2026-02-08 23:14:40 +00:00
|
|
|
<span className="flex items-center gap-1 text-destructive font-bold animate-pulse">
|
2026-01-13 18:47:57 +00:00
|
|
|
<Radio className="w-3 h-3" /> LIVE
|
|
|
|
|
</span>
|
|
|
|
|
<span className="flex items-center gap-1 text-white">
|
|
|
|
|
<Users className="w-3 h-3" />{' '}
|
|
|
|
|
{MOCK_STREAM.viewers.toLocaleString()}
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
2026-01-07 09:31:02 +00:00
|
|
|
</div>
|
2026-01-13 18:47:57 +00:00
|
|
|
</div>
|
aesthetic-improvements: align spacing to 8px grid (Action 11.2.1.3)
- Created automated script (scripts/align-8px-grid.py) to align all spacing to 8px grid
- Replaced non-8px-aligned spacing: gap-3/p-3/m-3 (12px) → gap-4/p-4/m-4 (16px), gap-5/p-5/m-5 (20px) → gap-6/p-6/m-6 (24px), gap-10/p-10/m-10 (40px) → gap-12/p-12/m-12 (48px), gap-20/p-20/m-20 (80px) → gap-24/p-24/m-24 (96px)
- Preserved: 4px values (gap-1, p-1, m-1) as they may be intentional fine-tuning, responsive breakpoints (sm:, md:, lg:), test files, documentation
- Modified files across all components to ensure consistent 8px grid alignment
- Action 11.2.1.3: Align all elements to 8px grid - COMPLETE
2026-01-16 10:50:46 +00:00
|
|
|
<div className="flex gap-4">
|
2026-01-13 18:47:57 +00:00
|
|
|
<Button
|
|
|
|
|
variant="secondary"
|
|
|
|
|
className="bg-black/50 backdrop-blur border-white/20 text-white"
|
|
|
|
|
icon={<Heart className="w-4 h-4" />}
|
|
|
|
|
>
|
|
|
|
|
Follow
|
|
|
|
|
</Button>
|
|
|
|
|
<Button
|
|
|
|
|
variant="primary"
|
2026-01-16 11:06:00 +00:00
|
|
|
className=""
|
2026-01-13 18:47:57 +00:00
|
|
|
icon={<DollarSign className="w-4 h-4" />}
|
|
|
|
|
onClick={() => setShowTipModal(true)}
|
|
|
|
|
>
|
|
|
|
|
Tip
|
|
|
|
|
</Button>
|
|
|
|
|
<Button
|
|
|
|
|
variant="ghost"
|
|
|
|
|
size="icon"
|
|
|
|
|
className="bg-black/50 backdrop-blur text-white"
|
|
|
|
|
>
|
|
|
|
|
<Share2 className="w-4 h-4" />
|
|
|
|
|
</Button>
|
|
|
|
|
</div>
|
2026-01-07 09:31:02 +00:00
|
|
|
</div>
|
2026-01-13 18:47:57 +00:00
|
|
|
</div>
|
|
|
|
|
</div>
|
2026-01-07 09:31:02 +00:00
|
|
|
|
2026-01-13 18:47:57 +00:00
|
|
|
{/* Chat Sidebar */}
|
ui(tokens): migrate border-kodo-steel to border-border (86 files, 269 instances)
Replace legacy hardcoded border-kodo-steel (RGB 59,69,84, theme-unaware)
with semantic border-border token across 86 user-facing components.
Covers UI primitives (checkbox, badge, modal, table, textarea, alert,
radio-group, avatar), all modals, settings views, social features,
playlist views, inventory, chat, commerce, and cloud file browser.
Only story/test files retain the legacy token.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 23:07:00 +00:00
|
|
|
<div className="w-80 md:w-96 bg-kodo-graphite border-l border-border flex flex-col z-20 shadow-2xl">
|
|
|
|
|
<div className="p-4 border-b border-border bg-kodo-ink flex justify-between items-center">
|
2026-01-13 18:47:57 +00:00
|
|
|
<h3 className="font-bold text-white text-sm">LIVE CHAT</h3>
|
ui(tokens): migrate text-kodo-content-dim to text-muted-foreground (35 files, 160 instances)
Replace legacy hardcoded `text-kodo-content-dim` (Gray-400, theme-unaware)
with semantic `text-muted-foreground` across 35 user-facing components.
This ensures all secondary/muted text adapts correctly to light/dark theme
changes instead of staying fixed at a single gray value.
Covers: SearchBar, PlaylistsView, NotificationBell, TrackAnalyticsView,
LiveStreamDetailView, LicenceCard, FilePreviewCard, PasswordStrengthIndicator,
NotificationItem, TrackList, CourseCard, GroupCard, AchievementCard, XPBar,
EquipmentCard, SellerDashboardView, APIPlaygroundView, DeveloperDashboardView,
CreatorModal, AddToPlaylistModal, LicenceDetailsModal, QuizModal,
CertificateModal, FlashSaleModal, CreateAPIKeyModal, LyricsEditorModal,
WatermarkSettingsModal, ProfileXPView, LeaderboardView, PostCard,
ExploreView, FeedView, MessageSearch, TypingIndicator, PlaylistTrackItem.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 23:03:33 +00:00
|
|
|
<Settings className="w-4 h-4 text-muted-foreground cursor-pointer hover:text-white" />
|
2026-01-13 18:47:57 +00:00
|
|
|
</div>
|
2026-01-07 09:31:02 +00:00
|
|
|
|
2026-01-13 18:47:57 +00:00
|
|
|
<div className="flex-1 overflow-y-auto p-4 space-y-2 font-mono text-sm custom-scrollbar">
|
|
|
|
|
{messages.map((msg) => (
|
|
|
|
|
<div key={msg.id} className="break-words animate-slideInRight">
|
|
|
|
|
<span
|
|
|
|
|
className={`font-bold ${msg.color} mr-2 cursor-pointer hover:underline opacity-90`}
|
|
|
|
|
>
|
|
|
|
|
{msg.user}:
|
|
|
|
|
</span>
|
2026-01-16 00:59:31 +00:00
|
|
|
<span className="text-kodo-text-main">{msg.text}</span>
|
2026-01-13 18:47:57 +00:00
|
|
|
</div>
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
2026-01-07 09:31:02 +00:00
|
|
|
|
ui(tokens): migrate border-kodo-steel to border-border (86 files, 269 instances)
Replace legacy hardcoded border-kodo-steel (RGB 59,69,84, theme-unaware)
with semantic border-border token across 86 user-facing components.
Covers UI primitives (checkbox, badge, modal, table, textarea, alert,
radio-group, avatar), all modals, settings views, social features,
playlist views, inventory, chat, commerce, and cloud file browser.
Only story/test files retain the legacy token.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 23:07:00 +00:00
|
|
|
<div className="p-4 border-t border-border bg-kodo-ink">
|
2026-01-13 18:47:57 +00:00
|
|
|
<div className="relative">
|
|
|
|
|
<input
|
ui(tokens): migrate border-kodo-steel to border-border (86 files, 269 instances)
Replace legacy hardcoded border-kodo-steel (RGB 59,69,84, theme-unaware)
with semantic border-border token across 86 user-facing components.
Covers UI primitives (checkbox, badge, modal, table, textarea, alert,
radio-group, avatar), all modals, settings views, social features,
playlist views, inventory, chat, commerce, and cloud file browser.
Only story/test files retain the legacy token.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 23:07:00 +00:00
|
|
|
className="w-full bg-kodo-void border border-border rounded-full py-2.5 pl-4 pr-10 text-white text-sm focus:border-border outline-none"
|
2026-01-13 18:47:57 +00:00
|
|
|
placeholder="Send a message..."
|
|
|
|
|
value={chatInput}
|
|
|
|
|
onChange={(e) => setChatInput(e.target.value)}
|
|
|
|
|
onKeyDown={(e) => e.key === 'Enter' && handleSendChat()}
|
|
|
|
|
/>
|
consistency: replace custom buttons with Button component (partial)
- Replaced custom button implementations with Button component in 14 files
- Files updated: LiveStreamDetailView, DashboardPage, CommentItem, PostCard, SocialPage, SocialView, AdminUsersView, UserTableRow, ProjectsManager, CloudFileBrowser, FileManagerView, CreatorModal, ImageCropper, BulkUploadModal
- ~31 buttons replaced across high-priority files
- Used appropriate Button variants: ghost, outline, default, secondary, link
- Preserved visual appearance with className overrides where needed
- Action 9.2.1.2 in progress (partial completion)
2026-01-16 01:06:14 +00:00
|
|
|
<Button
|
|
|
|
|
variant="default"
|
|
|
|
|
size="icon"
|
|
|
|
|
className="absolute right-1.5 top-1.5 rounded-full hover:bg-white"
|
2026-01-13 18:47:57 +00:00
|
|
|
onClick={handleSendChat}
|
|
|
|
|
>
|
|
|
|
|
<Send className="w-3 h-3 fill-current" />
|
consistency: replace custom buttons with Button component (partial)
- Replaced custom button implementations with Button component in 14 files
- Files updated: LiveStreamDetailView, DashboardPage, CommentItem, PostCard, SocialPage, SocialView, AdminUsersView, UserTableRow, ProjectsManager, CloudFileBrowser, FileManagerView, CreatorModal, ImageCropper, BulkUploadModal
- ~31 buttons replaced across high-priority files
- Used appropriate Button variants: ghost, outline, default, secondary, link
- Preserved visual appearance with className overrides where needed
- Action 9.2.1.2 in progress (partial completion)
2026-01-16 01:06:14 +00:00
|
|
|
</Button>
|
2026-01-07 09:31:02 +00:00
|
|
|
</div>
|
2026-01-13 18:47:57 +00:00
|
|
|
<div className="flex justify-between items-center mt-2 px-2">
|
ui(tokens): migrate text-kodo-content-dim to text-muted-foreground (35 files, 160 instances)
Replace legacy hardcoded `text-kodo-content-dim` (Gray-400, theme-unaware)
with semantic `text-muted-foreground` across 35 user-facing components.
This ensures all secondary/muted text adapts correctly to light/dark theme
changes instead of staying fixed at a single gray value.
Covers: SearchBar, PlaylistsView, NotificationBell, TrackAnalyticsView,
LiveStreamDetailView, LicenceCard, FilePreviewCard, PasswordStrengthIndicator,
NotificationItem, TrackList, CourseCard, GroupCard, AchievementCard, XPBar,
EquipmentCard, SellerDashboardView, APIPlaygroundView, DeveloperDashboardView,
CreatorModal, AddToPlaylistModal, LicenceDetailsModal, QuizModal,
CertificateModal, FlashSaleModal, CreateAPIKeyModal, LyricsEditorModal,
WatermarkSettingsModal, ProfileXPView, LeaderboardView, PostCard,
ExploreView, FeedView, MessageSearch, TypingIndicator, PlaylistTrackItem.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 23:03:33 +00:00
|
|
|
<span className="text-xs text-muted-foreground">Slow Mode: Off</span>
|
2026-01-13 18:47:57 +00:00
|
|
|
<div className="flex gap-2">
|
consistency: replace custom buttons with Button component (partial)
- Replaced custom button implementations with Button component in 14 files
- Files updated: LiveStreamDetailView, DashboardPage, CommentItem, PostCard, SocialPage, SocialView, AdminUsersView, UserTableRow, ProjectsManager, CloudFileBrowser, FileManagerView, CreatorModal, ImageCropper, BulkUploadModal
- ~31 buttons replaced across high-priority files
- Used appropriate Button variants: ghost, outline, default, secondary, link
- Preserved visual appearance with className overrides where needed
- Action 9.2.1.2 in progress (partial completion)
2026-01-16 01:06:14 +00:00
|
|
|
<Button
|
|
|
|
|
variant="ghost"
|
|
|
|
|
size="icon"
|
2026-01-13 18:47:57 +00:00
|
|
|
className="text-kodo-gold hover:text-white"
|
|
|
|
|
title="Send Tip"
|
|
|
|
|
onClick={() => setShowTipModal(true)}
|
|
|
|
|
>
|
|
|
|
|
<DollarSign className="w-4 h-4" />
|
consistency: replace custom buttons with Button component (partial)
- Replaced custom button implementations with Button component in 14 files
- Files updated: LiveStreamDetailView, DashboardPage, CommentItem, PostCard, SocialPage, SocialView, AdminUsersView, UserTableRow, ProjectsManager, CloudFileBrowser, FileManagerView, CreatorModal, ImageCropper, BulkUploadModal
- ~31 buttons replaced across high-priority files
- Used appropriate Button variants: ghost, outline, default, secondary, link
- Preserved visual appearance with className overrides where needed
- Action 9.2.1.2 in progress (partial completion)
2026-01-16 01:06:14 +00:00
|
|
|
</Button>
|
2026-01-13 18:47:57 +00:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2026-01-07 09:31:02 +00:00
|
|
|
</div>
|
2026-01-13 18:47:57 +00:00
|
|
|
</div>
|
2026-01-07 09:31:02 +00:00
|
|
|
|
2026-01-13 18:47:57 +00:00
|
|
|
{showTipModal && (
|
|
|
|
|
<TipStreamerModal
|
|
|
|
|
streamerName={MOCK_STREAM.streamer}
|
|
|
|
|
onClose={() => setShowTipModal(false)}
|
|
|
|
|
onSend={handleTip}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
2026-01-07 09:31:02 +00:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|