2026-03-25 23:55:43 +01:00
|
|
|
import { For, Show, createResource } from 'solid-js';
|
2026-03-26 00:35:41 +01:00
|
|
|
import { Download, Users, Building2, TrendingUp, CreditCard, ArrowUpRight, ArrowDownRight } from 'lucide-solid';
|
2026-03-17 15:37:49 +01:00
|
|
|
import AdminShell from '~/components/AdminShell';
|
feat: phase 1+2 — shell redesign + drag-and-drop dashboard
Shell (AdminShell + AdminSidebar):
- Logo moved to header-left section, width syncs with sidebar collapse state
- Global search bar with debounced multi-module API calls and grouped dropdown
- Bell notification icon with badge, gear → /admin/settings, user dropdown with logout
- Sidebar: 7 grouped nav sections with dividers, orange left-border active state,
removed "Active" badge pill, user info (avatar + name + role) pinned to bottom
- Fixed all sidebar labels to match Figma (Employee Management, External Onboarding
Management, Users Management, Verification Management)
- Added missing sidebar items: Verification, Fitness Trainers, Graphic Designers,
Social Media, Video Editors, Catering Services, Applications, Responses
Dashboard (admin/index):
- Rebuilt to match Figma: "Dashboard Overview" title, Export Report button
- 4 stat cards (Total Users, Active Companies, Open Leads, Credits Purchased)
with real API fetch, orange icons, delta badges, graceful — fallback
- ApexCharts: Leads Trend (orange gradient line) + Revenue Overview (navy bars)
- Drag-and-drop widget system via @thisbeyond/solid-dnd — sortable stat cards
and chart cards with handles and remove buttons in Customise mode
- Add Widget panel shows all available widgets not on dashboard
- 8 stat widgets + 3 chart widgets available; layout persists in localStorage
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 19:21:54 +01:00
|
|
|
|
2026-03-25 23:55:43 +01:00
|
|
|
const API = '/api/gateway';
|
feat(ui): apply stitch design system — left-accent KPI cards, Intelligence Hub, glassmorphism header
- app.css: Exo 2 font, #0a1d37 navy + #fd6216 orange tokens, #f9f9fd background
- AdminShell: backdrop-blur-xl glassmorphism header, centered search bar, settings icon,
name + bordered avatar, ambient shadow-[0_4px_24px_rgba(10,29,55,0.04)]
- AdminSidebar: white bg, left orange 4px pill accent on active (before: pseudo),
bg-slate-50 active state, MANAGEMENT/FINANCE/PLATFORM group labels, user card at bottom
- Dashboard: KPI cards with absolute left-0 accent bar + ambient shadows, big font-black numbers,
System Activity bar chart, Intelligence Hub dark navy panel with quick-action buttons,
Pipeline Status cards with progress bars, Control Plane 3-col grid
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 23:34:33 +01:00
|
|
|
|
2026-03-25 23:55:43 +01:00
|
|
|
async function fetchMetrics() {
|
|
|
|
|
const res = await fetch(`${API}/api/admin/dashboard/metrics`);
|
|
|
|
|
if (!res.ok) throw new Error('Failed to fetch dashboard metrics');
|
|
|
|
|
return res.json();
|
|
|
|
|
}
|
feat: phase 1+2 — shell redesign + drag-and-drop dashboard
Shell (AdminShell + AdminSidebar):
- Logo moved to header-left section, width syncs with sidebar collapse state
- Global search bar with debounced multi-module API calls and grouped dropdown
- Bell notification icon with badge, gear → /admin/settings, user dropdown with logout
- Sidebar: 7 grouped nav sections with dividers, orange left-border active state,
removed "Active" badge pill, user info (avatar + name + role) pinned to bottom
- Fixed all sidebar labels to match Figma (Employee Management, External Onboarding
Management, Users Management, Verification Management)
- Added missing sidebar items: Verification, Fitness Trainers, Graphic Designers,
Social Media, Video Editors, Catering Services, Applications, Responses
Dashboard (admin/index):
- Rebuilt to match Figma: "Dashboard Overview" title, Export Report button
- 4 stat cards (Total Users, Active Companies, Open Leads, Credits Purchased)
with real API fetch, orange icons, delta badges, graceful — fallback
- ApexCharts: Leads Trend (orange gradient line) + Revenue Overview (navy bars)
- Drag-and-drop widget system via @thisbeyond/solid-dnd — sortable stat cards
and chart cards with handles and remove buttons in Customise mode
- Add Widget panel shows all available widgets not on dashboard
- 8 stat widgets + 3 chart widgets available; layout persists in localStorage
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 19:21:54 +01:00
|
|
|
|
2026-03-25 23:55:43 +01:00
|
|
|
const maxAmount = 80000;
|
feat: phase 1+2 — shell redesign + drag-and-drop dashboard
Shell (AdminShell + AdminSidebar):
- Logo moved to header-left section, width syncs with sidebar collapse state
- Global search bar with debounced multi-module API calls and grouped dropdown
- Bell notification icon with badge, gear → /admin/settings, user dropdown with logout
- Sidebar: 7 grouped nav sections with dividers, orange left-border active state,
removed "Active" badge pill, user info (avatar + name + role) pinned to bottom
- Fixed all sidebar labels to match Figma (Employee Management, External Onboarding
Management, Users Management, Verification Management)
- Added missing sidebar items: Verification, Fitness Trainers, Graphic Designers,
Social Media, Video Editors, Catering Services, Applications, Responses
Dashboard (admin/index):
- Rebuilt to match Figma: "Dashboard Overview" title, Export Report button
- 4 stat cards (Total Users, Active Companies, Open Leads, Credits Purchased)
with real API fetch, orange icons, delta badges, graceful — fallback
- ApexCharts: Leads Trend (orange gradient line) + Revenue Overview (navy bars)
- Drag-and-drop widget system via @thisbeyond/solid-dnd — sortable stat cards
and chart cards with handles and remove buttons in Customise mode
- Add Widget panel shows all available widgets not on dashboard
- 8 stat widgets + 3 chart widgets available; layout persists in localStorage
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 19:21:54 +01:00
|
|
|
|
feat(admin): Phase 0 — Tailwind v4 foundation, shell rewrite, modern dashboard
- Install Tailwind CSS v4 via @tailwindcss/vite; configure vite.config.ts
- Rewrite app.css: Tailwind base, Exo 2 font, brand tokens (orange #fd6216, navy #050026), scrollbar utility; fix @import order
- Rewrite AdminShell.tsx: fixed header, fixed inset body grid (sidebar + main), session check, sub-tab system, logout, admin avatar/name/role
- Rewrite AdminSidebar.tsx: collapsible w-64/w-20, orange active rail + badge/dot, CSS filter for SVG icon tinting, min-h-0 flex fix
- Replace 84 route stub CSS classes (page-title, card, btn, table-wrap, etc.) with Tailwind equivalents via safe class-attr-only regex script
- Rewrite admin dashboard: Lucide icons in colored chip backgrounds, 4-col KPI grid, Control Plane 6-module grid, hover lift animations
- Disable SSR (ssr: false) to fix Vinxi dev manifest error; clear stale .vinxi cache
- Add lucide-solid icon library
- Add scripts/cleanup-css.mjs for class migration
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 23:00:21 +01:00
|
|
|
export default function AdminDashboard() {
|
2026-03-25 23:55:43 +01:00
|
|
|
const [data] = createResource(fetchMetrics);
|
|
|
|
|
|
|
|
|
|
const kpis = () => data()?.kpis || [];
|
|
|
|
|
const trendSeries = () => data()?.trend_series?.map((d: any) => d.Freelancers) || [0, 0, 0, 0, 0, 0];
|
|
|
|
|
const revSeries = () => data()?.rev_series?.map((d: any) => d.Revenue) || [0, 0, 0, 0, 0, 0];
|
|
|
|
|
const leadRows = () => data()?.lead_rows || [];
|
|
|
|
|
|
2026-03-17 15:37:49 +01:00
|
|
|
return (
|
|
|
|
|
<AdminShell>
|
fix(ui): sidebar spacing/scrolling, navy accent bars, reduced border radius
- Sidebar: proper min-h-0 + overflow-y-auto scrolling, px-3 spacing,
text-[13px] items with truncate, tighter py-2 rows, user card with
navy avatar chip, w-60 width
- KPI cards: navy #0a1d37 left accent bar instead of orange, navy icon
chips, rounded-xl (was rounded-2xl), reduced shadow intensity
- All cards/panels: rounded-xl (down from rounded-2xl/3xl)
- Activity chart: navy bars instead of orange, rounded-t-md (less rounded)
- Intelligence Hub actions: rounded-lg (was rounded-2xl)
- Control Plane cards: rounded-xl with hover:border-[#0a1d37]/10
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 23:55:31 +01:00
|
|
|
<div class="space-y-6">
|
2026-03-26 00:35:41 +01:00
|
|
|
|
|
|
|
|
{/* Header Section without background */}
|
|
|
|
|
<div class="flex flex-col gap-4 md:flex-row md:items-center md:justify-between px-1">
|
|
|
|
|
<div>
|
|
|
|
|
<h1 class="text-[32px] font-bold leading-tight text-[#0A1128]">Dashboard Overview</h1>
|
|
|
|
|
<p class="mt-1 text-[15px] text-[#64748B]">Welcome back! Here's what's happening with your platform today.</p>
|
ui: match stitch design system — navy accents, tighter rounding, sidebar groups
- AdminSidebar: group labels (Management/Organisation/Service Providers/Operations),
navy active state (bg-[#e8edf5] + [#0a1d37] left bar + navy icon), width 268px,
13.5px font, 40px item height, lucide-solid icons only (no img fallback), min-w-0
truncation fix, tighter py spacing
- AdminShell: header height 64px (was 86px), compact search bar 40px/rounded-lg,
navy avatar square (was orange gradient), tab indicator navy (was orange), sidebar
width 268px, main bg #f3f4f8
- Dashboard: rounded-xl→rounded-lg cards, rounded-2xl→rounded-xl sections, navy
accent bars on KPI cards, tabular-nums on values, navy pipeline progress bars
- app.css: table thead now navy (#0a1d37) with white text matching reference screenshot,
focus rings navy, admin-segment/admin-link-tabs active state navy, reduced border
radii on segmented controls and list items
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-24 02:49:09 +01:00
|
|
|
</div>
|
2026-03-26 00:35:41 +01:00
|
|
|
<button class="inline-flex h-12 items-center justify-center gap-2 rounded-full bg-[#0A1128] px-6 text-[14px] font-semibold text-white transition-colors hover:bg-[#1E293B]">
|
|
|
|
|
<Download size={18} strokeWidth={2.5} />
|
|
|
|
|
Export Report
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
feat(admin): Phase 0 — Tailwind v4 foundation, shell rewrite, modern dashboard
- Install Tailwind CSS v4 via @tailwindcss/vite; configure vite.config.ts
- Rewrite app.css: Tailwind base, Exo 2 font, brand tokens (orange #fd6216, navy #050026), scrollbar utility; fix @import order
- Rewrite AdminShell.tsx: fixed header, fixed inset body grid (sidebar + main), session check, sub-tab system, logout, admin avatar/name/role
- Rewrite AdminSidebar.tsx: collapsible w-64/w-20, orange active rail + badge/dot, CSS filter for SVG icon tinting, min-h-0 flex fix
- Replace 84 route stub CSS classes (page-title, card, btn, table-wrap, etc.) with Tailwind equivalents via safe class-attr-only regex script
- Rewrite admin dashboard: Lucide icons in colored chip backgrounds, 4-col KPI grid, Control Plane 6-module grid, hover lift animations
- Disable SSR (ssr: false) to fix Vinxi dev manifest error; clear stale .vinxi cache
- Add lucide-solid icon library
- Add scripts/cleanup-css.mjs for class migration
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 23:00:21 +01:00
|
|
|
|
2026-03-25 23:55:43 +01:00
|
|
|
<Show when={data.loading}>
|
2026-03-26 00:35:41 +01:00
|
|
|
<div class="flex items-center justify-center p-12 text-[#64748B]">Loading metrics...</div>
|
2026-03-25 23:55:43 +01:00
|
|
|
</Show>
|
|
|
|
|
|
|
|
|
|
<Show when={!data.loading && data()}>
|
2026-03-26 00:35:41 +01:00
|
|
|
|
|
|
|
|
{/* KPI Cards */}
|
|
|
|
|
<section class="grid gap-6 xl:grid-cols-4">
|
2026-03-25 23:55:43 +01:00
|
|
|
<For each={kpis()}>
|
2026-03-26 00:35:41 +01:00
|
|
|
{(item: any) => {
|
|
|
|
|
const isUsers = item.id === 'users';
|
|
|
|
|
const isCompanies = item.id === 'companies';
|
|
|
|
|
const isLeads = item.id === 'leads';
|
|
|
|
|
const Icon = isUsers ? Users : isCompanies ? Building2 : isLeads ? TrendingUp : CreditCard;
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<article class="flex flex-col rounded-2xl border border-[#E2E8F0] bg-white p-6 shadow-sm">
|
|
|
|
|
<div class="flex items-start justify-between">
|
|
|
|
|
<Icon size={32} class="text-[#FA5A1F]" strokeWidth={2} />
|
|
|
|
|
<div
|
|
|
|
|
class={`flex items-center gap-1 rounded-full px-2.5 py-1 text-[13px] font-bold ${
|
|
|
|
|
item.trendUp ? 'bg-[#FFF5F0] text-[#FA5A1F]' : 'bg-[#F1F5F9] text-[#0A1128]'
|
|
|
|
|
}`}
|
|
|
|
|
>
|
|
|
|
|
<Show when={item.trendUp} fallback={<ArrowDownRight size={14} strokeWidth={2.5} />}>
|
|
|
|
|
<ArrowUpRight size={14} strokeWidth={2.5} />
|
|
|
|
|
</Show>
|
|
|
|
|
{item.trend}
|
|
|
|
|
</div>
|
2026-03-25 23:55:43 +01:00
|
|
|
</div>
|
2026-03-26 00:35:41 +01:00
|
|
|
|
|
|
|
|
<div class="mt-4">
|
|
|
|
|
<p class="text-[14px] text-[#64748B]">{item.title}</p>
|
|
|
|
|
<p class="mt-2 text-[32px] font-bold tracking-tight text-[#0A1128]">{item.value}</p>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<p class="mt-3 text-[13px] text-[#94A3B8]">
|
|
|
|
|
<span class={`font-medium ${item.trendUp ? 'text-[#FA5A1F]' : 'text-[#64748B]'}`}>
|
|
|
|
|
{item.trendUp ? '+1,245' : '-27'}
|
|
|
|
|
</span>{' '}
|
|
|
|
|
from last month
|
|
|
|
|
</p>
|
|
|
|
|
</article>
|
|
|
|
|
);
|
|
|
|
|
}}
|
2026-03-25 23:55:43 +01:00
|
|
|
</For>
|
|
|
|
|
</section>
|
feat(ui): apply stitch design system — left-accent KPI cards, Intelligence Hub, glassmorphism header
- app.css: Exo 2 font, #0a1d37 navy + #fd6216 orange tokens, #f9f9fd background
- AdminShell: backdrop-blur-xl glassmorphism header, centered search bar, settings icon,
name + bordered avatar, ambient shadow-[0_4px_24px_rgba(10,29,55,0.04)]
- AdminSidebar: white bg, left orange 4px pill accent on active (before: pseudo),
bg-slate-50 active state, MANAGEMENT/FINANCE/PLATFORM group labels, user card at bottom
- Dashboard: KPI cards with absolute left-0 accent bar + ambient shadows, big font-black numbers,
System Activity bar chart, Intelligence Hub dark navy panel with quick-action buttons,
Pipeline Status cards with progress bars, Control Plane 3-col grid
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 23:34:33 +01:00
|
|
|
|
2026-03-26 00:35:41 +01:00
|
|
|
{/* Charts Row */}
|
|
|
|
|
<section class="grid gap-6 xl:grid-cols-2">
|
|
|
|
|
|
|
|
|
|
{/* Leads Trend Card */}
|
|
|
|
|
<article class="rounded-2xl border border-[#E2E8F0] bg-white p-6 shadow-sm">
|
|
|
|
|
<h2 class="text-[20px] font-bold text-[#0A1128]">Leads Trend</h2>
|
|
|
|
|
<p class="mt-1 text-[14px] text-[#64748B]">Monthly leads performance overview</p>
|
|
|
|
|
|
|
|
|
|
<div class="mt-8">
|
|
|
|
|
<div class="relative h-[250px]">
|
|
|
|
|
{/* Y-Axis labels and grid */}
|
|
|
|
|
<div class="absolute inset-0 flex flex-col justify-between pt-1 pb-6">
|
|
|
|
|
<For each={[120, 90, 60, 30, 0]}>
|
|
|
|
|
{(val) => (
|
|
|
|
|
<div class="flex items-center gap-4">
|
|
|
|
|
<span class="w-8 text-right text-[12px] font-bold text-[#0A1128]">{val}</span>
|
|
|
|
|
<div class="h-px flex-1 border-b border-dashed border-[#E2E8F0]" />
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</For>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* Line Chart Component */}
|
|
|
|
|
<div class="absolute inset-0 ml-12 mb-6">
|
|
|
|
|
<svg viewBox="0 0 100 40" class="h-full w-full overflow-visible" preserveAspectRatio="none">
|
|
|
|
|
<defs>
|
|
|
|
|
<linearGradient id="trendFill" x1="0" y1="0" x2="0" y2="1">
|
|
|
|
|
<stop offset="0%" stop-color="#0A1128" stop-opacity="0.3" />
|
|
|
|
|
<stop offset="100%" stop-color="#0A1128" stop-opacity="0.0" />
|
|
|
|
|
</linearGradient>
|
|
|
|
|
</defs>
|
|
|
|
|
<polygon
|
|
|
|
|
fill="url(#trendFill)"
|
|
|
|
|
points={`0,40 ${trendSeries().map((v: number, i: number) => `${i * (100 / 6)},${40 - v / 3}`).join(' ')} 100,40`}
|
|
|
|
|
/>
|
|
|
|
|
<polyline
|
|
|
|
|
fill="none"
|
|
|
|
|
stroke="#0A1128"
|
|
|
|
|
stroke-width="1.5"
|
|
|
|
|
stroke-linecap="round"
|
|
|
|
|
stroke-linejoin="round"
|
|
|
|
|
points={trendSeries().map((v: number, i: number) => `${i * (100 / 6)},${40 - v / 3}`).join(' ')}
|
|
|
|
|
/>
|
|
|
|
|
</svg>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* X-Axis labels */}
|
|
|
|
|
<div class="absolute bottom-0 left-12 right-0 flex justify-between px-2 text-[12px] font-bold text-[#0A1128]">
|
|
|
|
|
<For each={['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']}>
|
|
|
|
|
{(month) => <span>{month}</span>}
|
|
|
|
|
</For>
|
2026-03-25 23:55:43 +01:00
|
|
|
</div>
|
2026-03-25 23:01:42 +01:00
|
|
|
</div>
|
|
|
|
|
</div>
|
2026-03-25 23:55:43 +01:00
|
|
|
</article>
|
2026-03-25 23:01:42 +01:00
|
|
|
|
2026-03-26 00:35:41 +01:00
|
|
|
{/* Revenue Overview Card */}
|
|
|
|
|
<article class="rounded-2xl border border-[#E2E8F0] bg-white p-6 shadow-sm">
|
|
|
|
|
<h2 class="text-[20px] font-bold text-[#0A1128]">Revenue Overview</h2>
|
|
|
|
|
<p class="mt-1 text-[14px] text-[#64748B]">Monthly revenue vs expenses comparison</p>
|
|
|
|
|
|
|
|
|
|
<div class="mt-8">
|
|
|
|
|
<div class="relative h-[250px]">
|
|
|
|
|
{/* Y-Axis labels and grid */}
|
|
|
|
|
<div class="absolute inset-0 flex flex-col justify-between pt-1 pb-6">
|
|
|
|
|
<For each={[80000, 60000, 40000, 20000, 0]}>
|
|
|
|
|
{(val) => (
|
|
|
|
|
<div class="flex items-center gap-4">
|
|
|
|
|
<span class="w-12 text-right text-[12px] font-bold text-[#0A1128]">{val}</span>
|
|
|
|
|
<div class="h-px flex-1 border-b border-dashed border-[#E2E8F0]" />
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</For>
|
2026-03-25 23:55:43 +01:00
|
|
|
</div>
|
2026-03-26 00:35:41 +01:00
|
|
|
|
|
|
|
|
{/* Bar Chart Component */}
|
|
|
|
|
<div class="absolute inset-0 ml-16 mb-6 mt-1 flex items-end justify-between px-4">
|
2026-03-25 23:55:43 +01:00
|
|
|
<For each={revSeries()}>
|
|
|
|
|
{(value: number) => (
|
2026-03-26 00:35:41 +01:00
|
|
|
<div class="group relative flex h-full w-full justify-center">
|
|
|
|
|
<div
|
|
|
|
|
class="absolute bottom-0 w-4 rounded-t-full bg-[#0A1128] transition-all hover:bg-[#FA5A1F]"
|
|
|
|
|
style={{ height: `${(value / maxAmount) * 100}%` }}
|
|
|
|
|
/>
|
2026-03-25 23:55:43 +01:00
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</For>
|
|
|
|
|
</div>
|
2026-03-26 00:35:41 +01:00
|
|
|
|
|
|
|
|
{/* X-Axis labels */}
|
|
|
|
|
<div class="absolute bottom-0 left-16 right-0 flex justify-between px-4 text-[12px] font-bold text-[#0A1128]">
|
|
|
|
|
<For each={['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']}>
|
|
|
|
|
{(month) => <span class="w-4 text-center">{month}</span>}
|
|
|
|
|
</For>
|
|
|
|
|
</div>
|
2026-03-25 23:01:42 +01:00
|
|
|
</div>
|
|
|
|
|
</div>
|
2026-03-25 23:55:43 +01:00
|
|
|
</article>
|
feat(ui): apply stitch design system — left-accent KPI cards, Intelligence Hub, glassmorphism header
- app.css: Exo 2 font, #0a1d37 navy + #fd6216 orange tokens, #f9f9fd background
- AdminShell: backdrop-blur-xl glassmorphism header, centered search bar, settings icon,
name + bordered avatar, ambient shadow-[0_4px_24px_rgba(10,29,55,0.04)]
- AdminSidebar: white bg, left orange 4px pill accent on active (before: pseudo),
bg-slate-50 active state, MANAGEMENT/FINANCE/PLATFORM group labels, user card at bottom
- Dashboard: KPI cards with absolute left-0 accent bar + ambient shadows, big font-black numbers,
System Activity bar chart, Intelligence Hub dark navy panel with quick-action buttons,
Pipeline Status cards with progress bars, Control Plane 3-col grid
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 23:34:33 +01:00
|
|
|
|
2026-03-25 23:55:43 +01:00
|
|
|
</section>
|
|
|
|
|
</Show>
|
feat(admin): Phase 0 — Tailwind v4 foundation, shell rewrite, modern dashboard
- Install Tailwind CSS v4 via @tailwindcss/vite; configure vite.config.ts
- Rewrite app.css: Tailwind base, Exo 2 font, brand tokens (orange #fd6216, navy #050026), scrollbar utility; fix @import order
- Rewrite AdminShell.tsx: fixed header, fixed inset body grid (sidebar + main), session check, sub-tab system, logout, admin avatar/name/role
- Rewrite AdminSidebar.tsx: collapsible w-64/w-20, orange active rail + badge/dot, CSS filter for SVG icon tinting, min-h-0 flex fix
- Replace 84 route stub CSS classes (page-title, card, btn, table-wrap, etc.) with Tailwind equivalents via safe class-attr-only regex script
- Rewrite admin dashboard: Lucide icons in colored chip backgrounds, 4-col KPI grid, Control Plane 6-module grid, hover lift animations
- Disable SSR (ssr: false) to fix Vinxi dev manifest error; clear stale .vinxi cache
- Add lucide-solid icon library
- Add scripts/cleanup-css.mjs for class migration
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 23:00:21 +01:00
|
|
|
</div>
|
2026-03-17 15:37:49 +01:00
|
|
|
</AdminShell>
|
|
|
|
|
);
|
2026-03-16 23:20:54 +01:00
|
|
|
}
|