Files
heicode/cc-haha/desktop/src/theme/globals.css
T
chenchenandClaude Opus 4.7 4665f88921 feat: route Heicode desktop login through code.xinghanlab.com Manager
Three concrete pieces:

1. Provider preset taijiaicloud now points at https://code.xinghanlab.com
   instead of the old api.taijiaicloud.com. Together with the stock
   resolveOAuthConfig fallback (<baseUrl>/heicode/oauth/authorize), this
   flips oauthEnabled on for the login card and turns the existing
   browser-redirect bridge into the default flow. Card name + promo
   updated to reflect that this is "log in via Heicode Manager".

2. loginAndActivate softens its model probe. /v1/models is best-effort:
   only hard 401/403 auth failures abort login. 5xx / panics / empty
   lists fall back to preset.defaultModels so the user lands inside the
   app even if the gateway transiently misbehaves; they can re-pick
   models from Settings later.

3. heicode_oauth.go fallback page: /login → /sign-in (matches the
   actual SPA route), title/copy de-branded from "HeiCode/新 API 控制台"
   to plain "Heicode 控制台".

Also picks up the prior unstaged Windows polish: WindowControls (min/
max/close + drag region) on the login screen, ProviderLoginCard +
globals.css refinements that landed in earlier MSI builds.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 13:55:57 +08:00

700 lines
21 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@import "tailwindcss";
@import "@xterm/xterm/css/xterm.css";
@plugin "@tailwindcss/typography";
/* ─── Self-hosted fonts (no Google CDN dependency) ────────────── */
/* Inter – variable weight 400-600, latin */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 400 600;
font-display: swap;
src: url('/fonts/inter-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 400 600;
font-display: swap;
src: url('/fonts/inter-latin-ext.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Manrope – variable weight 400-800, latin */
@font-face {
font-family: 'Manrope';
font-style: normal;
font-weight: 400 800;
font-display: swap;
src: url('/fonts/manrope-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Manrope';
font-style: normal;
font-weight: 400 800;
font-display: swap;
src: url('/fonts/manrope-latin-ext.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* JetBrains Mono – weight 400, latin */
@font-face {
font-family: 'JetBrains Mono';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('/fonts/jetbrains-mono-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'JetBrains Mono';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('/fonts/jetbrains-mono-latin-ext.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Material Symbols Outlined – variable weight, use block to avoid showing raw text */
@font-face {
font-family: 'Material Symbols Outlined';
font-style: normal;
font-weight: 100 700;
font-display: block;
src: url('/fonts/material-symbols-outlined.woff2') format('woff2');
}
/* Code highlighting is handled by shiki/react-shiki (inline styles + CSS line numbers) */
/* ─── Shiki code viewer ───────────────────────────────────────── */
.code-viewer-area .line {
display: block;
padding: 0 12px;
}
.code-viewer-area .has-line-numbers .line {
padding-left: 12px;
}
.code-viewer-area .line:hover {
background: rgba(0, 0, 0, 0.03);
}
.code-viewer-area .line-numbers::before {
margin-right: 1.5ch;
}
.code-viewer-area .has-line-numbers {
--line-numbers-foreground: rgba(135, 115, 109, 0.5);
--line-numbers-width: 2.5ch;
--line-numbers-padding-left: 0;
--line-numbers-padding-right: 0;
--line-numbers-font-size: 11px;
}
.settings-terminal-host .xterm {
height: 100%;
padding: 0;
}
.settings-terminal-host .xterm-viewport {
scrollbar-color: rgba(215, 210, 208, 0.35) transparent;
}
.settings-terminal-host .xterm-screen {
outline: none;
}
/* ─── Tailwind Theme Override — Heicode Premium Black ─── */
@theme {
/* Brand accent — restrained warm gold, used sparingly */
--color-primary: #C5A572;
--color-primary-container: #A38247;
--color-primary-fixed: #E0C896;
--color-primary-fixed-dim: #C5A572;
--color-on-primary: #1A1410;
--color-on-surface: #ECECEE;
--color-on-surface-variant: #B0B0B5;
/* Black surface stack — near-black with slight warm tint, low-contrast layering */
--color-surface: #141418;
--color-surface-bright: #1F1F25;
--color-surface-dim: #0A0A0C;
--color-surface-container: #1A1A1F;
--color-surface-container-low: #16161A;
--color-surface-container-high: #1F1F25;
--color-surface-container-highest: #26262E;
--color-surface-container-lowest: #0A0A0C;
--color-surface-variant: #1F1F25;
--color-background: #0A0A0C;
--color-outline: #5A5A62;
--color-outline-variant: #2A2A30;
--color-secondary: #8B95A8;
--color-secondary-container: #2A2F3A;
--color-tertiary: #C5A572;
--color-tertiary-container: #2A241A;
--color-error: #E5484D;
--color-error-container: #3A1517;
--color-on-error-container: #FECDCD;
--color-inverse-surface: #ECECEE;
--color-inverse-on-surface: #14140C;
--color-inverse-primary: #8E7547;
--color-success: #2EA86E;
--color-warning: #E5A23E;
--font-headline: 'Manrope', sans-serif;
--font-body: 'Inter', sans-serif;
--font-label: 'Inter', sans-serif;
--font-mono: 'JetBrains Mono', monospace;
}
/* ─── Semantic Aliases — DEFAULT IS DARK (Heicode Premium Black) ─── */
:root,
[data-theme="dark"] {
color-scheme: dark;
/* Layout dimensions */
--sidebar-width: 280px;
--sidebar-rail-width: 72px;
--titlebar-height: 40px;
--statusbar-height: 36px;
--motion-sidebar-duration: 280ms;
--motion-sidebar-easing: cubic-bezier(0.22, 1, 0.36, 1);
/* Surface aliases */
--color-surface-sidebar: #101014;
--color-surface-hover: var(--color-surface-container-high);
--color-surface-selected: var(--color-surface-container-highest);
--color-model-option-selected-bg: rgba(197, 165, 114, 0.10);
--color-model-option-selected-border: rgba(197, 165, 114, 0.32);
--color-sidebar-filter-bg: rgba(255, 255, 255, 0.02);
--color-sidebar-filter-border: rgba(255, 255, 255, 0.06);
--color-sidebar-filter-icon-bg: transparent;
--color-sidebar-search-bg: rgba(255, 255, 255, 0.03);
--color-sidebar-search-border: rgba(255, 255, 255, 0.06);
--color-sidebar-item-hover: rgba(255, 255, 255, 0.04);
--color-sidebar-item-active: rgba(255, 255, 255, 0.07);
--color-sidebar-item-active-border: rgba(197, 165, 114, 0.18);
--sidebar-panel-bg-image:
radial-gradient(circle at top left, rgba(197, 165, 114, 0.04), transparent 38%),
linear-gradient(180deg, rgba(255, 255, 255, 0.015), rgba(255, 255, 255, 0));
/* Border aliases */
--color-border: rgba(255, 255, 255, 0.08);
--color-border-hi: rgba(255, 255, 255, 0.14);
--color-border-focus: var(--color-primary);
--color-border-separator: rgba(255, 255, 255, 0.06);
/* Text aliases */
--color-text-primary: var(--color-on-surface);
--color-text-secondary: var(--color-on-surface-variant);
--color-text-tertiary: #8B8B92;
/* Info surface */
--color-surface-info: rgba(20, 20, 24, 0.88);
/* Brand & accents */
--color-brand: var(--color-primary);
--color-text-accent: var(--color-primary);
/* Shadows — soft ambient, deeper for floaty cards */
--shadow-dropdown: 0 8px 24px rgba(0, 0, 0, 0.40), 0 24px 60px rgba(0, 0, 0, 0.50);
--shadow-sidebar-filter: none;
--shadow-focus-ring: 0 0 0 1px rgba(197, 165, 114, 0.40);
--shadow-error-ring: 0 0 0 1px rgba(229, 72, 77, 0.32);
--shadow-button-primary: 0 6px 20px rgba(197, 165, 114, 0.18);
/* Button colors — solid gold, no garish gradient */
--color-btn-primary-fg: var(--color-on-primary);
--gradient-btn-primary: linear-gradient(180deg, var(--color-primary), var(--color-primary-container));
--gradient-btn-primary-hover: linear-gradient(180deg, var(--color-primary-fixed), var(--color-primary));
/* User message bubble */
--color-surface-user-msg: var(--color-surface-container-high);
/* Glass / overlays */
--color-overlay-scrim: rgba(0, 0, 0, 0.62);
--color-surface-glass: rgba(20, 20, 24, 0.78);
--color-surface-glass-border: rgba(255, 255, 255, 0.06);
/* Code + diff (dark) */
--color-code-bg: #0E0E12;
--color-code-fg: #D8D8DC;
--color-code-comment: #6B6B72;
--color-code-string: #98C97A;
--color-code-keyword: #C9A572;
--color-code-function: #82B0F0;
--color-code-number: #7DD3C0;
--color-code-property: #E5BB85;
--color-code-type: #C9A8E0;
--color-code-parameter: #D8D8DC;
--color-code-punctuation: #888892;
--color-code-inserted: #6FCB8B;
--color-code-deleted: #E5848A;
--color-diff-added-bg: rgba(46, 168, 110, 0.10);
--color-diff-added-word: rgba(46, 168, 110, 0.22);
--color-diff-added-gutter: rgba(46, 168, 110, 0.16);
--color-diff-added-text: #6FCB8B;
--color-diff-removed-bg: rgba(229, 72, 77, 0.10);
--color-diff-removed-word: rgba(229, 72, 77, 0.22);
--color-diff-removed-gutter: rgba(229, 72, 77, 0.16);
--color-diff-removed-text: #E5848A;
--color-diff-highlight-bg: rgba(197, 165, 114, 0.10);
--color-diff-highlight-gutter: rgba(197, 165, 114, 0.16);
--color-diff-title-bg: var(--color-surface-container-low);
--color-diff-title-color: var(--color-text-tertiary);
--color-diff-title-border: rgba(255, 255, 255, 0.06);
/* Terminal */
--color-terminal-header: #1A1A1F;
--color-terminal-bg: #0E0E12;
--color-terminal-border: #16161A;
--color-terminal-fg: #D8D8DC;
--color-terminal-muted: #6B6B72;
--color-terminal-accent: #6FCB8B;
--color-terminal-danger: #E5484D;
--color-terminal-warning: #E5A23E;
/* Misc */
--color-window-close-hover: #C63B44;
--color-selection-bg: rgba(197, 165, 114, 0.28);
--color-selection-fg: #ECECEE;
/* Radii */
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-xl: 16px;
--radius-full: 9999px;
}
/* ─── Optional Light Theme Override ─────────────────────────────── */
[data-theme="light"] {
color-scheme: light;
--color-primary: #8E7547;
--color-primary-container: #6F5A35;
--color-primary-fixed: #E0C896;
--color-primary-fixed-dim: #C5A572;
--color-on-primary: #FFFFFF;
--color-on-surface: #1B1B1F;
--color-on-surface-variant: #5A5A62;
--color-surface: #FAFAFB;
--color-surface-bright: #FFFFFF;
--color-surface-dim: #EEEEF0;
--color-surface-container: #F4F4F6;
--color-surface-container-low: #F8F8FA;
--color-surface-container-high: #ECECEF;
--color-surface-container-highest: #E5E5E8;
--color-surface-container-lowest: #FFFFFF;
--color-surface-variant: #ECECEF;
--color-background: #FAFAFB;
--color-outline: #8B8B92;
--color-outline-variant: rgba(0, 0, 0, 0.08);
--color-secondary: #5A6B82;
--color-secondary-container: #DDE3EC;
--color-tertiary: #8E7547;
--color-tertiary-container: #F0E5D0;
--color-error: #C92A30;
--color-error-container: #FCD9DA;
--color-on-error-container: #410002;
--color-inverse-surface: #1B1B1F;
--color-inverse-on-surface: #FAFAFB;
--color-inverse-primary: #C5A572;
--color-success: #2E9F69;
--color-warning: #C9881F;
--color-surface-sidebar: #F4F4F6;
--color-surface-hover: var(--color-surface-container-high);
--color-surface-selected: var(--color-surface-container);
--color-model-option-selected-bg: rgba(142, 117, 71, 0.10);
--color-model-option-selected-border: rgba(142, 117, 71, 0.28);
--color-sidebar-filter-bg: transparent;
--color-sidebar-filter-border: rgba(0, 0, 0, 0.08);
--color-sidebar-filter-icon-bg: transparent;
--color-sidebar-search-bg: rgba(255, 255, 255, 0.85);
--color-sidebar-search-border: rgba(0, 0, 0, 0.08);
--color-sidebar-item-hover: rgba(0, 0, 0, 0.03);
--color-sidebar-item-active: rgba(0, 0, 0, 0.05);
--color-sidebar-item-active-border: rgba(142, 117, 71, 0.16);
--sidebar-panel-bg-image: none;
--color-border: rgba(0, 0, 0, 0.08);
--color-border-hi: rgba(0, 0, 0, 0.14);
--color-border-focus: var(--color-primary);
--color-border-separator: rgba(0, 0, 0, 0.06);
--color-text-primary: var(--color-on-surface);
--color-text-secondary: var(--color-on-surface-variant);
--color-text-tertiary: #8B8B92;
--color-surface-info: var(--color-surface-container-low);
--color-brand: var(--color-primary);
--color-text-accent: var(--color-secondary);
--shadow-dropdown: 0 4px 20px rgba(0, 0, 0, 0.04), 0 12px 40px rgba(0, 0, 0, 0.08);
--shadow-sidebar-filter: none;
--shadow-focus-ring: 0 0 0 1px rgba(142, 117, 71, 0.28);
--shadow-error-ring: 0 0 0 1px rgba(201, 42, 48, 0.20);
--shadow-button-primary: 0 6px 20px rgba(142, 117, 71, 0.20);
--color-btn-primary-fg: var(--color-on-primary);
--gradient-btn-primary: linear-gradient(180deg, var(--color-primary), var(--color-primary-container));
--gradient-btn-primary-hover: linear-gradient(180deg, var(--color-primary-fixed-dim), var(--color-primary));
--color-surface-user-msg: var(--color-surface-container);
--color-overlay-scrim: rgba(20, 20, 24, 0.50);
--color-surface-glass: rgba(255, 255, 255, 0.85);
--color-surface-glass-border: rgba(0, 0, 0, 0.06);
--color-code-bg: #FAFAFB;
--color-code-fg: #1B1B1F;
--color-code-comment: #6B6B72;
--color-code-string: #2E7A3E;
--color-code-keyword: #8E5530;
--color-code-function: #1D5A8C;
--color-code-number: #1B7A6A;
--color-code-property: #7A4E20;
--color-code-type: #5E3F8C;
--color-code-parameter: #1B1B1F;
--color-code-punctuation: #6B6B72;
--color-code-inserted: #2E9F69;
--color-code-deleted: #C92A30;
--color-diff-added-bg: #E8F5E2;
--color-diff-added-word: #B8E4A8;
--color-diff-added-gutter: #D4EDCA;
--color-diff-added-text: #2E9F69;
--color-diff-removed-bg: #FDECEA;
--color-diff-removed-word: #F5B8B4;
--color-diff-removed-gutter: #F9D4D0;
--color-diff-removed-text: #C92A30;
--color-diff-highlight-bg: #FFF5D6;
--color-diff-highlight-gutter: #FFECB3;
--color-diff-title-bg: var(--color-surface-container-low);
--color-diff-title-color: var(--color-text-tertiary);
--color-diff-title-border: rgba(0, 0, 0, 0.06);
--color-terminal-header: #2D2D2D;
--color-terminal-bg: #1E1E1E;
--color-terminal-border: #1A1A1A;
--color-terminal-fg: #D4D4D4;
--color-terminal-muted: #999999;
--color-terminal-accent: #28C840;
--color-terminal-danger: #FF5F57;
--color-terminal-warning: #FEBC2E;
--color-window-close-hover: #E81123;
--color-selection-bg: rgba(197, 165, 114, 0.30);
--color-selection-fg: #1B1B1F;
}
/* ─── Material Symbols ─────────────────────────────────────────── */
.material-symbols-outlined {
font-family: 'Material Symbols Outlined';
font-weight: normal;
font-style: normal;
font-size: 24px;
line-height: 1;
letter-spacing: normal;
text-transform: none;
display: inline-block;
white-space: nowrap;
word-wrap: normal;
direction: ltr;
-webkit-font-feature-settings: 'liga';
-webkit-font-smoothing: antialiased;
font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
vertical-align: middle;
}
/* ─── Base styles ──────────────────────────────────────────────── */
* {
box-sizing: border-box;
}
html, body, #root {
height: 100%;
margin: 0;
padding: 0;
font-family: var(--font-body);
color: var(--color-on-surface);
background-color: var(--color-background);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
::selection {
background: var(--color-selection-bg);
color: var(--color-selection-fg);
}
/* Tauri drag region */
[data-tauri-drag-region] {
-webkit-app-region: drag;
}
button, input, textarea, select, a, [role="button"] {
-webkit-app-region: no-drag;
}
[draggable="true"] {
-webkit-app-region: no-drag;
}
.tab-bar-hit-area,
.tab-bar-hit-area * {
-webkit-app-region: no-drag;
}
/* Custom shadow from prototype */
.custom-shadow {
box-shadow: var(--shadow-dropdown);
}
.glass-panel {
background: var(--color-surface-glass);
border: 1px solid var(--color-surface-glass-border);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
box-shadow: var(--shadow-dropdown);
}
.glass-panel:focus-within {
box-shadow: var(--shadow-focus-ring), var(--shadow-dropdown);
}
.sidebar-shell {
width: var(--sidebar-width);
flex-shrink: 0;
overflow: hidden;
transition: width var(--motion-sidebar-duration) var(--motion-sidebar-easing);
will-change: width;
}
.sidebar-shell[data-state="closed"] {
width: var(--sidebar-rail-width);
}
.sidebar-panel {
width: var(--sidebar-width);
min-width: var(--sidebar-width);
background-image: var(--sidebar-panel-bg-image);
background-repeat: no-repeat;
transition:
background-color var(--motion-sidebar-duration) var(--motion-sidebar-easing),
border-color var(--motion-sidebar-duration) var(--motion-sidebar-easing);
}
.sidebar-panel[data-state="closed"] {
width: var(--sidebar-rail-width);
min-width: var(--sidebar-rail-width);
}
.sidebar-toggle-button {
color: color-mix(in srgb, var(--color-text-secondary) 72%, transparent);
background: transparent;
transition:
color 180ms ease,
background-color 180ms ease,
transform 180ms ease;
border: 0;
box-shadow: none;
}
.sidebar-toggle-button:hover {
color: color-mix(in srgb, var(--color-text-primary) 88%, transparent);
background: color-mix(in srgb, var(--color-surface-hover) 34%, transparent);
}
.sidebar-toggle-button:active {
transform: translateY(0.5px);
background: color-mix(in srgb, var(--color-surface-hover) 54%, transparent);
}
.sidebar-toggle-button--open {
color: color-mix(in srgb, var(--color-text-secondary) 68%, transparent);
}
.sidebar-toggle-button--open:hover {
color: color-mix(in srgb, var(--color-text-primary) 82%, transparent);
}
.sidebar-toggle-button--collapsed {
color: color-mix(in srgb, var(--color-text-primary) 78%, transparent);
}
.sidebar-toggle-button--collapsed:hover {
color: var(--color-text-primary);
}
.sidebar-toggle-button--collapsed:active {
}
.sidebar-toggle-icon {
overflow: visible;
}
.sidebar-toggle-chevron {
stroke: currentColor;
transition:
opacity 180ms ease,
transform 180ms ease;
vector-effect: non-scaling-stroke;
}
.sidebar-toggle-chevron {
opacity: 0.95;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 1.85;
transform-origin: 50% 50%;
}
.sidebar-toggle-icon--open .sidebar-toggle-chevron {
transform: translateX(-0.2px);
}
.sidebar-toggle-button--collapsed .sidebar-toggle-chevron {
stroke-width: 2;
transform: translateX(0.4px);
}
.sidebar-copy {
overflow: hidden;
white-space: nowrap;
transition:
max-width var(--motion-sidebar-duration) var(--motion-sidebar-easing),
opacity calc(var(--motion-sidebar-duration) - 40ms) ease,
transform var(--motion-sidebar-duration) var(--motion-sidebar-easing);
}
.sidebar-copy--visible {
max-width: 240px;
opacity: 1;
transform: translateX(0);
}
.sidebar-copy--hidden {
max-width: 0;
opacity: 0;
transform: translateX(-10px);
}
.sidebar-section {
overflow: hidden;
transition:
max-height var(--motion-sidebar-duration) var(--motion-sidebar-easing),
opacity calc(var(--motion-sidebar-duration) - 40ms) ease,
transform var(--motion-sidebar-duration) var(--motion-sidebar-easing);
}
.sidebar-section--visible {
max-height: 1200px;
opacity: 1;
transform: translateX(0);
}
.sidebar-section--hidden {
max-height: 0;
opacity: 0;
transform: translateX(-12px);
pointer-events: none;
}
@media (prefers-reduced-motion: reduce) {
.sidebar-shell,
.sidebar-panel,
.sidebar-copy,
.sidebar-section {
transition-duration: 0.01ms !important;
}
}
.markdown-prose .md-table-wrap table {
border-collapse: separate;
border-spacing: 0;
}
.markdown-prose .md-table-wrap tbody tr:last-child td {
border-bottom: 0;
}
.markdown-prose a code {
color: inherit;
}
/* Scrollbar — thin, subtle, premium */
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
background: color-mix(in srgb, var(--color-outline) 30%, transparent);
border-radius: 9999px;
border: 2px solid transparent;
background-clip: padding-box;
transition: background 160ms ease;
}
::-webkit-scrollbar-thumb:hover {
background: color-mix(in srgb, var(--color-outline) 60%, transparent);
background-clip: padding-box;
}
::-webkit-scrollbar-corner { background: transparent; }
.sidebar-scroll-area {
scrollbar-width: thin;
scrollbar-color: color-mix(in srgb, var(--color-outline) 72%, transparent) transparent;
}
.sidebar-scroll-area::-webkit-scrollbar {
width: 4px;
}
.sidebar-scroll-area::-webkit-scrollbar-track {
background: transparent;
}
.sidebar-scroll-area::-webkit-scrollbar-thumb {
background: color-mix(in srgb, var(--color-outline) 78%, transparent);
border-radius: 9999px;
}
.sidebar-scroll-area::-webkit-scrollbar-thumb:hover {
background: color-mix(in srgb, var(--color-outline) 92%, transparent);
}
/* Animations */
@keyframes shimmer {
0%, 100% { opacity: 0.4; }
50% { opacity: 1; }
}
@keyframes spin {
to { transform: rotate(360deg); }
}
@keyframes pulse-dot {
0%, 100% { opacity: 1; }
50% { opacity: 0.3; }
}
.animate-shimmer { animation: shimmer 1.5s ease-in-out infinite; }
.animate-spin { animation: spin 1s linear infinite; }
.animate-pulse-dot { animation: pulse-dot 1.5s ease-in-out infinite; }
/* Progress bar */
@keyframes progress-fill {
from { width: 0%; }
}