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
This commit is contained in:
parent
32932144ab
commit
6974c12a25
232 changed files with 753 additions and 542 deletions
|
|
@ -3921,7 +3921,7 @@ Critical path dependencies:
|
|||
- **Result**: ~87 instances replaced across ~65 files. Secondary actions now use steel/white for hover states, while primary actions correctly use cyan. Task objective achieved.
|
||||
- **Rollback**: Restore cyan usage
|
||||
|
||||
- [ ] **Action 11.3.1.3**: Apply 80/20 rule (80% neutral, 20% color)
|
||||
- [x] **Action 11.3.1.3**: Apply 80/20 rule (80% neutral, 20% color)
|
||||
- **Scope**: All pages - Ensure color used sparingly
|
||||
- **Dependencies**: Action 11.3.1.2 complete ✅
|
||||
- **Risk**: MEDIUM (visual changes)
|
||||
|
|
|
|||
|
|
@ -137,7 +137,7 @@ export function AdvancedFilters({
|
|||
triggerClassName="p-2 rounded-lg border border-kodo-steel bg-kodo-void/50 hover:bg-kodo-void transition-colors"
|
||||
contentClassName={cn('pt-3', contentClassName)}
|
||||
>
|
||||
<div className="space-y-3">{children}</div>
|
||||
<div className="space-y-4">{children}</div>
|
||||
</Collapsible>
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -71,12 +71,12 @@ export function BulkModeBanner({
|
|||
aria-atomic="true"
|
||||
className={cn(
|
||||
'w-full bg-kodo-steel/10 border-b border-kodo-steel/30 text-kodo-steel',
|
||||
'px-4 py-3 flex items-center justify-between gap-4',
|
||||
'px-4 py-4 flex items-center justify-between gap-4',
|
||||
'transition-all duration-300',
|
||||
className,
|
||||
)}
|
||||
>
|
||||
<div className="flex items-center gap-3 flex-1 min-w-0">
|
||||
<div className="flex items-center gap-4 flex-1 min-w-0">
|
||||
<CheckSquare className="w-5 h-5 flex-shrink-0" aria-hidden="true" />
|
||||
<span className="text-sm font-medium">
|
||||
<span className="font-bold">{selectedCount}</span> {itemText}
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ export function OfflineQueueManager({
|
|||
</div>
|
||||
|
||||
{/* Metadata */}
|
||||
<div className="flex items-center gap-3 flex-wrap text-xs text-kodo-secondary">
|
||||
<div className="flex items-center gap-4 flex-wrap text-xs text-kodo-secondary">
|
||||
{/* Priority Badge */}
|
||||
<span
|
||||
className={cn(
|
||||
|
|
@ -205,7 +205,7 @@ export function OfflineQueueManager({
|
|||
|
||||
{/* Info Message */}
|
||||
{queue.length > 0 && (
|
||||
<div className="p-3 bg-kodo-steel/10 border border-kodo-steel/20 rounded-lg text-xs text-kodo-secondary">
|
||||
<div className="p-4 bg-kodo-steel/10 border border-kodo-steel/20 rounded-lg text-xs text-kodo-secondary">
|
||||
<p>
|
||||
Queued requests will be automatically processed when you're back
|
||||
online. You can remove individual requests or clear the entire
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ export function RateLimitIndicator() {
|
|||
return (
|
||||
<div
|
||||
className={cn(
|
||||
'flex items-center gap-2 px-3 py-1.5 rounded-lg text-xs font-medium transition-all',
|
||||
'flex items-center gap-2 px-4 py-1.5 rounded-lg text-xs font-medium transition-all',
|
||||
isCritical
|
||||
? 'bg-kodo-red/10 text-kodo-red border border-kodo-red/30'
|
||||
: 'bg-kodo-gold/10 text-kodo-gold border border-kodo-gold/30',
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ export const AdminDashboardView: React.FC = () => {
|
|||
|
||||
if (loading)
|
||||
return (
|
||||
<div className="flex justify-center py-20">
|
||||
<div className="flex justify-center py-24">
|
||||
<Loader2 className="w-10 h-10 text-kodo-steel animate-spin" />
|
||||
</div>
|
||||
);
|
||||
|
|
@ -140,7 +140,7 @@ export const AdminDashboardView: React.FC = () => {
|
|||
<h3 className="font-bold text-white mb-4 text-sm uppercase tracking-wider">
|
||||
Quick Actions
|
||||
</h3>
|
||||
<div className="grid grid-cols-2 gap-3">
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<Button
|
||||
variant="secondary"
|
||||
size="sm"
|
||||
|
|
@ -176,7 +176,7 @@ export const AdminDashboardView: React.FC = () => {
|
|||
<h3 className="font-bold text-white mb-4 text-sm uppercase tracking-wider">
|
||||
System Health
|
||||
</h3>
|
||||
<div className="space-y-3">
|
||||
<div className="space-y-4">
|
||||
<div className="flex justify-between text-sm">
|
||||
<span className="text-kodo-content-dim">Database</span>
|
||||
<span className="text-kodo-lime font-bold">Healthy</span>
|
||||
|
|
@ -209,7 +209,7 @@ export const AdminDashboardView: React.FC = () => {
|
|||
{reports.map((report) => (
|
||||
<div
|
||||
key={report.id}
|
||||
className="flex items-center justify-between p-3 bg-kodo-ink rounded border border-kodo-steel/30"
|
||||
className="flex items-center justify-between p-4 bg-kodo-ink rounded border border-kodo-steel/30"
|
||||
>
|
||||
<div>
|
||||
<div className="text-sm font-bold text-white">
|
||||
|
|
@ -261,7 +261,7 @@ export const AdminDashboardView: React.FC = () => {
|
|||
{uploads.map((upload) => (
|
||||
<div
|
||||
key={upload.id}
|
||||
className="flex items-center justify-between p-3 bg-kodo-ink rounded border border-kodo-steel/30"
|
||||
className="flex items-center justify-between p-4 bg-kodo-ink rounded border border-kodo-steel/30"
|
||||
>
|
||||
<div>
|
||||
<div className="text-sm font-bold text-white">
|
||||
|
|
|
|||
|
|
@ -98,13 +98,13 @@ export const AdminModerationView: React.FC = () => {
|
|||
|
||||
<div className="space-y-4">
|
||||
{loading && (
|
||||
<div className="flex justify-center py-20">
|
||||
<div className="flex justify-center py-24">
|
||||
<Loader2 className="w-8 h-8 text-kodo-steel animate-spin" />
|
||||
</div>
|
||||
)}
|
||||
|
||||
{!loading && filteredQueue.length === 0 && (
|
||||
<div className="text-center py-20 text-kodo-content-dim">
|
||||
<div className="text-center py-24 text-kodo-content-dim">
|
||||
<ShieldAlert className="w-12 h-12 mx-auto mb-4 opacity-30" />
|
||||
<p>All caught up! No reports in this queue.</p>
|
||||
</div>
|
||||
|
|
@ -119,7 +119,7 @@ export const AdminModerationView: React.FC = () => {
|
|||
>
|
||||
<div className="flex flex-col md:flex-row justify-between gap-4">
|
||||
<div className="flex-1">
|
||||
<div className="flex items-center gap-3 mb-2">
|
||||
<div className="flex items-center gap-4 mb-2">
|
||||
<Badge label={report.targetType} variant="terminal" />
|
||||
<span className="font-bold text-white text-lg">
|
||||
{report.targetName}
|
||||
|
|
@ -128,7 +128,7 @@ export const AdminModerationView: React.FC = () => {
|
|||
<Clock className="w-3 h-3" /> {report.timestamp}
|
||||
</span>
|
||||
</div>
|
||||
<div className="bg-kodo-ink p-3 rounded border border-kodo-steel/50 mb-3">
|
||||
<div className="bg-kodo-ink p-4 rounded border border-kodo-steel/50 mb-3">
|
||||
<div className="text-xs font-bold text-kodo-red uppercase mb-1">
|
||||
Reason: {report.reason}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ export const AdminSettingsView: React.FC = () => {
|
|||
].map((feature) => (
|
||||
<div
|
||||
key={feature}
|
||||
className="flex items-center justify-between p-3 bg-kodo-ink rounded border border-kodo-steel"
|
||||
className="flex items-center justify-between p-4 bg-kodo-ink rounded border border-kodo-steel"
|
||||
>
|
||||
<span className="font-bold text-white">{feature}</span>
|
||||
<div className="w-10 h-5 bg-kodo-lime rounded-full relative cursor-pointer">
|
||||
|
|
@ -118,7 +118,7 @@ export const AdminSettingsView: React.FC = () => {
|
|||
Global Announcement
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-kodo-ink border border-kodo-steel rounded p-3 text-white outline-none focus:border-kodo-steel h-24 resize-none"
|
||||
className="w-full bg-kodo-ink border border-kodo-steel rounded p-4 text-white outline-none focus:border-kodo-steel h-24 resize-none"
|
||||
placeholder="Message to display on all pages..."
|
||||
value={announcement}
|
||||
onChange={(e) => setAnnouncement(e.target.value)}
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ export const AdminUsersView: React.FC = () => {
|
|||
Manage accounts, roles, and permissions.
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex gap-3">
|
||||
<div className="flex gap-4">
|
||||
<Button
|
||||
variant="ghost"
|
||||
icon={<Download className="w-4 h-4" />}
|
||||
|
|
@ -120,7 +120,7 @@ export const AdminUsersView: React.FC = () => {
|
|||
</div>
|
||||
|
||||
{loading ? (
|
||||
<div className="flex justify-center py-20">
|
||||
<div className="flex justify-center py-24">
|
||||
<Loader2 className="w-8 h-8 text-kodo-steel animate-spin" />
|
||||
</div>
|
||||
) : (
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ export const UserTableRow: React.FC<UserTableRowProps> = ({
|
|||
return (
|
||||
<tr className="hover:bg-white/5 transition-colors group relative">
|
||||
<td className="p-4">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-4">
|
||||
<div className="relative">
|
||||
<img
|
||||
src={user.avatar}
|
||||
|
|
|
|||
|
|
@ -71,8 +71,8 @@ export const BanUserModal: React.FC<BanUserModalProps> = ({
|
|||
/>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center justify-between p-3 bg-kodo-ink rounded border border-kodo-steel">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center justify-between p-4 bg-kodo-ink rounded border border-kodo-steel">
|
||||
<div className="flex items-center gap-4">
|
||||
<Calendar className="w-5 h-5 text-kodo-content-dim" />
|
||||
<div>
|
||||
<div className="text-sm font-bold text-white">Ban Duration</div>
|
||||
|
|
@ -119,7 +119,7 @@ export const BanUserModal: React.FC<BanUserModalProps> = ({
|
|||
)}
|
||||
</div>
|
||||
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@ export const TrackAnalyticsView: React.FC<TrackAnalyticsViewProps> = ({
|
|||
<h3 className="font-bold text-white mb-4 flex items-center gap-2">
|
||||
<Map className="w-4 h-4 text-kodo-magenta" /> Top Locations
|
||||
</h3>
|
||||
<div className="space-y-3">
|
||||
<div className="space-y-4">
|
||||
{trackData.geo.map((g) => (
|
||||
<div key={g.country} className="flex items-center gap-4">
|
||||
<div className="w-16 text-sm text-kodo-content-dim">{g.country}</div>
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ export const OrderSummary: React.FC<OrderSummaryProps> = ({
|
|||
Order Summary
|
||||
</h3>
|
||||
|
||||
<div className="space-y-3 text-sm mb-6">
|
||||
<div className="space-y-4 text-sm mb-6">
|
||||
<div className="flex justify-between text-kodo-content-dim">
|
||||
<span>Subtotal</span>
|
||||
<span className="text-white font-mono">
|
||||
|
|
@ -88,7 +88,7 @@ export const OrderSummary: React.FC<OrderSummaryProps> = ({
|
|||
)}
|
||||
</Card>
|
||||
|
||||
<div className="bg-kodo-ink/50 p-4 rounded-xl border border-kodo-steel/50 flex items-start gap-3">
|
||||
<div className="bg-kodo-ink/50 p-4 rounded-xl border border-kodo-steel/50 flex items-start gap-4">
|
||||
<ShieldCheck className="w-5 h-5 text-kodo-gold flex-shrink-0" />
|
||||
<div>
|
||||
<h4 className="font-bold text-white text-sm mb-1">Secure Checkout</h4>
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ export const RefundRequestModal: React.FC<RefundRequestModalProps> = ({
|
|||
Details
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-kodo-void border border-kodo-steel rounded-lg p-3 text-white focus:border-kodo-steel outline-none text-sm resize-none h-24"
|
||||
className="w-full bg-kodo-void border border-kodo-steel rounded-lg p-4 text-white focus:border-kodo-steel outline-none text-sm resize-none h-24"
|
||||
placeholder="Please explain why you are requesting a refund..."
|
||||
value={details}
|
||||
onChange={(e) => setDetails(e.target.value)}
|
||||
|
|
@ -80,7 +80,7 @@ export const RefundRequestModal: React.FC<RefundRequestModalProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ export const StatCard: React.FC<StatCardProps> = ({
|
|||
return (
|
||||
<Card
|
||||
variant="default"
|
||||
className="flex flex-col justify-between h-full p-5 hover:border-opacity-100 transition-all relative overflow-hidden"
|
||||
className="flex flex-col justify-between h-full p-6 hover:border-opacity-100 transition-all relative overflow-hidden"
|
||||
>
|
||||
<div className="flex justify-between items-start mb-2 relative z-10">
|
||||
<div>
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ export const TrackList: React.FC = () => {
|
|||
|
||||
if (loading) {
|
||||
return (
|
||||
<div className="space-y-3">
|
||||
<div className="space-y-4">
|
||||
{[1, 2, 3, 4, 5].map((i) => (
|
||||
<div
|
||||
key={i}
|
||||
|
|
@ -93,7 +93,7 @@ export const TrackList: React.FC = () => {
|
|||
|
||||
if (tracks.length === 0) {
|
||||
return (
|
||||
<div className="text-kodo-content-dim text-center py-10 bg-kodo-ink/30 rounded-xl border border-dashed border-kodo-steel">
|
||||
<div className="text-kodo-content-dim text-center py-12 bg-kodo-ink/30 rounded-xl border border-dashed border-kodo-steel">
|
||||
<BarChart3 className="w-8 h-8 mx-auto mb-2 opacity-50" />
|
||||
<p>No tracks trending right now.</p>
|
||||
</div>
|
||||
|
|
@ -109,7 +109,7 @@ export const TrackList: React.FC = () => {
|
|||
<div
|
||||
key={track.id}
|
||||
className={`
|
||||
group flex items-center gap-4 p-3 rounded-xl transition-all border cursor-pointer relative overflow-hidden
|
||||
group flex items-center gap-4 p-4 rounded-xl transition-all border cursor-pointer relative overflow-hidden
|
||||
${isCurrent ? 'bg-kodo-cyan/10 border-kodo-cyan/30' : 'bg-kodo-ink border-transparent hover:border-kodo-steel/50 hover:bg-kodo-ink/80'}
|
||||
`}
|
||||
onClick={() => handlePlay(track)}
|
||||
|
|
|
|||
|
|
@ -105,14 +105,14 @@ const GAP_CLASSES: Record<number, string> = {
|
|||
0: 'gap-0',
|
||||
1: 'gap-1',
|
||||
2: 'gap-2',
|
||||
3: 'gap-3',
|
||||
3: 'gap-4',
|
||||
4: 'gap-4',
|
||||
5: 'gap-5',
|
||||
5: 'gap-6',
|
||||
6: 'gap-6',
|
||||
7: 'gap-6', // Standardized: 7 (28px) → 6 (24px) to follow 4px base scale
|
||||
8: 'gap-8',
|
||||
9: 'gap-8', // Standardized: 9 (36px) → 8 (32px) to follow 4px base scale
|
||||
10: 'gap-10',
|
||||
10: 'gap-12',
|
||||
11: 'gap-12', // Standardized: 11 (44px) → 12 (48px) to follow 4px base scale
|
||||
12: 'gap-12',
|
||||
};
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ export function List({
|
|||
onClick={item.onClick && !item.disabled ? item.onClick : undefined}
|
||||
className={cn(
|
||||
'flex items-center justify-between',
|
||||
variant === 'bordered' && 'px-4 py-3',
|
||||
variant === 'bordered' && 'px-4 py-4',
|
||||
variant === 'spaced' && 'px-2 py-2',
|
||||
variant === 'default' && 'px-2 py-2',
|
||||
item.onClick && !item.disabled && 'cursor-pointer hover:bg-accent',
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ export const APIPlaygroundView: React.FC = () => {
|
|||
Endpoint
|
||||
</label>
|
||||
<select
|
||||
className="w-full bg-kodo-ink border border-kodo-steel rounded p-3 text-white focus:border-kodo-steel outline-none font-mono text-sm"
|
||||
className="w-full bg-kodo-ink border border-kodo-steel rounded p-4 text-white focus:border-kodo-steel outline-none font-mono text-sm"
|
||||
value={selectedEndpoint.path}
|
||||
onChange={(e) => {
|
||||
const ep = ENDPOINTS.find((p) => p.path === e.target.value);
|
||||
|
|
@ -85,7 +85,7 @@ export const APIPlaygroundView: React.FC = () => {
|
|||
Body (JSON)
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-kodo-ink border border-kodo-steel rounded p-3 text-white focus:border-kodo-steel outline-none font-mono text-xs h-48 resize-none"
|
||||
className="w-full bg-kodo-ink border border-kodo-steel rounded p-4 text-white focus:border-kodo-steel outline-none font-mono text-xs h-48 resize-none"
|
||||
value={params}
|
||||
onChange={(e) => setParams(e.target.value)}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ export const DeveloperDashboardView: React.FC = () => {
|
|||
|
||||
if (loading)
|
||||
return (
|
||||
<div className="flex justify-center py-20">
|
||||
<div className="flex justify-center py-24">
|
||||
<Loader2 className="w-10 h-10 text-kodo-steel animate-spin" />
|
||||
</div>
|
||||
);
|
||||
|
|
@ -92,7 +92,7 @@ export const DeveloperDashboardView: React.FC = () => {
|
|||
Build on top of the Veza Platform.
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex gap-3">
|
||||
<div className="flex gap-4">
|
||||
<Button
|
||||
variant="secondary"
|
||||
icon={<ExternalLink className="w-4 h-4" />}
|
||||
|
|
|
|||
|
|
@ -82,11 +82,11 @@ export const CreateAPIKeyModal: React.FC<CreateAPIKeyModalProps> = ({
|
|||
<label className="block text-xs font-bold text-kodo-content-dim uppercase mb-3">
|
||||
Permissions (Scopes)
|
||||
</label>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||
{SCOPES.map((scope) => (
|
||||
<label
|
||||
key={scope.id}
|
||||
className="flex items-center gap-3 p-3 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel transition-colors"
|
||||
className="flex items-center gap-4 p-4 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel transition-colors"
|
||||
>
|
||||
<input
|
||||
type="checkbox"
|
||||
|
|
@ -134,7 +134,7 @@ export const CreateAPIKeyModal: React.FC<CreateAPIKeyModalProps> = ({
|
|||
)}
|
||||
</div>
|
||||
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
|
||||
{step === 1 ? (
|
||||
<>
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ export const CourseDetailView: React.FC<CourseDetailViewProps> = ({
|
|||
</span>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-4">
|
||||
<img
|
||||
src={`https://ui-avatars.com/api/?name=${course.instructor}&background=random`}
|
||||
className="w-10 h-10 rounded-full"
|
||||
|
|
@ -120,9 +120,9 @@ export const CourseDetailView: React.FC<CourseDetailViewProps> = ({
|
|||
<h3 className="font-bold text-white text-lg mb-4">
|
||||
What you'll learn
|
||||
</h3>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||
{course.whatYouWillLearn?.map((item, i) => (
|
||||
<div key={i} className="flex gap-3 text-sm text-kodo-text-main">
|
||||
<div key={i} className="flex gap-4 text-sm text-kodo-text-main">
|
||||
<CheckCircle className="w-4 h-4 text-kodo-lime flex-shrink-0 mt-0.5" />
|
||||
<span>{item}</span>
|
||||
</div>
|
||||
|
|
@ -173,7 +173,7 @@ export const CourseDetailView: React.FC<CourseDetailViewProps> = ({
|
|||
className="p-4 flex justify-between items-center cursor-pointer hover:bg-white/5 transition-colors"
|
||||
onClick={() => toggleModule(module.id)}
|
||||
>
|
||||
<h4 className="font-bold text-white flex items-center gap-3">
|
||||
<h4 className="font-bold text-white flex items-center gap-4">
|
||||
{expandedModule === module.id ||
|
||||
expandedModule === 'all' ? (
|
||||
<ChevronUp className="w-4 h-4" />
|
||||
|
|
@ -193,9 +193,9 @@ export const CourseDetailView: React.FC<CourseDetailViewProps> = ({
|
|||
{module.lessons.map((lesson) => (
|
||||
<div
|
||||
key={lesson.id}
|
||||
className="p-3 pl-8 flex justify-between items-center hover:bg-white/5 border-b border-kodo-steel/30 last:border-0"
|
||||
className="p-4 pl-8 flex justify-between items-center hover:bg-white/5 border-b border-kodo-steel/30 last:border-0"
|
||||
>
|
||||
<div className="flex items-center gap-3 text-sm text-kodo-text-main">
|
||||
<div className="flex items-center gap-4 text-sm text-kodo-text-main">
|
||||
{lesson.type === 'video' ? (
|
||||
<PlayCircle className="w-4 h-4" />
|
||||
) : (
|
||||
|
|
@ -203,7 +203,7 @@ export const CourseDetailView: React.FC<CourseDetailViewProps> = ({
|
|||
)}
|
||||
{lesson.title}
|
||||
</div>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-4">
|
||||
{lesson.isLocked && !isEnrolled && (
|
||||
<Lock className="w-3 h-3 text-kodo-content-dim" />
|
||||
)}
|
||||
|
|
@ -227,7 +227,7 @@ export const CourseDetailView: React.FC<CourseDetailViewProps> = ({
|
|||
key={review.id}
|
||||
className="border-b border-kodo-steel/50 pb-6"
|
||||
>
|
||||
<div className="flex items-center gap-3 mb-2">
|
||||
<div className="flex items-center gap-4 mb-2">
|
||||
<img
|
||||
src={review.avatar}
|
||||
className="w-10 h-10 rounded-full"
|
||||
|
|
@ -302,7 +302,7 @@ export const CourseDetailView: React.FC<CourseDetailViewProps> = ({
|
|||
CONTINUE LEARNING
|
||||
</Button>
|
||||
) : (
|
||||
<div className="space-y-3">
|
||||
<div className="space-y-4">
|
||||
<Button
|
||||
variant="primary"
|
||||
className="w-full h-12 text-lg"
|
||||
|
|
@ -316,23 +316,23 @@ export const CourseDetailView: React.FC<CourseDetailViewProps> = ({
|
|||
</div>
|
||||
)}
|
||||
|
||||
<div className="mt-6 space-y-3">
|
||||
<div className="mt-6 space-y-4">
|
||||
<h4 className="font-bold text-white text-sm">
|
||||
This course includes:
|
||||
</h4>
|
||||
<ul className="text-sm text-kodo-content-dim space-y-2">
|
||||
<li className="flex items-center gap-3">
|
||||
<li className="flex items-center gap-4">
|
||||
<PlayCircle className="w-4 h-4" /> {course.duration}{' '}
|
||||
on-demand video
|
||||
</li>
|
||||
<li className="flex items-center gap-3">
|
||||
<li className="flex items-center gap-4">
|
||||
<ShieldCheck className="w-4 h-4" /> Full lifetime access
|
||||
</li>
|
||||
<li className="flex items-center gap-3">
|
||||
<li className="flex items-center gap-4">
|
||||
<Globe className="w-4 h-4" /> Access on mobile and TV
|
||||
</li>
|
||||
{course.certificateAvailable && (
|
||||
<li className="flex items-center gap-3">
|
||||
<li className="flex items-center gap-4">
|
||||
<Star className="w-4 h-4" /> Certificate of completion
|
||||
</li>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ export const CourseLearningView: React.FC<CourseLearningViewProps> = ({
|
|||
);
|
||||
|
||||
return (
|
||||
<div className="flex flex-col h-[calc(100vh-6rem)] -m-6 md:-m-10 bg-kodo-void">
|
||||
<div className="flex flex-col h-[calc(100vh-6rem)] -m-6 md:-m-12 bg-kodo-void">
|
||||
{/* Header Bar */}
|
||||
<div className="h-16 border-b border-kodo-steel bg-kodo-ink px-4 flex items-center justify-between shrink-0 z-20">
|
||||
<div className="flex items-center gap-4">
|
||||
|
|
@ -244,8 +244,8 @@ export const CourseLearningView: React.FC<CourseLearningViewProps> = ({
|
|||
)}
|
||||
{activeTab === 'resources' && (
|
||||
<div className="space-y-2">
|
||||
<div className="flex items-center justify-between p-3 bg-kodo-ink rounded border border-kodo-steel">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center justify-between p-4 bg-kodo-ink rounded border border-kodo-steel">
|
||||
<div className="flex items-center gap-4">
|
||||
<FileText className="w-5 h-5 text-kodo-steel" />
|
||||
<span className="text-sm text-white">
|
||||
Lesson Slides.pdf
|
||||
|
|
@ -255,8 +255,8 @@ export const CourseLearningView: React.FC<CourseLearningViewProps> = ({
|
|||
Download
|
||||
</Button>
|
||||
</div>
|
||||
<div className="flex items-center justify-between p-3 bg-kodo-ink rounded border border-kodo-steel">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center justify-between p-4 bg-kodo-ink rounded border border-kodo-steel">
|
||||
<div className="flex items-center gap-4">
|
||||
<FileText className="w-5 h-5 text-kodo-magenta" />
|
||||
<span className="text-sm text-white">
|
||||
Project Files.zip
|
||||
|
|
@ -291,7 +291,7 @@ export const CourseLearningView: React.FC<CourseLearningViewProps> = ({
|
|||
<div
|
||||
key={lesson.id}
|
||||
onClick={() => setActiveLessonId(lesson.id)}
|
||||
className={`flex items-start gap-3 p-3 cursor-pointer border-l-2 transition-all hover:bg-white/5 ${isActive ? 'bg-kodo-cyan/10 border-kodo-cyan' : 'border-transparent'}`}
|
||||
className={`flex items-start gap-4 p-4 cursor-pointer border-l-2 transition-all hover:bg-white/5 ${isActive ? 'bg-kodo-cyan/10 border-kodo-cyan' : 'border-transparent'}`}
|
||||
>
|
||||
<div className="mt-0.5">
|
||||
{isCompleted ? (
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ export const MyCoursesView: React.FC<MyCoursesViewProps> = ({ onContinue }) => {
|
|||
|
||||
return (
|
||||
<div className="animate-fadeIn space-y-8 pb-20">
|
||||
<div className="flex items-center gap-3 mb-6">
|
||||
<div className="flex items-center gap-4 mb-6">
|
||||
<GraduationCap className="w-8 h-8 text-kodo-steel" />
|
||||
<h1 className="text-3xl font-display font-bold text-white">
|
||||
My Learning
|
||||
|
|
@ -133,7 +133,7 @@ export const MyCoursesView: React.FC<MyCoursesViewProps> = ({ onContinue }) => {
|
|||
/>
|
||||
))}
|
||||
{filteredCourses.length === 0 && (
|
||||
<div className="col-span-full text-center py-20 text-kodo-content-dim">
|
||||
<div className="col-span-full text-center py-24 text-kodo-content-dim">
|
||||
<p>No courses found in this category.</p>
|
||||
</div>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ export const CertificateModal: React.FC<CertificateModalProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
Close
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ export const QuizModal: React.FC<QuizModalProps> = ({
|
|||
{currentQuestion.question}
|
||||
</h2>
|
||||
|
||||
<div className="space-y-3">
|
||||
<div className="space-y-4">
|
||||
{currentQuestion.options.map((option, idx) => (
|
||||
<button
|
||||
key={idx}
|
||||
|
|
@ -145,7 +145,7 @@ export const QuizModal: React.FC<QuizModalProps> = ({
|
|||
: 'bg-kodo-ink border-kodo-steel text-kodo-text-main hover:bg-white/5 hover:border-kodo-steel'
|
||||
}`}
|
||||
>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-4">
|
||||
<div
|
||||
className={`w-6 h-6 rounded-full border flex items-center justify-center text-xs font-bold ${selectedAnswers[currentQuestionIndex] === idx ? 'bg-kodo-cyan border-kodo-cyan text-black' : 'border-kodo-steel text-kodo-content-dim'}`}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ export function Alert({
|
|||
className,
|
||||
)}
|
||||
>
|
||||
<div className="flex items-start gap-3">
|
||||
<div className="flex items-start gap-4">
|
||||
<Icon
|
||||
className={cn('h-5 w-5 flex-shrink-0 mt-0.5', ICON_STYLES[variant])}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ export function ToastComponent({ toast, onDismiss }: ToastProps) {
|
|||
return (
|
||||
<div
|
||||
className={cn(
|
||||
'relative flex min-w-[300px] max-w-md items-start gap-3 rounded-lg border p-4 shadow-lg transition-all duration-300',
|
||||
'relative flex min-w-[300px] max-w-md items-start gap-4 rounded-lg border p-4 shadow-lg transition-all duration-300',
|
||||
styles,
|
||||
isVisible && !isLeaving
|
||||
? 'opacity-100 translate-x-0'
|
||||
|
|
|
|||
|
|
@ -233,7 +233,7 @@ export function FormBuilder({
|
|||
placeholder={field.placeholder}
|
||||
disabled={disabled || field.disabled}
|
||||
className={cn(
|
||||
'flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',
|
||||
'flex min-h-[80px] w-full rounded-md border border-input bg-background px-4 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',
|
||||
hasError && 'border-destructive',
|
||||
)}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ export const AchievementCard: React.FC<AchievementCardProps> = ({
|
|||
)}
|
||||
|
||||
<div
|
||||
className={`flex ${compact ? 'flex-row items-center gap-4' : 'flex-col items-center text-center gap-3'}`}
|
||||
className={`flex ${compact ? 'flex-row items-center gap-4' : 'flex-col items-center text-center gap-4'}`}
|
||||
>
|
||||
<div
|
||||
className={`rounded-full bg-gradient-to-br from-kodo-graphite to-black flex items-center justify-center border-2 ${isUnlocked ? 'border-kodo-gold w-16 h-16 text-3xl shadow-[0_0_15px_rgba(234,179,8,0.3)]' : 'border-kodo-steel w-12 h-12 text-xl text-kodo-content-dim'}`}
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ export const AchievementsView: React.FC = () => {
|
|||
|
||||
if (loading)
|
||||
return (
|
||||
<div className="flex justify-center py-20">
|
||||
<div className="flex justify-center py-24">
|
||||
<Loader2 className="w-10 h-10 text-kodo-steel animate-spin" />
|
||||
</div>
|
||||
);
|
||||
|
|
@ -62,7 +62,7 @@ export const AchievementsView: React.FC = () => {
|
|||
Track your milestones and earn rewards.
|
||||
</p>
|
||||
</div>
|
||||
<div className="bg-kodo-ink px-4 py-2 rounded-lg border border-kodo-steel flex items-center gap-3">
|
||||
<div className="bg-kodo-ink px-4 py-2 rounded-lg border border-kodo-steel flex items-center gap-4">
|
||||
<Trophy className="w-5 h-5 text-kodo-gold" />
|
||||
<span className="text-sm font-bold text-white">
|
||||
{earnedCount} / {achievements.length} Unlocked
|
||||
|
|
|
|||
|
|
@ -56,14 +56,14 @@ export const LeaderboardView: React.FC = () => {
|
|||
</div>
|
||||
|
||||
{loading ? (
|
||||
<div className="flex justify-center py-20">
|
||||
<div className="flex justify-center py-24">
|
||||
<Loader2 className="w-10 h-10 text-kodo-steel animate-spin" />
|
||||
</div>
|
||||
) : (
|
||||
<>
|
||||
{/* Top 3 Podium (Visual) */}
|
||||
{leaderboard.length >= 3 && (
|
||||
<div className="grid grid-cols-3 gap-4 items-end mb-8 md:px-20">
|
||||
<div className="grid grid-cols-3 gap-4 items-end mb-8 md:px-24">
|
||||
{[leaderboard[1], leaderboard[0], leaderboard[2]].map(
|
||||
(entry, i) => (
|
||||
<div
|
||||
|
|
@ -122,7 +122,7 @@ export const LeaderboardView: React.FC = () => {
|
|||
#{entry.rank}
|
||||
</td>
|
||||
<td className="p-4">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-4">
|
||||
<img
|
||||
src={entry.avatar}
|
||||
className="w-8 h-8 rounded-full"
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ export const ProfileXPView: React.FC<ProfileXPViewProps> = ({ username }) => {
|
|||
|
||||
if (loading)
|
||||
return (
|
||||
<div className="flex justify-center py-20">
|
||||
<div className="flex justify-center py-24">
|
||||
<Loader2 className="w-10 h-10 text-kodo-steel animate-spin" />
|
||||
</div>
|
||||
);
|
||||
|
|
@ -101,13 +101,13 @@ export const ProfileXPView: React.FC<ProfileXPViewProps> = ({ username }) => {
|
|||
/>
|
||||
|
||||
<div className="flex gap-4 pt-2">
|
||||
<div className="bg-black/30 px-3 py-1 rounded text-xs text-kodo-content-dim">
|
||||
<div className="bg-black/30 px-4 py-1 rounded text-xs text-kodo-content-dim">
|
||||
<span className="text-white font-bold">
|
||||
{xpData.totalEarned.toLocaleString()}
|
||||
</span>{' '}
|
||||
Total Lifetime XP
|
||||
</div>
|
||||
<div className="bg-black/30 px-3 py-1 rounded text-xs text-kodo-content-dim">
|
||||
<div className="bg-black/30 px-4 py-1 rounded text-xs text-kodo-content-dim">
|
||||
<span className="text-kodo-lime font-bold">+12%</span> vs Last
|
||||
Week
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ export const AddEquipmentView: React.FC = () => {
|
|||
Category
|
||||
</label>
|
||||
<select
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-3 text-white focus:border-kodo-steel outline-none"
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-4 text-white focus:border-kodo-steel outline-none"
|
||||
value={formData.category}
|
||||
onChange={(e) => handleChange('category', e.target.value)}
|
||||
>
|
||||
|
|
@ -175,7 +175,7 @@ export const AddEquipmentView: React.FC = () => {
|
|||
Notes
|
||||
</h3>
|
||||
<textarea
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-3 text-white focus:border-kodo-steel outline-none min-h-[100px]"
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-4 text-white focus:border-kodo-steel outline-none min-h-[100px]"
|
||||
placeholder="Condition notes, modifications, etc..."
|
||||
value={formData.notes}
|
||||
onChange={(e) => handleChange('notes', e.target.value)}
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ export const EquipmentDetailView: React.FC<EquipmentDetailViewProps> = ({
|
|||
);
|
||||
if (!item)
|
||||
return (
|
||||
<div className="text-center py-20 text-kodo-content-dim">Item not found</div>
|
||||
<div className="text-center py-24 text-kodo-content-dim">Item not found</div>
|
||||
);
|
||||
|
||||
const images =
|
||||
|
|
@ -156,7 +156,7 @@ export const EquipmentDetailView: React.FC<EquipmentDetailViewProps> = ({
|
|||
{/* Right: Details & History */}
|
||||
<div className="space-y-6">
|
||||
<div>
|
||||
<div className="flex items-center gap-3 mb-2">
|
||||
<div className="flex items-center gap-4 mb-2">
|
||||
<Badge label={item.category} variant="terminal" />
|
||||
<span
|
||||
className={`px-2 py-0.5 rounded text-[10px] font-bold uppercase ${item.status === 'Active' ? 'bg-kodo-lime/10 text-kodo-lime' : 'bg-kodo-steel text-kodo-text-main'}`}
|
||||
|
|
@ -200,7 +200,7 @@ export const EquipmentDetailView: React.FC<EquipmentDetailViewProps> = ({
|
|||
<ShieldCheck className="w-4 h-4 text-kodo-lime" /> Warranty &
|
||||
Support
|
||||
</h3>
|
||||
<div className="flex justify-between items-center mb-4 p-3 bg-kodo-ink rounded border border-kodo-steel/30">
|
||||
<div className="flex justify-between items-center mb-4 p-4 bg-kodo-ink rounded border border-kodo-steel/30">
|
||||
<div>
|
||||
<span className="block text-xs text-kodo-content-dim uppercase">
|
||||
Expires
|
||||
|
|
@ -234,7 +234,7 @@ export const EquipmentDetailView: React.FC<EquipmentDetailViewProps> = ({
|
|||
key={i}
|
||||
className="flex items-center justify-between p-2 hover:bg-white/5 rounded cursor-pointer group transition-colors"
|
||||
>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-4">
|
||||
<FileText className="w-4 h-4 text-kodo-steel" />
|
||||
<span className="text-sm text-kodo-text-main">{doc.name}</span>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ export const InventoryView: React.FC<InventoryViewProps> = ({ onNavigate }) => {
|
|||
Track hardware, warranties, and maintenance.
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex gap-3">
|
||||
<div className="flex gap-4">
|
||||
<Button
|
||||
variant="ghost"
|
||||
icon={<Download className="w-4 h-4" />}
|
||||
|
|
@ -123,7 +123,7 @@ export const InventoryView: React.FC<InventoryViewProps> = ({ onNavigate }) => {
|
|||
|
||||
{/* Grid */}
|
||||
{loading ? (
|
||||
<div className="flex justify-center py-20">
|
||||
<div className="flex justify-center py-24">
|
||||
<Loader2 className="w-8 h-8 text-kodo-steel animate-spin" />
|
||||
</div>
|
||||
) : (
|
||||
|
|
@ -136,7 +136,7 @@ export const InventoryView: React.FC<InventoryViewProps> = ({ onNavigate }) => {
|
|||
/>
|
||||
))}
|
||||
{filteredItems.length === 0 && (
|
||||
<div className="col-span-full text-center py-20 text-kodo-content-dim">
|
||||
<div className="col-span-full text-center py-24 text-kodo-content-dim">
|
||||
<Box className="w-12 h-12 mx-auto mb-4 opacity-50" />
|
||||
<p>No equipment found.</p>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ export function KeyboardShortcutsHelp({
|
|||
title={t('keyboard.shortcuts.title', 'Keyboard Shortcuts')}
|
||||
size="lg"
|
||||
>
|
||||
<div className="space-y-3">
|
||||
<div className="space-y-4">
|
||||
{shortcuts.map((shortcut, index) => (
|
||||
<div
|
||||
key={index}
|
||||
|
|
|
|||
|
|
@ -77,13 +77,13 @@ export const AudioPlayer: React.FC = () => {
|
|||
<div className="flex-1 flex flex-col min-h-0">
|
||||
<div className="flex border-b border-kodo-steel bg-kodo-slate/30">
|
||||
<button
|
||||
className={`flex-1 py-3 text-xs font-bold uppercase tracking-wider transition-colors ${queueTab === 'up-next' ? 'text-kodo-cyan border-b-2 border-kodo-cyan bg-white/5' : 'text-kodo-content-dim hover:text-white'}`}
|
||||
className={`flex-1 py-4 text-xs font-bold uppercase tracking-wider transition-colors ${queueTab === 'up-next' ? 'text-kodo-cyan border-b-2 border-kodo-cyan bg-white/5' : 'text-kodo-content-dim hover:text-white'}`}
|
||||
onClick={() => setQueueTab('up-next')}
|
||||
>
|
||||
Up Next ({queue.length})
|
||||
</button>
|
||||
<button
|
||||
className={`flex-1 py-3 text-xs font-bold uppercase tracking-wider transition-colors ${queueTab === 'history' ? 'text-kodo-magenta border-b-2 border-kodo-magenta bg-white/5' : 'text-kodo-content-dim hover:text-white'}`}
|
||||
className={`flex-1 py-4 text-xs font-bold uppercase tracking-wider transition-colors ${queueTab === 'history' ? 'text-kodo-magenta border-b-2 border-kodo-magenta bg-white/5' : 'text-kodo-content-dim hover:text-white'}`}
|
||||
onClick={() => setQueueTab('history')}
|
||||
>
|
||||
History
|
||||
|
|
@ -97,7 +97,7 @@ export const AudioPlayer: React.FC = () => {
|
|||
<div className="text-[10px] font-bold text-kodo-steel uppercase tracking-wider mb-2">
|
||||
Now Playing
|
||||
</div>
|
||||
<div className="flex items-center gap-3 group relative">
|
||||
<div className="flex items-center gap-4 group relative">
|
||||
<img
|
||||
src={currentTrack.coverUrl}
|
||||
alt={`Cover art for ${currentTrack.title} by ${currentTrack.artist}`}
|
||||
|
|
@ -135,7 +135,7 @@ export const AudioPlayer: React.FC = () => {
|
|||
onDragStart={(e) => onDragStart(e, i)}
|
||||
onDragOver={(e) => onDragOver(e, i)}
|
||||
onDragEnd={onDragEnd}
|
||||
className={`flex items-center gap-3 p-2 rounded-lg group transition-colors border border-transparent ${draggedItemIndex === i ? 'bg-kodo-cyan/10 border-kodo-cyan/50' : 'hover:bg-white/5 hover:border-white/5'}`}
|
||||
className={`flex items-center gap-4 p-2 rounded-lg group transition-colors border border-transparent ${draggedItemIndex === i ? 'bg-kodo-cyan/10 border-kodo-cyan/50' : 'hover:bg-white/5 hover:border-white/5'}`}
|
||||
>
|
||||
<div className="cursor-grab active:cursor-grabbing text-kodo-content-dim hover:text-white p-1">
|
||||
<GripVertical className="w-4 h-4" />
|
||||
|
|
@ -202,7 +202,7 @@ export const AudioPlayer: React.FC = () => {
|
|||
{[...history].reverse().map((track, i) => (
|
||||
<div
|
||||
key={`${track.id}-${i}`}
|
||||
className="flex items-center gap-3 p-2 rounded-lg hover:bg-white/5 group opacity-70 hover:opacity-100 transition-opacity"
|
||||
className="flex items-center gap-4 p-2 rounded-lg hover:bg-white/5 group opacity-70 hover:opacity-100 transition-opacity"
|
||||
>
|
||||
<div className="w-8 h-8 rounded overflow-hidden flex-shrink-0 grayscale group-hover:grayscale-0 transition-all">
|
||||
<img
|
||||
|
|
@ -235,7 +235,7 @@ export const AudioPlayer: React.FC = () => {
|
|||
</div>
|
||||
|
||||
{queueTab === 'up-next' && queue.length > 0 && (
|
||||
<div className="p-3 border-t border-kodo-steel bg-kodo-ink">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink">
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ export function Header(_props: HeaderProps) {
|
|||
<div className="flex items-center gap-6">
|
||||
<Link
|
||||
to="/dashboard"
|
||||
className="flex items-center gap-3 active:scale-95 transition-transform focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-kodo-steel focus-visible:ring-offset-2 focus-visible:ring-offset-kodo-void rounded"
|
||||
className="flex items-center gap-4 active:scale-95 transition-transform focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-kodo-steel focus-visible:ring-offset-2 focus-visible:ring-offset-kodo-void rounded"
|
||||
>
|
||||
<div className="w-10 h-10 bg-kodo-steel/20 rounded-xl flex items-center justify-center border border-kodo-steel/30 shadow-2xl animate-scan">
|
||||
<Cpu className="w-6 h-6 text-kodo-steel animate-pulse-glow" />
|
||||
|
|
@ -114,9 +114,9 @@ export function Header(_props: HeaderProps) {
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-4">
|
||||
{/* Quick Stats Overlay - Styled specifically */}
|
||||
<div className="hidden lg:flex items-center gap-1 mr-4 bg-kodo-cyan/5 border border-kodo-steel/10 rounded-full px-3 py-1.5">
|
||||
<div className="hidden lg:flex items-center gap-1 mr-4 bg-kodo-cyan/5 border border-kodo-steel/10 rounded-full px-4 py-1.5">
|
||||
<div className="w-1.5 h-1.5 rounded-full bg-kodo-lime" />
|
||||
<span className="text-[10px] font-mono text-kodo-steel uppercase font-bold tracking-tight">
|
||||
Active_Stream_OK
|
||||
|
|
@ -172,7 +172,7 @@ export function Header(_props: HeaderProps) {
|
|||
onEscape={() => setIsUserMenuOpen(false)}
|
||||
>
|
||||
<div className="absolute right-0 mt-3 w-56 glass-hud rounded-2xl border-white/10 shadow-2xl z-50 p-2 animate-scaleIn hud-corner">
|
||||
<div className="px-4 py-3 border-b border-white/5 mb-2">
|
||||
<div className="px-4 py-4 border-b border-white/5 mb-2">
|
||||
<div className="text-xs font-mono text-kodo-steel opacity-50 uppercase tracking-widest mb-1">
|
||||
User_Registry
|
||||
</div>
|
||||
|
|
@ -190,7 +190,7 @@ export function Header(_props: HeaderProps) {
|
|||
<Link
|
||||
to="/profile"
|
||||
onClick={() => setIsUserMenuOpen(false)}
|
||||
className="flex items-center gap-3 px-3 py-2 text-sm text-kodo-secondary hover:text-white hover:bg-white/5 rounded-xl transition-all group focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-kodo-steel focus-visible:ring-offset-2 focus-visible:ring-offset-kodo-void"
|
||||
className="flex items-center gap-4 px-4 py-2 text-sm text-kodo-secondary hover:text-white hover:bg-white/5 rounded-xl transition-all group focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-kodo-steel focus-visible:ring-offset-2 focus-visible:ring-offset-kodo-void"
|
||||
>
|
||||
<User className="w-4 h-4" />
|
||||
<span>System.Profile</span>
|
||||
|
|
@ -198,7 +198,7 @@ export function Header(_props: HeaderProps) {
|
|||
<Link
|
||||
to="/settings"
|
||||
onClick={() => setIsUserMenuOpen(false)}
|
||||
className="flex items-center gap-3 px-3 py-2 text-sm text-kodo-secondary hover:text-white hover:bg-white/5 rounded-xl transition-all group focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-kodo-steel focus-visible:ring-offset-2 focus-visible:ring-offset-kodo-void"
|
||||
className="flex items-center gap-4 px-4 py-2 text-sm text-kodo-secondary hover:text-white hover:bg-white/5 rounded-xl transition-all group focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-kodo-steel focus-visible:ring-offset-2 focus-visible:ring-offset-kodo-void"
|
||||
>
|
||||
<Settings className="w-4 h-4 group-hover:rotate-45 transition-transform" />
|
||||
<span>Global.Settings</span>
|
||||
|
|
@ -206,7 +206,7 @@ export function Header(_props: HeaderProps) {
|
|||
<div className="h-px bg-white/5 my-2 mx-2" />
|
||||
<button
|
||||
onClick={handleLogout}
|
||||
className="flex items-center gap-3 w-full px-3 py-2 text-sm text-kodo-red/80 hover:text-kodo-red hover:bg-kodo-red/10 rounded-xl transition-all group cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-400 focus-visible:ring-offset-2 focus-visible:ring-offset-kodo-void"
|
||||
className="flex items-center gap-4 w-full px-4 py-2 text-sm text-kodo-red/80 hover:text-kodo-red hover:bg-kodo-red/10 rounded-xl transition-all group cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-400 focus-visible:ring-offset-2 focus-visible:ring-offset-kodo-void"
|
||||
>
|
||||
<LogOut className="w-4 h-4" />
|
||||
<span>Terminate.Session</span>
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ export const Navbar: React.FC<NavbarProps> = ({ onNavigate, onLogout }) => {
|
|||
<Menu className="w-5 h-5" />
|
||||
</Button>
|
||||
<div
|
||||
className="flex items-center gap-3 cursor-pointer"
|
||||
className="flex items-center gap-4 cursor-pointer"
|
||||
onClick={() => onNavigate('dashboard')}
|
||||
>
|
||||
<div className="w-8 h-8 rounded-full bg-gradient-to-br from-kodo-cyan-dim to-kodo-cyan flex items-center justify-center shadow-lg shadow-kodo-steel/20">
|
||||
|
|
@ -118,9 +118,9 @@ export const Navbar: React.FC<NavbarProps> = ({ onNavigate, onLogout }) => {
|
|||
</div>
|
||||
|
||||
{/* Right Actions */}
|
||||
<div className="flex items-center gap-3 md:gap-6">
|
||||
<div className="flex items-center gap-4 md:gap-6">
|
||||
{/* Pro Badge */}
|
||||
<div className="hidden xl:flex items-center gap-3 border-r border-kodo-steel/50 pr-6">
|
||||
<div className="hidden xl:flex items-center gap-4 border-r border-kodo-steel/50 pr-6">
|
||||
<div className="text-right">
|
||||
<div className="text-xs text-kodo-primary font-medium">
|
||||
Pro Plan
|
||||
|
|
@ -187,7 +187,7 @@ export const Navbar: React.FC<NavbarProps> = ({ onNavigate, onLogout }) => {
|
|||
|
||||
{showUserMenu && (
|
||||
<div className="absolute top-full right-0 mt-4 w-56 bg-kodo-graphite border border-kodo-steel rounded-xl shadow-2xl overflow-hidden animate-fadeIn origin-top-right ring-1 ring-white/5 flex flex-col">
|
||||
<div className="px-4 py-3 border-b border-kodo-steel/30 mb-1 bg-kodo-ink/50">
|
||||
<div className="px-4 py-4 border-b border-kodo-steel/30 mb-1 bg-kodo-ink/50">
|
||||
<p className="text-sm font-bold text-white">Cyber_Producer</p>
|
||||
<p className="text-xs text-kodo-content-dim">Pro Plan</p>
|
||||
</div>
|
||||
|
|
@ -196,7 +196,7 @@ export const Navbar: React.FC<NavbarProps> = ({ onNavigate, onLogout }) => {
|
|||
onNavigate('profile');
|
||||
setShowUserMenu(false);
|
||||
}}
|
||||
className="w-full text-left px-4 py-2.5 text-sm text-kodo-text-main hover:bg-white/5 hover:text-white flex items-center gap-3 transition-colors"
|
||||
className="w-full text-left px-4 py-2.5 text-sm text-kodo-text-main hover:bg-white/5 hover:text-white flex items-center gap-4 transition-colors"
|
||||
>
|
||||
<User className="w-4 h-4" /> My Profile
|
||||
</button>
|
||||
|
|
@ -205,7 +205,7 @@ export const Navbar: React.FC<NavbarProps> = ({ onNavigate, onLogout }) => {
|
|||
onNavigate('studio/go-live');
|
||||
setShowUserMenu(false);
|
||||
}}
|
||||
className="w-full text-left px-4 py-2.5 text-sm text-kodo-text-main hover:bg-white/5 hover:text-white flex items-center gap-3 transition-colors"
|
||||
className="w-full text-left px-4 py-2.5 text-sm text-kodo-text-main hover:bg-white/5 hover:text-white flex items-center gap-4 transition-colors"
|
||||
>
|
||||
<Zap className="w-4 h-4 text-kodo-red" /> Go Live
|
||||
</button>
|
||||
|
|
@ -214,7 +214,7 @@ export const Navbar: React.FC<NavbarProps> = ({ onNavigate, onLogout }) => {
|
|||
onNavigate('purchases');
|
||||
setShowUserMenu(false);
|
||||
}}
|
||||
className="w-full text-left px-4 py-2.5 text-sm text-kodo-text-main hover:bg-white/5 hover:text-white flex items-center gap-3 transition-colors"
|
||||
className="w-full text-left px-4 py-2.5 text-sm text-kodo-text-main hover:bg-white/5 hover:text-white flex items-center gap-4 transition-colors"
|
||||
>
|
||||
<ShoppingCart className="w-4 h-4" /> Purchases
|
||||
</button>
|
||||
|
|
@ -223,7 +223,7 @@ export const Navbar: React.FC<NavbarProps> = ({ onNavigate, onLogout }) => {
|
|||
onNavigate('settings');
|
||||
setShowUserMenu(false);
|
||||
}}
|
||||
className="w-full text-left px-4 py-2.5 text-sm text-kodo-text-main hover:bg-white/5 hover:text-white flex items-center gap-3 transition-colors"
|
||||
className="w-full text-left px-4 py-2.5 text-sm text-kodo-text-main hover:bg-white/5 hover:text-white flex items-center gap-4 transition-colors"
|
||||
>
|
||||
<Settings className="w-4 h-4" /> Settings
|
||||
</button>
|
||||
|
|
@ -233,7 +233,7 @@ export const Navbar: React.FC<NavbarProps> = ({ onNavigate, onLogout }) => {
|
|||
onLogout();
|
||||
setShowUserMenu(false);
|
||||
}}
|
||||
className="w-full text-left px-4 py-2.5 text-sm text-kodo-red hover:bg-kodo-red/10 rounded-lg flex items-center gap-3 transition-colors"
|
||||
className="w-full text-left px-4 py-2.5 text-sm text-kodo-red hover:bg-kodo-red/10 rounded-lg flex items-center gap-4 transition-colors"
|
||||
>
|
||||
<LogOut className="w-4 h-4" /> Sign Out
|
||||
</button>
|
||||
|
|
|
|||
|
|
@ -212,7 +212,7 @@ export const Sidebar: React.FC<SidebarProps> = ({
|
|||
style={{ zIndex: 'var(--z-fixed)' }}
|
||||
>
|
||||
{/* Hub Header Integration */}
|
||||
<div className="p-6 border-b border-white/5 flex items-center gap-3">
|
||||
<div className="p-6 border-b border-white/5 flex items-center gap-4">
|
||||
<div className="w-8 h-8 rounded bg-kodo-steel/20 flex items-center justify-center border border-kodo-steel/30 animate-pulse-glow">
|
||||
<Cpu className="w-5 h-5 text-kodo-steel" />
|
||||
</div>
|
||||
|
|
@ -231,11 +231,11 @@ export const Sidebar: React.FC<SidebarProps> = ({
|
|||
)}
|
||||
</div>
|
||||
|
||||
<div className="flex-1 overflow-y-auto custom-scrollbar p-3 space-y-6 mt-4">
|
||||
<div className="flex-1 overflow-y-auto custom-scrollbar p-4 space-y-6 mt-4">
|
||||
{navItems.map((group, idx) => (
|
||||
<div key={idx} className="mb-4">
|
||||
{sidebarOpen && (
|
||||
<h3 className="text-[9px] font-mono font-bold text-kodo-steel/60 uppercase tracking-[0.2em] mb-3 px-3 flex items-center gap-2 animate-fadeIn">
|
||||
<h3 className="text-[9px] font-mono font-bold text-kodo-steel/60 uppercase tracking-[0.2em] mb-3 px-4 flex items-center gap-2 animate-fadeIn">
|
||||
{group.section}
|
||||
</h3>
|
||||
)}
|
||||
|
|
@ -268,7 +268,7 @@ export const Sidebar: React.FC<SidebarProps> = ({
|
|||
<div className="absolute left-0 top-1 bottom-1 w-1 bg-kodo-cyan rounded-full shadow-[0_0_10px_rgba(102,252,241,0.5)]" />
|
||||
)}
|
||||
|
||||
<div className="flex items-center gap-3 relative z-10 w-full">
|
||||
<div className="flex items-center gap-4 relative z-10 w-full">
|
||||
<span
|
||||
className={cn(
|
||||
'transition-colors duration-200',
|
||||
|
|
@ -299,7 +299,7 @@ export const Sidebar: React.FC<SidebarProps> = ({
|
|||
))}
|
||||
</div>
|
||||
|
||||
<div className="p-3 border-t border-white/5 bg-white/2">
|
||||
<div className="p-4 border-t border-white/5 bg-white/2">
|
||||
<Link
|
||||
to="/settings"
|
||||
onClick={() => {
|
||||
|
|
@ -309,7 +309,7 @@ export const Sidebar: React.FC<SidebarProps> = ({
|
|||
}
|
||||
}}
|
||||
className={cn(
|
||||
'w-full flex items-center gap-3 px-4 py-2.5 text-sm rounded-xl transition-all',
|
||||
'w-full flex items-center gap-4 px-4 py-2.5 text-sm rounded-xl transition-all',
|
||||
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-kodo-cyan focus-visible:ring-offset-2 focus-visible:ring-offset-kodo-void',
|
||||
activeView === 'settings'
|
||||
? 'glass-hud-active text-kodo-cyan'
|
||||
|
|
@ -321,7 +321,7 @@ export const Sidebar: React.FC<SidebarProps> = ({
|
|||
</Link>
|
||||
<button
|
||||
onClick={handleLogout}
|
||||
className="w-full flex items-center gap-3 px-4 py-2.5 text-kodo-red/80 hover:text-kodo-red hover:bg-kodo-red/10 rounded-xl transition-all text-sm mt-1 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-400 focus-visible:ring-offset-2 focus-visible:ring-offset-kodo-void"
|
||||
className="w-full flex items-center gap-4 px-4 py-2.5 text-kodo-red/80 hover:text-kodo-red hover:bg-kodo-red/10 rounded-xl transition-all text-sm mt-1 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-400 focus-visible:ring-offset-2 focus-visible:ring-offset-kodo-void"
|
||||
>
|
||||
<LogOut className="w-4 h-4" />
|
||||
{sidebarOpen && (
|
||||
|
|
|
|||
|
|
@ -111,7 +111,7 @@ export const AutoMetadataDetectionModal: React.FC<
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex gap-3 w-full">
|
||||
<div className="flex gap-4 w-full">
|
||||
<Button variant="ghost" onClick={onClose} className="flex-1">
|
||||
Discard
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ export const WatermarkSettingsModal: React.FC<WatermarkSettingsModalProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="mt-8 pt-4 border-t border-kodo-steel flex gap-3">
|
||||
<div className="mt-8 pt-4 border-t border-kodo-steel flex gap-4">
|
||||
<Button variant="ghost" onClick={onClose} className="flex-1">
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ export const CreatePlaylistModal: React.FC<CreatePlaylistModalProps> = ({
|
|||
/>
|
||||
|
||||
<textarea
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-3 text-white focus:border-kodo-steel outline-none text-sm resize-none h-24"
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-4 text-white focus:border-kodo-steel outline-none text-sm resize-none h-24"
|
||||
placeholder="Description (Optional)"
|
||||
value={description}
|
||||
onChange={(e) => setDescription(e.target.value)}
|
||||
|
|
@ -68,7 +68,7 @@ export const CreatePlaylistModal: React.FC<CreatePlaylistModalProps> = ({
|
|||
className="flex items-center justify-between p-2 rounded hover:bg-white/5 cursor-pointer"
|
||||
onClick={() => setIsPublic(!isPublic)}
|
||||
>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-4">
|
||||
{isPublic ? (
|
||||
<Globe className="w-4 h-4 text-kodo-steel" />
|
||||
) : (
|
||||
|
|
@ -98,7 +98,7 @@ export const CreatePlaylistModal: React.FC<CreatePlaylistModalProps> = ({
|
|||
className="flex items-center justify-between p-2 rounded hover:bg-white/5 cursor-pointer"
|
||||
onClick={() => setIsCollaborative(!isCollaborative)}
|
||||
>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-4">
|
||||
<Users
|
||||
className={`w-4 h-4 ${isCollaborative ? 'text-kodo-lime' : 'text-kodo-content-dim'}`}
|
||||
/>
|
||||
|
|
@ -121,7 +121,7 @@ export const CreatePlaylistModal: React.FC<CreatePlaylistModalProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ export const EditPlaylistModal: React.FC<EditPlaylistModalProps> = ({
|
|||
<p className="text-sm text-kodo-content-dim mb-6">
|
||||
This action cannot be undone.
|
||||
</p>
|
||||
<div className="flex gap-3 justify-center">
|
||||
<div className="flex gap-4 justify-center">
|
||||
<Button variant="ghost" onClick={() => setShowDeleteConfirm(false)}>
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
@ -103,7 +103,7 @@ export const EditPlaylistModal: React.FC<EditPlaylistModalProps> = ({
|
|||
/>
|
||||
|
||||
<textarea
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-3 text-white focus:border-kodo-steel outline-none text-sm resize-none h-24"
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-4 text-white focus:border-kodo-steel outline-none text-sm resize-none h-24"
|
||||
placeholder="Description"
|
||||
value={description}
|
||||
onChange={(e) => setDescription(e.target.value)}
|
||||
|
|
@ -114,7 +114,7 @@ export const EditPlaylistModal: React.FC<EditPlaylistModalProps> = ({
|
|||
className="flex items-center justify-between p-2 rounded hover:bg-white/5 cursor-pointer"
|
||||
onClick={() => setIsPublic(!isPublic)}
|
||||
>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-4">
|
||||
{isPublic ? (
|
||||
<Globe className="w-4 h-4 text-kodo-steel" />
|
||||
) : (
|
||||
|
|
@ -148,7 +148,7 @@ export const EditPlaylistModal: React.FC<EditPlaylistModalProps> = ({
|
|||
>
|
||||
Delete Playlist
|
||||
</Button>
|
||||
<div className="flex gap-3">
|
||||
<div className="flex gap-4">
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -137,7 +137,7 @@ export const PlaylistDetailView: React.FC<PlaylistDetailViewProps> = ({
|
|||
</span>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-wrap gap-3">
|
||||
<div className="flex flex-wrap gap-4">
|
||||
<Button
|
||||
variant="primary"
|
||||
size="lg"
|
||||
|
|
@ -205,7 +205,7 @@ export const PlaylistDetailView: React.FC<PlaylistDetailViewProps> = ({
|
|||
onClick={() => playTrack(track, tracks)}
|
||||
/>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 min-w-0">
|
||||
<div className="flex items-center gap-4 min-w-0">
|
||||
<img
|
||||
src={track.coverUrl}
|
||||
className="w-10 h-10 rounded object-cover"
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ export const PlaylistsView: React.FC<{
|
|||
</div>
|
||||
|
||||
{loading ? (
|
||||
<div className="flex justify-center py-20">
|
||||
<div className="flex justify-center py-24">
|
||||
<Loader2 className="w-8 h-8 text-kodo-steel animate-spin" />
|
||||
</div>
|
||||
) : (
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ export const QueueView: React.FC = () => {
|
|||
{queue.length} tracks upcoming
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex gap-3">
|
||||
<div className="flex gap-4">
|
||||
<Button
|
||||
variant="ghost"
|
||||
onClick={() => setShowSaveModal(true)}
|
||||
|
|
@ -176,7 +176,7 @@ export const QueueView: React.FC = () => {
|
|||
onDragStart={(e) => handleDragStart(e, i)}
|
||||
onDragOver={(e) => handleDragOver(e, i)}
|
||||
onDragEnd={() => setDraggedIndex(null)}
|
||||
className={`flex items-center gap-4 p-3 bg-kodo-ink rounded-lg border border-transparent hover:border-kodo-steel transition-all group ${draggedIndex === i ? 'opacity-50 border-kodo-cyan' : ''}`}
|
||||
className={`flex items-center gap-4 p-4 bg-kodo-ink rounded-lg border border-transparent hover:border-kodo-steel transition-all group ${draggedIndex === i ? 'opacity-50 border-kodo-cyan' : ''}`}
|
||||
>
|
||||
<div className="text-kodo-content-dim cursor-grab active:cursor-grabbing hover:text-white p-1">
|
||||
<GripVertical className="w-5 h-5" />
|
||||
|
|
|
|||
|
|
@ -49,10 +49,10 @@ export const SaveQueueAsPlaylistModal: React.FC<
|
|||
/>
|
||||
|
||||
<div
|
||||
className="flex items-center justify-between p-3 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel"
|
||||
className="flex items-center justify-between p-4 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel"
|
||||
onClick={() => setIsPublic(!isPublic)}
|
||||
>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-4">
|
||||
{isPublic ? (
|
||||
<Globe className="w-5 h-5 text-kodo-steel" />
|
||||
) : (
|
||||
|
|
@ -77,7 +77,7 @@ export const SaveQueueAsPlaylistModal: React.FC<
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ export const LiveStreamDetailView: React.FC<LiveStreamDetailViewProps> = ({
|
|||
};
|
||||
|
||||
return (
|
||||
<div className="flex flex-col h-[calc(100vh-6rem)] -m-6 md:-m-10 bg-black animate-fadeIn overflow-hidden">
|
||||
<div className="flex flex-col h-[calc(100vh-6rem)] -m-6 md:-m-12 bg-black animate-fadeIn overflow-hidden">
|
||||
{/* 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
|
||||
|
|
@ -121,7 +121,7 @@ export const LiveStreamDetailView: React.FC<LiveStreamDetailViewProps> = ({
|
|||
<h1 className="text-3xl font-bold text-white mb-1">
|
||||
{MOCK_STREAM.title}
|
||||
</h1>
|
||||
<div className="flex items-center gap-3 text-sm">
|
||||
<div className="flex items-center gap-4 text-sm">
|
||||
<span className="text-kodo-steel font-bold">
|
||||
{MOCK_STREAM.streamer}
|
||||
</span>
|
||||
|
|
@ -135,7 +135,7 @@ export const LiveStreamDetailView: React.FC<LiveStreamDetailViewProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex gap-3">
|
||||
<div className="flex gap-4">
|
||||
<Button
|
||||
variant="secondary"
|
||||
className="bg-black/50 backdrop-blur border-white/20 text-white"
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ export const TipStreamerModal: React.FC<TipStreamerModalProps> = ({
|
|||
Message (Optional)
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-kodo-ink border border-kodo-steel rounded p-3 text-white focus:border-kodo-gold outline-none text-sm resize-none h-24"
|
||||
className="w-full bg-kodo-ink border border-kodo-steel rounded p-4 text-white focus:border-kodo-gold outline-none text-sm resize-none h-24"
|
||||
placeholder={`Say something nice to ${streamerName}...`}
|
||||
value={message}
|
||||
onChange={(e) => setMessage(e.target.value)}
|
||||
|
|
@ -117,7 +117,7 @@ export const TipStreamerModal: React.FC<TipStreamerModalProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="p-4 border-t border-kodo-gold/30 bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-gold/30 bg-kodo-ink flex justify-end gap-4">
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ export const ProductCard: React.FC<ProductCardProps> = ({
|
|||
</div>
|
||||
|
||||
{/* Details */}
|
||||
<div className="p-5">
|
||||
<div className="p-6">
|
||||
<div className="flex justify-between items-start mb-2">
|
||||
<h3 className="font-bold text-white text-base truncate pr-2 group-hover:text-white transition-colors">
|
||||
{product.title}
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ export const ProductDetailView: React.FC<ProductDetailViewProps> = ({
|
|||
<div className="absolute inset-0 bg-black/20 group-hover:bg-transparent transition-colors"></div>
|
||||
|
||||
{/* Audio Preview Overlay */}
|
||||
<div className="absolute bottom-6 left-6 right-6 bg-black/60 backdrop-blur-md rounded-xl p-3 flex items-center gap-4 border border-white/10">
|
||||
<div className="absolute bottom-6 left-6 right-6 bg-black/60 backdrop-blur-md rounded-xl p-4 flex items-center gap-4 border border-white/10">
|
||||
<button
|
||||
onClick={() => setIsPlaying(!isPlaying)}
|
||||
className="w-10 h-10 rounded-full bg-kodo-cyan text-black flex items-center justify-center hover:scale-110 transition-transform"
|
||||
|
|
@ -151,25 +151,25 @@ export const ProductDetailView: React.FC<ProductDetailViewProps> = ({
|
|||
|
||||
{/* Metadata Grid */}
|
||||
<div className="grid grid-cols-2 md:grid-cols-4 gap-4 mb-8">
|
||||
<div className="bg-kodo-ink p-3 rounded border border-kodo-steel/50">
|
||||
<div className="bg-kodo-ink p-4 rounded border border-kodo-steel/50">
|
||||
<div className="text-[10px] text-kodo-content-dim uppercase font-bold">
|
||||
BPM
|
||||
</div>
|
||||
<div className="text-white font-mono">{product.bpm || '-'}</div>
|
||||
</div>
|
||||
<div className="bg-kodo-ink p-3 rounded border border-kodo-steel/50">
|
||||
<div className="bg-kodo-ink p-4 rounded border border-kodo-steel/50">
|
||||
<div className="text-[10px] text-kodo-content-dim uppercase font-bold">
|
||||
Key
|
||||
</div>
|
||||
<div className="text-white font-mono">{product.key || '-'}</div>
|
||||
</div>
|
||||
<div className="bg-kodo-ink p-3 rounded border border-kodo-steel/50">
|
||||
<div className="bg-kodo-ink p-4 rounded border border-kodo-steel/50">
|
||||
<div className="text-[10px] text-kodo-content-dim uppercase font-bold">
|
||||
Genre
|
||||
</div>
|
||||
<div className="text-white truncate">{product.genre || '-'}</div>
|
||||
</div>
|
||||
<div className="bg-kodo-ink p-3 rounded border border-kodo-steel/50">
|
||||
<div className="bg-kodo-ink p-4 rounded border border-kodo-steel/50">
|
||||
<div className="text-[10px] text-kodo-content-dim uppercase font-bold">
|
||||
Size
|
||||
</div>
|
||||
|
|
@ -306,7 +306,7 @@ export const ProductDetailView: React.FC<ProductDetailViewProps> = ({
|
|||
{similarProducts.slice(0, 3).map((p) => (
|
||||
<div
|
||||
key={p.id}
|
||||
className="flex gap-3 cursor-pointer group"
|
||||
className="flex gap-4 cursor-pointer group"
|
||||
onClick={() => addToast('Navigating to product...')}
|
||||
>
|
||||
<img
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ export const LicenceDetailsModal: React.FC<LicenceDetailsModalProps> = ({
|
|||
{license.features.map((feat, i) => (
|
||||
<li
|
||||
key={i}
|
||||
className="flex items-start gap-3 text-sm text-kodo-text-main"
|
||||
className="flex items-start gap-4 text-sm text-kodo-text-main"
|
||||
>
|
||||
<div className="mt-0.5 bg-kodo-lime/10 p-0.5 rounded-full">
|
||||
<Check className="w-3 h-3 text-kodo-lime" />
|
||||
|
|
@ -70,13 +70,13 @@ export const LicenceDetailsModal: React.FC<LicenceDetailsModalProps> = ({
|
|||
Restrictions
|
||||
</h4>
|
||||
<ul className="space-y-2">
|
||||
<li className="flex items-start gap-3 text-sm text-kodo-content-dim">
|
||||
<li className="flex items-start gap-4 text-sm text-kodo-content-dim">
|
||||
<div className="mt-0.5 bg-kodo-red/10 p-0.5 rounded-full">
|
||||
<XCircle className="w-3 h-3 text-kodo-red" />
|
||||
</div>
|
||||
Do not resell or redistribute as a sample pack.
|
||||
</li>
|
||||
<li className="flex items-start gap-3 text-sm text-kodo-content-dim">
|
||||
<li className="flex items-start gap-4 text-sm text-kodo-content-dim">
|
||||
<div className="mt-0.5 bg-kodo-red/10 p-0.5 rounded-full">
|
||||
<XCircle className="w-3 h-3 text-kodo-red" />
|
||||
</div>
|
||||
|
|
@ -95,7 +95,7 @@ export const LicenceDetailsModal: React.FC<LicenceDetailsModalProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
Close
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ export const ReviewProductModal: React.FC<ReviewProductModalProps> = ({
|
|||
Your Review
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-kodo-void border border-kodo-steel rounded-lg p-3 text-white focus:border-kodo-steel outline-none text-sm resize-none h-32"
|
||||
className="w-full bg-kodo-void border border-kodo-steel rounded-lg p-4 text-white focus:border-kodo-steel outline-none text-sm resize-none h-32"
|
||||
placeholder="Share your thoughts on the quality, usability, and value..."
|
||||
value={comment}
|
||||
onChange={(e) => setComment(e.target.value)}
|
||||
|
|
@ -85,7 +85,7 @@ export const ReviewProductModal: React.FC<ReviewProductModalProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -110,15 +110,15 @@ export const CreatorModal: React.FC<CreatorModalProps> = ({
|
|||
Visibility
|
||||
</label>
|
||||
<div className="grid grid-cols-3 gap-2">
|
||||
<Button variant="outline" className="p-3 flex flex-col items-center justify-center gap-2 text-kodo-steel bg-kodo-steel/10 border-kodo-steel">
|
||||
<Button variant="outline" className="p-4 flex flex-col items-center justify-center gap-2 text-kodo-steel bg-kodo-steel/10 border-kodo-steel">
|
||||
<Tag className="w-5 h-5" />{' '}
|
||||
<span className="text-xs font-bold">Public</span>
|
||||
</Button>
|
||||
<Button variant="outline" className="p-3 flex flex-col items-center justify-center gap-2">
|
||||
<Button variant="outline" className="p-4 flex flex-col items-center justify-center gap-2">
|
||||
<Lock className="w-5 h-5" />{' '}
|
||||
<span className="text-xs font-bold">Private</span>
|
||||
</Button>
|
||||
<Button variant="outline" className="p-3 flex flex-col items-center justify-center gap-2">
|
||||
<Button variant="outline" className="p-4 flex flex-col items-center justify-center gap-2">
|
||||
<DollarSign className="w-5 h-5" />{' '}
|
||||
<span className="text-xs font-bold">Premium</span>
|
||||
</Button>
|
||||
|
|
@ -129,7 +129,7 @@ export const CreatorModal: React.FC<CreatorModalProps> = ({
|
|||
)}
|
||||
|
||||
{activeTab === 'product' && (
|
||||
<div className="text-center py-10">
|
||||
<div className="text-center py-12">
|
||||
<h3 className="text-xl font-bold text-white mb-2">
|
||||
Sell Your Sounds
|
||||
</h3>
|
||||
|
|
|
|||
|
|
@ -140,7 +140,7 @@ export function Tabs({
|
|||
list: 'gap-1 bg-muted p-1 rounded-md',
|
||||
tab: (isActive: boolean) =>
|
||||
cn(
|
||||
'px-3 py-1.5 text-sm font-medium rounded-sm transition-colors',
|
||||
'px-4 py-1.5 text-sm font-medium rounded-sm transition-colors',
|
||||
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
|
||||
isActive
|
||||
? 'bg-background text-foreground shadow-sm'
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ export const NotificationBell: React.FC<NotificationBellProps> = ({
|
|||
|
||||
<div className="flex-1 overflow-y-auto custom-scrollbar p-2 space-y-1">
|
||||
{notifications.length === 0 ? (
|
||||
<div className="text-center py-10 text-kodo-content-dim">
|
||||
<div className="text-center py-12 text-kodo-content-dim">
|
||||
<Bell className="w-8 h-8 mx-auto mb-2 opacity-50" />
|
||||
<p className="text-sm">No new notifications</p>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -318,7 +318,7 @@ export function NotificationMenu({
|
|||
|
||||
{/* Footer with link to all notifications */}
|
||||
{notifications.length > 0 && (
|
||||
<div className="p-3 border-t">
|
||||
<div className="p-4 border-t">
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
|
|
|
|||
|
|
@ -202,10 +202,10 @@ export function AudioPlayer({ className: _className }: AudioPlayerProps = {}) {
|
|||
<>
|
||||
<audio ref={audioRef} preload="metadata" />
|
||||
<div className="fixed bottom-0 left-0 right-0 bg-background border-t border-border shadow-lg z-50">
|
||||
<div className="container mx-auto px-4 py-3">
|
||||
<div className="container mx-auto px-4 py-4">
|
||||
<div className="flex items-center gap-4">
|
||||
{/* Track Info */}
|
||||
<div className="flex items-center gap-3 flex-1 min-w-0">
|
||||
<div className="flex items-center gap-4 flex-1 min-w-0">
|
||||
{currentTrack.cover && (
|
||||
<img
|
||||
src={currentTrack.cover}
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ export const FullPlayer: React.FC<FullPlayerProps> = ({ onClose }) => {
|
|||
<Minimize2 className="w-6 h-6" />
|
||||
</Button>
|
||||
<div className="flex gap-2">
|
||||
<span className="px-3 py-1 bg-white/10 rounded-full text-xs font-bold text-white tracking-widest border border-white/20 backdrop-blur">
|
||||
<span className="px-4 py-1 bg-white/10 rounded-full text-xs font-bold text-white tracking-widest border border-white/20 backdrop-blur">
|
||||
LOSSLESS
|
||||
</span>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ export const LyricsPanel: React.FC = () => {
|
|||
</div>
|
||||
<div
|
||||
ref={scrollRef}
|
||||
className="flex-1 overflow-y-auto custom-scrollbar px-4 space-y-6 text-center mask-image-linear-to-b py-20"
|
||||
className="flex-1 overflow-y-auto custom-scrollbar px-4 space-y-6 text-center mask-image-linear-to-b py-24"
|
||||
>
|
||||
{currentTrack.lyrics.map(
|
||||
(line: { time: number; text: string }, i: number) => {
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ export const MiniPlayer: React.FC<MiniPlayerProps> = ({
|
|||
<div className="flex flex-col items-center flex-1 max-w-2xl px-4">
|
||||
<PlayerControls layout="compact" />
|
||||
|
||||
<div className="w-full flex items-center gap-3 group mt-1">
|
||||
<div className="w-full flex items-center gap-4 group mt-1">
|
||||
<span className="text-[10px] font-mono text-kodo-content-dim w-8 text-right">
|
||||
{formatTime(currentTime)}
|
||||
</span>
|
||||
|
|
@ -101,7 +101,7 @@ export const MiniPlayer: React.FC<MiniPlayerProps> = ({
|
|||
</div>
|
||||
|
||||
{/* 3. Right Actions */}
|
||||
<div className="flex items-center justify-end gap-3 w-[30%] min-w-[200px]">
|
||||
<div className="flex items-center justify-end gap-4 w-[30%] min-w-[200px]">
|
||||
<button
|
||||
className="text-kodo-content-dim hover:text-kodo-magenta transition-colors hidden xl:block"
|
||||
title="Lyrics"
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ export const PlaybackSpeedModal: React.FC<PlaybackSpeedModalProps> = ({
|
|||
</div>
|
||||
|
||||
{/* Pitch Correction */}
|
||||
<div className="flex items-center justify-between p-3 bg-kodo-ink rounded-lg border border-kodo-steel/50">
|
||||
<div className="flex items-center justify-between p-4 bg-kodo-ink rounded-lg border border-kodo-steel/50">
|
||||
<div className="flex flex-col">
|
||||
<span className="text-sm font-bold text-white">
|
||||
Pitch Correction
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ export const PlayerControls: React.FC<PlayerControlsProps> = ({
|
|||
</div>
|
||||
|
||||
{/* 3. Volume & Speed */}
|
||||
<div className="flex items-center gap-3 relative">
|
||||
<div className="flex items-center gap-4 relative">
|
||||
{layout === 'full' && (
|
||||
<>
|
||||
<button
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ export function QueuePanel({ onClose }: QueuePanelProps) {
|
|||
{queue.map((track, index) => (
|
||||
<div
|
||||
key={`${track.id}-${index}`}
|
||||
className={`flex items-center gap-3 p-2 rounded hover:bg-accent ${
|
||||
className={`flex items-center gap-4 p-2 rounded hover:bg-accent ${
|
||||
index === currentIndex ? 'bg-accent' : ''
|
||||
}`}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ export const VisualizerSettingsModal: React.FC<
|
|||
</button>
|
||||
</div>
|
||||
|
||||
<div className="p-5 space-y-5">
|
||||
<div className="p-6 space-y-6">
|
||||
{/* Mode */}
|
||||
<div>
|
||||
<label className="block text-xs font-bold text-kodo-content-dim uppercase mb-2">
|
||||
|
|
@ -70,7 +70,7 @@ export const VisualizerSettingsModal: React.FC<
|
|||
<label className="block text-xs font-bold text-kodo-content-dim uppercase mb-2">
|
||||
Accent Color
|
||||
</label>
|
||||
<div className="flex gap-3">
|
||||
<div className="flex gap-4">
|
||||
{colors.map((c) => (
|
||||
<div
|
||||
key={c}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ export function PWAInstallBanner() {
|
|||
return (
|
||||
<div
|
||||
className={cn(
|
||||
'fixed bottom-8 right-8 z-50 w-80 glass-hud rounded-2xl border-white/10 p-5 shadow-2xl animate-slideInRight hud-corner group overflow-hidden',
|
||||
'fixed bottom-8 right-8 z-50 w-80 glass-hud rounded-2xl border-white/10 p-6 shadow-2xl animate-slideInRight hud-corner group overflow-hidden',
|
||||
'before:absolute before:inset-0 before:bg-gradient-to-br before:from-kodo-cyan/5 before:to-transparent before:opacity-0 group-hover:before:opacity-100 before:transition-opacity',
|
||||
)}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -338,7 +338,7 @@ export function Search({
|
|||
type="button"
|
||||
onClick={() => handleHistoryItemClick(item)}
|
||||
className={cn(
|
||||
'w-full px-3 py-2 text-left text-sm hover:bg-accent',
|
||||
'w-full px-4 py-2 text-left text-sm hover:bg-accent',
|
||||
'flex items-center gap-2',
|
||||
activeIndex === index && 'bg-accent',
|
||||
)}
|
||||
|
|
@ -368,8 +368,8 @@ export function Search({
|
|||
type="button"
|
||||
onClick={() => handleResultSelect(result)}
|
||||
className={cn(
|
||||
'w-full px-3 py-2 text-left text-sm hover:bg-accent',
|
||||
'flex items-center gap-3',
|
||||
'w-full px-4 py-2 text-left text-sm hover:bg-accent',
|
||||
'flex items-center gap-4',
|
||||
activeIndex === itemIndex && 'bg-accent',
|
||||
)}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ export const SearchBar: React.FC<SearchBarProps> = ({
|
|||
<div ref={wrapperRef} className={`relative w-full ${className}`}>
|
||||
<form onSubmit={handleSubmit} className="relative z-20">
|
||||
<div
|
||||
className={`flex items-center bg-kodo-ink border rounded-xl px-4 py-3 transition-all ${isFocused ? 'border-kodo-cyan shadow-neon-cyan/10 ring-1 ring-kodo-cyan/20' : 'border-kodo-steel'}`}
|
||||
className={`flex items-center bg-kodo-ink border rounded-xl px-4 py-4 transition-all ${isFocused ? 'border-kodo-cyan shadow-neon-cyan/10 ring-1 ring-kodo-cyan/20' : 'border-kodo-steel'}`}
|
||||
>
|
||||
<Search
|
||||
className={`w-5 h-5 mr-3 transition-colors ${isFocused ? 'text-kodo-cyan' : 'text-kodo-content-dim'}`}
|
||||
|
|
@ -129,7 +129,7 @@ export const SearchBar: React.FC<SearchBarProps> = ({
|
|||
{filteredSuggestions.map((item, i) => (
|
||||
<div
|
||||
key={i}
|
||||
className="px-4 py-2 hover:bg-white/5 cursor-pointer flex items-center gap-3 transition-colors"
|
||||
className="px-4 py-2 hover:bg-white/5 cursor-pointer flex items-center gap-4 transition-colors"
|
||||
onClick={() => handleSuggestionClick(item.label)}
|
||||
>
|
||||
<div className="w-8 h-8 rounded bg-kodo-slate flex items-center justify-center text-kodo-content-dim">
|
||||
|
|
@ -171,7 +171,7 @@ export const SearchBar: React.FC<SearchBarProps> = ({
|
|||
className="px-4 py-2 hover:bg-white/5 cursor-pointer flex items-center justify-between group transition-colors"
|
||||
onClick={() => handleSuggestionClick(term)}
|
||||
>
|
||||
<div className="flex items-center gap-3 text-kodo-text-main group-hover:text-white">
|
||||
<div className="flex items-center gap-4 text-kodo-text-main group-hover:text-white">
|
||||
<Clock className="w-4 h-4 text-kodo-content-dim" />
|
||||
<span className="text-sm">{term}</span>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ export const CreateProductView: React.FC = () => {
|
|||
Upload and monetize your sound assets.
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex gap-3">
|
||||
<div className="flex gap-4">
|
||||
<Button variant="ghost" onClick={() => addToast('Draft saved')}>
|
||||
<Save className="w-4 h-4 mr-2" /> Save Draft
|
||||
</Button>
|
||||
|
|
@ -140,7 +140,7 @@ export const CreateProductView: React.FC = () => {
|
|||
Description
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-3 text-white focus:border-kodo-steel outline-none min-h-[120px]"
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-4 text-white focus:border-kodo-steel outline-none min-h-[120px]"
|
||||
placeholder="Describe your sound pack..."
|
||||
value={description}
|
||||
onChange={(e) => setDescription(e.target.value)}
|
||||
|
|
@ -153,7 +153,7 @@ export const CreateProductView: React.FC = () => {
|
|||
Category
|
||||
</label>
|
||||
<select
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-3 text-white focus:border-kodo-steel outline-none"
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-4 text-white focus:border-kodo-steel outline-none"
|
||||
value={category}
|
||||
onChange={(e) => setCategory(e.target.value)}
|
||||
>
|
||||
|
|
@ -189,7 +189,7 @@ export const CreateProductView: React.FC = () => {
|
|||
<label className="block text-sm font-medium text-kodo-content-dim mb-2">
|
||||
Format
|
||||
</label>
|
||||
<div className="p-3 bg-kodo-ink border border-kodo-steel rounded-lg text-kodo-content-dim text-sm">
|
||||
<div className="p-4 bg-kodo-ink border border-kodo-steel rounded-lg text-kodo-content-dim text-sm">
|
||||
WAV 24-bit
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -209,7 +209,7 @@ export const CreateProductView: React.FC = () => {
|
|||
className={`p-4 rounded-xl border transition-all ${lic.enabled ? 'bg-kodo-ink border-kodo-cyan/30' : 'bg-kodo-ink/30 border-kodo-steel opacity-60'}`}
|
||||
>
|
||||
<div className="flex items-center justify-between mb-4">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-4">
|
||||
<div
|
||||
onClick={() =>
|
||||
updateLicense(lic.type, 'enabled', !lic.enabled)
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ export const SellerDashboardView: React.FC<SellerDashboardProps> = ({
|
|||
|
||||
if (loading)
|
||||
return (
|
||||
<div className="flex justify-center py-20">
|
||||
<div className="flex justify-center py-24">
|
||||
<Loader2 className="w-10 h-10 text-kodo-steel animate-spin" />
|
||||
</div>
|
||||
);
|
||||
|
|
@ -76,7 +76,7 @@ export const SellerDashboardView: React.FC<SellerDashboardProps> = ({
|
|||
Manage your products, sales, and analytics.
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex gap-3">
|
||||
<div className="flex gap-4">
|
||||
<Button
|
||||
variant="gaming"
|
||||
icon={<Zap className="w-4 h-4" />}
|
||||
|
|
@ -173,7 +173,7 @@ export const SellerDashboardView: React.FC<SellerDashboardProps> = ({
|
|||
{products.map((product, i) => (
|
||||
<div
|
||||
key={product.id}
|
||||
className="flex items-center gap-4 p-3 bg-kodo-ink rounded-lg border border-transparent hover:border-kodo-steel transition-all"
|
||||
className="flex items-center gap-4 p-4 bg-kodo-ink rounded-lg border border-transparent hover:border-kodo-steel transition-all"
|
||||
>
|
||||
<div className="w-8 text-center font-mono text-kodo-content-dim">
|
||||
{i + 1}
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ export const FlashSaleModal: React.FC<FlashSaleModalProps> = ({
|
|||
{products.map((product) => (
|
||||
<div
|
||||
key={product.id}
|
||||
className={`flex items-center gap-3 p-2 rounded cursor-pointer transition-colors ${selectedIds.includes(product.id) ? 'bg-kodo-gold/10 border border-kodo-gold/30' : 'hover:bg-kodo-ink border border-transparent'}`}
|
||||
className={`flex items-center gap-4 p-2 rounded cursor-pointer transition-colors ${selectedIds.includes(product.id) ? 'bg-kodo-gold/10 border border-kodo-gold/30' : 'hover:bg-kodo-ink border border-transparent'}`}
|
||||
onClick={() => toggleProduct(product.id)}
|
||||
>
|
||||
<div
|
||||
|
|
@ -164,7 +164,7 @@ export const FlashSaleModal: React.FC<FlashSaleModalProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ const ToggleRow: React.FC<{
|
|||
}> = ({ label, desc, active, onToggle }) => (
|
||||
<div
|
||||
onClick={onToggle}
|
||||
className="flex items-center justify-between p-3 rounded-lg hover:bg-white/5 cursor-pointer group"
|
||||
className="flex items-center justify-between p-4 rounded-lg hover:bg-white/5 cursor-pointer group"
|
||||
>
|
||||
<div>
|
||||
<div className="text-sm font-bold text-white group-hover:text-white transition-colors">
|
||||
|
|
|
|||
|
|
@ -144,7 +144,7 @@ export const AccountSettings: React.FC = () => {
|
|||
<button
|
||||
key={opt.id}
|
||||
onClick={() => setTheme(opt.id)}
|
||||
className={`flex flex-col items-center justify-center gap-2 p-3 rounded-lg border transition-all ${theme === opt.id ? 'bg-kodo-cyan/10 border-kodo-cyan text-kodo-cyan' : 'bg-kodo-ink border-kodo-steel text-kodo-content-dim hover:text-white'}`}
|
||||
className={`flex flex-col items-center justify-center gap-2 p-4 rounded-lg border transition-all ${theme === opt.id ? 'bg-kodo-cyan/10 border-kodo-cyan text-kodo-cyan' : 'bg-kodo-ink border-kodo-steel text-kodo-content-dim hover:text-white'}`}
|
||||
>
|
||||
{opt.icon}
|
||||
<span className="text-xs font-bold">{opt.label}</span>
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ export const ChangeEmailModal: React.FC<ChangeEmailModalProps> = ({
|
|||
onChange={(e) => setPassword(e.target.value)}
|
||||
/>
|
||||
|
||||
<div className="bg-kodo-ink p-3 rounded text-xs text-kodo-content-dim border border-kodo-steel">
|
||||
<div className="bg-kodo-ink p-4 rounded text-xs text-kodo-content-dim border border-kodo-steel">
|
||||
We will send a verification link to your new email address. You
|
||||
must verify it before the change takes effect.
|
||||
</div>
|
||||
|
|
@ -95,7 +95,7 @@ export const ChangeEmailModal: React.FC<ChangeEmailModalProps> = ({
|
|||
</div>
|
||||
|
||||
{step === 1 && (
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ export const ChangeUsernameModal: React.FC<ChangeUsernameModalProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-kodo-gold/10 border border-kodo-gold/30 p-3 rounded flex gap-3">
|
||||
<div className="bg-kodo-gold/10 border border-kodo-gold/30 p-4 rounded flex gap-4">
|
||||
<AlertCircle className="w-5 h-5 text-kodo-gold flex-shrink-0" />
|
||||
<div className="text-xs text-kodo-text-main">
|
||||
<span className="font-bold text-kodo-gold block mb-1">
|
||||
|
|
@ -104,7 +104,7 @@ export const ChangeUsernameModal: React.FC<ChangeUsernameModalProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ export const DeleteAccountConfirmModal: React.FC<
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
|
||||
<Button variant="ghost" onClick={onClose} disabled={loading}>
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ export const DeleteAccountView: React.FC<DeleteAccountViewProps> = ({
|
|||
</div>
|
||||
|
||||
<div className="space-y-4 mb-8">
|
||||
<label className="flex items-start gap-3 p-4 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel transition-colors">
|
||||
<label className="flex items-start gap-4 p-4 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel transition-colors">
|
||||
<input
|
||||
type="checkbox"
|
||||
className="mt-1 bg-kodo-graphite border-kodo-steel text-kodo-red focus:ring-kodo-red rounded"
|
||||
|
|
@ -89,7 +89,7 @@ export const DeleteAccountView: React.FC<DeleteAccountViewProps> = ({
|
|||
</div>
|
||||
</label>
|
||||
|
||||
<label className="flex items-start gap-3 p-4 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel transition-colors">
|
||||
<label className="flex items-start gap-4 p-4 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel transition-colors">
|
||||
<input
|
||||
type="checkbox"
|
||||
className="mt-1 bg-kodo-graphite border-kodo-steel text-kodo-red focus:ring-kodo-red rounded"
|
||||
|
|
@ -109,7 +109,7 @@ export const DeleteAccountView: React.FC<DeleteAccountViewProps> = ({
|
|||
</div>
|
||||
</label>
|
||||
|
||||
<label className="flex items-start gap-3 p-4 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel transition-colors">
|
||||
<label className="flex items-start gap-4 p-4 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel transition-colors">
|
||||
<input
|
||||
type="checkbox"
|
||||
className="mt-1 bg-kodo-graphite border-kodo-steel text-kodo-red focus:ring-kodo-red rounded"
|
||||
|
|
|
|||
|
|
@ -81,12 +81,12 @@ export const AppearanceSettingsView: React.FC = () => {
|
|||
key={opt.id}
|
||||
onClick={() => setTheme(opt.id)}
|
||||
className={`
|
||||
cursor-pointer p-6 rounded-xl border-2 transition-all flex flex-col items-center gap-3 relative
|
||||
cursor-pointer p-6 rounded-xl border-2 transition-all flex flex-col items-center gap-4 relative
|
||||
${theme === opt.id ? 'border-kodo-cyan bg-kodo-cyan/5' : 'border-kodo-steel bg-kodo-ink hover:border-kodo-steel'}
|
||||
`}
|
||||
>
|
||||
<div
|
||||
className={`p-3 rounded-full ${theme === opt.id ? 'bg-kodo-cyan text-black' : 'bg-kodo-slate text-kodo-content-dim'}`}
|
||||
className={`p-4 rounded-full ${theme === opt.id ? 'bg-kodo-cyan text-black' : 'bg-kodo-slate text-kodo-content-dim'}`}
|
||||
>
|
||||
{opt.icon}
|
||||
</div>
|
||||
|
|
@ -111,7 +111,7 @@ export const AppearanceSettingsView: React.FC = () => {
|
|||
<h3 className="text-lg font-bold text-white mb-6 flex items-center gap-2">
|
||||
<Grid className="w-5 h-5 text-kodo-magenta" /> Density
|
||||
</h3>
|
||||
<div className="space-y-3">
|
||||
<div className="space-y-4">
|
||||
{[
|
||||
{
|
||||
id: 'comfortable',
|
||||
|
|
@ -125,7 +125,7 @@ export const AppearanceSettingsView: React.FC = () => {
|
|||
key={opt.id}
|
||||
onClick={() => setDensity(opt.id as any)}
|
||||
className={`
|
||||
flex items-center gap-4 p-3 rounded-lg border cursor-pointer transition-all
|
||||
flex items-center gap-4 p-4 rounded-lg border cursor-pointer transition-all
|
||||
${density === opt.id ? 'bg-kodo-magenta/10 border-kodo-magenta' : 'bg-kodo-ink border-kodo-steel hover:bg-white/5'}
|
||||
`}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -172,7 +172,7 @@ export const BackupsView: React.FC = () => {
|
|||
</div>
|
||||
|
||||
{autoBackup && (
|
||||
<div className="animate-fadeIn space-y-3 pt-2 border-t border-kodo-steel">
|
||||
<div className="animate-fadeIn space-y-4 pt-2 border-t border-kodo-steel">
|
||||
<div>
|
||||
<label className="block text-xs font-bold text-kodo-content-dim uppercase mb-1">
|
||||
Frequency
|
||||
|
|
@ -208,7 +208,7 @@ export const BackupsView: React.FC = () => {
|
|||
</div>
|
||||
</Card>
|
||||
|
||||
<div className="bg-kodo-orange/10 border border-kodo-orange/30 p-4 rounded-xl flex gap-3">
|
||||
<div className="bg-kodo-orange/10 border border-kodo-orange/30 p-4 rounded-xl flex gap-4">
|
||||
<AlertTriangle className="w-6 h-6 text-kodo-orange flex-shrink-0" />
|
||||
<div>
|
||||
<h4 className="font-bold text-kodo-orange text-sm mb-1">
|
||||
|
|
|
|||
|
|
@ -146,7 +146,7 @@ export const CloudIntegrationView: React.FC = () => {
|
|||
{['Projects', 'Samples', 'Presets'].map((type) => (
|
||||
<span
|
||||
key={type}
|
||||
className="px-3 py-1 bg-kodo-slate rounded text-xs text-white border border-kodo-steel cursor-pointer hover:border-kodo-steel/50"
|
||||
className="px-4 py-1 bg-kodo-slate rounded text-xs text-white border border-kodo-steel cursor-pointer hover:border-kodo-steel/50"
|
||||
>
|
||||
{type}
|
||||
</span>
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ export const DataExportModal: React.FC<DataExportModalProps> = ({
|
|||
Include Data
|
||||
</label>
|
||||
<div className="space-y-2">
|
||||
<label className="flex items-center gap-3 p-3 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel">
|
||||
<label className="flex items-center gap-4 p-4 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={options.profile}
|
||||
|
|
@ -85,7 +85,7 @@ export const DataExportModal: React.FC<DataExportModalProps> = ({
|
|||
Profile & Identity
|
||||
</span>
|
||||
</label>
|
||||
<label className="flex items-center gap-3 p-3 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel">
|
||||
<label className="flex items-center gap-4 p-4 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={options.tracks}
|
||||
|
|
@ -96,7 +96,7 @@ export const DataExportModal: React.FC<DataExportModalProps> = ({
|
|||
Uploaded Content Metadata
|
||||
</span>
|
||||
</label>
|
||||
<label className="flex items-center gap-3 p-3 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel">
|
||||
<label className="flex items-center gap-4 p-4 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={options.activity}
|
||||
|
|
@ -107,7 +107,7 @@ export const DataExportModal: React.FC<DataExportModalProps> = ({
|
|||
Activity Logs & History
|
||||
</span>
|
||||
</label>
|
||||
<label className="flex items-center gap-3 p-3 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel">
|
||||
<label className="flex items-center gap-4 p-4 bg-kodo-ink rounded border border-kodo-steel cursor-pointer hover:border-kodo-steel">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={options.billing}
|
||||
|
|
@ -122,7 +122,7 @@ export const DataExportModal: React.FC<DataExportModalProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ export const DataExportView: React.FC = () => {
|
|||
|
||||
<Card variant="default">
|
||||
<div className="flex items-start gap-4 mb-6">
|
||||
<div className="p-3 bg-kodo-steel/10 rounded-full text-kodo-steel">
|
||||
<div className="p-4 bg-kodo-steel/10 rounded-full text-kodo-steel">
|
||||
<Shield className="w-6 h-6" />
|
||||
</div>
|
||||
<div>
|
||||
|
|
@ -61,7 +61,7 @@ export const DataExportView: React.FC = () => {
|
|||
|
||||
<Card variant="default">
|
||||
<h3 className="font-bold text-white mb-4">Export History</h3>
|
||||
<div className="space-y-3">
|
||||
<div className="space-y-4">
|
||||
{exports.map((item) => (
|
||||
<div
|
||||
key={item.id}
|
||||
|
|
@ -90,7 +90,7 @@ export const DataExportView: React.FC = () => {
|
|||
Download
|
||||
</Button>
|
||||
) : (
|
||||
<span className="text-xs text-kodo-content-dim bg-kodo-graphite px-3 py-1 rounded">
|
||||
<span className="text-xs text-kodo-content-dim bg-kodo-graphite px-4 py-1 rounded">
|
||||
Expired
|
||||
</span>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ export const IntegrationsView: React.FC = () => {
|
|||
{integration.description}
|
||||
</p>
|
||||
|
||||
<div className="flex gap-3 mt-auto">
|
||||
<div className="flex gap-4 mt-auto">
|
||||
{integration.connected ? (
|
||||
<>
|
||||
<Button
|
||||
|
|
|
|||
|
|
@ -231,7 +231,7 @@ export const EditProfile: React.FC = () => {
|
|||
Bio
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-3 text-white focus:border-kodo-steel outline-none min-h-[100px]"
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-4 text-white focus:border-kodo-steel outline-none min-h-[100px]"
|
||||
value={formData.bio}
|
||||
onChange={(e) =>
|
||||
setFormData({ ...formData, bio: e.target.value })
|
||||
|
|
@ -255,7 +255,7 @@ export const EditProfile: React.FC = () => {
|
|||
Gender
|
||||
</label>
|
||||
<select
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-3 text-white focus:border-kodo-steel outline-none"
|
||||
className="w-full bg-kodo-graphite border border-kodo-steel rounded-lg p-4 text-white focus:border-kodo-steel outline-none"
|
||||
value={formData.gender}
|
||||
onChange={(e) =>
|
||||
setFormData({ ...formData, gender: e.target.value })
|
||||
|
|
|
|||
|
|
@ -119,17 +119,17 @@ export const LoginHistory: React.FC = () => {
|
|||
<table className="w-full text-left border-collapse">
|
||||
<thead>
|
||||
<tr className="border-b border-kodo-steel text-kodo-content-dim font-mono text-xs uppercase bg-kodo-ink/30">
|
||||
<th className="p-3">Status</th>
|
||||
<th className="p-3">Date & Time</th>
|
||||
<th className="p-3">Device Info</th>
|
||||
<th className="p-3">IP Address</th>
|
||||
<th className="p-3">Location</th>
|
||||
<th className="p-4">Status</th>
|
||||
<th className="p-4">Date & Time</th>
|
||||
<th className="p-4">Device Info</th>
|
||||
<th className="p-4">IP Address</th>
|
||||
<th className="p-4">Location</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody className="divide-y divide-kodo-steel/30 text-sm">
|
||||
{filteredLogs.map((log) => (
|
||||
<tr key={log.id} className="hover:bg-white/5 transition-colors">
|
||||
<td className="p-3">
|
||||
<td className="p-4">
|
||||
<span
|
||||
className={`px-2 py-1 rounded text-[10px] font-bold uppercase border ${
|
||||
log.status === 'Success'
|
||||
|
|
@ -142,11 +142,11 @@ export const LoginHistory: React.FC = () => {
|
|||
{log.status}
|
||||
</span>
|
||||
</td>
|
||||
<td className="p-3 text-white font-mono text-xs">
|
||||
<td className="p-4 text-white font-mono text-xs">
|
||||
<div>{log.date}</div>
|
||||
<div className="text-kodo-content-dim">{log.time}</div>
|
||||
</td>
|
||||
<td className="p-3">
|
||||
<td className="p-4">
|
||||
<div className="flex items-center gap-2 text-kodo-text-main">
|
||||
{log.device === 'Mobile' ? (
|
||||
<Smartphone className="w-4 h-4" />
|
||||
|
|
@ -156,10 +156,10 @@ export const LoginHistory: React.FC = () => {
|
|||
<span>{log.browser}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td className="p-3 text-kodo-steel font-mono text-xs">
|
||||
<td className="p-4 text-kodo-steel font-mono text-xs">
|
||||
{log.ip}
|
||||
</td>
|
||||
<td className="p-3 text-kodo-content-dim">
|
||||
<td className="p-4 text-kodo-content-dim">
|
||||
<div className="flex items-center gap-1">
|
||||
<Globe className="w-3 h-3" /> {log.location}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ export const SessionManagement: React.FC = () => {
|
|||
>
|
||||
<div className="flex items-start gap-4">
|
||||
<div
|
||||
className={`p-3 rounded-full ${session.is_current ? 'bg-kodo-cyan/10 text-kodo-cyan' : 'bg-kodo-slate text-kodo-content-dim'}`}
|
||||
className={`p-4 rounded-full ${session.is_current ? 'bg-kodo-cyan/10 text-kodo-cyan' : 'bg-kodo-slate text-kodo-content-dim'}`}
|
||||
>
|
||||
{isMobile ? (
|
||||
<Smartphone className="w-6 h-6" />
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ export const TwoFactorSetup: React.FC<TwoFactorSetupProps> = ({
|
|||
|
||||
<div className="border-t border-kodo-steel pt-6">
|
||||
<h4 className="font-bold text-white mb-4">Verify Configuration</h4>
|
||||
<div className="flex gap-3">
|
||||
<div className="flex gap-4">
|
||||
<Input
|
||||
placeholder="Enter 6-digit code"
|
||||
value={verificationCode}
|
||||
|
|
@ -201,7 +201,7 @@ export const TwoFactorSetup: React.FC<TwoFactorSetupProps> = ({
|
|||
<h4 className="font-bold text-white mb-4">
|
||||
Enter Verification Code
|
||||
</h4>
|
||||
<div className="flex gap-3">
|
||||
<div className="flex gap-4">
|
||||
<Input
|
||||
placeholder="000000"
|
||||
value={verificationCode}
|
||||
|
|
@ -232,7 +232,7 @@ export const TwoFactorSetup: React.FC<TwoFactorSetupProps> = ({
|
|||
<h3 className="text-xl font-bold">2FA Enabled Successfully</h3>
|
||||
</div>
|
||||
|
||||
<div className="bg-kodo-orange/10 border border-kodo-orange/30 p-4 rounded-lg flex gap-3">
|
||||
<div className="bg-kodo-orange/10 border border-kodo-orange/30 p-4 rounded-lg flex gap-4">
|
||||
<AlertTriangle className="w-6 h-6 text-kodo-orange flex-shrink-0" />
|
||||
<div>
|
||||
<h4 className="font-bold text-kodo-orange text-sm mb-1">
|
||||
|
|
@ -245,7 +245,7 @@ export const TwoFactorSetup: React.FC<TwoFactorSetupProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-2 gap-3 bg-black/40 p-4 rounded-lg font-mono text-sm text-kodo-text-main text-center border border-kodo-steel/50">
|
||||
<div className="grid grid-cols-2 gap-4 bg-black/40 p-4 rounded-lg font-mono text-sm text-kodo-text-main text-center border border-kodo-steel/50">
|
||||
{backupCodes.map((code) => (
|
||||
<div key={code} className="py-1 tracking-wider">
|
||||
{code}
|
||||
|
|
@ -253,7 +253,7 @@ export const TwoFactorSetup: React.FC<TwoFactorSetupProps> = ({
|
|||
))}
|
||||
</div>
|
||||
|
||||
<div className="flex gap-3 pt-2">
|
||||
<div className="flex gap-4 pt-2">
|
||||
<Button
|
||||
variant="secondary"
|
||||
className="flex-1"
|
||||
|
|
|
|||
|
|
@ -294,7 +294,7 @@ export function ShareLinkManager({
|
|||
</p>
|
||||
</div>
|
||||
) : (
|
||||
<div className="space-y-3">
|
||||
<div className="space-y-4">
|
||||
{shareLinks.map((share) => {
|
||||
const shareUrl = getShareUrl(share.share_token);
|
||||
const expired = isExpired(share.expires_at);
|
||||
|
|
@ -304,7 +304,7 @@ export function ShareLinkManager({
|
|||
<div
|
||||
key={share.id}
|
||||
className={cn(
|
||||
'p-4 border rounded-lg space-y-3',
|
||||
'p-4 border rounded-lg space-y-4',
|
||||
expired && 'opacity-60 bg-muted/30',
|
||||
)}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -24,14 +24,14 @@ export const CommentItem: React.FC<CommentItemProps> = ({
|
|||
};
|
||||
|
||||
return (
|
||||
<div className="flex gap-3 text-sm py-2">
|
||||
<div className="flex gap-4 text-sm py-2">
|
||||
<img
|
||||
src={comment.author.avatar}
|
||||
alt={comment.author.name}
|
||||
className="w-8 h-8 rounded-full object-cover flex-shrink-0 cursor-pointer"
|
||||
/>
|
||||
<div className="flex-1 min-w-0">
|
||||
<div className="bg-kodo-ink/50 p-3 rounded-2xl rounded-tl-sm">
|
||||
<div className="bg-kodo-ink/50 p-4 rounded-2xl rounded-tl-sm">
|
||||
<div className="flex justify-between items-baseline mb-1">
|
||||
<div className="flex gap-2 items-baseline">
|
||||
<span className="font-bold text-white cursor-pointer hover:underline">
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ export const CreatePostModal: React.FC<CreatePostModalProps> = ({
|
|||
</div>
|
||||
|
||||
<div className="p-4 flex-1">
|
||||
<div className="flex gap-3">
|
||||
<div className="flex gap-4">
|
||||
<div className="w-10 h-10 rounded-full bg-kodo-steel overflow-hidden flex-shrink-0">
|
||||
<img
|
||||
src="https://picsum.photos/id/237/100/100"
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@ export const ExploreView: React.FC = () => {
|
|||
<button
|
||||
key={f}
|
||||
onClick={() => setFilter(f)}
|
||||
className={`px-3 py-1 rounded-full text-xs font-bold border transition-colors ${filter === f ? 'bg-white text-black border-white' : 'border-kodo-steel text-kodo-content-dim hover:border-kodo-steel'}`}
|
||||
className={`px-4 py-1 rounded-full text-xs font-bold border transition-colors ${filter === f ? 'bg-white text-black border-white' : 'border-kodo-steel text-kodo-content-dim hover:border-kodo-steel'}`}
|
||||
>
|
||||
{f}
|
||||
</button>
|
||||
|
|
@ -150,7 +150,7 @@ export const ExploreView: React.FC = () => {
|
|||
|
||||
{/* Grid Content */}
|
||||
{loading ? (
|
||||
<div className="flex justify-center py-20">
|
||||
<div className="flex justify-center py-24">
|
||||
<Loader2 className="w-10 h-10 text-kodo-steel animate-spin" />
|
||||
</div>
|
||||
) : (
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ export const FeedView: React.FC = () => {
|
|||
|
||||
if (loading)
|
||||
return (
|
||||
<div className="flex justify-center py-20">
|
||||
<div className="flex justify-center py-24">
|
||||
<Loader2 className="w-10 h-10 text-kodo-steel animate-spin" />
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ export const PostCard: React.FC<PostCardProps> = ({ post }) => {
|
|||
|
||||
{/* Post Header */}
|
||||
<div className="p-4 flex items-start justify-between">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-4">
|
||||
<div className="w-10 h-10 rounded-full bg-kodo-steel overflow-hidden border border-kodo-steel cursor-pointer">
|
||||
<img
|
||||
src={post.author.avatar}
|
||||
|
|
@ -135,7 +135,7 @@ export const PostCard: React.FC<PostCardProps> = ({ post }) => {
|
|||
|
||||
{post.type === 'audio' && post.audioTrack && (
|
||||
<div className="px-4 py-2">
|
||||
<div className="bg-kodo-ink p-3 rounded-xl flex items-center gap-4 border border-kodo-steel hover:border-kodo-steel/50 transition-colors">
|
||||
<div className="bg-kodo-ink p-4 rounded-xl flex items-center gap-4 border border-kodo-steel hover:border-kodo-steel/50 transition-colors">
|
||||
<div className="w-12 h-12 bg-kodo-graphite rounded overflow-hidden relative group cursor-pointer">
|
||||
<img
|
||||
src={post.audioTrack.coverUrl}
|
||||
|
|
@ -240,7 +240,7 @@ export const PostCard: React.FC<PostCardProps> = ({ post }) => {
|
|||
View all {post.comments} comments
|
||||
</Button>
|
||||
)}
|
||||
<div className="mt-4 flex gap-3">
|
||||
<div className="mt-4 flex gap-4">
|
||||
<div className="w-8 h-8 rounded-full bg-kodo-steel overflow-hidden flex-shrink-0">
|
||||
<img
|
||||
src="https://picsum.photos/id/100/100/100"
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ export const SharePostModal: React.FC<SharePostModalProps> = ({
|
|||
onChange={(e) => setQuoteText(e.target.value)}
|
||||
autoFocus
|
||||
/>
|
||||
<div className="border border-kodo-steel rounded-lg p-3 bg-kodo-ink/30 opacity-70">
|
||||
<div className="border border-kodo-steel rounded-lg p-4 bg-kodo-ink/30 opacity-70">
|
||||
<div className="flex items-center gap-2 mb-2">
|
||||
<img
|
||||
src={post.author.avatar}
|
||||
|
|
@ -97,7 +97,7 @@ export const SharePostModal: React.FC<SharePostModalProps> = ({
|
|||
|
||||
<div className="p-2">
|
||||
<button
|
||||
className="w-full flex items-center gap-4 p-3 hover:bg-white/5 rounded-lg transition-colors group"
|
||||
className="w-full flex items-center gap-4 p-4 hover:bg-white/5 rounded-lg transition-colors group"
|
||||
onClick={() => {
|
||||
onConfirm('repost');
|
||||
onClose();
|
||||
|
|
@ -115,7 +115,7 @@ export const SharePostModal: React.FC<SharePostModalProps> = ({
|
|||
</button>
|
||||
|
||||
<button
|
||||
className="w-full flex items-center gap-4 p-3 hover:bg-white/5 rounded-lg transition-colors group"
|
||||
className="w-full flex items-center gap-4 p-4 hover:bg-white/5 rounded-lg transition-colors group"
|
||||
onClick={() => setMode('quote')}
|
||||
>
|
||||
<div className="w-10 h-10 rounded-full bg-kodo-steel/10 flex items-center justify-center text-kodo-steel group-hover:bg-white/5">
|
||||
|
|
@ -129,10 +129,10 @@ export const SharePostModal: React.FC<SharePostModalProps> = ({
|
|||
</div>
|
||||
</button>
|
||||
|
||||
<div className="h-px bg-kodo-steel/50 my-2 mx-3"></div>
|
||||
<div className="h-px bg-kodo-steel/50 my-2 mx-4"></div>
|
||||
|
||||
<button
|
||||
className="w-full flex items-center gap-4 p-3 hover:bg-white/5 rounded-lg transition-colors group"
|
||||
className="w-full flex items-center gap-4 p-4 hover:bg-white/5 rounded-lg transition-colors group"
|
||||
onClick={handleCopyLink}
|
||||
>
|
||||
<div className="w-10 h-10 rounded-full bg-kodo-graphite flex items-center justify-center text-kodo-content-dim group-hover:text-white">
|
||||
|
|
@ -143,7 +143,7 @@ export const SharePostModal: React.FC<SharePostModalProps> = ({
|
|||
</div>
|
||||
</button>
|
||||
<button
|
||||
className="w-full flex items-center gap-4 p-3 hover:bg-white/5 rounded-lg transition-colors group"
|
||||
className="w-full flex items-center gap-4 p-4 hover:bg-white/5 rounded-lg transition-colors group"
|
||||
onClick={() => {
|
||||
addToast('Sent via DM');
|
||||
onClose();
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ export const ConnectionsView: React.FC<ConnectionsViewProps> = ({
|
|||
</div>
|
||||
|
||||
{loading ? (
|
||||
<div className="flex justify-center py-20">
|
||||
<div className="flex justify-center py-24">
|
||||
<Loader2 className="w-10 h-10 text-kodo-steel animate-spin" />
|
||||
</div>
|
||||
) : (
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ export const CreateGroupModal: React.FC<CreateGroupModalProps> = ({
|
|||
Description
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-kodo-void border border-kodo-steel rounded-lg p-3 text-white focus:border-kodo-cyan outline-none text-sm resize-none h-24"
|
||||
className="w-full bg-kodo-void border border-kodo-steel rounded-lg p-4 text-white focus:border-kodo-cyan outline-none text-sm resize-none h-24"
|
||||
placeholder="What's this community about?"
|
||||
value={description}
|
||||
onChange={(e) => setDescription(e.target.value)}
|
||||
|
|
@ -98,10 +98,10 @@ export const CreateGroupModal: React.FC<CreateGroupModalProps> = ({
|
|||
</div>
|
||||
|
||||
<div
|
||||
className="bg-kodo-ink p-3 rounded-lg border border-kodo-steel flex items-center justify-between cursor-pointer hover:border-kodo-steel"
|
||||
className="bg-kodo-ink p-4 rounded-lg border border-kodo-steel flex items-center justify-between cursor-pointer hover:border-kodo-steel"
|
||||
onClick={() => setIsPrivate(!isPrivate)}
|
||||
>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="flex items-center gap-4">
|
||||
{isPrivate ? (
|
||||
<Lock className="w-5 h-5 text-kodo-gold" />
|
||||
) : (
|
||||
|
|
@ -127,7 +127,7 @@ export const CreateGroupModal: React.FC<CreateGroupModalProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
||||
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
|
||||
<Button variant="ghost" onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ export const GroupCard: React.FC<GroupCardProps> = ({
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div className="p-5 flex flex-col flex-1">
|
||||
<div className="p-6 flex flex-col flex-1">
|
||||
<h3 className="font-bold text-white text-lg mb-1 truncate">
|
||||
{group.name}
|
||||
</h3>
|
||||
|
|
|
|||
|
|
@ -78,13 +78,13 @@ export const GroupDetailView: React.FC<GroupDetailViewProps> = ({
|
|||
|
||||
if (loading)
|
||||
return (
|
||||
<div className="flex justify-center py-20">
|
||||
<div className="flex justify-center py-24">
|
||||
<Loader2 className="w-10 h-10 text-kodo-steel animate-spin" />
|
||||
</div>
|
||||
);
|
||||
if (!group)
|
||||
return (
|
||||
<div className="text-center py-20 text-kodo-content-dim">Group not found</div>
|
||||
<div className="text-center py-24 text-kodo-content-dim">Group not found</div>
|
||||
);
|
||||
|
||||
return (
|
||||
|
|
@ -135,7 +135,7 @@ export const GroupDetailView: React.FC<GroupDetailViewProps> = ({
|
|||
<div className="p-6 md:p-8">
|
||||
<div className="flex flex-col md:flex-row justify-between items-start gap-4">
|
||||
<div>
|
||||
<div className="flex items-center gap-3 mb-2">
|
||||
<div className="flex items-center gap-4 mb-2">
|
||||
<h1 className="text-3xl font-display font-bold text-white">
|
||||
{group.name}
|
||||
</h1>
|
||||
|
|
@ -235,7 +235,7 @@ export const GroupDetailView: React.FC<GroupDetailViewProps> = ({
|
|||
variant="default"
|
||||
className="flex items-center gap-6"
|
||||
>
|
||||
<div className="text-center p-3 bg-kodo-slate rounded-lg min-w-[80px]">
|
||||
<div className="text-center p-4 bg-kodo-slate rounded-lg min-w-[80px]">
|
||||
<div className="text-xs text-kodo-steel uppercase font-bold">
|
||||
{event.date.split(' ')[0]}
|
||||
</div>
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue