meridian-amd / vanguard.css
Cukinator's picture
Deploy Frontend2 to Space
bc1328f
/* Vanguard layer β€” gradients, glow, animations on top of base styles.css */
/* Animated aurora backdrop */
.app {
position: relative;
isolation: isolate;
}
.app::before {
content: "";
position: fixed; inset: 0;
background:
radial-gradient(ellipse 60% 50% at 15% 0%, color-mix(in oklch, var(--accent) 18%, transparent) 0%, transparent 60%),
radial-gradient(ellipse 50% 40% at 85% 10%, color-mix(in oklch, var(--violet) 16%, transparent) 0%, transparent 60%),
radial-gradient(ellipse 40% 30% at 50% 100%, color-mix(in oklch, var(--cyan) 12%, transparent) 0%, transparent 60%);
filter: blur(40px);
z-index: -1;
pointer-events: none;
animation: aurora 24s ease-in-out infinite alternate;
}
[data-theme="light"] .app::before {
opacity: 0.45;
}
@keyframes aurora {
0% { transform: translate(0, 0) scale(1); }
33% { transform: translate(3%, -2%) scale(1.08); }
66% { transform: translate(-2%, 3%) scale(0.95); }
100% { transform: translate(2%, 2%) scale(1.05); }
}
/* Sidebar + topbar become slightly translucent over aurora */
.sidebar, .topbar {
background: color-mix(in oklch, var(--bg-1) 82%, transparent);
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
}
.topbar { background: color-mix(in oklch, var(--bg-0) 72%, transparent); }
/* Gradient brand logo β€” conic, rotating */
.sb-logo {
background: conic-gradient(from 0deg,
var(--accent),
var(--violet),
var(--cyan),
var(--amber),
var(--accent));
animation: logo-spin 18s linear infinite;
box-shadow:
0 0 0 1px color-mix(in oklch, var(--accent) 40%, transparent),
0 0 24px -4px color-mix(in oklch, var(--accent) 50%, transparent);
}
.sb-logo::after {
mask: radial-gradient(circle at 30% 30%, #000 35%, transparent 36%);
}
@keyframes logo-spin { to { transform: rotate(360deg); } }
/* Accent primary button β€” gradient + glow */
.btn.primary {
background: linear-gradient(135deg,
var(--accent) 0%,
color-mix(in oklch, var(--accent) 60%, var(--cyan)) 100%);
box-shadow:
0 0 0 1px color-mix(in oklch, var(--accent) 30%, transparent),
0 6px 20px -8px color-mix(in oklch, var(--accent) 80%, transparent),
inset 0 1px 0 color-mix(in oklch, white 20%, transparent);
transition: transform 180ms cubic-bezier(0.2, 0, 0, 1), box-shadow 180ms;
}
.btn.primary:hover {
transform: translateY(-1px);
box-shadow:
0 0 0 1px color-mix(in oklch, var(--accent) 40%, transparent),
0 10px 28px -8px color-mix(in oklch, var(--accent) 80%, transparent),
inset 0 1px 0 color-mix(in oklch, white 30%, transparent);
filter: none;
}
/* Card shimmer on hover */
.card {
position: relative;
transition: transform 200ms cubic-bezier(0.2, 0, 0, 1), border-color 200ms, box-shadow 240ms;
overflow: hidden;
}
.card::after {
content: "";
position: absolute; inset: 0;
background: linear-gradient(135deg,
transparent 40%,
color-mix(in oklch, var(--accent) 6%, transparent) 55%,
transparent 70%);
opacity: 0;
transition: opacity 400ms;
pointer-events: none;
}
.card:hover {
border-color: var(--border-strong);
box-shadow: 0 12px 32px -16px oklch(0 0 0 / 0.4);
}
.card:hover::after { opacity: 1; }
/* Kanban cards: lift + subtle gradient border on hover */
button.card { cursor: pointer; }
button.card:hover {
transform: translateY(-2px);
}
/* Sidebar item β€” animated gradient indicator */
.sb-item { position: relative; transition: color 140ms; }
.sb-item.active .sb-ind {
background: linear-gradient(180deg, var(--accent), color-mix(in oklch, var(--accent) 50%, var(--violet)));
box-shadow: 0 0 10px -2px var(--accent);
}
.sb-item.active {
background: linear-gradient(90deg,
color-mix(in oklch, var(--accent) 10%, transparent) 0%,
transparent 80%);
}
/* Topbar search β€” inner glow on focus */
.search { transition: border-color 180ms, box-shadow 180ms; }
.search:hover { border-color: var(--border-strong); }
.search:focus-within {
border-color: color-mix(in oklch, var(--accent) 50%, var(--border));
box-shadow: 0 0 0 3px color-mix(in oklch, var(--accent) 15%, transparent);
}
/* Status dots glow by state */
.status.progress .s-dot { box-shadow: 0 0 8px -1px var(--status-progress); }
.status.done .s-dot { box-shadow: 0 0 8px -1px var(--status-done); }
.status.review .s-dot { box-shadow: 0 0 8px -1px var(--status-review); }
.status.blocked .s-dot { box-shadow: 0 0 8px -1px var(--status-blocked); }
/* Chips β€” gradient fills for states */
.chip { backdrop-filter: blur(6px); }
/* Priority urgent β€” gentle pulse */
.priority-pulse {
animation: pulse-urgent 1.8s ease-in-out infinite;
}
@keyframes pulse-urgent {
0%, 100% { opacity: 1; }
50% { opacity: 0.55; }
}
/* Avatar β€” gradient ring for online */
.avatar { position: relative; box-shadow: inset 0 0 0 1px color-mix(in oklch, white 10%, transparent); }
/* Page transitions */
.main > * {
animation: fade-slide 260ms cubic-bezier(0.2, 0, 0, 1);
}
@keyframes fade-slide {
from { opacity: 0; transform: translateY(4px); }
to { opacity: 1; transform: translateY(0); }
}
/* Staggered list items */
.stagger > * { animation: fade-slide 320ms cubic-bezier(0.2, 0, 0, 1) both; }
.stagger > *:nth-child(1) { animation-delay: 20ms; }
.stagger > *:nth-child(2) { animation-delay: 50ms; }
.stagger > *:nth-child(3) { animation-delay: 80ms; }
.stagger > *:nth-child(4) { animation-delay: 110ms; }
.stagger > *:nth-child(5) { animation-delay: 140ms; }
.stagger > *:nth-child(6) { animation-delay: 170ms; }
.stagger > *:nth-child(7) { animation-delay: 200ms; }
.stagger > *:nth-child(8) { animation-delay: 230ms; }
/* Hero greeting β€” gradient text */
.hero-title {
background: linear-gradient(120deg,
var(--fg-0) 0%,
var(--fg-0) 40%,
color-mix(in oklch, var(--accent) 70%, var(--fg-0)) 65%,
color-mix(in oklch, var(--violet) 80%, var(--fg-0)) 100%);
background-size: 200% 100%;
-webkit-background-clip: text;
background-clip: text;
color: transparent;
animation: shimmer 8s ease-in-out infinite;
}
@keyframes shimmer {
0%, 100% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
}
/* Stat counters β€” editorial numerals */
.stat-num {
font-family: var(--font-editorial);
font-weight: 400;
letter-spacing: -0.03em;
background: linear-gradient(180deg, var(--fg-0) 0%, color-mix(in oklch, var(--fg-0) 70%, var(--accent)) 100%);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
/* Segmented pill β€” animated selection glow */
.segmented button.on {
background: linear-gradient(135deg,
color-mix(in oklch, var(--bg-3) 100%, transparent),
color-mix(in oklch, var(--accent) 12%, var(--bg-3)));
box-shadow:
0 1px 2px oklch(0 0 0 / 0.2),
inset 0 1px 0 color-mix(in oklch, white 6%, transparent);
}
/* Icon button β€” ripple on click (CSS-only pulse) */
.icon-btn { transition: background 140ms, color 140ms, transform 120ms; }
.icon-btn:active { transform: scale(0.92); }
/* Kanban column header counter β€” subtle badge */
.col-badge {
background: color-mix(in oklch, var(--accent) 16%, var(--bg-2));
color: var(--accent);
padding: 1px 6px;
border-radius: 4px;
font-family: var(--font-mono);
font-size: 10.5px;
}
/* Burndown actual line β€” glow */
.burndown-actual { filter: drop-shadow(0 0 6px color-mix(in oklch, var(--accent) 60%, transparent)); }
/* Velocity bars β€” gradient */
.velo-bar {
background: linear-gradient(180deg,
color-mix(in oklch, var(--accent) 90%, transparent) 0%,
color-mix(in oklch, var(--accent) 30%, var(--bg-3)) 100%);
box-shadow: 0 0 12px -3px var(--accent);
}
.velo-bar.dim {
background: linear-gradient(180deg, var(--bg-3), var(--bg-2));
box-shadow: none;
}
/* Roadmap bar β€” gradient fill with progress wipe */
.roadmap-bar {
position: relative;
overflow: hidden;
backdrop-filter: blur(4px);
}
.roadmap-bar::before {
content: "";
position: absolute; inset: 0;
background: linear-gradient(90deg,
color-mix(in oklch, var(--proj, var(--accent)) 55%, transparent) 0%,
color-mix(in oklch, var(--proj, var(--accent)) 18%, transparent) 100%);
opacity: 0.9;
mix-blend-mode: screen;
}
/* Gradient divider */
.grad-divider {
height: 1px;
background: linear-gradient(90deg,
transparent 0%,
var(--border-strong) 20%,
var(--border-strong) 80%,
transparent 100%);
}
/* Command palette β€” glassmorphism */
.palette {
background: color-mix(in oklch, var(--bg-elev) 85%, transparent);
backdrop-filter: blur(24px) saturate(140%);
-webkit-backdrop-filter: blur(24px) saturate(140%);
border: 1px solid color-mix(in oklch, var(--accent) 20%, var(--border-strong));
box-shadow:
0 24px 80px -20px oklch(0 0 0 / 0.6),
0 0 0 1px color-mix(in oklch, var(--accent) 10%, transparent),
inset 0 1px 0 color-mix(in oklch, white 6%, transparent);
animation: palette-in 240ms cubic-bezier(0.2, 0, 0, 1);
}
@keyframes palette-in {
from { opacity: 0; transform: translateY(-8px) scale(0.98); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
.palette-item { transition: background 120ms, color 120ms, transform 100ms; }
.palette-item.sel {
background: linear-gradient(90deg,
color-mix(in oklch, var(--accent) 14%, transparent),
transparent);
}
/* Inbox panel β€” glass */
.inbox-panel {
background: color-mix(in oklch, var(--bg-1) 82%, transparent);
backdrop-filter: blur(18px);
}
/* Tweaks panel β€” glass */
.tweaks {
background: color-mix(in oklch, var(--bg-elev) 78%, transparent);
backdrop-filter: blur(20px) saturate(140%);
-webkit-backdrop-filter: blur(20px) saturate(140%);
border: 1px solid color-mix(in oklch, var(--accent) 25%, var(--border-strong));
box-shadow:
0 20px 60px -20px oklch(0 0 0 / 0.5),
0 0 0 1px color-mix(in oklch, var(--accent) 10%, transparent);
}
/* Hint bar β€” glass */
.hint-bar {
background: color-mix(in oklch, var(--bg-elev) 80%, transparent);
backdrop-filter: blur(16px);
}
/* Row hover β€” subtle gradient sweep */
.row { transition: background 160ms; position: relative; }
.row:hover {
background: linear-gradient(90deg,
color-mix(in oklch, var(--accent) 6%, transparent) 0%,
var(--bg-1) 20%);
}
/* Avatar stack β€” gradient bg (override flat) */
.avatar {
transition: transform 140ms;
}
.avatar:hover { transform: translateY(-1px) scale(1.06); z-index: 2; }
/* Notification dot pulse */
.icon-btn .dot {
animation: dot-pulse 2.4s ease-in-out infinite;
box-shadow: 0 0 8px -1px var(--accent);
}
@keyframes dot-pulse {
0%, 100% { transform: scale(1); opacity: 1; }
50% { transform: scale(1.3); opacity: 0.65; }
}
/* Gradient progress track */
.grad-progress {
background: linear-gradient(90deg, var(--accent) 0%, color-mix(in oklch, var(--accent) 60%, var(--violet)) 100%);
box-shadow: 0 0 10px -3px var(--accent);
}
/* Subtle scan line on data cards */
.scan::before {
content: "";
position: absolute;
top: 0; left: -50%;
width: 50%; height: 100%;
background: linear-gradient(90deg, transparent, color-mix(in oklch, var(--accent) 8%, transparent), transparent);
animation: scan 6s linear infinite;
pointer-events: none;
}
@keyframes scan {
to { left: 150%; }
}
/* Issue detail hero β€” spotlight */
.issue-spotlight {
position: relative;
}
.issue-spotlight::before {
content: "";
position: absolute;
top: -40px; left: -40px; right: -40px; height: 200px;
background: radial-gradient(ellipse 60% 100% at 20% 50%,
color-mix(in oklch, var(--accent) 10%, transparent) 0%,
transparent 60%);
z-index: -1;
pointer-events: none;
}
/* Tag / chip gradient on hover */
.chip:hover, .tag:hover {
border-color: var(--border-strong);
background: color-mix(in oklch, var(--bg-3) 100%, transparent);
}
/* Kanban column boundary glow on drop target sim */
.kanban-col {
position: relative;
}
/* Make topbar breadcrumb current accent on active */
.breadcrumbs .current {
background: linear-gradient(90deg, var(--fg-0), color-mix(in oklch, var(--accent) 50%, var(--fg-0)));
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
/* reduced motion */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after { animation: none !important; transition: none !important; }
}