/
alexefan136
/
flowstack
Обзор
Документация
Войти
/
alexefan136
/
flowstack
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
ui/src/index.css
2 069 строк
60 KB
Alexander Efanov
upd fix
29 июл 2026, 23:26
29 июл 2026, 23:26
d8ac8ee
Код
Авторство
О чём код?
@import "tailwindcss"; /* ===================================================================== THEME: Soft Monochrome + Muted Lime Однотонная палитра с тёплыми серыми и приглушённым lime акцентом Поддержка Dark (default) + Light темы ===================================================================== */ @theme { /* Neutral palette — warm layered grays */ --color-bg-base: #1a1a1c; --color-bg-primary: #1e1e20; --color-bg-card: #242426; --color-bg-elevated: #2a2a2d; --color-bg-hover: #323235; --color-bg-active: #3a3a3e; --color-bg-sunken: #141416; --color-bg-overlay: rgba(10, 10, 12, 0.72); /* Muted accent palette */ --color-accent-lime: #A8E063; --color-accent-lime-dim: #8bc34a; --color-accent-lime-soft: rgba(168, 224, 99, 0.10); --color-accent-lime-glow: rgba(168, 224, 99, 0.22); --color-accent-cyan: #7dd3d8; --color-accent-amber: #e8c879; --color-accent-rose: #e89a9a; /* Semantic aliases */ --color-accent-violet: #A8E063; --color-accent-pink: #e89a9a; --color-accent-emerald: #86c9a0; /* Text */ --color-text-primary: #eeeee8; --color-text-secondary: #a8a8a0; --color-text-muted: #76766e; --color-text-faint: #50504a; --color-text-accent: #c4e88a; --color-text-on-accent: #1a1a1c; /* Borders */ --color-border-subtle: rgba(255, 255, 255, 0.04); --color-border-default: rgba(255, 255, 255, 0.07); --color-border-strong: rgba(255, 255, 255, 0.12); --color-border-accent: rgba(168, 224, 99, 0.28); /* ✅ Accent borders */ --color-border-cyan: rgba(125, 211, 216, 0.28); --color-border-amber: rgba(232, 200, 121, 0.28); --color-border-rose: rgba(232, 154, 154, 0.28); /* Status */ --color-status-success: #86c9a0; --color-status-success-soft: rgba(134, 201, 160, 0.10); --color-status-warning: #e8c879; --color-status-warning-soft: rgba(232, 200, 121, 0.10); --color-status-error: #e89a9a; --color-status-error-soft: rgba(232, 154, 154, 0.10); --color-status-info: #7dd3d8; --color-status-info-soft: rgba(125, 211, 216, 0.10); /* Typography */ --font-sans: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; --font-mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace; /* Radii */ --radius-xs: 6px; --radius-sm: 10px; --radius-md: 14px; --radius-lg: 18px; --radius-xl: 24px; --radius-2xl: 32px; --radius-full: 9999px; /* Shadows */ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.18); --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.22), 0 1px 2px rgba(0, 0, 0, 0.12); --shadow-md: 0 8px 24px rgba(0, 0, 0, 0.28), 0 2px 6px rgba(0, 0, 0, 0.16); --shadow-lg: 0 16px 48px rgba(0, 0, 0, 0.35), 0 4px 12px rgba(0, 0, 0, 0.2); --shadow-xl: 0 28px 64px rgba(0, 0, 0, 0.45), 0 8px 20px rgba(0, 0, 0, 0.25); --shadow-2xl: 0 36px 80px rgba(0, 0, 0, 0.55), 0 12px 28px rgba(0, 0, 0, 0.3); --shadow-soft: 0 4px 20px rgba(0, 0, 0, 0.18); /* Accent shadows */ --shadow-lime: 0 4px 32px rgba(168, 224, 99, 0.18); --shadow-lime-lg: 0 8px 48px rgba(168, 224, 99, 0.25); --shadow-cyan: 0 4px 32px rgba(125, 211, 216, 0.18); --shadow-amber: 0 4px 32px rgba(232, 200, 121, 0.18); --shadow-rose: 0 4px 32px rgba(232, 154, 154, 0.18); /* Glass tokens */ --glass-bg-subtle: rgba(255, 255, 255, 0.02); --glass-bg-default: rgba(255, 255, 255, 0.04); --glass-bg-strong: rgba(255, 255, 255, 0.07); --glass-bg-frosted: rgba(30, 30, 32, 0.65); --glass-bg-lime: rgba(168, 224, 99, 0.06); /* ✅ Accent glass backgrounds */ --glass-bg-cyan: rgba(125, 211, 216, 0.06); --glass-bg-amber: rgba(232, 200, 121, 0.06); --glass-bg-rose: rgba(232, 154, 154, 0.06); --glass-border: rgba(255, 255, 255, 0.06); --glass-border-strong: rgba(255, 255, 255, 0.10); --glass-highlight-top: rgba(255, 255, 255, 0.08); --glass-highlight-bottom: rgba(0, 0, 0, 0.18); --glass-blur-xs: 4px; --glass-blur-sm: 8px; --glass-blur: 14px; --glass-blur-strong: 24px; --glass-blur-frosted: 32px; /* Gradients */ --gradient-primary: linear-gradient(135deg, #A8E063 0%, #7db847 100%); --gradient-accent: linear-gradient(135deg, #A8E063 0%, #7dd3d8 100%); --gradient-dark: linear-gradient(180deg, #242426 0%, #1e1e20 100%); --gradient-glow: radial-gradient(ellipse at center, rgba(168, 224, 99, 0.14) 0%, transparent 70%); --gradient-glass: linear-gradient(135deg, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.01) 100%); /* ✅ Accent gradients */ --gradient-cyan: linear-gradient(135deg, #7dd3d8 0%, #5ba8ad 100%); --gradient-amber: linear-gradient(135deg, #e8c879 0%, #c9a85a 100%); --gradient-rose: linear-gradient(135deg, #e89a9a 0%, #c77070 100%); /* Timing */ --ease-out: cubic-bezier(0.22, 1, 0.36, 1); --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); --ease-spring: cubic-bezier(0.34, 1.4, 0.64, 1); --ease-smooth: cubic-bezier(0.25, 0.8, 0.25, 1); --ease-notification: cubic-bezier(0.3, 0, 0.7, 1); --duration-fast: 180ms; --duration-normal: 280ms; --duration-slow: 420ms; --duration-slower: 640ms; } /* ===================================================================== 🌗 LIGHT THEME — переопределение токенов Применяется через .theme-light / html.light / [data-theme="light"] ===================================================================== */ .theme-light, html.light, [data-theme="light"] { color-scheme: light; /* Neutral — warm light grays */ --color-bg-base: #ececea; --color-bg-primary: #f6f6f4; --color-bg-card: #ffffff; --color-bg-elevated: #ffffff; --color-bg-hover: #efefec; --color-bg-active: #e6e6e2; --color-bg-sunken: #eaeae7; --color-bg-overlay: rgba(245, 245, 242, 0.72); /* Accent — темнее для контраста на светлом */ --color-accent-lime: #6a9f3a; --color-accent-lime-dim: #7db847; --color-accent-lime-soft: rgba(125, 184, 71, 0.12); --color-accent-lime-glow: rgba(125, 184, 71, 0.20); --color-accent-cyan: #3d9aa0; --color-accent-amber: #c9a24d; --color-accent-rose: #d17676; --color-accent-violet: #6a9f3a; --color-accent-pink: #d17676; --color-accent-emerald: #4f9f73; /* Text — тёмный на светлом */ --color-text-primary: #232320; --color-text-secondary: #55554f; --color-text-muted: #84847c; --color-text-faint: #a8a8a0; --color-text-accent: #5a8f30; --color-text-on-accent: #ffffff; /* Borders */ --color-border-subtle: rgba(0, 0, 0, 0.05); --color-border-default: rgba(0, 0, 0, 0.08); --color-border-strong: rgba(0, 0, 0, 0.14); --color-border-accent: rgba(106, 159, 58, 0.32); --color-border-cyan: rgba(61, 154, 160, 0.32); --color-border-amber: rgba(201, 162, 77, 0.32); --color-border-rose: rgba(209, 118, 118, 0.32); /* Status */ --color-status-success: #4f9f73; --color-status-success-soft: rgba(79, 159, 115, 0.12); --color-status-warning: #c9a24d; --color-status-warning-soft: rgba(201, 162, 77, 0.12); --color-status-error: #d17676; --color-status-error-soft: rgba(209, 118, 118, 0.12); --color-status-info: #3d9aa0; --color-status-info-soft: rgba(61, 154, 160, 0.12); /* Shadows — мягче для светлого */ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05); --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.07), 0 1px 2px rgba(0, 0, 0, 0.04); --shadow-md: 0 8px 24px rgba(0, 0, 0, 0.09), 0 2px 6px rgba(0, 0, 0, 0.05); --shadow-lg: 0 16px 48px rgba(0, 0, 0, 0.11), 0 4px 12px rgba(0, 0, 0, 0.06); --shadow-xl: 0 28px 64px rgba(0, 0, 0, 0.13), 0 8px 20px rgba(0, 0, 0, 0.07); --shadow-2xl: 0 36px 80px rgba(0, 0, 0, 0.16), 0 12px 28px rgba(0, 0, 0, 0.08); --shadow-soft: 0 4px 20px rgba(0, 0, 0, 0.06); --shadow-lime: 0 4px 32px rgba(106, 159, 58, 0.20); --shadow-lime-lg: 0 8px 48px rgba(106, 159, 58, 0.28); --shadow-cyan: 0 4px 32px rgba(61, 154, 160, 0.20); --shadow-amber: 0 4px 32px rgba(201, 162, 77, 0.20); --shadow-rose: 0 4px 32px rgba(209, 118, 118, 0.20); /* Glass — инвертированный (тёмный на светлом) */ --glass-bg-subtle: rgba(0, 0, 0, 0.02); --glass-bg-default: rgba(0, 0, 0, 0.03); --glass-bg-strong: rgba(0, 0, 0, 0.05); --glass-bg-frosted: rgba(255, 255, 255, 0.78); --glass-bg-lime: rgba(125, 184, 71, 0.08); --glass-bg-cyan: rgba(61, 154, 160, 0.08); --glass-bg-amber: rgba(201, 162, 77, 0.08); --glass-bg-rose: rgba(209, 118, 118, 0.08); --glass-border: rgba(0, 0, 0, 0.07); --glass-border-strong: rgba(0, 0, 0, 0.12); --glass-highlight-top: rgba(255, 255, 255, 0.65); --glass-highlight-bottom: rgba(0, 0, 0, 0.04); /* Gradients */ --gradient-primary: linear-gradient(135deg, #8bc34a 0%, #6a9f3a 100%); --gradient-accent: linear-gradient(135deg, #8bc34a 0%, #3d9aa0 100%); --gradient-dark: linear-gradient(180deg, #ffffff 0%, #f6f6f4 100%); --gradient-glow: radial-gradient(ellipse at center, rgba(125, 184, 71, 0.16) 0%, transparent 70%); --gradient-glass: linear-gradient(135deg, rgba(255, 255, 255, 0.5) 0%, rgba(255, 255, 255, 0.1) 100%); --gradient-cyan: linear-gradient(135deg, #5bbfc5 0%, #3d9aa0 100%); --gradient-amber: linear-gradient(135deg, #e0c06f 0%, #c9a24d 100%); --gradient-rose: linear-gradient(135deg, #e09595 0%, #d17676 100%); } /* Light theme — scrollbar */ .theme-light ::-webkit-scrollbar-thumb, html.light ::-webkit-scrollbar-thumb, [data-theme="light"] ::-webkit-scrollbar-thumb { background: rgba(0, 0, 0, 0.14); } .theme-light ::-webkit-scrollbar-thumb:hover, html.light ::-webkit-scrollbar-thumb:hover, [data-theme="light"] ::-webkit-scrollbar-thumb:hover { background: rgba(106, 159, 58, 0.32); } .theme-light *, html.light *, [data-theme="light"] * { scrollbar-color: rgba(0, 0, 0, 0.14) transparent; } /* Light theme — selection */ .theme-light ::selection, html.light ::selection, [data-theme="light"] ::selection { background: rgba(125, 184, 71, 0.25); color: #1a1a1c; } /* ===================================================================== RESET / BASE ===================================================================== */ *, *::before, *::after { box-sizing: border-box; } html { color-scheme: dark; -webkit-text-size-adjust: 100%; text-size-adjust: 100%; scroll-behavior: smooth; font-size: clamp(15px, 0.5rem + 0.3vw, 17px); } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } } body { margin: 0; background: var(--color-bg-primary); color: var(--color-text-primary); font-family: var(--font-sans); font-feature-settings: "cv02", "cv03", "cv04", "cv11", "ss01"; line-height: 1.55; letter-spacing: -0.005em; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-rendering: optimizeLegibility; font-variant-ligatures: common-ligatures; min-height: 100vh; min-height: 100dvh; overflow-x: hidden; transition: background var(--duration-slow) var(--ease-smooth), color var(--duration-slow) var(--ease-smooth); } h1, h2, h3, h4, h5, h6, p { margin: 0; } a { color: inherit; text-decoration: none; transition: color var(--duration-normal) var(--ease-smooth); } a:hover { color: var(--color-text-accent); } img, svg, video { display: block; max-width: 100%; height: auto; } button { font-family: inherit; cursor: pointer; border: none; background: none; color: inherit; } input, textarea, select { font-family: inherit; font-size: inherit; color: inherit; } /* ===================================================================== FLUID TYPOGRAPHY ===================================================================== */ .text-display { font-size: clamp(2.25rem, 1.5rem + 3.5vw, 4rem); line-height: 1.08; letter-spacing: -0.035em; font-weight: 600; } .text-h1 { font-size: clamp(1.875rem, 1.3rem + 2.2vw, 2.75rem); line-height: 1.15; letter-spacing: -0.03em; font-weight: 600; } .text-h2 { font-size: clamp(1.5rem, 1.15rem + 1.4vw, 2rem); line-height: 1.25; letter-spacing: -0.025em; font-weight: 600; } .text-h3 { font-size: clamp(1.25rem, 1.05rem + 0.7vw, 1.5rem); line-height: 1.35; letter-spacing: -0.02em; font-weight: 600; } .text-h4 { font-size: clamp(1.0625rem, 0.98rem + 0.3vw, 1.25rem); line-height: 1.4; letter-spacing: -0.015em; font-weight: 500; } .text-body { font-size: clamp(0.9375rem, 0.88rem + 0.2vw, 1.0625rem); line-height: 1.65; letter-spacing: -0.005em; } .text-sm { font-size: clamp(0.8125rem, 0.78rem + 0.12vw, 0.9375rem); line-height: 1.55; letter-spacing: -0.003em; } .text-xs { font-size: 0.8125rem; line-height: 1.5; letter-spacing: 0.005em; } .text-2xs { font-size: 0.75rem; line-height: 1.4; letter-spacing: 0.04em; text-transform: uppercase; font-weight: 500; } .text-mono { font-family: var(--font-mono); font-feature-settings: "ss01", "cv01"; font-variant-ligatures: none; } .text-balance { text-wrap: balance; } .text-pretty { text-wrap: pretty; } /* ===================================================================== FOCUS & ACCESSIBILITY ===================================================================== */ :focus-visible { outline: 2px solid var(--color-accent-lime); outline-offset: 3px; border-radius: 4px; transition: outline-offset var(--duration-fast) var(--ease-out); } button:focus:not(:focus-visible), a:focus:not(:focus-visible), input:focus:not(:focus-visible), textarea:focus:not(:focus-visible), select:focus:not(:focus-visible), [role="button"]:focus:not(:focus-visible) { outline: none; } input:focus-visible, textarea:focus-visible, select:focus-visible { outline: none; box-shadow: 0 0 0 1px var(--color-accent-lime), 0 0 0 5px var(--color-accent-lime-soft); } .skip-link { position: absolute; top: -100px; left: 50%; transform: translateX(-50%); padding: 0.75rem 1.25rem; background: var(--color-accent-lime); color: var(--color-text-on-accent); font-weight: 600; border-radius: var(--radius-md); z-index: 10000; transition: top var(--duration-normal) var(--ease-out); } .skip-link:focus { top: 16px; outline: none; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } /* ===================================================================== SCROLLBAR ===================================================================== */ ::-webkit-scrollbar { width: 10px; height: 10px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.06); border-radius: 5px; border: 2px solid transparent; background-clip: padding-box; transition: background var(--duration-normal) var(--ease-smooth); } ::-webkit-scrollbar-thumb:hover { background: rgba(168, 224, 99, 0.22); background-clip: padding-box; border: 2px solid transparent; } ::-webkit-scrollbar-corner { background: transparent; } * { scrollbar-width: thin; scrollbar-color: rgba(255, 255, 255, 0.06) transparent; } @media (hover: hover) { *:hover { scrollbar-color: rgba(168, 224, 99, 0.18) transparent; } } /* ===================================================================== SELECTION ===================================================================== */ ::selection { background: rgba(168, 224, 99, 0.22); color: #ffffff; } ::-moz-selection { background: rgba(168, 224, 99, 0.22); color: #ffffff; } /* ===================================================================== ANIMATIONS ===================================================================== */ @media (prefers-reduced-motion: no-preference) { .fadein { animation: fadein var(--duration-slow) var(--ease-out) both; } .slide-up { animation: slideUp var(--duration-slower) var(--ease-out) both; } .slide-down { animation: slideDown var(--duration-slow) var(--ease-out) both; } .slide-in-left { animation: slideInLeft var(--duration-slow) var(--ease-out) both; } .slide-in-right { animation: slideInRight var(--duration-slow) var(--ease-out) both; } .scale-in { animation: scaleIn var(--duration-normal) var(--ease-spring) both; } .shimmer { animation: shimmer 2.4s infinite linear; } .pulse-dot { animation: pulse 2.4s var(--ease-in-out) infinite; } .typing-dot { animation: typing 1.6s infinite; } .glow-effect { animation: glow 3.5s ease-in-out infinite; } .spin-slow { animation: spin 2.2s linear infinite; } .spin-fast { animation: spin 0.9s linear infinite; } .bounce-in { animation: bounceIn var(--duration-slower) var(--ease-spring) both; } .float { animation: float 6s ease-in-out infinite; } /* Staggered animations */ .stagger > * { animation: fadein var(--duration-slow) var(--ease-out) both; } .stagger > *:nth-child(1) { animation-delay: 0ms; } .stagger > *:nth-child(2) { animation-delay: 60ms; } .stagger > *:nth-child(3) { animation-delay: 120ms; } .stagger > *:nth-child(4) { animation-delay: 180ms; } .stagger > *:nth-child(5) { animation-delay: 240ms; } .stagger > *:nth-child(6) { animation-delay: 300ms; } .stagger > *:nth-child(7) { animation-delay: 360ms; } .stagger > *:nth-child(8) { animation-delay: 420ms; } .stagger > *:nth-child(9) { animation-delay: 480ms; } .stagger > *:nth-child(10) { animation-delay: 540ms; } .stagger > *:nth-child(n+11) { animation-delay: 600ms; } .notifications-stagger .notification-row { animation: notification-row-in 0.3s var(--ease-notification) backwards; } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } @keyframes fadein { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideDown { from { opacity: 0; transform: translateY(-14px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideInLeft { from { opacity: 0; transform: translateX(-18px); } to { opacity: 1; transform: translateX(0); } } @keyframes slideInRight { from { opacity: 0; transform: translateX(18px); } to { opacity: 1; transform: translateX(0); } } @keyframes scaleIn { from { opacity: 0; transform: scale(0.94); } to { opacity: 1; transform: scale(1); } } @keyframes bounceIn { 0% { opacity: 0; transform: scale(0.4); } 50% { opacity: 1; transform: scale(1.03); } 70% { transform: scale(0.97); } 100% { transform: scale(1); } } @keyframes typing { 0%, 60%, 100% { opacity: 0.3; transform: translateY(0); } 30% { opacity: 1; transform: translateY(-2px); } } @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } @keyframes glow { 0%, 100% { box-shadow: 0 0 16px rgba(168, 224, 99, 0.18); } 50% { box-shadow: 0 0 32px rgba(168, 224, 99, 0.28); } } @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-6px); } } @keyframes spin { to { transform: rotate(360deg); } } /* ===================================================================== 🎬 PAGE TRANSITIONS — анимация смены страниц Применение: <div key={location.pathname} className="page-enter"> ===================================================================== */ @media (prefers-reduced-motion: no-preference) { .page-enter { animation: pageEnter var(--duration-slow) var(--ease-out) both; } .page-enter-slide { animation: pageEnterSlide var(--duration-slow) var(--ease-out) both; } .page-enter-scale { animation: pageEnterScale var(--duration-normal) var(--ease-spring) both; } .page-enter-fade { animation: pageEnterFade var(--duration-normal) var(--ease-out) both; } } @keyframes pageEnter { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } } @keyframes pageEnterSlide { from { opacity: 0; transform: translateX(20px); } to { opacity: 1; transform: translateX(0); } } @keyframes pageEnterScale { from { opacity: 0; transform: scale(0.985); } to { opacity: 1; transform: scale(1); } } @keyframes pageEnterFade { from { opacity: 0; } to { opacity: 1; } } /* ===================================================================== NOTIFICATION ANIMATIONS ===================================================================== */ @keyframes notification-pulse { 0%, 20% { opacity: 0; border-width: 3px; transform: scale(1); } 10% { opacity: 1; } 20%, 100% { transform: scale(2); border-width: 1px; opacity: 0; } } @keyframes bell-shake { 0%, 100% { transform: rotate(0); } 20% { transform: rotate(-15deg); } 40% { transform: rotate(15deg); } 60% { transform: rotate(-10deg); } 80% { transform: rotate(10deg); } } @keyframes notification-panel-in { from { opacity: 0; transform: translateY(-8px) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } } @keyframes notification-row-in { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } } /* ===================================================================== NAVIGATION PROGRESS ===================================================================== */ @keyframes nav-progress { 0% { transform: scaleX(0); opacity: 1; } 50% { transform: scaleX(0.65); opacity: 1; } 85% { transform: scaleX(0.9); opacity: 1; } 100% { transform: scaleX(1); opacity: 0; } } .nav-progress-bar { animation: nav-progress 0.85s cubic-bezier(0.4, 0, 0.2, 1) forwards; transform-origin: left center; } @keyframes nav-progress-glow { 0%, 100% { opacity: 0.4; } 50% { opacity: 0.8; } } .nav-progress-glow { animation: nav-progress-glow 0.85s ease-in-out; } /* ===================================================================== KANBAN ANIMATIONS ===================================================================== */ @keyframes kanban-card-in { from { opacity: 0; transform: translateY(-8px) scale(0.97); } to { opacity: 1; transform: translateY(0) scale(1); } } @keyframes kanban-drop-flash { 0% { box-shadow: 0 0 0 0 rgba(168, 224, 99, 0.5); } 100% { box-shadow: 0 0 0 12px rgba(168, 224, 99, 0); } } @keyframes kanban-indicator-pulse { 0%, 100% { opacity: 0.6; } 50% { opacity: 1; } } .kanban-card-enter { animation: kanban-card-in 0.28s cubic-bezier(0.16, 1, 0.3, 1); } .kanban-card-drop { animation: kanban-drop-flash 0.7s ease-out; } .kanban-drop-indicator { animation: kanban-indicator-pulse 1s ease-in-out infinite; } /* ===================================================================== TOAST ANIMATIONS ===================================================================== */ @keyframes toast-enter { from { opacity: 0; transform: translateX(100%) scale(0.95); } to { opacity: 1; transform: translateX(0) scale(1); } } @keyframes toast-exit { from { opacity: 1; transform: translateX(0) scale(1); } to { opacity: 0; transform: translateX(100%) scale(0.95); } } .toast-enter { animation: toast-enter 0.25s cubic-bezier(0.16, 1, 0.3, 1); } .toast-exit { animation: toast-exit 0.2s cubic-bezier(0.4, 0, 1, 1) forwards; } @media (max-width: 640px) { @keyframes toast-enter { from { opacity: 0; transform: translateY(-100%) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } } @keyframes toast-exit { from { opacity: 1; transform: translateY(0) scale(1); } to { opacity: 0; transform: translateY(-100%) scale(0.95); } } } @media (prefers-reduced-motion: reduce) { .toast-enter, .toast-exit { animation: none; } } /* ===================================================================== UTILITY CLASSES ===================================================================== */ .container { width: 100%; max-width: 1280px; margin-inline: auto; padding-inline: clamp(1rem, 3vw, 2rem); } .kbd { font-family: var(--font-mono); font-size: 0.78em; padding: 0.15rem 0.45rem; background: var(--glass-bg-default); backdrop-filter: blur(var(--glass-blur-sm)); -webkit-backdrop-filter: blur(var(--glass-blur-sm)); border-radius: var(--radius-xs); border: 1px solid var(--glass-border); box-shadow: inset 0 -1px 0 var(--glass-highlight-bottom); color: var(--color-text-secondary); } .line-clamp-1, .line-clamp-2, .line-clamp-3, .line-clamp-4 { display: -webkit-box; -webkit-box-orient: vertical; overflow: hidden; } .line-clamp-1 { -webkit-line-clamp: 1; } .line-clamp-2 { -webkit-line-clamp: 2; } .line-clamp-3 { -webkit-line-clamp: 3; } .line-clamp-4 { -webkit-line-clamp: 4; } .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .break-words { word-break: break-word; overflow-wrap: break-word; } .bg-grid { background-image: linear-gradient(var(--color-border-subtle) 1px, transparent 1px), linear-gradient(90deg, var(--color-border-subtle) 1px, transparent 1px); background-size: 32px 32px; } .bg-dots { background-image: radial-gradient(var(--color-border-default) 1px, transparent 1px); background-size: 20px 20px; } .bg-glow { background: var(--gradient-glow); } .elevate-1 { box-shadow: var(--shadow-sm); } .elevate-2 { box-shadow: var(--shadow-md); } .elevate-3 { box-shadow: var(--shadow-lg); } .elevate-4 { box-shadow: var(--shadow-xl); } .lift-sm { transition: transform var(--duration-normal) var(--ease-out), box-shadow var(--duration-normal) var(--ease-smooth); } .lift-sm:hover { transform: translateY(-2px); } .lift-md { transition: transform var(--duration-normal) var(--ease-out), box-shadow var(--duration-normal) var(--ease-smooth); } .lift-md:hover { transform: translateY(-4px); } @media (max-width: 639px) { .hide-mobile { display: none !important; } } @media (min-width: 640px) and (max-width: 1023px) { .hide-tablet { display: none !important; } } @media (min-width: 1024px) { .hide-desktop { display: none !important; } } /* ===================================================================== GLASS SURFACES — 5 intensity levels + accent variants ===================================================================== */ .glass-subtle { background: var(--glass-bg-subtle); backdrop-filter: blur(var(--glass-blur-sm)); -webkit-backdrop-filter: blur(var(--glass-blur-sm)); border: 1px solid var(--glass-border); position: relative; } .glass { background: var(--glass-bg-default); backdrop-filter: blur(var(--glass-blur)) saturate(130%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(130%); border: 1px solid var(--glass-border); position: relative; } .glass-strong { background: var(--glass-bg-strong); backdrop-filter: blur(var(--glass-blur-strong)) saturate(145%); -webkit-backdrop-filter: blur(var(--glass-blur-strong)) saturate(145%); border: 1px solid var(--glass-border-strong); position: relative; } .glass-frosted { background: var(--glass-bg-frosted); backdrop-filter: blur(var(--glass-blur-frosted)) saturate(160%); -webkit-backdrop-filter: blur(var(--glass-blur-frosted)) saturate(160%); border: 1px solid var(--glass-border-strong); position: relative; } .glass-lime { background: var(--glass-bg-lime); backdrop-filter: blur(var(--glass-blur)) saturate(140%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%); border: 1px solid var(--color-border-accent); position: relative; } /* ✅ Accent glass variants */ .glass-cyan { background: var(--glass-bg-cyan); backdrop-filter: blur(var(--glass-blur)) saturate(140%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%); border: 1px solid var(--color-border-cyan); position: relative; } .glass-amber { background: var(--glass-bg-amber); backdrop-filter: blur(var(--glass-blur)) saturate(140%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%); border: 1px solid var(--color-border-amber); position: relative; } .glass-rose { background: var(--glass-bg-rose); backdrop-filter: blur(var(--glass-blur)) saturate(140%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%); border: 1px solid var(--color-border-rose); position: relative; } /* Inner highlight для всех glass поверхностей */ .glass-subtle::before, .glass::before, .glass-strong::before, .glass-frosted::before, .glass-lime::before, .glass-cyan::before, .glass-amber::before, .glass-rose::before { content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 1px; background: linear-gradient(180deg, var(--glass-highlight-top) 0%, transparent 40%, var(--glass-highlight-bottom) 100%); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none; z-index: 1; } /* ===================================================================== GRADIENT BACKGROUNDS ===================================================================== */ .gradient-violet { background: var(--gradient-primary); } .gradient-cyan { background: var(--gradient-cyan); } .gradient-amber { background: var(--gradient-amber); } .gradient-pink { background: var(--gradient-rose); } .gradient-rose { background: var(--gradient-rose); } .gradient-primary { background: var(--gradient-primary); } .gradient-accent { background: var(--gradient-accent); } .gradient-text { background: var(--gradient-primary); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent; } .gradient-text-cyan { background: var(--gradient-cyan); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent; } .gradient-text-amber { background: var(--gradient-amber); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent; } .gradient-text-rose { background: var(--gradient-rose); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent; } /* ===================================================================== PROSE / MARKDOWN ===================================================================== */ .prose { color: var(--color-text-primary); line-height: 1.7; font-size: clamp(0.875rem, 0.85rem + 0.1vw, 0.9375rem); letter-spacing: -0.005em; max-width: 72ch; } .prose-sm { font-size: 0.875rem; line-height: 1.6; } .prose-sm h1 { font-size: 1.375rem; } .prose-sm h2 { font-size: 1.25rem; } .prose-sm h3 { font-size: 1.0625rem; } .prose-sm h4 { font-size: 1rem; } .prose-lg { font-size: 1.0625rem; line-height: 1.75; } .prose-invert { color: var(--color-text-primary); } .prose > * + * { margin-top: 1em; } .prose h1, .prose h2, .prose h3, .prose h4, .prose h5, .prose h6 { color: var(--color-text-primary); font-weight: 600; margin-top: 1.75em; margin-bottom: 0.75em; line-height: 1.25; letter-spacing: -0.02em; } .prose h1 { font-size: clamp(1.5rem, 1.3rem + 0.8vw, 1.875rem); margin-top: 0; } .prose h2 { font-size: clamp(1.25rem, 1.1rem + 0.6vw, 1.5rem); } .prose h3 { font-size: clamp(1.0625rem, 1rem + 0.3vw, 1.25rem); } .prose h4 { font-size: clamp(1rem, 0.95rem + 0.2vw, 1.125rem); } .prose h1::before, .prose h2::before { content: ""; display: inline-block; width: 3px; height: 0.9em; background: var(--color-accent-lime); margin-right: 0.5em; vertical-align: -0.1em; border-radius: 2px; opacity: 0.85; } .prose p { margin-top: 0; margin-bottom: 1.1em; color: var(--color-text-secondary); } .prose strong { color: var(--color-text-primary); font-weight: 600; } .prose em { color: var(--color-text-secondary); } .prose a { color: var(--color-text-accent); text-decoration: none; border-bottom: 1px solid transparent; transition: border-color var(--duration-normal) var(--ease-smooth), color var(--duration-normal) var(--ease-smooth); } .prose a:hover { color: var(--color-accent-lime); border-bottom-color: var(--color-accent-lime); } .prose ul, .prose ol { margin-top: 0; margin-bottom: 1.1em; padding-left: 1.5em; } .prose ul { list-style-type: disc; } .prose ol { list-style-type: decimal; } .prose li { margin-top: 0.35em; margin-bottom: 0.35em; color: var(--color-text-secondary); padding-left: 0.25em; } .prose li::marker { color: var(--color-accent-lime); opacity: 0.75; } .prose li > ul, .prose li > ol { margin-top: 0.4em; margin-bottom: 0; } .prose blockquote { margin: 1.5em 0; padding: 0.875em 1.125em; border-left: 3px solid var(--color-accent-lime); background: var(--glass-bg-lime); backdrop-filter: blur(var(--glass-blur-sm)); -webkit-backdrop-filter: blur(var(--glass-blur-sm)); border-radius: 0 var(--radius-sm) var(--radius-sm) 0; color: var(--color-text-secondary); } .prose blockquote p { margin-bottom: 0; } .prose code { font-family: var(--font-mono); font-size: 0.85em; background: var(--glass-bg-lime); padding: 0.15rem 0.4rem; border-radius: 4px; color: var(--color-text-accent); border: 1px solid var(--color-border-accent); font-feature-settings: "ss01", "cv01"; } .prose pre { margin: 1.5em 0; padding: 1.125rem 1.375rem; background: var(--glass-bg-frosted); backdrop-filter: blur(var(--glass-blur)) saturate(140%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%); border: 1px solid var(--glass-border-strong); border-radius: var(--radius-md); overflow-x: auto; position: relative; box-shadow: var(--shadow-sm); } .prose pre::before { content: ""; position: absolute; top: 0.7rem; left: 1rem; width: 6px; height: 6px; border-radius: 50%; background: var(--color-accent-lime); opacity: 0.7; box-shadow: 14px 0 0 rgba(232, 200, 121, 0.5), 28px 0 0 rgba(232, 154, 154, 0.4); } .prose pre code { background: transparent; padding: 0; border: none; color: var(--color-text-primary); font-size: 0.82em; line-height: 1.65; display: block; padding-top: 0.875rem; } .prose hr { margin: 2.25em 0; border: none; border-top: 1px solid var(--color-border-subtle); } .prose table { width: 100%; margin: 1.5em 0; border-collapse: collapse; font-size: 0.875em; border: 1px solid var(--glass-border); border-radius: var(--radius-md); overflow: hidden; background: var(--glass-bg-subtle); backdrop-filter: blur(var(--glass-blur-sm)); -webkit-backdrop-filter: blur(var(--glass-blur-sm)); display: block; overflow-x: auto; } .prose table th, .prose table td { padding: 0.75rem 1rem; border-bottom: 1px solid var(--color-border-subtle); text-align: left; } .prose table th { background: var(--glass-bg-default); color: var(--color-text-accent); font-weight: 600; font-size: 0.75rem; letter-spacing: 0.05em; text-transform: uppercase; } .prose table td { color: var(--color-text-secondary); } .prose table tr:last-child td { border-bottom: none; } .prose table tr { transition: background var(--duration-normal) var(--ease-smooth); } .prose table tr:hover td { background: var(--glass-bg-default); } .prose img[alt*="emoji"], .prose img[src*="emoji"] { display: inline; height: 1em; vertical-align: -0.125em; margin: 0; } /* ===================================================================== BUTTONS — glass variants ===================================================================== */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem; padding: 0.625rem 1.125rem; min-height: 40px; border-radius: var(--radius-md); font-weight: 500; font-size: 0.875rem; letter-spacing: -0.005em; transition: transform var(--duration-normal) var(--ease-out), box-shadow var(--duration-normal) var(--ease-smooth), background var(--duration-normal) var(--ease-smooth), border-color var(--duration-normal) var(--ease-smooth), color var(--duration-normal) var(--ease-smooth); cursor: pointer; border: 1px solid transparent; outline-offset: 2px; white-space: nowrap; user-select: none; position: relative; overflow: hidden; will-change: transform, box-shadow; isolation: isolate; } @media (max-width: 639px) { .btn { min-height: 44px; padding: 0.75rem 1.25rem; } } .btn:active:not(:disabled) { transform: scale(0.97); transition-duration: var(--duration-fast); } .btn:disabled { opacity: 0.4; cursor: not-allowed; pointer-events: none; } .btn::before { content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 1px; background: linear-gradient(180deg, var(--glass-highlight-top) 0%, transparent 45%, var(--glass-highlight-bottom) 100%); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none; z-index: 1; } .btn::after { content: ""; position: absolute; top: 0; left: -100%; width: 60%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.06), transparent); transition: left var(--duration-slow) var(--ease-out); pointer-events: none; z-index: 1; } .btn:hover:not(:disabled)::after { left: 130%; } /* PRIMARY */ .btn-primary { background: var(--gradient-primary); color: var(--color-text-on-accent); font-weight: 600; border-color: var(--color-border-accent); box-shadow: 0 2px 10px rgba(168, 224, 99, 0.22), inset 0 1px 0 rgba(255, 255, 255, 0.22), inset 0 -1px 0 rgba(0, 0, 0, 0.08); } .btn-primary::before { background: linear-gradient(180deg, rgba(255, 255, 255, 0.25) 0%, transparent 40%, rgba(0, 0, 0, 0.06) 100%); } .btn-primary::after { background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); } .btn-primary:hover:not(:disabled) { box-shadow: 0 6px 24px rgba(168, 224, 99, 0.35), var(--shadow-lime), inset 0 1px 0 rgba(255, 255, 255, 0.3), inset 0 -1px 0 rgba(0, 0, 0, 0.08); transform: translateY(-1px); filter: brightness(1.05); } /* GLASS */ .btn-glass { background: var(--glass-bg-default); color: var(--color-text-primary); border-color: var(--glass-border); backdrop-filter: blur(var(--glass-blur)) saturate(130%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(130%); box-shadow: var(--shadow-xs), inset 0 1px 0 var(--glass-highlight-top), inset 0 -1px 0 var(--glass-highlight-bottom); } .btn-glass:hover:not(:disabled) { background: var(--glass-bg-strong); border-color: var(--glass-border-strong); box-shadow: var(--shadow-sm), inset 0 1px 0 rgba(255, 255, 255, 0.10), inset 0 -1px 0 rgba(0, 0, 0, 0.12); transform: translateY(-1px); } /* GLASS-LIME */ .btn-glass-lime { background: var(--glass-bg-lime); color: var(--color-text-accent); border-color: var(--color-border-accent); backdrop-filter: blur(var(--glass-blur)) saturate(140%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%); box-shadow: var(--shadow-xs), inset 0 1px 0 rgba(168, 224, 99, 0.12), inset 0 -1px 0 rgba(0, 0, 0, 0.08); } .btn-glass-lime:hover:not(:disabled) { background: rgba(168, 224, 99, 0.14); border-color: var(--color-accent-lime); box-shadow: var(--shadow-md), var(--shadow-lime), inset 0 1px 0 rgba(168, 224, 99, 0.22), inset 0 -1px 0 rgba(0, 0, 0, 0.08); transform: translateY(-1px); } /* ✅ GLASS-CYAN */ .btn-glass-cyan { background: var(--glass-bg-cyan); color: var(--color-accent-cyan); border-color: var(--color-border-cyan); backdrop-filter: blur(var(--glass-blur)) saturate(140%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%); box-shadow: var(--shadow-xs), inset 0 1px 0 rgba(125, 211, 216, 0.12), inset 0 -1px 0 rgba(0, 0, 0, 0.08); } .btn-glass-cyan:hover:not(:disabled) { background: rgba(125, 211, 216, 0.14); border-color: var(--color-accent-cyan); box-shadow: var(--shadow-md), var(--shadow-cyan); transform: translateY(-1px); } /* ✅ GLASS-AMBER */ .btn-glass-amber { background: var(--glass-bg-amber); color: var(--color-accent-amber); border-color: var(--color-border-amber); backdrop-filter: blur(var(--glass-blur)) saturate(140%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%); box-shadow: var(--shadow-xs), inset 0 1px 0 rgba(232, 200, 121, 0.12), inset 0 -1px 0 rgba(0, 0, 0, 0.08); } .btn-glass-amber:hover:not(:disabled) { background: rgba(232, 200, 121, 0.14); border-color: var(--color-accent-amber); box-shadow: var(--shadow-md), var(--shadow-amber); transform: translateY(-1px); } /* ✅ GLASS-ROSE */ .btn-glass-rose { background: var(--glass-bg-rose); color: var(--color-accent-rose); border-color: var(--color-border-rose); backdrop-filter: blur(var(--glass-blur)) saturate(140%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%); box-shadow: var(--shadow-xs), inset 0 1px 0 rgba(232, 154, 154, 0.12), inset 0 -1px 0 rgba(0, 0, 0, 0.08); } .btn-glass-rose:hover:not(:disabled) { background: rgba(232, 154, 154, 0.14); border-color: var(--color-accent-rose); box-shadow: var(--shadow-md), var(--shadow-rose); transform: translateY(-1px); } /* SECONDARY */ .btn-secondary { background: var(--glass-bg-default); color: var(--color-text-primary); border-color: var(--glass-border); backdrop-filter: blur(var(--glass-blur-sm)); -webkit-backdrop-filter: blur(var(--glass-blur-sm)); box-shadow: var(--shadow-xs), inset 0 1px 0 var(--glass-highlight-top); } .btn-secondary:hover:not(:disabled) { background: var(--glass-bg-strong); border-color: var(--glass-border-strong); box-shadow: var(--shadow-sm), inset 0 1px 0 rgba(255, 255, 255, 0.10); transform: translateY(-1px); } /* GHOST */ .btn-ghost { background: transparent; color: var(--color-text-secondary); border-color: transparent; } .btn-ghost::before { display: none; } .btn-ghost:hover:not(:disabled) { background: var(--glass-bg-default); backdrop-filter: blur(var(--glass-blur-sm)); -webkit-backdrop-filter: blur(var(--glass-blur-sm)); color: var(--color-text-primary); border-color: var(--glass-border); box-shadow: inset 0 1px 0 var(--glass-highlight-top); } /* OUTLINE-LIME */ .btn-outline-lime { background: var(--glass-bg-subtle); color: var(--color-text-accent); border-color: var(--color-border-accent); backdrop-filter: blur(var(--glass-blur-sm)); -webkit-backdrop-filter: blur(var(--glass-blur-sm)); box-shadow: inset 0 1px 0 rgba(168, 224, 99, 0.06), inset 0 -1px 0 rgba(0, 0, 0, 0.08); } .btn-outline-lime:hover:not(:disabled) { background: var(--glass-bg-lime); border-color: var(--color-accent-lime); box-shadow: var(--shadow-sm), var(--shadow-lime), inset 0 1px 0 rgba(168, 224, 99, 0.15); transform: translateY(-1px); } /* DANGER */ .btn-danger { background: var(--color-status-error-soft); color: var(--color-status-error); border-color: rgba(232, 154, 154, 0.25); backdrop-filter: blur(var(--glass-blur-sm)); -webkit-backdrop-filter: blur(var(--glass-blur-sm)); } .btn-danger:hover:not(:disabled) { background: rgba(232, 154, 154, 0.18); border-color: var(--color-status-error); transform: translateY(-1px); } /* ICON BUTTON */ .btn-icon { padding: 0; width: 40px; height: 40px; border-radius: var(--radius-md); } .btn-icon.btn-sm { width: 32px; height: 32px; } .btn-icon.btn-lg { width: 48px; height: 48px; } /* SIZES */ .btn-sm { padding: 0.375rem 0.75rem; min-height: 32px; font-size: 0.8125rem; } .btn-lg { padding: 0.875rem 1.5rem; min-height: 48px; font-size: 0.9375rem; backdrop-filter: blur(var(--glass-blur-strong)); -webkit-backdrop-filter: blur(var(--glass-blur-strong)); } /* LOADING STATE */ .btn.is-loading { pointer-events: none; color: transparent; } .btn.is-loading::after { content: ""; position: absolute; width: 16px; height: 16px; border: 2px solid currentColor; border-top-color: transparent; border-radius: 50%; color: var(--color-text-primary); animation: spin 0.7s linear infinite; top: 50%; left: 50%; margin: -8px 0 0 -8px; background: transparent; } .btn-primary.is-loading::after { color: var(--color-text-on-accent); } .btn-glass-lime.is-loading::after, .btn-outline-lime.is-loading::after { color: var(--color-accent-lime); } @media (prefers-reduced-motion: reduce) { .btn::after { display: none; } .btn:hover:not(:disabled) { transform: none; } } @media (hover: none) and (pointer: coarse) { .btn::after { display: none; } .btn:hover:not(:disabled) { transform: none; } } /* ===================================================================== INPUTS ===================================================================== */ .input, .textarea, .select { width: 100%; padding: 0.7rem 0.95rem; background: var(--glass-bg-default); backdrop-filter: blur(var(--glass-blur-sm)); -webkit-backdrop-filter: blur(var(--glass-blur-sm)); border: 1px solid var(--glass-border); border-radius: var(--radius-md); color: var(--color-text-primary); font-size: 0.875rem; transition: border-color var(--duration-normal) var(--ease-smooth), box-shadow var(--duration-normal) var(--ease-smooth), background var(--duration-normal) var(--ease-smooth); min-height: 40px; position: relative; } @media (max-width: 639px) { .input, .textarea, .select { min-height: 44px; font-size: 1rem; } } .input:hover:not(:focus):not(:disabled), .textarea:hover:not(:focus):not(:disabled), .select:hover:not(:focus):not(:disabled) { border-color: var(--glass-border-strong); background: var(--glass-bg-strong); } .input:focus, .textarea:focus, .select:focus { outline: none; border-color: var(--color-accent-lime); box-shadow: 0 0 0 1px var(--color-accent-lime), 0 0 0 5px var(--color-accent-lime-soft); background: var(--glass-bg-strong); } .input::placeholder, .textarea::placeholder { color: var(--color-text-faint); } .input:disabled, .textarea:disabled, .select:disabled { opacity: 0.5; cursor: not-allowed; background: var(--glass-bg-subtle); } .textarea { min-height: 88px; resize: vertical; line-height: 1.55; } .select { appearance: none; padding-right: 2.5rem; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none' stroke='%2376766e' stroke-width='1.5'%3E%3Cpolyline points='3 5 6 8 9 5'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 0.95rem center; } /* ===================================================================== CARDS ===================================================================== */ .card { background: var(--glass-bg-default); backdrop-filter: blur(var(--glass-blur)) saturate(130%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(130%); border: 1px solid var(--glass-border); border-radius: var(--radius-lg); padding: 1.5rem; transition: border-color var(--duration-normal) var(--ease-smooth), box-shadow var(--duration-normal) var(--ease-smooth), transform var(--duration-normal) var(--ease-out), background var(--duration-normal) var(--ease-smooth); will-change: transform; position: relative; } .card::before { content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 1px; background: linear-gradient(180deg, var(--glass-highlight-top) 0%, transparent 40%, var(--glass-highlight-bottom) 100%); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none; } .card:hover { border-color: var(--glass-border-strong); background: var(--glass-bg-strong); box-shadow: var(--shadow-md); } .card-interactive { cursor: pointer; } .card-interactive:hover { border-color: var(--color-border-accent); background: var(--glass-bg-strong); box-shadow: var(--shadow-lg), var(--shadow-lime), 0 0 0 1px var(--color-border-accent); transform: translateY(-3px); } .card-interactive:active { transform: translateY(0); transition-duration: var(--duration-fast); } .card-elevated { background: var(--glass-bg-strong); border: 1px solid var(--glass-border-strong); box-shadow: var(--shadow-sm); } .card-frosted { background: var(--glass-bg-frosted); backdrop-filter: blur(var(--glass-blur-frosted)) saturate(160%); -webkit-backdrop-filter: blur(var(--glass-blur-frosted)) saturate(160%); border: 1px solid var(--glass-border-strong); } .card-accent { background: var(--glass-bg-lime); border: 1px solid var(--color-border-accent); box-shadow: inset 0 1px 0 rgba(168, 224, 99, 0.12), var(--shadow-sm); } /* ✅ Accent cards */ .card-cyan { background: var(--glass-bg-cyan); border: 1px solid var(--color-border-cyan); box-shadow: inset 0 1px 0 rgba(125, 211, 216, 0.12), var(--shadow-sm); } .card-amber { background: var(--glass-bg-amber); border: 1px solid var(--color-border-amber); box-shadow: inset 0 1px 0 rgba(232, 200, 121, 0.12), var(--shadow-sm); } .card-rose { background: var(--glass-bg-rose); border: 1px solid var(--color-border-rose); box-shadow: inset 0 1px 0 rgba(232, 154, 154, 0.12), var(--shadow-sm); } @media (max-width: 639px) { .card { padding: 1.125rem; border-radius: var(--radius-md); } } /* ===================================================================== BADGES ===================================================================== */ .badge { display: inline-flex; align-items: center; gap: 0.35rem; padding: 0.25rem 0.6rem; border-radius: var(--radius-full); font-size: 0.7rem; font-weight: 500; letter-spacing: 0.01em; white-space: nowrap; line-height: 1; backdrop-filter: blur(var(--glass-blur-sm)); -webkit-backdrop-filter: blur(var(--glass-blur-sm)); transition: all var(--duration-normal) var(--ease-smooth); } .badge-lime { background: var(--glass-bg-lime); color: var(--color-text-accent); border: 1px solid var(--color-border-accent); } .badge-cyan { background: var(--glass-bg-cyan); color: var(--color-accent-cyan); border: 1px solid var(--color-border-cyan); } .badge-pink { background: var(--glass-bg-rose); color: var(--color-accent-rose); border: 1px solid var(--color-border-rose); } .badge-amber { background: var(--glass-bg-amber); color: var(--color-accent-amber); border: 1px solid var(--color-border-amber); } .badge-neutral { background: var(--glass-bg-default); color: var(--color-text-secondary); border: 1px solid var(--glass-border); } .badge-solid-lime { background: var(--gradient-primary); color: var(--color-text-on-accent); font-weight: 600; border: none; } .badge-glass { background: var(--glass-bg-strong); color: var(--color-text-primary); border: 1px solid var(--glass-border-strong); } .badge-dot::before { content: ""; width: 5px; height: 5px; border-radius: 50%; background: currentColor; box-shadow: 0 0 6px currentColor; flex-shrink: 0; opacity: 0.85; } .badge-sm { padding: 0.125rem 0.5rem; font-size: 0.625rem; } .badge-lg { padding: 0.375rem 0.75rem; font-size: 0.8125rem; } /* ===================================================================== MESSAGE BUBBLES ===================================================================== */ .message-bubble { position: relative; padding: 0.875rem 1.125rem; border-radius: var(--radius-xl); line-height: 1.6; max-width: min(85%, 640px); font-size: 0.9375rem; transition: transform var(--duration-normal) var(--ease-out); } .message-user { background: var(--gradient-primary); color: var(--color-text-on-accent); margin-left: auto; border-bottom-right-radius: var(--radius-sm); font-weight: 500; box-shadow: var(--shadow-md), var(--shadow-lime); } .message-user a { color: var(--color-text-on-accent); border-bottom-color: rgba(0, 0, 0, 0.25); } .message-assistant { background: var(--glass-bg-strong); backdrop-filter: blur(var(--glass-blur)) saturate(140%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%); border: 1px solid var(--glass-border-strong); color: var(--color-text-primary); border-bottom-left-radius: var(--radius-sm); box-shadow: var(--shadow-sm); } .message-system { background: var(--glass-bg-default); backdrop-filter: blur(var(--glass-blur-sm)); -webkit-backdrop-filter: blur(var(--glass-blur-sm)); color: var(--color-text-muted); font-size: 0.8125rem; text-align: center; max-width: 100%; border-radius: var(--radius-md); border: 1px solid var(--glass-border); } @media (max-width: 639px) { .message-bubble { max-width: 92%; } } /* ===================================================================== AGENT CARDS ===================================================================== */ .agent-card { position: relative; background: var(--glass-bg-default); backdrop-filter: blur(var(--glass-blur)) saturate(130%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(130%); border: 1px solid var(--glass-border); border-radius: var(--radius-lg); padding: 1rem; transition: border-color var(--duration-normal) var(--ease-smooth), box-shadow var(--duration-normal) var(--ease-smooth), transform var(--duration-normal) var(--ease-out), background var(--duration-normal) var(--ease-smooth); will-change: transform; } .agent-card::before { content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 1px; background: linear-gradient(180deg, var(--glass-highlight-top) 0%, transparent 40%, var(--glass-highlight-bottom) 100%); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none; } .agent-card:hover { border-color: var(--glass-border-strong); background: var(--glass-bg-strong); transform: translateY(-1px); box-shadow: var(--shadow-sm); } .agent-card.active { border-color: var(--color-accent-lime); background: var(--glass-bg-lime); box-shadow: var(--shadow-md), var(--shadow-lime); } /* ===================================================================== SKELETON / LOADING ===================================================================== */ .skeleton { background: linear-gradient(90deg, var(--glass-bg-default) 0%, var(--glass-bg-strong) 50%, var(--glass-bg-default) 100%); background-size: 200% 100%; animation: shimmer 2.4s infinite linear; border-radius: var(--radius-sm); position: relative; overflow: hidden; backdrop-filter: blur(var(--glass-blur-xs)); -webkit-backdrop-filter: blur(var(--glass-blur-xs)); } .skeleton-text { height: 1em; margin-bottom: 0.5em; } .skeleton-text:last-child { width: 60%; } .skeleton-title { height: 1.5em; width: 40%; margin-bottom: 0.75em; } .skeleton-circle { border-radius: 50%; } .skeleton-button { height: 40px; width: 120px; border-radius: var(--radius-md); } /* ===================================================================== TOOLTIP ===================================================================== */ [data-tooltip] { position: relative; } [data-tooltip]::after { content: attr(data-tooltip); position: absolute; bottom: calc(100% + 8px); left: 50%; transform: translateX(-50%) translateY(-4px); padding: 0.4rem 0.65rem; background: var(--glass-bg-frosted); backdrop-filter: blur(var(--glass-blur-strong)) saturate(140%); -webkit-backdrop-filter: blur(var(--glass-blur-strong)) saturate(140%); color: var(--color-text-primary); font-size: 0.75rem; font-weight: 500; border-radius: var(--radius-sm); white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity var(--duration-normal) var(--ease-out), transform var(--duration-normal) var(--ease-out); box-shadow: var(--shadow-md); z-index: 1000; border: 1px solid var(--glass-border-strong); } [data-tooltip]:hover::after { opacity: 1; transform: translateX(-50%) translateY(0); } /* ===================================================================== DIVIDER ===================================================================== */ .divider { height: 1px; background: var(--color-border-subtle); margin: 1.5rem 0; border: none; } .divider-accent { height: 1px; background: linear-gradient(90deg, transparent, var(--color-accent-lime), transparent); opacity: 0.5; border: none; } /* ===================================================================== PANELS ===================================================================== */ .panel { background: var(--glass-bg-default); backdrop-filter: blur(var(--glass-blur)) saturate(130%); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(130%); border: 1px solid var(--glass-border); border-radius: var(--radius-lg); padding: 1.5rem; position: relative; } .panel::before { content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 1px; background: linear-gradient(180deg, var(--glass-highlight-top) 0%, transparent 40%, var(--glass-highlight-bottom) 100%); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none; } .panel-strong { background: var(--glass-bg-strong); border-color: var(--glass-border-strong); } .panel-frosted { background: var(--glass-bg-frosted); backdrop-filter: blur(var(--glass-blur-frosted)) saturate(160%); -webkit-backdrop-filter: blur(var(--glass-blur-frosted)) saturate(160%); border-color: var(--glass-border-strong); } .panel-lime { background: var(--glass-bg-lime); border-color: var(--color-border-accent); } /* ===================================================================== STATUS INDICATORS ===================================================================== */ .status-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--color-text-faint); flex-shrink: 0; } .status-dot.online { background: var(--color-status-success); box-shadow: 0 0 6px rgba(134, 201, 160, 0.6); } .status-dot.busy { background: var(--color-status-error); box-shadow: 0 0 6px rgba(232, 154, 154, 0.6); } .status-dot.away { background: var(--color-status-warning); box-shadow: 0 0 6px rgba(232, 200, 121, 0.6); } .status-dot.running { background: var(--color-accent-lime); box-shadow: 0 0 8px rgba(168, 224, 99, 0.7); animation: pulse 1.8s ease-in-out infinite; } /* ===================================================================== RESPONSIVE BREAKPOINTS ===================================================================== */ @media (max-width: 639px) { .container { padding-inline: 1rem; } .prose h1 { font-size: 1.5rem; } .prose h2 { font-size: 1.25rem; } .prose h3 { font-size: 1.125rem; } .prose pre { font-size: 0.72rem; padding: 0.85rem 1rem; } .prose table { font-size: 0.75rem; } .prose table th, .prose table td { padding: 0.5rem 0.75rem; } } @media (min-width: 640px) and (max-width: 1023px) { .container { padding-inline: 1.5rem; } } @media (min-width: 1024px) { .container { padding-inline: 2rem; } } @media (min-width: 1280px) { .container { padding-inline: 2.5rem; } } @media (hover: none) and (pointer: coarse) { .card:hover, .btn:hover, .agent-card:hover { transform: none; box-shadow: none; } .card-interactive:hover { transform: none; } button, a, [role="button"], .btn, .input, .textarea, .select { min-height: 44px; min-width: 44px; } } /* ===================================================================== PRINT STYLES ===================================================================== */ @media print { *, *::before, *::after { background: white !important; color: black !important; box-shadow: none !important; text-shadow: none !important; } body { font-size: 12pt; line-height: 1.5; } .glass, .glass-strong, .glass-lime, .glass-frosted, .card, .panel, .agent-card, .badge { backdrop-filter: none; background: white; border: 1px solid #ddd; } .btn-primary { background: #eee !important; color: #000 !important; } a { text-decoration: underline; color: #000 !important; } a[href]::after { content: " (" attr(href) ")"; font-size: 0.8em; color: #666; } .hide-print, button, .modal-overlay, .toast { display: none !important; } .fadein, .slide-up, .shimmer, .glow-effect, .pulse-dot, .typing-dot, .float { animation: none !important; } .card, .prose pre { page-break-inside: avoid; break-inside: avoid; } h1, h2, h3, h4 { page-break-after: avoid; break-after: avoid; } .prose pre { border: 1px solid #ddd; } }