/* ========================================================================== 5. Bookshelf, Continuous Reader, Typography Controls & Wikipedia ========================================================================== */ /* ========================================================================== Stage 5: Interactive Reader & Bookshelf Styles ========================================================================== */ .reader-view { max-width: 1100px; margin: 0 auto; padding: 24px 20px 80px; } .bookshelf-header { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 16px; margin-bottom: 28px; padding-bottom: 20px; border-bottom: 1px solid var(--border-color); } .bookshelf-title-wrap h2 { font-size: 24px; font-weight: 700; color: var(--text-main); display: flex; align-items: center; gap: 8px; } .bookshelf-title-wrap .subtitle { font-size: 14px; color: var(--text-muted); margin-top: 4px; } .bookshelf-actions { display: flex; align-items: center; gap: 12px; } .file-upload-label { cursor: pointer; display: inline-flex; align-items: center; gap: 6px; } .bookshelf-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; } .book-card { background-color: var(--bg-surface); border: 1px solid var(--border-color); border-radius: var(--radius-lg); padding: 20px; display: flex; flex-direction: column; justify-content: space-between; transition: var(--transition); position: relative; box-shadow: var(--shadow-sm); } .book-card:hover { border-color: var(--border-focus); box-shadow: var(--shadow-md); transform: translateY(-2px); } .book-card-top { display: flex; align-items: flex-start; gap: 14px; margin-bottom: 14px; } .book-cover-icon { font-size: 32px; background: var(--bg-input); border: 1px solid var(--border-color); border-radius: var(--radius-md); width: 52px; height: 64px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .book-card-info { flex: 1; min-width: 0; } .book-card-title { font-size: 16px; font-weight: 700; color: var(--text-main); margin-bottom: 4px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .book-card-author { font-size: 13px; color: var(--text-muted); margin-bottom: 8px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .book-card-badges { display: flex; align-items: center; gap: 8px; } .badge-format { text-transform: uppercase; font-size: 10px; font-weight: 700; padding: 2px 6px; border-radius: var(--radius-sm); background: var(--tag-bg); color: var(--tag-text); } .badge-words { font-size: 12px; color: var(--text-dim); } .book-progress-wrap { margin: 14px 0 16px; } .book-progress-labels { display: flex; justify-content: space-between; font-size: 12px; color: var(--text-dim); margin-bottom: 6px; } .book-progress-bar-bg { width: 100%; height: 6px; background-color: var(--bg-input); border-radius: var(--radius-full); overflow: hidden; } .book-progress-bar-fill { height: 100%; background-color: var(--primary); border-radius: var(--radius-full); transition: width 0.3s ease; } .book-card-actions { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding-top: 12px; border-top: 1px solid var(--border-color); } /* Bookshelf Divider between General Books & RFC Specifications */ .bookshelf-divider { margin: 48px 0 36px; border: 0; height: 1px; background: linear-gradient(90deg, transparent, var(--border-color) 15%, var(--border-color) 85%, transparent); } /* RFC Specifications Section */ .rfc-section { margin-top: 8px; } .rfc-header { margin-bottom: 20px; } .rfc-title-row { display: flex; align-items: center; gap: 14px; } .rfc-icon-badge { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; font-size: 24px; background: rgba(14, 165, 233, 0.12); border: 1px solid rgba(14, 165, 233, 0.28); border-radius: var(--radius-md); flex-shrink: 0; } .rfc-heading { font-size: 20px; font-weight: 700; color: var(--text-main); margin: 0; } .rfc-fetch-box { background: var(--bg-surface); border: 1px solid var(--border-color); border-radius: var(--radius-lg); padding: 20px 24px; margin-bottom: 24px; box-shadow: var(--shadow-sm); } .rfc-fetch-form { margin-bottom: 16px; } .rfc-input-wrap { display: flex; align-items: stretch; gap: 10px; } .rfc-input-prefix { display: inline-flex; align-items: center; padding: 0 14px; font-weight: 700; font-size: 13px; letter-spacing: 0.05em; color: #38bdf8; background: rgba(56, 189, 248, 0.12); border: 1px solid rgba(56, 189, 248, 0.25); border-radius: var(--radius-md); user-select: none; } .rfc-input { flex: 1; min-width: 0; } .rfc-fetch-btn { white-space: nowrap; padding: 0 20px; display: inline-flex; align-items: center; justify-content: center; font-weight: 600; } .rfc-fetch-status { margin-top: 10px; padding: 8px 14px; font-size: 13px; border-radius: var(--radius-md); transition: all 0.2s ease; } .rfc-status-loading { background: rgba(14, 165, 233, 0.1); color: #38bdf8; border: 1px solid rgba(14, 165, 233, 0.25); } .rfc-status-success { background: rgba(34, 197, 94, 0.12); color: #4ade80; border: 1px solid rgba(34, 197, 94, 0.25); } .rfc-status-error { background: rgba(239, 68, 68, 0.12); color: #f87171; border: 1px solid rgba(239, 68, 68, 0.25); } .rfc-presets-wrap { display: flex; flex-direction: column; gap: 10px; } .rfc-presets-label { font-size: 12px; text-transform: uppercase; font-weight: 600; letter-spacing: 0.05em; color: var(--text-dim); } .rfc-presets-list { display: flex; flex-wrap: wrap; gap: 8px; } .rfc-preset-chip { background: var(--bg-input); color: var(--text-main); border: 1px solid var(--border-color); border-radius: var(--radius-full); padding: 6px 14px; font-size: 12.5px; font-weight: 500; cursor: pointer; transition: var(--transition); user-select: none; display: inline-flex; align-items: center; gap: 5px; } .rfc-preset-chip:hover { background: rgba(14, 165, 233, 0.15); border-color: #38bdf8; color: #38bdf8; transform: translateY(-1px); } .rfc-empty-state { padding: 36px 20px; background: var(--bg-surface); border: 1px dashed var(--border-color); border-radius: var(--radius-lg); margin-bottom: 24px; } .rfc-card { border-color: rgba(56, 189, 248, 0.2); } .rfc-card:hover { border-color: rgba(56, 189, 248, 0.5); box-shadow: 0 8px 24px rgba(14, 165, 233, 0.12); } .rfc-cover-icon { background: rgba(14, 165, 233, 0.1); border-color: rgba(14, 165, 233, 0.25); } .badge-rfc { background: rgba(14, 165, 233, 0.2); color: #38bdf8; border: 1px solid rgba(14, 165, 233, 0.35); } .rfc-progress-fill { background: linear-gradient(90deg, #0284c7, #38bdf8); } @media (max-width: 640px) { .rfc-input-wrap { flex-direction: column; } .rfc-input-prefix { display: none; } .rfc-fetch-btn { width: 100%; padding: 10px 16px; } } /* ========================================================================== Wikipedia Articles Section & Settings Modal ========================================================================== */ .wiki-section { margin-top: 8px; } .wiki-header { margin-bottom: 20px; } .wiki-title-row { display: flex; align-items: center; gap: 14px; } .wiki-icon-badge { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; font-size: 24px; background: rgba(168, 85, 247, 0.12); border: 1px solid rgba(168, 85, 247, 0.28); border-radius: var(--radius-md); flex-shrink: 0; } .wiki-heading { font-size: 20px; font-weight: 700; color: var(--text-main); margin: 0; } .wiki-action-box { background: var(--bg-surface); border: 1px solid var(--border-color); border-radius: var(--radius-lg); padding: 20px 24px; margin-bottom: 24px; box-shadow: var(--shadow-sm); } .wiki-primary-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 14px; } .wiki-read-btn { padding: 10px 24px; font-weight: 700; font-size: 15px; background: linear-gradient(135deg, #6366f1, #8b5cf6); border: none; box-shadow: 0 4px 14px rgba(99, 102, 241, 0.35); transition: all 0.2s ease; } .wiki-read-btn:hover { background: linear-gradient(135deg, #4f46e5, #7c3aed); transform: translateY(-1px); box-shadow: 0 6px 18px rgba(99, 102, 241, 0.45); } .wiki-settings-btn { padding: 10px 18px; font-weight: 600; border-color: rgba(168, 85, 247, 0.35); color: var(--text-main); } .wiki-settings-btn:hover { background: rgba(168, 85, 247, 0.12); border-color: #a855f7; color: #c084fc; } .wiki-badges-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 13px; } .wiki-badges-label { color: var(--text-dim); font-size: 12px; text-transform: uppercase; font-weight: 600; letter-spacing: 0.05em; margin-right: 4px; } .wiki-badge-chip { background: rgba(168, 85, 247, 0.12); color: #c084fc; border: 1px solid rgba(168, 85, 247, 0.28); border-radius: var(--radius-full); padding: 4px 12px; font-weight: 500; font-size: 12px; display: inline-flex; align-items: center; gap: 4px; } .wiki-fetch-status { margin-top: 14px; padding: 10px 16px; font-size: 13.5px; border-radius: var(--radius-md); transition: all 0.2s ease; } .wiki-status-loading { background: rgba(99, 102, 241, 0.12); color: #818cf8; border: 1px solid rgba(99, 102, 241, 0.3); } .wiki-status-success { background: rgba(34, 197, 94, 0.12); color: #4ade80; border: 1px solid rgba(34, 197, 94, 0.25); } .wiki-status-error { background: rgba(239, 68, 68, 0.12); color: #f87171; border: 1px solid rgba(239, 68, 68, 0.25); } .wiki-empty-state { padding: 36px 20px; background: var(--bg-surface); border: 1px dashed var(--border-color); border-radius: var(--radius-lg); margin-bottom: 24px; } /* Card styling for Wikipedia and thumbnails */ .wiki-card { border-color: rgba(168, 85, 247, 0.22); } .wiki-card:hover { border-color: rgba(168, 85, 247, 0.55); box-shadow: 0 8px 24px rgba(168, 85, 247, 0.15); } .wiki-cover-icon { background: rgba(168, 85, 247, 0.12); border-color: rgba(168, 85, 247, 0.3); color: #c084fc; } .badge-wiki { background: rgba(168, 85, 247, 0.18); color: #c084fc; border: 1px solid rgba(168, 85, 247, 0.35); } .wiki-progress-fill { background: linear-gradient(90deg, #7c3aed, #a855f7); } .book-cover-img-wrap { width: 52px; height: 64px; border-radius: var(--radius-sm); overflow: hidden; flex-shrink: 0; background: rgba(0, 0, 0, 0.2); border: 1px solid var(--border-color); display: flex; align-items: center; justify-content: center; } .book-cover-img { width: 100%; height: 100%; object-fit: cover; display: block; } .badge-time { display: inline-flex; align-items: center; gap: 3px; background: rgba(255, 255, 255, 0.06); color: var(--text-dim); font-size: 11px; font-weight: 500; padding: 2px 7px; border-radius: var(--radius-sm); border: 1px solid rgba(255, 255, 255, 0.08); } /* Wikipedia Settings Modal */ .wiki-modal-window { max-width: 620px; width: 95%; } .wiki-modal-body { display: flex; flex-direction: column; gap: 22px; } .wiki-setting-group { display: flex; flex-direction: column; gap: 10px; } .wiki-group-label { font-size: 13.5px; font-weight: 700; color: var(--text-main); letter-spacing: 0.02em; } .wiki-radio-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } .wiki-radio-card { display: flex; align-items: flex-start; gap: 12px; padding: 14px 16px; background: var(--bg-input); border: 1px solid var(--border-color); border-radius: var(--radius-md); cursor: pointer; transition: all 0.2s ease; user-select: none; } .wiki-radio-card:hover { border-color: rgba(168, 85, 247, 0.4); background: rgba(168, 85, 247, 0.04); } .wiki-radio-card:has(input:checked) { border-color: #a855f7; background: rgba(168, 85, 247, 0.1); box-shadow: 0 0 0 1px #a855f7; } .wiki-radio-card input[type="radio"] { margin-top: 3px; accent-color: #a855f7; } .wiki-radio-card-content { display: flex; flex-direction: column; gap: 5px; } .wiki-card-title-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; } .wiki-card-desc { font-size: 12px; color: var(--text-dim); line-height: 1.45; margin: 0; } .badge-level-pill { font-size: 10.5px; font-weight: 700; padding: 1px 7px; border-radius: var(--radius-full); text-transform: uppercase; letter-spacing: 0.04em; } .badge-level-a2 { background: rgba(34, 197, 94, 0.2); color: #4ade80; border: 1px solid rgba(34, 197, 94, 0.35); } .badge-level-b2 { background: rgba(59, 130, 246, 0.2); color: #60a5fa; border: 1px solid rgba(59, 130, 246, 0.35); } .wiki-time-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 8px; } .wiki-time-pill { display: flex; align-items: center; position: relative; cursor: pointer; user-select: none; } .wiki-time-pill input[type="radio"] { position: absolute; opacity: 0; pointer-events: none; } .wiki-pill-text { width: 100%; display: flex; flex-direction: column; align-items: center; text-align: center; padding: 10px 8px; background: var(--bg-input); border: 1px solid var(--border-color); border-radius: var(--radius-md); font-size: 13px; font-weight: 600; color: var(--text-main); transition: all 0.2s ease; } .wiki-pill-text small { font-size: 11px; font-weight: normal; margin-top: 2px; } .wiki-time-pill:hover .wiki-pill-text { border-color: rgba(168, 85, 247, 0.4); } .wiki-time-pill input[type="radio"]:checked + .wiki-pill-text { border-color: #a855f7; background: rgba(168, 85, 247, 0.12); color: #c084fc; box-shadow: 0 0 0 1px #a855f7; } .wiki-select { width: 100%; padding: 10px 14px; font-size: 14px; } .wiki-direct-import-group { border-top: 1px dashed var(--border-color); padding-top: 18px; } .wiki-custom-input-wrap { display: flex; align-items: center; gap: 10px; } .wiki-custom-input { flex: 1; min-width: 0; } .wiki-custom-fetch-btn { white-space: nowrap; padding: 0 18px; font-weight: 600; } @media (max-width: 640px) { .wiki-radio-cards { grid-template-columns: 1fr; } .wiki-custom-input-wrap { flex-direction: column; } .wiki-custom-fetch-btn { width: 100%; padding: 10px 16px; } } /* Reader Interface */ .reader-interface { background-color: var(--bg-surface); border: 1px solid var(--border-color); border-radius: var(--radius-lg); box-shadow: var(--shadow-lg); } .reader-toolbar { position: sticky; top: var(--navbar-height, 60px); z-index: 1000; background-color: var(--bg-surface); border-top-left-radius: var(--radius-lg); border-top-right-radius: var(--radius-lg); border-bottom: 1px solid var(--border-color); padding: 12px 18px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; box-shadow: 0 4px 14px rgba(0, 0, 0, 0.15); } .reader-toolbar-left { display: flex; align-items: center; gap: 14px; } .reader-meta { display: flex; flex-direction: column; } .reader-title { font-size: 16px; font-weight: 700; color: var(--text-main); line-height: 1.2; } .reader-author { font-size: 12px; color: var(--text-muted); } .reader-toolbar-center { display: flex; align-items: center; gap: 8px; } .reader-select { padding: 6px 12px; border-radius: var(--radius-sm); background-color: var(--bg-input); color: var(--text-main); border: 1px solid var(--border-color); font-size: 13px; outline: none; max-width: 240px; } .reader-progress-badge { font-size: 11px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--primary); background: var(--primary-dim); border: 1px solid rgba(56, 189, 248, 0.35); padding: 3px 8px; border-radius: var(--radius-full); min-width: 40px; text-align: center; display: inline-block; user-select: none; line-height: 1.2; } .reader-chapter-progress-bar { position: absolute; left: 0; right: 0; bottom: -1px; height: 3px; background-color: rgba(255, 255, 255, 0.08); overflow: hidden; pointer-events: none; } .reader-chapter-progress-fill { height: 100%; width: 0%; background: linear-gradient(90deg, #0284c7, #38bdf8); box-shadow: 0 0 8px rgba(56, 189, 248, 0.5); transition: width 0.12s cubic-bezier(0.16, 1, 0.3, 1); } .reader-toolbar-right { display: flex; align-items: center; gap: 10px; } .font-controls { display: flex; align-items: center; gap: 4px; } .reader-scroll-area { --reader-font-size: 18px; --reader-line-height: 1.65; --reader-font-family: 'Literata', 'Merriweather', 'Georgia', 'Cambria', serif; --reader-max-width: 760px; --reader-padding-h: 24px; --reader-text-align: left; --reader-bg: var(--bg-surface); --reader-text: var(--text-main); background-color: var(--reader-bg); min-height: 60vh; padding: 0; transition: background-color 0.2s ease, color 0.2s ease; } .reader-content-body { max-width: var(--reader-max-width); margin: 0 auto; padding: 32px var(--reader-padding-h) 80px; font-family: var(--reader-font-family); font-size: var(--reader-font-size); line-height: var(--reader-line-height); text-align: var(--reader-text-align); color: var(--reader-text); word-break: break-word; user-select: text; transition: font-size 0.15s ease, line-height 0.15s ease, max-width 0.2s ease, padding 0.2s ease; } /* Reader Appearance Themes */ .reader-scroll-area.reader-theme-sepia { --reader-bg: #fbf0d9; --reader-text: #433422; } .reader-scroll-area.reader-theme-sepia .reader-word:hover { background-color: rgba(217, 119, 6, 0.25); color: #92400e; } .reader-scroll-area.reader-theme-sepia blockquote { background-color: #f4e4c1; border-color: #d6bc97; color: #5f4b32; } .reader-scroll-area.reader-theme-sepia .reader-inline-code, .reader-scroll-area.reader-theme-sepia .reader-code-wrap pre { background-color: #efe0bc; color: #433422; border-color: #dec89f; } .reader-scroll-area.reader-theme-sepia .reader-table th, .reader-scroll-area.reader-theme-sepia .reader-table td { border-color: #dec89f; } .reader-scroll-area.reader-theme-light { --reader-bg: #ffffff; --reader-text: #1e293b; } .reader-scroll-area.reader-theme-light blockquote { background-color: #f8fafc; border-color: #cbd5e1; color: #334155; } .reader-scroll-area.reader-theme-light .reader-inline-code, .reader-scroll-area.reader-theme-light .reader-code-wrap pre { background-color: #f1f5f9; color: #0f172a; border-color: #e2e8f0; } .reader-scroll-area.reader-theme-light .reader-word:hover { background-color: rgba(2, 132, 199, 0.15); color: #0284c7; } .reader-scroll-area.reader-theme-oled { --reader-bg: #000000; --reader-text: #d8e2ec; } .reader-scroll-area.reader-theme-oled blockquote { background-color: #0a0e17; border-color: #1e293b; } .reader-scroll-area.reader-theme-oled .reader-inline-code, .reader-scroll-area.reader-theme-oled .reader-code-wrap pre { background-color: #0a0e17; border-color: #1e293b; } .reader-scroll-area.reader-theme-dark { --reader-bg: var(--bg-surface); --reader-text: var(--text-main); } /* Reader Font Families */ .reader-scroll-area.reader-font-sans { --reader-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; } .reader-scroll-area.reader-font-serif { --reader-font-family: 'Literata', 'Merriweather', 'Georgia', 'Cambria', 'Times New Roman', serif; } .reader-scroll-area.reader-font-mono { --reader-font-family: 'JetBrains Mono', 'Fira Code', 'Menlo', 'Consolas', monospace; } /* Reader Margin & Width Variants */ .reader-scroll-area.reader-margins-narrow { --reader-max-width: 940px; --reader-padding-h: 12px; } .reader-scroll-area.reader-margins-normal { --reader-max-width: 760px; --reader-padding-h: 24px; } .reader-scroll-area.reader-margins-wide { --reader-max-width: 600px; --reader-padding-h: 36px; } /* Reader Text Alignment */ .reader-scroll-area.reader-align-left { --reader-text-align: left; } .reader-scroll-area.reader-align-justify { --reader-text-align: justify; hyphens: auto; } /* Reader Appearance Settings Panel / Sheet */ .reader-settings-panel { position: fixed; top: 64px; right: 28px; width: 330px; max-width: calc(100vw - 32px); max-height: calc(100vh - 80px); display: flex; flex-direction: column; background-color: var(--bg-surface); border: 1px solid var(--border-focus); border-radius: var(--radius-lg); box-shadow: 0 16px 36px rgba(0, 0, 0, 0.45); z-index: 10006; padding: 16px; animation: fadeIn 0.15s ease-out; } .reader-settings-header { display: flex; justify-content: space-between; align-items: center; flex-shrink: 0; margin-bottom: 12px; padding-bottom: 8px; border-bottom: 1px solid var(--border-color); } .reader-settings-header h4 { font-size: 15px; font-weight: 700; color: var(--text-main); } .reader-settings-body { display: flex; flex-direction: column; gap: 12px; overflow-y: auto; padding-right: 4px; scrollbar-width: thin; scrollbar-color: var(--border-focus) transparent; } .reader-settings-body::-webkit-scrollbar { width: 6px; } .reader-settings-body::-webkit-scrollbar-thumb { background-color: var(--border-focus); border-radius: 3px; } .setting-row { display: flex; flex-direction: column; gap: 6px; } .setting-row-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; align-items: flex-end; } .setting-row-grid .seg-btn { padding: 6px 4px; font-size: 11.5px; } .setting-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; color: var(--text-muted); } .setting-segmented-control { display: flex; background-color: var(--bg-input); border: 1px solid var(--border-color); border-radius: var(--radius-sm); padding: 2px; gap: 2px; } .seg-btn { flex: 1; padding: 6px 8px; font-size: 12px; font-weight: 600; background: transparent; border: none; border-radius: 4px; color: var(--text-muted); cursor: pointer; transition: var(--transition); text-align: center; } .seg-btn:hover { color: var(--text-main); } .seg-btn.active { background-color: var(--primary); color: #0f172a; } .setting-stepper { display: flex; align-items: center; justify-content: space-between; background-color: var(--bg-input); border: 1px solid var(--border-color); border-radius: var(--radius-sm); padding: 4px 6px; } .step-btn { background: var(--bg-surface-hover); border: 1px solid var(--border-color); border-radius: 4px; color: var(--text-main); font-size: 13px; font-weight: 700; width: 38px; height: 32px; display: flex; align-items: center; justify-content: center; cursor: pointer; } .step-val { font-size: 14px; font-weight: 700; color: var(--primary); } .theme-palette { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; } .theme-chip { padding: 7px 10px; font-size: 12px; font-weight: 600; border-radius: var(--radius-sm); border: 2px solid transparent; cursor: pointer; text-align: center; transition: var(--transition); } .theme-chip-dark { background: #1e293b; color: #f8fafc; border-color: #334155; } .theme-chip-sepia { background: #fbf0d9; color: #433422; border-color: #d6bc97; } .theme-chip-light { background: #ffffff; color: #0f172a; border-color: #cbd5e1; } .theme-chip-oled { background: #000000; color: #e2e8f0; border-color: #334155; } .theme-chip.active { border-color: var(--primary) !important; box-shadow: 0 0 0 2px var(--primary-dim); } .reader-settings-btn { display: inline-flex; align-items: center; gap: 4px; } .reader-content-body h1, .reader-content-body h2, .reader-content-body h3, .reader-content-body h4, .reader-content-body h5, .reader-content-body h6 { font-family: var(--font-family); margin: 28px 0 16px; color: var(--text-main); text-indent: 0; } .reader-content-body h4 { font-size: 1.15em; } .reader-content-body h5 { font-size: 1.05em; } .reader-content-body p { margin-bottom: 20px; text-indent: 1.2em; } /* Fenced Code Block */ .reader-code-block { margin: 24px 0; border-radius: var(--radius-md); background: #141820; border: 1px solid var(--border-color); overflow: hidden; box-shadow: 0 4px 14px rgba(0, 0, 0, 0.3); } .reader-code-header { display: flex; justify-content: space-between; align-items: center; padding: 8px 14px; background: rgba(255, 255, 255, 0.04); border-bottom: 1px solid var(--border-color); font-family: monospace; font-size: 12px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; } .reader-code-lang { font-weight: 600; } .reader-copy-code-btn { background: transparent; border: 1px solid var(--border-color); color: var(--text-muted); border-radius: 4px; padding: 3px 8px; font-size: 11px; cursor: pointer; transition: all 0.15s ease; display: inline-flex; align-items: center; gap: 4px; } .reader-copy-code-btn:hover { background: rgba(255, 255, 255, 0.08); color: var(--text-main); border-color: var(--primary); } .reader-content-body pre { margin: 0; padding: 16px; overflow-x: auto; background: transparent; border: none; border-radius: 0; font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace; font-size: 14.5px; line-height: 1.6; text-indent: 0 !important; white-space: pre; tab-size: 4; } .reader-content-body pre code { font-family: inherit; font-size: inherit; color: #e6edf3; background: transparent; padding: 0; border: none; white-space: pre; display: block; text-indent: 0; } /* Inline Code Badge */ .reader-inline-code { font-family: 'JetBrains Mono', 'Consolas', monospace; font-size: 0.88em; background: rgba(255, 255, 255, 0.08); color: var(--primary); padding: 2px 6px; border-radius: 4px; border: 1px solid rgba(255, 255, 255, 0.12); white-space: pre-wrap; word-break: break-all; } /* Blockquote */ .reader-content-body blockquote { margin: 20px 0; padding: 12px 20px; border-left: 4px solid var(--primary); background: rgba(56, 189, 248, 0.06); border-radius: 0 var(--radius-md) var(--radius-md) 0; font-style: italic; color: var(--text-main); text-indent: 0; } .reader-content-body blockquote p { margin: 0; text-indent: 0; } /* Lists */ .reader-content-body ul, .reader-content-body ol { margin: 16px 0 20px 24px; padding-left: 12px; text-indent: 0; } .reader-content-body li { margin-bottom: 8px; line-height: 1.7; text-indent: 0; } .reader-content-body hr { border: 0; height: 1px; background: var(--border-color); margin: 32px 0; } /* Headings */ .reader-content-body h1, .reader-content-body h2, .reader-content-body h3, .reader-content-body h4, .reader-content-body h5, .reader-content-body h6 { color: var(--text-main); font-weight: 700; line-height: 1.35; margin: 32px 0 16px; text-indent: 0 !important; } .reader-content-body h1 { font-size: 28px; border-bottom: 1px solid var(--border-color); padding-bottom: 10px; } .reader-content-body h2 { font-size: 23px; border-bottom: 1px solid var(--border-color); padding-bottom: 8px; } .reader-content-body h3 { font-size: 19px; } .reader-content-body h4 { font-size: 17px; } /* Markdown Tables */ .reader-table-wrap { overflow-x: auto; margin: 24px 0; border-radius: var(--radius-md); border: 1px solid var(--border-color); background: var(--bg-surface); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); } .reader-table { width: 100%; border-collapse: collapse; font-size: 14.5px; line-height: 1.6; text-indent: 0 !important; } .reader-table th, .reader-table td { padding: 10px 16px; border-bottom: 1px solid var(--border-color); border-right: 1px solid var(--border-color); vertical-align: top; text-indent: 0 !important; } .reader-table th:last-child, .reader-table td:last-child { border-right: none; } .reader-table tr:last-child td { border-bottom: none; } .reader-table th { background-color: rgba(255, 255, 255, 0.05); font-weight: 700; color: var(--text-main); text-align: left; } .reader-table tbody tr:hover { background-color: rgba(255, 255, 255, 0.02); } /* Links & Images */ .reader-link { color: var(--primary); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 3px; transition: color 0.15s ease; } .reader-link:hover { color: var(--primary-hover); } .reader-img { max-width: 100%; height: auto; border-radius: var(--radius-md); margin: 8px 0; vertical-align: middle; } .reader-content-body p img { margin: 4px 6px; display: inline-block; vertical-align: middle; } /* Figures and Media (Images, Diagrams, Animated GIFs, SVGs) */ .reader-figure { margin: 28px auto; padding: 14px; background: var(--bg-surface); border: 1px solid var(--border-color); border-radius: var(--radius-lg); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); display: flex; flex-direction: column; align-items: center; max-width: 95%; box-sizing: border-box; } .reader-figure-img { max-width: 100%; max-height: 480px; width: auto; height: auto; border-radius: var(--radius-md); object-fit: contain; display: block; } .reader-figcaption { margin-top: 12px; padding-top: 10px; border-top: 1px solid rgba(255, 255, 255, 0.08); font-size: 13.5px; line-height: 1.55; color: var(--text-dim); text-align: center; max-width: 90%; font-style: italic; user-select: text; } .reader-figcaption .reader-word { font-style: normal; } .reader-content-body p[style*="text-align: center"], .reader-content-body p.text-center { text-indent: 0 !important; } .reader-content-body strong, .reader-content-body b { font-weight: 700; color: var(--text-main); } .reader-content-body em, .reader-content-body i { font-style: italic; } .reader-content-body sub, .reader-content-body sup { font-size: 0.8em; line-height: 0; position: relative; vertical-align: baseline; } .reader-content-body sub { bottom: -0.25em; } .reader-content-body sup { top: -0.5em; } /* Interactive Words */ .reader-word { cursor: pointer; border-radius: 3px; transition: background-color 0.12s ease, color 0.12s ease; padding: 1px 2px; } .reader-word:hover { background-color: var(--primary-dim); color: var(--primary); } .reader-word.status-mastered.highlight-enabled { border-bottom: 2px dotted rgba(16, 185, 129, 0.5); } .reader-word.status-learning.highlight-enabled { border-bottom: 2px dotted rgba(56, 189, 248, 0.5); } /* Click-to-Translate Popup */ .reader-word-popup { position: fixed; z-index: 10005; background-color: var(--bg-surface); border: 1px solid var(--border-focus); border-radius: var(--radius-lg); box-shadow: 0 12px 24px -4px rgba(0, 0, 0, 0.5); width: 320px; max-width: calc(100vw - 32px); padding: 16px; animation: fadeInScale 0.15s ease-out; } .popup-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; padding-bottom: 8px; border-bottom: 1px solid var(--border-color); } .popup-term-wrap { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .popup-term { font-size: 18px; color: var(--text-main); } .popup-phonetic { font-size: 13px; color: var(--primary); font-family: monospace; } .popup-close-btn { background: none; border: none; color: var(--text-dim); font-size: 16px; cursor: pointer; padding: 4px; } /* Phrasal Verb & Collocation Card in Word Popup */ .popup-phrasal-card { background: linear-gradient(135deg, rgba(99, 102, 241, 0.12), rgba(168, 85, 247, 0.08)); border: 1px solid rgba(99, 102, 241, 0.35); border-radius: var(--radius-sm); padding: 8px 10px; margin-bottom: 10px; animation: fadeIn 0.15s ease-out; } .phrasal-card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 4px; } .phrasal-tag { font-size: 10px; font-weight: 700; color: var(--primary); text-transform: uppercase; letter-spacing: 0.04em; } .phrasal-term-row { display: flex; align-items: baseline; gap: 6px; flex-wrap: wrap; margin-bottom: 2px; } .phrasal-term { font-size: 14px; color: var(--text-main); } .phrasal-raw { font-size: 11px; color: var(--text-muted); font-style: italic; } .phrasal-translation { font-size: 12px; font-weight: 600; color: var(--success); margin-bottom: 6px; line-height: 1.35; } .phrasal-card-actions { display: flex; gap: 6px; margin-top: 4px; } .phrasal-action-btn { font-size: 11px; padding: 3px 8px; width: 100%; justify-content: center; } .popup-translation { font-size: 15px; font-weight: 600; color: var(--success); margin-bottom: 8px; } .popup-context-box { margin-bottom: 14px; } .popup-context { font-size: 12px; color: var(--text-muted); font-style: italic; background: var(--bg-input); padding: 8px 10px; border-radius: var(--radius-sm); margin-bottom: 6px; line-height: 1.4; border-left: 3px solid var(--primary); } .popup-sentence-ai-bar { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 6px; } .popup-sentence-btn { font-size: 11px; padding: 3px 8px; cursor: pointer; border-radius: var(--radius-sm); display: inline-flex; align-items: center; gap: 4px; } .popup-ai-source-badge { font-size: 10px; font-weight: 600; color: var(--primary); background: rgba(99, 102, 241, 0.12); border: 1px solid rgba(99, 102, 241, 0.25); padding: 2px 6px; border-radius: 9999px; letter-spacing: 0.02em; } .popup-sentence-loading { font-size: 11px; color: var(--text-muted); padding: 6px 8px; display: flex; align-items: center; gap: 6px; background: var(--bg-input); border-radius: var(--radius-sm); margin-bottom: 6px; } .popup-sentence-translation-wrap { background: rgba(99, 102, 241, 0.08); border: 1px solid rgba(99, 102, 241, 0.2); border-radius: var(--radius-sm); padding: 8px 10px; margin-bottom: 6px; animation: fadeIn 0.15s ease-out; } .popup-sentence-ru { font-size: 13px; line-height: 1.45; color: var(--text-main); margin-bottom: 6px; } .popup-context-meaning-wrap { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; font-size: 11px; padding-top: 6px; border-top: 1px dashed rgba(99, 102, 241, 0.2); } .context-meaning-label { color: var(--text-muted); } .context-meaning-val { color: var(--success); font-weight: 600; } .use-meaning-btn { font-size: 10px; padding: 1px 6px; color: var(--primary); border: 1px solid var(--primary); border-radius: 4px; cursor: pointer; background: transparent; } .use-meaning-btn:hover { background: rgba(99, 102, 241, 0.15); } .popup-saved-badge { text-align: center; font-size: 13px; font-weight: 600; color: #f59e0b; background: rgba(245, 158, 11, 0.12); border: 1px solid rgba(245, 158, 11, 0.3); border-radius: var(--radius-sm); padding: 6px 10px; } .popup-in-library-badge { display: inline-flex; align-items: center; gap: 3px; font-size: 11px; font-weight: 600; color: #f59e0b; background: rgba(245, 158, 11, 0.15); border: 1px solid rgba(245, 158, 11, 0.4); padding: 2px 7px; border-radius: 9999px; margin-left: 6px; letter-spacing: 0.02em; vertical-align: middle; } .badge-library-star { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; font-weight: 600; color: #f59e0b; background: rgba(245, 158, 11, 0.15); border: 1px solid rgba(245, 158, 11, 0.4); padding: 2px 8px; border-radius: 9999px; margin-left: 8px; vertical-align: middle; } /* ========================================================================== Continuous Reading & Chapter End Navigation Card ========================================================================== */ /* Chapter Divider (Between chapters in continuous / autoload mode) */ .reader-chapter-divider { display: flex; flex-direction: column; align-items: center; justify-content: center; margin: 56px 0 36px; padding: 24px 16px; border-top: 1px dashed var(--border-color); border-bottom: 1px dashed var(--border-color); background: rgba(255, 255, 255, 0.02); border-radius: var(--radius-md); text-align: center; scroll-margin-top: 60px; } .reader-chapter-divider .divider-badge { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.8px; color: var(--primary); background: var(--bg-input); padding: 4px 12px; border-radius: 9999px; border: 1px solid var(--border-color); margin-bottom: 10px; display: inline-block; } .reader-chapter-divider .divider-title { font-size: 22px !important; font-weight: 700; color: var(--text-main); margin: 0 !important; border-bottom: none !important; padding-bottom: 0 !important; text-align: center; } /* Chapter End Navigation Card */ .reader-chapter-footer { margin: 48px 0 64px; padding: 24px 20px; background: var(--bg-surface); border: 1px solid var(--border-color); border-radius: var(--radius-lg); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); display: flex; flex-direction: column; align-items: center; text-align: center; gap: 14px; transition: var(--transition); } .reader-chapter-footer .chapter-footer-status { display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600; color: var(--text-muted); } .reader-chapter-footer .chapter-footer-status .status-check { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 50%; background: rgba(34, 197, 94, 0.15); color: var(--success); font-size: 13px; font-weight: 700; } .reader-chapter-footer .chapter-footer-nav { display: flex; gap: 12px; width: 100%; max-width: 540px; justify-content: center; flex-wrap: wrap; } .reader-chapter-footer .reader-footer-nav-btn { flex: 1; min-width: 150px; min-height: 44px; display: inline-flex; align-items: center; justify-content: center; gap: 6px; font-size: 14px; font-weight: 600; padding: 10px 18px; border-radius: var(--radius-sm); cursor: pointer; transition: var(--transition); } .reader-chapter-footer .chapter-footer-hint { font-size: 12px; color: var(--text-dim); line-height: 1.4; max-width: 480px; } /* Book Completion Card */ .reader-chapter-footer.reader-book-finished { background: linear-gradient(180deg, rgba(56, 189, 248, 0.08) 0%, rgba(20, 24, 32, 0.95) 100%); border-color: rgba(56, 189, 248, 0.35); } .reader-chapter-footer.reader-book-finished .chapter-footer-hint { color: var(--text-muted); font-size: 13px; } /* Reading Theme Adaptations */ .reader-scroll-area.reader-theme-sepia .reader-chapter-divider, .reader-scroll-area.reader-theme-light .reader-chapter-divider { background: rgba(0, 0, 0, 0.025); border-color: rgba(0, 0, 0, 0.12); } .reader-scroll-area.reader-theme-sepia .reader-chapter-footer, .reader-scroll-area.reader-theme-light .reader-chapter-footer { background: rgba(0, 0, 0, 0.03); border-color: rgba(0, 0, 0, 0.12); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06); } .reader-scroll-area.reader-theme-oled .reader-chapter-divider { background: #080808; border-color: #222; } .reader-scroll-area.reader-theme-oled .reader-chapter-footer { background: #0c0c0c; border-color: #222; } /* --- Responsive Mobile Overrides (max-width: 768px) --- */ @media (max-width: 768px) { /* 6. Bookshelf & Reader View */ .reader-view { padding: 14px 12px calc(76px + env(safe-area-inset-bottom, 0px)); } .bookshelf-header { flex-direction: column; align-items: stretch; gap: 12px; margin-bottom: 18px; } .bookshelf-title-wrap h2 { font-size: 19px; } .bookshelf-actions { width: 100%; display: flex; gap: 8px; } .bookshelf-actions .btn, .bookshelf-actions .file-upload-label { flex: 1; justify-content: center; text-align: center; padding: 10px; } .bookshelf-grid { grid-template-columns: 1fr; gap: 12px; } .book-card { padding: 14px; } /* Reader Interface Toolbar */ .reader-toolbar { position: static !important; top: auto !important; box-shadow: none !important; padding: 8px 10px; gap: 8px; flex-direction: column; align-items: stretch; } .reader-toolbar-left { width: 100%; justify-content: space-between; gap: 8px; } .reader-meta { flex: 1; min-width: 0; } .reader-title { font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .reader-author { font-size: 11px; } .reader-toolbar-center { width: 100%; justify-content: space-between; gap: 6px; } .reader-select { flex: 1; max-width: none; min-width: 0; } .reader-toolbar-right { width: 100%; justify-content: space-between; gap: 6px; border-top: 1px solid var(--border-color); padding-top: 6px; } .reader-content-body { padding: 14px 12px; font-size: 17px; line-height: 1.65; } }