#root { min-height: 100vh; } .app-shell { display: grid; grid-template-columns: 236px minmax(0, 1fr); min-height: 100vh; } .side-rail { position: sticky; top: 0; display: flex; flex-direction: column; gap: 18px; height: 100vh; padding: 18px; border-right: 1px solid var(--line); background: rgba(23, 17, 13, 0.78); backdrop-filter: blur(18px); } .brand-button, .side-rail nav button, .admin-tabs button, .ghost-button, .primary-button { display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: 40px; border-radius: var(--radius); border: 1px solid var(--line); color: var(--ink); background: rgba(255, 255, 255, 0.04); } .brand-button { justify-content: flex-start; width: 100%; color: var(--brass); font-weight: 800; } .side-rail nav { display: grid; gap: 8px; } .side-rail nav button { justify-content: flex-start; width: 100%; } .session-chip { margin-top: auto; overflow: hidden; color: var(--ink-muted); font-size: 0.82rem; text-overflow: ellipsis; white-space: nowrap; } main { min-width: 0; padding: 28px; } main.app-main-reader { height: 100vh; min-height: 0; padding: 0; overflow: hidden; } .page-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; } .span-2 { grid-column: span 2; } .span-3 { grid-column: 1 / -1; } .panel { border: 1px solid var(--line); border-radius: var(--radius); padding: 18px; background: rgba(38, 26, 18, 0.82); box-shadow: var(--shadow); } .hero-band { grid-column: 1 / -1; display: flex; align-items: end; justify-content: space-between; min-height: 270px; padding: 28px; border: 1px solid var(--line); border-radius: var(--radius); background: linear-gradient(120deg, rgba(32, 21, 14, 0.48), rgba(32, 21, 14, 0.92)), url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='900' height='420' viewBox='0 0 900 420'%3E%3Crect width='900' height='420' fill='%2320150e'/%3E%3Cg fill='none' stroke='%23d5a84d' stroke-opacity='.28'%3E%3Cpath d='M68 326h764M82 286h736M116 120h668M134 84h632'/%3E%3Cpath d='M138 84v242M274 84v242M418 84v242M572 84v242M724 84v242'/%3E%3C/g%3E%3Cg fill='%23a94834' fill-opacity='.72'%3E%3Crect x='166' y='126' width='48' height='156'/%3E%3Crect x='304' y='102' width='34' height='184'/%3E%3Crect x='614' y='134' width='58' height='150'/%3E%3C/g%3E%3Cg fill='%232d6f63' fill-opacity='.72'%3E%3Ccircle cx='492' cy='194' r='48'/%3E%3Cpath d='M742 124l34 92h-68z'/%3E%3C/g%3E%3C/svg%3E") center / cover; } .hero-band p, .auth-hero p { margin: 0 0 8px; color: var(--brass); font-weight: 800; text-transform: uppercase; letter-spacing: 0; } h1, h2, h3, p { margin-top: 0; } h1 { margin-bottom: 8px; font-size: clamp(2.1rem, 6vw, 5rem); line-height: 0.95; } h2 { margin-bottom: 8px; } .primary-button { border-color: rgba(213, 168, 77, 0.62); background: linear-gradient(180deg, #d5a84d, #a94834); color: #17110d; font-weight: 800; } .ghost-button:hover, .side-rail nav button:hover, .brand-button:hover, .admin-tabs button:hover { border-color: rgba(213, 168, 77, 0.55); } .danger-button { color: #ffd8cf; } .danger-button:hover { border-color: rgba(169, 72, 52, 0.78); background: rgba(169, 72, 52, 0.16); } .book-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 16px; } .book-card { display: grid; grid-template-columns: minmax(82px, 96px) minmax(0, 1fr); gap: 14px; min-height: 220px; min-width: 0; padding: 14px; border: 1px solid var(--line); border-radius: var(--radius); background: linear-gradient(180deg, rgba(49, 34, 24, 0.94), rgba(23, 17, 13, 0.94)); } .cover-button, .book-portrait { position: relative; display: grid; place-items: center; width: 100%; min-width: 0; aspect-ratio: 2 / 3; min-height: 0; border: 1px solid rgba(213, 168, 77, 0.35); border-radius: 6px; background: linear-gradient(135deg, rgba(213, 168, 77, 0.2), rgba(45, 111, 99, 0.22)), var(--paper-soft); color: var(--brass); } .cover-loading { position: absolute; right: 7px; bottom: 7px; width: 12px; height: 12px; border: 2px solid rgba(247, 240, 223, 0.78); border-top-color: var(--brass); border-radius: 999px; background: rgba(23, 17, 13, 0.62); animation: spin 0.9s linear infinite; } .cover-button img, .book-portrait img { width: 100%; height: 100%; object-fit: cover; } .book-card h3 { margin-bottom: 5px; line-height: 1.1; overflow-wrap: anywhere; } .book-card-body { display: grid; align-content: start; min-width: 0; } .book-card p, .book-facts p, .section-heading p { color: var(--ink-muted); } .book-description { white-space: pre-line; } .book-card-description { display: -webkit-box; overflow: hidden; -webkit-box-orient: vertical; -webkit-line-clamp: 3; } .book-card-submeta { font-size: 0.82rem; } .book-card-meta, .book-card-actions, .section-heading, .reader-topbar { display: flex; align-items: center; gap: 10px; } .book-card-meta { min-width: 0; overflow: hidden; white-space: nowrap; } .book-card-actions, .section-heading { justify-content: space-between; } .book-card-actions { flex-wrap: wrap; justify-content: flex-start; } .book-card-actions .ghost-button, .book-card-actions .primary-button { flex: 1 1 86px; min-width: 0; padding-inline: 10px; white-space: nowrap; } .format-pill { flex: 0 0 auto; padding: 4px 7px; border-radius: 999px; color: #17110d; font-size: 0.72rem; font-weight: 900; background: var(--brass); } .volume-pill { flex: 0 0 auto; max-width: 48px; overflow: hidden; padding: 4px 7px; border: 1px solid rgba(213, 168, 77, 0.56); border-radius: 999px; color: #f5dfaa; font-size: 0.72rem; font-weight: 900; text-overflow: ellipsis; white-space: nowrap; background: rgba(213, 168, 77, 0.12); } .book-card-language { min-width: 0; overflow: hidden; text-overflow: ellipsis; } .format-pdf { background: var(--lacquer); color: var(--ink); } .format-cbz { background: var(--violet-glass); color: var(--ink); } .format-cbr { background: #6c4f2a; color: var(--ink); } .metadata-pill { width: max-content; max-width: 100%; padding: 4px 7px; border: 1px solid var(--line); border-radius: 999px; color: var(--ink-muted); font-size: 0.72rem; font-weight: 900; } .metadata-enriched { border-color: rgba(45, 111, 99, 0.72); color: #d8fff5; background: rgba(45, 111, 99, 0.18); } .metadata-partial { border-color: rgba(213, 168, 77, 0.68); color: #f5dfaa; background: rgba(213, 168, 77, 0.12); } .metadata-missing { border-color: rgba(169, 72, 52, 0.62); color: #f2b8aa; background: rgba(169, 72, 52, 0.12); } .continue-grid, .library-list, .job-list { display: grid; gap: 10px; } .job-list { max-height: 350px; overflow: auto; padding-right: 4px; } .continue-tile, .library-list button, .job-list > div, .library-table > div { display: grid; gap: 5px; padding: 12px; border: 1px solid var(--line); border-radius: var(--radius); background: rgba(255, 255, 255, 0.035); color: var(--ink); text-align: left; } .library-table > div { grid-template-columns: minmax(0, 1fr) auto auto auto; align-items: center; } .job-copy { display: flex; align-items: center; justify-content: space-between; gap: 10px; } .job-list time { color: var(--ink-muted); font-size: 0.82rem; } .job-copy small { display: block; margin-top: 3px; color: var(--ink-muted); } .continue-tile { grid-template-columns: 52px minmax(0, 1fr); align-items: start; } .continue-cover { display: grid; place-items: center; aspect-ratio: 2 / 3; overflow: hidden; border: 1px solid rgba(213, 168, 77, 0.35); border-radius: 5px; background: linear-gradient(135deg, rgba(213, 168, 77, 0.2), rgba(45, 111, 99, 0.22)), var(--paper-soft); color: var(--brass); } .continue-cover img { width: 100%; height: 100%; object-fit: cover; } .continue-copy { display: grid; gap: 5px; min-width: 0; } .continue-copy > span { color: var(--ink-muted); } .continue-copy .metadata-pill { color: inherit; } .library-copy { display: grid; gap: 7px; min-width: 0; } .library-copy strong, .library-copy span { display: block; } .library-copy strong { overflow-wrap: anywhere; } .library-copy span { color: var(--ink-muted); overflow-wrap: anywhere; } .meter { display: block; width: 100%; height: 8px; overflow: hidden; border-radius: 999px; background: rgba(255, 255, 255, 0.09); } .meter span { display: block; height: 100%; background: linear-gradient(90deg, var(--verdigris), var(--brass)); } .auth-surface { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(320px, 420px); gap: 24px; min-height: 100vh; padding: 28px; } .auth-hero { display: flex; flex-direction: column; justify-content: end; min-height: calc(100vh - 56px); padding: 28px; border-radius: var(--radius); background: linear-gradient(180deg, rgba(23, 17, 13, 0.12), rgba(23, 17, 13, 0.9)), url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='720' height='960' viewBox='0 0 720 960'%3E%3Crect width='720' height='960' fill='%23261a12'/%3E%3Cpath d='M80 190h560v590H80z' fill='none' stroke='%23d5a84d' stroke-opacity='.38' stroke-width='6'/%3E%3Ccircle cx='360' cy='426' r='112' fill='%232d6f63' fill-opacity='.64'/%3E%3Cpath d='M210 676h300M244 728h232M180 250h360' stroke='%23e8d2a6' stroke-opacity='.36' stroke-width='10'/%3E%3C/svg%3E") center / cover; } .auth-panel { align-self: center; } .stack-form, .admin-form { display: grid; gap: 12px; } label { display: grid; gap: 6px; color: var(--ink-muted); font-size: 0.9rem; } label small { color: var(--ink-muted); line-height: 1.35; } input { min-height: 42px; border: 1px solid var(--line); border-radius: var(--radius); padding: 0 12px; color: var(--ink); background: rgba(0, 0, 0, 0.22); } select { min-height: 42px; border: 1px solid var(--line); border-radius: var(--radius); padding: 0 34px 0 12px; color: var(--ink); background: rgba(0, 0, 0, 0.22); } .full-width { width: 100%; margin-top: 12px; } .error-ribbon { margin: 10px 0; padding: 10px 12px; border: 1px solid rgba(169, 72, 52, 0.72); border-radius: var(--radius); color: #ffd8cf; background: rgba(169, 72, 52, 0.18); } .success-ribbon { margin: 10px 0; padding: 10px 12px; border: 1px solid rgba(45, 111, 99, 0.72); border-radius: var(--radius); color: #d8fff5; background: rgba(45, 111, 99, 0.18); } .initial-admin-box { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 10px; margin: 12px 0; padding: 12px; border: 1px solid rgba(213, 168, 77, 0.45); border-radius: var(--radius); background: rgba(213, 168, 77, 0.12); } .initial-admin-box div { display: grid; gap: 4px; min-width: 0; } .initial-admin-box code { width: max-content; max-width: 100%; overflow-wrap: anywhere; color: var(--brass); } .muted-copy, .initial-admin-box span, .initial-admin-box small { color: var(--ink-muted); } .retry-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin: 10px 0; color: var(--ink-muted); } .admin-tabs { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; } .admin-tabs button { min-width: 170px; padding: 0 14px; } .admin-tabs button.active { border-color: rgba(213, 168, 77, 0.72); background: rgba(213, 168, 77, 0.16); color: var(--brass); } .automation-grid { display: grid; grid-column: 1 / -1; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; } .compact-heading { align-items: flex-start; } .compact-heading h2 { margin-bottom: 4px; } .toggle-stack, .provider-list, .schedule-controls { display: grid; gap: 12px; } .toggle-row { grid-template-columns: auto minmax(0, 1fr); align-items: start; } .toggle-row input[type="checkbox"] { width: 20px; min-height: 20px; margin-top: 2px; accent-color: var(--brass); } .toggle-row span, .provider-row > div:first-child { display: grid; gap: 4px; min-width: 0; } .toggle-row strong, .provider-row strong { color: var(--ink); } .provider-row { display: grid; grid-template-columns: minmax(210px, 1fr) minmax(240px, 360px) auto; gap: 12px; align-items: center; padding: 12px; border: 1px solid var(--line); border-radius: var(--radius); background: rgba(255, 255, 255, 0.035); } .provider-local { grid-template-columns: minmax(0, 1fr) auto; } .provider-row span, .provider-row small { color: var(--ink-muted); } .provider-config { display: grid; gap: 8px; min-width: 0; } .provider-state-line { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; } .provider-state-line small { flex: 1 1 160px; } .provider-warning { margin: 0; padding: 8px 10px; border: 1px solid rgba(213, 168, 77, 0.45); border-radius: 6px; color: #f5dfaa; background: rgba(213, 168, 77, 0.1); } .provider-state-configured { border-color: rgba(45, 111, 99, 0.72); color: #d8fff5; background: rgba(45, 111, 99, 0.18); } .provider-state-missing-config { border-color: rgba(213, 168, 77, 0.68); color: #f5dfaa; background: rgba(213, 168, 77, 0.12); } .provider-state-limited, .provider-state-error { border-color: rgba(169, 72, 52, 0.62); color: #f2b8aa; background: rgba(169, 72, 52, 0.12); } .provider-actions, .save-bar, .save-bar div { display: flex; align-items: center; gap: 8px; } .provider-actions { justify-content: end; } .icon-button { width: 42px; padding: 0; } .icon-text-button { padding: 0 12px; white-space: nowrap; } .status-pill { width: max-content; max-width: 100%; padding: 5px 8px; border-radius: 999px; border: 1px solid var(--line); color: var(--ink-muted); font-size: 0.78rem; font-weight: 800; } .status-pill.active { border-color: rgba(45, 111, 99, 0.72); color: #d8fff5; background: rgba(45, 111, 99, 0.18); } .schedule-controls { grid-template-columns: repeat(2, minmax(0, 1fr)); } .save-bar { justify-content: space-between; color: var(--ink-muted); } .empty-state, .loading-state { display: grid; place-items: center; gap: 8px; min-height: 160px; color: var(--ink-muted); text-align: center; } .specimen-mark { display: grid; place-items: center; width: 42px; height: 42px; border: 1px solid var(--line); border-radius: 999px; color: var(--brass); } .spinner { width: 28px; height: 28px; border: 3px solid rgba(255, 255, 255, 0.13); border-top-color: var(--brass); border-radius: 999px; animation: spin 0.9s linear infinite; } .search-form { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 10px; align-items: center; } .book-detail { display: grid; grid-template-columns: minmax(220px, 360px) minmax(0, 1fr); gap: 18px; } .book-portrait { min-height: 520px; } .book-fact-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; margin: 6px 0 14px; } .book-fact-list > div { min-width: 0; padding: 10px; border: 1px solid var(--line); border-radius: 6px; background: rgba(255, 255, 255, 0.035); } .book-fact-list dt { color: var(--ink-muted); font-size: 0.76rem; font-weight: 800; text-transform: uppercase; } .book-fact-list dd { margin: 4px 0 0; overflow-wrap: anywhere; } .lead { font-size: 1.15rem; } .profile-panel { display: grid; gap: 10px; justify-items: start; } .reader-page { display: grid; grid-template-rows: auto auto minmax(0, 1fr); gap: 8px; height: 100vh; min-height: 100vh; padding: 10px; overflow: hidden; background: #120e0b; } main.app-main-reader .reader-page { height: 100%; min-height: 0; } .reader-page:fullscreen, .reader-fullscreen-fallback { width: 100vw; height: 100vh; min-height: 100vh; padding: 10px; background: #120e0b; } .reader-fullscreen-fallback { position: fixed; inset: 0; z-index: 1000; } .reader-fullscreen-active { grid-template-rows: minmax(0, 1fr); padding: 0; } .reader-fullscreen-active .reader-topbar { position: absolute; top: 10px; right: 10px; left: 10px; z-index: 20; transition: opacity 160ms ease, transform 160ms ease; } .reader-fullscreen-active.reader-header-hidden .reader-topbar { pointer-events: none; opacity: 0; transform: translateY(-12px); } .reader-fullscreen-active .reader-status { position: absolute; top: 64px; right: 10px; left: 10px; z-index: 15; } .reader-fullscreen-active .reader-stage { grid-row: 1; width: 100%; height: 100%; } .reader-topbar { grid-row: 1; display: flex; align-items: center; gap: 8px; min-width: 0; min-height: 42px; padding: 6px 8px; border: 1px solid var(--line); border-radius: var(--radius); background: rgba(38, 26, 18, 0.84); } .reader-zoom-controls { display: inline-flex; align-items: center; gap: 6px; flex: 0 0 auto; } .reader-zoom-button { width: 34px; min-width: 34px; padding: 0; font-weight: 800; } .reader-zoom-label { min-width: 58px; color: var(--ink-muted); text-align: center; white-space: nowrap; } .reader-mode-control { display: inline-flex; align-items: center; gap: 6px; flex: 0 0 auto; color: var(--ink-muted); font-size: 0.82rem; white-space: nowrap; } .reader-mode-control select { min-height: 32px; border: 1px solid var(--line); border-radius: var(--radius); color: var(--ink); background: rgba(255, 255, 255, 0.06); } .reader-title { flex: 1 1 auto; overflow: hidden; min-width: 0; max-width: none; text-overflow: ellipsis; white-space: nowrap; } .reader-position { flex: 0 0 auto; min-width: 92px; color: var(--ink-muted); text-align: center; } .reader-topbar .ghost-button { flex: 0 0 auto; min-height: 32px; white-space: nowrap; } .reader-fullscreen-toggle { margin-left: auto; } .reader-status { grid-row: 2; display: flex; align-items: center; gap: 8px; min-width: 0; } .reader-stage { grid-row: 3; position: relative; display: grid; place-items: center; min-height: 0; min-width: 0; padding: 0; overflow: auto; } .reader-content { display: grid; place-items: center; min-width: 100%; min-height: 100%; width: max-content; height: max-content; } .reader-mode-vertical .reader-content { align-self: start; align-items: start; justify-self: stretch; width: 100%; height: auto; } .reader-mode-vertical .reader-stage { align-items: start; justify-items: center; overflow-anchor: none; } .pdf-reader, .epub-reader, .cbz-reader { display: grid; place-items: center; min-width: 100%; min-height: 100%; } .pdf-reader-vertical, .cbz-reader-vertical { align-items: start; width: 100%; height: auto; } .reader-vertical-stack { display: flex; flex-direction: column; align-items: center; gap: 18px; width: 100%; min-height: 100%; padding: 12px 0 24px; } .epub-host { display: grid; width: 100%; height: 100%; min-height: 0; } .epub-reader { place-items: stretch; overflow: auto; padding: 14px; } .epub-view { width: 100%; height: 100%; border: 1px solid var(--line); border-radius: var(--radius); background: #f7f0df; color: #17110d; } .pdf-page-frame, .comic-page-frame { display: grid; place-items: center; width: max-content; height: max-content; min-width: 100%; min-height: max(64px, 100%); margin: 0; } .pdf-page-frame-vertical, .comic-page-frame-vertical { width: 100%; min-height: 72vh; padding: 0 12px; } .pdf-page-frame canvas, .cbz-reader img { display: block; width: auto; height: auto; box-sizing: border-box; border: 1px solid var(--line); border-radius: var(--radius); background: #f7f0df; object-fit: contain; } .reader-fallback { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 10px; padding: 12px; color: var(--ink-muted); } .reader-error { display: grid; gap: 14px; width: min(100%, 620px); padding: 18px; border: 1px solid rgba(169, 72, 52, 0.72); border-radius: var(--radius); background: rgba(169, 72, 52, 0.14); } .reader-error p { margin-bottom: 0; color: var(--ink-muted); } .reader-error-actions { display: flex; flex-wrap: wrap; gap: 8px; } .reader-error a { text-decoration: none; } .reader-error details { color: var(--ink-muted); } .reader-error summary { cursor: pointer; } .reader-error pre { overflow: auto; max-width: 100%; margin: 10px 0 0; white-space: pre-wrap; } @keyframes spin { to { transform: rotate(360deg); } } @media (max-width: 900px) { .app-shell, .auth-surface, .book-detail { grid-template-columns: 1fr; } .side-rail { position: fixed; inset: auto 0 0; z-index: 10; flex-direction: row; height: auto; padding: 8px; } .side-rail nav { grid-template-columns: repeat(5, 1fr); flex: 1; } .side-rail nav button span, .brand-button span, .session-chip { display: none; } main { padding: 16px 16px 86px; } main.app-main-reader { height: calc(100vh - 58px); padding: 0 0 58px; overflow: hidden; } .page-grid { grid-template-columns: 1fr; } .span-2, .span-3 { grid-column: 1; } .hero-band { min-height: 220px; align-items: start; flex-direction: column; } .auth-surface { padding: 16px; } .auth-hero { min-height: 360px; } .book-card { grid-template-columns: minmax(72px, 82px) minmax(0, 1fr); } .book-card-actions .ghost-button { display: none; } .library-table > div, .search-form, .book-fact-list, .automation-grid, .provider-row, .provider-local, .schedule-controls, .save-bar, .reader-error-actions { grid-template-columns: 1fr; } .save-bar, .save-bar div, .provider-actions, .reader-error-actions { justify-content: stretch; } .save-bar div, .provider-actions, .reader-error-actions { display: grid; grid-template-columns: 1fr 1fr; } .reader-page { padding: 8px; } .reader-topbar { gap: 8px; flex-wrap: wrap; align-content: start; overflow: hidden; } .reader-back-button, .reader-nav-button, .reader-fullscreen-toggle { width: 34px; min-width: 34px; padding: 0; } .reader-back-button { order: 1; } .reader-title { order: 2; flex: 1 1 120px; font-size: 0.9rem; } .reader-position { order: 3; min-width: 78px; font-size: 0.78rem; } .reader-fullscreen-toggle { order: 4; margin-left: 0; } .reader-mode-control { order: 5; flex: 1 1 132px; min-width: 0; } .reader-mode-control select { width: 100%; min-width: 0; max-width: 100%; font-size: 0.78rem; } .reader-previous-button { order: 6; } .reader-next-button { order: 7; } .reader-zoom-controls { order: 8; flex: 0 1 auto; min-width: 0; gap: 4px; } .reader-zoom-label { min-width: 46px; font-size: 0.78rem; } .reader-back-button span, .reader-nav-button span, .reader-fullscreen-toggle span, .reader-mode-control > span { display: none; } .reader-zoom-reset { display: none; } .epub-host { width: 100%; } }