refactor: Phase 7 — Clean up legacy components and remove dead tokens
- Bulk replace text-white → text-foreground across 116 component files (preserving text-white/ opacity variants) - Remove hover-glow-cyan, shadow-card-glow-cyan, shadow-button-primary-glow classes from all components - Replace --duration-normal/--duration-immersive/--duration-slow with --sumi-duration-normal/--sumi-duration-slow across 130+ files - Replace --ease-out/--ease-in-out with --sumi-ease-out/--sumi-ease-in-out - Replace focus:ring-blue-500 → focus:ring-primary (4 files) - Remove hover:scale-105/110 and hover:-translate-y-1/0.5 transforms (SUMI anti-pattern: no scale on hover) - Clean up stale kodo- references in comments Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
69e40e3c04
commit
73e8372b0e
268 changed files with 585 additions and 585 deletions
|
|
@ -58,7 +58,7 @@ describe('Contrast Ratio Utilities', () => {
|
|||
});
|
||||
|
||||
it('should pass for white on dark background (normal text)', () => {
|
||||
const ratio = getContrastRatio([255, 255, 255], [11, 12, 16]); // kodo-void
|
||||
const ratio = getContrastRatio([255, 255, 255], [11, 12, 16]); // sumi-bg-base
|
||||
expect(meetsWCAGAA(ratio, false)).toBe(true);
|
||||
expect(ratio).toBeGreaterThan(4.5);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ export function BulkModeBanner({
|
|||
className={cn(
|
||||
'w-full bg-muted/10 border-b border-border/30 text-muted-foreground',
|
||||
'px-4 py-4 flex items-center justify-between gap-4',
|
||||
'transition-all duration-[var(--duration-normal)]',
|
||||
'transition-all duration-[var(--sumi-duration-normal)]',
|
||||
className,
|
||||
)}
|
||||
>
|
||||
|
|
@ -86,7 +86,7 @@ export function BulkModeBanner({
|
|||
variant="ghost"
|
||||
size="sm"
|
||||
onClick={onClose}
|
||||
className="text-muted-foreground hover:text-white hover:bg-white/5 h-auto py-1 px-2 flex-shrink-0"
|
||||
className="text-muted-foreground hover:text-foreground hover:bg-white/5 h-auto py-1 px-2 flex-shrink-0"
|
||||
aria-label="Fermer le mode sélection"
|
||||
>
|
||||
<X className="w-4 h-4" />
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ const OfflineIndicatorMock = ({ variant }: { variant: 'offline' | 'syncing' | 'h
|
|||
|
||||
if (variant === 'offline') {
|
||||
return (
|
||||
<div className="bg-destructive/90 backdrop-blur-sm text-white px-4 py-2.5 text-sm flex items-center justify-center gap-2 shadow-lg border-b border-destructive rounded">
|
||||
<div className="bg-destructive/90 backdrop-blur-sm text-foreground px-4 py-2.5 text-sm flex items-center justify-center gap-2 shadow-lg border-b border-destructive rounded">
|
||||
<WifiOff className="w-4 h-4" />
|
||||
<span>
|
||||
Mode hors ligne
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ export function OfflineIndicator() {
|
|||
if (!isOnline || hasNetworkError) {
|
||||
return (
|
||||
<>
|
||||
<div className="fixed top-0 left-0 right-0 bg-destructive/90 backdrop-blur-sm text-white px-4 py-2.5 text-sm z-50 flex items-center justify-center gap-2 shadow-lg border-b border-destructive">
|
||||
<div className="fixed top-0 left-0 right-0 bg-destructive/90 backdrop-blur-sm text-foreground px-4 py-2.5 text-sm z-50 flex items-center justify-center gap-2 shadow-lg border-b border-destructive">
|
||||
<WifiOff className="w-4 h-4" />
|
||||
<span>
|
||||
Mode hors ligne
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ export function OfflineQueueManager({
|
|||
<div className="flex-1 min-w-0">
|
||||
{/* Request Method and URL */}
|
||||
<div className="flex items-center gap-2 mb-2">
|
||||
<span className="font-mono text-sm font-semibold text-white truncate">
|
||||
<span className="font-mono text-sm font-semibold text-foreground truncate">
|
||||
{formatRequest(request)}
|
||||
</span>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -163,7 +163,7 @@ export function Onboarding({
|
|||
>
|
||||
<div className="space-y-4">
|
||||
<div>
|
||||
<h3 className="text-xl font-semibold text-white mb-2">
|
||||
<h3 className="text-xl font-semibold text-foreground mb-2">
|
||||
{step.title}
|
||||
</h3>
|
||||
<p className="text-muted-foreground text-sm leading-relaxed">
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ export function AdminDashboardNodeHealthCard() {
|
|||
key={i}
|
||||
className="flex justify-between items-center py-2 border-b border-white/5 last:border-0 group"
|
||||
>
|
||||
<span className="text-xs font-mono text-muted-foreground group-hover:text-white transition-colors uppercase">
|
||||
<span className="text-xs font-mono text-muted-foreground group-hover:text-foreground transition-colors uppercase">
|
||||
{m.l}
|
||||
</span>
|
||||
<span
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ const PROTOCOLS = [
|
|||
{
|
||||
id: 'logs',
|
||||
label: 'SEC LOGS',
|
||||
icon: <Eye className="w-5 h-5 text-white" />,
|
||||
icon: <Eye className="w-5 h-5 text-foreground" />,
|
||||
color: 'primary',
|
||||
},
|
||||
];
|
||||
|
|
@ -62,7 +62,7 @@ export function AdminDashboardProtocolsCard({
|
|||
<div className="transition-transform group-hover:-translate-y-1 relative z-10">
|
||||
{act.icon}
|
||||
</div>
|
||||
<span className="text-xs font-mono tracking-widest text-muted-foreground group-hover:text-white relative z-10">
|
||||
<span className="text-xs font-mono tracking-widest text-muted-foreground group-hover:text-foreground relative z-10">
|
||||
{act.label}
|
||||
</span>
|
||||
</button>
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ export function AdminDashboardStatCard({
|
|||
</span>
|
||||
)}
|
||||
</div>
|
||||
<div className="text-3xl font-heading font-bold text-white mb-1 relative z-10">
|
||||
<div className="text-3xl font-heading font-bold text-foreground mb-1 relative z-10">
|
||||
{typeof value === 'number' ? (
|
||||
<AnimatedNumber value={value} />
|
||||
) : (
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ export function AdminDashboardTrafficCard() {
|
|||
>
|
||||
<div className="flex justify-between items-center mb-6 relative z-10">
|
||||
<div>
|
||||
<h3 className="text-lg font-bold text-white flex items-center gap-3">
|
||||
<h3 className="text-lg font-bold text-foreground flex items-center gap-3">
|
||||
<Server className="w-5 h-5 text-primary" /> Traffic Flux
|
||||
</h3>
|
||||
<p className="text-xs text-muted-foreground font-mono mt-1">
|
||||
|
|
|
|||
|
|
@ -30,14 +30,14 @@ export const BanUserModal: React.FC<BanUserModalProps> = ({
|
|||
<ShieldBan className="w-5 h-5 fill-current" /> Suspend User
|
||||
</h3>
|
||||
<button onClick={onClose}>
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-white" />
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="p-6 space-y-4">
|
||||
<p className="text-foreground text-sm">
|
||||
You are about to suspend{' '}
|
||||
<span className="font-bold text-white">{username}</span>. This will
|
||||
<span className="font-bold text-foreground">{username}</span>. This will
|
||||
restrict their access to the platform.
|
||||
</p>
|
||||
|
||||
|
|
@ -46,7 +46,7 @@ export const BanUserModal: React.FC<BanUserModalProps> = ({
|
|||
Reason
|
||||
</label>
|
||||
<select
|
||||
className="w-full bg-background border border-border rounded p-2 text-white focus:border-destructive outline-none text-sm"
|
||||
className="w-full bg-background border border-border rounded p-2 text-foreground focus:border-destructive outline-none text-sm"
|
||||
value={reason}
|
||||
onChange={(e) => setReason(e.target.value)}
|
||||
>
|
||||
|
|
@ -64,7 +64,7 @@ export const BanUserModal: React.FC<BanUserModalProps> = ({
|
|||
Details (Internal Note)
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-background border border-border rounded p-2 text-white focus:border-destructive outline-none text-sm resize-none h-24"
|
||||
className="w-full bg-background border border-border rounded p-2 text-foreground focus:border-destructive outline-none text-sm resize-none h-24"
|
||||
placeholder="Provide context for this ban..."
|
||||
value={details}
|
||||
onChange={(e) => setDetails(e.target.value)}
|
||||
|
|
@ -75,7 +75,7 @@ export const BanUserModal: React.FC<BanUserModalProps> = ({
|
|||
<div className="flex items-center gap-4">
|
||||
<Calendar className="w-5 h-5 text-muted-foreground" />
|
||||
<div>
|
||||
<div className="text-sm font-bold text-white">Ban Duration</div>
|
||||
<div className="text-sm font-bold text-foreground">Ban Duration</div>
|
||||
<div className="text-xs text-muted-foreground">
|
||||
{isPermanent ? 'Permanent Ban' : `${duration} Days`}
|
||||
</div>
|
||||
|
|
@ -83,7 +83,7 @@ export const BanUserModal: React.FC<BanUserModalProps> = ({
|
|||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<span
|
||||
className={`text-xs ${!isPermanent ? 'text-white' : 'text-muted-foreground'}`}
|
||||
className={`text-xs ${!isPermanent ? 'text-foreground' : 'text-muted-foreground'}`}
|
||||
>
|
||||
Temp
|
||||
</span>
|
||||
|
|
@ -111,7 +111,7 @@ export const BanUserModal: React.FC<BanUserModalProps> = ({
|
|||
<input
|
||||
type="number"
|
||||
min="1"
|
||||
className="w-full bg-background border border-border rounded p-2 text-white focus:border-destructive outline-none text-sm"
|
||||
className="w-full bg-background border border-border rounded p-2 text-foreground focus:border-destructive outline-none text-sm"
|
||||
value={duration}
|
||||
onChange={(e) => setDuration(e.target.value)}
|
||||
/>
|
||||
|
|
@ -125,7 +125,7 @@ export const BanUserModal: React.FC<BanUserModalProps> = ({
|
|||
</Button>
|
||||
<Button
|
||||
variant="primary"
|
||||
className="bg-destructive hover:bg-destructive border-destructive text-white"
|
||||
className="bg-destructive hover:bg-destructive border-destructive text-foreground"
|
||||
onClick={() =>
|
||||
onConfirm(
|
||||
reason,
|
||||
|
|
|
|||
|
|
@ -27,14 +27,14 @@ export const CartItem: React.FC<CartItemProps> = ({ item, onRemove }) => {
|
|||
<div className="w-full md:w-24 h-24 rounded-lg overflow-hidden flex-shrink-0 bg-muted">
|
||||
<img
|
||||
src={product.coverUrl}
|
||||
className="w-full h-full object-cover group-hover:scale-105 transition-transform duration-[var(--duration-slow)]"
|
||||
className="w-full h-full object-cover group-hover:scale-105 transition-transform duration-[var(--sumi-duration-slow)]"
|
||||
alt={product.title}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Info */}
|
||||
<div className="flex-1 w-full text-center md:text-left">
|
||||
<h4 className="font-bold text-white text-lg">{product.title}</h4>
|
||||
<h4 className="font-bold text-foreground text-lg">{product.title}</h4>
|
||||
<p className="text-muted-foreground text-sm mb-2">{product.author}</p>
|
||||
<div className="flex items-center justify-center md:justify-start gap-2 text-xs">
|
||||
<span className="px-2 py-1 bg-card border border-border rounded flex items-center gap-1">
|
||||
|
|
@ -48,7 +48,7 @@ export const CartItem: React.FC<CartItemProps> = ({ item, onRemove }) => {
|
|||
|
||||
{/* Price & Actions */}
|
||||
<div className="flex flex-row md:flex-col items-center gap-4 md:gap-2 w-full md:w-auto justify-between">
|
||||
<div className="text-xl font-mono font-bold text-white">
|
||||
<div className="text-xl font-mono font-bold text-foreground">
|
||||
${price.toFixed(2)}
|
||||
</div>
|
||||
<Button
|
||||
|
|
|
|||
|
|
@ -42,14 +42,14 @@ export const OrderSummary: React.FC<OrderSummaryProps> = ({
|
|||
<Card variant="glass" className="p-8 bg-black/40 border-white/5 relative overflow-hidden group">
|
||||
<div className="absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-primary/50 to-transparent" />
|
||||
|
||||
<h3 className="font-bold text-white mb-8 uppercase tracking-[0.2em] text-xs flex items-center gap-3">
|
||||
<h3 className="font-bold text-foreground mb-8 uppercase tracking-[0.2em] text-xs flex items-center gap-3">
|
||||
<CreditCard className="w-4 h-4 text-primary" /> Checkout Summary
|
||||
</h3>
|
||||
|
||||
<div className="space-y-5 text-sm mb-8">
|
||||
<div className="flex justify-between text-muted-foreground font-mono uppercase text-xs">
|
||||
<span>Transaction Base</span>
|
||||
<span className="text-white font-bold">
|
||||
<span className="text-foreground font-bold">
|
||||
{formatPrice(subtotal)}
|
||||
</span>
|
||||
</div>
|
||||
|
|
@ -65,7 +65,7 @@ export const OrderSummary: React.FC<OrderSummaryProps> = ({
|
|||
|
||||
<div className="flex justify-between text-muted-foreground font-mono uppercase text-xs">
|
||||
<span>Regulatory Levy ({(taxRate * 100).toFixed(0)}%)</span>
|
||||
<span className="text-white font-bold">
|
||||
<span className="text-foreground font-bold">
|
||||
{formatPrice(taxAmount)}
|
||||
</span>
|
||||
</div>
|
||||
|
|
@ -74,7 +74,7 @@ export const OrderSummary: React.FC<OrderSummaryProps> = ({
|
|||
<div className="border-t border-white/5 pt-6 mb-8">
|
||||
<div className="flex justify-between items-end">
|
||||
<span className="text-xs font-mono text-muted-foreground uppercase tracking-widest">Total Liability</span>
|
||||
<span className="text-3xl font-heading font-bold text-white shadow-glow-cyan">
|
||||
<span className="text-3xl font-heading font-bold text-foreground shadow-glow-cyan">
|
||||
{formatPrice(total)}
|
||||
</span>
|
||||
</div>
|
||||
|
|
@ -97,7 +97,7 @@ export const OrderSummary: React.FC<OrderSummaryProps> = ({
|
|||
<ShieldCheck className="w-5 h-5 text-gold-500" />
|
||||
</div>
|
||||
<div>
|
||||
<h4 className="font-bold text-white text-xs mb-1 uppercase tracking-wider">Encrypted Node</h4>
|
||||
<h4 className="font-bold text-foreground text-xs mb-1 uppercase tracking-wider">Encrypted Node</h4>
|
||||
<p className="text-xs text-muted-foreground leading-relaxed font-mono uppercase">
|
||||
SECURE FLOW ENABLED. DATA PACKETS ARE ENCRYPTED VIA AES-256.
|
||||
</p>
|
||||
|
|
|
|||
|
|
@ -155,13 +155,13 @@ export const WishlistView: React.FC = () => {
|
|||
<motion.div key={product.id} variants={cardVariants}>
|
||||
<Card
|
||||
variant="default"
|
||||
className="p-4 group hover:border-border/50 hover:-translate-y-1 hover:shadow-lg transition-all duration-[var(--duration-normal)]"
|
||||
className="p-4 group hover:border-border/50 hover:shadow-lg transition-all duration-[var(--sumi-duration-normal)]"
|
||||
>
|
||||
<div className="flex gap-4">
|
||||
<div className="relative w-24 h-24 bg-muted rounded-lg overflow-hidden flex-shrink-0">
|
||||
<img
|
||||
src={product.coverUrl}
|
||||
className="w-full h-full object-cover group-hover:scale-110 transition-transform duration-[var(--duration-slow)]"
|
||||
className="w-full h-full object-cover group-hover:scale-110 transition-transform duration-[var(--sumi-duration-slow)]"
|
||||
/>
|
||||
<div
|
||||
className="absolute inset-0 bg-black/40 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity cursor-pointer"
|
||||
|
|
@ -172,9 +172,9 @@ export const WishlistView: React.FC = () => {
|
|||
}
|
||||
>
|
||||
{playingPreview === product.id ? (
|
||||
<Pause className="w-8 h-8 text-white" />
|
||||
<Pause className="w-8 h-8 text-foreground" />
|
||||
) : (
|
||||
<Play className="w-8 h-8 text-white fill-current" />
|
||||
<Play className="w-8 h-8 text-foreground fill-current" />
|
||||
)}
|
||||
</div>
|
||||
{product.isHot && (
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ export const PromoCodeModal: React.FC<PromoCodeModalProps> = ({
|
|||
></div>
|
||||
<div className="relative w-full max-w-sm bg-card border border-border rounded-xl shadow-2xl animate-scaleIn overflow-hidden">
|
||||
<div className="p-4 border-b border-border bg-card flex justify-between items-center">
|
||||
<h3 className="font-bold text-white flex items-center gap-2">
|
||||
<h3 className="font-bold text-foreground flex items-center gap-2">
|
||||
<Tag className="w-4 h-4 text-muted-foreground" /> Add Promo Code
|
||||
</h3>
|
||||
<button onClick={onClose}>
|
||||
|
|
|
|||
|
|
@ -29,11 +29,11 @@ export const RefundRequestModal: React.FC<RefundRequestModalProps> = ({
|
|||
></div>
|
||||
<div className="relative w-full max-w-lg bg-card border border-border rounded-xl shadow-2xl animate-scaleIn overflow-hidden">
|
||||
<div className="p-4 border-b border-border bg-muted flex justify-between items-center">
|
||||
<h3 className="font-bold text-white flex items-center gap-2">
|
||||
<h3 className="font-bold text-foreground flex items-center gap-2">
|
||||
<RefreshCcw className="w-4 h-4 text-warning" /> Request Refund
|
||||
</h3>
|
||||
<button onClick={onClose}>
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-white" />
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
|
@ -41,7 +41,7 @@ export const RefundRequestModal: React.FC<RefundRequestModalProps> = ({
|
|||
<p className="text-sm text-muted-foreground">
|
||||
Refund requests are subject to approval. Please provide details
|
||||
below for Order{' '}
|
||||
<span className="font-mono text-white">#{orderId}</span>.
|
||||
<span className="font-mono text-foreground">#{orderId}</span>.
|
||||
</p>
|
||||
|
||||
<div>
|
||||
|
|
@ -49,7 +49,7 @@ export const RefundRequestModal: React.FC<RefundRequestModalProps> = ({
|
|||
Reason
|
||||
</label>
|
||||
<select
|
||||
className="w-full bg-muted border border-border rounded-lg px-4 py-2.5 text-white focus:border-primary outline-none"
|
||||
className="w-full bg-muted border border-border rounded-lg px-4 py-2.5 text-foreground focus:border-primary outline-none"
|
||||
value={reason}
|
||||
onChange={(e) => setReason(e.target.value)}
|
||||
>
|
||||
|
|
@ -65,7 +65,7 @@ export const RefundRequestModal: React.FC<RefundRequestModalProps> = ({
|
|||
Details
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-muted border border-border rounded-lg p-4 text-white focus:border-primary outline-none text-sm resize-none h-24"
|
||||
className="w-full bg-muted border border-border rounded-lg p-4 text-foreground focus:border-primary 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)}
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ export function ActivityGraph() {
|
|||
"px-3 py-1 text-xs font-medium rounded-md transition-all",
|
||||
period === 7
|
||||
? "bg-primary/20 text-primary shadow-sm"
|
||||
: "text-muted-foreground hover:text-white"
|
||||
: "text-muted-foreground hover:text-foreground"
|
||||
)}
|
||||
>
|
||||
7J
|
||||
|
|
@ -66,7 +66,7 @@ export function ActivityGraph() {
|
|||
"px-3 py-1 text-xs font-medium rounded-md transition-all",
|
||||
period === 30
|
||||
? "bg-primary/20 text-primary shadow-sm"
|
||||
: "text-muted-foreground hover:text-white"
|
||||
: "text-muted-foreground hover:text-foreground"
|
||||
)}
|
||||
>
|
||||
30J
|
||||
|
|
@ -97,7 +97,7 @@ export function ActivityGraph() {
|
|||
{/* Barre */}
|
||||
<div
|
||||
className={cn(
|
||||
"w-full rounded-t-sm transition-all duration-[var(--duration-normal)] relative z-10",
|
||||
"w-full rounded-t-sm transition-all duration-[var(--sumi-duration-normal)] relative z-10",
|
||||
isHovered ? "bg-primary opacity-100" : "bg-primary/30 opacity-70",
|
||||
// Animation d'entrée
|
||||
"animate-slideUp"
|
||||
|
|
@ -121,7 +121,7 @@ export function ActivityGraph() {
|
|||
)}
|
||||
>
|
||||
<div className="bg-card border border-border/50 px-3 py-2 rounded-lg shadow-xl whitespace-nowrap">
|
||||
<div className="text-xs font-bold text-white mb-0.5">{point.value} écoutes</div>
|
||||
<div className="text-xs font-bold text-foreground mb-0.5">{point.value} écoutes</div>
|
||||
<div className="text-xs text-muted-foreground font-mono">{point.label}</div>
|
||||
</div>
|
||||
{/* Triangle du tooltip */}
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ export const Default: Story = {
|
|||
args: {
|
||||
label: 'Total Plays',
|
||||
value: '1.2M',
|
||||
icon: <Music className="w-5 h-5 text-white" />,
|
||||
icon: <Music className="w-5 h-5 text-foreground" />,
|
||||
trend: '+12.5',
|
||||
color: 'cyan',
|
||||
sparklineData: [40, 30, 45, 50, 60, 75, 80],
|
||||
|
|
@ -33,7 +33,7 @@ export const NegativeTrend: Story = {
|
|||
args: {
|
||||
label: 'Revenue',
|
||||
value: '$432.50',
|
||||
icon: <DollarSign className="w-5 h-5 text-white" />,
|
||||
icon: <DollarSign className="w-5 h-5 text-foreground" />,
|
||||
trend: '-5.2',
|
||||
color: 'red',
|
||||
sparklineData: [80, 75, 70, 65, 60, 55, 50],
|
||||
|
|
@ -44,7 +44,7 @@ export const NoTrend: Story = {
|
|||
args: {
|
||||
label: 'Followers',
|
||||
value: '5,432',
|
||||
icon: <Users className="w-5 h-5 text-white" />,
|
||||
icon: <Users className="w-5 h-5 text-foreground" />,
|
||||
color: 'magenta',
|
||||
sparklineData: [10, 20, 15, 25, 30, 40, 50],
|
||||
},
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ export const StatCard: React.FC<StatCardProps> = ({
|
|||
color = 'cyan',
|
||||
sparklineData,
|
||||
}) => {
|
||||
/* Semantic tokens (audit P3: unify kodo-* → primary/muted/success/warning/destructive) */
|
||||
/* Semantic tokens (audit P3: now uses primary/muted/success/warning/destructive) */
|
||||
const colorMap = {
|
||||
cyan: 'text-primary',
|
||||
magenta: 'text-secondary',
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import React from 'react';
|
|||
|
||||
export const DesignSystemDemo: React.FC = () => {
|
||||
return (
|
||||
<div className="p-8 text-white">
|
||||
<div className="p-8 text-foreground">
|
||||
<h1 className="text-2xl font-bold mb-4">Design System Demo</h1>
|
||||
<p>Component under construction.</p>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -48,13 +48,13 @@ export const APIPlaygroundView: React.FC = () => {
|
|||
|
||||
return (
|
||||
<div className="space-y-6 animate-fadeIn pb-20">
|
||||
<h2 className="text-2xl font-bold text-white mb-6">API PLAYGROUND</h2>
|
||||
<h2 className="text-2xl font-bold text-foreground mb-6">API PLAYGROUND</h2>
|
||||
|
||||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
||||
{/* Request Builder */}
|
||||
<div className="space-y-4">
|
||||
<Card variant="default">
|
||||
<h3 className="font-bold text-white mb-4">Request</h3>
|
||||
<h3 className="font-bold text-foreground mb-4">Request</h3>
|
||||
|
||||
<div className="space-y-4">
|
||||
<div>
|
||||
|
|
@ -62,7 +62,7 @@ export const APIPlaygroundView: React.FC = () => {
|
|||
Endpoint
|
||||
</label>
|
||||
<select
|
||||
className="w-full bg-card border border-border rounded p-4 text-white focus:border-border outline-none font-mono text-sm"
|
||||
className="w-full bg-card border border-border rounded p-4 text-foreground focus:border-border 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-card border border-border rounded p-4 text-white focus:border-border outline-none font-mono text-xs h-48 resize-none"
|
||||
className="w-full bg-card border border-border rounded p-4 text-foreground focus:border-border outline-none font-mono text-xs h-48 resize-none"
|
||||
value={params}
|
||||
onChange={(e) => setParams(e.target.value)}
|
||||
/>
|
||||
|
|
@ -116,7 +116,7 @@ export const APIPlaygroundView: React.FC = () => {
|
|||
<div className="space-y-4 h-full">
|
||||
<Card variant="glass" className="h-full flex flex-col">
|
||||
<div className="flex justify-between items-center mb-4">
|
||||
<h3 className="font-bold text-white">Response</h3>
|
||||
<h3 className="font-bold text-foreground">Response</h3>
|
||||
{response && (
|
||||
<div className="flex gap-2">
|
||||
<span className="text-xs font-bold text-success bg-success/10 px-2 py-1 rounded">
|
||||
|
|
@ -136,7 +136,7 @@ export const APIPlaygroundView: React.FC = () => {
|
|||
{response}
|
||||
</pre>
|
||||
<button
|
||||
className="absolute top-2 right-2 p-2 bg-muted rounded text-muted-foreground hover:text-white opacity-0 group-hover:opacity-100 transition-opacity"
|
||||
className="absolute top-2 right-2 p-2 bg-muted rounded text-muted-foreground hover:text-foreground opacity-0 group-hover:opacity-100 transition-opacity"
|
||||
onClick={() => {
|
||||
navigator.clipboard.writeText(response);
|
||||
addToast('Copied JSON');
|
||||
|
|
|
|||
|
|
@ -149,7 +149,7 @@ export function SwaggerUIDoc({ specUrl, spec, useIframe = false }: SwaggerUIProp
|
|||
return (
|
||||
<div className="flex flex-col items-center justify-center p-12 min-h-layout-page">
|
||||
<AlertCircle className="w-16 h-16 text-destructive mb-4" />
|
||||
<h3 className="text-xl font-bold text-white mb-2">
|
||||
<h3 className="text-xl font-bold text-foreground mb-2">
|
||||
Failed to Load API Documentation
|
||||
</h3>
|
||||
<p className="text-sm text-muted-foreground mb-4 text-center max-w-md">
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ export const WebhooksView: React.FC = () => {
|
|||
<div className="space-y-6 pb-20 container mx-auto px-4 py-8 max-w-5xl">
|
||||
<div className="flex items-end justify-between">
|
||||
<div>
|
||||
<h2 className="text-3xl font-heading font-bold text-white mb-1">Webhooks</h2>
|
||||
<h2 className="text-3xl font-heading font-bold text-foreground mb-1">Webhooks</h2>
|
||||
<p className="text-muted-foreground font-mono text-xs flex items-center gap-2">
|
||||
<Terminal className="w-3 h-3" /> EVENT SUBSCRIPTION PROTOCOL
|
||||
</p>
|
||||
|
|
@ -69,7 +69,7 @@ export const WebhooksView: React.FC = () => {
|
|||
|
||||
<Card variant="glass" className="p-6 border-primary/20 bg-black/40 relative overflow-hidden group">
|
||||
<div className="absolute inset-x-0 bottom-0 h-1 bg-gradient-to-r from-transparent via-primary/50 to-transparent opacity-50 group-hover:opacity-100 transition-opacity" />
|
||||
<h3 className="font-bold text-white mb-4 flex items-center gap-2 text-sm uppercase tracking-widest">
|
||||
<h3 className="font-bold text-foreground mb-4 flex items-center gap-2 text-sm uppercase tracking-widest">
|
||||
<Plus className="w-4 h-4 text-primary" /> Register Endpoint
|
||||
</h3>
|
||||
<div className="flex gap-4">
|
||||
|
|
@ -109,13 +109,13 @@ export const WebhooksView: React.FC = () => {
|
|||
<div className={cn("text-xs font-bold px-2 py-0.5 rounded border uppercase tracking-wider", hook.status === 'active' ? 'border-success/30 text-success bg-success/10' : 'border-destructive/30 text-destructive bg-destructive/10')}>
|
||||
{hook.status}
|
||||
</div>
|
||||
<span className="font-mono text-white text-sm break-all">{hook.url}</span>
|
||||
<span className="font-mono text-foreground text-sm break-all">{hook.url}</span>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-wrap gap-4 text-xs text-muted-foreground items-center">
|
||||
<div className="flex gap-2">
|
||||
<span className="text-primary/70">events:</span>
|
||||
{hook.events.map(e => <span key={e} className="text-white bg-white/5 px-1 rounded">{e}</span>)}
|
||||
{hook.events.map(e => <span key={e} className="text-foreground bg-white/5 px-1 rounded">{e}</span>)}
|
||||
</div>
|
||||
<div className="w-1 h-1 rounded-full bg-white/20" />
|
||||
<div className="flex items-center gap-1">
|
||||
|
|
|
|||
|
|
@ -156,7 +156,7 @@ export const CreateAPIKeyModal: React.FC<CreateAPIKeyModalProps> = ({
|
|||
className={cn(
|
||||
"flex items-center justify-between p-4 rounded-xl border cursor-pointer transition-all duration-[var(--duration-fast)] group relative overflow-hidden",
|
||||
selectedScopes.includes(scope.id)
|
||||
? "bg-primary/10 border-primary/50 shadow-card-glow-cyan"
|
||||
? "bg-primary/10 border-primary/50"
|
||||
: "bg-background/30 border-border/50 hover:border-border hover:bg-foreground/5"
|
||||
)}
|
||||
>
|
||||
|
|
@ -196,7 +196,7 @@ export const CreateAPIKeyModal: React.FC<CreateAPIKeyModalProps> = ({
|
|||
<div className="text-center space-y-8 py-4">
|
||||
<div className="relative w-20 h-20 mx-auto">
|
||||
<div className="absolute inset-0 bg-success/20 rounded-full animate-ping opacity-50"></div>
|
||||
<div className="relative w-full h-full bg-gradient-to-br from-success/20 to-primary/20 rounded-full flex items-center justify-center border border-success/30 shadow-card-glow-cyan">
|
||||
<div className="relative w-full h-full bg-gradient-to-br from-success/20 to-primary/20 rounded-full flex items-center justify-center border border-success/30">
|
||||
<Check className="w-10 h-10 text-success drop-shadow-lg" />
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -228,7 +228,7 @@ export const CreateAPIKeyModal: React.FC<CreateAPIKeyModalProps> = ({
|
|||
variant="ghost"
|
||||
size="icon"
|
||||
onClick={(e) => copyKey(e)}
|
||||
className="h-10 w-10 text-muted-foreground hover:text-foreground hover:bg-foreground/10 rounded-lg hover:scale-105 transition-all flex-none"
|
||||
className="h-10 w-10 text-muted-foreground hover:text-foreground hover:bg-foreground/10 rounded-lg transition-all flex-none"
|
||||
title="Copy to clipboard"
|
||||
>
|
||||
{copied ? (
|
||||
|
|
@ -263,7 +263,7 @@ export const CreateAPIKeyModal: React.FC<CreateAPIKeyModalProps> = ({
|
|||
}}
|
||||
disabled={isGenerating || !name.trim() || selectedScopes.length === 0}
|
||||
type="button"
|
||||
className="bg-primary hover:bg-primary/80 text-black font-semibold shadow-button-primary-glow hover:shadow-button-primary-glow-hover transition-all duration-[var(--duration-normal)]"
|
||||
className="bg-primary hover:bg-primary/80 text-black font-semibold shadow-sm transition-all duration-[var(--sumi-duration-normal)]"
|
||||
>
|
||||
{isGenerating ? (
|
||||
<>
|
||||
|
|
@ -278,7 +278,7 @@ export const CreateAPIKeyModal: React.FC<CreateAPIKeyModalProps> = ({
|
|||
) : (
|
||||
<Button
|
||||
onClick={onClose}
|
||||
className="bg-primary hover:bg-primary/80 text-black font-semibold min-w-24 shadow-button-primary-glow hover:shadow-button-primary-glow-hover transition-all duration-[var(--duration-normal)]"
|
||||
className="bg-primary hover:bg-primary/80 text-black font-semibold min-w-24 shadow-sm transition-all duration-[var(--sumi-duration-normal)]"
|
||||
>
|
||||
Done
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -27,14 +27,14 @@ const CourseCardComponent: React.FC<CourseCardProps> = ({
|
|||
return (
|
||||
<Card
|
||||
variant="default"
|
||||
className="group p-0 overflow-hidden cursor-pointer hover:border-border/80 hover:-translate-y-1 hover:shadow-xl transition-all duration-[var(--duration-normal)] flex flex-col h-full"
|
||||
className="group p-0 overflow-hidden cursor-pointer hover:border-border/80 hover:shadow-xl transition-all duration-[var(--sumi-duration-normal)] flex flex-col h-full"
|
||||
onClick={() => onClick(course)}
|
||||
>
|
||||
{/* Cover */}
|
||||
<div className="relative aspect-video bg-card overflow-hidden">
|
||||
<OptimizedImage
|
||||
src={course.thumbnailUrl}
|
||||
className="w-full h-full object-cover opacity-90 group-hover:opacity-100 group-hover:scale-105 transition-all duration-[var(--duration-normal)]"
|
||||
className="w-full h-full object-cover opacity-90 group-hover:opacity-100 group-hover:scale-105 transition-all duration-[var(--sumi-duration-normal)]"
|
||||
alt={course.title}
|
||||
/>
|
||||
<div className="absolute inset-0 bg-background/40 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center backdrop-blur-sm">
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ export const MyCoursesView: React.FC<MyCoursesViewProps> = ({ onContinue }) => {
|
|||
className="w-full h-full object-cover opacity-80 group-hover:scale-105 transition-transform"
|
||||
/>
|
||||
<div className="absolute inset-0 flex items-center justify-center">
|
||||
<PlayCircle className="w-12 h-12 text-white fill-current drop-shadow-lg" />
|
||||
<PlayCircle className="w-12 h-12 text-foreground fill-current drop-shadow-lg" />
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex-1 text-center md:text-left">
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ export function CourseDetailViewHeader({
|
|||
<Button
|
||||
variant="ghost"
|
||||
onClick={onBack}
|
||||
className="pl-0 text-muted-foreground hover:text-foreground transition-colors duration-[var(--duration-normal)]"
|
||||
className="pl-0 text-muted-foreground hover:text-foreground transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
>
|
||||
← Back to Courses
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ export function CourseDetailViewSidebar({
|
|||
<PlayCircle className="w-8 h-8 text-black fill-current" />
|
||||
</div>
|
||||
</div>
|
||||
<div className="absolute bottom-4 text-center w-full text-white font-bold text-sm drop-shadow-md">
|
||||
<div className="absolute bottom-4 text-center w-full text-foreground font-bold text-sm drop-shadow-md">
|
||||
Preview Course
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ export function CourseDetailViewTabs({
|
|||
key={tab}
|
||||
type="button"
|
||||
onClick={() => onTabChange(tab)}
|
||||
className={`pb-3 text-sm font-bold uppercase tracking-wider border-b-2 transition-colors duration-[var(--duration-normal)] ${activeTab === tab ? 'border-primary text-foreground' : 'border-transparent text-muted-foreground hover:text-foreground'}`}
|
||||
className={`pb-3 text-sm font-bold uppercase tracking-wider border-b-2 transition-colors duration-[var(--sumi-duration-normal)] ${activeTab === tab ? 'border-primary text-foreground' : 'border-transparent text-muted-foreground hover:text-foreground'}`}
|
||||
>
|
||||
{tab}
|
||||
</button>
|
||||
|
|
@ -111,7 +111,7 @@ export function CourseDetailViewTabs({
|
|||
className="p-4 flex justify-between items-center cursor-pointer hover:bg-white/5 transition-colors w-full text-left"
|
||||
onClick={() => onToggleModule(module.id)}
|
||||
>
|
||||
<h4 className="font-bold text-white flex items-center gap-4">
|
||||
<h4 className="font-bold text-foreground flex items-center gap-4">
|
||||
{expandedModule === module.id || expandedModule === 'all' ? (
|
||||
<ChevronUp className="w-4 h-4" />
|
||||
) : (
|
||||
|
|
@ -129,7 +129,7 @@ export function CourseDetailViewTabs({
|
|||
{module.lessons.map((lesson) => (
|
||||
<div
|
||||
key={lesson.id}
|
||||
className="p-4 pl-8 flex justify-between items-center hover:bg-muted/50 border-b border-border last:border-0 transition-colors duration-[var(--duration-normal)]"
|
||||
className="p-4 pl-8 flex justify-between items-center hover:bg-muted/50 border-b border-border last:border-0 transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
>
|
||||
<div className="flex items-center gap-4 text-sm text-foreground">
|
||||
{lesson.type === 'video' ? (
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ export function CourseLearningViewPlayer({
|
|||
return (
|
||||
<div className="bg-black aspect-video w-full flex items-center justify-center relative">
|
||||
<div className="text-center">
|
||||
<PlayCircle className="w-16 h-16 text-white opacity-50 mx-auto mb-4" />
|
||||
<PlayCircle className="w-16 h-16 text-foreground opacity-50 mx-auto mb-4" />
|
||||
<p className="text-muted-foreground">Video Player Placeholder</p>
|
||||
<p className="text-xs text-muted-foreground mt-2">{lesson.title}</p>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ export function CourseLearningViewSidebar({
|
|||
key={lesson.id}
|
||||
type="button"
|
||||
onClick={() => onSelectLesson(lesson.id)}
|
||||
className={`flex items-start gap-4 p-4 cursor-pointer border-l-2 transition-all duration-[var(--duration-normal)] hover:bg-muted/50 w-full text-left ${isActive ? 'bg-primary/10 border-primary' : 'border-transparent'}`}
|
||||
className={`flex items-start gap-4 p-4 cursor-pointer border-l-2 transition-all duration-[var(--sumi-duration-normal)] hover:bg-muted/50 w-full text-left ${isActive ? 'bg-primary/10 border-primary' : 'border-transparent'}`}
|
||||
>
|
||||
<div className="mt-0.5">
|
||||
{isCompleted ? (
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ export function CourseLearningViewTabs({
|
|||
type="button"
|
||||
onClick={() => onTabChange(tab)}
|
||||
className={cn(
|
||||
'pb-3 text-sm font-bold uppercase tracking-wider border-b-2 transition-colors duration-[var(--duration-normal)]',
|
||||
'pb-3 text-sm font-bold uppercase tracking-wider border-b-2 transition-colors duration-[var(--sumi-duration-normal)]',
|
||||
activeTab === tab
|
||||
? 'border-primary text-foreground'
|
||||
: 'border-transparent text-muted-foreground hover:text-foreground',
|
||||
|
|
@ -86,7 +86,7 @@ export function CourseLearningViewTabs({
|
|||
{activeTab === 'notes' && (
|
||||
<div>
|
||||
<textarea
|
||||
className="w-full h-40 bg-muted border border-border rounded-xl p-4 text-foreground resize-none focus:border-primary outline-none transition-colors duration-[var(--duration-normal)]"
|
||||
className="w-full h-40 bg-muted border border-border rounded-xl p-4 text-foreground resize-none focus:border-primary outline-none transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
placeholder="Type your personal notes here..."
|
||||
/>
|
||||
<Button variant="secondary" size="sm" className="mt-2">
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ export const QuizModal: React.FC<QuizModalProps> = ({
|
|||
)}
|
||||
</div>
|
||||
|
||||
<h2 className="text-2xl font-bold text-white mb-2">
|
||||
<h2 className="text-2xl font-bold text-foreground mb-2">
|
||||
{passed ? 'Assessment Passed!' : 'Try Again'}
|
||||
</h2>
|
||||
<p className="text-muted-foreground mb-6">
|
||||
|
|
@ -107,18 +107,18 @@ export const QuizModal: React.FC<QuizModalProps> = ({
|
|||
<div className="relative w-full max-w-2xl bg-muted border border-border rounded-xl shadow-2xl animate-scaleIn overflow-hidden flex flex-col max-h-layout-modal-sm">
|
||||
{/* Header */}
|
||||
<div className="p-4 border-b border-border bg-card flex justify-between items-center">
|
||||
<h3 className="font-bold text-white flex items-center gap-2">
|
||||
<h3 className="font-bold text-foreground flex items-center gap-2">
|
||||
<HelpCircle className="w-5 h-5 text-muted-foreground" /> {quiz.title}
|
||||
</h3>
|
||||
<button onClick={onClose}>
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-white" />
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Progress */}
|
||||
<div className="h-1 bg-muted w-full">
|
||||
<div
|
||||
className="h-full bg-primary transition-all duration-[var(--duration-normal)]"
|
||||
className="h-full bg-primary transition-all duration-[var(--sumi-duration-normal)]"
|
||||
style={{
|
||||
width: `${((currentQuestionIndex + 1) / quiz.questions.length) * 100}%`,
|
||||
}}
|
||||
|
|
@ -130,7 +130,7 @@ export const QuizModal: React.FC<QuizModalProps> = ({
|
|||
<span className="text-xs font-bold text-muted-foreground uppercase mb-2 block">
|
||||
Question {currentQuestionIndex + 1} of {quiz.questions.length}
|
||||
</span>
|
||||
<h2 className="text-xl font-bold text-white mb-6 leading-relaxed">
|
||||
<h2 className="text-xl font-bold text-foreground mb-6 leading-relaxed">
|
||||
{currentQuestion.question}
|
||||
</h2>
|
||||
|
||||
|
|
@ -141,7 +141,7 @@ export const QuizModal: React.FC<QuizModalProps> = ({
|
|||
onClick={() => handleAnswerSelect(idx)}
|
||||
className={`w-full text-left p-4 rounded-lg border transition-all ${
|
||||
selectedAnswers[currentQuestionIndex] === idx
|
||||
? 'bg-primary/10 border-primary text-white'
|
||||
? 'bg-primary/10 border-primary text-foreground'
|
||||
: 'bg-card border-border text-foreground hover:bg-white/5 hover:border-border'
|
||||
}`}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ export function Progress({
|
|||
strokeDashoffset={strokeDashoffset}
|
||||
strokeLinecap="round"
|
||||
className={cn(
|
||||
'transition-all duration-[var(--duration-normal)] ease-in-out',
|
||||
'transition-all duration-[var(--sumi-duration-normal)] ease-in-out',
|
||||
!color && 'text-primary',
|
||||
)}
|
||||
style={color ? { stroke: color } : undefined}
|
||||
|
|
@ -109,7 +109,7 @@ export function Progress({
|
|||
>
|
||||
<div
|
||||
className={cn(
|
||||
'h-full rounded-full transition-all duration-[var(--duration-normal)] ease-in-out',
|
||||
'h-full rounded-full transition-all duration-[var(--sumi-duration-normal)] ease-in-out',
|
||||
!color && 'bg-primary',
|
||||
)}
|
||||
style={{
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ export function ToastComponent({ toast, onDismiss }: ToastProps) {
|
|||
<Card
|
||||
variant="glass"
|
||||
className={cn(
|
||||
'relative flex min-w-80 max-w-sm items-start gap-4 p-4 shadow-modal transition-all duration-[var(--duration-normal)] transform',
|
||||
'relative flex min-w-80 max-w-sm items-start gap-4 p-4 shadow-modal transition-all duration-[var(--sumi-duration-normal)] transform',
|
||||
variantClass,
|
||||
isVisible && !isLeaving
|
||||
? 'opacity-100 translate-x-0 translate-y-0 scale-100'
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ export function PasswordStrengthIndicator({
|
|||
<div className="flex-1 bg-muted/30 dark:bg-muted rounded-full h-2 overflow-hidden">
|
||||
<div
|
||||
className={cn(
|
||||
'h-2 rounded-full transition-all duration-[var(--duration-normal)]',
|
||||
'h-2 rounded-full transition-all duration-[var(--sumi-duration-normal)]',
|
||||
currentStrengthColor,
|
||||
)}
|
||||
style={{ width: `${(strength.score / 5) * 100}%` }}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ export const AchievementCard: React.FC<AchievementCardProps> = ({
|
|||
return (
|
||||
<Card
|
||||
variant={isUnlocked ? 'elevated' : 'default'}
|
||||
className={`relative overflow-hidden transition-all group ${isUnlocked ? 'border-warning/30 bg-warning/5 hover:-translate-y-1 hover:shadow-xl' : 'opacity-80 grayscale hover:grayscale-0 hover:opacity-100'}`}
|
||||
className={`relative overflow-hidden transition-all group ${isUnlocked ? 'border-warning/30 bg-warning/5 hover:shadow-xl' : 'opacity-80 grayscale hover:grayscale-0 hover:opacity-100'}`}
|
||||
>
|
||||
{/* Shine sweep animation for unlocked achievements */}
|
||||
{isUnlocked && (
|
||||
|
|
@ -62,7 +62,7 @@ export const AchievementCard: React.FC<AchievementCardProps> = ({
|
|||
{/* Progress */}
|
||||
<div className="w-full bg-card h-1.5 rounded-full overflow-hidden">
|
||||
<div
|
||||
className={`h-full transition-all duration-[var(--duration-slow)] ${isUnlocked ? 'bg-warning' : 'bg-muted'}`}
|
||||
className={`h-full transition-all duration-[var(--sumi-duration-slow)] ${isUnlocked ? 'bg-warning' : 'bg-muted'}`}
|
||||
style={{ width: `${percentage}%` }}
|
||||
></div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ export const LeaderboardView: React.FC = () => {
|
|||
return (
|
||||
<div
|
||||
key={entry.userId}
|
||||
className={`flex flex-col items-center transition-transform hover:-translate-y-1 ${i === 1 ? '-mt-12 order-2' : i === 0 ? 'order-1' : 'order-3'}`}
|
||||
className={`flex flex-col items-center transition-transform ${i === 1 ? '-mt-12 order-2' : i === 0 ? 'order-1' : 'order-3'}`}
|
||||
>
|
||||
<div className="relative mb-4">
|
||||
<div
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ export const XPBar: React.FC<XPBarProps> = ({
|
|||
|
||||
{/* Progress Fill */}
|
||||
<div
|
||||
className="h-full bg-gradient-to-r from-sumi-gold/80 to-warning transition-all duration-[var(--duration-slow)] shadow-gold-glow relative"
|
||||
className="h-full bg-gradient-to-r from-sumi-gold/80 to-warning transition-all duration-[var(--sumi-duration-slow)] shadow-gold-glow relative"
|
||||
style={{ width: `${percentage}%` }}
|
||||
>
|
||||
{/* Shimmer Effect */}
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ export const AddEquipmentView: React.FC = () => {
|
|||
return (
|
||||
<div className="animate-fadeIn max-w-4xl mx-auto pb-20">
|
||||
<div className="flex justify-between items-center mb-8">
|
||||
<h2 className="text-2xl font-heading font-bold text-white">
|
||||
<h2 className="text-2xl font-heading font-bold text-foreground">
|
||||
REGISTER EQUIPMENT
|
||||
</h2>
|
||||
<Button
|
||||
|
|
@ -53,10 +53,10 @@ export const AddEquipmentView: React.FC = () => {
|
|||
{/* Left: Media */}
|
||||
<div className="space-y-6">
|
||||
<Card variant="default">
|
||||
<h3 className="font-bold text-white mb-4 text-sm uppercase tracking-wider flex items-center gap-2">
|
||||
<h3 className="font-bold text-foreground mb-4 text-sm uppercase tracking-wider flex items-center gap-2">
|
||||
<Camera className="w-4 h-4 text-muted-foreground" /> Photos
|
||||
</h3>
|
||||
<div className="aspect-square bg-card border-2 border-dashed border-border rounded-xl flex flex-col items-center justify-center text-muted-foreground hover:text-white hover:border-border/50 cursor-pointer transition-colors group mb-4">
|
||||
<div className="aspect-square bg-card border-2 border-dashed border-border rounded-xl flex flex-col items-center justify-center text-muted-foreground hover:text-foreground hover:border-border/50 cursor-pointer transition-colors group mb-4">
|
||||
<Camera className="w-8 h-8 mb-2 transition-opacity group-hover:opacity-80" />
|
||||
<span className="text-xs font-bold uppercase">Upload Photos</span>
|
||||
</div>
|
||||
|
|
@ -71,7 +71,7 @@ export const AddEquipmentView: React.FC = () => {
|
|||
</Card>
|
||||
|
||||
<Card variant="default">
|
||||
<h3 className="font-bold text-white mb-4 text-sm uppercase tracking-wider flex items-center gap-2">
|
||||
<h3 className="font-bold text-foreground mb-4 text-sm uppercase tracking-wider flex items-center gap-2">
|
||||
<FileText className="w-4 h-4 text-muted-foreground" /> Documents
|
||||
</h3>
|
||||
<FileUpload />
|
||||
|
|
@ -84,7 +84,7 @@ export const AddEquipmentView: React.FC = () => {
|
|||
{/* Right: Form */}
|
||||
<div className="lg:col-span-2 space-y-6">
|
||||
<Card variant="default">
|
||||
<h3 className="font-bold text-white mb-6 border-b border-border pb-2">
|
||||
<h3 className="font-bold text-foreground mb-6 border-b border-border pb-2">
|
||||
Basic Information
|
||||
</h3>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 mb-4">
|
||||
|
|
@ -93,7 +93,7 @@ export const AddEquipmentView: React.FC = () => {
|
|||
Category
|
||||
</label>
|
||||
<select
|
||||
className="w-full bg-muted border border-border rounded-lg p-4 text-white focus:border-border outline-none"
|
||||
className="w-full bg-muted border border-border rounded-lg p-4 text-foreground focus:border-border outline-none"
|
||||
value={formData.category}
|
||||
onChange={(e) => handleChange('category', e.target.value)}
|
||||
>
|
||||
|
|
@ -135,7 +135,7 @@ export const AddEquipmentView: React.FC = () => {
|
|||
</Card>
|
||||
|
||||
<Card variant="default">
|
||||
<h3 className="font-bold text-white mb-6 border-b border-border pb-2">
|
||||
<h3 className="font-bold text-foreground mb-6 border-b border-border pb-2">
|
||||
Purchase & Warranty
|
||||
</h3>
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 mb-4">
|
||||
|
|
@ -171,11 +171,11 @@ export const AddEquipmentView: React.FC = () => {
|
|||
</Card>
|
||||
|
||||
<Card variant="default">
|
||||
<h3 className="font-bold text-white mb-4 border-b border-border pb-2">
|
||||
<h3 className="font-bold text-foreground mb-4 border-b border-border pb-2">
|
||||
Notes
|
||||
</h3>
|
||||
<textarea
|
||||
className="w-full bg-muted border border-border rounded-lg p-4 text-white focus:border-border outline-none min-h-25"
|
||||
className="w-full bg-muted border border-border rounded-lg p-4 text-foreground focus:border-border outline-none min-h-25"
|
||||
placeholder="Condition notes, modifications, etc..."
|
||||
value={formData.notes}
|
||||
onChange={(e) => handleChange('notes', e.target.value)}
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ export const EquipmentCard: React.FC<EquipmentCardProps> = ({
|
|||
<Badge label={item.category} variant="terminal" className="mb-2" />
|
||||
</div>
|
||||
|
||||
<h3 className="font-bold text-white text-base truncate mb-1">
|
||||
<h3 className="font-bold text-foreground text-base truncate mb-1">
|
||||
{item.name}
|
||||
</h3>
|
||||
<p className="text-warning text-xs font-mono uppercase mb-4">
|
||||
|
|
@ -56,7 +56,7 @@ export const EquipmentCard: React.FC<EquipmentCardProps> = ({
|
|||
<div className="flex items-center gap-1 text-muted-foreground">
|
||||
<Tag className="w-3 h-3" /> {item.condition}
|
||||
</div>
|
||||
<div className="flex items-center gap-1 font-mono text-white font-bold">
|
||||
<div className="flex items-center gap-1 font-mono text-foreground font-bold">
|
||||
<DollarSign className="w-3 h-3 text-muted-foreground" />{' '}
|
||||
{item.purchasePrice}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ export const InventoryView: React.FC<InventoryViewProps> = ({ onNavigate }) => {
|
|||
{/* Header */}
|
||||
<div className="flex flex-col md:flex-row justify-between items-end border-b border-border/50 pb-6 gap-4">
|
||||
<div>
|
||||
<h2 className="text-2xl font-heading font-bold text-white mb-2">
|
||||
<h2 className="text-2xl font-heading font-bold text-foreground mb-2">
|
||||
GEAR INVENTORY
|
||||
</h2>
|
||||
<p className="text-muted-foreground font-mono text-sm">
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ export function EquipmentDetailViewGallery({
|
|||
<button
|
||||
type="button"
|
||||
onClick={onPrev}
|
||||
className="absolute left-4 top-1/2 -translate-y-1/2 p-2 bg-black/50 hover:bg-black/80 text-white rounded-full opacity-0 group-hover:opacity-100 transition-opacity"
|
||||
className="absolute left-4 top-1/2 -translate-y-1/2 p-2 bg-black/50 hover:bg-black/80 text-foreground rounded-full opacity-0 group-hover:opacity-100 transition-opacity"
|
||||
aria-label="Image précédente"
|
||||
>
|
||||
<ChevronLeft className="w-6 h-6" />
|
||||
|
|
@ -33,7 +33,7 @@ export function EquipmentDetailViewGallery({
|
|||
<button
|
||||
type="button"
|
||||
onClick={onNext}
|
||||
className="absolute right-4 top-1/2 -translate-y-1/2 p-2 bg-black/50 hover:bg-black/80 text-white rounded-full opacity-0 group-hover:opacity-100 transition-opacity"
|
||||
className="absolute right-4 top-1/2 -translate-y-1/2 p-2 bg-black/50 hover:bg-black/80 text-foreground rounded-full opacity-0 group-hover:opacity-100 transition-opacity"
|
||||
aria-label="Image suivante"
|
||||
>
|
||||
<ChevronRight className="w-6 h-6" />
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ export const AudioPlayer: React.FC = () => {
|
|||
className="w-12 h-12 rounded shadow-lg"
|
||||
/>
|
||||
<div className="flex-1 min-w-0">
|
||||
<div className="text-sm font-bold text-white truncate">
|
||||
<div className="text-sm font-bold text-foreground truncate">
|
||||
{currentTrack.title}
|
||||
</div>
|
||||
<div className="text-xs text-muted-foreground truncate">
|
||||
|
|
@ -137,7 +137,7 @@ export const AudioPlayer: React.FC = () => {
|
|||
onDragEnd={onDragEnd}
|
||||
className={`flex items-center gap-4 p-2 rounded-lg group transition-colors border border-transparent ${draggedItemIndex === i ? 'bg-primary/10 border-primary/50' : 'hover:bg-white/5 hover:border-white/5'}`}
|
||||
>
|
||||
<div className="cursor-grab active:cursor-grabbing text-muted-foreground hover:text-white p-1">
|
||||
<div className="cursor-grab active:cursor-grabbing text-muted-foreground hover:text-foreground p-1">
|
||||
<GripVertical className="w-4 h-4" />
|
||||
</div>
|
||||
<div className="relative w-8 h-8 rounded overflow-hidden flex-shrink-0">
|
||||
|
|
@ -150,7 +150,7 @@ export const AudioPlayer: React.FC = () => {
|
|||
className="absolute inset-0 bg-black/50 hidden group-hover:flex items-center justify-center cursor-pointer"
|
||||
onClick={() => playTrack(track)}
|
||||
>
|
||||
<Play className="w-3 h-3 text-white fill-current" />
|
||||
<Play className="w-3 h-3 text-foreground fill-current" />
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex-1 min-w-0 select-none">
|
||||
|
|
@ -164,7 +164,7 @@ export const AudioPlayer: React.FC = () => {
|
|||
|
||||
<div className="flex items-center opacity-0 group-hover:opacity-100 transition-opacity gap-1">
|
||||
<button
|
||||
className="p-1.5 hover:text-white"
|
||||
className="p-1.5 hover:text-foreground"
|
||||
title="Play Next"
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
|
|
@ -220,7 +220,7 @@ export const AudioPlayer: React.FC = () => {
|
|||
</div>
|
||||
</div>
|
||||
<button
|
||||
className="p-1.5 text-muted-foreground hover:text-white opacity-0 group-hover:opacity-100 transition-opacity"
|
||||
className="p-1.5 text-muted-foreground hover:text-foreground opacity-0 group-hover:opacity-100 transition-opacity"
|
||||
onClick={() => {
|
||||
addToQueue(track);
|
||||
addToast('Added back to Queue');
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import { UserProfilePage } from '@/features/profile/pages/UserProfilePage';
|
|||
|
||||
const placeholderContent = (
|
||||
<div className="space-y-4">
|
||||
<h1 className="text-3xl font-bold text-white">Dashboard Content</h1>
|
||||
<h1 className="text-3xl font-bold text-foreground">Dashboard Content</h1>
|
||||
<p className="text-gray-400">This is the main content area rendered within the layout.</p>
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
||||
<div className="h-32 bg-white/5 rounded-xl border border-white/10 p-4">Card 1</div>
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ const meta = {
|
|||
(Story) => (
|
||||
<div className="h-screen bg-background">
|
||||
<Story />
|
||||
<div className="pt-24 px-8 text-white">
|
||||
<div className="pt-24 px-8 text-foreground">
|
||||
<h1>Page Content</h1>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -31,12 +31,12 @@ export function Layout({ children }: LayoutProps) {
|
|||
|
||||
<Header />
|
||||
|
||||
<div className="flex relative z-10 transition-all duration-[var(--duration-slow)]">
|
||||
<div className="flex relative z-10 transition-all duration-[var(--sumi-duration-slow)]">
|
||||
<Sidebar />
|
||||
|
||||
<main
|
||||
className={cn(
|
||||
'flex-1 min-h-layout-main transition-all duration-[var(--duration-normal)] ease-[var(--ease-in-out)] pb-20 lg:pb-0',
|
||||
'flex-1 min-h-layout-main transition-all duration-[var(--sumi-duration-normal)] ease-[var(--sumi-ease-in-out)] pb-20 lg:pb-0',
|
||||
sidebarOpen ? 'lg:ml-main-expanded' : 'lg:ml-main-collapsed max-lg:ml-0',
|
||||
)}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ const meta = {
|
|||
(Story) => (
|
||||
<div className="flex h-screen bg-background">
|
||||
<Story />
|
||||
<div className="flex-1 p-8 text-white ml-20 lg:ml-72">
|
||||
<div className="flex-1 p-8 text-foreground ml-20 lg:ml-72">
|
||||
<h1>Main Content Area</h1>
|
||||
<p>Resize the viewport to see responsive behavior.</p>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ currentView }) => {
|
|||
{idx > 0 && (
|
||||
<div
|
||||
className={cn(
|
||||
'h-px bg-border/50 mx-3 my-1.5 transition-opacity duration-[var(--duration-normal)]',
|
||||
'h-px bg-border/50 mx-3 my-1.5 transition-opacity duration-[var(--sumi-duration-normal)]',
|
||||
!sidebarOpen && 'mx-1'
|
||||
)}
|
||||
aria-hidden="true"
|
||||
|
|
@ -163,7 +163,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ currentView }) => {
|
|||
|
||||
<h3
|
||||
className={cn(
|
||||
'text-xs font-medium text-muted-foreground mb-2 px-3 transition-all duration-[var(--duration-normal)] uppercase tracking-wider',
|
||||
'text-xs font-medium text-muted-foreground mb-2 px-3 transition-all duration-[var(--sumi-duration-normal)] uppercase tracking-wider',
|
||||
!sidebarOpen && 'opacity-0 h-0 overflow-hidden mb-0 px-0'
|
||||
)}
|
||||
id={`sidebar-section-${group.section.replace(/\s+/g, '-').toLowerCase()}`}
|
||||
|
|
@ -202,7 +202,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ currentView }) => {
|
|||
|
||||
<span
|
||||
className={cn(
|
||||
'transition-all duration-[var(--duration-normal)] whitespace-nowrap truncate',
|
||||
'transition-all duration-[var(--sumi-duration-normal)] whitespace-nowrap truncate',
|
||||
sidebarOpen ? 'opacity-100' : 'w-0 opacity-0 overflow-hidden'
|
||||
)}
|
||||
>
|
||||
|
|
@ -256,7 +256,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ currentView }) => {
|
|||
/>
|
||||
<span
|
||||
className={cn(
|
||||
'truncate transition-all duration-[var(--duration-normal)]',
|
||||
'truncate transition-all duration-[var(--sumi-duration-normal)]',
|
||||
sidebarOpen ? 'opacity-100' : 'w-0 opacity-0 overflow-hidden'
|
||||
)}
|
||||
>
|
||||
|
|
@ -279,7 +279,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ currentView }) => {
|
|||
<LogOut className="w-4 h-4 shrink-0 transition-transform duration-[var(--duration-fast)] group-hover:scale-110" />
|
||||
<span
|
||||
className={cn(
|
||||
'whitespace-nowrap transition-all duration-[var(--duration-normal)]',
|
||||
'whitespace-nowrap transition-all duration-[var(--sumi-duration-normal)]',
|
||||
sidebarOpen ? 'opacity-100' : 'w-0 opacity-0 overflow-hidden'
|
||||
)}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ export const AutoMetadataDetectionModal: React.FC<
|
|||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h4 className="text-lg font-bold text-white animate-pulse">
|
||||
<h4 className="text-lg font-bold text-foreground animate-pulse">
|
||||
Analyzing Audio...
|
||||
</h4>
|
||||
<p className="text-sm text-muted-foreground mt-2">
|
||||
|
|
@ -71,7 +71,7 @@ export const AutoMetadataDetectionModal: React.FC<
|
|||
<div className="text-xs text-muted-foreground uppercase font-bold mb-1">
|
||||
Detected BPM
|
||||
</div>
|
||||
<div className="text-2xl font-bold text-white">
|
||||
<div className="text-2xl font-bold text-foreground">
|
||||
{result?.bpm}
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -87,7 +87,7 @@ export const AutoMetadataDetectionModal: React.FC<
|
|||
<div className="text-xs text-muted-foreground uppercase font-bold mb-1">
|
||||
Genre
|
||||
</div>
|
||||
<div className="text-lg font-medium text-white">
|
||||
<div className="text-lg font-medium text-foreground">
|
||||
{result?.genre}
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -41,14 +41,14 @@ export const WatermarkSettingsModal: React.FC<WatermarkSettingsModalProps> = ({
|
|||
{/* Left: Controls */}
|
||||
<div className="w-full md:w-1/2 p-6 border-r border-border bg-card">
|
||||
<div className="flex justify-between items-center mb-6">
|
||||
<h3 className="font-bold text-white flex items-center gap-2">
|
||||
<h3 className="font-bold text-foreground flex items-center gap-2">
|
||||
<Stamp className="w-4 h-4 text-destructive" /> Watermark
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div className="space-y-6">
|
||||
<label className="flex items-center justify-between cursor-pointer">
|
||||
<span className="text-sm font-medium text-white">
|
||||
<span className="text-sm font-medium text-foreground">
|
||||
Enable Watermarking
|
||||
</span>
|
||||
<div
|
||||
|
|
@ -77,7 +77,7 @@ export const WatermarkSettingsModal: React.FC<WatermarkSettingsModalProps> = ({
|
|||
<button
|
||||
key={i}
|
||||
onClick={() => setPosition(i)}
|
||||
className={`h-10 rounded border text-xs uppercase font-bold transition-all ${position === i ? 'bg-destructive border-destructive text-white' : 'bg-background border-border text-muted-foreground hover:border-border'}`}
|
||||
className={`h-10 rounded border text-xs uppercase font-bold transition-all ${position === i ? 'bg-destructive border-destructive text-foreground' : 'bg-background border-border text-muted-foreground hover:border-border'}`}
|
||||
>
|
||||
{/* Icon representation usually better, but text works for demo */}
|
||||
<div
|
||||
|
|
@ -124,7 +124,7 @@ export const WatermarkSettingsModal: React.FC<WatermarkSettingsModalProps> = ({
|
|||
|
||||
{/* Right: Preview */}
|
||||
<div className="w-full md:w-1/2 bg-black relative flex items-center justify-center overflow-hidden">
|
||||
<div className="absolute top-4 right-4 z-10 bg-black/50 px-2 py-1 rounded text-xs text-white font-mono flex items-center gap-2">
|
||||
<div className="absolute top-4 right-4 z-10 bg-black/50 px-2 py-1 rounded text-xs text-foreground font-mono flex items-center gap-2">
|
||||
<Eye className="w-3 h-3" /> PREVIEW
|
||||
</div>
|
||||
|
||||
|
|
@ -159,7 +159,7 @@ export const WatermarkSettingsModal: React.FC<WatermarkSettingsModalProps> = ({
|
|||
}`}
|
||||
>
|
||||
<span
|
||||
className="text-white font-bold text-xl uppercase whitespace-nowrap transform -rotate-12 border-4 border-white/50 px-4 py-1"
|
||||
className="text-foreground font-bold text-xl uppercase whitespace-nowrap transform -rotate-12 border-4 border-white/50 px-4 py-1"
|
||||
style={{ opacity: opacity / 100 }}
|
||||
>
|
||||
{text}
|
||||
|
|
|
|||
|
|
@ -77,16 +77,16 @@ export const AddToPlaylistModal: React.FC<AddToPlaylistModalProps> = ({
|
|||
></div>
|
||||
<div className="relative w-full max-w-md bg-muted border border-border rounded-xl shadow-2xl animate-scaleIn overflow-hidden flex flex-col max-h-layout-modal-xs">
|
||||
<div className="p-4 border-b border-border bg-card flex justify-between items-center">
|
||||
<h3 className="font-bold text-white">Add to Playlist</h3>
|
||||
<h3 className="font-bold text-foreground">Add to Playlist</h3>
|
||||
<button onClick={onClose}>
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-white" />
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="p-4">
|
||||
<div className="relative mb-4">
|
||||
<input
|
||||
className="w-full bg-background border border-border rounded-lg py-2 pl-9 pr-4 text-white text-sm focus:border-border outline-none"
|
||||
className="w-full bg-background border border-border rounded-lg py-2 pl-9 pr-4 text-foreground text-sm focus:border-border outline-none"
|
||||
placeholder="Find playlist"
|
||||
value={search}
|
||||
onChange={(e) => setSearch(e.target.value)}
|
||||
|
|
@ -97,7 +97,7 @@ export const AddToPlaylistModal: React.FC<AddToPlaylistModalProps> = ({
|
|||
|
||||
<Button
|
||||
variant="ghost"
|
||||
className="w-full justify-start border border-dashed border-border mb-4 hover:border-border/50 hover:text-white group"
|
||||
className="w-full justify-start border border-dashed border-border mb-4 hover:border-border/50 hover:text-foreground group"
|
||||
onClick={() => addToast('New Playlist Flow')}
|
||||
>
|
||||
<div className="w-8 h-8 bg-muted rounded flex items-center justify-center mr-3 group-hover:bg-white/5">
|
||||
|
|
@ -119,7 +119,7 @@ export const AddToPlaylistModal: React.FC<AddToPlaylistModalProps> = ({
|
|||
/>
|
||||
<div className="flex-1 min-w-0">
|
||||
<div
|
||||
className={`text-sm font-bold truncate ${selectedIds.includes(playlist.id) ? 'text-primary' : 'text-white'}`}
|
||||
className={`text-sm font-bold truncate ${selectedIds.includes(playlist.id) ? 'text-primary' : 'text-foreground'}`}
|
||||
>
|
||||
{playlist.title}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ export const CreatePlaylistModal: React.FC<CreatePlaylistModalProps> = ({
|
|||
}
|
||||
>
|
||||
<div className="flex flex-col md:flex-row gap-6">
|
||||
<div className="w-40 h-40 bg-card border-2 border-dashed border-border rounded-lg flex flex-col items-center justify-center text-muted-foreground hover:text-white hover:border-border/50 cursor-pointer transition-colors flex-shrink-0">
|
||||
<div className="w-40 h-40 bg-card border-2 border-dashed border-border rounded-lg flex flex-col items-center justify-center text-muted-foreground hover:text-foreground hover:border-border/50 cursor-pointer transition-colors flex-shrink-0">
|
||||
<ImageIcon className="w-8 h-8 mb-2" />
|
||||
<span className="text-xs font-bold uppercase">Cover</span>
|
||||
</div>
|
||||
|
|
@ -61,7 +61,7 @@ export const CreatePlaylistModal: React.FC<CreatePlaylistModalProps> = ({
|
|||
/>
|
||||
|
||||
<textarea
|
||||
className="w-full bg-card border border-border rounded-lg p-4 text-white focus:border-border outline-none text-sm resize-none h-24"
|
||||
className="w-full bg-card border border-border rounded-lg p-4 text-foreground focus:border-border outline-none text-sm resize-none h-24"
|
||||
placeholder="Description (Optional)"
|
||||
value={description}
|
||||
onChange={(e) => setDescription(e.target.value)}
|
||||
|
|
@ -79,7 +79,7 @@ export const CreatePlaylistModal: React.FC<CreatePlaylistModalProps> = ({
|
|||
<Lock className="w-4 h-4 text-warning" />
|
||||
)}
|
||||
<div className="text-sm">
|
||||
<div className="text-white font-bold">
|
||||
<div className="text-foreground font-bold">
|
||||
{isPublic ? 'Public' : 'Private'}
|
||||
</div>
|
||||
<div className="text-xs text-muted-foreground">
|
||||
|
|
@ -107,7 +107,7 @@ export const CreatePlaylistModal: React.FC<CreatePlaylistModalProps> = ({
|
|||
className={`w-4 h-4 ${isCollaborative ? 'text-success' : 'text-muted-foreground'}`}
|
||||
/>
|
||||
<div className="text-sm">
|
||||
<div className="text-white font-bold">Collaborative</div>
|
||||
<div className="text-foreground font-bold">Collaborative</div>
|
||||
<div className="text-xs text-muted-foreground">
|
||||
Friends can add tracks
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ export const EditPlaylistModal: React.FC<EditPlaylistModalProps> = ({
|
|||
onClick={() => setShowDeleteConfirm(false)}
|
||||
></div>
|
||||
<div className="relative w-full max-w-sm bg-muted border border-destructive rounded-xl shadow-2xl animate-scaleIn p-6 text-center">
|
||||
<h3 className="text-xl font-bold text-white mb-2">
|
||||
<h3 className="text-xl font-bold text-foreground mb-2">
|
||||
Delete "{playlist.title}"?
|
||||
</h3>
|
||||
<p className="text-sm text-muted-foreground mb-6">
|
||||
|
|
@ -77,9 +77,9 @@ export const EditPlaylistModal: React.FC<EditPlaylistModalProps> = ({
|
|||
></div>
|
||||
<div className="relative w-full max-w-lg bg-muted border border-border rounded-xl shadow-2xl animate-scaleIn overflow-hidden">
|
||||
<div className="p-4 border-b border-border bg-card flex justify-between items-center">
|
||||
<h3 className="font-bold text-white">Edit Details</h3>
|
||||
<h3 className="font-bold text-foreground">Edit Details</h3>
|
||||
<button onClick={onClose}>
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-white" />
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
|
@ -90,7 +90,7 @@ export const EditPlaylistModal: React.FC<EditPlaylistModalProps> = ({
|
|||
className="w-full h-full object-cover opacity-60 group-hover:opacity-40 transition-opacity"
|
||||
/>
|
||||
<div className="absolute inset-0 flex items-center justify-center opacity-0 group-hover:opacity-100">
|
||||
<ImageIcon className="w-8 h-8 text-white" />
|
||||
<ImageIcon className="w-8 h-8 text-foreground" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -102,7 +102,7 @@ export const EditPlaylistModal: React.FC<EditPlaylistModalProps> = ({
|
|||
/>
|
||||
|
||||
<textarea
|
||||
className="w-full bg-muted border border-border rounded-lg p-4 text-white focus:border-border outline-none text-sm resize-none h-24"
|
||||
className="w-full bg-muted border border-border rounded-lg p-4 text-foreground focus:border-border outline-none text-sm resize-none h-24"
|
||||
placeholder="Description"
|
||||
value={description}
|
||||
onChange={(e) => setDescription(e.target.value)}
|
||||
|
|
@ -120,7 +120,7 @@ export const EditPlaylistModal: React.FC<EditPlaylistModalProps> = ({
|
|||
<Lock className="w-4 h-4 text-warning" />
|
||||
)}
|
||||
<div className="text-sm">
|
||||
<div className="text-white font-bold">
|
||||
<div className="text-foreground font-bold">
|
||||
{isPublic ? 'Public' : 'Private'}
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -33,9 +33,9 @@ export const SaveQueueAsPlaylistModal: React.FC<
|
|||
></div>
|
||||
<div className="relative w-full max-w-md bg-card border border-border rounded-xl shadow-2xl animate-scaleIn">
|
||||
<div className="p-4 border-b border-border bg-card flex justify-between items-center">
|
||||
<h3 className="font-bold text-white">Save Queue as Playlist</h3>
|
||||
<h3 className="font-bold text-foreground">Save Queue as Playlist</h3>
|
||||
<button onClick={onClose}>
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-white" />
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
|
@ -59,7 +59,7 @@ export const SaveQueueAsPlaylistModal: React.FC<
|
|||
<Lock className="w-5 h-5 text-warning" />
|
||||
)}
|
||||
<div>
|
||||
<div className="text-sm font-bold text-white">
|
||||
<div className="text-sm font-bold text-foreground">
|
||||
{isPublic ? 'Public Playlist' : 'Private Playlist'}
|
||||
</div>
|
||||
<div className="text-xs text-muted-foreground">
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ export const LiveStreamDetailView: React.FC<LiveStreamDetailViewProps> = ({
|
|||
if (!chatInput.trim()) return;
|
||||
setMessages([
|
||||
...messages,
|
||||
{ id: Date.now(), user: 'You', text: chatInput, color: 'text-white' },
|
||||
{ id: Date.now(), user: 'You', text: chatInput, color: 'text-foreground' },
|
||||
]);
|
||||
setChatInput('');
|
||||
};
|
||||
|
|
@ -88,7 +88,7 @@ export const LiveStreamDetailView: React.FC<LiveStreamDetailViewProps> = ({
|
|||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className="bg-black/50 backdrop-blur pointer-events-auto text-white hover:bg-black/70"
|
||||
className="bg-black/50 backdrop-blur pointer-events-auto text-foreground hover:bg-black/70"
|
||||
onClick={onBack}
|
||||
>
|
||||
<ArrowLeft className="w-4 h-4 mr-2" /> Back
|
||||
|
|
@ -118,7 +118,7 @@ export const LiveStreamDetailView: React.FC<LiveStreamDetailViewProps> = ({
|
|||
/>
|
||||
</div>
|
||||
<div>
|
||||
<h1 className="text-3xl font-bold text-white mb-1">
|
||||
<h1 className="text-3xl font-bold text-foreground mb-1">
|
||||
{MOCK_STREAM.title}
|
||||
</h1>
|
||||
<div className="flex items-center gap-4 text-sm">
|
||||
|
|
@ -128,7 +128,7 @@ export const LiveStreamDetailView: React.FC<LiveStreamDetailViewProps> = ({
|
|||
<span className="flex items-center gap-1 text-destructive font-bold animate-pulse">
|
||||
<Radio className="w-3 h-3" /> LIVE
|
||||
</span>
|
||||
<span className="flex items-center gap-1 text-white">
|
||||
<span className="flex items-center gap-1 text-foreground">
|
||||
<Users className="w-3 h-3" />{' '}
|
||||
{MOCK_STREAM.viewers.toLocaleString()}
|
||||
</span>
|
||||
|
|
@ -138,7 +138,7 @@ export const LiveStreamDetailView: React.FC<LiveStreamDetailViewProps> = ({
|
|||
<div className="flex gap-4">
|
||||
<Button
|
||||
variant="secondary"
|
||||
className="bg-black/50 backdrop-blur border-white/20 text-white"
|
||||
className="bg-black/50 backdrop-blur border-white/20 text-foreground"
|
||||
icon={<Heart className="w-4 h-4" />}
|
||||
>
|
||||
Follow
|
||||
|
|
@ -154,7 +154,7 @@ export const LiveStreamDetailView: React.FC<LiveStreamDetailViewProps> = ({
|
|||
<Button
|
||||
variant="ghost"
|
||||
size="icon"
|
||||
className="bg-black/50 backdrop-blur text-white"
|
||||
className="bg-black/50 backdrop-blur text-foreground"
|
||||
>
|
||||
<Share2 className="w-4 h-4" />
|
||||
</Button>
|
||||
|
|
@ -166,8 +166,8 @@ export const LiveStreamDetailView: React.FC<LiveStreamDetailViewProps> = ({
|
|||
{/* Chat Sidebar */}
|
||||
<div className="w-80 md:w-96 bg-muted border-l border-border flex flex-col z-20 shadow-2xl">
|
||||
<div className="p-4 border-b border-border bg-card flex justify-between items-center">
|
||||
<h3 className="font-bold text-white text-sm">LIVE CHAT</h3>
|
||||
<Settings className="w-4 h-4 text-muted-foreground cursor-pointer hover:text-white" />
|
||||
<h3 className="font-bold text-foreground text-sm">LIVE CHAT</h3>
|
||||
<Settings className="w-4 h-4 text-muted-foreground cursor-pointer hover:text-foreground" />
|
||||
</div>
|
||||
|
||||
<div className="flex-1 overflow-y-auto p-4 space-y-2 font-mono text-sm custom-scrollbar">
|
||||
|
|
@ -186,7 +186,7 @@ export const LiveStreamDetailView: React.FC<LiveStreamDetailViewProps> = ({
|
|||
<div className="p-4 border-t border-border bg-card">
|
||||
<div className="relative">
|
||||
<input
|
||||
className="w-full bg-background border border-border rounded-full py-2.5 pl-4 pr-10 text-white text-sm focus:border-border outline-none"
|
||||
className="w-full bg-background border border-border rounded-full py-2.5 pl-4 pr-10 text-foreground text-sm focus:border-border outline-none"
|
||||
placeholder="Send a message..."
|
||||
value={chatInput}
|
||||
onChange={(e) => setChatInput(e.target.value)}
|
||||
|
|
@ -207,7 +207,7 @@ export const LiveStreamDetailView: React.FC<LiveStreamDetailViewProps> = ({
|
|||
<Button
|
||||
variant="ghost"
|
||||
size="icon"
|
||||
className="text-warning hover:text-white"
|
||||
className="text-warning hover:text-foreground"
|
||||
title="Send Tip"
|
||||
onClick={() => setShowTipModal(true)}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ export const TipStreamerModal: React.FC<TipStreamerModalProps> = ({
|
|||
<DollarSign className="w-5 h-5" /> Support {streamerName}
|
||||
</h3>
|
||||
<button onClick={onClose}>
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-white" />
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
|
@ -58,7 +58,7 @@ export const TipStreamerModal: React.FC<TipStreamerModalProps> = ({
|
|||
<button
|
||||
key={val}
|
||||
onClick={() => setAmount(val)}
|
||||
className={`flex-1 py-2 rounded font-bold border transition-colors ${amount === val ? 'bg-warning text-black border-warning' : 'bg-background border-border text-muted-foreground hover:text-white'}`}
|
||||
className={`flex-1 py-2 rounded font-bold border transition-colors ${amount === val ? 'bg-warning text-black border-warning' : 'bg-background border-border text-muted-foreground hover:text-foreground'}`}
|
||||
>
|
||||
${val}
|
||||
</button>
|
||||
|
|
@ -70,7 +70,7 @@ export const TipStreamerModal: React.FC<TipStreamerModalProps> = ({
|
|||
</span>
|
||||
<input
|
||||
type="number"
|
||||
className="w-full bg-card border border-border rounded pl-8 pr-4 py-2 text-white font-mono focus:border-warning outline-none"
|
||||
className="w-full bg-card border border-border rounded pl-8 pr-4 py-2 text-foreground font-mono focus:border-warning outline-none"
|
||||
value={amount}
|
||||
onChange={(e) => setAmount(e.target.value)}
|
||||
placeholder="Custom Amount"
|
||||
|
|
@ -84,7 +84,7 @@ export const TipStreamerModal: React.FC<TipStreamerModalProps> = ({
|
|||
Message (Optional)
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-card border border-border rounded p-4 text-white focus:border-warning outline-none text-sm resize-none h-24"
|
||||
className="w-full bg-card border border-border rounded p-4 text-foreground focus:border-warning outline-none text-sm resize-none h-24"
|
||||
placeholder={`Say something nice to ${streamerName}...`}
|
||||
value={message}
|
||||
onChange={(e) => setMessage(e.target.value)}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ export const LicenceCard: React.FC<LicenceCardProps> = ({
|
|||
>
|
||||
<div className="flex justify-between items-start mb-4">
|
||||
<div>
|
||||
<h4 className="font-bold text-white text-lg">{license.name}</h4>
|
||||
<h4 className="font-bold text-foreground text-lg">{license.name}</h4>
|
||||
{license.isPopular && (
|
||||
<span className="text-xs text-black bg-warning px-2 py-0.5 rounded font-bold uppercase">
|
||||
Popular
|
||||
|
|
|
|||
|
|
@ -34,14 +34,14 @@ const ProductCardComponent: React.FC<ProductCardProps> = ({
|
|||
>
|
||||
<Card
|
||||
variant="glass"
|
||||
className="group p-0 overflow-hidden border-white/5 bg-black/20 backdrop-blur-xl hover-glow-cyan transition-all duration-[var(--duration-normal)] cursor-pointer hover:-translate-y-1 hover:shadow-lg hover:border-white/10"
|
||||
className="group p-0 overflow-hidden border-white/5 bg-black/20 backdrop-blur-xl transition-all duration-[var(--sumi-duration-normal)] cursor-pointer hover:shadow-lg hover:border-white/10"
|
||||
onClick={() => onClick(product)}
|
||||
>
|
||||
{/* Image & Overlay */}
|
||||
<div className="relative aspect-square overflow-hidden bg-black">
|
||||
<OptimizedImage
|
||||
src={product.coverUrl || (product as any).cover_url || 'https://picsum.photos/400'}
|
||||
className={`w-full h-full object-cover group-hover:scale-105 transition-transform duration-[var(--duration-normal)] ${isPlayingPreview ? 'scale-110 blur-sm opacity-50' : ''}`}
|
||||
className={`w-full h-full object-cover group-hover:scale-105 transition-transform duration-[var(--sumi-duration-normal)] ${isPlayingPreview ? 'scale-110 blur-sm opacity-50' : ''}`}
|
||||
alt={product.title}
|
||||
/>
|
||||
|
||||
|
|
@ -64,7 +64,7 @@ const ProductCardComponent: React.FC<ProductCardProps> = ({
|
|||
</div>
|
||||
|
||||
{/* Play Button Overlay */}
|
||||
<div className="absolute inset-0 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-[var(--duration-normal)]">
|
||||
<div className="absolute inset-0 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-[var(--sumi-duration-normal)]">
|
||||
<button
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
|
|
@ -101,7 +101,7 @@ const ProductCardComponent: React.FC<ProductCardProps> = ({
|
|||
{/* Details */}
|
||||
<div className="p-6">
|
||||
<div className="flex justify-between items-start mb-1">
|
||||
<h3 className="font-bold text-foreground text-base truncate pr-2 group-hover:text-white transition-colors">
|
||||
<h3 className="font-bold text-foreground text-base truncate pr-2 group-hover:text-foreground transition-colors">
|
||||
{product.title}
|
||||
</h3>
|
||||
</div>
|
||||
|
|
@ -133,7 +133,7 @@ const ProductCardComponent: React.FC<ProductCardProps> = ({
|
|||
<Button
|
||||
variant="primary"
|
||||
size="sm"
|
||||
className="flex-1 opacity-0 translate-y-1 group-hover:opacity-100 group-hover:translate-y-0 transition-all duration-[var(--duration-normal)]"
|
||||
className="flex-1 opacity-0 translate-y-1 group-hover:opacity-100 group-hover:translate-y-0 transition-all duration-[var(--sumi-duration-normal)]"
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
onAddToCart(product);
|
||||
|
|
|
|||
|
|
@ -22,18 +22,18 @@ export const LicenceDetailsModal: React.FC<LicenceDetailsModalProps> = ({
|
|||
></div>
|
||||
<div className="relative w-full max-w-lg bg-muted border border-border rounded-xl shadow-2xl animate-scaleIn overflow-hidden flex flex-col max-h-layout-modal-sm">
|
||||
<div className="p-4 border-b border-border bg-card flex justify-between items-center">
|
||||
<h3 className="font-bold text-white flex items-center gap-2">
|
||||
<h3 className="font-bold text-foreground flex items-center gap-2">
|
||||
<ShieldCheck className="w-5 h-5 text-muted-foreground" /> License Agreement
|
||||
</h3>
|
||||
<button onClick={onClose}>
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-white" />
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="p-6 flex-1 overflow-y-auto">
|
||||
<div className="flex justify-between items-end mb-6">
|
||||
<div>
|
||||
<h2 className="text-2xl font-bold text-white">
|
||||
<h2 className="text-2xl font-bold text-foreground">
|
||||
{license.name} License
|
||||
</h2>
|
||||
<p className="text-muted-foreground text-sm">
|
||||
|
|
@ -47,7 +47,7 @@ export const LicenceDetailsModal: React.FC<LicenceDetailsModalProps> = ({
|
|||
|
||||
<div className="space-y-6">
|
||||
<div>
|
||||
<h4 className="text-sm font-bold text-white uppercase tracking-wider mb-3 border-b border-border pb-1">
|
||||
<h4 className="text-sm font-bold text-foreground uppercase tracking-wider mb-3 border-b border-border pb-1">
|
||||
What You Get
|
||||
</h4>
|
||||
<ul className="space-y-2">
|
||||
|
|
@ -66,7 +66,7 @@ export const LicenceDetailsModal: React.FC<LicenceDetailsModalProps> = ({
|
|||
</div>
|
||||
|
||||
<div>
|
||||
<h4 className="text-sm font-bold text-white uppercase tracking-wider mb-3 border-b border-border pb-1">
|
||||
<h4 className="text-sm font-bold text-foreground uppercase tracking-wider mb-3 border-b border-border pb-1">
|
||||
Restrictions
|
||||
</h4>
|
||||
<ul className="space-y-2">
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ export const ReviewProductModal: React.FC<ReviewProductModalProps> = ({
|
|||
<p className="text-muted-foreground text-sm mb-2">
|
||||
How was your experience with
|
||||
</p>
|
||||
<h4 className="font-bold text-white text-lg">{productTitle}?</h4>
|
||||
<h4 className="font-bold text-foreground text-lg">{productTitle}?</h4>
|
||||
</div>
|
||||
|
||||
<div className="flex justify-center gap-2">
|
||||
|
|
@ -82,7 +82,7 @@ export const ReviewProductModal: React.FC<ReviewProductModalProps> = ({
|
|||
Your Review
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-background border border-border rounded-lg p-4 text-white focus:border-border outline-none text-sm resize-none h-32"
|
||||
className="w-full bg-background border border-border rounded-lg p-4 text-foreground focus:border-border 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)}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ export function ProductDetailViewGallery({
|
|||
)}
|
||||
</button>
|
||||
<div className="flex-1">
|
||||
<div className="text-xs font-bold text-white mb-1">Audio Preview</div>
|
||||
<div className="text-xs font-bold text-foreground mb-1">Audio Preview</div>
|
||||
<div className="h-1 bg-muted rounded-full overflow-hidden">
|
||||
<div className="h-full bg-primary w-1/3 animate-pulse" />
|
||||
</div>
|
||||
|
|
@ -58,7 +58,7 @@ export function ProductDetailViewGallery({
|
|||
key={i}
|
||||
type="button"
|
||||
onClick={() => onActiveImageChange(img)}
|
||||
className={`w-20 h-20 rounded-xl overflow-hidden cursor-pointer border-2 transition-all duration-[var(--duration-normal)] flex-shrink-0 ${activeImage === img ? 'border-primary' : 'border-transparent opacity-60 hover:opacity-100'}`}
|
||||
className={`w-20 h-20 rounded-xl overflow-hidden cursor-pointer border-2 transition-all duration-[var(--sumi-duration-normal)] flex-shrink-0 ${activeImage === img ? 'border-primary' : 'border-transparent opacity-60 hover:opacity-100'}`}
|
||||
>
|
||||
<img src={img} alt="" className="w-full h-full object-cover" />
|
||||
</button>
|
||||
|
|
|
|||
|
|
@ -23,14 +23,14 @@ export function ProductDetailViewInfo({ product }: ProductDetailViewInfoProps) {
|
|||
<Button
|
||||
variant="ghost"
|
||||
size="icon"
|
||||
className="border border-border text-muted-foreground hover:text-primary transition-colors duration-[var(--duration-normal)]"
|
||||
className="border border-border text-muted-foreground hover:text-primary transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
>
|
||||
<Heart className="w-5 h-5" />
|
||||
</Button>
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="icon"
|
||||
className="border border-border text-muted-foreground hover:text-foreground transition-colors duration-[var(--duration-normal)]"
|
||||
className="border border-border text-muted-foreground hover:text-foreground transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
>
|
||||
<Share2 className="w-5 h-5" />
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -39,25 +39,25 @@ export const CreatorModal: React.FC<CreatorModalProps> = ({
|
|||
{/* Header */}
|
||||
<div className="flex justify-between items-center p-8 border-b border-border bg-card">
|
||||
<div className="flex items-center gap-4">
|
||||
<h2 className="text-2xl font-heading font-bold text-white">
|
||||
<h2 className="text-2xl font-heading font-bold text-foreground">
|
||||
CREATOR STUDIO
|
||||
</h2>
|
||||
<div className="flex bg-muted rounded-lg p-1">
|
||||
<button
|
||||
onClick={() => setActiveTab('track')}
|
||||
className={`px-4 py-1.5 rounded text-sm font-bold transition-all flex items-center gap-2 ${activeTab === 'track' ? 'bg-primary text-black' : 'text-muted-foreground hover:text-white'}`}
|
||||
className={`px-4 py-1.5 rounded text-sm font-bold transition-all flex items-center gap-2 ${activeTab === 'track' ? 'bg-primary text-black' : 'text-muted-foreground hover:text-foreground'}`}
|
||||
>
|
||||
<Music className="w-4 h-4" /> Track
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setActiveTab('product')}
|
||||
className={`px-4 py-1.5 rounded text-sm font-bold transition-all flex items-center gap-2 ${activeTab === 'product' ? 'bg-destructive text-white' : 'text-muted-foreground hover:text-white'}`}
|
||||
className={`px-4 py-1.5 rounded text-sm font-bold transition-all flex items-center gap-2 ${activeTab === 'product' ? 'bg-destructive text-foreground' : 'text-muted-foreground hover:text-foreground'}`}
|
||||
>
|
||||
<Package className="w-4 h-4" /> Product
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setActiveTab('course')}
|
||||
className={`px-4 py-1.5 rounded text-sm font-bold transition-all flex items-center gap-2 ${activeTab === 'course' ? 'bg-warning text-black' : 'text-muted-foreground hover:text-white'}`}
|
||||
className={`px-4 py-1.5 rounded text-sm font-bold transition-all flex items-center gap-2 ${activeTab === 'course' ? 'bg-warning text-black' : 'text-muted-foreground hover:text-foreground'}`}
|
||||
>
|
||||
<BookOpen className="w-4 h-4" /> Course
|
||||
</button>
|
||||
|
|
@ -130,7 +130,7 @@ export const CreatorModal: React.FC<CreatorModalProps> = ({
|
|||
|
||||
{activeTab === 'product' && (
|
||||
<div className="text-center py-12">
|
||||
<h3 className="text-xl font-bold text-white mb-2">
|
||||
<h3 className="text-xl font-bold text-foreground mb-2">
|
||||
Sell Your Sounds
|
||||
</h3>
|
||||
<p className="text-muted-foreground mb-6">
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ export const NotificationBell: React.FC<NotificationBellProps> = ({
|
|||
<div className="absolute top-full right-0 mt-4 w-96 bg-muted border border-border rounded-xl shadow-2xl overflow-hidden animate-fadeIn origin-top-right ring-1 ring-white/5 flex flex-col max-h-layout-modal-sm">
|
||||
<div className="p-4 border-b border-border/50 flex justify-between items-center bg-card">
|
||||
<div>
|
||||
<h3 className="font-bold text-white">Notifications</h3>
|
||||
<h3 className="font-bold text-foreground">Notifications</h3>
|
||||
<p className="text-xs text-muted-foreground">{unreadCount} unread</p>
|
||||
</div>
|
||||
{unreadCount > 0 && (
|
||||
|
|
|
|||
|
|
@ -53,12 +53,12 @@ export const FullPlayer: React.FC<FullPlayerProps> = ({ onClose }) => {
|
|||
variant="ghost"
|
||||
size="sm"
|
||||
onClick={onClose}
|
||||
className="text-white/50 hover:text-white"
|
||||
className="text-white/50 hover:text-foreground"
|
||||
>
|
||||
<Minimize2 className="w-6 h-6" />
|
||||
</Button>
|
||||
<div className="flex gap-2">
|
||||
<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">
|
||||
<span className="px-4 py-1 bg-white/10 rounded-full text-xs font-bold text-foreground tracking-widest border border-white/20 backdrop-blur">
|
||||
LOSSLESS
|
||||
</span>
|
||||
</div>
|
||||
|
|
@ -68,7 +68,7 @@ export const FullPlayer: React.FC<FullPlayerProps> = ({ onClose }) => {
|
|||
<div className="relative z-20 flex-1 flex flex-col md:flex-row items-center justify-center gap-12 px-8 pb-8 max-w-7xl mx-auto w-full">
|
||||
{/* Left: Artwork & Metadata */}
|
||||
<div
|
||||
className={`flex flex-col items-center md:items-start text-center md:text-left transition-all duration-[var(--duration-slow)] ${showLyrics ? 'md:w-1/3' : 'md:w-1/2'}`}
|
||||
className={`flex flex-col items-center md:items-start text-center md:text-left transition-all duration-[var(--sumi-duration-slow)] ${showLyrics ? 'md:w-1/3' : 'md:w-1/2'}`}
|
||||
>
|
||||
<div
|
||||
className="aspect-square w-full max-w-lg rounded-2xl overflow-hidden shadow-2xl mb-8 border border-white/10 relative group cursor-pointer"
|
||||
|
|
@ -81,14 +81,14 @@ export const FullPlayer: React.FC<FullPlayerProps> = ({ onClose }) => {
|
|||
{/* Visualizer Overlay if enabled */}
|
||||
{visualizerSettings.mode !== 'off' && (
|
||||
<div className="absolute inset-0 flex items-center justify-center bg-black/20 backdrop-blur-[2px] opacity-0 group-hover:opacity-100 transition-opacity">
|
||||
<span className="text-white font-bold uppercase tracking-widest text-sm border border-white px-4 py-2 rounded-full">
|
||||
<span className="text-foreground font-bold uppercase tracking-widest text-sm border border-white px-4 py-2 rounded-full">
|
||||
{showLyrics ? 'Hide Lyrics' : 'Show Lyrics'}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<h1 className="text-4xl md:text-6xl font-heading font-bold text-white mb-2 leading-tight">
|
||||
<h1 className="text-4xl md:text-6xl font-heading font-bold text-foreground mb-2 leading-tight">
|
||||
{currentTrack.title}
|
||||
</h1>
|
||||
<h2 className="text-xl md:text-2xl text-muted-foreground font-medium mb-1">
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ export const LyricsPanel: React.FC = () => {
|
|||
return (
|
||||
<p
|
||||
key={i}
|
||||
className={`text-2xl md:text-3xl font-bold transition-all duration-[var(--duration-slow)] cursor-pointer hover:text-white ${isActive ? 'text-white scale-105 origin-center' : 'text-white/20 blur-[1px]'}`}
|
||||
className={`text-2xl md:text-3xl font-bold transition-all duration-[var(--sumi-duration-slow)] cursor-pointer hover:text-foreground ${isActive ? 'text-foreground scale-105 origin-center' : 'text-white/20 blur-[1px]'}`}
|
||||
onClick={() => seek((line.time / duration) * 100)}
|
||||
>
|
||||
{line.text}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ export const MiniPlayer: React.FC<MiniPlayerProps> = ({
|
|||
};
|
||||
|
||||
return (
|
||||
<div className="fixed bottom-0 left-0 right-0 h-16 max-h-16 bg-background/95 backdrop-blur-md border-t border-white/5 z-50 px-4 md:px-6 flex items-center justify-between gap-4 transition-all duration-[var(--duration-immersive)] ease-in-out">
|
||||
<div className="fixed bottom-0 left-0 right-0 h-16 max-h-16 bg-background/95 backdrop-blur-md border-t border-white/5 z-50 px-4 md:px-6 flex items-center justify-between gap-4 transition-all duration-[var(--sumi-duration-slow)] ease-in-out">
|
||||
{/* 1. Track Info — Spotify-style: cover + title/artist */}
|
||||
<div className="flex items-center gap-3 min-w-0 flex-1 max-w-md">
|
||||
<div className="w-12 h-12 rounded-md overflow-hidden relative group cursor-pointer flex-shrink-0 shadow-md">
|
||||
|
|
@ -48,7 +48,7 @@ export const MiniPlayer: React.FC<MiniPlayerProps> = ({
|
|||
className="absolute inset-0 bg-black/40 hidden group-hover:flex items-center justify-center transition-opacity duration-[var(--duration-fast)]"
|
||||
onClick={onExpand}
|
||||
>
|
||||
<Maximize2 className="w-5 h-5 text-white" />
|
||||
<Maximize2 className="w-5 h-5 text-foreground" />
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-col min-w-0 flex-1">
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ export const PlaybackSpeedModal: React.FC<PlaybackSpeedModalProps> = ({
|
|||
return (
|
||||
<div className="absolute bottom-20 right-0 md:right-auto md:left-1/2 md:-translate-x-1/2 w-80 bg-card border border-border rounded-xl shadow-2xl z-50 animate-fadeIn overflow-hidden">
|
||||
<div className="p-4 border-b border-border bg-muted flex justify-between items-center">
|
||||
<h3 className="font-bold text-white flex items-center gap-2 text-sm">
|
||||
<h3 className="font-bold text-foreground flex items-center gap-2 text-sm">
|
||||
<Gauge className="w-4 h-4 text-warning" /> Playback Speed
|
||||
</h3>
|
||||
<button onClick={onClose}>
|
||||
|
|
@ -65,7 +65,7 @@ export const PlaybackSpeedModal: React.FC<PlaybackSpeedModalProps> = ({
|
|||
{/* Pitch Correction */}
|
||||
<div className="flex items-center justify-between p-4 bg-muted rounded-lg border border-border/50">
|
||||
<div className="flex flex-col">
|
||||
<span className="text-sm font-bold text-white">
|
||||
<span className="text-sm font-bold text-foreground">
|
||||
Pitch Correction
|
||||
</span>
|
||||
<span className="text-xs text-muted-foreground">
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ export const PlayerControls: React.FC<PlayerControlsProps> = ({
|
|||
</button>
|
||||
<button
|
||||
onClick={togglePlay}
|
||||
className={`${layout === 'full' ? 'w-14 h-14' : 'w-9 h-9'} rounded-full bg-primary text-primary-foreground flex items-center justify-center transition-all duration-[var(--duration-immersive)] ease-in-out hover:opacity-90 shadow-button-primary-glow`}
|
||||
className={`${layout === 'full' ? 'w-14 h-14' : 'w-9 h-9'} rounded-full bg-primary text-primary-foreground flex items-center justify-center transition-all duration-[var(--sumi-duration-slow)] ease-in-out hover:opacity-90 shadow-sm`}
|
||||
>
|
||||
{isPlaying ? (
|
||||
<Pause
|
||||
|
|
|
|||
|
|
@ -20,11 +20,11 @@ export const VisualizerSettingsModal: React.FC<
|
|||
return (
|
||||
<div className="absolute bottom-20 right-0 md:right-auto md:left-1/2 md:-translate-x-1/2 w-72 bg-card border border-border rounded-xl shadow-2xl z-50 animate-fadeIn overflow-hidden">
|
||||
<div className="p-4 border-b border-border bg-muted flex justify-between items-center">
|
||||
<h3 className="font-bold text-white flex items-center gap-2 text-sm">
|
||||
<h3 className="font-bold text-foreground flex items-center gap-2 text-sm">
|
||||
<Activity className="w-4 h-4 text-muted-foreground" /> Visualizer
|
||||
</h3>
|
||||
<button onClick={onClose}>
|
||||
<X className="w-4 h-4 text-muted-foreground hover:text-white" />
|
||||
<X className="w-4 h-4 text-muted-foreground hover:text-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -33,14 +33,14 @@ export function PWAInstallBanner() {
|
|||
</div>
|
||||
<div>
|
||||
<div className="text-hud">System.Uplink</div>
|
||||
<h3 className="font-heading font-black text-xs text-white uppercase tracking-wider">
|
||||
<h3 className="font-heading font-black text-xs text-foreground uppercase tracking-wider">
|
||||
{t('pwa.install.title', 'Native_Access')}
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
onClick={handleDismiss}
|
||||
className="p-1 px-2 rounded-md bg-white/5 text-muted-foreground hover:text-white transition-all text-xs font-mono border border-transparent hover:border-white/10"
|
||||
className="p-1 px-2 rounded-md bg-white/5 text-muted-foreground hover:text-foreground transition-all text-xs font-mono border border-transparent hover:border-white/10"
|
||||
>
|
||||
DISMISS
|
||||
</button>
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ export const SearchBar: React.FC<SearchBarProps> = ({
|
|||
/>
|
||||
<input
|
||||
type="text"
|
||||
className="bg-transparent border-none text-white placeholder-gray-500 w-full focus:ring-0 outline-none text-base"
|
||||
className="bg-transparent border-none text-foreground placeholder-gray-500 w-full focus:ring-0 outline-none text-base"
|
||||
placeholder={placeholder}
|
||||
value={query}
|
||||
onChange={(e) => setQuery(e.target.value)}
|
||||
|
|
@ -109,7 +109,7 @@ export const SearchBar: React.FC<SearchBarProps> = ({
|
|||
<button
|
||||
type="button"
|
||||
onClick={() => setQuery('')}
|
||||
className="text-muted-foreground hover:text-white transition-colors"
|
||||
className="text-muted-foreground hover:text-foreground transition-colors"
|
||||
>
|
||||
<X className="w-4 h-4" />
|
||||
</button>
|
||||
|
|
@ -136,7 +136,7 @@ export const SearchBar: React.FC<SearchBarProps> = ({
|
|||
{getIcon(item.type)}
|
||||
</div>
|
||||
<div>
|
||||
<div className="text-sm font-bold text-white">
|
||||
<div className="text-sm font-bold text-foreground">
|
||||
{item.label}
|
||||
</div>
|
||||
<div className="text-xs text-muted-foreground capitalize">
|
||||
|
|
@ -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-4 text-foreground group-hover:text-white">
|
||||
<div className="flex items-center gap-4 text-foreground group-hover:text-foreground">
|
||||
<Clock className="w-4 h-4 text-muted-foreground" />
|
||||
<span className="text-sm">{term}</span>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ export function CreateProductViewCoverCard() {
|
|||
<h3 className="font-bold text-foreground mb-4 flex items-center gap-2 text-sm uppercase tracking-wider">
|
||||
<ImageIcon className="w-4 h-4 text-muted-foreground" /> Cover Art
|
||||
</h3>
|
||||
<div className="aspect-square bg-card border-2 border-dashed border-border rounded-xl flex flex-col items-center justify-center text-muted-foreground hover:text-foreground hover:border-primary/50 cursor-pointer transition-colors duration-[var(--duration-normal)] group">
|
||||
<div className="aspect-square bg-card border-2 border-dashed border-border rounded-xl flex flex-col items-center justify-center text-muted-foreground hover:text-foreground hover:border-primary/50 cursor-pointer transition-colors duration-[var(--sumi-duration-normal)] group">
|
||||
<UploadCloud className="w-8 h-8 mb-2 transition-opacity group-hover:opacity-80" />
|
||||
<span className="text-xs font-bold uppercase">Upload Image</span>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ export function CreateProductViewDetailsCard({
|
|||
Description
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-muted border border-border rounded-xl p-4 text-foreground focus:border-primary outline-none min-h-24 transition-colors duration-[var(--duration-normal)]"
|
||||
className="w-full bg-muted border border-border rounded-xl p-4 text-foreground focus:border-primary outline-none min-h-24 transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
placeholder="Describe your sound pack..."
|
||||
value={description}
|
||||
onChange={(e) => setDescription(e.target.value)}
|
||||
|
|
@ -61,7 +61,7 @@ export function CreateProductViewDetailsCard({
|
|||
Category
|
||||
</label>
|
||||
<select
|
||||
className="w-full bg-muted border border-border rounded-xl p-4 text-foreground focus:border-primary outline-none transition-colors duration-[var(--duration-normal)]"
|
||||
className="w-full bg-muted border border-border rounded-xl p-4 text-foreground focus:border-primary outline-none transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
value={category}
|
||||
onChange={(e) => setCategory(e.target.value)}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ export function CreateProductViewFilesCard() {
|
|||
<label className="text-xs text-muted-foreground mb-1 block">
|
||||
Main File (ZIP/RAR)
|
||||
</label>
|
||||
<div className="h-20 bg-card border border-border rounded-xl flex items-center justify-center cursor-pointer hover:border-primary transition-colors duration-[var(--duration-normal)]">
|
||||
<div className="h-20 bg-card border border-border rounded-xl flex items-center justify-center cursor-pointer hover:border-primary transition-colors duration-[var(--sumi-duration-normal)]">
|
||||
<span className="text-xs text-muted-foreground">
|
||||
Drop full product here
|
||||
</span>
|
||||
|
|
@ -23,7 +23,7 @@ export function CreateProductViewFilesCard() {
|
|||
<label className="text-xs text-muted-foreground mb-1 block">
|
||||
Audio Preview (MP3)
|
||||
</label>
|
||||
<div className="h-12 bg-card border border-border rounded-xl flex items-center justify-center cursor-pointer hover:border-primary transition-colors duration-[var(--duration-normal)]">
|
||||
<div className="h-12 bg-card border border-border rounded-xl flex items-center justify-center cursor-pointer hover:border-primary transition-colors duration-[var(--sumi-duration-normal)]">
|
||||
<span className="text-xs text-muted-foreground">
|
||||
Drop preview audio
|
||||
</span>
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ export function CreateProductViewPricingCard({
|
|||
{licenses.map((lic) => (
|
||||
<div
|
||||
key={lic.type}
|
||||
className={`p-4 rounded-xl border transition-all duration-[var(--duration-normal)] ${lic.enabled ? 'bg-card border-primary/30' : 'bg-card/50 border-border opacity-60'}`}
|
||||
className={`p-4 rounded-xl border transition-all duration-[var(--sumi-duration-normal)] ${lic.enabled ? 'bg-card border-primary/30' : 'bg-card/50 border-border opacity-60'}`}
|
||||
>
|
||||
<div className="flex items-center justify-between mb-4">
|
||||
<div className="flex items-center gap-4">
|
||||
|
|
@ -39,7 +39,7 @@ export function CreateProductViewPricingCard({
|
|||
onClick={() =>
|
||||
updateLicense(lic.type, 'enabled', !lic.enabled)
|
||||
}
|
||||
className={`w-10 h-5 rounded-full relative cursor-pointer transition-colors duration-[var(--duration-normal)] ${lic.enabled ? 'bg-primary' : 'bg-muted'}`}
|
||||
className={`w-10 h-5 rounded-full relative cursor-pointer transition-colors duration-[var(--sumi-duration-normal)] ${lic.enabled ? 'bg-primary' : 'bg-muted'}`}
|
||||
role="switch"
|
||||
aria-checked={lic.enabled}
|
||||
>
|
||||
|
|
@ -63,7 +63,7 @@ export function CreateProductViewPricingCard({
|
|||
</span>
|
||||
<input
|
||||
type="number"
|
||||
className="w-full bg-muted border border-border rounded-xl py-2 pl-6 pr-2 text-foreground focus:border-primary outline-none text-right font-mono transition-colors duration-[var(--duration-normal)]"
|
||||
className="w-full bg-muted border border-border rounded-xl py-2 pl-6 pr-2 text-foreground focus:border-primary outline-none text-right font-mono transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
value={lic.price}
|
||||
onChange={(e) =>
|
||||
updateLicense(lic.type, 'price', e.target.value)
|
||||
|
|
|
|||
|
|
@ -43,11 +43,11 @@ export const FlashSaleModal: React.FC<FlashSaleModalProps> = ({
|
|||
></div>
|
||||
<div className="relative w-full max-w-2xl bg-muted border border-border rounded-xl shadow-2xl animate-scaleIn overflow-hidden flex flex-col max-h-layout-modal">
|
||||
<div className="p-4 border-b border-border bg-card flex justify-between items-center">
|
||||
<h3 className="font-bold text-white flex items-center gap-2">
|
||||
<h3 className="font-bold text-foreground flex items-center gap-2">
|
||||
<Zap className="w-5 h-5 text-warning" /> Start Flash Sale
|
||||
</h3>
|
||||
<button onClick={onClose}>
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-white" />
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
|
@ -62,7 +62,7 @@ export const FlashSaleModal: React.FC<FlashSaleModalProps> = ({
|
|||
<Percent className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground" />
|
||||
<input
|
||||
type="number"
|
||||
className="w-full bg-background border border-border rounded pl-10 pr-4 py-2 text-white focus:border-warning outline-none"
|
||||
className="w-full bg-background border border-border rounded pl-10 pr-4 py-2 text-foreground focus:border-warning outline-none"
|
||||
value={discount}
|
||||
onChange={(e) => setDiscount(Number(e.target.value))}
|
||||
min={5}
|
||||
|
|
@ -78,7 +78,7 @@ export const FlashSaleModal: React.FC<FlashSaleModalProps> = ({
|
|||
<div className="relative">
|
||||
<Calendar className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground" />
|
||||
<select
|
||||
className="w-full bg-background border border-border rounded pl-10 pr-4 py-2 text-white focus:border-warning outline-none appearance-none"
|
||||
className="w-full bg-background border border-border rounded pl-10 pr-4 py-2 text-foreground focus:border-warning outline-none appearance-none"
|
||||
value={duration}
|
||||
onChange={(e) => setDuration(Number(e.target.value))}
|
||||
>
|
||||
|
|
@ -98,9 +98,9 @@ export const FlashSaleModal: React.FC<FlashSaleModalProps> = ({
|
|||
</h4>
|
||||
<p className="text-xs text-foreground">
|
||||
Applying a{' '}
|
||||
<span className="font-bold text-white">{discount}%</span>{' '}
|
||||
<span className="font-bold text-foreground">{discount}%</span>{' '}
|
||||
discount to{' '}
|
||||
<span className="font-bold text-white">
|
||||
<span className="font-bold text-foreground">
|
||||
{selectedIds.length}
|
||||
</span>{' '}
|
||||
products. Sale ends in {duration} hours.
|
||||
|
|
@ -151,7 +151,7 @@ export const FlashSaleModal: React.FC<FlashSaleModalProps> = ({
|
|||
className="w-8 h-8 rounded object-cover"
|
||||
/>
|
||||
<div className="flex-1 min-w-0">
|
||||
<div className="text-sm font-bold text-white truncate">
|
||||
<div className="text-sm font-bold text-foreground truncate">
|
||||
{product.title}
|
||||
</div>
|
||||
<div className="text-xs text-muted-foreground">
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ export const ChangeEmailModal: React.FC<ChangeEmailModalProps> = ({
|
|||
<div className="p-4 border-b border-border bg-card flex justify-between items-center">
|
||||
<h3 className="font-bold text-foreground">Change Email Address</h3>
|
||||
<button onClick={onClose}>
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-white" />
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ export const DeleteAccountConfirmModal: React.FC<
|
|||
</Button>
|
||||
<Button
|
||||
variant="primary"
|
||||
className="bg-destructive hover:bg-destructive border-destructive text-white"
|
||||
className="bg-destructive hover:bg-destructive border-destructive text-foreground"
|
||||
onClick={handleDelete}
|
||||
disabled={loading}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ export function AccountSettingsPreferencesCard({
|
|||
key={opt.id}
|
||||
type="button"
|
||||
onClick={() => onThemeChange(opt.id)}
|
||||
className={`flex flex-col items-center justify-center gap-2 p-4 rounded-xl border transition-all duration-[var(--duration-normal)] ${isOptionSelected(theme, opt.id) ? 'bg-primary/10 border-primary text-primary' : 'bg-card border-border text-muted-foreground hover:text-foreground'}`}
|
||||
className={`flex flex-col items-center justify-center gap-2 p-4 rounded-xl border transition-all duration-[var(--sumi-duration-normal)] ${isOptionSelected(theme, opt.id) ? 'bg-primary/10 border-primary text-primary' : 'bg-card border-border text-muted-foreground hover:text-foreground'}`}
|
||||
>
|
||||
{opt.icon}
|
||||
<span className="text-xs font-bold">{opt.label}</span>
|
||||
|
|
@ -55,7 +55,7 @@ export function AccountSettingsPreferencesCard({
|
|||
</label>
|
||||
<div className="relative">
|
||||
<Globe className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground" />
|
||||
<select className="w-full bg-muted border border-border rounded-xl py-2.5 pl-10 pr-4 text-foreground text-sm focus:border-primary outline-none appearance-none cursor-pointer transition-colors duration-[var(--duration-normal)]">
|
||||
<select className="w-full bg-muted border border-border rounded-xl py-2.5 pl-10 pr-4 text-foreground text-sm focus:border-primary outline-none appearance-none cursor-pointer transition-colors duration-[var(--sumi-duration-normal)]">
|
||||
<option>English (US)</option>
|
||||
<option>Japanese</option>
|
||||
<option>French</option>
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ export function EditProfileIdentityCard({
|
|||
Bio
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-muted border border-border rounded-xl p-4 text-foreground focus:border-primary outline-none min-h-24 transition-colors duration-[var(--duration-normal)]"
|
||||
className="w-full bg-muted border border-border rounded-xl p-4 text-foreground focus:border-primary outline-none min-h-24 transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
value={formData.bio}
|
||||
onChange={(e) => setFormField('bio', e.target.value)}
|
||||
maxLength={500}
|
||||
|
|
@ -63,7 +63,7 @@ export function EditProfileIdentityCard({
|
|||
Gender
|
||||
</label>
|
||||
<select
|
||||
className="w-full bg-muted border border-border rounded-xl p-4 text-foreground focus:border-primary outline-none transition-colors duration-[var(--duration-normal)]"
|
||||
className="w-full bg-muted border border-border rounded-xl p-4 text-foreground focus:border-primary outline-none transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
value={formData.gender}
|
||||
onChange={(e) => setFormField('gender', e.target.value)}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ export function EditProfileImagesCard({
|
|||
<div className="h-48 md:h-64 bg-card relative">
|
||||
<img src={banner} alt="" className="w-full h-full object-cover opacity-80" />
|
||||
<div className="absolute inset-0 bg-black/20 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity">
|
||||
<label className="cursor-pointer bg-black/60 hover:bg-black/80 text-white px-4 py-2 rounded-lg flex items-center gap-2 backdrop-blur border border-white/10">
|
||||
<label className="cursor-pointer bg-black/60 hover:bg-black/80 text-foreground px-4 py-2 rounded-lg flex items-center gap-2 backdrop-blur border border-white/10">
|
||||
<Camera className="w-4 h-4" /> Change Banner
|
||||
<input
|
||||
type="file"
|
||||
|
|
@ -38,7 +38,7 @@ export function EditProfileImagesCard({
|
|||
<div className="w-32 h-32 rounded-full border-4 border-border bg-muted overflow-hidden relative">
|
||||
<img src={avatar} alt="" className="w-full h-full object-cover" />
|
||||
<div className="absolute inset-0 bg-black/40 flex items-center justify-center opacity-0 group-hover/avatar:opacity-100 transition-opacity">
|
||||
<label className="cursor-pointer p-2 bg-black/50 rounded-full hover:bg-black/70 text-white">
|
||||
<label className="cursor-pointer p-2 bg-black/50 rounded-full hover:bg-black/70 text-foreground">
|
||||
<Upload className="w-5 h-5" />
|
||||
<input
|
||||
type="file"
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ export function EditProfileSidebar({ onRequestVerification }: EditProfileSidebar
|
|||
return (
|
||||
<div className="space-y-6">
|
||||
<Card variant="glass">
|
||||
<h3 className="font-bold text-white mb-4 text-sm uppercase tracking-wider">
|
||||
<h3 className="font-bold text-foreground mb-4 text-sm uppercase tracking-wider">
|
||||
Verification
|
||||
</h3>
|
||||
<p className="text-xs text-muted-foreground mb-4">
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ export const PasskeyModal: React.FC<PasskeyModalProps> = ({
|
|||
></div>
|
||||
<div className="relative w-full max-w-md bg-card border border-border rounded-xl shadow-2xl overflow-hidden animate-scaleIn">
|
||||
<div className="p-4 border-b border-border bg-muted flex justify-between items-center">
|
||||
<h3 className="font-bold text-white flex items-center gap-2">
|
||||
<h3 className="font-bold text-foreground flex items-center gap-2">
|
||||
<Fingerprint className="w-4 h-4 text-muted-foreground" /> Add Passkey
|
||||
</h3>
|
||||
<button onClick={onClose}>
|
||||
|
|
@ -84,7 +84,7 @@ export const PasskeyModal: React.FC<PasskeyModalProps> = ({
|
|||
{step === 'registering' && (
|
||||
<div className="text-center py-8">
|
||||
<Loader2 className="w-12 h-12 text-muted-foreground animate-spin mx-auto mb-4" />
|
||||
<h4 className="text-lg font-bold text-white mb-2">
|
||||
<h4 className="text-lg font-bold text-foreground mb-2">
|
||||
Waiting for device...
|
||||
</h4>
|
||||
<p className="text-sm text-muted-foreground">
|
||||
|
|
@ -98,7 +98,7 @@ export const PasskeyModal: React.FC<PasskeyModalProps> = ({
|
|||
<div className="w-16 h-16 bg-success/20 rounded-full flex items-center justify-center mx-auto mb-4 text-success">
|
||||
<CheckCircle className="w-8 h-8" />
|
||||
</div>
|
||||
<h4 className="text-xl font-bold text-white mb-2">
|
||||
<h4 className="text-xl font-bold text-foreground mb-2">
|
||||
Passkey Added!
|
||||
</h4>
|
||||
<p className="text-sm text-muted-foreground mb-6">
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ export function TwoFactorSetupHeader({ onBack }: TwoFactorSetupHeaderProps) {
|
|||
<button
|
||||
type="button"
|
||||
onClick={onBack}
|
||||
className="p-2 hover:bg-muted rounded-full text-muted-foreground hover:text-foreground transition-colors duration-[var(--duration-normal)]"
|
||||
className="p-2 hover:bg-muted rounded-full text-muted-foreground hover:text-foreground transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
aria-label="Go back"
|
||||
>
|
||||
<ArrowLeft className="w-5 h-5" />
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ export function TwoFactorSetupStep1({
|
|||
tabIndex={0}
|
||||
onClick={onChooseTotp}
|
||||
onKeyDown={(e) => e.key === 'Enter' && onChooseTotp()}
|
||||
className="p-6 border border-border rounded-xl bg-card hover:bg-muted/50 cursor-pointer transition-all duration-[var(--duration-normal)] hover:border-primary/50 group focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
|
||||
className="p-6 border border-border rounded-xl bg-card hover:bg-muted/50 cursor-pointer transition-all duration-[var(--sumi-duration-normal)] hover:border-primary/50 group focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
|
||||
>
|
||||
<div className="flex items-center gap-4 mb-2">
|
||||
<div className="w-12 h-12 rounded-full bg-muted flex items-center justify-center group-hover:bg-muted/80">
|
||||
|
|
@ -38,7 +38,7 @@ export function TwoFactorSetupStep1({
|
|||
tabIndex={0}
|
||||
onClick={onChooseSms}
|
||||
onKeyDown={(e) => e.key === 'Enter' && onChooseSms()}
|
||||
className="p-6 border border-border rounded-xl bg-card opacity-50 cursor-not-allowed transition-all duration-[var(--duration-normal)] grayscale group focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
|
||||
className="p-6 border border-border rounded-xl bg-card opacity-50 cursor-not-allowed transition-all duration-[var(--sumi-duration-normal)] grayscale group focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
|
||||
>
|
||||
<div className="flex items-center gap-4 mb-2">
|
||||
<div className="w-12 h-12 rounded-full bg-warning/10 flex items-center justify-center">
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ export function TwoFactorSetupStep2({
|
|||
<p
|
||||
role="button"
|
||||
tabIndex={0}
|
||||
className="text-xs text-muted-foreground font-mono bg-muted py-1 px-3 rounded-full border border-border inline-block cursor-pointer hover:text-foreground transition-colors duration-[var(--duration-normal)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
|
||||
className="text-xs text-muted-foreground font-mono bg-muted py-1 px-3 rounded-full border border-border inline-block cursor-pointer hover:text-foreground transition-colors duration-[var(--sumi-duration-normal)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
|
||||
onClick={onCopySecret}
|
||||
onKeyDown={(e) => e.key === 'Enter' && onCopySecret()}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ export const CommentItem: React.FC<CommentItemProps> = ({
|
|||
<div className="bg-card/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">
|
||||
<span className="font-bold text-foreground cursor-pointer hover:underline">
|
||||
{comment.author.name}
|
||||
</span>
|
||||
<span className="text-muted-foreground text-xs">{comment.timestamp}</span>
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ export const ExploreView: React.FC = () => {
|
|||
<button
|
||||
key={tab.id}
|
||||
onClick={() => setActiveTab(tab.id as any)}
|
||||
className={`flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-bold transition-all whitespace-nowrap ${activeTab === tab.id ? 'bg-primary text-black' : 'text-muted-foreground hover:text-white hover:bg-white/5'}`}
|
||||
className={`flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-bold transition-all whitespace-nowrap ${activeTab === tab.id ? 'bg-primary text-black' : 'text-muted-foreground hover:text-foreground hover:bg-white/5'}`}
|
||||
>
|
||||
{tab.icon} {tab.label}
|
||||
</button>
|
||||
|
|
@ -159,7 +159,7 @@ export const ExploreView: React.FC = () => {
|
|||
|
||||
{/* Overlay */}
|
||||
<div className="absolute inset-0 bg-gradient-to-t from-black/80 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity flex flex-col justify-end p-4">
|
||||
<h4 className="text-white font-bold truncate text-sm mb-1">
|
||||
<h4 className="text-foreground font-bold truncate text-sm mb-1">
|
||||
{item.title}
|
||||
</h4>
|
||||
<div className="flex justify-between items-center text-xs text-foreground">
|
||||
|
|
@ -173,7 +173,7 @@ export const ExploreView: React.FC = () => {
|
|||
</div>
|
||||
|
||||
{/* Type Indicator */}
|
||||
<div className="absolute top-2 right-2 bg-black/50 backdrop-blur p-1.5 rounded-full text-white">
|
||||
<div className="absolute top-2 right-2 bg-black/50 backdrop-blur p-1.5 rounded-full text-foreground">
|
||||
{item.type === 'audio' ? (
|
||||
<Play className="w-3 h-3 fill-current" />
|
||||
) : item.type === 'video' ? (
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ const PostCardComponent: React.FC<PostCardProps> = ({ post }) => {
|
|||
<>
|
||||
<Card
|
||||
variant="default"
|
||||
className="p-0 overflow-hidden border-transparent hover:border-primary/20 hover:-translate-y-0.5 hover:shadow-lg transition-all duration-[var(--duration-normal)] animate-fadeIn mb-4"
|
||||
className="p-0 overflow-hidden border-transparent hover:border-primary/20 hover:shadow-lg transition-all duration-[var(--sumi-duration-normal)] animate-fadeIn mb-4"
|
||||
>
|
||||
{/* Repost Header */}
|
||||
{post.isRepost && (
|
||||
|
|
@ -177,7 +177,7 @@ const PostCardComponent: React.FC<PostCardProps> = ({ post }) => {
|
|||
<OptimizedImage
|
||||
src={post.image!}
|
||||
alt={post.content?.substring(0, 50) || 'Post image'}
|
||||
className="w-full h-full object-cover transition-transform duration-[var(--duration-normal)] group-hover:scale-105"
|
||||
className="w-full h-full object-cover transition-transform duration-[var(--sumi-duration-normal)] group-hover:scale-105"
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
|
@ -189,7 +189,7 @@ const PostCardComponent: React.FC<PostCardProps> = ({ post }) => {
|
|||
<img
|
||||
src={post.audioTrack.coverUrl}
|
||||
alt={post.audioTrack.title || 'Track cover'}
|
||||
className="w-full h-full object-cover transition-transform duration-[var(--duration-normal)] group-hover:scale-110"
|
||||
className="w-full h-full object-cover transition-transform duration-[var(--sumi-duration-normal)] group-hover:scale-110"
|
||||
/>
|
||||
<div className="absolute inset-0 bg-background/40 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity">
|
||||
<Play className="w-5 h-5 text-foreground fill-current" />
|
||||
|
|
|
|||
|
|
@ -38,14 +38,14 @@ export const SharePostModal: React.FC<SharePostModalProps> = ({
|
|||
></div>
|
||||
<div className="relative w-full max-w-lg bg-muted border border-border rounded-xl shadow-2xl animate-scaleIn overflow-hidden">
|
||||
<div className="p-4 border-b border-border bg-card flex justify-between items-center">
|
||||
<h3 className="font-bold text-white">Quote Post</h3>
|
||||
<h3 className="font-bold text-foreground">Quote Post</h3>
|
||||
<button onClick={onClose}>
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-white" />
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
<div className="p-4">
|
||||
<textarea
|
||||
className="w-full bg-transparent border-none text-white placeholder-gray-500 focus:ring-0 resize-none h-24 mb-4"
|
||||
className="w-full bg-transparent border-none text-foreground placeholder-gray-500 focus:ring-0 resize-none h-24 mb-4"
|
||||
placeholder="Add a comment..."
|
||||
value={quoteText}
|
||||
onChange={(e) => setQuoteText(e.target.value)}
|
||||
|
|
@ -57,7 +57,7 @@ export const SharePostModal: React.FC<SharePostModalProps> = ({
|
|||
src={post.author.avatar}
|
||||
className="w-5 h-5 rounded-full"
|
||||
/>
|
||||
<span className="font-bold text-xs text-white">
|
||||
<span className="font-bold text-xs text-foreground">
|
||||
{post.author.name}
|
||||
</span>
|
||||
</div>
|
||||
|
|
@ -93,9 +93,9 @@ export const SharePostModal: React.FC<SharePostModalProps> = ({
|
|||
></div>
|
||||
<div className="relative w-full max-w-sm bg-muted border border-border rounded-xl shadow-2xl animate-scaleIn overflow-hidden">
|
||||
<div className="p-4 border-b border-border bg-card flex justify-between items-center">
|
||||
<h3 className="font-bold text-white">Share Post</h3>
|
||||
<h3 className="font-bold text-foreground">Share Post</h3>
|
||||
<button onClick={onClose}>
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-white" />
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
|
@ -111,7 +111,7 @@ export const SharePostModal: React.FC<SharePostModalProps> = ({
|
|||
<Repeat className="w-5 h-5" />
|
||||
</div>
|
||||
<div className="text-left">
|
||||
<div className="text-white font-bold">Repost</div>
|
||||
<div className="text-foreground font-bold">Repost</div>
|
||||
<div className="text-xs text-muted-foreground">
|
||||
Instantly share with your followers
|
||||
</div>
|
||||
|
|
@ -126,7 +126,7 @@ export const SharePostModal: React.FC<SharePostModalProps> = ({
|
|||
<MessageSquare className="w-5 h-5" />
|
||||
</div>
|
||||
<div className="text-left">
|
||||
<div className="text-white font-bold">Quote</div>
|
||||
<div className="text-foreground font-bold">Quote</div>
|
||||
<div className="text-xs text-muted-foreground">
|
||||
Repost with your own thoughts
|
||||
</div>
|
||||
|
|
@ -139,11 +139,11 @@ export const SharePostModal: React.FC<SharePostModalProps> = ({
|
|||
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-muted flex items-center justify-center text-muted-foreground group-hover:text-white">
|
||||
<div className="w-10 h-10 rounded-full bg-muted flex items-center justify-center text-muted-foreground group-hover:text-foreground">
|
||||
{copied ? <Check className="w-5 h-5 text-success" /> : <Link className="w-5 h-5" />}
|
||||
</div>
|
||||
<div className="text-left">
|
||||
<div className="text-white font-bold">{copied ? 'Copied!' : 'Copy Link'}</div>
|
||||
<div className="text-foreground font-bold">{copied ? 'Copied!' : 'Copy Link'}</div>
|
||||
</div>
|
||||
</button>
|
||||
<button
|
||||
|
|
@ -153,11 +153,11 @@ export const SharePostModal: React.FC<SharePostModalProps> = ({
|
|||
onClose();
|
||||
}}
|
||||
>
|
||||
<div className="w-10 h-10 rounded-full bg-muted flex items-center justify-center text-muted-foreground group-hover:text-white">
|
||||
<div className="w-10 h-10 rounded-full bg-muted flex items-center justify-center text-muted-foreground group-hover:text-foreground">
|
||||
<Mail className="w-5 h-5" />
|
||||
</div>
|
||||
<div className="text-left">
|
||||
<div className="text-white font-bold">
|
||||
<div className="text-foreground font-bold">
|
||||
Send via Direct Message
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ export const ConnectionsView: React.FC<ConnectionsViewProps> = ({
|
|||
<div className="space-y-6 animate-fadeIn pb-20">
|
||||
<div className="flex flex-col md:flex-row justify-between items-end border-b border-border/50 pb-6 gap-4">
|
||||
<div>
|
||||
<h2 className="text-3xl font-heading font-bold text-white mb-2 capitalize">
|
||||
<h2 className="text-3xl font-heading font-bold text-foreground mb-2 capitalize">
|
||||
{type}
|
||||
</h2>
|
||||
<p className="text-muted-foreground font-mono text-sm">
|
||||
|
|
@ -75,7 +75,7 @@ export const ConnectionsView: React.FC<ConnectionsViewProps> = ({
|
|||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className={filter === 'all' ? 'text-white' : 'text-muted-foreground'}
|
||||
className={filter === 'all' ? 'text-foreground' : 'text-muted-foreground'}
|
||||
onClick={() => setFilter('all')}
|
||||
>
|
||||
All
|
||||
|
|
@ -83,7 +83,7 @@ export const ConnectionsView: React.FC<ConnectionsViewProps> = ({
|
|||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className={filter === 'mutual' ? 'text-white' : 'text-muted-foreground'}
|
||||
className={filter === 'mutual' ? 'text-foreground' : 'text-muted-foreground'}
|
||||
onClick={() => setFilter('mutual')}
|
||||
>
|
||||
Mutual
|
||||
|
|
@ -91,7 +91,7 @@ export const ConnectionsView: React.FC<ConnectionsViewProps> = ({
|
|||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className={filter === 'recent' ? 'text-white' : 'text-muted-foreground'}
|
||||
className={filter === 'recent' ? 'text-foreground' : 'text-muted-foreground'}
|
||||
onClick={() => setFilter('recent')}
|
||||
>
|
||||
Recent
|
||||
|
|
|
|||
|
|
@ -47,11 +47,11 @@ export const CreateGroupModal: React.FC<CreateGroupModalProps> = ({
|
|||
></div>
|
||||
<div className="relative w-full max-w-lg bg-muted border border-border rounded-xl shadow-2xl animate-scaleIn overflow-hidden">
|
||||
<div className="p-4 border-b border-border bg-card flex justify-between items-center">
|
||||
<h3 className="font-bold text-white flex items-center gap-2">
|
||||
<h3 className="font-bold text-foreground flex items-center gap-2">
|
||||
<Users className="w-5 h-5 text-muted-foreground" /> Create Community
|
||||
</h3>
|
||||
<button onClick={onClose}>
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-white" />
|
||||
<X className="w-5 h-5 text-muted-foreground hover:text-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
|
@ -61,7 +61,7 @@ export const CreateGroupModal: React.FC<CreateGroupModalProps> = ({
|
|||
{coverImage ? (
|
||||
<img src={coverImage} className="w-full h-full object-cover" />
|
||||
) : (
|
||||
<div className="text-muted-foreground flex flex-col items-center group-hover:text-white">
|
||||
<div className="text-muted-foreground flex flex-col items-center group-hover:text-foreground">
|
||||
<ImageIcon className="w-8 h-8 mb-2" />
|
||||
<span className="text-xs font-bold uppercase">
|
||||
Upload Cover Image
|
||||
|
|
@ -90,7 +90,7 @@ export const CreateGroupModal: React.FC<CreateGroupModalProps> = ({
|
|||
Description
|
||||
</label>
|
||||
<textarea
|
||||
className="w-full bg-background border border-border rounded-lg p-4 text-white focus:border-primary outline-none text-sm resize-none h-24"
|
||||
className="w-full bg-background border border-border rounded-lg p-4 text-foreground focus:border-primary outline-none text-sm resize-none h-24"
|
||||
placeholder="What's this community about?"
|
||||
value={description}
|
||||
onChange={(e) => setDescription(e.target.value)}
|
||||
|
|
@ -108,7 +108,7 @@ export const CreateGroupModal: React.FC<CreateGroupModalProps> = ({
|
|||
<Globe className="w-5 h-5 text-muted-foreground" />
|
||||
)}
|
||||
<div>
|
||||
<div className="text-sm font-bold text-white">
|
||||
<div className="text-sm font-bold text-foreground">
|
||||
{isPrivate ? 'Private Group' : 'Public Group'}
|
||||
</div>
|
||||
<div className="text-xs text-muted-foreground">
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ export const GroupsView: React.FC<GroupsViewProps> = ({ onOpenGroup }) => {
|
|||
<div className="space-y-6 animate-fadeIn pb-20">
|
||||
<div className="flex flex-col md:flex-row justify-between items-end border-b border-border/50 pb-6 gap-4">
|
||||
<div>
|
||||
<h2 className="text-3xl font-heading font-bold text-white mb-2">
|
||||
<h2 className="text-3xl font-heading font-bold text-foreground mb-2">
|
||||
COMMUNITIES
|
||||
</h2>
|
||||
<p className="text-muted-foreground font-mono text-sm">
|
||||
|
|
@ -114,13 +114,13 @@ export const GroupsView: React.FC<GroupsViewProps> = ({ onOpenGroup }) => {
|
|||
<div className="flex bg-background rounded-lg p-1 border border-border">
|
||||
<button
|
||||
onClick={() => setActiveTab('my_groups')}
|
||||
className={`flex items-center gap-2 px-4 py-2 rounded text-sm font-bold transition-colors ${activeTab === 'my_groups' ? 'bg-muted text-white' : 'text-muted-foreground hover:text-white'}`}
|
||||
className={`flex items-center gap-2 px-4 py-2 rounded text-sm font-bold transition-colors ${activeTab === 'my_groups' ? 'bg-muted text-foreground' : 'text-muted-foreground hover:text-foreground'}`}
|
||||
>
|
||||
<Users className="w-4 h-4" /> My Groups
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setActiveTab('discover')}
|
||||
className={`flex items-center gap-2 px-4 py-2 rounded text-sm font-bold transition-colors ${activeTab === 'discover' ? 'bg-muted text-white' : 'text-muted-foreground hover:text-white'}`}
|
||||
className={`flex items-center gap-2 px-4 py-2 rounded text-sm font-bold transition-colors ${activeTab === 'discover' ? 'bg-muted text-foreground' : 'text-muted-foreground hover:text-foreground'}`}
|
||||
>
|
||||
<Compass className="w-4 h-4" /> Discover
|
||||
</button>
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ export function GroupDetailViewHeader({
|
|||
<div className="absolute top-4 left-4">
|
||||
<Button
|
||||
variant="ghost"
|
||||
className="bg-black/50 backdrop-blur text-white hover:bg-black/70"
|
||||
className="bg-black/50 backdrop-blur text-foreground hover:bg-black/70"
|
||||
onClick={onBack}
|
||||
>
|
||||
<ArrowLeft className="w-4 h-4 mr-2" /> Back
|
||||
|
|
@ -117,7 +117,7 @@ export function GroupDetailViewHeader({
|
|||
key={tab}
|
||||
type="button"
|
||||
onClick={() => onTabChange(tab)}
|
||||
className={`py-4 text-sm font-bold uppercase tracking-wider border-b-2 transition-colors duration-[var(--duration-normal)] ${activeTab === tab ? 'text-foreground border-primary' : 'text-muted-foreground border-transparent hover:text-foreground'}`}
|
||||
className={`py-4 text-sm font-bold uppercase tracking-wider border-b-2 transition-colors duration-[var(--sumi-duration-normal)] ${activeTab === tab ? 'text-foreground border-primary' : 'text-muted-foreground border-transparent hover:text-foreground'}`}
|
||||
>
|
||||
{tab}
|
||||
</button>
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ export function GroupDetailViewMembers({
|
|||
{membersList.map((member) => (
|
||||
<div
|
||||
key={member.id}
|
||||
className="flex items-center gap-4 p-4 bg-card rounded-xl border border-border hover:border-border transition-colors duration-[var(--duration-normal)]"
|
||||
className="flex items-center gap-4 p-4 bg-card rounded-xl border border-border hover:border-border transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
>
|
||||
<img
|
||||
src={member.avatar}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ export function AIToolsViewToolGrid({ activeTool, onSelectTool }: AIToolsViewToo
|
|||
key={tool.id}
|
||||
type="button"
|
||||
onClick={() => onSelectTool(tool.id)}
|
||||
className={`p-4 rounded-xl border text-left transition-all duration-[var(--duration-normal)] group ${activeTool === tool.id ? 'bg-primary/10 border-primary' : 'bg-muted border-border hover:bg-muted/80'}`}
|
||||
className={`p-4 rounded-xl border text-left transition-all duration-[var(--sumi-duration-normal)] group ${activeTool === tool.id ? 'bg-primary/10 border-primary' : 'bg-muted border-border hover:bg-muted/80'}`}
|
||||
>
|
||||
<div
|
||||
className={`w-10 h-10 rounded-lg flex items-center justify-center mb-3 ${activeTool === tool.id ? 'bg-primary text-primary-foreground' : 'bg-card text-muted-foreground group-hover:text-foreground'}`}
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ export function AIToolsViewWorkspace({
|
|||
{result.outputs.map((file, i) => (
|
||||
<div
|
||||
key={i}
|
||||
className="flex items-center justify-between p-4 bg-card rounded-xl border border-border hover:border-border transition-colors duration-[var(--duration-normal)]"
|
||||
className="flex items-center justify-between p-4 bg-card rounded-xl border border-border hover:border-border transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
>
|
||||
<div className="flex items-center gap-4">
|
||||
<Music className="w-5 h-5 text-muted-foreground" />
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ export function CloudSettingsViewPreferences({
|
|||
<Clock className="w-4 h-4" /> Trash Retention Policy
|
||||
</label>
|
||||
<select
|
||||
className="w-full bg-muted border border-border rounded-xl p-4 text-foreground outline-none focus:border-primary transition-colors duration-[var(--duration-normal)]"
|
||||
className="w-full bg-muted border border-border rounded-xl p-4 text-foreground outline-none focus:border-primary transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
value={retention}
|
||||
onChange={(e) => onRetentionChange(e.target.value as RetentionValue)}
|
||||
>
|
||||
|
|
@ -49,7 +49,7 @@ export function CloudSettingsViewPreferences({
|
|||
<MapPin className="w-4 h-4" /> Storage Region
|
||||
</label>
|
||||
<select
|
||||
className="w-full bg-muted border border-border rounded-xl p-4 text-foreground outline-none focus:border-primary transition-colors duration-[var(--duration-normal)]"
|
||||
className="w-full bg-muted border border-border rounded-xl p-4 text-foreground outline-none focus:border-primary transition-colors duration-[var(--sumi-duration-normal)]"
|
||||
value={region}
|
||||
onChange={(e) => onRegionChange(e.target.value as RegionValue)}
|
||||
>
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue