Add self-contained Docker deployment for EasyPanel / docker-compose: - Dockerfile: python:3.11-slim + nginx. Serves the PREBUILT Vue SPA (frontend/dist, committed) via nginx and reverse-proxies /api to the Flask backend on 127.0.0.1:5000. No node/npm in the image (avoids Vite/npm flakiness in Docker builds). VOLUME /app/backend/data for persistence (factor vintages, dividend ledger, forward runs, prices). HEALTHCHECK hits /api/v1/dashboard/summary. Exposes :80. - deploy/nginx.conf: SPA fallback + /api proxy to 127.0.0.1:5000 + gzip. - deploy/entrypoint.sh: starts Flask (HOST=0.0.0.0:5000) + nginx foreground, forwards signals. - docker-compose.yml: single service 'set50', port 8080:80, mounts ./backend/data for persistence, healthcheck. - .dockerignore excludes .git/.venv/backend/data/node_modules/docs. - .gitignore now tracks frontend/dist/ (prebuilt bundle required by the image); backend/data stays untracked. - Backend runtime verified: test_client GET /api/v1/dashboard/summary=200 (the HEALTHCHECK path). entrypoint sh -n, compose YAML parse, and all Dockerfile-referenced files exist. NOTE: no local docker here, so the image itself was not built — that happens on EasyPanel.
2 lines
20 KiB
CSS
2 lines
20 KiB
CSS
@import"https://fonts.googleapis.com/css2?family=DM+Mono:wght@400;500&family=Manrope:wght@400;500;600;700;800&display=swap";:root{color-scheme:dark;font-family:Manrope,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,sans-serif;color:#edf2f7;background:#0b1018;font-synthesis:none;text-rendering:optimizeLegibility;--bg: #0b1018;--panel: #111925;--panel-soft: #151f2d;--line: #263344;--line-bright: #35465c;--text: #edf2f7;--muted: #8794a6;--faint: #5b6a7e;--mint: #52d6bd;--mint-soft: rgba(82, 214, 189, .12);--amber: #e6b96c;--amber-soft: rgba(230, 185, 108, .12);--red: #ef8b8b;--red-soft: rgba(239, 139, 139, .12)}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;min-width:320px;background:var(--bg)}button,input{font:inherit}button{cursor:pointer}.app-shell{min-height:100vh;display:flex;background:radial-gradient(circle at 85% -10%,rgba(82,214,189,.08),transparent 32rem),var(--bg)}.sidebar{width:248px;flex:0 0 248px;min-height:100vh;padding:28px 18px 22px;border-right:1px solid var(--line);display:flex;flex-direction:column;background:#0b1018c2}.brand-lockup{display:flex;align-items:center;gap:11px;padding:0 9px 33px}.brand-mark{width:32px;height:32px;display:grid;place-items:center;border:1px solid rgba(82,214,189,.7);border-radius:9px;color:var(--mint);font:500 11px DM Mono,monospace;letter-spacing:-.08em;box-shadow:0 0 24px #52d6bd1f}.brand-name{font-size:13px;font-weight:800;letter-spacing:.01em}.brand-caption{margin-top:2px;color:var(--faint);font:10px DM Mono,monospace}.nav-stack{display:grid;gap:5px}.nav-item{display:flex;align-items:center;gap:11px;padding:11px 12px;border:1px solid transparent;border-radius:8px;color:var(--muted);text-decoration:none;font-size:12px;font-weight:600;transition:.2s ease}.nav-item:hover{color:var(--text);background:#ffffff06}.nav-item.active{color:var(--mint);background:var(--mint-soft);border-color:#52d6bd2e}.nav-glyph{width:16px;color:currentColor;font-size:15px;text-align:center}.sidebar-footer{margin-top:auto;padding:12px 8px 0}.mode-card{display:flex;gap:10px;align-items:center;padding:12px;border:1px solid var(--line);border-radius:10px;background:#ffffff05}.mode-dot,.freshness-dot{width:7px;height:7px;flex:0 0 7px;border-radius:99px;background:var(--mint);box-shadow:0 0 12px var(--mint)}.mode-label{font-size:11px;font-weight:700}.mode-detail,.version-line{margin-top:3px;color:var(--faint);font:10px DM Mono,monospace}.version-line{padding:14px 3px 0}.content{width:min(100%,1440px);margin:0 auto;padding:42px clamp(22px,4vw,64px) 70px}.topbar{display:flex;justify-content:space-between;gap:24px;align-items:flex-start;padding-bottom:35px}.eyebrow,.section-kicker{color:var(--mint);font:500 10px DM Mono,monospace;letter-spacing:.14em;text-transform:uppercase}h1,h2,p{margin:0}h1{margin-top:10px;font-size:clamp(28px,4vw,46px);line-height:1.04;letter-spacing:-.055em}h2{margin-top:7px;font-size:17px;letter-spacing:-.025em}.subtitle{max-width:560px;margin-top:12px;color:var(--muted);font-size:13px;line-height:1.7}.topbar-meta{text-align:right;color:var(--muted);font:10px DM Mono,monospace}.freshness-pill{display:inline-flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid rgba(82,214,189,.25);border-radius:99px;color:var(--mint);background:var(--mint-soft)}.freshness-pill.pill-fixture{border-color:#e6b96c59;color:var(--amber);background:var(--amber-soft)}.freshness-pill.pill-fixture .freshness-dot{background:var(--amber);box-shadow:0 0 12px var(--amber)}.as-of{margin-top:10px}.kpi-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:12px}.kpi-card,.panel,.state-card{border:1px solid var(--line);background:linear-gradient(145deg,#151f2ddb,#0e151ff0);box-shadow:0 18px 42px #0000001f}.kpi-card{min-height:132px;padding:19px 19px 16px;border-radius:10px}.accent-card{border-color:#52d6bd4d;background:linear-gradient(145deg,#19383bcc,#0e1f26eb)}.kpi-label{color:var(--muted);font:10px DM Mono,monospace;text-transform:uppercase;letter-spacing:.08em}.kpi-value{margin-top:12px;color:var(--text);font-size:29px;font-weight:700;letter-spacing:-.055em}.kpi-unit{margin-left:4px;color:var(--mint);font:14px DM Mono,monospace}.quality-value{font-size:22px;text-transform:capitalize}.kpi-foot{margin-top:10px;color:var(--faint);font:10px DM Mono,monospace}.long-count,.positive-text{color:var(--mint)}.short-count,.negative-text{color:var(--red)}.hero-grid,.bottom-grid{display:grid;grid-template-columns:1.45fr 1fr;gap:12px;margin-bottom:12px}.panel{border-radius:10px;padding:22px}.panel-header{display:flex;justify-content:space-between;align-items:flex-start;gap:20px}.confidence-tag,.status-tag{padding:6px 8px;color:var(--mint);border:1px solid rgba(82,214,189,.22);border-radius:6px;background:var(--mint-soft);font:10px DM Mono,monospace;white-space:nowrap}.pulse-lead{display:flex;gap:15px;align-items:baseline;margin:26px 0 25px}.pulse-number{color:var(--mint);font-size:32px;font-weight:700;letter-spacing:-.06em}.pulse-copy{max-width:380px;color:var(--muted);font-size:12px;line-height:1.6}.observation-list{display:grid;gap:16px}.observation-row{display:grid;grid-template-columns:minmax(145px,1fr) 1.3fr 58px;align-items:center;gap:14px}.observation-name{color:var(--muted);font:10px DM Mono,monospace;text-transform:uppercase}.observation-track{height:6px;overflow:hidden;border-radius:99px;background:#253140}.observation-bar{height:100%;border-radius:inherit}.bar-positive{background:var(--mint);box-shadow:0 0 16px #52d6bd6b}.bar-negative{background:var(--red)}.observation-value{text-align:right;font:11px DM Mono,monospace}.lineage-panel{display:flex;flex-direction:column}.lineage-list{display:grid;gap:0;margin-top:24px;border-top:1px solid var(--line)}.lineage-item{display:flex;justify-content:space-between;gap:15px;padding:13px 0;border-bottom:1px solid var(--line);color:var(--muted);font-size:11px}.lineage-item strong{color:var(--text);font:10px DM Mono,monospace;text-align:right}.lineage-note{margin-top:auto;padding-top:22px;color:var(--faint);font-size:11px;line-height:1.7}.signal-panel{padding:0;overflow:hidden}.signal-header{padding:22px;border-bottom:1px solid var(--line)}.signal-header>div:first-child{flex:1 1 auto;min-width:0}.stock-panel .signal-header{align-items:center;flex-wrap:wrap}.stock-panel .panel-subtitle{max-width:620px}.strategy-meta{color:var(--faint);font:10px DM Mono,monospace}.strategy-meta span{color:var(--line-bright);padding:0 5px}.table-wrap{overflow-x:auto}table{width:100%;border-collapse:collapse;min-width:850px}th{padding:12px 16px;color:var(--faint);border-bottom:1px solid var(--line);font:10px DM Mono,monospace;font-weight:400;text-align:left;text-transform:uppercase;letter-spacing:.06em}td{padding:14px 16px;border-bottom:1px solid rgba(38,51,68,.72);color:var(--muted);font-size:11px;vertical-align:middle}tbody tr:last-child td{border-bottom:0}tbody tr:hover{background:#ffffff06}.muted-cell,.score-cell,.target-cell{font-family:DM Mono,monospace}.symbol-name{display:block;color:var(--text);font-size:12px}.confidence-cell{display:block;margin-top:4px;color:var(--faint);font:9px DM Mono,monospace}.side-pill{display:inline-block;min-width:52px;padding:5px 7px;border-radius:5px;font:10px DM Mono,monospace;text-align:center}.side-pill.long{color:var(--mint);background:var(--mint-soft)}.side-pill.short{color:var(--red);background:var(--red-soft)}.side-pill.neutral{color:var(--amber);background:var(--amber-soft)}.reason-code{display:inline-block;margin:2px 3px 2px 0;padding:4px 5px;border:1px solid var(--line-bright);border-radius:4px;color:var(--faint);font:9px DM Mono,monospace}.theme-panel{margin-top:18px}.theme-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.theme-card{border:1px solid var(--line-bright);border-radius:10px;padding:14px;background:var(--card)}.theme-card-head{display:flex;align-items:center;gap:8px;margin-bottom:6px}.theme-chip{background:var(--accent-soft, rgba(63,161,255,.12));color:var(--accent);font:9px DM Mono,monospace;padding:2px 6px;border-radius:4px;text-transform:uppercase}.theme-label-en{font:600 12px/1.4 var(--font);color:var(--foreground)}.theme-label-th{font-weight:700;margin-bottom:2px}.theme-source{font:10px DM Mono,monospace;color:var(--faint);margin-bottom:10px}.theme-read-value{font-size:22px;font-weight:700;color:var(--foreground)}.theme-read-meta{font-size:11px;color:var(--faint);margin-top:2px}.theme-read-error{font-size:11px;color:var(--danger, #e5484d)}@media(max-width:720px){.theme-grid{grid-template-columns:1fr}}.theme-surprise{display:flex;flex-direction:column;gap:2px;margin:8px 0 6px}.theme-surprise-label{font-size:10px;color:var(--faint)}.theme-surprise-value{font-size:22px;font-weight:700;color:var(--accent)}.theme-thesis{font-size:11px;color:var(--text-2, #99a);border-top:1px dashed var(--line-bright);padding-top:6px;margin-top:6px}.macro-panel{margin-top:14px;border-top:1px solid var(--line-bright);padding-top:12px}.macro-chips{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}.macro-chip{background:var(--card);border:1px solid var(--line-bright);border-radius:6px;padding:6px 9px;font-size:11px}.macro-chip strong{color:var(--mint)}.lineage-panel{margin-top:18px}.source-table{width:100%;border-collapse:collapse}.source-table th{text-align:left;font:700 10px DM Mono,monospace;color:var(--faint);padding:6px 8px;border-bottom:1px solid var(--line-bright)}.source-table td{padding:7px 8px;font-size:12px;border-bottom:1px solid var(--line-weak, rgba(255,255,255,.04))}.source-name{color:var(--accent)}.combined-cell{color:var(--mint);font-weight:600;font-family:DM Mono,monospace}.theme-tag{display:inline-block;margin:2px 3px 2px 0;padding:2px 6px;border-radius:4px;background:#3fa1ff1f;color:var(--accent);font-size:10px}.theme-tag.large{font-size:12px;padding:4px 8px}.clickable-row{cursor:pointer;transition:background .15s ease}.clickable-row:hover{background:#3fa1ff0f}.theme-narrative{font-size:12px;line-height:1.6;color:var(--text-2, #9aa);border-top:1px dashed var(--line-bright);padding-top:8px;margin-top:8px}.modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;display:flex;align-items:flex-start;justify-content:center;padding:40px 16px;z-index:50;overflow:auto}.modal-card{background:var(--card, #0e1218);border:1px solid var(--line-bright);border-radius:12px;max-width:640px;width:100%;padding:20px}.modal-head{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:14px}.modal-kicker{font:700 10px DM Mono,monospace;color:var(--faint);letter-spacing:.08em;text-transform:uppercase}.modal-head h3{font-size:24px;margin:4px 0 0}.modal-close{background:none;border:1px solid var(--line-bright);color:var(--text);width:30px;height:30px;border-radius:6px;cursor:pointer}.modal-body{display:flex;flex-direction:column;gap:16px}.modal-section{border-top:1px solid var(--line-weak, rgba(255,255,255,.06));padding-top:12px}.modal-section-title{font:700 11px DM Mono,monospace;color:var(--faint);margin-bottom:8px}.modal-sub{font-size:11px;color:var(--faint);margin-top:6px}.contrib-line{display:flex;justify-content:space-between;padding:3px 0;font-size:13px}.contrib-calc em{font-style:normal;color:var(--accent)}.contrib-calc strong{color:var(--mint);font-family:DM Mono,monospace}.contrib-calc{color:var(--text-2, #9aa);font-size:12px}.fund-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;font-size:12px}.fund-grid span{background:#ffffff08;border-radius:6px;padding:6px 8px}.fund-grid strong{color:var(--text);font-family:DM Mono,monospace}.score-table{width:100%;border-collapse:collapse;font-size:13px}.score-table td{padding:7px 6px;border-bottom:1px solid var(--line-weak, rgba(255,255,255,.05))}.score-table tr.score-total td{border-top:1px solid var(--line-bright);font-weight:700;color:var(--mint)}.calc-box{background:#00000040;border:1px solid var(--line-bright);border-radius:8px;padding:12px}.calc-line{font:700 14px DM Mono,monospace;color:var(--mint);padding:6px 0 10px;border-bottom:1px dashed var(--line-bright);margin-bottom:8px}.calc-step{padding:6px 0;border-bottom:1px solid var(--line-weak, rgba(255,255,255,.05))}.calc-step-head{display:flex;justify-content:space-between;font-size:13px}.calc-step-head strong{color:var(--text);font-family:DM Mono,monospace}.calc-step-note{font-size:11px;color:var(--faint);margin-top:3px;line-height:1.5}.calc-z{font-size:11px;color:var(--faint);margin-top:8px;line-height:1.6}.backtest-controls{display:flex;flex-wrap:wrap;gap:12px;align-items:flex-end;padding:16px 0}.backtest-controls label{display:flex;flex-direction:column;gap:4px;font-size:11px;color:var(--faint)}.backtest-controls input,.backtest-controls select{background:#0a0e14;border:1px solid var(--line-bright);color:var(--text);border-radius:6px;padding:7px 9px;font-size:12px}.primary-btn{background:var(--mint);color:#062a1f;border:none;border-radius:7px;padding:9px 16px;font-weight:700;cursor:pointer;font-size:12px}.primary-btn:disabled{opacity:.5;cursor:not-allowed}.bt-kpi-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:12px 0}.bt-kpi{background:#ffffff08;border:1px solid var(--line-bright);border-radius:8px;padding:12px}.bt-kpi span{display:block;font-size:11px;color:var(--faint);margin-bottom:6px}.bt-kpi strong{font-size:15px;font-family:DM Mono,monospace}.bt-meta{margin:4px 0 10px;font-size:11px}.bt-holdings{margin-top:8px;font-size:12px;color:var(--text-2);display:flex;flex-wrap:wrap;gap:6px;align-items:center}.bt-history{margin-top:20px}.bt-history .source-table td{font-size:12px;padding:6px 8px}.thesis-list{display:flex;flex-direction:column;gap:10px;margin:12px 0}.thesis-row{display:flex;gap:10px;align-items:baseline;padding-bottom:8px;border-bottom:1px solid var(--line-weak, rgba(255,255,255,.05))}.thesis-theme{min-width:130px;color:var(--accent)}.thesis-text{flex:1;font-size:12px;color:var(--text-2, #99a)}.thesis-surprise{font-family:DM Mono,monospace;color:var(--mint)}.sim-panel{margin-top:18px}.sim-controls{display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap;margin-bottom:14px}.sim-field{display:flex;flex-direction:column;gap:4px}.sim-field label{font-size:11px;color:var(--faint)}.sim-field input,.sim-field select{background:var(--card);border:1px solid var(--line-bright);color:var(--text);padding:7px 9px;border-radius:5px;font-size:12px}.sim-result{display:flex;flex-direction:column;gap:12px}.sim-sums{display:flex;gap:24px}.sim-sum span{display:block;font-size:11px;color:var(--faint)}.sim-sum strong{font-size:20px}.sim-note{font-size:11px;color:var(--amber);font-style:italic}.sim-buckets{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.sim-bucket{border:1px solid var(--line-bright);border-radius:8px;padding:10px}.sim-bucket-head{display:flex;align-items:center;gap:8px;margin-bottom:8px}.sim-bucket-tag{font:700 10px DM Mono,monospace;padding:2px 6px;border-radius:4px}.sim-bucket-tag.b1{background:var(--accent-soft, rgba(63,161,255,.15));color:var(--accent)}.sim-bucket-tag.b2{background:var(--amber-soft, rgba(245,158,11,.15));color:var(--amber)}.sim-bucket-tag.b3{background:var(--mint-soft, rgba(94,234,212,.15));color:var(--mint)}.sim-order-table{width:100%;border-collapse:collapse}.sim-order-table td{padding:3px 4px;font-size:12px}@media(max-width:720px){.sim-buckets{grid-template-columns:1fr}}.row-action,.primary-button{padding:8px 10px;border:1px solid var(--line-bright);border-radius:5px;color:var(--text);background:transparent;font-size:10px;white-space:nowrap;transition:.2s ease}.row-action:hover{color:var(--mint);border-color:var(--mint)}.stock-panel{padding:0;overflow:hidden;margin-bottom:12px}.panel-subtitle{margin-top:10px;color:var(--faint);font-size:11px;line-height:1.6}.panel-subtitle em{color:var(--mint);font-style:normal}.stock-controls{display:flex;align-items:center;gap:14px}.toggle-filter{display:inline-flex;align-items:center;gap:8px;color:var(--muted);font:10px DM Mono,monospace;cursor:pointer;-webkit-user-select:none;user-select:none}.toggle-filter input{width:auto;accent-color:var(--mint)}.toggle-filter span{white-space:nowrap}.dividend-dot{margin-left:6px;color:var(--amber)}th.sortable{cursor:pointer;transition:color .15s ease}th.sortable:hover{color:var(--text)}th.sortable.active{color:var(--mint)}.research-panel{margin-bottom:12px}.research-grid{display:grid;grid-template-columns:1fr 1.4fr;gap:24px;align-items:center;margin-top:22px}.research-status{display:inline-block;padding:7px 9px;border-radius:5px;font:11px DM Mono,monospace;text-transform:uppercase}.status-ready{color:var(--mint);background:var(--mint-soft)}.status-blocked,.status-descriptive{color:var(--amber);background:var(--amber-soft)}.research-reason{margin-top:12px;color:var(--muted);font-size:12px}.research-meta{margin-top:10px;color:var(--faint);font:9px DM Mono,monospace;overflow-wrap:anywhere}.gate-list{display:grid;gap:0;border-top:1px solid var(--line)}.gate-row{display:flex;justify-content:space-between;gap:15px;padding:12px 0;border-bottom:1px solid var(--line);color:var(--muted);font-size:11px}.gate-row strong{color:var(--text);font:10px DM Mono,monospace;text-align:right}.research-results{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-top:18px}.research-result-row{display:grid;gap:8px;padding:12px;border:1px solid var(--line);border-radius:6px;color:var(--faint);font:9px DM Mono,monospace}.research-result-row strong{font-size:14px}.empty-research{margin-top:18px;padding:14px;border:1px dashed var(--line-bright);border-radius:6px;color:var(--faint);font:10px DM Mono,monospace}.bottom-grid{grid-template-columns:1fr 1fr}.thesis-panel{background:linear-gradient(145deg,#243040e6,#0f1722f2)}.thesis-panel p,.ledger-panel p{margin-top:14px;color:var(--muted);font-size:12px;line-height:1.8}.thesis-rule{display:flex;align-items:center;gap:9px;margin-top:24px;color:var(--mint);font:10px DM Mono,monospace}.thesis-rule span{width:22px;height:1px;background:var(--mint)}.warning-tag{color:var(--amber);border-color:#e6b96c4d;background:var(--amber-soft)}.neutral-tag{color:var(--amber);border-color:#e6b96c40;background:var(--amber-soft)}.auth-form{display:grid;gap:10px;margin-top:16px}.auth-copy{color:var(--muted);font-size:11px;line-height:1.65}.paper-auth-warning{margin-top:14px;padding:9px 10px;border:1px solid rgba(230,185,108,.3);border-radius:5px;color:var(--amber);background:var(--amber-soft);font:10px DM Mono,monospace;line-height:1.55}.entry-form{display:grid;gap:10px;margin-top:16px}.selected-entry{display:flex;justify-content:space-between;gap:12px;align-items:center;color:var(--muted);font:10px DM Mono,monospace}.selected-entry strong{color:var(--text);font-size:13px}input{width:100%;padding:10px 11px;outline:none;border:1px solid var(--line-bright);border-radius:6px;color:var(--text);background:#0b1018b3;font:11px DM Mono,monospace}input:focus{border-color:var(--mint);box-shadow:0 0 0 3px #52d6bd17}.primary-button{color:#071411;border-color:var(--mint);background:var(--mint);font-weight:700}.primary-button:disabled{opacity:.5;cursor:wait}.empty-ledger{margin-top:18px;padding:14px;border:1px dashed var(--line-bright);border-radius:6px;color:var(--faint);font:10px DM Mono,monospace;text-align:center}.notice{margin-top:14px;padding:9px 10px;border-radius:5px;font:10px DM Mono,monospace}.notice-success{color:var(--mint);background:var(--mint-soft)}.notice-error{color:var(--red);background:var(--red-soft)}.state-card{margin-top:12px;padding:28px;border-radius:10px;color:var(--muted);font:12px DM Mono,monospace}.error-state{color:var(--red);border-color:#ef8b8b4d}@media(max-width:1040px){.sidebar{width:208px;flex-basis:208px}.kpi-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:760px){.app-shell{display:block}.sidebar{width:100%;min-height:auto;padding:15px 18px;border-right:0;border-bottom:1px solid var(--line)}.brand-lockup{padding:0}.nav-stack{display:flex;overflow-x:auto;margin-top:14px;gap:5px}.nav-item{flex:0 0 auto;padding:8px 10px;font-size:10px}.nav-glyph,.sidebar-footer{display:none}.content{padding:30px 16px 44px}.topbar{display:block;padding-bottom:25px}.topbar-meta{display:flex;justify-content:space-between;align-items:center;margin-top:18px;text-align:left}.hero-grid,.bottom-grid{grid-template-columns:1fr}.panel{padding:18px}.research-grid{grid-template-columns:1fr;gap:18px}.research-results{grid-template-columns:repeat(2,1fr)}}@media(max-width:500px){.kpi-grid{grid-template-columns:1fr 1fr;gap:7px}.kpi-card{min-height:112px;padding:14px}.kpi-value{font-size:22px}.kpi-foot{font-size:9px}.pulse-lead{display:block;margin:20px 0}.pulse-copy{display:block;margin-top:8px}.observation-row{grid-template-columns:1fr 55px;gap:8px}.observation-track{grid-column:1 / -1;grid-row:2}.observation-value{grid-column:2;grid-row:1}.lineage-item{display:block}.lineage-item strong{display:block;margin-top:5px;text-align:left}h1{font-size:31px}.subtitle{font-size:11px}}
|