mirror of
https://github.com/warmbly/warmbly.git
synced 2026-08-23 00:00:26 +00:00
13c4ebb7a6
Shorter, cleaner path. The 'web-' prefix was redundant given the dir sits at the repo root next to web/ and is unambiguously the admin web app. Git tracked the rename so blame + history follow through to the new location. Updated README.md and docs/VENDOR_LOCKIN.md references plus the package README header. No code changes.
199 lines
7.1 KiB
CSS
199 lines
7.1 KiB
CSS
@import "tailwindcss";
|
|
@import "tw-animate-css";
|
|
|
|
@custom-variant dark (&:is(.dark *));
|
|
|
|
/*
|
|
* Admin app design tokens.
|
|
*
|
|
* The base palette is intentionally identical to web/src/global.css so
|
|
* the two surfaces feel like one product. The differentiation comes from
|
|
* a small set of admin-only tokens layered on top:
|
|
*
|
|
* --admin-accent — amber/red used for the ADMIN badge, sidebar
|
|
* active nav, primary admin buttons, and the
|
|
* top page stripe. Picked to read as "elevated
|
|
* privilege" without screaming destructive.
|
|
* --admin-stripe — solid color for the 3px stripe that runs
|
|
* along the top of the app shell.
|
|
* --admin-sidebar-tint — a faint slate-warmer tone for the sidebar
|
|
* background so it reads as a distinct surface
|
|
* versus the dashboard's near-white sidebar.
|
|
*
|
|
* Keep the dashboard tokens in sync — copy them across when web/
|
|
* changes its design system.
|
|
*/
|
|
|
|
:root {
|
|
--radius: 0.5rem;
|
|
--foreground: oklch(0.15 0.01 260);
|
|
--background: oklch(1 0 0);
|
|
--card: oklch(1 0 0);
|
|
--card-foreground: oklch(0.15 0.01 260);
|
|
--popover: oklch(1 0 0);
|
|
--popover-foreground: oklch(0.15 0.01 260);
|
|
--primary: oklch(0.45 0.01 260);
|
|
--primary-foreground: oklch(1 0 0);
|
|
--secondary: oklch(0.96 0.005 260);
|
|
--secondary-foreground: oklch(0.25 0.01 260);
|
|
--muted: oklch(0.97 0.003 260);
|
|
--muted-foreground: oklch(0.55 0.01 260);
|
|
--accent: oklch(0.96 0.005 260);
|
|
--accent-foreground: oklch(0.20 0.01 260);
|
|
--destructive: oklch(0.577 0.245 27.325);
|
|
--border: oklch(0.92 0.005 260);
|
|
--input: oklch(0.92 0.005 260);
|
|
--ring: oklch(0.55 0.01 260);
|
|
--chart-1: oklch(0.55 0.15 250);
|
|
--chart-2: oklch(0.60 0.12 160);
|
|
--chart-3: oklch(0.65 0.10 30);
|
|
--chart-4: oklch(0.50 0.14 300);
|
|
--chart-5: oklch(0.58 0.08 200);
|
|
--sidebar: oklch(0.97 0.006 75);
|
|
--sidebar-foreground: oklch(0.15 0.01 260);
|
|
--sidebar-primary: oklch(0.45 0.01 260);
|
|
--sidebar-primary-foreground: oklch(1 0 0);
|
|
--sidebar-accent: oklch(0.94 0.02 75);
|
|
--sidebar-accent-foreground: oklch(0.20 0.01 260);
|
|
--sidebar-border: oklch(0.90 0.01 75);
|
|
--sidebar-ring: oklch(0.55 0.01 260);
|
|
|
|
/* Admin-specific differentiators */
|
|
--admin-accent: #d97706; /* amber-600 */
|
|
--admin-accent-foreground: #ffffff;
|
|
--admin-accent-soft: #fef3c7; /* amber-100 */
|
|
--admin-accent-strong: #b45309; /* amber-700 */
|
|
--admin-stripe: #d97706;
|
|
--admin-danger: #dc2626; /* red-600, for hard admin actions */
|
|
}
|
|
|
|
.dark {
|
|
--background: oklch(0.13 0.01 260);
|
|
--foreground: oklch(0.95 0.005 260);
|
|
--card: oklch(0.16 0.01 260);
|
|
--card-foreground: oklch(0.95 0.005 260);
|
|
--popover: oklch(0.16 0.01 260);
|
|
--popover-foreground: oklch(0.95 0.005 260);
|
|
--primary: oklch(0.85 0.005 260);
|
|
--primary-foreground: oklch(0.13 0.01 260);
|
|
--secondary: oklch(0.22 0.01 260);
|
|
--secondary-foreground: oklch(0.95 0.005 260);
|
|
--muted: oklch(0.20 0.01 260);
|
|
--muted-foreground: oklch(0.60 0.01 260);
|
|
--accent: oklch(0.22 0.01 260);
|
|
--accent-foreground: oklch(0.95 0.005 260);
|
|
--destructive: oklch(0.704 0.191 22.216);
|
|
--border: oklch(0.26 0.01 260);
|
|
--input: oklch(0.26 0.01 260);
|
|
--ring: oklch(0.60 0.01 260);
|
|
--sidebar: oklch(0.15 0.012 80);
|
|
--sidebar-foreground: oklch(0.95 0.005 260);
|
|
--sidebar-primary: oklch(0.85 0.005 260);
|
|
--sidebar-primary-foreground: oklch(0.13 0.01 260);
|
|
--sidebar-accent: oklch(0.22 0.015 80);
|
|
--sidebar-accent-foreground: oklch(0.95 0.005 260);
|
|
--sidebar-border: oklch(0.26 0.01 80);
|
|
--sidebar-ring: oklch(0.60 0.01 260);
|
|
|
|
--admin-accent: #f59e0b; /* amber-500 — slightly brighter on dark */
|
|
--admin-accent-foreground: #1c1917;
|
|
--admin-accent-soft: oklch(0.30 0.08 75);
|
|
--admin-accent-strong: #fbbf24;
|
|
--admin-stripe: #f59e0b;
|
|
--admin-danger: #ef4444;
|
|
}
|
|
|
|
@theme inline {
|
|
--color-background: var(--background);
|
|
--color-foreground: var(--foreground);
|
|
--font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
|
|
--font-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, monospace;
|
|
--font-display: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
|
|
--color-sidebar-ring: var(--sidebar-ring);
|
|
--color-sidebar-border: var(--sidebar-border);
|
|
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
--color-sidebar-accent: var(--sidebar-accent);
|
|
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
--color-sidebar-primary: var(--sidebar-primary);
|
|
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
--color-sidebar: var(--sidebar);
|
|
--color-chart-5: var(--chart-5);
|
|
--color-chart-4: var(--chart-4);
|
|
--color-chart-3: var(--chart-3);
|
|
--color-chart-2: var(--chart-2);
|
|
--color-chart-1: var(--chart-1);
|
|
--color-ring: var(--ring);
|
|
--color-input: var(--input);
|
|
--color-border: var(--border);
|
|
--color-destructive: var(--destructive);
|
|
--color-accent-foreground: var(--accent-foreground);
|
|
--color-accent: var(--accent);
|
|
--color-muted-foreground: var(--muted-foreground);
|
|
--color-muted: var(--muted);
|
|
--color-secondary-foreground: var(--secondary-foreground);
|
|
--color-secondary: var(--secondary);
|
|
--color-primary-foreground: var(--primary-foreground);
|
|
--color-primary: var(--primary);
|
|
--color-popover-foreground: var(--popover-foreground);
|
|
--color-popover: var(--popover);
|
|
--color-card-foreground: var(--card-foreground);
|
|
--color-card: var(--card);
|
|
|
|
--color-admin: var(--admin-accent);
|
|
--color-admin-foreground: var(--admin-accent-foreground);
|
|
--color-admin-soft: var(--admin-accent-soft);
|
|
--color-admin-strong: var(--admin-accent-strong);
|
|
--color-admin-stripe: var(--admin-stripe);
|
|
--color-admin-danger: var(--admin-danger);
|
|
|
|
--radius-sm: calc(var(--radius) - 4px);
|
|
--radius-md: calc(var(--radius) - 2px);
|
|
--radius-lg: var(--radius);
|
|
--radius-xl: calc(var(--radius) + 4px);
|
|
--radius-2xl: calc(var(--radius) + 8px);
|
|
}
|
|
|
|
body {
|
|
color: var(--foreground);
|
|
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11';
|
|
}
|
|
|
|
@layer base {
|
|
* {
|
|
@apply border-border outline-ring/50;
|
|
}
|
|
body {
|
|
@apply bg-background text-foreground;
|
|
}
|
|
}
|
|
|
|
@layer utilities {
|
|
.no-scrollbar::-webkit-scrollbar { display: none; }
|
|
.no-scrollbar { -ms-overflow-style: none; scrollbar-width: none; }
|
|
|
|
/* The 3px stripe along the top of the admin shell. Makes it instantly
|
|
visible — even peripherally — that this isn't the dashboard. */
|
|
.admin-stripe {
|
|
background: linear-gradient(90deg,
|
|
var(--admin-accent) 0%,
|
|
var(--admin-accent-strong) 50%,
|
|
var(--admin-accent) 100%);
|
|
}
|
|
}
|
|
|
|
/* Subtle diagonal warning pattern for the sidebar header background.
|
|
Kept very faint so it reads as texture, not noise. */
|
|
.admin-sidebar-pattern {
|
|
background-image:
|
|
repeating-linear-gradient(
|
|
45deg,
|
|
transparent 0,
|
|
transparent 8px,
|
|
rgba(217, 119, 6, 0.04) 8px,
|
|
rgba(217, 119, 6, 0.04) 9px
|
|
);
|
|
}
|