Files
Teamup/client/src/index.css
T
soroush.asadi 20a1a0dee4 Glassmorphism polish: frosted pills + glass sidebar nav states
Neutral badges become frosted (translucent + blur), the primary badge picks up the
gradient, and the sidebar nav active/hover states are now a frosted white highlight
(ring + blur) instead of the opaque accent — cohesive on the dark-glass sidebar.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 23:32:05 +03:30

244 lines
9.1 KiB
CSS

@import "tailwindcss";
@import "tw-animate-css";
@import "shadcn/tailwind.css";
@import "@fontsource-variable/hanken-grotesk";
@custom-variant dark (&:is(.dark *));
:root {
--radius: 0.625rem;
/* Glassmorphism body — frosted surfaces over a vivid gradient field. */
--background: oklch(0.95 0.022 286);
--foreground: oklch(0.19 0.03 280);
--card: oklch(1 0 0 / 0.74);
--card-foreground: oklch(0.19 0.03 280);
--popover: oklch(1 0 0 / 0.92);
--popover-foreground: oklch(0.19 0.03 280);
/* Brand: indigo, rationed so it always means something. */
--primary: oklch(0.511 0.262 276.966);
--primary-foreground: oklch(0.985 0 0);
--secondary: oklch(0.967 0.012 280);
--secondary-foreground: oklch(0.3 0.05 280);
--muted: oklch(0.95 0.01 280 / 0.6);
--muted-foreground: oklch(0.44 0.035 280);
--accent: oklch(0.95 0.03 280);
--accent-foreground: oklch(0.4 0.16 277);
--destructive: oklch(0.577 0.245 27.325);
--border: oklch(0.92 0.01 280);
--input: oklch(0.92 0.01 280);
--ring: oklch(0.585 0.233 277.117);
/* Seat-state triad (load-bearing) + status colors. */
--seat-human: oklch(0.554 0.046 257.417); /* slate */
--seat-open: oklch(0.769 0.188 70.08); /* amber */
--seat-ai: oklch(0.585 0.233 277.117); /* indigo */
--approved: oklch(0.704 0.14 182.503); /* teal */
--held: oklch(0.769 0.188 70.08); /* amber */
--chart-1: oklch(0.585 0.233 277.117);
--chart-2: oklch(0.704 0.14 182.503);
--chart-3: oklch(0.769 0.188 70.08);
--chart-4: oklch(0.554 0.046 257.417);
--chart-5: oklch(0.5 0.13 300);
/* Deep-indigo command-center sidebar. */
--sidebar: oklch(0.257 0.09 281.288);
--sidebar-foreground: oklch(0.93 0.02 280);
--sidebar-primary: oklch(0.673 0.182 276.935);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.359 0.144 278.697);
--sidebar-accent-foreground: oklch(0.97 0.01 280);
--sidebar-border: oklch(0.45 0.12 278 / 35%);
--sidebar-ring: oklch(0.585 0.233 277.117);
}
body {
margin: 0;
font-family: "Hanken Grotesk Variable", system-ui, sans-serif;
/* Vivid gradient field behind the frosted-glass surfaces — gives the glass something to lift off. */
background:
radial-gradient(1200px 640px at 6% -10%, oklch(0.62 0.2 288 / 0.34), transparent 62%),
radial-gradient(1050px 720px at 112% 4%, oklch(0.7 0.16 210 / 0.27), transparent 58%),
radial-gradient(960px 680px at 48% 122%, oklch(0.72 0.18 334 / 0.22), transparent 62%),
var(--background);
background-attachment: fixed;
min-height: 100vh;
}
@theme inline {
--font-sans: "Hanken Grotesk Variable", system-ui, sans-serif;
--font-heading: var(--font-sans);
--color-seat-human: var(--seat-human);
--color-seat-open: var(--seat-open);
--color-seat-ai: var(--seat-ai);
--color-approved: var(--approved);
--color-held: var(--held);
--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-foreground: var(--foreground);
--color-background: var(--background);
--radius-sm: calc(var(--radius) * 0.6);
--radius-md: calc(var(--radius) * 0.8);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) * 1.4);
--radius-2xl: calc(var(--radius) * 1.8);
--radius-3xl: calc(var(--radius) * 2.2);
--radius-4xl: calc(var(--radius) * 2.6);
}
.dark {
--background: oklch(0.17 0.035 287);
--foreground: oklch(0.985 0 0);
--card: oklch(0.31 0.055 286 / 0.62);
--card-foreground: oklch(0.985 0 0);
--popover: oklch(0.26 0.05 286 / 0.94);
--popover-foreground: oklch(0.985 0 0);
--primary: oklch(0.673 0.182 276.935);
--primary-foreground: oklch(0.205 0.03 280);
--secondary: oklch(0.3 0.04 280);
--secondary-foreground: oklch(0.985 0 0);
--muted: oklch(0.3 0.04 280);
--muted-foreground: oklch(0.72 0.03 280);
--accent: oklch(0.32 0.06 280);
--accent-foreground: oklch(0.985 0 0);
--destructive: oklch(0.704 0.191 22.216);
--border: oklch(1 0 0 / 10%);
--input: oklch(1 0 0 / 15%);
--ring: oklch(0.585 0.233 277.117);
--sidebar: oklch(0.21 0.07 281);
--sidebar-foreground: oklch(0.93 0.02 280);
--sidebar-primary: oklch(0.673 0.182 276.935);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.359 0.144 278.697);
--sidebar-accent-foreground: oklch(0.97 0.01 280);
--sidebar-border: oklch(1 0 0 / 10%);
--sidebar-ring: oklch(0.585 0.233 277.117);
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply text-foreground;
}
html {
@apply font-sans;
}
}
/* ---- Glassmorphism + gradients (app-wide, keyed on shadcn data-slots) ----
* Unlayered so they sit above Tailwind utilities; inline styles still win, so the
* gradient Team cards keep their own backgrounds. */
[data-slot="card"] {
backdrop-filter: blur(20px) saturate(155%);
-webkit-backdrop-filter: blur(20px) saturate(155%);
border: 1px solid color-mix(in oklch, white 65%, transparent);
box-shadow: 0 16px 44px -20px oklch(0.32 0.13 285 / 0.42), inset 0 1px 0 0 oklch(1 0 0 / 0.55);
}
.dark [data-slot="card"] {
border-color: color-mix(in oklch, white 16%, transparent);
box-shadow: 0 18px 48px -22px oklch(0 0 0 / 0.65), inset 0 1px 0 0 oklch(1 0 0 / 0.08);
}
[data-slot="popover-content"],
[data-slot="select-content"],
[data-slot="dropdown-menu-content"],
[data-slot="sheet-content"] {
backdrop-filter: blur(18px) saturate(160%);
-webkit-backdrop-filter: blur(18px) saturate(160%);
border: 1px solid color-mix(in oklch, white 40%, transparent);
}
.dark [data-slot="popover-content"],
.dark [data-slot="select-content"],
.dark [data-slot="dropdown-menu-content"],
.dark [data-slot="sheet-content"] {
border-color: color-mix(in oklch, white 12%, transparent);
}
/* Primary actions become a gradient; secondary/outline become glass. */
[data-slot="button"][data-variant="default"] {
background-image: linear-gradient(135deg, oklch(0.58 0.24 277) 0%, oklch(0.56 0.25 305) 100%);
box-shadow: 0 8px 20px -10px oklch(0.5 0.23 288 / 0.7);
}
[data-slot="button"][data-variant="default"]:hover {
background-image: linear-gradient(135deg, oklch(0.62 0.24 277) 0%, oklch(0.6 0.25 305) 100%);
}
[data-slot="button"][data-variant="outline"],
[data-slot="button"][data-variant="secondary"] {
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
background-color: color-mix(in oklch, var(--card) 65%, transparent);
border: 1px solid color-mix(in oklch, white 40%, transparent);
}
.dark [data-slot="button"][data-variant="outline"],
.dark [data-slot="button"][data-variant="secondary"] {
border-color: color-mix(in oklch, white 14%, transparent);
}
/* Frosted form fields — kept more opaque than cards so input text stays high-contrast. */
[data-slot="select-trigger"],
[data-slot="input"],
input:not([type="checkbox"]):not([type="radio"]):not([type="range"]),
textarea {
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
background-color: color-mix(in oklch, white 74%, transparent) !important;
border-color: color-mix(in oklch, oklch(0.5 0.04 285) 35%, transparent);
}
.dark [data-slot="select-trigger"],
.dark [data-slot="input"],
.dark input:not([type="checkbox"]):not([type="radio"]):not([type="range"]),
.dark textarea {
background-color: color-mix(in oklch, oklch(0.32 0.05 286) 82%, transparent) !important;
border-color: color-mix(in oklch, white 16%, transparent);
}
/* Pills: frosted for neutral variants, gradient for the primary one. */
[data-slot="badge"][data-variant="secondary"],
[data-slot="badge"][data-variant="outline"] {
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
background-color: color-mix(in oklch, white 58%, transparent);
border-color: color-mix(in oklch, white 55%, transparent);
}
.dark [data-slot="badge"][data-variant="secondary"],
.dark [data-slot="badge"][data-variant="outline"] {
background-color: color-mix(in oklch, white 12%, transparent);
border-color: color-mix(in oklch, white 16%, transparent);
}
[data-slot="badge"][data-variant="default"] {
background-image: linear-gradient(135deg, oklch(0.58 0.24 277), oklch(0.56 0.25 305));
}