mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-28 09:33:46 +00:00
refactor(theming): replace amber-* with warning-* tokens
Sweep all amber-N color classes to warning-N (uniformly pending/warning semantics). Yellow and orange left for per-file review (mixed Stars brand + semantic uses).
This commit is contained in:
@@ -268,7 +268,7 @@ export default function PromoOffersSection({ className = '' }: PromoOffersSectio
|
||||
className="card border-orange-500/30 bg-gradient-to-br from-orange-500/5 to-transparent transition-colors hover:border-orange-500/50"
|
||||
>
|
||||
<div className="flex items-start gap-4">
|
||||
<div className="flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-xl bg-gradient-to-br from-orange-500/30 to-amber-500/20">
|
||||
<div className="flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-xl bg-gradient-to-br from-orange-500/30 to-warning-500/20">
|
||||
{getOfferIcon(offer.effect_type, offer.discount_percent)}
|
||||
</div>
|
||||
<div className="min-w-0 flex-1">
|
||||
@@ -291,7 +291,7 @@ export default function PromoOffersSection({ className = '' }: PromoOffersSectio
|
||||
<button
|
||||
onClick={() => handleClaim(offer.id)}
|
||||
disabled={claimingId === offer.id}
|
||||
className="group relative flex w-full items-center justify-center gap-2 overflow-hidden rounded-lg bg-gradient-to-r from-orange-500 to-amber-500 px-5 py-2.5 text-sm font-semibold text-white shadow-lg shadow-orange-500/25 transition-all hover:scale-105 hover:shadow-xl hover:shadow-orange-500/30 active:scale-100 disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:scale-100 sm:w-auto"
|
||||
className="group relative flex w-full items-center justify-center gap-2 overflow-hidden rounded-lg bg-gradient-to-r from-orange-500 to-warning-500 px-5 py-2.5 text-sm font-semibold text-white shadow-lg shadow-orange-500/25 transition-all hover:scale-105 hover:shadow-xl hover:shadow-orange-500/30 active:scale-100 disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:scale-100 sm:w-auto"
|
||||
>
|
||||
{/* Shimmer effect */}
|
||||
<span className="absolute inset-0 -translate-x-full bg-gradient-to-r from-transparent via-white/20 to-transparent transition-transform duration-1000 group-hover:translate-x-full" />
|
||||
|
||||
@@ -91,7 +91,7 @@ export function SettingsTableRow({
|
||||
)}
|
||||
|
||||
{setting.read_only && (
|
||||
<span className="flex items-center gap-0.5 rounded-full bg-amber-500/15 px-1.5 py-0.5 text-[10px] font-medium leading-none text-amber-400">
|
||||
<span className="flex items-center gap-0.5 rounded-full bg-warning-500/15 px-1.5 py-0.5 text-[10px] font-medium leading-none text-warning-400">
|
||||
{t('admin.settings.badgeEnv')}
|
||||
<LockIcon className="h-3 w-3" />
|
||||
</span>
|
||||
|
||||
@@ -56,7 +56,7 @@ export default function AccountDeletedScreen() {
|
||||
<div className="mb-8">
|
||||
<div className="mx-auto flex h-24 w-24 items-center justify-center rounded-full bg-dark-800">
|
||||
<svg
|
||||
className="h-12 w-12 text-amber-400"
|
||||
className="h-12 w-12 text-warning-400"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke="currentColor"
|
||||
|
||||
@@ -21,7 +21,7 @@ export default function MaintenanceScreen() {
|
||||
<div className="mb-8">
|
||||
<div className="mx-auto flex h-24 w-24 items-center justify-center rounded-full bg-dark-800">
|
||||
<svg
|
||||
className="h-12 w-12 text-amber-500"
|
||||
className="h-12 w-12 text-warning-500"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke="currentColor"
|
||||
@@ -57,15 +57,15 @@ export default function MaintenanceScreen() {
|
||||
{/* Decorative dots */}
|
||||
<div className="mt-8 flex items-center justify-center gap-2">
|
||||
<div
|
||||
className="h-2 w-2 animate-pulse rounded-full bg-amber-500"
|
||||
className="h-2 w-2 animate-pulse rounded-full bg-warning-500"
|
||||
style={{ animationDelay: '0ms' }}
|
||||
/>
|
||||
<div
|
||||
className="h-2 w-2 animate-pulse rounded-full bg-amber-500"
|
||||
className="h-2 w-2 animate-pulse rounded-full bg-warning-500"
|
||||
style={{ animationDelay: '300ms' }}
|
||||
/>
|
||||
<div
|
||||
className="h-2 w-2 animate-pulse rounded-full bg-amber-500"
|
||||
className="h-2 w-2 animate-pulse rounded-full bg-warning-500"
|
||||
style={{ animationDelay: '600ms' }}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -296,7 +296,7 @@ export default function InstallationGuide({
|
||||
: 'border border-dark-700/50 bg-dark-800/80 text-dark-200 hover:border-dark-600/50 hover:bg-dark-700/80'
|
||||
}`}
|
||||
>
|
||||
{app.featured && <span className="h-2 w-2 shrink-0 rounded-full bg-amber-400" />}
|
||||
{app.featured && <span className="h-2 w-2 shrink-0 rounded-full bg-warning-400" />}
|
||||
<span className="relative z-10 truncate">{app.name}</span>
|
||||
{appIconSvg && (
|
||||
<div
|
||||
|
||||
@@ -32,7 +32,7 @@ function StatusBadge({
|
||||
|
||||
if (isTrial) {
|
||||
return (
|
||||
<span className="inline-flex items-center gap-1 rounded-full border border-amber-400/25 bg-amber-400/10 px-2 py-0.5 text-[10px] font-semibold text-amber-400">
|
||||
<span className="inline-flex items-center gap-1 rounded-full border border-warning-400/25 bg-warning-400/10 px-2 py-0.5 text-[10px] font-semibold text-warning-400">
|
||||
<svg className="h-2.5 w-2.5" viewBox="0 0 24 24" fill="currentColor">
|
||||
<path d="M12 2L15.09 8.26L22 9.27L17 14.14L18.18 21.02L12 17.77L5.82 21.02L7 14.14L2 9.27L8.91 8.26L12 2Z" />
|
||||
</svg>
|
||||
@@ -44,7 +44,7 @@ function StatusBadge({
|
||||
const color = isActive
|
||||
? 'bg-success-400/15 text-success-400 border-success-400/20'
|
||||
: isLimited
|
||||
? 'bg-amber-400/15 text-amber-400 border-amber-400/20'
|
||||
? 'bg-warning-400/15 text-warning-400 border-warning-400/20'
|
||||
: 'bg-error-400/15 text-error-400 border-error-400/20';
|
||||
|
||||
const label = isActive
|
||||
@@ -99,7 +99,7 @@ export default function SubscriptionListCard({
|
||||
trafficPercent >= 90
|
||||
? 'bg-error-400'
|
||||
: trafficPercent >= 70
|
||||
? 'bg-amber-400'
|
||||
? 'bg-warning-400'
|
||||
: 'bg-success-400';
|
||||
|
||||
const isLimitedStatus = subscription.status === 'limited';
|
||||
|
||||
@@ -190,7 +190,7 @@ function StatusBadge({ status, label }: StatusBadgeProps) {
|
||||
const colorMap: Record<string, string> = {
|
||||
success: 'bg-success-500/20 text-success-400',
|
||||
denied: 'bg-error-500/20 text-error-400',
|
||||
error: 'bg-amber-500/20 text-amber-400',
|
||||
error: 'bg-warning-500/20 text-warning-400',
|
||||
};
|
||||
|
||||
return (
|
||||
@@ -210,8 +210,8 @@ function MethodBadge({ method }: MethodBadgeProps) {
|
||||
const colorMap: Record<string, string> = {
|
||||
GET: 'bg-blue-500/20 text-blue-400',
|
||||
POST: 'bg-success-500/20 text-success-400',
|
||||
PUT: 'bg-amber-500/20 text-amber-400',
|
||||
PATCH: 'bg-amber-500/20 text-amber-400',
|
||||
PUT: 'bg-warning-500/20 text-warning-400',
|
||||
PATCH: 'bg-warning-500/20 text-warning-400',
|
||||
DELETE: 'bg-error-500/20 text-error-400',
|
||||
};
|
||||
|
||||
|
||||
@@ -170,14 +170,18 @@ function SubscriptionSubRow({
|
||||
|
||||
const days = subscription.days_remaining;
|
||||
const daysColor =
|
||||
days === 0 ? 'text-error-400' : days <= 7 ? 'text-amber-400' : 'text-success-400';
|
||||
days === 0 ? 'text-error-400' : days <= 7 ? 'text-warning-400' : 'text-success-400';
|
||||
|
||||
const trafficPercent =
|
||||
subscription.traffic_limit_gb > 0
|
||||
? Math.min(100, (subscription.traffic_used_gb / subscription.traffic_limit_gb) * 100)
|
||||
: 0;
|
||||
const trafficBarColor =
|
||||
trafficPercent >= 90 ? 'bg-error-400' : trafficPercent >= 70 ? 'bg-amber-400' : 'bg-accent-400';
|
||||
trafficPercent >= 90
|
||||
? 'bg-error-400'
|
||||
: trafficPercent >= 70
|
||||
? 'bg-warning-400'
|
||||
: 'bg-accent-400';
|
||||
|
||||
return (
|
||||
<tr
|
||||
@@ -308,11 +312,11 @@ function StatusBadge({ status }: { status: string | null }) {
|
||||
labelKey: 'admin.bulkActions.statuses.expired',
|
||||
},
|
||||
trial: {
|
||||
class: 'border-amber-500/30 bg-amber-500/15 text-amber-400',
|
||||
class: 'border-warning-500/30 bg-warning-500/15 text-warning-400',
|
||||
labelKey: 'admin.bulkActions.statuses.trial',
|
||||
},
|
||||
limited: {
|
||||
class: 'border-amber-500/30 bg-amber-500/15 text-amber-400',
|
||||
class: 'border-warning-500/30 bg-warning-500/15 text-warning-400',
|
||||
labelKey: 'admin.bulkActions.statuses.limited',
|
||||
},
|
||||
disabled: {
|
||||
@@ -1007,8 +1011,8 @@ function ActionModal({
|
||||
/>
|
||||
</div>
|
||||
{/* Warning about users with existing subscriptions */}
|
||||
<div className="rounded-xl border border-amber-500/20 bg-amber-500/5 px-3 py-2.5">
|
||||
<p className="text-xs text-amber-400">
|
||||
<div className="rounded-xl border border-warning-500/20 bg-warning-500/5 px-3 py-2.5">
|
||||
<p className="text-xs text-warning-400">
|
||||
{t('admin.bulkActions.grantSubscription.warning')}
|
||||
</p>
|
||||
</div>
|
||||
@@ -1029,8 +1033,8 @@ function ActionModal({
|
||||
</div>
|
||||
{activePaidCount > 0 && (
|
||||
<>
|
||||
<div className="rounded-xl border border-amber-500/20 bg-amber-500/5 px-3 py-2.5">
|
||||
<p className="text-sm font-medium text-amber-400">
|
||||
<div className="rounded-xl border border-warning-500/20 bg-warning-500/5 px-3 py-2.5">
|
||||
<p className="text-sm font-medium text-warning-400">
|
||||
{t('admin.bulkActions.deleteSubscription.activePaidWarning', {
|
||||
count: activePaidCount,
|
||||
total: totalSelected,
|
||||
@@ -2309,15 +2313,15 @@ export default function AdminBulkActions() {
|
||||
className={cn(
|
||||
'flex h-5 w-5 items-center justify-center rounded-md border-2 transition-all duration-150',
|
||||
trialOnly
|
||||
? 'border-amber-500 bg-amber-500 shadow-[0_0_8px_rgba(245,158,11,0.4)]'
|
||||
: 'border-dark-500 bg-dark-700/60 hover:border-amber-500/50 hover:bg-dark-600/60',
|
||||
? 'border-warning-500 bg-warning-500 shadow-[0_0_8px_rgba(245,158,11,0.4)]'
|
||||
: 'border-dark-500 bg-dark-700/60 hover:border-warning-500/50 hover:bg-dark-600/60',
|
||||
)}
|
||||
aria-pressed={trialOnly}
|
||||
>
|
||||
{trialOnly && <CheckIcon />}
|
||||
</button>
|
||||
<span
|
||||
className={cn('text-sm', trialOnly ? 'font-medium text-amber-400' : 'text-dark-400')}
|
||||
className={cn('text-sm', trialOnly ? 'font-medium text-warning-400' : 'text-dark-400')}
|
||||
>
|
||||
{t('admin.bulkActions.filters.trialOnly')}
|
||||
</span>
|
||||
|
||||
@@ -587,7 +587,7 @@ export default function AdminLandingStats() {
|
||||
{day.label}
|
||||
</span>
|
||||
<div
|
||||
className="group relative h-5 flex-1 overflow-hidden rounded-full bg-amber-500/80"
|
||||
className="group relative h-5 flex-1 overflow-hidden rounded-full bg-warning-500/80"
|
||||
title={`${t('admin.landings.stats.created', 'Created')}: ${day.created || 0}\n${t('admin.landings.stats.paid', 'paid')}: ${day.purchases || 0}\n${t('admin.landings.stats.revenueLabel', 'Revenue')}: ${day.revenue?.toFixed(0) || 0} ${t('common.currency', '\u20BD')}\nCR: ${Math.round(purchasedPct)}%`}
|
||||
>
|
||||
<div
|
||||
@@ -596,7 +596,7 @@ export default function AdminLandingStats() {
|
||||
/>
|
||||
</div>
|
||||
<span className="w-12 shrink-0 text-xs text-dark-400">
|
||||
<span className="text-amber-400">{day.created || 0}</span>
|
||||
<span className="text-warning-400">{day.created || 0}</span>
|
||||
<span className="text-dark-600">/</span>
|
||||
<span className="text-accent-400">{day.purchases || 0}</span>
|
||||
</span>
|
||||
@@ -605,7 +605,7 @@ export default function AdminLandingStats() {
|
||||
})}
|
||||
<div className="mt-2 flex items-center gap-4 text-xs text-dark-500">
|
||||
<div className="flex items-center gap-1">
|
||||
<div className="h-2 w-2 rounded-full bg-amber-500/80" />
|
||||
<div className="h-2 w-2 rounded-full bg-warning-500/80" />
|
||||
<span>{t('admin.landings.stats.created', 'Created')}</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-1">
|
||||
|
||||
@@ -49,7 +49,7 @@ interface StatusBadgeProps {
|
||||
function StatusBadge({ status }: StatusBadgeProps) {
|
||||
const styles: Record<string, string> = {
|
||||
paid: 'bg-success-500/20 text-success-400',
|
||||
pending: 'bg-amber-500/20 text-amber-400',
|
||||
pending: 'bg-warning-500/20 text-warning-400',
|
||||
cancelled: 'bg-error-500/20 text-error-400',
|
||||
};
|
||||
|
||||
@@ -76,7 +76,7 @@ interface StatCardProps {
|
||||
function StatCard({ label, value, color, isActive, onClick }: StatCardProps) {
|
||||
const colors: Record<string, string> = {
|
||||
blue: 'border-accent-500/30 bg-accent-500/20 text-accent-400',
|
||||
amber: 'border-amber-500/30 bg-amber-500/20 text-amber-400',
|
||||
amber: 'border-warning-500/30 bg-warning-500/20 text-warning-400',
|
||||
green: 'border-success-500/30 bg-success-500/20 text-success-400',
|
||||
red: 'border-error-500/30 bg-error-500/20 text-error-400',
|
||||
};
|
||||
|
||||
@@ -175,8 +175,8 @@ function VersionBadge({ hasUpdate }: { hasUpdate: boolean }) {
|
||||
|
||||
if (hasUpdate) {
|
||||
return (
|
||||
<span className="inline-flex items-center gap-1 rounded-full bg-amber-500/20 px-2.5 py-0.5 text-xs font-medium text-amber-400">
|
||||
<span className="h-1.5 w-1.5 animate-pulse rounded-full bg-amber-400" />
|
||||
<span className="inline-flex items-center gap-1 rounded-full bg-warning-500/20 px-2.5 py-0.5 text-xs font-medium text-warning-400">
|
||||
<span className="h-1.5 w-1.5 animate-pulse rounded-full bg-warning-400" />
|
||||
{t('adminUpdates.updateAvailable')}
|
||||
</span>
|
||||
);
|
||||
|
||||
@@ -1704,8 +1704,8 @@ export default function AdminUserDetail() {
|
||||
disabled={actionLoading}
|
||||
className={`rounded-lg px-3 py-2 text-sm font-medium transition-all disabled:opacity-50 ${
|
||||
confirmingAction === 'resetSubscription'
|
||||
? 'bg-amber-500 text-white'
|
||||
: 'bg-amber-500/15 text-amber-400 hover:bg-amber-500/25'
|
||||
? 'bg-warning-500 text-white'
|
||||
: 'bg-warning-500/15 text-warning-400 hover:bg-warning-500/25'
|
||||
}`}
|
||||
>
|
||||
{confirmingAction === 'resetSubscription'
|
||||
|
||||
@@ -2344,11 +2344,11 @@ export default function Subscription() {
|
||||
<button
|
||||
onClick={handleRevoke}
|
||||
disabled={revokeMutation.isPending || revokeCooldown > 0}
|
||||
className="w-full rounded-xl border border-amber-500/30 bg-amber-500/10 p-4 text-left transition-colors hover:bg-amber-500/20 disabled:opacity-50"
|
||||
className="w-full rounded-xl border border-warning-500/30 bg-warning-500/10 p-4 text-left transition-colors hover:bg-warning-500/20 disabled:opacity-50"
|
||||
>
|
||||
<div className="flex items-center justify-between">
|
||||
<div>
|
||||
<div className="font-medium text-amber-400">
|
||||
<div className="font-medium text-warning-400">
|
||||
{t('subscription.revoke.button')}
|
||||
</div>
|
||||
<div className="mt-1 text-sm text-dark-400">
|
||||
@@ -2360,9 +2360,9 @@ export default function Subscription() {
|
||||
: t('subscription.revoke.description')}
|
||||
</div>
|
||||
</div>
|
||||
<div className="text-amber-400">
|
||||
<div className="text-warning-400">
|
||||
{revokeMutation.isPending ? (
|
||||
<div className="h-5 w-5 animate-spin rounded-full border-2 border-amber-400/30 border-t-amber-400" />
|
||||
<div className="h-5 w-5 animate-spin rounded-full border-2 border-warning-400/30 border-t-amber-400" />
|
||||
) : (
|
||||
<svg
|
||||
className="h-5 w-5"
|
||||
|
||||
@@ -1207,8 +1207,8 @@ export default function SubscriptionPurchase() {
|
||||
selectedTariff.custom_days_enabled &&
|
||||
(selectedTariff.price_per_day_kopeks ?? 0) > 0
|
||||
) && (
|
||||
<div className="rounded-xl border border-amber-500/30 bg-amber-500/10 p-4 text-center">
|
||||
<div className="mb-2 text-sm font-medium text-amber-400">
|
||||
<div className="rounded-xl border border-warning-500/30 bg-warning-500/10 p-4 text-center">
|
||||
<div className="mb-2 text-sm font-medium text-warning-400">
|
||||
{t('subscription.noPeriodsAvailable')}
|
||||
</div>
|
||||
<div className="text-xs text-dark-400">
|
||||
|
||||
Reference in New Issue
Block a user