/* Telegram Scraper WebUI — single solid design system (opaque solid colors only). One cascade layer. Opaque hex palette. Two radii levels + badge-only pill. */ :root { color-scheme: dark; /* Core opaque palette */ --bg: #0c0c0d; --panel: #141414; --panel-alt: #0f0f10; --inset: #0e0e0e; --border: #3a3a3a; --border-strong: #4a4a4a; --text: #f2f2f2; --dim: #a8a8a8; --muted: #8f8f8f; --accent: #f1f1f1; --accent-ink: #111111; --link: #6ea8fe; --danger: #ff6b6b; --danger-border: #7a2e2e; --danger-bg: #2a1212; --danger-bg-hover: #3a1616; --ok: #65e6a4; --warn: #f6c969; --info: #8ec7ff; /* Viewer bubbles (out of redesign scope — kept, opaque hex) */ --bubble-own: #0f1c3f; --bubble-other: #111111; /* Radii: panel/dialog/toast 10px, controls 8px, badges 999px only */ --radius-panel: 10px; --radius-control: 8px; --radius-badge: 999px; /* Gutters */ --gutter: 18px; --gap: 16px; --font-ui: Inter, 'SF Pro Display', 'Helvetica Neue', -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; --font-mono: 'IBM Plex Mono', 'SFMono-Regular', Consolas, monospace; /* Legacy aliases (single system — all map to opaque tokens) */ --bg-color: var(--bg); --panel-solid: var(--panel); --text-color: var(--text); --line: var(--border); --accent-hover: #ffffff; --accent-soft: #1c1c1d; --accent-line: var(--border-strong); --accent-2: #d8d8d8; --sidebar-width: 244px; } * { box-sizing: border-box; } body { margin: 0; background: var(--bg); color: var(--text); font-family: var(--font-ui); font-size: 14px; line-height: 1.55; -webkit-font-smoothing: antialiased; } h1 { margin: 0; font-size: 20px; font-weight: 700; line-height: 1.35; letter-spacing: -0.02em; } h2 { margin: 0; font-size: 17px; font-weight: 600; line-height: 1.35; letter-spacing: -0.02em; } p { margin: 0; } a { color: var(--link); text-decoration: none; } a:hover { text-decoration: underline; } code, pre, input, button, select { font: inherit; } :focus-visible { outline: 2px solid var(--link); outline-offset: 2px; } /* Type scale */ .eyebrow, .section-title { color: var(--muted); font-size: 11px; font-weight: 650; letter-spacing: 0.08em; text-transform: uppercase; } .muted { color: var(--muted); font-size: 13px; line-height: 1.55; } .small { font-size: 12px; line-height: 1.5; } /* ---------- App shell / sidebar / content ---------- */ .app-shell { display: grid; grid-template-columns: var(--sidebar-width) minmax(0, 1fr); width: 100vw; max-width: 100vw; min-width: 0; min-height: 100vh; height: 100vh; overflow: hidden; } .sidebar { width: var(--sidebar-width); position: sticky; top: 0; height: 100vh; overflow-y: auto; padding: var(--gutter) 12px; background: var(--panel-alt); border-right: 1px solid var(--border); } .content { overflow-y: auto; min-width: 0; width: 100%; max-width: 1280px; margin-inline: auto; padding: 20px 20px 28px; } .brand-block { position: relative; display: block; min-height: 62px; padding: 5px 9px 14px; } .brand-icon { position: absolute; top: 9px; left: 9px; width: 27px; height: 27px; fill: none; stroke: var(--accent); stroke-width: 1.65; stroke-linecap: round; stroke-linejoin: round; } .brand-block .eyebrow { margin: 0 0 3px 37px; } .brand-block h1 { margin-left: 37px; } .brand-block .muted { margin: 8px 0 0 37px; max-width: 30ch; } /* ---------- Navigation ---------- */ .nav-links, .jobs-list, .continuous-form { display: grid; gap: 10px; } .nav-links { gap: 5px; margin: 6px 0 0; } .nav-link { display: inline-flex; align-items: center; gap: 12px; min-height: 45px; padding: 0 13px; border: 1px solid transparent; border-radius: var(--radius-control); background: transparent; color: var(--dim); font-size: 13px; font-weight: 650; cursor: pointer; } .nav-link:hover { background: #1c1c1d; border-color: var(--border); color: var(--text); text-decoration: none; } .nav-link.active { background: #202020; border-color: transparent; color: var(--text); } .nav-icon { display: inline-grid; flex: 0 0 20px; width: 20px; height: 20px; place-items: center; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; font-size: 17px; line-height: 1; } /* ---------- Sidebar status cards ---------- */ .status-card { display: grid; gap: 12px; align-content: start; margin-top: 20px; padding: 15px 10px 5px; background: transparent; border: 0; border-top: 1px solid var(--border); } .status-card:first-of-type { margin-top: auto; } .status-card .section-title, .status-card p, .status-card .status-badge { margin-top: 0; margin-bottom: 0; } .status-card .button { width: 100%; } .status-badge { display: inline-flex; padding: 7px 12px; border: 1px solid var(--border); border-radius: var(--radius-badge); background: var(--inset); color: var(--text); font-size: 12px; font-weight: 700; } /* ---------- Topbar ---------- */ .dashboard-topbar { display: flex; align-items: center; justify-content: space-between; gap: 20px; min-height: 58px; margin: -20px -20px 16px; padding: 0 20px; border-bottom: 1px solid var(--border); } .dashboard-title, .runtime-status { display: inline-flex; align-items: center; gap: 12px; color: var(--text); font-size: 14px; font-weight: 650; } .dashboard-title { gap: 22px; } .menu-icon { color: var(--dim); font-size: 21px; font-weight: 400; } .runtime-status { gap: 13px; color: var(--dim); font-size: 12px; font-weight: 500; } .runtime-status i { width: 1px; height: 17px; background: var(--border-strong); } .runtime-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--ok); } .runtime-clock::before { content: '◷'; color: var(--dim); font-size: 17px; } /* ---------- Tabs ---------- */ .content-tabs, .account-tabs { display: flex; flex-wrap: wrap; gap: 0; margin-bottom: var(--gap); padding-bottom: 0; border-bottom: 0; } .account-tabs { padding-bottom: 14px; border-bottom: 1px solid var(--border); } #account-tabs:empty { display: none; } .content-tab, .account-tab { min-height: 36px; padding: 7px 14px; border: 1px solid var(--border); border-radius: 0; background: var(--panel-alt); color: var(--dim); font-size: 13px; cursor: pointer; } .content-tab:first-child, .account-tab:first-child { border-radius: var(--radius-control) 0 0 var(--radius-control); } .content-tab + .content-tab, .account-tab + .account-tab { margin-left: -1px; } .content-tab:last-child, .account-tab:last-child { border-radius: 0 var(--radius-control) var(--radius-control) 0; } .content-tab:hover, .account-tab:hover { background: #1c1c1d; color: var(--text); } .content-tab.active, .account-tab.active { position: relative; z-index: 1; border-color: var(--border-strong); background: #202020; color: var(--text); } .account-tab .account-tab-status { font-size: 12px; color: var(--muted); } .account-tab .account-tab-status.ok { color: var(--ok); } .account-tab .account-tab-status.errored { color: var(--danger); } .tab-panel { display: none; } .tab-panel.active { display: block; } .account-panel { display: block; } .account-panel.hidden { display: none; } /* ---------- Panels (single level: border + bg + radius only here) ---------- */ .panel, .stat-panel, .job-card, .message-card, .settings-dialog { background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius-panel); } .panel { margin-bottom: var(--gap); padding: 0; overflow: hidden; } .panel-grid { display: grid; gap: var(--gap); grid-template-columns: repeat(4, minmax(0, 1fr)); margin-bottom: var(--gap); } .settings-health-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } .panel-header, .dialog-header, .job-head { display: flex; align-items: center; justify-content: space-between; gap: var(--gap); } .panel-header { min-height: 52px; padding: 14px var(--gutter); border-bottom: 1px solid var(--border); } /* Panel subtitles are always visible (muted returns) */ .panel-header .muted { display: block; margin: 4px 0 0; } /* Single body wrapper: the only padded content zone inside .panel */ .panel-body { display: grid; gap: 12px; padding: 0 var(--gutter) var(--gutter); } .panel-body:first-child { padding-top: var(--gutter); } .panel-header + .panel-body { padding-top: var(--gutter); } .panel-body > *:first-child { margin-top: 0; } /* Stat panels keep their own padding (no header/body split) */ .stat-panel { position: relative; min-height: 208px; padding: var(--gutter) var(--gutter) 16px; } .stat-value { margin-top: 20px; font-size: 27px; font-weight: 500; letter-spacing: -0.04em; } .stat-compact { font-size: 19px; } .stat-caption { margin-top: 3px; color: var(--dim); font-size: 12px; } .stat-meta { position: absolute; right: var(--gutter); bottom: 15px; left: var(--gutter); display: grid; grid-template-columns: 1fr 1fr; gap: 12px; color: var(--dim); font-size: 12px; } .stat-meta span + span { padding-left: 12px; border-left: 1px solid var(--border); } .stat-meta strong { display: block; margin-bottom: 1px; color: var(--text); font-size: 14px; font-weight: 500; } .stat-panel .section-title { max-width: none; } .stat-panel .stat-value, .stat-panel .stat-caption { padding-left: 2px; } .stat-panel .stat-caption { margin-bottom: 0; } .stat-panel .account-health-detail { display: none; } /* ---------- Hero (solid: border + panel bg + radius, no border-top:0) ---------- */ .settings-hero { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--gap); margin-bottom: var(--gap); padding: var(--gutter); background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius-panel); } .settings-hero .eyebrow { margin-bottom: 4px; } #settings-empty { padding: 0; } /* ---------- Empty states: single component, flat, no nested card ---------- */ .empty-state, .viewer-empty-state { padding: var(--gutter); border: 0; border-radius: 0; background: transparent; color: var(--dim); } .empty-state .eyebrow { margin-bottom: 4px; } .empty-state h2, .viewer-empty-state h2, #settings-empty h2 { font-size: 17px; font-weight: 600; line-height: 1.35; color: var(--text); } .empty-state p, .viewer-empty-state p { margin: 6px 0 0; color: var(--dim); } .empty-state .empty-actions, .viewer-empty-state .empty-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; } .viewer-empty-state { align-self: center; margin-top: var(--gap); text-align: center; } .viewer-empty-state .empty-actions { justify-content: center; } /* ---------- Status helpers (JS sets classes, never inline style.color) ---------- */ .is-ok { color: var(--ok); } .is-warn { color: var(--warn); } .is-error { color: var(--danger); } .is-dim { color: var(--dim); } .account-list-auth-status.is-ok { color: var(--ok); } .account-list-auth-status.is-error { color: var(--danger); } /* ---------- Buttons (8px control radius everywhere, no pills) ---------- */ .button, .nav-link.button, a.button { display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: 38px; padding: 8px 14px; border: 1px solid var(--border); border-radius: var(--radius-control); background: #1b1b1c; color: var(--text); font-size: 14px; font-weight: 600; cursor: pointer; } .button:hover { background: #232324; border-color: var(--border-strong); color: var(--text); text-decoration: none; } .button:active { background: #2a2a2b; border-color: var(--border-strong); } .button.primary { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); } .button.primary:hover { background: #ffffff; border-color: #ffffff; color: #080808; } .button.primary:active { background: #d8d8d8; border-color: #d8d8d8; } .button.danger { background: var(--danger-bg); border-color: var(--danger-border); color: var(--danger); } .button.danger:hover { background: var(--danger-bg-hover); border-color: var(--danger); color: var(--danger); } .button.button-small { min-height: 30px; padding: 5px 10px; font-size: 12px; } .button:disabled { cursor: not-allowed; opacity: 0.45; } .button-block { width: 100%; } /* ---------- Forms: visible labels above fields ---------- */ .inline-form { display: flex; flex-wrap: wrap; gap: 8px; } .inline-form input { width: 168px; } .stack-form { display: grid; gap: 12px; margin-top: 0; } .field { display: grid; gap: 6px; } .field-label { font-size: 13px; font-weight: 600; color: var(--text); } .field-hint, .form-hint { font-size: 12px; color: var(--muted); line-height: 1.5; } .form-hint { margin: 0; } input, select { width: 100%; min-width: 0; min-height: 38px; padding: 9px 12px; border: 1px solid var(--border); border-radius: var(--radius-control); background: var(--inset); color: var(--text); font-size: 14px; outline: 0; } input::placeholder { color: var(--muted); } input:hover, select:hover { border-color: var(--border-strong); } input:focus, select:focus { border-color: var(--border-strong); outline: 2px solid var(--link); outline-offset: 1px; } label.toggle-row, .toggle-row { display: flex; align-items: center; justify-content: space-between; gap: var(--gap); font-size: 14px; } /* Inner group boxes: border + radius with transparent bg (no third bg layer) */ .add-account-form, .import-account-row, .qr-wrap, .account-list-item, .checkbox-row, .settings-account-button { border: 1px solid var(--border); border-radius: var(--radius-control); background: transparent; } .add-account-form { display: grid; gap: 12px; padding: 14px; } .import-account-row { display: grid; gap: 8px; padding: 14px; cursor: pointer; } .import-account-row input { cursor: pointer; } .file-example { font-family: var(--font-mono); font-size: 12px; color: var(--dim); background: var(--inset); border-radius: var(--radius-control); padding: 8px 10px; overflow-x: auto; white-space: pre; } .qr-wrap { margin-top: 0; padding: 12px; } .qr-wrap img { display: block; width: 100%; max-width: 240px; aspect-ratio: 1; margin: 0 auto 10px; background: #ffffff; border-radius: var(--radius-control); } .auth-actions { display: flex; flex-wrap: wrap; gap: 8px; } /* ---------- Settings page structure ---------- */ .settings-layout { display: grid; grid-template-columns: minmax(280px, 0.9fr) minmax(320px, 1.1fr); gap: var(--gap); align-items: start; } .settings-layout .panel:last-child { grid-column: 1 / -1; } .settings-page-shell .content { max-width: 1280px; margin-inline: auto; } /* ---------- Confirm dialog (styled replacement for window.confirm) ---------- */ .confirm-dialog { width: min(440px, calc(100vw - 32px)); padding: 0; background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius-panel); color: var(--text); } .confirm-dialog::backdrop { background: #000000; } .confirm-dialog-body { display: grid; gap: 12px; padding: var(--gutter); } .confirm-dialog-actions { display: flex; justify-content: flex-end; gap: 8px; } .settings-account-list { display: grid; gap: 10px; margin-top: 14px; } .settings-account-button { width: 100%; min-height: 48px; display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; align-items: center; text-align: left; padding: 12px 14px; color: var(--text); cursor: pointer; font-size: 14px; } .settings-account-button:hover { border-color: var(--border-strong); background: #1c1c1d; } .settings-account-button.active { border-color: var(--border-strong); background: #202020; } .settings-account-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .settings-account-status { color: var(--warn); font-size: 12px; } .settings-account-status.ok { color: var(--ok); } .settings-meta-list { display: grid; gap: 8px; color: var(--dim); font-size: 13px; } /* ---------- Account list / tabs helpers ---------- */ .accounts-list { display: grid; gap: 10px; margin-bottom: 14px; } .account-list-item { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 14px; } .account-list-info { display: grid; gap: 2px; min-width: 0; } .account-list-label { font-weight: 700; font-size: 14px; } .account-list-id { font-size: 12px; color: var(--muted); } .account-list-auth-status { font-size: 12px; color: var(--muted); } .account-list-actions { display: flex; gap: 6px; flex-shrink: 0; } #active-account-name { word-break: break-all; } #active-account-status { margin-top: 6px; } /* ---------- Toggle (geometry 42x22 preserved) ---------- */ .switch { position: relative; display: inline-flex; width: 42px; min-width: 42px; height: 22px; } .switch input { position: absolute; inset: 0; min-width: 0; width: 100%; margin: 0; opacity: 0; cursor: pointer; } .switch-slider { position: absolute; inset: 0; border: 1px solid var(--border); border-radius: var(--radius-badge); background: var(--inset); } .switch-slider::before { content: ''; position: absolute; top: 3px; left: 3px; width: 14px; height: 14px; border-radius: 50%; background: var(--muted); } .switch input:checked + .switch-slider { border-color: var(--border-strong); background: var(--accent); } .switch input:checked + .switch-slider::before { transform: translateX(20px); background: var(--accent-ink); } .switch input:focus-visible + .switch-slider { outline: 2px solid var(--link); outline-offset: 2px; } /* ---------- Tables / jobs / logs ---------- */ .table-wrap { overflow-x: auto; } table { width: 100%; border-collapse: collapse; } th, td { height: 38px; padding: 9px 10px; text-align: left; vertical-align: middle; border-bottom: 1px solid var(--border); } th { color: var(--muted); font-size: 11px; font-weight: 650; letter-spacing: 0.08em; text-transform: uppercase; } td { color: var(--dim); font-size: 12px; } tbody tr:hover { background: #1c1c1d; } .action-row { display: flex; flex-wrap: wrap; gap: 8px; } .action-row .button, td .button, .job-card .button { min-height: 30px; padding: 5px 10px; font-size: 12px; } .jobs-list { display: grid; gap: 10px; } .job-card { padding: 14px; } .job-status { color: var(--dim); font-size: 11px; text-transform: uppercase; } .job-logs, .log-viewer { border: 1px solid var(--border); border-radius: var(--radius-control); background: var(--inset); font-family: var(--font-mono); font-size: 12px; } .job-logs { max-height: 220px; margin: 10px 0 0; overflow: auto; white-space: pre-wrap; color: var(--dim); padding: 10px 12px; } .continuous-meta { display: grid; gap: 4px; color: var(--dim); font-size: 13px; } .continuous-meta span { color: var(--text); } .checkbox-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 8px; margin-top: 8px; } .checkbox-row { display: flex; align-items: center; gap: 10px; min-height: 38px; padding: 10px 12px; font-size: 13px; } .checkbox-row input { width: auto; min-width: auto; } .checkbox-row.disabled { opacity: 0.45; } .log-viewer { display: grid; max-height: 420px; overflow: auto; } .log-line { display: grid; grid-template-columns: 86px 112px 74px minmax(0, 1fr); gap: 10px; padding: 5px 9px; border-bottom: 1px solid var(--border); font-size: 12px; } .log-line:hover { background: #1c1c1d; } .log-time, .log-age, .log-level { color: var(--dim); } .log-message { white-space: pre-wrap; overflow-wrap: anywhere; } .log-line.info .log-level, .log-line.info .log-message { color: var(--info); } .log-line.success .log-level, .log-line.success .log-message { color: var(--ok); } .log-line.warn .log-level, .log-line.warn .log-message { color: var(--warn); } .log-line.error .log-level, .log-line.error .log-message { color: var(--danger); } /* ---------- Dialog / toast ---------- */ .settings-dialog { width: min(720px, calc(100vw - 32px)); padding: 0; color: var(--text); } .settings-dialog::backdrop { background: #000000; } .dialog-shell { padding: 20px; } .settings-section { margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--border); } .toast-root { position: fixed; right: 18px; bottom: 18px; z-index: 1000; display: grid; gap: 8px; width: min(360px, calc(100vw - 36px)); } .toast { padding: 12px 14px; border: 1px solid var(--border-strong); border-radius: var(--radius-panel); background: var(--panel); color: var(--text); font-size: 13px; } .toast-success { border-color: var(--border-strong); } .toast-info { border-color: var(--border-strong); color: var(--info); } .toast-warn { border-color: var(--border-strong); color: var(--warn); } .toast-error { border-color: var(--danger-border); color: #ffd4d4; } .toast-hide { opacity: 0; } /* ---------- API docs ---------- */ .api-docs { display: grid; gap: var(--gap); padding: var(--gutter); } .api-path { margin: 0 0 12px; color: var(--text); font-size: 17px; font-weight: 600; overflow-wrap: anywhere; } .api-methods { display: grid; gap: 12px; } .api-method { border-top: 1px solid var(--border); padding-top: 12px; } .api-method:first-child { border-top: 0; padding-top: 0; } .api-method-head { display: flex; align-items: center; gap: 10px; } .api-verb { min-width: 58px; padding: 2px 6px; border: 1px solid var(--border); border-radius: var(--radius-control); color: var(--ok); font-size: 12px; text-align: center; } .api-summary { font-weight: 700; font-size: 14px; } .api-body { max-height: none; } .panel.api-section { padding: 0; overflow: hidden; } .panel.api-section .api-path { padding: 14px var(--gutter) 12px; border-bottom: 1px solid var(--border); } .panel.api-section .api-methods { padding: var(--gutter); } #api-docs { padding: var(--gutter); } .hidden { display: none !important; } /* ---------- Viewer layout (scope-preserved, opaque hex only) ---------- */ .viewer-shell { display: grid; grid-template-columns: 360px minmax(0, 1fr); height: 100vh; overflow: hidden; } .viewer-sidebar { display: flex; flex-direction: column; gap: var(--gap); overflow-y: auto; padding: var(--gutter); background: var(--panel-alt); border-right: 1px solid var(--border); } .sidebar-toggle { display: none; } .viewer-sidebar-head { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--gap); padding: 0 0 var(--gap); } .viewer-sidebar-head h1 { margin: 0; font-size: 20px; font-weight: 700; color: var(--text); } .viewer-channel-list { display: grid; gap: 6px; } .viewer-channel-item { display: grid; grid-template-columns: 52px minmax(0, 1fr); align-items: center; gap: 10px; width: 100%; min-height: 68px; padding: 10px 12px; text-align: left; cursor: pointer; border: 1px solid transparent; border-radius: var(--radius-control); background: transparent; color: var(--text); } .viewer-channel-item:hover { background: #1c1c1d; border-color: var(--border); } .viewer-channel-item.active { border-color: var(--border-strong); background: #202020; } .viewer-channel-avatar { display: inline-flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: 50%; background: var(--border-strong); color: var(--text); font-weight: 700; letter-spacing: -0.03em; } .viewer-channel-copy { display: grid; gap: 3px; min-width: 0; } .viewer-channel-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 8px; min-width: 0; } .viewer-channel-name { color: var(--text); font-weight: 700; font-size: 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .viewer-channel-time, .viewer-channel-preview { color: var(--dim); font-size: 12px; } .viewer-channel-preview { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .viewer-channel-count { min-width: 22px; padding: 2px 7px; border-radius: var(--radius-badge); background: var(--inset); color: var(--info); font-size: 12px; text-align: center; } .viewer-main { display: flex; flex-direction: column; height: 100vh; overflow: hidden; background: var(--bg); } .viewer-header { flex-shrink: 0; display: flex; align-items: flex-start; justify-content: space-between; gap: var(--gap); padding: var(--gutter); border-bottom: 1px solid var(--border); background: var(--panel-alt); } .viewer-header h2 { color: var(--text); } .viewer-header .muted { display: block; margin: 4px 0 0; } .viewer-tools { display: flex; align-items: center; justify-content: flex-end; gap: 8px; flex-wrap: wrap; } .viewer-tools input[type='search'] { min-width: min(260px, 40vw); min-height: 38px; } .viewer-auto-refresh { display: inline-flex; align-items: center; gap: 6px; min-height: 38px; padding: 0 4px; color: var(--dim); font-size: 13px; font-weight: 600; } .viewer-auto-refresh input { width: auto; min-width: auto; min-height: auto; accent-color: var(--text); } .messages-list { flex: 1; overflow-y: auto; padding: var(--gutter); display: flex; flex-direction: column; gap: 0; } .scroll-sentinel { flex-shrink: 0; height: 1px; width: 100%; } .chat-date-sep { display: flex; align-items: center; align-self: center; justify-content: center; gap: 12px; margin: 12px 0; padding: 5px 12px; border-radius: var(--radius-badge); background: var(--inset); font-size: 12px; color: var(--dim); flex-shrink: 0; } .chat-date-sep::before, .chat-date-sep::after { content: ''; flex: 1; height: 1px; background: var(--border); } .chat-date-sep:empty { display: none; } .chat-bubble-wrap { display: flex; justify-content: flex-start; flex-shrink: 0; } .chat-bubble-wrap--own { justify-content: flex-end; } .chat-bubble { max-width: min(680px, 74%); padding: 9px 13px 8px; background: var(--bubble-other); border: 1px solid var(--border); border-radius: 18px 18px 18px 6px; margin-bottom: 7px; overflow-wrap: anywhere; word-break: break-word; position: relative; } .chat-bubble::before { content: ''; position: absolute; top: 8px; border: 6px solid transparent; } .chat-bubble-wrap:not(.chat-bubble-wrap--own) .chat-bubble::before { left: -12px; border-right-color: var(--bubble-other); border-left: 0; } .chat-bubble-wrap--own .chat-bubble::before { right: -12px; border-left-color: var(--bubble-own); border-right: 0; } .chat-bubble-wrap--own .chat-bubble { background: var(--bubble-own); border-color: var(--border-strong); border-radius: 18px 18px 6px 18px; } .chat-bubble--highlight { outline: 2px solid var(--link); outline-offset: 2px; } .chat-sender { font-size: 12px; color: var(--info); font-weight: 700; margin-bottom: 2px; } .chat-sender:empty { display: none; } .chat-reply { display: flex; gap: 6px; margin-bottom: 4px; padding: 6px 8px; cursor: pointer; border-radius: var(--radius-control); background: var(--inset); } .chat-reply.hidden { display: none; } .chat-reply-border { flex-shrink: 0; width: 2px; background: var(--link); border-radius: var(--radius-badge); } .chat-reply-body { min-width: 0; } .chat-reply-author { font-size: 12px; color: var(--info); font-weight: 700; } .chat-reply-text { font-size: 12px; color: var(--dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .chat-text { white-space: pre-wrap; line-height: 1.45; font-size: 14px; } .chat-text:empty { display: none; } .chat-media { margin-top: 6px; } .chat-media:empty { display: none; } .chat-media img, .chat-media video { display: block; max-width: 100%; border: 1px solid var(--border); border-radius: var(--radius-control); } .chat-footer { margin-top: 4px; font-size: 12px; color: var(--dim); text-align: right; } .chat-footer:empty { display: none; } /* ---------- Responsive ---------- */ @media (max-width: 1100px) { .app-shell, .viewer-shell { grid-template-columns: 1fr; } .app-shell { grid-template-rows: auto 1fr; } .sidebar, .viewer-sidebar { border-right: 0; border-bottom: 1px solid var(--border); } .panel-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 900px) { .settings-layout { grid-template-columns: 1fr; } .settings-layout .panel:last-child { grid-column: auto; } } @media (max-width: 768px) { .app-shell { grid-template-columns: 1fr; } .sidebar { position: static; width: auto; height: auto; padding: 12px; border-right: 0; border-bottom: 1px solid var(--border); } .sidebar-toggle { display: inline-flex; } .brand-block { min-height: 46px; padding-bottom: 5px; } .nav-links { display: flex; overflow-x: auto; margin: 8px 0 0; } .nav-link { min-height: 34px; white-space: nowrap; } .status-card { display: none; } .content { padding: 16px 16px 20px; } .dashboard-topbar { margin: -16px -16px 16px; padding: 0 16px; } .settings-hero { flex-direction: column; padding: 16px; } .viewer-sidebar { position: fixed; left: -360px; top: 0; bottom: 0; width: 340px; z-index: 100; border-right: 1px solid var(--border); border-bottom: 0; } .viewer-sidebar.open { left: 0; } .viewer-header { padding: 12px 14px; } .messages-list { padding: 8px 12px 16px; } .chat-bubble { max-width: 92%; } .chat-bubble::before { display: none; } .viewer-sidebar-head h1 { font-size: 20px; } } @media (max-width: 560px) { .panel-grid, .settings-health-grid { grid-template-columns: 1fr; } .content-tabs, .account-tabs { overflow-x: auto; flex-wrap: nowrap; } .content-tab, .account-tab { white-space: nowrap; } } @media (max-width: 480px) { .content { padding: 12px; } .viewer-main { padding: 0; } .viewer-header { padding: 10px; } .viewer-header h2 { font-size: 17px; } .messages-list { padding: 6px 8px 12px; } .chat-bubble { max-width: 96%; padding: 6px 9px; font-size: 14px; } .chat-footer { font-size: 12px; } .sidebar { padding: 16px; } .viewer-sidebar { width: 300px; padding: 16px; } .panel-header, .viewer-header, .dialog-header { flex-wrap: wrap; } .inline-form, .inline-form input, .inline-form .button { width: 100%; } .log-line { grid-template-columns: 76px 1fr; } .log-age, .log-level { display: none; } }