diff --git a/apps/portal/src/app/globals.css b/apps/portal/src/app/globals.css
index 35b0e4f9..470c6979 100644
--- a/apps/portal/src/app/globals.css
+++ b/apps/portal/src/app/globals.css
@@ -1,4 +1,4 @@
-/* Tailwind CSS v4: import the full framework */
+/* Tailwind CSS v4 */
@import "tailwindcss";
@import "../styles/tokens.css";
@import "../styles/utilities.css";
@@ -6,456 +6,212 @@
@custom-variant dark (&:is(.dark *));
+/* =============================================================================
+ DESIGN TOKENS
+
+ Only define CSS variables here. Tailwind @theme maps them to utility classes.
+ ============================================================================= */
+
:root {
--radius: 0.625rem;
- /* ============= CORE NEUTRALS ============= */
- --background: oklch(1 0 0); /* pure white for main content */
+ /* Core */
+ --background: oklch(1 0 0);
--foreground: oklch(0.16 0 0);
-
- --card: oklch(1 0 0); /* pure white for cards */
+ --card: oklch(1 0 0);
--card-foreground: var(--foreground);
- --card-muted: oklch(0.98 0.008 234.4); /* subtle brand-tinted gray */
--popover: oklch(1 0 0);
--popover-foreground: var(--foreground);
-
- /* ============= BRAND COLORS (from logo) ============= */
- /* Primary Light Blue - Brand Accent */
- --primary: oklch(0.6884 0.1342 234.4);
- --primary-foreground: oklch(0.99 0 0);
- --primary-hover: oklch(0.62 0.1342 234.4);
- --primary-active: oklch(0.56 0.1342 234.4);
-
- /* Subtle surfaces & text - tinted with primary brand hue */
- --secondary: oklch(0.95 0.015 234.4);
- --secondary-foreground: oklch(0.29 0 0);
-
--muted: oklch(0.96 0.008 234.4);
--muted-foreground: oklch(0.5 0 0);
- /* Light accent (tinted with brand) */
+ /* Brand */
+ --primary: oklch(0.6884 0.1342 234.4);
+ --primary-foreground: oklch(0.99 0 0);
+ --secondary: oklch(0.95 0.015 234.4);
+ --secondary-foreground: oklch(0.29 0 0);
--accent: oklch(0.95 0.04 234.4);
--accent-foreground: var(--foreground);
- /* ============= SEMANTIC STATUS COLORS ============= */
- /* Three-tier system: text (dark readable), bg (almost white), border (subtle accent) */
- /* Reserve brand cyan for primary interaction; status colors are secondary */
-
- /* Success - #166534 text, #F0FDF4 bg, #BBF7D0 border */
- --success: oklch(0.42 0.1 145); /* dark green for text/icons */
+ /* 5 Semantic Colors (each: base, foreground, bg, border) */
+ --success: oklch(0.42 0.1 145);
--success-foreground: oklch(0.99 0 0);
- --success-bg: oklch(0.98 0.02 145); /* very light green bg */
- --success-border: oklch(0.93 0.08 150); /* subtle green border */
+ --success-bg: oklch(0.98 0.02 145);
+ --success-border: oklch(0.93 0.08 150);
- /* Info - uses primary brand hue */
--info: oklch(0.48 0.1 234.4);
--info-foreground: oklch(0.99 0 0);
--info-bg: oklch(0.97 0.02 234.4);
--info-border: oklch(0.91 0.05 234.4);
- /* Warning - #92400E text, #FFFBEB bg, #FDE68A border */
- --warning: oklch(0.45 0.12 55); /* dark amber for text/icons */
+ --warning: oklch(0.45 0.12 55);
--warning-foreground: oklch(0.99 0 0);
- --warning-bg: oklch(0.99 0.02 90); /* very light amber bg */
- --warning-border: oklch(0.92 0.12 90); /* subtle amber border */
+ --warning-bg: oklch(0.99 0.02 90);
+ --warning-border: oklch(0.92 0.12 90);
- /* Error - #9F1239 text, #FFF1F2 bg, #FECDD3 border (Overdue) */
- --error: oklch(0.42 0.16 0); /* dark rose for text/icons */
- --error-foreground: oklch(0.99 0 0);
- --error-bg: oklch(0.98 0.01 0); /* very light rose bg */
- --error-border: oklch(0.89 0.06 0); /* subtle rose border */
+ --danger: oklch(0.42 0.15 12);
+ --danger-foreground: oklch(0.99 0 0);
+ --danger-bg: oklch(0.98 0.01 10);
+ --danger-border: oklch(0.89 0.06 10);
- /* Destructive - #991B1B text, #FEF2F2 bg, #FECACA border (Terminated) */
- --destructive: oklch(0.43 0.15 25); /* dark red for text/icons */
- --destructive-foreground: oklch(0.99 0 0);
- --destructive-bg: oklch(0.98 0.01 20); /* very light red bg */
- --destructive-border: oklch(0.89 0.06 20); /* subtle red border */
-
- /* Neutral - uses sidebar brand hue */
--neutral: oklch(0.36 0.03 272.34);
--neutral-foreground: oklch(0.99 0 0);
--neutral-bg: oklch(0.97 0.008 272.34);
--neutral-border: oklch(0.87 0.02 272.34);
- /* ============= GRANULAR STATUS COLORS ============= */
- /* Three-tier: text (dark readable), bg (almost white), border (subtle accent) */
-
- /* Active - uses primary brand hue */
- --status-active: oklch(0.48 0.1 234.4);
- --status-active-bg: oklch(0.97 0.02 234.4);
- --status-active-border: oklch(0.91 0.05 234.4);
-
- /* Completed - uses sidebar brand hue */
- --status-completed: oklch(0.2754 0.1199 272.34);
- --status-completed-bg: oklch(0.96 0.02 272.34);
- --status-completed-border: oklch(0.87 0.07 272.34);
-
- /* Paid - #0F766E text, #ECFDF5 bg, #A7F3D0 border (teal, closer to brand) */
- --status-paid: oklch(0.48 0.08 175);
- --status-paid-bg: oklch(0.98 0.02 165);
- --status-paid-border: oklch(0.92 0.08 160);
-
- /* Success - #166534 text, #F0FDF4 bg, #BBF7D0 border */
- --status-success: oklch(0.42 0.1 145);
- --status-success-bg: oklch(0.98 0.02 145);
- --status-success-border: oklch(0.93 0.08 150);
-
- /* Pending - #92400E text, #FFFBEB bg, #FDE68A border */
- --status-pending: oklch(0.45 0.12 55);
- --status-pending-bg: oklch(0.99 0.02 90);
- --status-pending-border: oklch(0.92 0.12 90);
-
- /* Suspended - uses sidebar brand hue */
- --status-suspended: oklch(0.36 0.03 272.34);
- --status-suspended-bg: oklch(0.97 0.008 272.34);
- --status-suspended-border: oklch(0.87 0.02 272.34);
-
- /* Unpaid - #9A3412 text, #FFF7ED bg, #FED7AA border */
- --status-unpaid: oklch(0.46 0.13 45);
- --status-unpaid-bg: oklch(0.98 0.02 70);
- --status-unpaid-border: oklch(0.9 0.08 65);
-
- /* Terminated - #991B1B text, #FEF2F2 bg, #FECACA border */
- --status-terminated: oklch(0.43 0.15 25);
- --status-terminated-bg: oklch(0.98 0.01 20);
- --status-terminated-border: oklch(0.89 0.06 20);
-
- /* Overdue - #9F1239 text, #FFF1F2 bg, #FECDD3 border */
- --status-overdue: oklch(0.42 0.16 0);
- --status-overdue-bg: oklch(0.98 0.01 0);
- --status-overdue-border: oklch(0.89 0.06 0);
-
- /* ============= SOFT COLOR VARIANTS (for badges/pills) ============= */
- /* These use the -bg colors for backgrounds with text colors for contrast */
- --success-soft: var(--success-bg);
- --info-soft: var(--info-bg);
- --warning-soft: var(--warning-bg);
- --destructive-soft: var(--destructive-bg);
- --neutral-soft: var(--neutral-bg);
-
- /* ============= UI CHROME ============= */
+ /* Chrome */
--border: oklch(0.9 0.005 234.4);
- --border-muted: oklch(0.92 0.003 234.4);
--input: oklch(0.88 0.005 234.4);
--ring: oklch(0.72 0.12 234.4);
- --ring-subtle: color-mix(in oklch, var(--ring) 45%, transparent);
- /* ============= CHARTS ============= */
- /* Harmonious palette based on brand and status colors */
- --chart-1: oklch(0.6884 0.1342 234.4); /* Primary brand blue */
- --chart-2: oklch(0.65 0.12 145); /* Success - green */
- --chart-3: oklch(0.75 0.14 85); /* Pending - amber */
- --chart-4: oklch(0.55 0.16 38); /* Overdue - orange-red */
- --chart-5: oklch(0.2754 0.1199 272.34); /* Sidebar brand navy */
-
- /* ============= SIDEBAR ============= */
- /* Primary Dark Blue - Brand Anchor (Logo Color) */
+ /* Sidebar */
--sidebar: oklch(0.2754 0.1199 272.34);
--sidebar-foreground: oklch(1 0 0);
- --sidebar-primary: oklch(0.6884 0.1342 234.4); /* primary brand blue for accent */
- --sidebar-primary-foreground: oklch(1 0 0);
- --sidebar-accent: oklch(0.36 0.1199 272.34);
- --sidebar-accent-foreground: oklch(1 0 0);
--sidebar-border: oklch(0.36 0.1 272.34);
- --sidebar-ring: oklch(0.72 0.12 234.4);
+
+ /* Header */
+ --header: oklch(1 0 0 / 0.95);
+ --header-foreground: oklch(0.2 0 0);
+ --header-border: var(--border);
+
+ /* Charts */
+ --chart-1: var(--primary);
+ --chart-2: var(--success);
+ --chart-3: oklch(0.75 0.14 85);
+ --chart-4: var(--danger);
+ --chart-5: var(--neutral);
}
.dark {
- /* ============= CORE NEUTRALS (DARK) ============= */
--background: oklch(0.15 0.01 272.34);
--foreground: oklch(0.98 0 0);
-
--card: oklch(0.18 0.01 272.34);
- --card-foreground: var(--foreground);
- --card-muted: oklch(0.22 0.01 272.34);
--popover: oklch(0.18 0.01 272.34);
- --popover-foreground: var(--foreground);
-
- /* ============= BRAND COLORS (DARK MODE) ============= */
- /* Lighter brand blue for dark mode visibility */
- --primary: oklch(0.76 0.12 234.4);
- --primary-foreground: oklch(0.15 0 0);
- --primary-hover: oklch(0.7 0.12 234.4);
- --primary-active: oklch(0.65 0.12 234.4);
-
- /* Subtle surfaces & text - tinted with sidebar hue */
- --secondary: oklch(0.22 0.01 272.34);
- --secondary-foreground: oklch(0.9 0 0);
-
--muted: oklch(0.25 0.01 272.34);
--muted-foreground: oklch(0.74 0 0);
- /* Accent (tinted with brand) */
+ --primary: oklch(0.76 0.12 234.4);
+ --primary-foreground: oklch(0.15 0 0);
+ --secondary: oklch(0.22 0.01 272.34);
+ --secondary-foreground: oklch(0.9 0 0);
--accent: oklch(0.24 0.03 234.4);
--accent-foreground: oklch(0.92 0 0);
- /* ============= SEMANTIC STATUS COLORS (DARK) ============= */
- /* Three-tier: text (lighter for dark bg), bg (dark subtle), border (mid accent) */
-
- /* Success - lighter green for dark mode */
--success: oklch(0.72 0.1 145);
--success-foreground: oklch(0.15 0 0);
--success-bg: oklch(0.24 0.04 145);
--success-border: oklch(0.38 0.08 150);
- /* Info - uses primary brand hue */
--info: oklch(0.72 0.1 234.4);
--info-foreground: oklch(0.15 0 0);
--info-bg: oklch(0.24 0.04 234.4);
--info-border: oklch(0.38 0.07 234.4);
- /* Warning - lighter amber for dark mode */
--warning: oklch(0.78 0.12 55);
--warning-foreground: oklch(0.15 0 0);
--warning-bg: oklch(0.26 0.04 90);
--warning-border: oklch(0.42 0.1 90);
- /* Error - lighter rose for dark mode */
- --error: oklch(0.72 0.14 0);
- --error-foreground: oklch(0.15 0 0);
- --error-bg: oklch(0.24 0.03 0);
- --error-border: oklch(0.38 0.08 0);
+ --danger: oklch(0.72 0.14 12);
+ --danger-foreground: oklch(0.15 0 0);
+ --danger-bg: oklch(0.24 0.03 10);
+ --danger-border: oklch(0.38 0.08 10);
- /* Destructive - lighter red for dark mode */
- --destructive: oklch(0.7 0.14 25);
- --destructive-foreground: oklch(0.15 0 0);
- --destructive-bg: oklch(0.24 0.03 20);
- --destructive-border: oklch(0.38 0.08 20);
-
- /* Neutral - uses sidebar brand hue */
--neutral: oklch(0.7 0.03 272.34);
--neutral-foreground: oklch(0.15 0 0);
--neutral-bg: oklch(0.24 0.02 272.34);
--neutral-border: oklch(0.38 0.03 272.34);
- /* ============= GRANULAR STATUS COLORS (DARK) ============= */
- /* Active - uses primary brand hue */
- --status-active: oklch(0.72 0.1 234.4);
- --status-active-bg: oklch(0.24 0.04 234.4);
- --status-active-border: oklch(0.38 0.07 234.4);
-
- /* Completed - uses sidebar brand hue */
- --status-completed: oklch(0.55 0.1 272.34);
- --status-completed-bg: oklch(0.24 0.04 272.34);
- --status-completed-border: oklch(0.38 0.07 272.34);
-
- /* Paid */
- --status-paid: oklch(0.7 0.08 175);
- --status-paid-bg: oklch(0.24 0.04 165);
- --status-paid-border: oklch(0.4 0.08 160);
-
- /* Success */
- --status-success: oklch(0.72 0.1 145);
- --status-success-bg: oklch(0.24 0.04 145);
- --status-success-border: oklch(0.38 0.08 150);
-
- /* Pending */
- --status-pending: oklch(0.78 0.12 55);
- --status-pending-bg: oklch(0.26 0.04 90);
- --status-pending-border: oklch(0.42 0.1 90);
-
- /* Suspended - uses sidebar brand hue */
- --status-suspended: oklch(0.7 0.03 272.34);
- --status-suspended-bg: oklch(0.24 0.02 272.34);
- --status-suspended-border: oklch(0.38 0.03 272.34);
-
- /* Unpaid */
- --status-unpaid: oklch(0.76 0.12 45);
- --status-unpaid-bg: oklch(0.26 0.04 70);
- --status-unpaid-border: oklch(0.42 0.08 65);
-
- /* Terminated */
- --status-terminated: oklch(0.7 0.14 25);
- --status-terminated-bg: oklch(0.24 0.03 20);
- --status-terminated-border: oklch(0.38 0.08 20);
-
- /* Overdue */
- --status-overdue: oklch(0.72 0.14 0);
- --status-overdue-bg: oklch(0.24 0.03 0);
- --status-overdue-border: oklch(0.38 0.08 0);
-
- /* ============= SOFT COLOR VARIANTS (for badges/pills) ============= */
- --success-soft: var(--success-bg);
- --info-soft: var(--info-bg);
- --warning-soft: var(--warning-bg);
- --destructive-soft: var(--destructive-bg);
- --neutral-soft: var(--neutral-bg);
-
- /* ============= UI CHROME (DARK) ============= */
--border: oklch(0.32 0.02 272.34);
- --border-muted: oklch(0.28 0.01 272.34);
--input: oklch(0.35 0.02 272.34);
--ring: oklch(0.78 0.11 234.4);
- --ring-subtle: color-mix(in oklch, var(--ring) 40%, transparent);
- /* ============= CHARTS (DARK) ============= */
- --chart-1: oklch(0.76 0.12 234.4); /* Primary brand blue */
- --chart-2: oklch(0.72 0.12 145); /* Success - green */
- --chart-3: oklch(0.82 0.14 85); /* Pending - amber */
- --chart-4: oklch(0.65 0.15 38); /* Overdue - orange-red */
- --chart-5: oklch(0.5 0.1 272.34); /* Sidebar brand navy */
-
- /* ============= SIDEBAR (DARK) ============= */
--sidebar: oklch(0.22 0.1199 272.34);
- --sidebar-foreground: oklch(1 0 0);
- --sidebar-primary: oklch(0.76 0.12 234.4); /* lighter primary brand blue */
- --sidebar-primary-foreground: oklch(0.15 0 0);
- --sidebar-accent: oklch(0.32 0.1 272.34);
- --sidebar-accent-foreground: oklch(1 0 0);
--sidebar-border: oklch(0.3 0.08 272.34);
- --sidebar-ring: var(--ring);
+
+ --header: oklch(0.18 0 0 / 0.95);
+ --header-foreground: var(--foreground);
+
+ --chart-3: oklch(0.82 0.14 85);
}
-/* Tailwind v4 token map */
+/* =============================================================================
+ TAILWIND THEME - Maps CSS vars to utility classes (bg-*, text-*, border-*)
+ ============================================================================= */
+
@theme {
- /* Core */
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
- --color-card-muted: var(--card-muted);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
-
- /* Brand */
- --color-primary: var(--primary);
- --color-primary-foreground: var(--primary-foreground);
- --color-primary-hover: var(--primary-hover);
- --color-primary-active: var(--primary-active);
-
- --color-secondary: var(--secondary);
- --color-secondary-foreground: var(--secondary-foreground);
-
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
+ --color-primary: var(--primary);
+ --color-primary-foreground: var(--primary-foreground);
+ --color-secondary: var(--secondary);
+ --color-secondary-foreground: var(--secondary-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
- /* Semantic status colors (three-tier: text, bg, border + soft for badges) */
--color-success: var(--success);
--color-success-foreground: var(--success-foreground);
--color-success-bg: var(--success-bg);
--color-success-border: var(--success-border);
- --color-success-soft: var(--success-soft);
--color-info: var(--info);
--color-info-foreground: var(--info-foreground);
--color-info-bg: var(--info-bg);
--color-info-border: var(--info-border);
- --color-info-soft: var(--info-soft);
--color-warning: var(--warning);
--color-warning-foreground: var(--warning-foreground);
--color-warning-bg: var(--warning-bg);
--color-warning-border: var(--warning-border);
- --color-warning-soft: var(--warning-soft);
- --color-error: var(--error);
- --color-error-foreground: var(--error-foreground);
- --color-error-bg: var(--error-bg);
- --color-error-border: var(--error-border);
-
- --color-destructive: var(--destructive);
- --color-destructive-foreground: var(--destructive-foreground);
- --color-destructive-bg: var(--destructive-bg);
- --color-destructive-border: var(--destructive-border);
- --color-destructive-soft: var(--destructive-soft);
+ --color-danger: var(--danger);
+ --color-danger-foreground: var(--danger-foreground);
+ --color-danger-bg: var(--danger-bg);
+ --color-danger-border: var(--danger-border);
--color-neutral: var(--neutral);
--color-neutral-foreground: var(--neutral-foreground);
--color-neutral-bg: var(--neutral-bg);
--color-neutral-border: var(--neutral-border);
- --color-neutral-soft: var(--neutral-soft);
- /* Granular status colors (three-tier: text, bg, border) */
- --color-status-active: var(--status-active);
- --color-status-active-bg: var(--status-active-bg);
- --color-status-active-border: var(--status-active-border);
+ /* Soft variants (alias to -bg, for badge backgrounds) */
+ --color-success-soft: var(--success-bg);
+ --color-info-soft: var(--info-bg);
+ --color-warning-soft: var(--warning-bg);
+ --color-danger-soft: var(--danger-bg);
+ --color-neutral-soft: var(--neutral-bg);
- --color-status-completed: var(--status-completed);
- --color-status-completed-bg: var(--status-completed-bg);
- --color-status-completed-border: var(--status-completed-border);
+ /* Legacy aliases (existing components use these) */
+ --color-destructive: var(--danger);
+ --color-destructive-foreground: var(--danger-foreground);
+ --color-destructive-soft: var(--danger-bg);
+ --color-error: var(--danger);
+ --color-error-foreground: var(--danger-foreground);
- --color-status-paid: var(--status-paid);
- --color-status-paid-bg: var(--status-paid-bg);
- --color-status-paid-border: var(--status-paid-border);
-
- --color-status-success: var(--status-success);
- --color-status-success-bg: var(--status-success-bg);
- --color-status-success-border: var(--status-success-border);
-
- --color-status-pending: var(--status-pending);
- --color-status-pending-bg: var(--status-pending-bg);
- --color-status-pending-border: var(--status-pending-border);
-
- --color-status-suspended: var(--status-suspended);
- --color-status-suspended-bg: var(--status-suspended-bg);
- --color-status-suspended-border: var(--status-suspended-border);
-
- --color-status-unpaid: var(--status-unpaid);
- --color-status-unpaid-bg: var(--status-unpaid-bg);
- --color-status-unpaid-border: var(--status-unpaid-border);
-
- --color-status-terminated: var(--status-terminated);
- --color-status-terminated-bg: var(--status-terminated-bg);
- --color-status-terminated-border: var(--status-terminated-border);
-
- --color-status-overdue: var(--status-overdue);
- --color-status-overdue-bg: var(--status-overdue-bg);
- --color-status-overdue-border: var(--status-overdue-border);
-
- /* UI chrome */
--color-border: var(--border);
- --color-border-muted: var(--border-muted);
--color-input: var(--input);
--color-ring: var(--ring);
- --color-ring-subtle: var(--ring-subtle);
- /* Charts */
+ --color-sidebar: var(--sidebar);
+ --color-sidebar-foreground: var(--sidebar-foreground);
+ --color-sidebar-border: var(--sidebar-border);
+
+ --color-header: var(--header);
+ --color-header-foreground: var(--header-foreground);
+ --color-header-border: var(--header-border);
+
--color-chart-1: var(--chart-1);
--color-chart-2: var(--chart-2);
--color-chart-3: var(--chart-3);
--color-chart-4: var(--chart-4);
--color-chart-5: var(--chart-5);
-
- /* Sidebar */
- --color-sidebar: var(--sidebar);
- --color-sidebar-foreground: var(--sidebar-foreground);
- --color-sidebar-primary: var(--sidebar-primary);
- --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
- --color-sidebar-accent: var(--sidebar-accent);
- --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
- --color-sidebar-border: var(--sidebar-border);
- --color-sidebar-ring: var(--sidebar-ring);
-}
-
-@layer base {
- * {
- border-color: var(--border);
- outline-color: var(--ring-subtle);
- }
- body {
- background-color: var(--background);
- color: var(--foreground);
- font-family: var(--font-geist-sans), system-ui, sans-serif;
- }
-}
-
-@theme inline {
- --animate-aurora: aurora 60s linear infinite;
- @keyframes aurora {
- from {
- backgroundposition:
- 50% 50%,
- 50% 50%;
- }
- to {
- backgroundposition:
- 350% 50%,
- 350% 50%;
- }
- }
}
@layer base {
@@ -464,5 +220,6 @@
}
body {
@apply bg-background text-foreground;
+ font-family: var(--font-geist-sans), system-ui, sans-serif;
}
}
diff --git a/apps/portal/src/components/atoms/error-state.tsx b/apps/portal/src/components/atoms/error-state.tsx
index daac3155..00211c94 100644
--- a/apps/portal/src/components/atoms/error-state.tsx
+++ b/apps/portal/src/components/atoms/error-state.tsx
@@ -23,8 +23,8 @@ export function ErrorState({
const variantClasses = {
page: "min-h-[400px] py-12",
- card: "bg-card text-card-foreground border border-destructive/25 rounded-[var(--cp-card-radius)] p-[var(--cp-card-padding)] shadow-[var(--cp-card-shadow)]",
- inline: "bg-destructive-soft border border-destructive/25 rounded-md p-4",
+ card: "bg-card text-card-foreground border border-danger/25 rounded-2xl p-6 shadow-md",
+ inline: "bg-danger-soft border border-danger/25 rounded-md p-4",
};
const iconSizes = {
@@ -47,7 +47,7 @@ export function ErrorState({
return (
-
+
@@ -63,7 +63,7 @@ export function ErrorState({
onClick={onRetry}
variant="outline"
size={variant === "inline" ? "sm" : "default"}
- className="text-destructive border-destructive/30 hover:bg-destructive-soft"
+ className="text-danger border-danger/30 hover:bg-danger-soft"
>
{retryLabel}
diff --git a/apps/portal/src/components/atoms/loading-skeleton.tsx b/apps/portal/src/components/atoms/loading-skeleton.tsx
index 24811d54..183499e1 100644
--- a/apps/portal/src/components/atoms/loading-skeleton.tsx
+++ b/apps/portal/src/components/atoms/loading-skeleton.tsx
@@ -6,22 +6,14 @@ interface SkeletonProps {
}
export function Skeleton({ className, animate = true }: SkeletonProps) {
- return (
-
- );
+ return
;
}
export function LoadingCard({ className }: { className?: string }) {
return (
@@ -45,7 +37,7 @@ export function LoadingCard({ className }: { className?: string }) {
export function LoadingTable({ rows = 5, columns = 4 }: { rows?: number; columns?: number }) {
return (
-
+
{/* Header */}
@@ -77,7 +69,7 @@ export function LoadingStats({ count = 4 }: { count?: number }) {
{Array.from({ length: count }).map((_, i) => (
diff --git a/apps/portal/src/components/organisms/AppShell/AppShell.tsx b/apps/portal/src/components/organisms/AppShell/AppShell.tsx
index 9d78ddab..eb3c2a03 100644
--- a/apps/portal/src/components/organisms/AppShell/AppShell.tsx
+++ b/apps/portal/src/components/organisms/AppShell/AppShell.tsx
@@ -154,7 +154,7 @@ export function AppShell({ children }: AppShellProps) {
className="fixed inset-0 bg-black/50 animate-in fade-in duration-300"
onClick={() => setSidebarOpen(false)}
/>
-
+
-
+
+