Files
vesper/src/styles.css

1687 lines
35 KiB
CSS

@import "@fontsource-variable/inter";
@import "@fontsource-variable/jetbrains-mono";
@import "tailwindcss";
@plugin "daisyui";
@plugin "@tailwindcss/typography";
@plugin "daisyui/theme" {
name: "vesper";
default: true;
prefersdark: true;
color-scheme: dark;
--color-base-100: #2D323B;
--color-base-200: #282C33;
--color-base-300: #1E2128;
--color-base-content: #E4E6EB;
--color-primary: #6B8AFF;
--color-primary-content: #1E2128;
--color-secondary: #9F7AEA;
--color-secondary-content: #1E2128;
--color-accent: #38BDF8;
--color-accent-content: #1E2128;
--color-neutral: #3D4350;
--color-neutral-content: #E4E6EB;
--color-info: #6B8AFF;
--color-info-content: #1E2128;
--color-success: #4ADE80;
--color-success-content: #1E2128;
--color-warning: #FBBF24;
--color-warning-content: #1E2128;
--color-error: #F87171;
--color-error-content: #1E2128;
}
/* Custom properties */
:root {
/* Surface System - centered on #282C33 */
--color-bg-base: #282C33;
--color-bg-surface: #252A31;
--color-bg-elevated: #2D333C;
--color-bg-overlay: #333942;
--color-bg-hover: #363D48;
--color-bg-active: #404754;
/* Text hierarchy */
--color-text-primary: #E4E6EB;
--color-text-secondary: #BCC1C8; /* was #ABB0B8, now ~7.5:1 */
--color-text-tertiary: #8B919A; /* was #6B7280, now ~4.8:1 */
--color-text-disabled: #6B7280; /* was #4A5260, now ~2.9:1 (exempt - inactive UI) */
/* Accent */
--color-accent: #6B8AFF;
--color-accent-hover: #8BA3FF;
--color-accent-small: #8BA3FF; /* for small text (11px) accent uses */
--color-accent-muted: rgba(107, 138, 255, 0.12);
--color-accent-subtle: rgba(107, 138, 255, 0.06);
/* Markdown typography */
--color-md-h1: #F5F6F7;
--color-md-h2: #EDEEF0;
--color-md-h3: #E4E5E8;
--color-md-h4: #D8DADE;
--color-md-h5: #CBCED3;
--color-md-h6: #BCC1C8;
--color-md-heading: #F0F1F3;
--color-md-paragraph: #C8CCD0;
--color-md-link: #93B8F9;
--color-md-link-underline: rgba(147, 184, 249, 0.3);
--color-md-link-hover: #A8C6FA;
--color-md-link-hover-underline: rgba(168, 198, 250, 0.7);
--color-md-marker: #93B8F9;
--color-md-blockquote-border: #93B8F9;
--color-md-blockquote-bg: rgba(147, 184, 249, 0.04);
--color-md-blockquote-text: #BFC3C8;
--color-md-code-inline: #E8B89E;
--color-md-code-inline-bg: rgba(255, 255, 255, 0.06);
--color-md-code-block-bg: #1A1D24;
--color-md-code-block-border: rgba(255, 255, 255, 0.06);
--color-md-code-text: #E4E6EB;
--color-md-table-header-bg: rgba(124, 169, 247, 0.08);
--color-md-table-border: rgba(255, 255, 255, 0.06);
--color-md-table-cell: #C8CCD0;
--color-md-table-stripe: rgba(30, 33, 40, 0.4);
--color-md-table-hover: rgba(124, 169, 247, 0.05);
--color-md-hr: rgba(255, 255, 255, 0.1);
--color-md-mark-bg: rgba(251, 191, 36, 0.2);
--color-md-mark-text: #FBBF24;
--color-md-comment: #7C8390;
--color-md-highlight-bg: rgba(251, 191, 36, 0.3);
--color-md-highlight-active-bg: rgba(251, 191, 36, 0.6);
--color-md-highlight-active-outline: rgba(251, 191, 36, 0.7);
--color-md-welcome-btn: #4A6AE5;
/* Borders */
--color-border-subtle: rgba(255, 255, 255, 0.04);
--color-border: rgba(255, 255, 255, 0.08);
--color-border-strong: rgba(255, 255, 255, 0.12);
/* Typography */
font-family: 'Inter Variable', 'Inter', -apple-system, 'SF Pro Display', 'Segoe UI', system-ui, sans-serif;
font-size: 14px;
line-height: 1.55;
color: var(--color-text-primary);
background-color: var(--color-bg-base);
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
/* Spacing */
--space-xs: 3px;
--space-sm: 6px;
--space-md: 12px;
--space-lg: 20px;
--space-xl: 32px;
--space-2xl: 48px;
/* Radii */
--radius-sm: 4px;
--radius-md: 6px;
--radius-lg: 10px;
/* Shadows */
--shadow-elevated: 0 4px 16px rgba(0, 0, 0, 0.4);
--shadow-dropdown: 0 8px 32px rgba(0, 0, 0, 0.5);
--shadow-modal: 0 20px 60px rgba(0, 0, 0, 0.6);
/* Transitions */
--transition-fast: 100ms ease;
--transition-normal: 150ms ease;
--transition-smooth: 250ms cubic-bezier(0.4, 0, 0.2, 1);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html, body, #root {
height: 100%;
width: 100%;
overflow: visible;
}
/* Skip link - WCAG 2.4.1 */
.skip-link {
position: fixed;
top: -100%;
left: 16px;
z-index: 99999;
padding: 8px 16px;
background-color: var(--color-accent);
color: white;
font-size: 13px;
font-weight: 600;
border-radius: var(--radius-md);
text-decoration: none;
transition: top 0.2s ease;
}
.skip-link:focus {
top: 8px;
}
/* App container */
.app-container {
display: flex;
flex-direction: column;
height: 100%;
width: 100%;
background-color: var(--color-bg-base);
position: relative;
overflow: visible;
}
/* Subtle noise overlay */
.app-container::before {
content: '';
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
opacity: 0.018;
pointer-events: none;
z-index: 9998;
mix-blend-mode: overlay;
}
/* Title bar */
.title-bar {
display: flex;
align-items: center;
justify-content: space-between;
height: 32px;
background-color: var(--color-bg-surface);
padding: 0;
user-select: none;
border-bottom: 1px solid var(--color-border-subtle);
}
.title-bar-left {
display: flex;
align-items: center;
gap: 8px;
padding-left: 12px;
}
.title-bar-drag {
flex: 1;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
-webkit-app-region: drag;
cursor: default;
}
.title-bar-title {
font-size: 12px;
font-weight: 500;
color: var(--color-text-tertiary);
letter-spacing: 0.02em;
text-align: center;
position: absolute;
left: 50%;
transform: translateX(-50%);
}
.title-bar-text {
font-size: 12px;
font-weight: 500;
color: var(--color-text-tertiary);
letter-spacing: 0.02em;
text-align: center;
position: absolute;
left: 50%;
transform: translateX(-50%);
pointer-events: none;
}
.title-bar-icon {
display: flex;
align-items: center;
justify-content: center;
color: var(--color-accent);
z-index: 1;
}
.title-bar-controls {
display: flex;
-webkit-app-region: no-drag;
pointer-events: auto;
}
.title-bar-button {
width: 46px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
background: transparent;
border: none;
color: var(--color-text-tertiary);
cursor: pointer;
transition: all var(--transition-fast);
}
.title-bar-button:hover {
background-color: var(--color-bg-hover);
color: var(--color-text-primary);
}
.title-bar-button.close:hover {
background-color: #DC2626;
color: white;
}
/* Menu bar */
.menu-bar {
display: flex;
align-items: center;
height: 28px;
background-color: var(--color-bg-surface);
border-bottom: 1px solid var(--color-border-subtle);
padding: 0 12px;
gap: 2px;
overflow: hidden;
}
.menu-item {
position: relative;
padding: 4px 10px;
background: transparent;
border: none;
color: var(--color-text-secondary);
font-size: 12px;
font-weight: 500;
cursor: pointer;
border-radius: var(--radius-sm);
transition: all var(--transition-fast);
}
.menu-item:hover {
background-color: var(--color-bg-hover);
color: var(--color-text-primary);
}
/* Menu backdrop - invisible overlay to catch outside clicks */
.menu-backdrop {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 99;
}
/* Menu dropdown */
.menu-dropdown {
position: absolute;
top: calc(100% + 6px);
left: 0;
min-width: 200px;
background-color: var(--color-bg-overlay);
border: 1px solid var(--color-border);
border-radius: var(--radius-lg);
padding: 4px;
box-shadow: var(--shadow-dropdown);
z-index: 100;
}
.menu-dropdown-item {
display: flex;
align-items: center;
justify-content: flex-start;
width: 100%;
padding: 8px 12px;
background: transparent;
border: none;
border-radius: var(--radius-md);
color: var(--color-text-secondary);
font-size: 12px;
font-weight: 450;
cursor: pointer;
text-align: left;
transition: all var(--transition-fast);
gap: 12px;
}
.menu-dropdown-item:hover {
background-color: var(--color-bg-hover);
color: var(--color-text-primary);
}
.menu-shortcut {
color: var(--color-text-disabled);
font-size: 11px;
font-weight: 500;
margin-left: auto;
font-family: 'SF Mono', 'Menlo', monospace;
}
.menu-separator {
height: 1px;
background-color: var(--color-border-subtle);
margin: 4px 6px;
}
.menu-check {
width: 14px;
height: 14px;
display: flex;
align-items: center;
justify-content: center;
color: var(--color-accent);
font-size: 10px;
font-weight: 700;
}
/* Zoom spinner in View menu */
.menu-dropdown-zoom {
display: flex;
align-items: center;
justify-content: space-between;
padding: 6px 12px;
color: var(--color-text-secondary);
font-size: 12px;
cursor: default;
}
.zoom-spinner {
display: flex;
align-items: center;
gap: 2px;
}
.zoom-spinner-btn {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
background: transparent;
border: 1px solid var(--color-border-subtle);
border-radius: var(--radius-sm);
color: var(--color-text-secondary);
cursor: pointer;
transition: all 0.15s ease;
}
.zoom-spinner-btn:hover {
background-color: var(--color-bg-hover);
color: var(--color-text-primary);
border-color: var(--color-text-disabled);
}
.zoom-spinner-value {
min-width: 38px;
text-align: center;
font-size: 11px;
font-weight: 500;
font-family: 'SF Mono', 'Menlo', monospace;
color: var(--color-text-primary);
}
/* Tab bar */
.tab-bar {
display: flex;
align-items: center;
height: 38px;
background-color: var(--color-bg-base);
border-bottom: 1px solid var(--color-border-subtle);
overflow: hidden;
}
.tab-scroll-arrow {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 100%;
background: transparent;
border: none;
color: var(--color-text-tertiary);
cursor: pointer;
flex-shrink: 0;
transition: all var(--transition-fast);
opacity: 0;
pointer-events: none;
visibility: hidden;
}
.tab-scroll-arrow.visible {
opacity: 0.6;
pointer-events: auto;
visibility: visible;
}
.tab-scroll-arrow.visible:hover,
.tab-scroll-arrow.visible:focus-visible {
opacity: 1;
color: var(--color-text-primary);
background-color: var(--color-bg-hover);
}
.tab-scroll-container {
display: flex;
align-items: center;
height: 100%;
overflow-x: auto;
overflow-y: hidden;
gap: 2px;
padding: 0 4px;
flex: 1;
min-width: 0;
scrollbar-width: none;
}
.tab-scroll-container::-webkit-scrollbar {
display: none;
}
.tab {
display: flex;
align-items: center;
gap: 6px;
height: 30px;
padding: 0 12px;
background: transparent;
border: none;
border-bottom: 2px solid transparent;
border-radius: var(--radius-md);
color: var(--color-text-secondary);
cursor: pointer;
white-space: nowrap;
flex-shrink: 0;
overflow: hidden;
transition: all var(--transition-fast);
}
.tab:hover {
background-color: var(--color-bg-hover);
color: var(--color-text-primary);
}
.tab.active {
background-color: var(--color-bg-elevated);
color: var(--color-text-primary);
border-bottom: 2px solid var(--color-accent);
}
.tab-title {
overflow: hidden;
text-overflow: ellipsis;
font-size: 12px;
font-weight: 500;
}
.tab-close {
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
background: transparent;
border: none;
border-radius: var(--radius-sm);
color: var(--color-text-tertiary);
cursor: pointer;
opacity: 0.5;
flex-shrink: 0;
transition: all var(--transition-fast);
}
.tab:hover .tab-close,
.tab-close:focus-visible {
opacity: 1;
}
.tab-close:hover {
background-color: rgba(239, 68, 68, 0.15);
color: #F87171;
}
/* Main content */
.main-content {
display: flex;
flex: 1;
overflow: hidden;
height: 100%;
align-items: stretch;
}
.main-content:has(.sidebar-scroll-wrapper) {
gap: 0;
}
.content-column {
display: flex;
flex-direction: column;
flex: 1;
min-width: 0;
overflow: hidden;
height: 100%;
margin: 0;
padding: 0;
}
/* Sidebar wrapper */
.sidebar-scroll-wrapper {
position: relative;
overflow: hidden;
height: 100%;
background-color: var(--color-bg-surface);
border-right: 1px solid var(--color-border-subtle);
display: flex;
flex-direction: column;
}
/* Sidebar */
.sidebar {
flex: 1;
min-height: 0;
width: 100%;
padding-bottom: 20px;
}
.sidebar-resize-handle {
position: absolute;
right: 0;
top: 0;
bottom: 0;
width: 8px;
background: rgba(255, 255, 255, 0.06);
cursor: col-resize;
transition: background-color var(--transition-fast);
}
.sidebar-resize-handle:hover,
.sidebar-resize-handle:focus-visible {
background-color: var(--color-accent);
}
.sidebar-heading {
padding: 16px 18px 12px;
font-size: 11px;
font-weight: 600;
color: var(--color-text-tertiary);
text-transform: uppercase;
letter-spacing: 0.08em;
position: sticky;
top: 0;
background-color: var(--color-bg-surface);
z-index: 1;
}
.sidebar-empty {
padding: 12px 18px;
font-size: 12px;
color: var(--color-text-disabled);
font-style: italic;
}
.sidebar-item {
display: block;
width: 100%;
padding: 8px 18px;
background: transparent;
border: none;
border-left: 2px solid transparent;
color: var(--color-text-secondary);
text-align: left;
cursor: pointer;
transition: all var(--transition-fast);
font-size: 12px;
font-weight: 450;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.sidebar-item:hover {
background-color: var(--color-bg-hover);
color: var(--color-text-primary);
}
.sidebar-item.active {
border-left-color: var(--color-accent);
background-color: var(--color-accent-muted);
color: var(--color-text-primary);
}
.sidebar-item.h1 { padding-left: 18px; font-weight: 600; }
.sidebar-item.h2 { padding-left: 18px; }
.sidebar-item.h3 { padding-left: 28px; font-size: 11px; }
.sidebar-item.h4 { padding-left: 38px; font-size: 11px; }
.sidebar-item.h5 { padding-left: 48px; font-size: 11px; }
.sidebar-item.h6 { padding-left: 58px; font-size: 11px; }
/* Content area */
.content-area-scroll-wrapper {
flex: 1;
overflow: hidden;
height: 100%;
position: relative;
background-color: var(--color-bg-base);
}
.content-area-scroll {
min-height: 100%;
padding: 48px 64px;
box-sizing: border-box;
}
/* Search bar */
.search-bar {
display: flex;
align-items: center;
padding: 0 16px;
height: 44px;
background-color: var(--color-bg-elevated);
border-bottom: 1px solid var(--color-border-subtle);
gap: 12px;
flex-shrink: 0;
}
.search-input {
flex: 1;
height: 30px;
padding: 0 12px;
background-color: var(--color-bg-surface);
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
color: var(--color-text-primary);
font-size: 13px;
font-weight: 450;
outline: none;
transition: all var(--transition-fast);
font-family: inherit;
}
.search-input::placeholder {
color: var(--color-text-tertiary);
}
.search-input:focus-visible {
border-color: var(--color-accent);
background-color: var(--color-bg-base);
outline: 2px solid var(--color-accent);
outline-offset: -2px;
}
.search-results {
display: flex;
align-items: center;
gap: 8px;
color: var(--color-text-tertiary);
font-size: 12px;
font-weight: 500;
white-space: nowrap;
padding: 0 10px;
height: 24px;
background-color: var(--color-bg-surface);
border-radius: var(--radius-sm);
}
.search-nav-btn {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
background: transparent;
border: none;
border-radius: var(--radius-sm);
color: var(--color-text-secondary);
cursor: pointer;
transition: all var(--transition-fast);
}
.search-nav-btn:hover {
background-color: var(--color-bg-hover);
color: var(--color-text-primary);
}
/* Drop zone */
.drop-zone {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(20, 22, 28, 0.88);
backdrop-filter: blur(8px);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.drop-zone-content {
display: flex;
flex-direction: column;
align-items: center;
gap: 14px;
padding: 48px 72px;
border: 2px dashed rgba(107, 138, 255, 0.5);
border-radius: 16px;
background-color: rgba(107, 138, 255, 0.06);
box-shadow: 0 0 0 1px rgba(107, 138, 255, 0.1), 0 24px 64px rgba(0, 0, 0, 0.4);
}
.drop-zone-icon-wrapper {
display: flex;
align-items: center;
justify-content: center;
width: 72px;
height: 72px;
border-radius: 50%;
background: rgba(107, 138, 255, 0.1);
color: var(--color-accent);
margin-bottom: 4px;
}
.drop-zone-text {
font-size: 16px;
color: var(--color-text-primary);
font-weight: 600;
letter-spacing: -0.01em;
}
.drop-zone-hint {
font-size: 12px;
color: var(--color-text-tertiary);
font-weight: 450;
}
/* Focus mode - animated via framer-motion, extra padding for content */
.focus-mode .content-area-scroll {
padding: 64px 96px;
}
/* Welcome screen */
.welcome-screen {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%;
color: var(--color-text-secondary);
text-align: center;
font-family: 'Inter Variable', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
}
.welcome-icon {
font-size: 64px;
margin-bottom: 24px;
opacity: 0.35;
}
.welcome-title {
font-size: 28px;
font-weight: 700;
color: var(--color-text-primary);
margin-bottom: 10px;
letter-spacing: -0.035em;
}
.welcome-subtitle {
font-size: 15px;
margin-bottom: 28px;
color: var(--color-text-secondary);
font-weight: 400;
}
.welcome-button {
padding: 12px 28px;
background-color: var(--color-md-welcome-btn);
color: white;
border: none;
border-radius: 8px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.15s ease;
margin-bottom: 18px;
letter-spacing: -0.01em;
}
.welcome-button:hover {
background-color: var(--color-accent-hover);
}
.welcome-hint {
font-size: 12px;
color: var(--color-text-disabled);
}
/* Context Menu */
.context-menu {
position: fixed !important;
min-width: 180px;
background-color: var(--color-bg-overlay);
border: 1px solid var(--color-border);
border-radius: var(--radius-lg);
padding: 4px;
box-shadow: var(--shadow-dropdown);
z-index: 10001 !important;
}
.context-menu-item {
display: block;
width: 100%;
padding: 8px 14px;
background: transparent;
border: none;
border-radius: var(--radius-md);
color: var(--color-text-secondary);
font-size: 12px;
font-weight: 450;
cursor: pointer;
text-align: left;
transition: all var(--transition-fast);
}
.context-menu-item:hover {
background-color: var(--color-bg-hover);
color: var(--color-text-primary);
}
.context-menu-separator {
height: 1px;
background-color: var(--color-border-subtle);
margin: 4px 6px;
}
/* Modal Overlay */
.modal-overlay {
position: fixed !important;
top: 0 !important;
left: 0 !important;
right: 0 !important;
bottom: 0 !important;
background-color: rgba(0, 0, 0, 0.6);
display: flex !important;
align-items: center !important;
justify-content: center !important;
z-index: 10002 !important;
}
.modal {
background-color: var(--color-bg-elevated);
border: 1px solid var(--color-border);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-modal);
min-width: 360px;
max-width: 480px;
width: 90vw;
display: block;
visibility: visible;
opacity: 1;
height: auto;
max-height: 80vh;
overflow-y: auto;
position: relative;
z-index: 10003 !important;
}
/* Shortcuts dialog - uses its own class to avoid DaisyUI .modal conflicts */
.shortcuts-dialog {
background-color: var(--color-bg-elevated);
border: 1px solid var(--color-border);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-modal);
width: 640px;
max-width: 92vw;
max-height: 80vh;
overflow-y: auto;
position: relative;
z-index: 10003;
}
.shortcuts-dialog-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 24px;
border-bottom: 1px solid var(--color-border-subtle);
}
.shortcuts-dialog-title {
font-size: 16px;
font-weight: 600;
color: var(--color-text-primary);
}
.shortcuts-dialog-close {
width: 28px;
height: 28px;
display: flex;
align-items: center;
justify-content: center;
background: transparent;
border: none;
border-radius: var(--radius-sm);
color: var(--color-text-tertiary);
cursor: pointer;
transition: all var(--transition-fast);
}
.shortcuts-dialog-close:hover {
background-color: var(--color-bg-hover);
color: var(--color-text-primary);
}
.shortcuts-dialog-body {
padding: 24px;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 24px 32px;
}
.shortcuts-dialog-group-title {
font-size: 11px;
font-weight: 600;
color: var(--color-accent-small);
text-transform: uppercase;
letter-spacing: 0.08em;
margin-bottom: 12px;
padding-bottom: 8px;
border-bottom: 1px solid var(--color-border-subtle);
}
.shortcuts-dialog-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 7px 0;
font-size: 13px;
color: var(--color-text-secondary);
gap: 16px;
}
.shortcuts-dialog-item kbd {
font-family: 'JetBrains Mono Variable', 'SF Mono', 'Menlo', monospace;
font-size: 11px;
padding: 4px 10px;
background-color: var(--color-bg-surface);
border: 1px solid var(--color-border);
border-radius: var(--radius-sm);
color: var(--color-text-primary);
white-space: nowrap;
flex-shrink: 0;
}
.shortcuts-dialog-nav-grid {
grid-column: 1 / -1;
}
.shortcuts-dialog-nav-grid .shortcuts-dialog-items-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0 32px;
}
.modal-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 20px;
border-bottom: 1px solid var(--color-border-subtle);
}
.modal-title {
font-size: 15px;
font-weight: 600;
color: var(--color-text-primary);
}
.modal-close {
width: 28px;
height: 28px;
display: flex;
align-items: center;
justify-content: center;
background: transparent;
border: none;
border-radius: var(--radius-sm);
color: var(--color-text-tertiary);
font-size: 20px;
cursor: pointer;
transition: all var(--transition-fast);
}
.modal-close:hover {
background-color: var(--color-bg-hover);
color: var(--color-text-primary);
}
.modal-content {
padding: 20px;
}
.about-modal {
text-align: center;
}
.about-content {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
}
.about-icon {
font-size: 48px;
margin-bottom: 8px;
}
.about-name {
font-size: 18px;
font-weight: 600;
color: var(--color-text-primary);
}
.about-version {
font-size: 13px;
color: var(--color-text-tertiary);
}
.about-description {
font-size: 13px;
color: var(--color-text-secondary);
margin-top: 8px;
}
.about-copyright {
font-size: 11px;
color: var(--color-text-disabled);
margin-top: 16px;
}
/* Shortcuts Modal */
.shortcut-group {
margin-bottom: 16px;
}
.shortcut-group:last-child {
margin-bottom: 0;
}
.shortcut-group-title {
font-size: 11px;
font-weight: 600;
color: var(--color-text-tertiary);
text-transform: uppercase;
letter-spacing: 0.06em;
margin-bottom: 8px;
}
.shortcut {
display: flex;
align-items: center;
justify-content: space-between;
padding: 6px 0;
font-size: 13px;
color: var(--color-text-secondary);
}
.shortcut kbd {
font-family: 'SF Mono', 'Menlo', monospace;
font-size: 11px;
padding: 3px 8px;
background-color: var(--color-bg-surface);
border-radius: var(--radius-sm);
color: var(--color-text-primary);
}
.shortcut-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 6px 0;
font-size: 13px;
color: var(--color-text-secondary);
}
.shortcut-key {
font-family: 'SF Mono', 'Menlo', monospace;
font-size: 11px;
padding: 3px 8px;
background-color: var(--color-bg-surface);
border-radius: var(--radius-sm);
color: var(--color-text-primary);
}
/* Markdown content */
.markdown-content {
/* Optimal measure: ~65 characters for best readability */
max-width: 680px;
margin: 0 auto;
color: var(--color-text-primary);
/* Typography settings */
font-size: 17px;
line-height: 1.7;
font-family: 'Inter Variable', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
font-weight: 400;
letter-spacing: -0.01em;
font-feature-settings: "liga" 1, "kern" 1, "calt" 1;
font-variant-ligatures: common-ligatures;
font-kerning: normal;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-spacing-trim: trim-both;
}
/* Heading hierarchy */
.markdown-content h1,
.markdown-content h2,
.markdown-content h3,
.markdown-content h4,
.markdown-content h5,
.markdown-content h6 {
color: var(--color-md-heading);
font-family: 'Inter Variable', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
font-weight: 600;
line-height: 1.2;
letter-spacing: -0.025em;
margin-top: 2.2em;
margin-bottom: 0.55em;
font-feature-settings: "liga" 1, "kern" 1;
}
.markdown-content h1 {
font-size: 2.35rem;
font-weight: 700;
letter-spacing: -0.03em;
color: var(--color-md-h1);
margin-top: 0;
margin-bottom: 0.8em;
padding-bottom: 0.55em;
border-bottom: 1px solid var(--color-border);
}
.markdown-content h2 {
font-size: 1.7rem;
color: var(--color-md-h2);
margin-top: 1.85em;
padding-bottom: 0.4em;
border-bottom: 1px solid var(--color-border-subtle);
}
.markdown-content h3 {
font-size: 1.3rem;
color: var(--color-md-h3);
}
.markdown-content h4 {
font-size: 1.15rem;
font-weight: 500;
color: var(--color-md-h4);
}
.markdown-content h5 {
font-size: 1rem;
font-weight: 500;
color: var(--color-md-h5);
}
.markdown-content h6 {
font-size: 0.92rem;
font-weight: 500;
color: var(--color-md-h6);
}
/* Paragraphs */
.markdown-content p {
margin-bottom: 1.65em;
color: var(--color-md-paragraph);
line-height: 1.7;
}
/* Links */
.markdown-content a {
color: var(--color-md-link);
text-decoration: underline;
text-decoration-color: var(--color-md-link-underline);
text-underline-offset: 3px;
text-decoration-thickness: 1px;
transition: color 0.2s ease, text-decoration-color 0.2s ease;
}
.markdown-content a:hover {
color: var(--color-md-link-hover);
text-decoration-color: var(--color-md-link-hover-underline);
text-decoration-thickness: 1.5px;
}
/* Strong and emphasis */
.markdown-content strong {
font-weight: 600;
color: var(--color-text-primary);
letter-spacing: -0.01em;
}
.markdown-content em {
font-style: italic;
font-weight: 400;
}
/* Lists - fix spacing issues */
.markdown-content ul,
.markdown-content ol {
margin-bottom: 1.65em;
padding-left: 1.5em;
}
.markdown-content ul {
list-style-type: disc;
}
.markdown-content ol {
list-style-type: decimal;
}
.markdown-content li {
margin-bottom: 0.45em;
color: var(--color-md-paragraph);
line-height: 1.65;
list-style-position: outside;
}
.markdown-content li::marker {
color: var(--color-md-marker);
}
.markdown-content ol li::marker {
font-weight: 500;
font-size: 0.9em;
}
.markdown-content ul li::marker {
font-size: 0.7em;
}
/* Fix ALL nested content inside list items - remove extra margins */
.markdown-content li > p {
margin-top: 0;
margin-bottom: 0.4em;
}
.markdown-content li > p:first-child {
margin-top: 0;
}
/* Fix headings inside lists - remove all top margin */
.markdown-content li h1,
.markdown-content li h2,
.markdown-content li h3,
.markdown-content li h4,
.markdown-content li h5,
.markdown-content li h6 {
margin-top: 0 !important;
margin-bottom: 0.2em !important;
display: inline;
}
/* Fix paragraphs immediately after headings in lists */
.markdown-content li h1 + p,
.markdown-content li h2 + p,
.markdown-content li h3 + p,
.markdown-content li h4 + p,
.markdown-content li h5 + p,
.markdown-content li h6 + p {
margin-top: 0;
}
/* Fix paragraphs inside list items */
.markdown-content li > p {
margin-top: 0;
margin-bottom: 0.3em;
}
.markdown-content li > p:only-child {
margin-bottom: 0;
}
/* Fix ALL images inside lists - super aggressive */
.markdown-content li img {
margin-top: 0.2em !important;
margin-bottom: 0.2em !important;
}
/* Fix ALL code blocks inside lists - super aggressive */
.markdown-content li pre {
margin-top: 0.2em !important;
margin-bottom: 0.2em !important;
}
/* Also target any nested images/codeblocks */
.markdown-content li * img {
margin-top: 0.2em !important;
margin-bottom: 0.2em !important;
}
.markdown-content li * pre {
margin-top: 0.2em !important;
margin-bottom: 0.2em !important;
}
/* Blockquotes */
.markdown-content blockquote {
margin: 1.65em 0;
padding: 1.1em 1.4em;
border-left: 3px solid var(--color-md-blockquote-border);
background-color: var(--color-md-blockquote-bg);
border-radius: 0 8px 8px 0;
color: var(--color-md-blockquote-text);
font-style: normal;
line-height: 1.7;
}
.markdown-content blockquote p {
margin-bottom: 0.5em;
color: var(--color-md-blockquote-text);
}
.markdown-content blockquote p:last-child {
margin-bottom: 0;
}
/* Inline code */
.markdown-content code:not(pre code) {
background-color: var(--color-md-code-inline-bg);
padding: 0.22em 0.48em;
border-radius: 5px;
font-family: 'JetBrains Mono Variable', 'JetBrains Mono', 'SF Mono', 'Fira Code', monospace;
font-size: 0.88em;
font-weight: 400;
color: var(--color-md-code-inline);
letter-spacing: -0.02em;
}
/* Code blocks */
.markdown-content pre {
background-color: var(--color-md-code-block-bg);
border-radius: 10px;
padding: 1.35em 1.6em;
margin: 1.65em 0;
overflow-x: visible;
overflow-wrap: break-word;
white-space: pre-wrap;
border: 1px solid var(--color-md-code-block-border);
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.15);
}
.markdown-content pre code {
font-family: 'JetBrains Mono Variable', 'JetBrains Mono', 'SF Mono', 'Fira Code', monospace;
font-size: 14px;
line-height: 1.7;
color: var(--color-md-code-text);
background: none;
padding: 0;
letter-spacing: -0.02em;
white-space: pre-wrap;
word-wrap: break-word;
font-feature-settings: "liga" 1, "calt" 1;
}
/* Syntax highlighting - refined colors */
.hljs {
background: transparent !important;
color: var(--color-md-code-text);
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-literal,
.hljs-section,
.hljs-link {
color: #C792EA;
font-weight: 500;
}
.hljs-string,
.hljs-title,
.hljs-name,
.hljs-type,
.hljs-attribute,
.hljs-symbol,
.hljs-bullet,
.hljs-addition,
.hljs-variable,
.hljs-template-tag,
.hljs-template-variable {
color: #C3E88D;
}
.hljs-comment,
.hljs-quote,
.hljs-deletion,
.hljs-meta {
color: var(--color-md-comment);
font-style: italic;
}
.hljs-number {
color: #F78C6C;
font-weight: 500;
}
.hljs-built_in {
color: #82AAFF;
}
.hljs-function .hljs-keyword {
color: #C792EA;
}
.hljs-class .hljs-title {
color: #FFCB6B;
}
.hljs-attr {
color: #FFCB6B;
}
/* Tables */
.markdown-content table {
width: 100%;
border-collapse: separate;
border-spacing: 0;
margin: 1.65em 0;
font-size: 14px;
border-radius: 10px;
overflow: hidden;
border: 1px solid var(--color-md-table-border);
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
}
.markdown-content th,
.markdown-content td {
padding: 14px 18px;
text-align: left;
border-bottom: 1px solid var(--color-border-subtle);
}
.markdown-content th {
background-color: var(--color-md-table-header-bg);
font-weight: 600;
color: var(--color-text-primary);
font-size: 12.5px;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.markdown-content td {
color: var(--color-md-table-cell);
}
.markdown-content tr:last-child td {
border-bottom: none;
}
.markdown-content tr:nth-child(even) td {
background-color: var(--color-md-table-stripe);
}
.markdown-content tr:hover td {
background-color: var(--color-md-table-hover);
}
/* Horizontal rule - gradient fade */
.markdown-content hr {
border: none;
height: 1px;
background: linear-gradient(to right, transparent, var(--color-md-hr), transparent);
margin: 2.5em 0;
}
/* Images */
.markdown-content img {
max-width: 100%;
height: auto;
border-radius: 10px;
margin: 1.65em 0;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
transition: transform 0.2s ease;
}
.markdown-content img:hover {
transform: translateY(-1px);
}
/* Definition lists */
.markdown-content dl {
margin: 1.65em 0;
}
.markdown-content dt {
font-weight: 600;
color: var(--color-text-primary);
margin-top: 1.1em;
}
.markdown-content dd {
color: var(--color-text-secondary);
margin-left: 1.65em;
margin-bottom: 0.55em;
}
/* Abbreviations */
.markdown-content abbr {
border-bottom: 1px dotted var(--color-text-tertiary);
cursor: help;
}
/* Mark/highlight */
.markdown-content mark {
background-color: var(--color-md-mark-bg);
color: var(--color-md-mark-text);
padding: 0.18em 0.38em;
border-radius: 4px;
font-weight: 500;
}
/* Subscript and superscript */
.markdown-content sub,
.markdown-content sup {
font-size: 0.75em;
color: var(--color-text-secondary);
position: relative;
}
.markdown-content sup {
vertical-align: super;
top: -0.25em;
}
.markdown-content sub {
vertical-align: sub;
bottom: -0.25em;
}
/* Tables inside lists */
.markdown-content li table {
margin: 0.85em 0;
border-radius: 8px;
}
/* Search highlights - high specificity to override Tailwind reset */
span.search-highlight {
background-color: var(--color-md-highlight-bg) !important;
color: inherit !important;
border-radius: 2px;
padding: 1px 0;
text-decoration: underline;
text-decoration-color: var(--color-md-mark-text);
text-underline-offset: 2px;
transition: background-color 0.15s ease, outline-color 0.15s ease;
}
span.search-highlight.search-highlight-active {
background-color: var(--color-md-highlight-active-bg) !important;
outline: 2px solid var(--color-md-highlight-active-outline);
outline-offset: 1px;
}
/* OverlayScrollbars custom theme */
.os-theme-dark {
--os-handle-bg: rgba(255, 255, 255, 0.12);
--os-handle-bg-hover: var(--color-accent);
--os-handle-bg-active: var(--color-accent-hover);
--os-size: 8px;
--os-handle-border-radius: 4px;
--os-padding-perpendicular: 2px;
--os-padding-axis: 2px;
--os-handle-interactive-area-offset: 4px;
}
.os-theme-dark .os-scrollbar {
transition: opacity 0.3s ease;
}
.os-theme-dark .os-scrollbar-handle {
transition: background-color 0.2s ease, opacity 0.2s ease;
}
/* Global focus indicator - WCAG 2.4.7, 2.4.13 */
button:focus-visible,
a:focus-visible,
input:focus-visible,
[tabindex]:focus-visible,
[role="tab"]:focus-visible,
[role="menuitem"]:focus-visible,
[role="separator"]:focus-visible {
outline: 2px solid var(--color-accent);
outline-offset: 2px;
z-index: 1;
}
/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}