:root { --bg-color: #0f172a; --text-color: #f1f5f9; --pane-bg: #1e293b; --accent: #3b82f6; --accent-hover: #2563eb; --border-color: #334155; --success: #10b981; --error: #ef4444; --surface: #334155; --nav-height: 56px; } * { box-sizing: border-box; } body { margin: 0; padding: 0; font-family: 'Inter', ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; background-color: var(--bg-color); color: var(--text-color); display: flex; height: 100vh; overflow: hidden; } h2, h3, h4 { margin-top: 0; color: #f8fafc; } /* ── Layout ─────────────────────────────────────── */ /* ── App Wrapper & Top Bar ────────────────────── */ .app-wrapper { display: flex; flex-direction: column; width: 100%; height: 100vh; } .top-bar { display: flex; align-items: center; justify-content: space-between; padding: 6px 20px; background-color: var(--pane-bg); border-bottom: 1px solid var(--border-color); flex-shrink: 0; height: 40px; } .top-bar-title { font-weight: 700; font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--accent); } .top-bar-user { display: flex; align-items: center; gap: 8px; } .user-badge { font-size: 0.8rem; font-weight: 600; color: var(--success); background: rgba(16, 185, 129, 0.1); padding: 3px 10px; border-radius: 12px; border: 1px solid rgba(16, 185, 129, 0.3); } .btn-login { font-size: 0.8rem; font-weight: 600; color: var(--text-color); background: var(--accent); padding: 4px 12px; border-radius: 6px; text-decoration: none; transition: background 0.2s; } .btn-login:hover { background: var(--accent-hover); } /* ── Login Gate ───────────────────────────────── */ .login-gate { display: flex; align-items: center; justify-content: center; width: 100%; height: 100vh; background: var(--bg-color); } .login-card { text-align: center; background: var(--pane-bg); border: 1px solid var(--border-color); border-radius: 16px; padding: 48px 40px; max-width: 420px; } .login-card h1 { font-size: 1.5rem; margin: 0 0 12px; color: var(--text-color); } .login-card p { color: #94a3b8; font-size: 0.9rem; margin: 0 0 24px; } .btn-login-large { display: inline-block; font-size: 1rem; font-weight: 700; color: #fff; background: var(--accent); padding: 12px 28px; border-radius: 8px; border: none; cursor: pointer; text-decoration: none; transition: background 0.2s; } .btn-login-large:hover { background: var(--accent-hover); } .login-note { font-size: 0.75rem !important; color: #64748b !important; margin-top: 16px !important; } .container { display: flex; width: 100%; flex: 1; flex-wrap: wrap; overflow: hidden; } /* ── Progress Bar ────────────────────────────── */ .top-bar-right { display: flex; align-items: center; gap: 16px; } .progress-container { display: flex; align-items: center; gap: 6px; } .progress-container::before { content: 'Progress:'; font-size: 0.72rem; font-weight: 600; color: #64748b; margin-right: 2px; } .progress-pills { display: flex; align-items: center; gap: 12px; } .progress-pill { display: flex; align-items: center; gap: 5px; font-size: 0.75rem; } .pill-icon { font-size: 0.7rem; } .pill-label { color: #64748b; font-weight: 500; } .pill-value { color: var(--text-color); font-weight: 700; font-variant-numeric: tabular-nums; } .pill-value.pill-complete { color: var(--success); } .pill-divider { width: 1px; height: 14px; background: var(--border-color); } /* ── Leaderboard ─────────────────────────────── */ .btn-leaderboard { background: none; border: 1px solid var(--border-color); color: var(--text-color); padding: 3px 10px; border-radius: 6px; font-size: 0.72rem; cursor: pointer; transition: all 0.2s; } .btn-leaderboard:hover { background: var(--surface); border-color: var(--accent); } .leaderboard-modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 1001; background: var(--pane-bg); border: 1px solid var(--border-color); border-radius: 16px; width: 480px; max-height: 70vh; display: flex; flex-direction: column; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5); } .leaderboard-header { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; border-bottom: 1px solid var(--border-color); } .leaderboard-header h3 { margin: 0; font-size: 1rem; } .leaderboard-header-actions { display: flex; align-items: center; gap: 8px; } .btn-refresh { background: none; border: 1px solid var(--border-color); color: var(--text-color); width: 28px; height: 28px; border-radius: 6px; cursor: pointer; font-size: 0.8rem; display: flex; align-items: center; justify-content: center; transition: all 0.2s; } .btn-refresh:hover:not(:disabled) { background: var(--surface); border-color: var(--accent); } .btn-refresh:disabled { opacity: 0.5; cursor: wait; } .leaderboard-body { padding: 12px 20px; overflow-y: auto; flex: 1; } .leaderboard-loading { display: flex; flex-direction: column; align-items: center; gap: 10px; padding: 30px; color: #94a3b8; } .leaderboard-empty { text-align: center; color: #94a3b8; padding: 30px; } .leaderboard-table { width: 100%; border-collapse: collapse; font-size: 0.8rem; } .leaderboard-table th { text-align: left; padding: 6px 8px; color: #64748b; font-weight: 600; font-size: 0.72rem; border-bottom: 1px solid var(--border-color); } .leaderboard-table td { padding: 8px 8px; border-bottom: 1px solid var(--border-color); } .leaderboard-table tr:last-child td { border-bottom: none; } .rank-cell { font-size: 1rem; text-align: center; width: 32px; } .annotator-cell { font-weight: 600; } .score-cell { font-weight: 700; color: var(--accent); } .stat-verified { font-weight: 600; } .stat-detail { font-size: 0.65rem; color: #64748b; } .rank-1 { background: rgba(255, 215, 0, 0.06); } .rank-2 { background: rgba(192, 192, 192, 0.06); } .rank-3 { background: rgba(205, 127, 50, 0.06); } .leaderboard-footer { padding: 8px 20px; border-top: 1px solid var(--border-color); font-size: 0.65rem; color: #64748b; text-align: center; } .pane { flex: 1; padding: 20px 24px; display: flex; flex-direction: column; /* Both panes are non-scrollable — content must fit */ height: calc(100vh - var(--nav-height)); overflow: hidden; } .left-pane { border-right: 1px solid var(--border-color); background-color: #020617; } .right-pane { background-color: var(--pane-bg); overflow-y: auto; } .pane-header { flex-shrink: 0; margin-bottom: 12px; } .pane-header h2 { margin-bottom: 8px; } /* ── Document Selector ──────────────────────────── */ .navigation-controls { display: flex; flex-direction: column; gap: 8px; } .select-group { display: flex; align-items: center; gap: 8px; } .select-group label { font-size: 0.75rem; font-weight: 600; color: #94a3b8; text-transform: uppercase; letter-spacing: 0.05em; } .select-group select { background-color: var(--surface); color: var(--text-color); border: 1px solid var(--border-color); border-radius: 6px; padding: 4px 8px; font-size: 0.75rem; cursor: pointer; transition: border-color 0.2s; max-width: 280px; } .select-group select:hover, .select-group select:focus { border-color: var(--accent); outline: none; } /* ── PDF Viewer ─────────────────────────────────── */ .pdf-container { flex: 1; display: flex; flex-direction: column; position: relative; min-height: 0; } .pdf-frame { flex: 1; width: 100%; min-height: 0; border: none; background: white; border-radius: 12px; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); } .pdf-loading, .pdf-error { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; background-color: var(--surface); border-radius: 12px; color: #94a3b8; gap: 8px; } .pdf-loading p, .pdf-error p { margin: 0; } .pdf-loading-hint, .pdf-error-hint { font-size: 0.75rem; color: #64748b; } .pdf-placeholder { flex: 1; display: flex; align-items: center; justify-content: center; background-color: var(--surface); border-radius: 12px; color: #94a3b8; } /* ── Bottom Navigation ──────────────────────────── */ .bottom-nav { position: fixed; bottom: 0; left: 0; right: 0; height: var(--nav-height); background-color: #020617; border-top: 1px solid var(--border-color); display: flex; align-items: center; justify-content: center; z-index: 100; } .page-navigator { display: flex; align-items: center; gap: 16px; } .page-nav-group { display: flex; gap: 4px; } .page-indicator { display: flex; flex-direction: column; align-items: center; gap: 2px; min-width: 100px; text-align: center; } .page-indicator strong { font-size: 1.1rem; color: #f8fafc; } .mention-dot { color: #10b981; font-size: 0.6rem; margin-left: 4px; vertical-align: middle; animation: pulse-dot 2s ease-in-out infinite; } @keyframes pulse-dot { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } .page-count { font-size: 0.75rem; color: #64748b; } .btn-nav { background-color: var(--surface); color: var(--text-color); padding: 10px 20px; font-weight: 600; font-size: 0.9rem; border-radius: 8px; border: 1px solid var(--border-color); transition: all 0.2s; } .btn-nav.btn-jump { padding: 10px 12px; font-size: 0.8rem; } .btn-nav:hover:not(:disabled) { background-color: var(--accent); border-color: var(--accent); transform: translateY(-1px); } .btn-nav:disabled { opacity: 0.3; cursor: not-allowed; } /* ── Annotator Header ───────────────────────────── */ .annotator-container { display: flex; flex-direction: column; flex: 1; min-height: 0; } .annotator-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-shrink: 0; margin-bottom: 12px; } .annotator-header h2 { margin: 0; } .annotator-actions { display: flex; flex-direction: column; gap: 6px; } /* ── Markdown Content ───────────────────────────── */ .markdown-content { background-color: #2dd4bf10; padding: 20px; border-radius: 12px; line-height: 1.6; border: 1px solid #2dd4bf30; font-size: 0.95rem; flex: 1; min-height: 0; overflow-y: auto; } .markdown-content-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; flex-shrink: 0; } .markdown-content-header h3 { margin: 0; font-size: 0.9rem; } .dataset-count { background-color: #2dd4bf20; color: #2dd4bf; padding: 4px 10px; border-radius: 20px; font-size: 0.75rem; font-weight: 600; } /* ── Dataset Legend ─────────────────────────────── */ .dataset-legend { display: flex; gap: 12px; flex-wrap: wrap; flex-shrink: 0; margin-bottom: 8px; } .legend-item { display: flex; align-items: center; gap: 6px; font-size: 0.75rem; color: #94a3b8; padding: 4px 10px; border-radius: 6px; background-color: #1e293b; border: 1px solid; } .legend-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; } /* ── Highlight marks ────────────────────────────── */ .markdown-preview mark { transition: all 0.15s ease; } .markdown-preview mark:hover { filter: brightness(1.3); transform: scale(1.02); display: inline-block; } .markdown-preview { color: #cbd5e1; } .markdown-preview h1, .markdown-preview h2, .markdown-preview h3, .markdown-preview h4 { color: #e2e8f0; margin-top: 1.2em; margin-bottom: 0.4em; } .markdown-preview p { margin-bottom: 0.8em; } .markdown-preview ul, .markdown-preview ol { margin-bottom: 0.8em; padding-left: 20px; } .markdown-preview li { margin-bottom: 0.2em; } .markdown-preview strong, .markdown-preview b { color: #e2e8f0; font-weight: 600; } .markdown-preview pre { background-color: #0f172a; padding: 12px; border-radius: 6px; overflow-x: auto; border: 1px solid var(--border-color); } .markdown-preview code { font-family: monospace; background-color: #1e293b; padding: 2px 4px; border-radius: 4px; font-size: 0.9em; color: #cbd5e1; } .markdown-preview table { width: 100%; border-collapse: collapse; margin-bottom: 1em; } .markdown-preview th, .markdown-preview td { border: 1px solid var(--border-color); padding: 8px; text-align: left; } .markdown-preview th { background-color: #334155; color: #e2e8f0; } .markdown-content hr { border: 0; height: 1px; background: var(--border-color); margin: 16px 0; } .text-muted { color: #94a3b8; } /* ── Buttons ────────────────────────────────────── */ .btn { border: none; padding: 10px 18px; font-size: 14px; border-radius: 8px; cursor: pointer; font-weight: 600; transition: all 0.2s ease; } .btn-primary { background-color: var(--accent); color: #ffffff; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1); } .btn-primary:hover { background-color: var(--accent-hover); transform: translateY(-1px); } .btn-primary:active { transform: translateY(0); } .btn-secondary { background-color: var(--surface); color: var(--text-color); } .btn-secondary:hover { background-color: #475569; } /* ── Annotations Side Panel ─────────────────────── */ .panel-backdrop { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.3); z-index: 200; } .annotation-panel { position: fixed; top: 0; right: 0; bottom: var(--nav-height); width: 380px; background-color: var(--pane-bg); border-left: 1px solid var(--border-color); z-index: 300; transform: translateX(100%); transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); display: flex; flex-direction: column; box-shadow: -8px 0 30px rgb(0 0 0 / 0.3); } .annotation-panel.open { transform: translateX(0); } .panel-header { display: flex; align-items: center; gap: 10px; padding: 16px 20px; border-bottom: 1px solid var(--border-color); flex-shrink: 0; } .panel-header h3 { margin: 0; flex: 1; } .panel-count { background-color: var(--accent); color: #fff; font-size: 0.75rem; font-weight: 700; padding: 2px 8px; border-radius: 10px; min-width: 24px; text-align: center; } .panel-close { background: none; border: none; color: #94a3b8; font-size: 22px; cursor: pointer; padding: 4px 8px; border-radius: 6px; transition: all 0.15s; } .panel-close:hover { background-color: var(--surface); color: var(--text-color); } .panel-body { flex: 1; overflow-y: auto; padding: 16px; } .panel-empty { text-align: center; padding: 40px 20px; color: #64748b; } .panel-empty p:first-child { font-size: 1rem; } /* ── Panel Cards ────────────────────────────────── */ .panel-annotation-card { background-color: #0f172a; border: 1px solid var(--border-color); border-radius: 10px; padding: 14px; margin-bottom: 12px; transition: border-color 0.2s; } .panel-annotation-card:hover { border-color: var(--accent); } .panel-card-top { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; } .panel-card-author { font-size: 0.75rem; color: #64748b; font-style: italic; } .panel-card-text { margin: 0 0 6px; font-size: 0.9rem; color: #e2e8f0; line-height: 1.4; } .panel-card-position { display: inline-block; font-size: 0.7rem; color: #475569; font-family: monospace; margin-bottom: 8px; } .panel-card-actions { display: flex; gap: 8px; } .btn-panel { background: none; border: 1px solid var(--border-color); color: #94a3b8; font-size: 0.75rem; padding: 4px 10px; border-radius: 5px; cursor: pointer; transition: all 0.15s; } .btn-panel:hover { border-color: #94a3b8; color: var(--text-color); } .btn-panel.save { border-color: #10b981; color: #10b981; } .btn-panel.save:hover { background-color: #10b98120; } .btn-panel.delete.confirming { border-color: var(--error); color: var(--error); animation: pulse 0.6s ease infinite alternate; } @keyframes pulse { from { opacity: 0.7; } to { opacity: 1; } } .panel-card-time { font-size: 0.7rem; color: #475569; margin-top: 6px; } .form-select-small { background-color: var(--bg-color); color: var(--text-color); border: 1px solid var(--accent); border-radius: 5px; padding: 3px 8px; font-size: 0.75rem; cursor: pointer; } .annotation-tag-badge { font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; padding: 3px 8px; border-radius: 4px; } .annotation-tag-badge.clickable { cursor: pointer; transition: opacity 0.15s; } .annotation-tag-badge.clickable:hover { opacity: 0.8; } .panel-card-source { font-size: 0.7rem; color: #64748b; } .inline-edit { display: flex; align-items: center; gap: 4px; } /* Judge info row */ .panel-card-judge { display: flex; align-items: center; gap: 8px; font-size: 0.7rem; margin-top: 2px; } .judge-verdict { font-weight: 600; } .judge-verdict.correct { color: #10b981; } .judge-verdict.wrong { color: #ef4444; } .judge-tag { color: #64748b; font-style: italic; } /* Validated card accents */ .panel-annotation-card.validated-correct { border-left: 3px solid #10b981; } .panel-annotation-card.validated-wrong { border-left: 3px solid #ef4444; } /* Validation status */ .validation-status { font-size: 0.75rem; margin-top: 6px; padding: 6px 8px; border-radius: 6px; } .validation-status.correct { background-color: #10b98115; color: #10b981; } .validation-status.wrong { background-color: #ef444415; color: #ef4444; } .validation-by { color: #64748b; font-style: italic; } .validation-notes { margin: 4px 0 0; color: var(--text-muted); font-style: italic; } /* Validation form */ .validation-form { margin-top: 8px; } .validation-notes-input { width: 100%; background-color: var(--bg-color); color: var(--text-color); border: 1px solid var(--border-color); border-radius: 6px; padding: 6px 8px; font-size: 0.75rem; resize: vertical; margin-bottom: 6px; font-family: inherit; } .validation-notes-input:focus { outline: none; border-color: var(--accent); } .validation-buttons { display: flex; gap: 4px; } .btn-panel.correct { border-color: #10b981; color: #10b981; } .btn-panel.correct:hover { background-color: #10b98120; } .btn-panel.wrong { border-color: #ef4444; color: #ef4444; } .btn-panel.wrong:hover { background-color: #ef444420; } .btn-panel.validate { border-color: #6366f1; color: #6366f1; } .btn-panel.validate:hover { background-color: #6366f120; } /* ── Floating Panel Chevron ────────────────────── */ .panel-chevron { position: fixed; right: 0; top: 50%; transform: translateY(-50%); z-index: 150; background-color: var(--surface); border: 1px solid var(--border-color); border-right: none; color: var(--text-color); font-size: 1.4rem; font-weight: 700; padding: 12px 6px; border-radius: 8px 0 0 8px; cursor: pointer; transition: all 0.2s; line-height: 1; } .panel-chevron:hover { background-color: var(--accent); border-color: var(--accent); } .chevron-badge { position: absolute; top: -6px; left: -6px; background-color: var(--accent); color: #fff; font-size: 0.6rem; font-weight: 700; width: 18px; height: 18px; border-radius: 50%; display: flex; align-items: center; justify-content: center; } /* ── Modal ──────────────────────────────────────── */ .modal-overlay { position: fixed; inset: 0; background-color: rgba(0, 0, 0, 0.6); backdrop-filter: blur(4px); display: flex; align-items: center; justify-content: center; z-index: 1000; animation: fadeIn 0.15s ease; } .modal-content { background-color: var(--pane-bg); border: 1px solid var(--border-color); border-radius: 16px; width: 90%; max-width: 520px; box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.5); animation: slideUp 0.2s ease; } .help-modal-content { max-width: 700px; } .help-modal-body { max-height: 65vh; overflow-y: auto; font-size: 0.9rem; line-height: 1.6; } .help-modal-body h2 { color: #e2e8f0; font-size: 1.1rem; margin-top: 1.2em; } .help-modal-body table { width: 100%; border-collapse: collapse; margin: 0.8em 0; font-size: 0.85rem; } .help-modal-body th, .help-modal-body td { border: 1px solid var(--border-color); padding: 6px 10px; text-align: left; } .help-modal-body th { background-color: #334155; color: #e2e8f0; } .help-modal-body hr { border: 0; height: 1px; background: var(--border-color); margin: 16px 0; } .help-modal-body ol, .help-modal-body ul { padding-left: 20px; } .help-modal-body strong { color: #e2e8f0; } .modal-header { display: flex; justify-content: space-between; align-items: center; padding: 20px 24px 0; } .modal-header h3 { margin: 0; } .modal-close { background: none; border: none; color: #94a3b8; font-size: 24px; cursor: pointer; padding: 4px 8px; border-radius: 6px; transition: all 0.15s; } .modal-close:hover { background-color: var(--surface); color: var(--text-color); } .modal-body { padding: 20px 24px; } .modal-footer { display: flex; justify-content: flex-end; gap: 12px; padding: 0 24px 20px; } /* ── Form Elements ──────────────────────────────── */ .form-group { margin-bottom: 16px; } .form-group label { display: block; font-size: 0.8rem; font-weight: 600; color: #94a3b8; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 6px; } .selected-text-preview { background-color: #2dd4bf15; border: 1px solid #2dd4bf30; padding: 12px; border-radius: 8px; font-style: italic; color: #2dd4bf; max-height: 100px; overflow-y: auto; font-size: 0.95rem; } .form-select { width: 100%; background-color: var(--bg-color); color: var(--text-color); border: 1px solid var(--border-color); border-radius: 8px; padding: 10px 12px; font-size: 0.95rem; font-family: inherit; cursor: pointer; transition: border-color 0.2s; } .form-select:focus { border-color: var(--accent); outline: none; } .form-help { margin-top: 6px; margin-bottom: 0; font-size: 0.8rem; color: #64748b; font-style: italic; } .form-input, .form-textarea { width: 100%; background-color: var(--bg-color); color: var(--text-color); border: 1px solid var(--border-color); border-radius: 8px; padding: 10px 12px; font-size: 0.95rem; font-family: inherit; transition: border-color 0.2s; } .form-input:focus, .form-textarea:focus { border-color: var(--accent); outline: none; } .form-textarea { resize: vertical; min-height: 80px; } /* ── Toast Notifications ────────────────────────── */ .toast { position: fixed; bottom: calc(var(--nav-height) + 16px); right: 24px; padding: 14px 24px; border-radius: 10px; font-weight: 600; font-size: 0.9rem; z-index: 2000; animation: slideInRight 0.3s ease, fadeOut 0.3s ease 2.7s forwards; box-shadow: 0 10px 25px -5px rgb(0 0 0 / 0.3); } .toast-success { background-color: var(--success); color: #fff; } .toast-error { background-color: var(--error); color: #fff; } /* ── Loading ────────────────────────────────────── */ .loading-container { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh; width: 100%; gap: 16px; color: #94a3b8; } .loading-spinner-container { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px; gap: 12px; color: #94a3b8; } .loading-spinner { width: 32px; height: 32px; border: 3px solid var(--border-color); border-top-color: var(--accent); border-radius: 50%; animation: spin 0.8s linear infinite; } /* ── Animations ─────────────────────────────────── */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes slideUp { from { transform: translateY(20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } @keyframes slideInRight { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } @keyframes spin { to { transform: rotate(360deg); } } @keyframes shake { 0%, 100% { transform: translateX(0); } 25% { transform: translateX(-5px); } 50% { transform: translateX(5px); } 75% { transform: translateX(-5px); } } .shake { animation: shake 0.4s ease; }