@import 'tailwindcss'; @import 'tw-animate-css'; @custom-variant dark (&:is(.dark *)); /* ╔══════════════════════════════════════════════════════════════════════════╗ ║ KŌDŌ DESIGN SYSTEM v3.0 — "The Path of Sound" ║ ║ VEZA × TALAS — Manga × Graffiti × Nature × Gaming × Linux ║ ╚══════════════════════════════════════════════════════════════════════════╝ */ :root { /* ═══════════════════════════════════════════════════════════════════════════ CORE PALETTE — Light Mode ═══════════════════════════════════════════════════════════════════════════ */ --background: oklch(0.985 0 0); --foreground: oklch(0.145 0.005 265); --card: oklch(1 0 0); --card-foreground: oklch(0.145 0.005 265); --popover: oklch(1 0 0); --popover-foreground: oklch(0.145 0.005 265); /* Primary: Neon Cyan — Tech, Flow, Future */ --primary: oklch(0.75 0.18 195); --primary-foreground: oklch(0.13 0.02 265); /* Secondary: Hot Magenta — Street, Passion, Edge */ --secondary: oklch(0.65 0.25 330); --secondary-foreground: oklch(0.98 0 0); --muted: oklch(0.96 0.005 265); --muted-foreground: oklch(0.45 0.015 265); --accent: oklch(0.95 0.01 265); --accent-foreground: oklch(0.20 0.01 265); /* Semantic Colors */ --destructive: oklch(0.60 0.22 25); --destructive-foreground: oklch(0.98 0 0); --success: oklch(0.72 0.19 145); --success-foreground: oklch(0.13 0.02 145); --warning: oklch(0.80 0.16 75); --warning-foreground: oklch(0.20 0.05 75); --info: oklch(0.70 0.15 230); --info-foreground: oklch(0.13 0.02 230); --border: oklch(0.90 0.005 265); --input: oklch(0.90 0.005 265); --ring: oklch(0.75 0.18 195); /* Charts */ --chart-1: oklch(0.75 0.18 195); --chart-2: oklch(0.65 0.25 330); --chart-3: oklch(0.72 0.19 145); --chart-4: oklch(0.70 0.20 290); --chart-5: oklch(0.80 0.16 75); --radius: 0.5rem; /* Sidebar */ --sidebar: oklch(0.98 0.003 265); --sidebar-foreground: oklch(0.145 0.005 265); --sidebar-primary: oklch(0.75 0.18 195); --sidebar-primary-foreground: oklch(0.13 0.02 265); --sidebar-accent: oklch(0.94 0.01 265); --sidebar-accent-foreground: oklch(0.20 0.01 265); --sidebar-border: oklch(0.90 0.005 265); --sidebar-ring: oklch(0.75 0.18 195); /* Layout primitives — standard widths/heights for app shell and pages */ --layout-content-max-width: 100rem; /* 1600px — main content max width */ --layout-main-min-height: calc(100vh - 4rem); /* below 64px header */ --layout-page-min-height: 37.5rem; /* 600px — full-page min height */ --layout-page-min-height-sm: 25rem; /* 400px — compact page / empty state */ --layout-story-decorator-min-height: 12rem; /* 192px — story wrapper (min-h-48) */ /* ═══════════════════════════════════════════════════════════════════════════ KŌDŌ EXTENDED PALETTE — "Spectre Urbain" ═══════════════════════════════════════════════════════════════════════════ */ /* Void Scale */ --void-0: oklch(0.985 0 0); --void-50: oklch(0.97 0.003 265); --void-100: oklch(0.94 0.005 265); --void-200: oklch(0.88 0.008 265); --void-300: oklch(0.78 0.01 265); --void-400: oklch(0.62 0.015 265); --void-500: oklch(0.50 0.02 265); --void-600: oklch(0.40 0.025 265); --void-700: oklch(0.30 0.02 265); --void-800: oklch(0.22 0.015 265); --void-900: oklch(0.15 0.01 265); --void-950: oklch(0.10 0.005 265); /* Neon Cyan Scale */ --cyan-50: oklch(0.97 0.04 195); --cyan-100: oklch(0.93 0.08 195); --cyan-200: oklch(0.88 0.12 195); --cyan-300: oklch(0.82 0.15 195); --cyan-400: oklch(0.78 0.17 195); --cyan-500: oklch(0.75 0.18 195); --cyan-600: oklch(0.65 0.16 195); --cyan-700: oklch(0.55 0.14 195); --cyan-800: oklch(0.45 0.12 195); --cyan-900: oklch(0.35 0.10 195); /* Hot Magenta Scale */ --magenta-50: oklch(0.97 0.05 330); --magenta-100: oklch(0.93 0.10 330); --magenta-200: oklch(0.85 0.16 330); --magenta-300: oklch(0.78 0.20 330); --magenta-400: oklch(0.70 0.23 330); --magenta-500: oklch(0.65 0.25 330); --magenta-600: oklch(0.55 0.22 330); --magenta-700: oklch(0.45 0.18 330); --magenta-800: oklch(0.35 0.14 330); --magenta-900: oklch(0.28 0.10 330); /* Acid Lime Scale */ --lime-50: oklch(0.97 0.05 145); --lime-100: oklch(0.94 0.10 145); --lime-200: oklch(0.88 0.14 145); --lime-300: oklch(0.82 0.17 145); --lime-400: oklch(0.77 0.18 145); --lime-500: oklch(0.72 0.19 145); --lime-600: oklch(0.62 0.17 145); --lime-700: oklch(0.52 0.14 145); --lime-800: oklch(0.42 0.11 145); --lime-900: oklch(0.32 0.08 145); /* Gaming Colors */ --xp-gold: oklch(0.85 0.16 85); --hp-red: oklch(0.60 0.22 25); --mp-blue: oklch(0.60 0.18 250); --shield-purple: oklch(0.55 0.22 300); /* Nature Tones */ --moss: oklch(0.45 0.10 145); --moss-light: oklch(0.55 0.12 145); --bark: oklch(0.35 0.05 55); --leaf: oklch(0.62 0.15 140); /* Manga Spectrum */ --sakura: oklch(0.85 0.10 350); --yurei: oklch(0.60 0.15 290); --shonen: oklch(0.60 0.20 30); /* Terminal */ --terminal-green: oklch(0.75 0.20 145); --terminal-amber: oklch(0.80 0.15 80); --matrix: oklch(0.15 0.05 145); /* Gradients */ --gradient-neon: linear-gradient(135deg, var(--cyan-500), var(--magenta-500), var(--lime-500)); --gradient-cyber: linear-gradient(135deg, var(--cyan-400), var(--magenta-500)); --gradient-sunset: linear-gradient(135deg, oklch(0.65 0.20 35), var(--magenta-500)); --gradient-forest: linear-gradient(135deg, var(--moss), var(--leaf), var(--lime-500)); --gradient-manga: linear-gradient(135deg, var(--sakura), var(--yurei)); --gradient-terminal: linear-gradient(180deg, var(--matrix), var(--void-950)); --gradient-gaming: linear-gradient(135deg, var(--shonen), var(--xp-gold)); /* Glows */ --glow-cyan: 0 0 20px oklch(0.75 0.18 195 / 0.4); --glow-magenta: 0 0 20px oklch(0.65 0.25 330 / 0.4); --glow-lime: 0 0 20px oklch(0.72 0.19 145 / 0.4); --glow-gold: 0 0 20px oklch(0.85 0.16 85 / 0.4); --glow-terminal: 0 0 10px oklch(0.75 0.20 145 / 0.3); /* Glass */ --glass-bg: oklch(1 0 0 / 0.8); --glass-border: oklch(0 0 0 / 0.05); --glass-blur: 16px; /* Animation Easings */ --ease-out: cubic-bezier(0.33, 1, 0.68, 1); --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1); --ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1); --ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275); --duration-instant: 100ms; --duration-fast: 150ms; --duration-normal: 250ms; /* Immersive UI: micro-interactions (hover, focus) */ --duration-immersive: 200ms; --duration-slow: 400ms; --duration-slower: 600ms; /* Clip Paths — Manga Style */ --clip-manga: polygon(0 0, calc(100% - 12px) 0, 100% 12px, 100% 100%, 12px 100%, 0 calc(100% - 12px)); --clip-manga-lg: polygon(0 0, calc(100% - 20px) 0, 100% 20px, 100% 100%, 20px 100%, 0 calc(100% - 20px)); --clip-hex: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%); --clip-badge: polygon(0 10%, 10% 0, 90% 0, 100% 10%, 100% 90%, 90% 100%, 10% 100%, 0 90%); --clip-slant: polygon(0 0, 100% 0, 100% calc(100% - 8px), 0 100%); } /* ═══════════════════════════════════════════════════════════════════════════ DARK MODE — The Void ═══════════════════════════════════════════════════════════════════════════ */ .dark { /* Spotify-like: #121212 / #181818 / #282828 feel — no pure black */ --background: oklch(0.11 0.008 265); --foreground: oklch(0.98 0 0); /* Cards/surfaces: one step up, hover one more */ --card: oklch(0.14 0.01 265); --card-foreground: oklch(0.98 0 0); --popover: oklch(0.14 0.01 265); --popover-foreground: oklch(0.98 0 0); /* Primary: teal accent (Spotify-style pop) */ --primary: oklch(0.72 0.19 195); --primary-foreground: oklch(0.08 0.02 265); --secondary: oklch(0.65 0.25 330); --secondary-foreground: oklch(0.98 0 0); --muted: oklch(0.20 0.01 265); --muted-foreground: oklch(0.65 0.01 265); /* Hover/elevated surfaces (Spotify #282828) */ --accent: oklch(0.18 0.012 265); --accent-foreground: oklch(0.98 0 0); --destructive: oklch(0.65 0.25 25); --destructive-foreground: oklch(0.98 0 0); /* Borders - Increased visibility for depth (audit: border-white/10 feel) */ --border: oklch(1 0 0 / 0.14); --input: oklch(1 0 0 / 0.14); --ring: oklch(0.75 0.18 195); /* Sidebar: darker strip (Spotify left rail) */ --sidebar: oklch(0.08 0.008 265); --sidebar-foreground: oklch(0.98 0 0); --sidebar-primary: oklch(0.72 0.19 195); --sidebar-primary-foreground: oklch(0.08 0.02 265); --sidebar-accent: oklch(1 0 0 / 0.05); --sidebar-accent-foreground: oklch(0.98 0 0); --sidebar-border: oklch(1 0 0 / 0.05); --sidebar-ring: oklch(0.72 0.19 195); /* Charts */ --chart-1: oklch(0.75 0.18 195); --chart-2: oklch(0.65 0.25 330); --chart-3: oklch(0.72 0.19 145); --chart-4: oklch(0.70 0.20 290); --chart-5: oklch(0.80 0.16 75); /* Update Void Scale for lighter theme (shifted up) */ --void-0: oklch(0.15 0.02 265); --void-50: oklch(0.18 0.02 265); --void-100: oklch(0.22 0.02 265); /* ...rest can stay relative or be unused */ --void-950: oklch(0.98 0 0); /* Glows - Adjusted for lighter contrast */ --glow-cyan: 0 0 25px oklch(0.75 0.18 195 / 0.25); --glow-magenta: 0 0 25px oklch(0.65 0.25 330 / 0.25); --glow-lime: 0 0 25px oklch(0.72 0.19 145 / 0.25); --glow-gold: 0 0 25px oklch(0.85 0.16 85 / 0.25); --glow-terminal: 0 0 15px oklch(0.78 0.20 145 / 0.2); /* Glass - Lighter background opacity */ --glass-bg: oklch(0.18 0.02 265 / 0.6); --glass-border: oklch(1 0 0 / 0.1); --glass-blur: 24px; } @theme inline { /* Typography — KŌDŌ Font Stack (audit P3: explicit fallback if Rajdhani glyphs fail) */ --font-sans: 'Rajdhani', 'Inter', 'Noto Sans JP', system-ui, sans-serif; --font-mono: 'JetBrains Mono', 'Consolas', monospace; --font-display: 'Orbitron', 'Bebas Neue', sans-serif; --font-jp: 'Noto Sans JP', sans-serif; /* Core Design Tokens */ --color-background: var(--background); --color-foreground: var(--foreground); --color-card: var(--card); --color-card-foreground: var(--card-foreground); --color-popover: var(--popover); --color-popover-foreground: var(--popover-foreground); --color-primary: var(--primary); --color-primary-foreground: var(--primary-foreground); --color-secondary: var(--secondary); --color-secondary-foreground: var(--secondary-foreground); --color-muted: var(--muted); --color-muted-foreground: var(--muted-foreground); --color-accent: var(--accent); --color-accent-foreground: var(--accent-foreground); --color-destructive: var(--destructive); --color-destructive-foreground: var(--destructive-foreground); --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); /* Extended Semantic Colors */ --color-success: var(--success); --color-success-foreground: var(--success-foreground); --color-warning: var(--warning); --color-warning-foreground: var(--warning-foreground); --color-info: var(--info); --color-info-foreground: var(--info-foreground); /* Neon Colors */ --color-cyan: var(--cyan-500); --color-magenta: var(--magenta-500); --color-lime: var(--lime-500); --color-gold: var(--xp-gold); /* Chart Colors */ --color-chart-1: var(--chart-1); --color-chart-2: var(--chart-2); --color-chart-3: var(--chart-3); --color-chart-4: var(--chart-4); --color-chart-5: var(--chart-5); /* Radius — Squircle: xl for surfaces, full for interactive */ --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); --radius-full: 9999px; /* Sidebar */ --color-sidebar: var(--sidebar); --color-sidebar-foreground: var(--sidebar-foreground); --color-sidebar-primary: var(--sidebar-primary); --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); --color-sidebar-accent: var(--sidebar-accent); --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); --color-sidebar-border: var(--sidebar-border); --color-sidebar-ring: var(--sidebar-ring); } /* ═══════════════════════════════════════════════════════════════════════════ BASE STYLES ═══════════════════════════════════════════════════════════════════════════ */ @layer base { * { @apply border-border outline-ring/50; } html { scroll-behavior: smooth; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } body { @apply bg-background text-foreground; font-feature-settings: "cv02", "cv03", "cv04", "cv11"; } /* Noise texture overlay */ body::before { content: ''; position: fixed; inset: 0; background: url("data:image/svg+xml,%3Csvg viewBox='0 0 400 400' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E"); opacity: 0.015; pointer-events: none; z-index: 9998; } ::selection { background: var(--primary); color: var(--primary-foreground); } /* Custom Scrollbar */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: var(--void-100); } ::-webkit-scrollbar-thumb { background: linear-gradient(180deg, var(--cyan-500), var(--magenta-500)); border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: var(--cyan-400); } /* Typography */ h1, h2, h3, h4, h5, h6 { @apply font-sans font-semibold tracking-tight text-foreground; text-wrap: balance; } h1 { @apply text-4xl md:text-5xl; } h2 { @apply text-3xl md:text-4xl; } h3 { @apply text-2xl md:text-3xl; } h4 { @apply text-xl md:text-2xl; } h5 { @apply text-lg md:text-xl; } h6 { @apply text-base md:text-lg; } p { @apply text-muted-foreground leading-relaxed; text-wrap: pretty; } a:not([class]) { @apply text-primary transition-colors; } a:not([class]):hover { @apply text-primary/80; } code { @apply font-mono text-sm bg-muted px-1.5 py-0.5 rounded; } pre { @apply font-mono text-sm bg-muted p-4 rounded-lg overflow-x-auto; } } /* ═══════════════════════════════════════════════════════════════════════════ KŌDŌ UTILITY CLASSES ═══════════════════════════════════════════════════════════════════════════ */ @layer utilities { /* Layout primitives — use instead of arbitrary values for app shell and pages */ .max-w-layout-content { max-width: var(--layout-content-max-width); } .min-h-layout-main { min-height: var(--layout-main-min-height); } .min-h-layout-page { min-height: var(--layout-page-min-height); } .min-h-layout-page-sm { min-height: var(--layout-page-min-height-sm); } .min-h-layout-story { min-height: var(--layout-story-decorator-min-height); } /* Neon Glows */ .glow-cyan { box-shadow: var(--glow-cyan); } .glow-magenta { box-shadow: var(--glow-magenta); } .glow-lime { box-shadow: var(--glow-lime); } .glow-gold { box-shadow: var(--glow-gold); } .glow-terminal { box-shadow: var(--glow-terminal); } /* Text Gradients */ .text-gradient-neon { @apply bg-clip-text text-transparent; background-image: var(--gradient-neon); } .text-gradient-cyber { @apply bg-clip-text text-transparent; background-image: var(--gradient-cyber); } .text-gradient-sunset { @apply bg-clip-text text-transparent; background-image: var(--gradient-sunset); } .text-gradient-forest { @apply bg-clip-text text-transparent; background-image: var(--gradient-forest); } .text-gradient-manga { @apply bg-clip-text text-transparent; background-image: var(--gradient-manga); } /* Glass Effect */ .glass { background: var(--glass-bg); backdrop-filter: blur(var(--glass-blur)); border: 1px solid var(--glass-border); } /* Noise Texture */ .noise { position: relative; } .noise::before { content: ""; position: absolute; inset: 0; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.7' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E"); pointer-events: none; opacity: 0.5; mix-blend-mode: overlay; border-radius: inherit; } /* Scanlines */ .scanlines::after { content: ''; position: absolute; inset: 0; background: repeating-linear-gradient(0deg, transparent, transparent 2px, oklch(0 0 0 / 0.03) 2px, oklch(0 0 0 / 0.03) 4px); pointer-events: none; border-radius: inherit; } /* Manga Clip Paths */ .clip-manga { clip-path: var(--clip-manga); } .clip-manga-lg { clip-path: var(--clip-manga-lg); } .clip-hex { clip-path: var(--clip-hex); } .clip-badge { clip-path: var(--clip-badge); } .clip-slant { clip-path: var(--clip-slant); } /* Font Utilities */ .font-display { font-family: var(--font-display); } .font-jp { font-family: var(--font-jp); } /* Animation Utilities */ .animate-glow-pulse { animation: glow-pulse 2s ease-in-out infinite; } .animate-float { animation: float 6s ease-in-out infinite; } .animate-slide-up { animation: slide-up 0.5s var(--ease-out); } .animate-fade-in { animation: fade-in 0.4s var(--ease-out); } .animate-spin-slow { animation: spin-slow 10s linear infinite; } .animate-achievement { animation: achievement-slide 0.5s var(--ease-spring); } .animate-eq { animation: eq-bounce 0.5s ease-in-out infinite; } /* Hover Effects */ .hover-lift { @apply transition-transform duration-200; } .hover-lift:hover { @apply -translate-y-1; } .hover-glow-cyan { @apply transition-shadow duration-200; } .hover-glow-cyan:hover { box-shadow: var(--glow-cyan); } .hover-glow-magenta { @apply transition-shadow duration-200; } .hover-glow-magenta:hover { box-shadow: var(--glow-magenta); } .hover-glow-lime { @apply transition-shadow duration-200; } .hover-glow-lime:hover { box-shadow: var(--glow-lime); } .hover-glow-gold { @apply transition-shadow duration-200; } .hover-glow-gold:hover { box-shadow: var(--glow-gold); } /* Gaming specific */ .text-xp { color: var(--xp-gold); } .text-hp { color: var(--hp-red); } .text-mp { color: var(--mp-blue); } .text-terminal { color: var(--terminal-green); text-shadow: var(--glow-terminal); } .bg-terminal { background: var(--gradient-terminal); } .bg-gaming { background: var(--gradient-gaming); } .bg-manga { background: var(--gradient-manga); } .bg-forest { background: var(--gradient-forest); } /* Border neon */ .border-neon-cyan { border-color: var(--cyan-500); } .border-neon-magenta { border-color: var(--magenta-500); } .border-neon-lime { border-color: var(--lime-500); } .border-neon-gold { border-color: var(--xp-gold); } } /* ═══════════════════════════════════════════════════════════════════════════ KEYFRAME ANIMATIONS ═══════════════════════════════════════════════════════════════════════════ */ @keyframes glow-pulse { 0%, 100% { opacity: 1; filter: brightness(1); } 50% { opacity: 0.85; filter: brightness(1.15); } } @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } } @keyframes slide-up { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } @keyframes fade-in { from { opacity: 0; } to { opacity: 1; } } @keyframes shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } @keyframes spin-slow { to { transform: rotate(360deg); } } @keyframes pulse-ring { 0% { transform: scale(0.8); opacity: 1; } 100% { transform: scale(1.5); opacity: 0; } } @keyframes eq-bounce { 0%, 100% { transform: scaleY(1); } 50% { transform: scaleY(0.3); } } @keyframes typing { 0%, 60%, 100% { transform: translateY(0); } 30% { transform: translateY(-4px); } } @keyframes achievement-slide { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } @keyframes graffiti-shake { 0%, 100% { transform: rotate(0deg); } 25% { transform: rotate(-2deg); } 75% { transform: rotate(2deg); } } @keyframes terminal-blink { 0%, 50% { opacity: 1; } 51%, 100% { opacity: 0; } } @keyframes neon-flicker { 0%, 19%, 21%, 23%, 25%, 54%, 56%, 100% { opacity: 1; text-shadow: var(--glow-cyan); } 20%, 24%, 55% { opacity: 0.8; text-shadow: none; } } @keyframes bar-fill { from { width: 0; } } @keyframes level-up { 0% { transform: scale(1); } 50% { transform: scale(1.2); filter: brightness(1.5); } 100% { transform: scale(1); } }