794 lines
18 KiB
Rust
794 lines
18 KiB
Rust
/// Catppuccin Mocha palette + CSS custom property generation.
|
|
///
|
|
/// All UI colors flow through --ctp-* CSS custom properties.
|
|
/// Components NEVER hardcode colors — they reference these variables.
|
|
|
|
/// Catppuccin Mocha color palette — hex values.
|
|
pub struct CatppuccinMocha;
|
|
|
|
impl CatppuccinMocha {
|
|
// Base colors
|
|
pub const BASE: &str = "#1e1e2e";
|
|
pub const MANTLE: &str = "#181825";
|
|
pub const CRUST: &str = "#11111b";
|
|
|
|
// Surface colors
|
|
pub const SURFACE0: &str = "#313244";
|
|
pub const SURFACE1: &str = "#45475a";
|
|
pub const SURFACE2: &str = "#585b70";
|
|
|
|
// Overlay colors
|
|
pub const OVERLAY0: &str = "#6c7086";
|
|
pub const OVERLAY1: &str = "#7f849c";
|
|
pub const OVERLAY2: &str = "#9399b2";
|
|
|
|
// Text colors
|
|
pub const SUBTEXT0: &str = "#a6adc8";
|
|
pub const SUBTEXT1: &str = "#bac2de";
|
|
pub const TEXT: &str = "#cdd6f4";
|
|
|
|
// Accent colors
|
|
pub const ROSEWATER: &str = "#f5e0dc";
|
|
pub const FLAMINGO: &str = "#f2cdcd";
|
|
pub const PINK: &str = "#f5c2e7";
|
|
pub const MAUVE: &str = "#cba6f7";
|
|
pub const RED: &str = "#f38ba8";
|
|
pub const MAROON: &str = "#eba0ac";
|
|
pub const PEACH: &str = "#fab387";
|
|
pub const YELLOW: &str = "#f9e2af";
|
|
pub const GREEN: &str = "#a6e3a1";
|
|
pub const TEAL: &str = "#94e2d5";
|
|
pub const SKY: &str = "#89dceb";
|
|
pub const SAPPHIRE: &str = "#74c7ec";
|
|
pub const BLUE: &str = "#89b4fa";
|
|
pub const LAVENDER: &str = "#b4befe";
|
|
}
|
|
|
|
/// Generate complete CSS stylesheet with Catppuccin Mocha custom properties
|
|
/// and base layout styles.
|
|
pub fn generate_css() -> String {
|
|
format!(
|
|
r#"
|
|
/* === Catppuccin Mocha CSS Custom Properties === */
|
|
:root {{
|
|
/* Base */
|
|
--ctp-base: {base};
|
|
--ctp-mantle: {mantle};
|
|
--ctp-crust: {crust};
|
|
|
|
/* Surface */
|
|
--ctp-surface0: {surface0};
|
|
--ctp-surface1: {surface1};
|
|
--ctp-surface2: {surface2};
|
|
|
|
/* Overlay */
|
|
--ctp-overlay0: {overlay0};
|
|
--ctp-overlay1: {overlay1};
|
|
--ctp-overlay2: {overlay2};
|
|
|
|
/* Text */
|
|
--ctp-subtext0: {subtext0};
|
|
--ctp-subtext1: {subtext1};
|
|
--ctp-text: {text};
|
|
|
|
/* Accents */
|
|
--ctp-rosewater: {rosewater};
|
|
--ctp-flamingo: {flamingo};
|
|
--ctp-pink: {pink};
|
|
--ctp-mauve: {mauve};
|
|
--ctp-red: {red};
|
|
--ctp-maroon: {maroon};
|
|
--ctp-peach: {peach};
|
|
--ctp-yellow: {yellow};
|
|
--ctp-green: {green};
|
|
--ctp-teal: {teal};
|
|
--ctp-sky: {sky};
|
|
--ctp-sapphire: {sapphire};
|
|
--ctp-blue: {blue};
|
|
--ctp-lavender: {lavender};
|
|
|
|
/* Typography */
|
|
--ui-font-family: 'Inter', system-ui, -apple-system, sans-serif;
|
|
--ui-font-size: 0.875rem;
|
|
--term-font-family: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace;
|
|
--term-font-size: 0.8125rem;
|
|
}}
|
|
|
|
/* === Global Reset === */
|
|
*, *::before, *::after {{
|
|
box-sizing: border-box;
|
|
margin: 0;
|
|
padding: 0;
|
|
}}
|
|
|
|
body {{
|
|
font-family: var(--ui-font-family);
|
|
font-size: var(--ui-font-size);
|
|
color: var(--ctp-text);
|
|
background: var(--ctp-base);
|
|
overflow: hidden;
|
|
height: 100vh;
|
|
width: 100vw;
|
|
}}
|
|
|
|
#main {{
|
|
height: 100vh;
|
|
width: 100vw;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}}
|
|
|
|
/* === Scrollbar Styling === */
|
|
::-webkit-scrollbar {{
|
|
width: 0.5rem;
|
|
height: 0.5rem;
|
|
}}
|
|
::-webkit-scrollbar-track {{
|
|
background: var(--ctp-mantle);
|
|
}}
|
|
::-webkit-scrollbar-thumb {{
|
|
background: var(--ctp-surface1);
|
|
border-radius: 0.25rem;
|
|
}}
|
|
::-webkit-scrollbar-thumb:hover {{
|
|
background: var(--ctp-surface2);
|
|
}}
|
|
|
|
/* === Layout Classes === */
|
|
.app-shell {{
|
|
display: flex;
|
|
flex-direction: column;
|
|
height: 100vh;
|
|
width: 100vw;
|
|
overflow: hidden;
|
|
}}
|
|
|
|
.app-body {{
|
|
display: flex;
|
|
flex: 1;
|
|
overflow: hidden;
|
|
min-height: 0;
|
|
}}
|
|
|
|
/* === Sidebar === */
|
|
.sidebar-rail {{
|
|
width: 2.75rem;
|
|
background: var(--ctp-crust);
|
|
border-right: 1px solid var(--ctp-surface0);
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
padding-top: 0.75rem;
|
|
gap: 0.5rem;
|
|
flex-shrink: 0;
|
|
}}
|
|
|
|
.sidebar-icon {{
|
|
width: 2rem;
|
|
height: 2rem;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
border-radius: 0.375rem;
|
|
cursor: pointer;
|
|
color: var(--ctp-overlay1);
|
|
transition: all 0.15s ease;
|
|
font-size: 1rem;
|
|
}}
|
|
.sidebar-icon:hover {{
|
|
background: var(--ctp-surface0);
|
|
color: var(--ctp-text);
|
|
}}
|
|
.sidebar-icon.active {{
|
|
background: var(--ctp-surface0);
|
|
color: var(--ctp-blue);
|
|
}}
|
|
|
|
.sidebar-spacer {{
|
|
flex: 1;
|
|
}}
|
|
|
|
/* === Drawer Panel === */
|
|
.drawer-panel {{
|
|
width: 18rem;
|
|
background: var(--ctp-mantle);
|
|
border-right: 1px solid var(--ctp-surface0);
|
|
overflow-y: auto;
|
|
padding: 1rem;
|
|
flex-shrink: 0;
|
|
}}
|
|
|
|
.drawer-title {{
|
|
font-size: 0.8125rem;
|
|
font-weight: 600;
|
|
color: var(--ctp-subtext1);
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.05em;
|
|
margin-bottom: 1rem;
|
|
}}
|
|
|
|
/* === Project Grid === */
|
|
.project-grid {{
|
|
flex: 1;
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(28rem, 1fr));
|
|
gap: 0.75rem;
|
|
padding: 0.75rem;
|
|
overflow-y: auto;
|
|
align-content: start;
|
|
}}
|
|
|
|
/* === Project Box === */
|
|
.project-box {{
|
|
background: var(--ctp-mantle);
|
|
border: 1px solid var(--ctp-surface0);
|
|
border-radius: 0.5rem;
|
|
display: flex;
|
|
flex-direction: column;
|
|
min-height: 20rem;
|
|
max-height: 40rem;
|
|
overflow: hidden;
|
|
}}
|
|
|
|
.project-header {{
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
padding: 0.5rem 0.75rem;
|
|
background: var(--ctp-crust);
|
|
border-bottom: 1px solid var(--ctp-surface0);
|
|
border-radius: 0.5rem 0.5rem 0 0;
|
|
flex-shrink: 0;
|
|
}}
|
|
|
|
.project-header .status-dot {{
|
|
width: 8px;
|
|
height: 8px;
|
|
border-radius: 50%;
|
|
flex-shrink: 0;
|
|
}}
|
|
.status-dot.running {{
|
|
background: var(--ctp-green);
|
|
box-shadow: 0 0 6px var(--ctp-green);
|
|
}}
|
|
.status-dot.idle {{
|
|
background: var(--ctp-overlay0);
|
|
}}
|
|
.status-dot.stalled {{
|
|
background: var(--ctp-peach);
|
|
}}
|
|
|
|
/* PulsingDot component classes */
|
|
.pulsing-dot {{
|
|
display: inline-block;
|
|
border-radius: 50%;
|
|
flex-shrink: 0;
|
|
}}
|
|
.dot-running {{
|
|
background: var(--ctp-green);
|
|
box-shadow: 0 0 6px var(--ctp-green);
|
|
}}
|
|
.dot-idle {{
|
|
background: var(--ctp-overlay0);
|
|
}}
|
|
.dot-stalled {{
|
|
background: var(--ctp-peach);
|
|
box-shadow: 0 0 4px var(--ctp-peach);
|
|
}}
|
|
.dot-done {{
|
|
background: var(--ctp-blue);
|
|
}}
|
|
.dot-error {{
|
|
background: var(--ctp-red);
|
|
box-shadow: 0 0 4px var(--ctp-red);
|
|
}}
|
|
/* PulsingDot: 6-step color fade, no CSS transition (zero animation engine overhead) */
|
|
.pulsing-dot {{ display: inline-block; border-radius: 50%; flex-shrink: 0; }}
|
|
/* Running: green (#a6e3a1) → surface2 (#585b70) in 6 steps */
|
|
.dot-running.dot-s0 {{ background: #a6e3a1; box-shadow: 0 0 6px #a6e3a1; }}
|
|
.dot-running.dot-s1 {{ background: #8ec094; box-shadow: 0 0 3px #8ec094; }}
|
|
.dot-running.dot-s2 {{ background: #769d87; box-shadow: none; }}
|
|
.dot-running.dot-s3 {{ background: #6a8a7c; box-shadow: none; }}
|
|
.dot-running.dot-s4 {{ background: #769d87; box-shadow: none; }}
|
|
.dot-running.dot-s5 {{ background: #8ec094; box-shadow: 0 0 3px #8ec094; }}
|
|
/* Stalled: peach (#fab387) → surface2 in 6 steps */
|
|
.dot-stalled.dot-s0 {{ background: #fab387; box-shadow: 0 0 4px #fab387; }}
|
|
.dot-stalled.dot-s1 {{ background: #d9a07c; box-shadow: none; }}
|
|
.dot-stalled.dot-s2 {{ background: #b88d71; box-shadow: none; }}
|
|
.dot-stalled.dot-s3 {{ background: #a88068; box-shadow: none; }}
|
|
.dot-stalled.dot-s4 {{ background: #b88d71; box-shadow: none; }}
|
|
.dot-stalled.dot-s5 {{ background: #d9a07c; box-shadow: none; }}
|
|
.status-dot.error {{
|
|
background: var(--ctp-red);
|
|
}}
|
|
|
|
.project-name {{
|
|
font-weight: 600;
|
|
font-size: 0.875rem;
|
|
color: var(--ctp-text);
|
|
flex: 1;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}}
|
|
|
|
.project-cwd {{
|
|
font-size: 0.6875rem;
|
|
color: var(--ctp-overlay0);
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
direction: rtl;
|
|
max-width: 12rem;
|
|
}}
|
|
|
|
/* === Tab Bar === */
|
|
.tab-bar {{
|
|
display: flex;
|
|
gap: 0;
|
|
background: var(--ctp-crust);
|
|
border-bottom: 1px solid var(--ctp-surface0);
|
|
flex-shrink: 0;
|
|
}}
|
|
|
|
.tab {{
|
|
padding: 0.375rem 0.75rem;
|
|
font-size: 0.75rem;
|
|
color: var(--ctp-overlay1);
|
|
cursor: pointer;
|
|
border-bottom: 2px solid transparent;
|
|
transition: all 0.15s ease;
|
|
user-select: none;
|
|
}}
|
|
.tab:hover {{
|
|
color: var(--ctp-text);
|
|
background: var(--ctp-surface0);
|
|
}}
|
|
.tab.active {{
|
|
color: var(--ctp-blue);
|
|
border-bottom-color: var(--ctp-blue);
|
|
}}
|
|
|
|
/* === Tab Content === */
|
|
.tab-content {{
|
|
flex: 1;
|
|
overflow: hidden;
|
|
display: flex;
|
|
flex-direction: column;
|
|
min-height: 0;
|
|
}}
|
|
|
|
/* === Agent Pane === */
|
|
.agent-pane {{
|
|
display: flex;
|
|
flex-direction: column;
|
|
flex: 1;
|
|
min-height: 0;
|
|
}}
|
|
|
|
.message-list {{
|
|
flex: 1;
|
|
overflow-y: auto;
|
|
padding: 0.5rem 0.75rem;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.5rem;
|
|
}}
|
|
|
|
.message {{
|
|
padding: 0.5rem 0.75rem;
|
|
border-radius: 0.375rem;
|
|
font-size: 0.8125rem;
|
|
line-height: 1.5;
|
|
word-wrap: break-word;
|
|
}}
|
|
.message.user {{
|
|
background: color-mix(in srgb, var(--ctp-blue) 12%, transparent);
|
|
border-left: 3px solid var(--ctp-blue);
|
|
}}
|
|
.message.assistant {{
|
|
background: color-mix(in srgb, var(--ctp-mauve) 8%, transparent);
|
|
border-left: 3px solid var(--ctp-mauve);
|
|
}}
|
|
.message.tool {{
|
|
background: color-mix(in srgb, var(--ctp-teal) 8%, transparent);
|
|
border-left: 3px solid var(--ctp-teal);
|
|
font-family: var(--term-font-family);
|
|
font-size: 0.75rem;
|
|
}}
|
|
|
|
.message-role {{
|
|
font-size: 0.6875rem;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.05em;
|
|
margin-bottom: 0.25rem;
|
|
}}
|
|
.message.user .message-role {{ color: var(--ctp-blue); }}
|
|
.message.assistant .message-role {{ color: var(--ctp-mauve); }}
|
|
.message.tool .message-role {{ color: var(--ctp-teal); }}
|
|
|
|
.message-text {{
|
|
color: var(--ctp-text);
|
|
}}
|
|
|
|
.tool-details {{
|
|
margin-top: 0.25rem;
|
|
}}
|
|
.tool-details summary {{
|
|
cursor: pointer;
|
|
color: var(--ctp-overlay1);
|
|
font-size: 0.6875rem;
|
|
user-select: none;
|
|
}}
|
|
.tool-details summary:hover {{
|
|
color: var(--ctp-text);
|
|
}}
|
|
.tool-output {{
|
|
margin-top: 0.375rem;
|
|
padding: 0.375rem 0.5rem;
|
|
background: var(--ctp-crust);
|
|
border-radius: 0.25rem;
|
|
font-family: var(--term-font-family);
|
|
font-size: 0.6875rem;
|
|
color: var(--ctp-subtext0);
|
|
white-space: pre-wrap;
|
|
max-height: 10rem;
|
|
overflow-y: auto;
|
|
}}
|
|
|
|
/* === Prompt Input === */
|
|
.prompt-bar {{
|
|
display: flex;
|
|
gap: 0.5rem;
|
|
padding: 0.5rem 0.75rem;
|
|
background: var(--ctp-crust);
|
|
border-top: 1px solid var(--ctp-surface0);
|
|
align-items: center;
|
|
flex-shrink: 0;
|
|
}}
|
|
|
|
.prompt-input {{
|
|
flex: 1;
|
|
background: var(--ctp-surface0);
|
|
border: 1px solid var(--ctp-surface1);
|
|
border-radius: 0.375rem;
|
|
padding: 0.4375rem 0.75rem;
|
|
color: var(--ctp-text);
|
|
font-family: var(--ui-font-family);
|
|
font-size: 0.8125rem;
|
|
outline: none;
|
|
transition: border-color 0.15s ease;
|
|
}}
|
|
.prompt-input:focus {{
|
|
border-color: var(--ctp-blue);
|
|
}}
|
|
.prompt-input::placeholder {{
|
|
color: var(--ctp-overlay0);
|
|
}}
|
|
|
|
.prompt-send {{
|
|
background: var(--ctp-blue);
|
|
color: var(--ctp-crust);
|
|
border: none;
|
|
border-radius: 0.375rem;
|
|
padding: 0.4375rem 0.75rem;
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
cursor: pointer;
|
|
transition: opacity 0.15s ease;
|
|
}}
|
|
.prompt-send:hover {{
|
|
opacity: 0.85;
|
|
}}
|
|
.prompt-send:disabled {{
|
|
opacity: 0.4;
|
|
cursor: not-allowed;
|
|
}}
|
|
|
|
/* === Agent Status Strip === */
|
|
.agent-status {{
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
padding: 0.25rem 0.75rem;
|
|
background: var(--ctp-crust);
|
|
border-top: 1px solid var(--ctp-surface0);
|
|
font-size: 0.6875rem;
|
|
color: var(--ctp-overlay1);
|
|
flex-shrink: 0;
|
|
}}
|
|
|
|
.status-badge {{
|
|
padding: 0.125rem 0.375rem;
|
|
border-radius: 0.25rem;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
font-size: 0.625rem;
|
|
letter-spacing: 0.05em;
|
|
}}
|
|
.status-badge.idle {{
|
|
background: color-mix(in srgb, var(--ctp-overlay0) 20%, transparent);
|
|
color: var(--ctp-overlay1);
|
|
}}
|
|
.status-badge.running {{
|
|
background: color-mix(in srgb, var(--ctp-green) 20%, transparent);
|
|
color: var(--ctp-green);
|
|
}}
|
|
.status-badge.done {{
|
|
background: color-mix(in srgb, var(--ctp-blue) 20%, transparent);
|
|
color: var(--ctp-blue);
|
|
}}
|
|
.status-badge.error {{
|
|
background: color-mix(in srgb, var(--ctp-red) 20%, transparent);
|
|
color: var(--ctp-red);
|
|
}}
|
|
|
|
/* === Terminal Area === */
|
|
.terminal-area {{
|
|
background: var(--ctp-crust);
|
|
border-top: 1px solid var(--ctp-surface0);
|
|
height: 8rem;
|
|
overflow-y: auto;
|
|
padding: 0.5rem;
|
|
font-family: var(--term-font-family);
|
|
font-size: var(--term-font-size);
|
|
color: var(--ctp-green);
|
|
flex-shrink: 0;
|
|
}}
|
|
|
|
.terminal-line {{
|
|
line-height: 1.4;
|
|
white-space: pre-wrap;
|
|
}}
|
|
.terminal-prompt {{
|
|
color: var(--ctp-blue);
|
|
}}
|
|
.terminal-output {{
|
|
color: var(--ctp-subtext0);
|
|
}}
|
|
|
|
/* === Status Bar === */
|
|
.status-bar {{
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 0.25rem 0.75rem;
|
|
background: var(--ctp-crust);
|
|
border-top: 1px solid var(--ctp-surface0);
|
|
font-size: 0.6875rem;
|
|
color: var(--ctp-overlay1);
|
|
flex-shrink: 0;
|
|
height: 1.5rem;
|
|
}}
|
|
|
|
.status-bar-left,
|
|
.status-bar-right {{
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 1rem;
|
|
}}
|
|
|
|
.status-item {{
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.25rem;
|
|
}}
|
|
|
|
.status-count {{
|
|
font-weight: 600;
|
|
}}
|
|
.status-count.running {{ color: var(--ctp-green); }}
|
|
.status-count.idle {{ color: var(--ctp-overlay1); }}
|
|
.status-count.stalled {{ color: var(--ctp-peach); }}
|
|
|
|
.status-cost {{
|
|
color: var(--ctp-yellow);
|
|
font-weight: 600;
|
|
}}
|
|
|
|
/* === Settings Panel === */
|
|
.settings-section {{
|
|
margin-bottom: 1.5rem;
|
|
}}
|
|
|
|
.settings-section-title {{
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
color: var(--ctp-subtext0);
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.05em;
|
|
margin-bottom: 0.75rem;
|
|
padding-bottom: 0.375rem;
|
|
border-bottom: 1px solid var(--ctp-surface0);
|
|
}}
|
|
|
|
.settings-row {{
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 0.375rem 0;
|
|
font-size: 0.8125rem;
|
|
}}
|
|
|
|
.settings-label {{
|
|
color: var(--ctp-subtext1);
|
|
}}
|
|
|
|
.settings-value {{
|
|
color: var(--ctp-text);
|
|
font-weight: 500;
|
|
}}
|
|
|
|
.settings-select {{
|
|
background: var(--ctp-surface0);
|
|
border: 1px solid var(--ctp-surface1);
|
|
border-radius: 0.25rem;
|
|
padding: 0.25rem 0.5rem;
|
|
color: var(--ctp-text);
|
|
font-size: 0.75rem;
|
|
outline: none;
|
|
}}
|
|
.settings-select:focus {{
|
|
border-color: var(--ctp-blue);
|
|
}}
|
|
|
|
/* === Command Palette === */
|
|
.palette-overlay {{
|
|
position: fixed;
|
|
inset: 0;
|
|
background: rgba(0, 0, 0, 0.5);
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: center;
|
|
padding-top: 20vh;
|
|
z-index: 1000;
|
|
}}
|
|
|
|
.palette-box {{
|
|
width: 32rem;
|
|
max-width: 90vw;
|
|
background: var(--ctp-mantle);
|
|
border: 1px solid var(--ctp-surface0);
|
|
border-radius: 0.5rem;
|
|
box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.4);
|
|
overflow: hidden;
|
|
}}
|
|
|
|
.palette-input {{
|
|
width: 100%;
|
|
padding: 0.75rem 1rem;
|
|
background: transparent;
|
|
border: none;
|
|
border-bottom: 1px solid var(--ctp-surface0);
|
|
color: var(--ctp-text);
|
|
font-family: var(--ui-font-family);
|
|
font-size: 0.9375rem;
|
|
outline: none;
|
|
}}
|
|
.palette-input::placeholder {{
|
|
color: var(--ctp-overlay0);
|
|
}}
|
|
|
|
.palette-results {{
|
|
max-height: 20rem;
|
|
overflow-y: auto;
|
|
}}
|
|
|
|
.palette-item {{
|
|
padding: 0.5rem 1rem;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.75rem;
|
|
cursor: pointer;
|
|
transition: background 0.1s ease;
|
|
}}
|
|
.palette-item:hover, .palette-item.selected {{
|
|
background: var(--ctp-surface0);
|
|
}}
|
|
|
|
.palette-item-icon {{
|
|
color: var(--ctp-overlay1);
|
|
font-size: 0.875rem;
|
|
width: 1.25rem;
|
|
text-align: center;
|
|
}}
|
|
|
|
.palette-item-label {{
|
|
color: var(--ctp-text);
|
|
font-size: 0.8125rem;
|
|
}}
|
|
|
|
.palette-item-shortcut {{
|
|
margin-left: auto;
|
|
font-size: 0.6875rem;
|
|
color: var(--ctp-overlay0);
|
|
font-family: var(--term-font-family);
|
|
}}
|
|
|
|
/* === Docs Tab === */
|
|
.docs-pane {{
|
|
padding: 0.75rem;
|
|
overflow-y: auto;
|
|
flex: 1;
|
|
}}
|
|
.docs-entry {{
|
|
padding: 0.375rem 0.5rem;
|
|
border-radius: 0.25rem;
|
|
cursor: pointer;
|
|
color: var(--ctp-subtext1);
|
|
font-size: 0.8125rem;
|
|
transition: background 0.1s ease;
|
|
}}
|
|
.docs-entry:hover {{
|
|
background: var(--ctp-surface0);
|
|
color: var(--ctp-text);
|
|
}}
|
|
|
|
/* === Files Tab === */
|
|
.files-pane {{
|
|
padding: 0.75rem;
|
|
overflow-y: auto;
|
|
flex: 1;
|
|
}}
|
|
.file-tree-item {{
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.375rem;
|
|
padding: 0.25rem 0.5rem;
|
|
border-radius: 0.25rem;
|
|
cursor: pointer;
|
|
color: var(--ctp-subtext1);
|
|
font-size: 0.75rem;
|
|
font-family: var(--term-font-family);
|
|
}}
|
|
.file-tree-item:hover {{
|
|
background: var(--ctp-surface0);
|
|
color: var(--ctp-text);
|
|
}}
|
|
.file-tree-icon {{
|
|
color: var(--ctp-overlay0);
|
|
width: 1rem;
|
|
text-align: center;
|
|
}}
|
|
|
|
/* === Provider Badge === */
|
|
.provider-badge {{
|
|
font-size: 0.5625rem;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.05em;
|
|
padding: 0.0625rem 0.3125rem;
|
|
border-radius: 0.1875rem;
|
|
background: color-mix(in srgb, var(--ctp-mauve) 15%, transparent);
|
|
color: var(--ctp-mauve);
|
|
}}
|
|
"#,
|
|
base = CatppuccinMocha::BASE,
|
|
mantle = CatppuccinMocha::MANTLE,
|
|
crust = CatppuccinMocha::CRUST,
|
|
surface0 = CatppuccinMocha::SURFACE0,
|
|
surface1 = CatppuccinMocha::SURFACE1,
|
|
surface2 = CatppuccinMocha::SURFACE2,
|
|
overlay0 = CatppuccinMocha::OVERLAY0,
|
|
overlay1 = CatppuccinMocha::OVERLAY1,
|
|
overlay2 = CatppuccinMocha::OVERLAY2,
|
|
subtext0 = CatppuccinMocha::SUBTEXT0,
|
|
subtext1 = CatppuccinMocha::SUBTEXT1,
|
|
text = CatppuccinMocha::TEXT,
|
|
rosewater = CatppuccinMocha::ROSEWATER,
|
|
flamingo = CatppuccinMocha::FLAMINGO,
|
|
pink = CatppuccinMocha::PINK,
|
|
mauve = CatppuccinMocha::MAUVE,
|
|
red = CatppuccinMocha::RED,
|
|
maroon = CatppuccinMocha::MAROON,
|
|
peach = CatppuccinMocha::PEACH,
|
|
yellow = CatppuccinMocha::YELLOW,
|
|
green = CatppuccinMocha::GREEN,
|
|
teal = CatppuccinMocha::TEAL,
|
|
sky = CatppuccinMocha::SKY,
|
|
sapphire = CatppuccinMocha::SAPPHIRE,
|
|
blue = CatppuccinMocha::BLUE,
|
|
lavender = CatppuccinMocha::LAVENDER,
|
|
)
|
|
}
|