over / src /app /globals.css
luguog's picture
fix(microsoft): use configurable Azure AD client ID for device-code flow
3f13033 verified
Raw
History Blame Contribute Delete
29 kB
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
/* Advantage Foundry β€” premium deep-ocean bioluminescent dark theme */
--background: 220 30% 4%;
--foreground: 210 30% 95%;
--card: 220 24% 7%;
--card-foreground: 210 30% 95%;
--primary: 172 82% 44%;
--primary-foreground: 220 30% 4%;
--secondary: 220 20% 13%;
--secondary-foreground: 210 20% 92%;
--muted: 220 18% 16%;
--muted-foreground: 210 12% 52%;
--accent: 280 72% 60%;
--accent-foreground: 210 30% 98%;
--destructive: 0 74% 54%;
--destructive-foreground: 210 30% 98%;
--border: 220 20% 16%;
--input: 220 20% 16%;
--ring: 172 82% 52%;
--radius: 0.875rem;
/* Strategy class colors */
--strat-experimental: 280 70% 55%;
--strat-personalized: 45 85% 55%;
--strat-proven: 172 75% 42%;
/* Evidence levels */
--evidence-unresolved: 0 0% 45%;
--evidence-observed: 45 70% 50%;
--evidence-probable: 200 70% 52%;
--evidence-experimental: 172 75% 42%;
/* SPINOR organic color system */
--spinor-blue: 200 90% 60%;
--spinor-violet: 255 80% 75%;
--spinor-green: 152 70% 55%;
--spinor-gold: 43 95% 60%;
--spinor-red: 0 80% 70%;
--spinor-gray: 215 15% 60%;
/* Premium surfaces */
--glass-bg: 185 25% 7%;
--glass-border: 185 20% 18%;
--glass-highlight: 0 0% 100%;
--gradient-aurora-1: 172 80% 40%;
--gradient-aurora-2: 280 70% 55%;
--gradient-aurora-3: 200 90% 60%;
}
.light {
color-scheme: light;
--background: 180 30% 97%;
--foreground: 185 35% 8%;
--card: 0 0% 100%;
--card-foreground: 185 35% 8%;
--primary: 172 70% 35%;
--primary-foreground: 0 0% 100%;
--secondary: 180 20% 92%;
--secondary-foreground: 185 35% 8%;
--muted: 180 15% 90%;
--muted-foreground: 185 10% 42%;
--accent: 280 60% 50%;
--accent-foreground: 0 0% 100%;
--destructive: 0 72% 50%;
--destructive-foreground: 0 0% 100%;
--border: 180 15% 86%;
--input: 180 15% 86%;
--ring: 172 70% 35%;
}
}
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-feature-settings: "ss01", "cv01", "cv02";
line-height: 1.6;
background-color: hsl(var(--background));
background-image:
radial-gradient(ellipse 80% 50% at 50% -20%, hsl(var(--primary) / 0.12), transparent),
radial-gradient(ellipse 60% 40% at 80% 100%, hsl(var(--accent) / 0.07), transparent),
radial-gradient(ellipse 50% 40% at 20% 100%, hsl(200 90% 60% / 0.05), transparent);
background-attachment: fixed;
}
.noise-overlay {
position: fixed;
inset: 0;
pointer-events: none;
z-index: 9999;
opacity: 0.04;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 400 400' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
background-repeat: repeat;
background-size: 200px 200px;
}
@media (prefers-reduced-motion: no-preference) {
* {
transition: background-color 0.25s, border-color 0.25s, box-shadow 0.25s, transform 0.25s;
}
}
.light body {
@apply bg-background text-foreground;
}
}
@layer components {
/* ── Premium Card System ── */
.card {
@apply rounded-2xl border border-border bg-card text-card-foreground;
box-shadow:
0 1px 2px 0 hsl(0 0% 0% / 0.25),
0 1px 1px 0 hsl(0 0% 0% / 0.15),
inset 0 1px 0 0 hsl(0 0% 100% / 0.04);
position: relative;
overflow: hidden;
}
.card::before {
content: "";
position: absolute;
inset: 0;
background: radial-gradient(circle at 50% 0%, hsl(var(--primary) / 0.08), transparent 70%);
opacity: 0;
transition: opacity 0.5s ease;
pointer-events: none;
}
.card:hover::before {
opacity: 1;
}
.card-hover {
@apply transition-all duration-300;
}
.card-hover:hover {
box-shadow:
0 8px 24px -8px hsl(0 0% 0% / 0.45),
0 4px 8px -4px hsl(0 0% 0% / 0.3),
0 0 40px -10px hsl(var(--primary) / 0.18),
inset 0 1px 0 0 hsl(0 0% 100% / 0.05);
transform: translateY(-3px);
border-color: hsl(var(--primary) / 0.25);
}
/* ── Glass Cards (premium depth) ── */
.glass-card {
@apply rounded-2xl border border-white/[0.06] bg-white/[0.025] backdrop-blur-xl;
box-shadow:
0 0 40px -10px hsl(var(--primary) / 0.08),
0 2px 8px -2px hsl(0 0% 0% / 0.3),
inset 0 1px 0 0 hsl(0 0% 100% / 0.04);
}
.glass-card-hover {
@apply transition-all duration-500;
}
.glass-card-hover:hover {
box-shadow:
0 0 60px -10px hsl(var(--primary) / 0.18),
0 4px 16px -4px hsl(0 0% 0% / 0.4),
inset 0 1px 0 0 hsl(0 0% 100% / 0.06);
transform: translateY(-3px);
border-color: hsl(var(--primary) / 0.15);
}
/* ── Premium Buttons ── */
.btn {
@apply inline-flex items-center justify-center rounded-lg text-sm font-semibold transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50;
letter-spacing: 0.01em;
}
.btn-primary {
@apply h-10 px-5 py-2;
background: linear-gradient(135deg, hsl(var(--primary)) 0%, hsl(var(--primary) / 0.92) 100%);
color: hsl(var(--primary-foreground));
box-shadow:
0 4px 14px -2px hsl(var(--primary) / 0.4),
0 1px 3px hsl(0 0% 0% / 0.25),
inset 0 1px 0 0 hsl(0 0% 100% / 0.15);
}
.btn-primary:hover {
background: linear-gradient(135deg, hsl(var(--primary)) 0%, hsl(var(--primary)) 100%);
box-shadow:
0 8px 22px -4px hsl(var(--primary) / 0.5),
0 2px 4px hsl(0 0% 0% / 0.3),
inset 0 1px 0 0 hsl(0 0% 100% / 0.2);
transform: translateY(-1.5px);
}
.btn-secondary {
@apply bg-secondary text-secondary-foreground hover:bg-secondary/80 h-10 px-5 py-2;
}
.btn-outline {
@apply h-10 px-5 py-2;
border: 1px solid hsl(var(--input));
background: hsl(var(--card) / 0.4);
color: hsl(var(--foreground));
box-shadow: inset 0 1px 0 0 hsl(0 0% 100% / 0.04);
}
.btn-outline:hover {
border-color: hsl(var(--primary) / 0.35);
background: hsl(var(--primary) / 0.08);
color: hsl(var(--primary));
box-shadow: 0 0 24px -8px hsl(var(--primary) / 0.25), inset 0 1px 0 0 hsl(0 0% 100% / 0.05);
}
.btn-danger {
@apply bg-destructive text-destructive-foreground hover:bg-destructive/90 h-10 px-5 py-2;
}
.btn-ghost {
@apply h-9 px-3 py-1.5 text-muted-foreground hover:text-foreground;
}
.btn-ghost:hover {
background: hsl(var(--primary) / 0.08);
}
/* ── Inputs ── */
.input {
@apply flex h-10 w-full rounded-lg border border-input bg-background px-4 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 transition-all;
box-shadow: inset 0 1px 2px 0 hsl(0 0% 0% / 0.15);
}
.input:focus,
.input:focus-visible {
border-color: hsl(var(--primary) / 0.5);
box-shadow:
0 0 0 2px hsl(var(--primary) / 0.15),
inset 0 1px 2px 0 hsl(0 0% 0% / 0.15);
}
.badge {
@apply inline-flex items-center rounded-full border px-2.5 py-0.5 text-[11px] font-semibold tracking-wide transition-colors;
box-shadow: inset 0 1px 0 0 hsl(0 0% 100% / 0.05);
}
.status-dot {
@apply inline-block h-2 w-2 rounded-full;
}
.done-section-label {
@apply text-xs font-semibold uppercase tracking-wider text-muted-foreground;
}
/* ── LLM Status Indicator ── */
.llm-badge {
@apply inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[10px] font-semibold;
}
.llm-badge-live {
@apply border-emerald-500/30 bg-emerald-500/10 text-emerald-400;
}
.llm-badge-offline {
@apply border-muted-foreground/20 bg-muted/10 text-muted-foreground;
}
.llm-badge-thinking {
@apply border-violet-500/30 bg-violet-500/10 text-violet-400;
}
/* ── Evidence Bar ── */
.evidence-bar {
@apply relative h-1.5 w-full overflow-hidden rounded-full bg-muted;
}
.evidence-bar-fill {
@apply absolute left-0 top-0 h-full rounded-full transition-all duration-700;
}
/* ── Strategy Glows ── */
.strat-glow-experimental {
box-shadow: 0 0 20px -4px hsl(var(--strat-experimental) / 0.4);
}
.strat-glow-personalized {
box-shadow: 0 0 20px -4px hsl(var(--strat-personalized) / 0.4);
}
.strat-glow-proven {
box-shadow: 0 0 20px -4px hsl(var(--strat-proven) / 0.4);
}
/* ── Organic Shapes ── */
.organic-border {
border-radius: 42% 58% 56% 44% / 48% 42% 58% 52%;
}
.organic-border-2 {
border-radius: 60% 40% 52% 48% / 42% 58% 42% 58%;
}
/* ── Leaderboard ── */
.leaderboard-row {
@apply relative flex items-center gap-4 rounded-xl border border-transparent px-4 py-3 transition-all duration-300;
}
.leaderboard-row:hover {
@apply border-primary/20 bg-primary/5;
}
/* ── Hypothesis Cards ── */
.hypothesis-card {
@apply relative overflow-hidden rounded-2xl border border-border bg-card p-5 transition-all duration-500;
box-shadow: 0 2px 8px -2px hsl(0 0% 0% / 0.3);
}
.hypothesis-card::before {
content: "";
position: absolute;
inset: 0;
background: radial-gradient(circle at 50% 0%, hsl(var(--primary) / 0.08), transparent 70%);
opacity: 0;
transition: opacity 0.5s;
pointer-events: none;
}
.hypothesis-card:hover::before {
opacity: 1;
}
.hypothesis-card:hover {
transform: translateY(-3px);
border-color: hsl(var(--primary) / 0.25);
box-shadow: 0 8px 24px -4px hsl(0 0% 0% / 0.4), 0 0 30px -8px hsl(var(--primary) / 0.15);
}
/* ── Stat Card ── */
.stat-card {
@apply rounded-xl border border-border bg-card p-4 transition-all duration-300;
}
.stat-card:hover {
@apply border-primary/20;
box-shadow: 0 0 20px -4px hsl(var(--primary) / 0.1);
}
/* ── Section Divider ── */
.section-divider {
@apply h-px w-full;
background: linear-gradient(90deg, transparent, hsl(var(--border)), transparent);
}
/* ── Aurora Background ── */
.aurora-bg {
position: fixed;
inset: 0;
pointer-events: none;
z-index: 0;
background:
radial-gradient(45% 35% at 15% 20%, hsl(var(--gradient-aurora-1) / 0.10), transparent 70%),
radial-gradient(40% 35% at 85% 30%, hsl(var(--gradient-aurora-2) / 0.08), transparent 70%),
radial-gradient(45% 40% at 50% 90%, hsl(var(--gradient-aurora-3) / 0.07), transparent 70%),
radial-gradient(60% 50% at 90% 80%, hsl(var(--accent) / 0.04), transparent 70%);
filter: blur(40px);
animation: aurora-drift 20s ease-in-out infinite alternate;
}
@keyframes aurora-drift {
0% {
transform: translate3d(0, 0, 0) scale(1);
opacity: 0.6;
}
100% {
transform: translate3d(2%, -1%, 0) scale(1.05);
opacity: 1;
}
}
/* ── LLM Thinking Animation ── */
.llm-thinking-dots {
display: inline-flex;
gap: 4px;
}
.llm-thinking-dots span {
width: 6px;
height: 6px;
border-radius: 50%;
background: hsl(var(--accent));
animation: llm-dot-bounce 1.4s ease-in-out infinite;
}
.llm-thinking-dots span:nth-child(2) {
animation-delay: 0.2s;
}
.llm-thinking-dots span:nth-child(3) {
animation-delay: 0.4s;
}
@keyframes llm-dot-bounce {
0%,
80%,
100% {
transform: scale(0.6);
opacity: 0.4;
}
40% {
transform: scale(1);
opacity: 1;
}
}
/* ── Gradient Text ── */
.gradient-text {
background: linear-gradient(135deg, hsl(var(--primary)), hsl(var(--accent)));
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
.gradient-text-gold {
background: linear-gradient(135deg, hsl(var(--spinor-gold)), hsl(43 95% 70%));
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
}
@layer utilities {
@keyframes fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes fade-in-up {
from {
opacity: 0;
transform: translateY(16px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes pulse-working {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.4;
}
}
@keyframes grow-up {
from {
transform: scaleY(0);
opacity: 0;
}
to {
transform: scaleY(1);
opacity: 1;
}
}
@keyframes glow-pulse {
0%,
100% {
box-shadow: 0 0 20px -4px hsl(var(--primary) / 0.3);
}
50% {
box-shadow: 0 0 40px -4px hsl(var(--primary) / 0.5);
}
}
@keyframes shimmer {
0% {
background-position: -200% 0;
}
100% {
background-position: 200% 0;
}
}
@keyframes orbit {
from {
transform: rotate(0deg) translateX(120px) rotate(0deg);
}
to {
transform: rotate(360deg) translateX(120px) rotate(-360deg);
}
}
.animate-fade-in {
animation: fade-in 0.4s ease-out forwards;
}
.animate-fade-in-up {
animation: fade-in-up 0.5s ease-out forwards;
}
.animate-pulse-working {
animation: pulse-working 2s ease-in-out infinite;
}
.animate-grow-up {
animation: grow-up 0.6s ease-out forwards;
transform-origin: bottom;
}
.animate-glow-pulse {
animation: glow-pulse 3s ease-in-out infinite;
}
.animate-orbit {
animation: orbit 20s linear infinite;
}
@keyframes slide-in-left {
from {
opacity: 0;
transform: translateX(-12px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
.animate-slide-in-left {
animation: slide-in-left 0.4s ease-out forwards;
}
.shimmer-bg {
background: linear-gradient(90deg, transparent 0%, hsl(var(--primary) / 0.05) 50%, transparent 100%);
background-size: 200% 100%;
animation: shimmer 3s ease-in-out infinite;
}
.scrollbar-thin::-webkit-scrollbar {
width: 6px;
height: 6px;
}
.scrollbar-thin::-webkit-scrollbar-track {
background: transparent;
}
.scrollbar-thin::-webkit-scrollbar-thumb {
@apply bg-muted-foreground/30 rounded-full;
}
.scrollbar-thin::-webkit-scrollbar-thumb:hover {
@apply bg-muted-foreground/50;
}
.text-balance {
text-wrap: balance;
}
.text-pretty {
text-wrap: pretty;
}
/* ── SPINOR Hypothesis Organism ── */
.spinor-canvas {
background: radial-gradient(circle at 50% 50%, hsl(var(--spinor-gold) / 0.04), transparent 65%);
}
.spinor-aurora {
position: absolute;
inset: 0;
pointer-events: none;
background:
radial-gradient(60% 50% at 20% 20%, hsl(var(--spinor-violet) / 0.08), transparent 70%),
radial-gradient(50% 50% at 80% 30%, hsl(var(--spinor-blue) / 0.07), transparent 70%),
radial-gradient(55% 55% at 70% 80%, hsl(var(--spinor-green) / 0.06), transparent 70%);
animation: spinor-aurora-shift 18s ease-in-out infinite alternate;
}
@keyframes spinor-aurora-shift {
0% {
transform: translate3d(0, 0, 0) scale(1);
opacity: 0.7;
}
100% {
transform: translate3d(2%, -2%, 0) scale(1.05);
opacity: 1;
}
}
.spinor-seed-pulse {
animation: spinor-seed-pulse 1.6s ease-in-out infinite;
}
@keyframes spinor-seed-pulse {
0%,
100% {
transform: scale(1);
box-shadow: 0 0 0 0 hsl(var(--spinor-gold) / 0.5);
}
50% {
transform: scale(1.12);
box-shadow: 0 0 0 12px hsl(var(--spinor-gold) / 0);
}
}
.spinor-core-pulse {
transform-origin: center;
transform-box: fill-box;
animation: spinor-core-pulse 3.5s ease-in-out infinite;
}
@keyframes spinor-core-pulse {
0%,
100% {
transform: scale(1);
opacity: 0.3;
}
50% {
transform: scale(1.18);
opacity: 0.5;
}
}
.spinor-node-pulse {
transform-origin: center;
transform-box: fill-box;
animation: spinor-node-pulse 2.8s ease-in-out infinite;
}
@keyframes spinor-node-pulse {
0%,
100% {
transform: scale(1);
opacity: 0.45;
}
50% {
transform: scale(1.35);
opacity: 0.1;
}
}
.spinor-root {
stroke-dashoffset: 0;
animation: spinor-root-extend 6s ease-in-out infinite alternate;
}
@keyframes spinor-root-extend {
0% {
stroke-dashoffset: 0;
opacity: 0.4;
}
100% {
stroke-dashoffset: -14;
opacity: 0.7;
}
}
.spinor-stem {
animation: spinor-stem-sway 7s ease-in-out infinite alternate;
transform-origin: center;
}
@keyframes spinor-stem-sway {
0% {
opacity: 0.35;
}
100% {
opacity: 0.6;
}
}
.spinor-node {
transition: transform 0.25s ease;
}
.spinor-node:hover {
transform: scale(1.12);
}
.spinor-node-label {
font-size: 10px;
font-weight: 500;
pointer-events: none;
text-shadow: 0 0 6px hsl(var(--background));
}
/* ═══════════════════════════════════════════════════════════════
INNOVATIVE UX/UI SYSTEM
═══════════════════════════════════════════════════════════════ */
/* ── Streaming LLM Text ── */
@keyframes stream-in {
from {
opacity: 0;
transform: translateY(4px);
filter: blur(2px);
}
to {
opacity: 1;
transform: translateY(0);
filter: blur(0);
}
}
.stream-text {
animation: stream-in 0.3s ease-out forwards;
}
.stream-cursor::after {
content: "β–‹";
animation: cursor-blink 0.8s steps(2) infinite;
color: hsl(var(--accent));
margin-left: 2px;
}
@keyframes cursor-blink {
0%,
50% {
opacity: 1;
}
51%,
100% {
opacity: 0;
}
}
/* ── Bento Grid ── */
.bento-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 1rem;
}
.bento-item {
@apply rounded-2xl border border-border bg-card p-5 transition-all duration-500;
box-shadow: 0 2px 8px -2px hsl(0 0% 0% / 0.3);
}
.bento-item:hover {
transform: translateY(-3px);
border-color: hsl(var(--primary) / 0.2);
box-shadow: 0 8px 24px -4px hsl(0 0% 0% / 0.4), 0 0 30px -8px hsl(var(--primary) / 0.12);
}
.bento-span-2 {
grid-column: span 2;
}
.bento-span-3 {
grid-column: span 3;
}
.bento-span-4 {
grid-column: span 4;
}
.bento-row-2 {
grid-row: span 2;
}
@media (max-width: 768px) {
.bento-grid {
grid-template-columns: repeat(2, 1fr);
}
.bento-span-3,
.bento-span-4 {
grid-column: span 2;
}
}
/* ── Skeleton Shimmer ── */
.skeleton {
@apply rounded-lg;
background: linear-gradient(90deg,
hsl(var(--muted)) 0%,
hsl(var(--muted) / 0.5) 50%,
hsl(var(--muted)) 100%);
background-size: 200% 100%;
animation: skeleton-shimmer 1.5s ease-in-out infinite;
}
@keyframes skeleton-shimmer {
0% {
background-position: 200% 0;
}
100% {
background-position: -200% 0;
}
}
.skeleton-text {
@apply rounded h-4;
background: linear-gradient(90deg,
hsl(var(--muted)) 0%,
hsl(var(--muted) / 0.5) 50%,
hsl(var(--muted)) 100%);
background-size: 200% 100%;
animation: skeleton-shimmer 1.5s ease-in-out infinite;
}
/* ── Animated Evidence Meter ── */
.evidence-meter {
position: relative;
height: 8px;
width: 100%;
border-radius: 9999px;
background: hsl(var(--muted));
overflow: hidden;
}
.evidence-meter-fill {
position: absolute;
left: 0;
top: 0;
height: 100%;
border-radius: 9999px;
transition: width 1.2s cubic-bezier(0.4, 0, 0.2, 1);
background: linear-gradient(90deg, hsl(var(--primary)), hsl(var(--accent)));
box-shadow: 0 0 12px hsl(var(--primary) / 0.4);
}
.evidence-meter-fill::after {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(90deg, transparent, hsl(0 0% 100% / 0.2), transparent);
background-size: 200% 100%;
animation: shimmer 2s ease-in-out infinite;
}
/* ── Radar Chart ── */
.radar-grid {
stroke: hsl(var(--border));
stroke-width: 1;
fill: none;
}
.radar-axis {
stroke: hsl(var(--border) / 0.5);
stroke-width: 1;
stroke-dasharray: 2 4;
}
.radar-fill {
fill: hsl(var(--primary) / 0.15);
stroke: hsl(var(--primary));
stroke-width: 2;
transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1);
filter: drop-shadow(0 0 6px hsl(var(--primary) / 0.3));
}
.radar-point {
fill: hsl(var(--primary));
stroke: hsl(var(--background));
stroke-width: 2;
transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1);
}
.radar-label {
font-size: 10px;
font-weight: 600;
fill: hsl(var(--muted-foreground));
text-anchor: middle;
}
/* ── Particle Network ── */
.particle-canvas {
position: absolute;
inset: 0;
pointer-events: none;
}
/* ── Command Palette ── */
.cmdk-overlay {
position: fixed;
inset: 0;
z-index: 100;
background: hsl(0 0% 0% / 0.6);
backdrop-filter: blur(8px);
animation: fade-in 0.15s ease-out;
}
.cmdk-panel {
position: fixed;
top: 20%;
left: 50%;
transform: translateX(-50%);
width: 90%;
max-width: 560px;
z-index: 101;
@apply rounded-2xl border border-border bg-card;
box-shadow: 0 20px 60px -10px hsl(0 0% 0% / 0.5), 0 0 40px -10px hsl(var(--primary) / 0.1);
animation: cmdk-in 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
@keyframes cmdk-in {
from {
opacity: 0;
transform: translateX(-50%) translateY(-12px) scale(0.96);
}
to {
opacity: 1;
transform: translateX(-50%) translateY(0) scale(1);
}
}
.cmdk-item {
@apply flex items-center gap-3 rounded-lg px-3 py-2.5 text-sm transition-all cursor-pointer;
}
.cmdk-item:hover,
.cmdk-item-active {
@apply bg-primary/10 text-primary;
}
/* ── Page Transition ── */
.page-enter {
animation: page-enter 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}
@keyframes page-enter {
from {
opacity: 0;
transform: translateY(12px) scale(0.99);
filter: blur(4px);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
filter: blur(0);
}
}
/* ── Floating Action Button ── */
.fab {
position: fixed;
bottom: 24px;
right: 24px;
z-index: 50;
@apply flex items-center justify-center rounded-full;
width: 56px;
height: 56px;
background: linear-gradient(135deg, hsl(var(--primary)), hsl(var(--accent)));
box-shadow: 0 8px 24px -4px hsl(var(--primary) / 0.4), 0 4px 8px hsl(0 0% 0% / 0.3);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.fab:hover {
transform: scale(1.1) rotate(90deg);
box-shadow: 0 12px 32px -4px hsl(var(--primary) / 0.5), 0 6px 12px hsl(0 0% 0% / 0.4);
}
/* ── Ripple Effect ── */
.ripple-container {
position: relative;
overflow: hidden;
}
.ripple {
position: absolute;
border-radius: 50%;
background: hsl(0 0% 100% / 0.3);
transform: scale(0);
animation: ripple-out 0.6s ease-out;
pointer-events: none;
}
@keyframes ripple-out {
to {
transform: scale(4);
opacity: 0;
}
}
/* ── Glowing Border ── */
.glow-border {
position: relative;
}
.glow-border::before {
content: "";
position: absolute;
inset: -1px;
border-radius: inherit;
padding: 1px;
background: linear-gradient(135deg, hsl(var(--primary) / 0.4), hsl(var(--accent) / 0.4), hsl(var(--spinor-blue) / 0.4));
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
animation: glow-border-rotate 4s linear infinite;
}
@keyframes glow-border-rotate {
0% {
filter: hue-rotate(0deg);
}
100% {
filter: hue-rotate(360deg);
}
}
/* ── Mission Briefing Hero ── */
.mission-hero {
position: relative;
overflow: hidden;
@apply rounded-3xl border border-border;
background:
radial-gradient(ellipse 100% 60% at 50% 0%, hsl(var(--primary) / 0.12), transparent),
radial-gradient(ellipse 80% 50% at 80% 100%, hsl(var(--accent) / 0.08), transparent),
hsl(var(--card));
}
.mission-hero::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg, transparent, hsl(var(--primary)), hsl(var(--accent)), transparent);
animation: shimmer 3s ease-in-out infinite;
}
/* ── Lineage Tree ── */
.lineage-tree {
position: relative;
padding-left: 24px;
}
.lineage-branch {
position: relative;
padding-left: 24px;
padding-bottom: 16px;
}
.lineage-branch::before {
content: "";
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 2px;
background: hsl(var(--border));
}
.lineage-branch::after {
content: "";
position: absolute;
left: 0;
top: 12px;
width: 20px;
height: 2px;
background: hsl(var(--border));
}
.lineage-branch:last-child::before {
height: 12px;
}
.lineage-node {
@apply rounded-lg border border-border bg-card p-3 transition-all;
}
.lineage-node:hover {
border-color: hsl(var(--primary) / 0.3);
box-shadow: 0 0 16px -4px hsl(var(--primary) / 0.2);
}
.lineage-dot {
position: absolute;
left: -6px;
top: 10px;
width: 10px;
height: 10px;
border-radius: 50%;
background: hsl(var(--primary));
box-shadow: 0 0 8px hsl(var(--primary) / 0.5);
}
/* ── Progress Ring ── */
.progress-ring {
transform: rotate(-90deg);
}
.progress-ring-circle {
transition: stroke-dashoffset 1s cubic-bezier(0.4, 0, 0.2, 1);
stroke-linecap: round;
}
/* ── Typing Indicator ── */
.typing-indicator {
display: inline-flex;
align-items: center;
gap: 4px;
}
.typing-indicator span {
width: 8px;
height: 8px;
border-radius: 50%;
background: hsl(var(--accent));
animation: typing-bounce 1.4s ease-in-out infinite;
}
.typing-indicator span:nth-child(2) {
animation-delay: 0.15s;
}
.typing-indicator span:nth-child(3) {
animation-delay: 0.3s;
}
@keyframes typing-bounce {
0%,
80%,
100% {
transform: scale(0.6) translateY(0);
opacity: 0.4;
}
40% {
transform: scale(1) translateY(-4px);
opacity: 1;
}
}
/* ── Number Counter ── */
.counter {
font-variant-numeric: tabular-nums;
transition: all 0.3s ease;
}
/* ── Tag Pulse ── */
@keyframes tag-pulse {
0%,
100% {
box-shadow: 0 0 0 0 hsl(var(--primary) / 0.3);
}
50% {
box-shadow: 0 0 0 6px hsl(var(--primary) / 0);
}
}
.tag-pulse {
animation: tag-pulse 2s ease-in-out infinite;
}
/* ── Slide Panel ── */
.slide-panel {
animation: slide-panel-in 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}
@keyframes slide-panel-in {
from {
opacity: 0;
transform: translateX(100%);
}
to {
opacity: 1;
transform: translateX(0);
}
}
/* ── Confetti Container ── */
.confetti-piece {
position: absolute;
width: 8px;
height: 8px;
animation: confetti-fall 3s ease-out forwards;
}
@keyframes confetti-fall {
0% {
transform: translateY(-100px) rotate(0deg);
opacity: 1;
}
100% {
transform: translateY(400px) rotate(720deg);
opacity: 0;
}
}
/* ── Glass Input ── */
.glass-input {
@apply rounded-xl border border-white/[0.06] bg-white/[0.03] backdrop-blur-xl;
transition: all 0.3s;
}
.glass-input:focus {
border-color: hsl(var(--primary) / 0.3);
box-shadow: 0 0 0 3px hsl(var(--primary) / 0.1);
}
/* ── Scroll Reveal ── */
.scroll-reveal {
opacity: 0;
transform: translateY(20px);
transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
.scroll-reveal.visible {
opacity: 1;
transform: translateY(0);
}
}