/* ========================================== DESIGN SYSTEM - CSS CUSTOM PROPERTIES ========================================== */ :root { /* Dark Mode Colors (Default) */ --color-bg-primary: #0a0e1a; --color-bg-secondary: #111827; --color-bg-tertiary: #1a2332; --color-accent-primary: #3b82f6; --color-accent-secondary: #2563eb; --color-accent-tertiary: #1d4ed8; --color-text-primary: #f9fafb; --color-text-secondary: #d1d5db; --color-text-muted: #9ca3af; --color-border: rgba(255, 255, 255, 0.1); --color-border-hover: rgba(255, 255, 255, 0.2); /* Glassmorphism */ --glass-bg: rgba(17, 24, 39, 0.7); --glass-border: rgba(255, 255, 255, 0.1); --glass-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37); /* Spacing */ --spacing-xs: 0.25rem; --spacing-sm: 0.5rem; --spacing-md: 1rem; --spacing-lg: 1.5rem; --spacing-xl: 2rem; --spacing-2xl: 3rem; /* Typography */ --font-primary: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-mono: 'Fira Code', 'Courier New', monospace; /* Transitions */ --transition-fast: 0.15s ease; --transition-normal: 0.3s ease; --transition-slow: 0.5s ease; /* Border Radius */ --radius-sm: 0.375rem; --radius-md: 0.5rem; --radius-lg: 1rem; --radius-xl: 1.5rem; /* Shadows */ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1); } /* Light Mode Colors */ [data-theme="light"] { --color-bg-primary: #ffffff; --color-bg-secondary: #f9fafb; --color-bg-tertiary: #f3f4f6; --color-accent-primary: #3b82f6; --color-accent-secondary: #2563eb; --color-accent-tertiary: #1d4ed8; --color-text-primary: #111827; --color-text-secondary: #4b5563; --color-text-muted: #6b7280; --color-border: rgba(0, 0, 0, 0.1); --color-border-hover: rgba(0, 0, 0, 0.2); --glass-bg: rgba(255, 255, 255, 0.7); --glass-border: rgba(0, 0, 0, 0.1); --glass-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.1); --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1); } /* ========================================== RESET & BASE STYLES ========================================== */ * { margin: 0; padding: 0; box-sizing: border-box; } html { font-size: 16px; scroll-behavior: smooth; } body { font-family: var(--font-primary); background-color: var(--color-bg-primary); color: var(--color-text-primary); line-height: 1.6; overflow-x: hidden; min-height: 100vh; } /* ========================================== BACKGROUND EFFECTS ========================================== */ /* Background effects removed for clean theme switching */ /* ========================================== HEADER ========================================== */ .header { background: var(--glass-bg); backdrop-filter: blur(20px) saturate(180%); border-bottom: 1px solid var(--glass-border); box-shadow: var(--glass-shadow); position: sticky; top: 0; z-index: 100; animation: slideDown 0.5s ease; } @keyframes slideDown { from { transform: translateY(-100%); opacity: 0; } to { transform: translateY(0); opacity: 1; } } .header-content { max-width: 1800px; margin: 0 auto; padding: var(--spacing-lg) var(--spacing-xl); display: flex; justify-content: space-between; align-items: center; gap: var(--spacing-lg); } .logo-section { display: flex; align-items: center; gap: var(--spacing-md); } .logo-icon { width: 48px; height: 48px; background: var(--color-accent-primary); border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; color: white; box-shadow: var(--shadow-lg); transition: all var(--transition-normal); } .logo-icon svg { width: 28px; height: 28px; } .logo-icon:hover { transform: scale(1.05); } @keyframes pulse { 0%, 100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(168, 85, 247, 0.7); } 50% { transform: scale(1.05); box-shadow: 0 0 0 10px rgba(168, 85, 247, 0); } } .logo-text h1 { font-size: 1.5rem; font-weight: 800; color: var(--color-accent-primary); line-height: 1.2; } .subtitle { font-size: 0.875rem; color: var(--color-text-muted); font-weight: 400; } .header-actions { display: flex; align-items: center; gap: var(--spacing-md); } /* ========================================== BUTTONS ========================================== */ .btn-primary { background: var(--color-accent-primary); color: white; border: none; padding: 0.75rem 1.5rem; border-radius: var(--radius-md); font-weight: 600; font-size: 0.875rem; cursor: pointer; transition: all var(--transition-normal); box-shadow: var(--shadow-md); display: flex; align-items: center; gap: var(--spacing-sm); text-decoration: none; font-family: var(--font-primary); } .btn-primary:hover { background: var(--color-accent-secondary); transform: translateY(-2px); box-shadow: var(--shadow-xl); } .btn-primary:active { transform: translateY(0); } .btn-primary svg { width: 18px; height: 18px; } .btn-secondary { background: var(--color-bg-tertiary); color: var(--color-text-primary); border: 1px solid var(--color-border); padding: 0.5rem 1rem; border-radius: var(--radius-md); font-weight: 500; font-size: 0.875rem; cursor: pointer; transition: all var(--transition-fast); font-family: var(--font-primary); } .btn-secondary:hover { background: var(--color-bg-secondary); border-color: var(--color-border-hover); } .btn-icon { background: transparent; color: var(--color-text-secondary); border: 1px solid var(--color-border); width: 40px; height: 40px; border-radius: var(--radius-md); cursor: pointer; transition: all var(--transition-fast); display: flex; align-items: center; justify-content: center; } .btn-icon:hover { background: var(--color-bg-tertiary); border-color: var(--color-border-hover); color: var(--color-text-primary); transform: scale(1.05); } .btn-icon svg { width: 20px; height: 20px; } /* ========================================== MAIN CONTAINER ========================================== */ .main-container { display: flex; height: calc(100vh - 88px); max-width: 1800px; margin: 0 auto; gap: var(--spacing-lg); padding: var(--spacing-lg); } /* ========================================== SIDEBAR ========================================== */ .sidebar { width: 320px; background: var(--glass-bg); backdrop-filter: blur(20px) saturate(180%); border: 1px solid var(--glass-border); border-radius: var(--radius-lg); padding: var(--spacing-lg); overflow-y: auto; box-shadow: var(--glass-shadow); animation: slideInLeft 0.5s ease; transition: transform var(--transition-normal); } @keyframes slideInLeft { from { transform: translateX(-100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } .sidebar.hidden { transform: translateX(-100%); position: absolute; left: 0; height: calc(100vh - 120px); } .sidebar-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--spacing-lg); } .sidebar-header h2 { font-size: 1.25rem; font-weight: 700; } .page-info { display: grid; grid-template-columns: 1fr 1fr; gap: var(--spacing-md); margin-bottom: var(--spacing-lg); } .info-item { background: var(--color-bg-tertiary); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--spacing-md); text-align: center; } .info-label { display: block; font-size: 0.75rem; color: var(--color-text-muted); margin-bottom: var(--spacing-xs); text-transform: uppercase; letter-spacing: 0.05em; } .info-value { display: block; font-size: 1.5rem; font-weight: 700; color: var(--color-accent-primary); } .page-navigation { margin-bottom: var(--spacing-lg); } .page-navigation label { display: block; font-size: 0.875rem; font-weight: 600; margin-bottom: var(--spacing-sm); color: var(--color-text-secondary); } .page-input-group { display: flex; gap: var(--spacing-sm); } .page-input-group input { flex: 1; background: var(--color-bg-tertiary); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 0.5rem; color: var(--color-text-primary); font-size: 0.875rem; font-family: var(--font-primary); } .page-input-group input:focus { outline: none; border-color: var(--color-accent-primary); } .thumbnails { display: flex; flex-direction: column; gap: var(--spacing-sm); } .thumbnail-item { cursor: pointer; padding: var(--spacing-sm); border: 2px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-bg-tertiary); transition: all var(--transition-fast); text-align: center; } .thumbnail-item:hover { border-color: var(--color-accent-primary); transform: scale(1.02); box-shadow: var(--shadow-md); } .thumbnail-item.active { border-color: var(--color-accent-primary); background: var(--color-accent-primary); background: linear-gradient(to bottom, var(--color-accent-primary) 0%, var(--color-accent-primary) 4px, var(--color-bg-tertiary) 4px); } .thumbnail-canvas-wrapper { margin-bottom: var(--spacing-xs); border-radius: var(--radius-sm); overflow: hidden; background: white; } .thumbnail-canvas-wrapper canvas { width: 100%; height: auto; display: block; } .thumbnail-label { font-size: 0.75rem; color: var(--color-text-muted); font-weight: 500; } .thumbnail-item.active .thumbnail-label { color: var(--color-accent-primary); font-weight: 600; } .show-more-btn { text-align: center; padding: var(--spacing-md) 0; } .show-more-btn button { background: var(--color-bg-tertiary); border: 1px solid var(--color-border); color: var(--color-text-secondary); padding: var(--spacing-sm) var(--spacing-md); border-radius: var(--radius-md); font-size: 0.875rem; font-weight: 500; cursor: pointer; transition: all var(--transition-fast); display: flex; align-items: center; gap: var(--spacing-sm); margin: 0 auto; font-family: var(--font-primary); } .show-more-btn button:hover { background: var(--color-accent-primary); color: white; border-color: var(--color-accent-primary); transform: translateY(-2px); box-shadow: var(--shadow-md); } .show-more-btn button svg { width: 16px; height: 16px; } .loading-text { color: var(--color-text-muted); font-size: 0.875rem; text-align: center; padding: var(--spacing-lg); } /* ========================================== VIEWER CONTAINER ========================================== */ .viewer-container { flex: 1; display: flex; flex-direction: column; background: var(--glass-bg); backdrop-filter: blur(20px) saturate(180%); border: 1px solid var(--glass-border); border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--glass-shadow); position: relative; animation: fadeIn 0.5s ease; } @keyframes fadeIn { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } .sidebar-toggle { position: absolute; top: var(--spacing-md); left: var(--spacing-md); z-index: 10; background: var(--glass-bg); backdrop-filter: blur(20px); color: var(--color-text-primary); border: 1px solid var(--glass-border); width: 44px; height: 44px; border-radius: var(--radius-md); cursor: pointer; transition: all var(--transition-fast); display: flex; align-items: center; justify-content: center; box-shadow: var(--shadow-md); } .sidebar-toggle:hover { background: var(--color-bg-tertiary); transform: scale(1.05); } .sidebar-toggle svg { width: 22px; height: 22px; } /* ========================================== SEARCH PANEL ========================================== */ .search-panel { background: var(--color-bg-secondary); border-bottom: 1px solid var(--color-border); padding: var(--spacing-md); display: none; animation: slideDown 0.3s ease; } .search-panel.active { display: block; } .search-input-group { display: flex; gap: var(--spacing-sm); align-items: center; margin-bottom: var(--spacing-sm); } .search-input-group input { flex: 1; background: var(--color-bg-tertiary); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 0.5rem 1rem; color: var(--color-text-primary); font-size: 0.875rem; font-family: var(--font-primary); } .search-input-group input:focus { outline: none; border-color: var(--color-accent-primary); box-shadow: 0 0 0 3px rgba(168, 85, 247, 0.1); } .search-results { font-size: 0.75rem; color: var(--color-text-muted); text-align: center; } /* ========================================== CONTROLS ========================================== */ .controls { background: var(--color-bg-secondary); border-bottom: 1px solid var(--color-border); padding: var(--spacing-md); display: flex; justify-content: center; align-items: center; gap: var(--spacing-xl); } .control-group { display: flex; align-items: center; gap: var(--spacing-md); } .page-indicator, .zoom-level { font-size: 0.875rem; font-weight: 600; color: var(--color-text-secondary); min-width: 80px; text-align: center; font-family: var(--font-mono); } /* ========================================== CANVAS CONTAINER ========================================== */ .canvas-container { flex: 1; overflow: auto; display: flex; align-items: center; justify-content: center; padding: var(--spacing-lg); position: relative; background: var(--color-bg-primary); } .canvas-container::-webkit-scrollbar { width: 12px; height: 12px; } .canvas-container::-webkit-scrollbar-track { background: var(--color-bg-secondary); } .canvas-container::-webkit-scrollbar-thumb { background: var(--color-bg-tertiary); border-radius: var(--radius-sm); border: 2px solid var(--color-bg-secondary); } .canvas-container::-webkit-scrollbar-thumb:hover { background: var(--color-accent-primary); } #pdfCanvas { box-shadow: var(--shadow-xl); max-width: 100%; height: auto; border-radius: var(--radius-sm); } /* ========================================== LOADING OVERLAY ========================================== */ .loading-overlay { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: var(--color-bg-primary); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--spacing-lg); z-index: 50; } .loading-overlay.hidden { display: none; } .spinner { width: 60px; height: 60px; border: 4px solid var(--color-border); border-top-color: var(--color-accent-primary); border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } .loading-overlay p { color: var(--color-text-secondary); font-size: 1rem; font-weight: 500; } /* ========================================== RESPONSIVE DESIGN ========================================== */ @media (max-width: 1024px) { .header-content { padding: var(--spacing-md); } .logo-text h1 { font-size: 1.25rem; } .main-container { padding: var(--spacing-md); gap: var(--spacing-md); } .sidebar { width: 280px; } } @media (max-width: 768px) { .header-content { flex-direction: column; gap: var(--spacing-md); } .header-actions { width: 100%; justify-content: space-between; } .btn-primary span { display: none; } .main-container { flex-direction: column; height: auto; } .sidebar { width: 100%; max-height: 300px; } .sidebar.hidden { display: none; } .controls { flex-direction: column; gap: var(--spacing-md); } .canvas-container { min-height: 500px; } } @media (max-width: 480px) { .logo-text h1 { font-size: 1rem; } .subtitle { font-size: 0.75rem; } .btn-icon { width: 36px; height: 36px; } .control-group { gap: var(--spacing-sm); } }