Files
MosaicIQ/wireframe/styles.css

1114 lines
40 KiB
CSS

:root {
--bg: oklch(97% 0.012 80);
--surface: oklch(99% 0.005 80);
--fg: oklch(20% 0.02 60);
--muted: oklch(48% 0.015 60);
--border: oklch(89% 0.012 80);
--accent: oklch(58% 0.16 35);
--green: oklch(52% 0.12 145);
--red: oklch(52% 0.14 25);
--font-display: 'Iowan Old Style', 'Charter', Georgia, serif;
--font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
--font-mono: ui-monospace, 'IBM Plex Mono', Menlo, monospace;
--nav-h: 48px;
}
*,*::before,*::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: var(--bg);
color: var(--fg);
font: 13px/1.5 var(--font-body);
height: 100vh;
overflow: hidden;
display: flex;
flex-direction: column;
}
/* ─── TOP BAR ─── */
.topbar {
height: var(--nav-h);
border-bottom: 1px solid var(--border);
display: flex;
align-items: center;
padding: 0 20px;
gap: 12px;
background: var(--surface);
flex-shrink: 0;
z-index: 100;
}
.topbar .logo {
font: 600 15px/1 var(--font-display);
letter-spacing: -0.01em;
color: var(--fg);
cursor: pointer;
}
.topbar .ticker-group {
display: flex;
align-items: center;
gap: 8px;
margin-left: 4px;
min-width: 0;
overflow: hidden;
flex-shrink: 1;
}
.topbar .ticker {
font: 700 13px/1 var(--font-mono);
background: var(--fg);
color: var(--surface);
padding: 3px 7px;
letter-spacing: 0.04em;
}
.topbar .ticker-name { font-size: 12px; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.topbar .screen-tabs {
display: flex;
gap: 0;
margin-left: auto;
border: 1px solid var(--border);
border-radius: 2px;
overflow: hidden;
flex-shrink: 0;
}
.topbar .screen-tabs button {
font: 500 12px/1 var(--font-body);
padding: 7px 14px;
border: none;
background: var(--surface);
color: var(--muted);
cursor: pointer;
border-right: 1px solid var(--border);
transition: background 0.15s, color 0.15s;
}
.topbar .screen-tabs button:last-child { border-right: none; }
.topbar .screen-tabs button:hover { color: var(--fg); }
.topbar .screen-tabs button.active { background: var(--fg); color: var(--surface); }
.topbar .search {
border: 1px solid var(--border);
background: var(--bg);
padding: 5px 10px;
font: 12px/1 var(--font-body);
color: var(--fg);
width: 180px;
min-width: 80px;
border-radius: 2px;
flex-shrink: 1;
}
.topbar .search::placeholder { color: var(--muted); }
.topbar .icon-btn {
width: 28px; height: 28px;
border: 1px solid var(--border);
background: var(--surface);
border-radius: 2px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
color: var(--muted);
font-size: 13px;
transition: color 0.12s;
}
.topbar .icon-btn:hover { color: var(--fg); }
.topbar .avatar {
width: 28px; height: 28px;
border-radius: 50%;
border: 1.5px solid var(--border);
display: flex; align-items: center; justify-content: center;
font: 600 11px/1 var(--font-mono);
color: var(--muted);
cursor: pointer;
transition: border-color 0.15s, color 0.15s;
}
.topbar .avatar:hover {
border-color: var(--accent);
color: var(--accent);
}
/* ─── MAIN ─── */
.main { flex: 1; overflow: hidden; display: flex; }
.screen { display: none; width: 100%; height: 100%; }
.screen.active { display: flex; }
/* ─── LEFT NAV (collapsible to zero) ─── */
.left-nav {
width: 240px;
border-right: 1px solid var(--border);
overflow-y: auto; overflow-x: hidden;
flex-shrink: 0;
background: var(--surface);
display: flex; flex-direction: column;
transition: width 0.2s ease, opacity 0.2s ease;
}
.left-nav.collapsed { width: 36px; min-width: 36px; }
.left-nav.collapsed .nav-toggle { flex-direction: column; padding: 8px 4px; }
.left-nav.collapsed .nav-header { display: none; }
.left-nav.collapsed .nav-group-header,
.left-nav.collapsed button,
.left-nav.collapsed .nav-divider,
.left-nav.collapsed .memo-outline { display: none; }
.nav-toggle {
display: flex; align-items: center; justify-content: space-between;
padding: 10px 14px 4px;
}
.nav-toggle .nav-header {
font: 600 10px/1 var(--font-mono);
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--muted);
}
.nav-toggle .collapse-btn {
width: 20px; height: 20px;
border: 1px solid var(--border); background: none;
cursor: pointer; display: flex; align-items: center; justify-content: center;
color: var(--muted); font-size: 10px; border-radius: 2px;
}
.nav-toggle .collapse-btn:hover { color: var(--fg); }
.left-nav .nav-group-header {
font: 600 10px/1 var(--font-mono);
text-transform: uppercase; letter-spacing: 0.1em;
color: var(--muted); padding: 12px 16px 6px;
}
.left-nav button {
display: flex; align-items: center; width: 100%;
text-align: left; padding: 7px 16px 7px 20px;
border: none; background: none;
font: 400 12.5px/1.4 var(--font-body);
color: var(--muted); cursor: pointer; position: relative;
white-space: nowrap; transition: color 0.12s;
}
.left-nav button:hover { color: var(--fg); }
.left-nav button.active { color: var(--fg); font-weight: 600; }
.left-nav button.active::before {
content: ''; position: absolute; left: 0; top: 4px; bottom: 4px;
width: 3px; background: var(--accent);
}
.left-nav .nav-divider { height: 1px; background: var(--border); margin: 6px 16px; }
/* ─── MEMO NAV (fixed collapse) ─── */
.left-nav.memo-nav { width: 220px; }
.left-nav.memo-nav.collapsed { width: 36px !important; min-width: 36px; }
.nav-open-btn-sidebar {
display: none; width: 28px; height: 28px;
border: 1px solid var(--border); background: var(--surface);
cursor: pointer; align-items: center; justify-content: center;
color: var(--muted); font-size: 10px; border-radius: 2px;
margin: 8px auto;
position: absolute;
pointer-events: none;
visibility: hidden;
}
.left-nav.collapsed .nav-open-btn-sidebar {
display: flex;
position: static;
pointer-events: auto;
visibility: visible;
}
.nav-open-btn-sidebar:hover { color: var(--fg); }
/* Nav open button (visible when collapsed) */
.nav-open-btn {
display: none; width: 28px; height: 28px;
border: 1px solid var(--border); background: var(--surface);
cursor: pointer; align-items: center; justify-content: center;
color: var(--muted); font-size: 10px; border-radius: 2px; flex-shrink: 0;
}
.nav-open-btn.visible { display: none; }
.nav-open-btn:hover { color: var(--fg); }
/* ─── CENTER ─── */
.center {
flex: 1; overflow-y: auto; padding: 28px 36px;
}
.center::-webkit-scrollbar { width: 6px; }
.center::-webkit-scrollbar-thumb { background: var(--border); }
/* ─── RIGHT PANEL ─── */
.right-panel {
width: 320px;
border-left: 1px solid var(--border);
overflow-y: auto; flex-shrink: 0;
background: var(--surface); padding: 20px;
}
.right-panel::-webkit-scrollbar { width: 4px; }
.right-panel::-webkit-scrollbar-thumb { background: var(--border); }
/* ─── SHARED UI ─── */
.section-title {
font: 600 10px/1 var(--font-mono);
text-transform: uppercase; letter-spacing: 0.1em;
color: var(--muted); margin-bottom: 12px;
}
h1.display { font: 700 28px/1.15 var(--font-display); letter-spacing: -0.02em; margin-bottom: 8px; }
h2.section {
font: 600 18px/1.2 var(--font-display); letter-spacing: -0.01em;
margin: 32px 0 12px; padding-top: 16px; border-top: 1px solid var(--border);
}
p.body { color: var(--fg); line-height: 1.65; margin-bottom: 12px; font-size: 13.5px; }
p.muted { color: var(--muted); font-size: 12px; }
.eyebrow {
font: 600 10px/1 var(--font-mono);
text-transform: uppercase; letter-spacing: 0.1em;
color: var(--accent); margin-bottom: 6px;
}
.metric-grid {
display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: 1px; background: var(--border); border: 1px solid var(--border); margin: 16px 0;
}
.metric-cell { background: var(--surface); padding: 12px 14px; }
.metric-cell .label {
font: 500 10px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.06em; color: var(--muted); margin-bottom: 4px;
}
.metric-cell .value { font: 600 18px/1 var(--font-display); letter-spacing: -0.01em; }
.metric-cell .sub { font-size: 11px; color: var(--muted); margin-top: 2px; }
.tag {
display: inline-block; font: 500 10px/1 var(--font-mono);
text-transform: uppercase; letter-spacing: 0.06em;
padding: 3px 8px; border: 1px solid var(--border); color: var(--muted);
}
.tag.accent { border-color: var(--accent); color: var(--accent); }
.tag.green { border-color: var(--green); color: var(--green); }
.tag.red { border-color: var(--red); color: var(--red); }
.btn {
font: 500 12px/1 var(--font-body); padding: 7px 14px;
border: 1px solid var(--border); background: var(--surface);
color: var(--fg); cursor: pointer; border-radius: 2px;
transition: background 0.12s;
}
.btn:hover { background: var(--bg); }
.btn.primary { background: var(--fg); color: var(--surface); border-color: var(--fg); }
.btn.primary:hover { opacity: 0.9; }
.btn.sm { font-size: 10px; padding: 3px 8px; }
/* ─── SPREADSHEET ─── */
.spreadsheet { width: 100%; border-collapse: collapse; font: 400 12px/1.4 var(--font-mono); }
.spreadsheet th {
font: 600 10px/1 var(--font-mono); text-transform: uppercase; letter-spacing: 0.06em;
color: var(--muted); text-align: right; padding: 8px 10px;
border-bottom: 1px solid var(--border); background: var(--surface);
position: sticky; top: 0;
}
.spreadsheet th:first-child { text-align: left; }
.spreadsheet td {
padding: 6px 10px; text-align: right;
border-bottom: 1px solid oklch(93% 0.008 80); white-space: nowrap;
}
.spreadsheet td:first-child { text-align: left; font-weight: 500; color: var(--fg); }
.spreadsheet tr:hover td { background: oklch(96% 0.008 80); }
.spreadsheet .indent td:first-child { padding-left: 24px; }
.spreadsheet .total td { border-top: 1px solid var(--fg); font-weight: 700; background: var(--surface); }
.spreadsheet .forecast { color: var(--muted); font-style: italic; }
/* ─── MEMO EDITOR ─── */
.memo-outline { padding: 0; list-style: none; }
.memo-outline li {
font: 400 12px/1.4 var(--font-body); color: var(--muted);
padding: 5px 0 5px 12px; border-left: 2px solid transparent;
cursor: pointer; transition: color 0.12s, border-color 0.12s;
}
.memo-outline li:hover { color: var(--fg); }
.memo-outline li.active { color: var(--fg); font-weight: 600; border-left-color: var(--accent); }
.memo-outline li.h2 { font-weight: 600; color: var(--fg); margin-top: 6px; }
.memo-block { margin-bottom: 24px; position: relative; }
.memo-block .block-eyebrow {
font: 600 10px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.08em; color: var(--accent); margin-bottom: 6px;
}
.memo-block h3 { font: 600 16px/1.3 var(--font-display); margin-bottom: 8px; }
.memo-block p { font-size: 13.5px; line-height: 1.7; color: var(--fg); }
.memo-block .citation { font: 500 10px/1 var(--font-mono); color: var(--accent); cursor: pointer; }
.memo-block .citation:hover { text-decoration: underline; }
.memo-block .ai-edit {
background: oklch(95% 0.02 80); border-left: 2px solid var(--accent);
padding: 8px 14px; margin: 8px 0; font-size: 12.5px; color: var(--muted); font-style: italic;
}
/* ─── SOURCE / ENTITY CARDS ─── */
.source-card {
border: 1px solid var(--border); padding: 10px 12px;
margin-bottom: 6px; background: var(--surface);
}
.source-card .src-type {
font: 500 9px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.08em; color: var(--accent); margin-bottom: 3px;
}
.source-card .src-title { font: 500 12px/1.35 var(--font-body); margin-bottom: 2px; }
.source-card .src-meta { font-size: 10.5px; color: var(--muted); }
/* ─── AGENT TILES ─── */
.agent-grid {
display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
gap: 10px; padding: 20px 28px;
}
.agent-tile {
border: 1px solid var(--border); padding: 14px; background: var(--surface);
transition: border-color 0.15s, box-shadow 0.15s; cursor: pointer; position: relative;
}
.agent-tile:hover { border-color: var(--muted); }
.agent-tile.selected { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent); }
.agent-tile .tile-icon {
width: 28px; height: 28px; border: 1px solid var(--border);
display: flex; align-items: center; justify-content: center;
font: 600 11px/1 var(--font-mono); margin-bottom: 10px; color: var(--muted);
}
.agent-tile .tile-name { font: 600 13px/1.3 var(--font-body); margin-bottom: 4px; }
.agent-tile .tile-role { font-size: 11px; color: var(--muted); line-height: 1.4; margin-bottom: 10px; }
.agent-tile .tile-status {
display: flex; align-items: center; gap: 6px;
font: 500 10px/1 var(--font-mono); text-transform: uppercase; letter-spacing: 0.06em;
}
.dot { width: 6px; height: 6px; border-radius: 50%; display: inline-block; }
.dot.running { background: var(--accent); }
.dot.done { background: var(--green); }
.dot.idle { background: var(--muted); }
.dot.queued { background: oklch(70% 0.06 80); }
.agent-tile .progress-bar {
position: absolute; bottom: 0; left: 0; right: 0; height: 2px; background: var(--border);
}
.agent-tile .progress-bar .fill { height: 100%; background: var(--accent); transition: width 0.5s ease; }
.agent-tile .tile-actions { display: none; margin-top: 8px; gap: 4px; }
.agent-tile:hover .tile-actions, .agent-tile.selected .tile-actions { display: flex; }
/* ─── AGENT DETAIL PANEL ─── */
.agent-detail {
display: none; border-left: 1px solid var(--border); width: 360px;
flex-shrink: 0; background: var(--surface); overflow-y: auto; flex-direction: column;
}
.agent-detail.open { display: flex; }
.agent-detail .detail-header {
padding: 16px 20px; border-bottom: 1px solid var(--border);
display: flex; justify-content: space-between; align-items: flex-start;
}
.agent-detail .detail-header h3 { font: 600 15px/1.2 var(--font-body); }
.agent-detail .detail-header .detail-status {
font: 500 10px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.06em; color: var(--accent); margin-top: 4px;
}
.agent-detail .close-detail {
width: 24px; height: 24px; border: 1px solid var(--border); background: none;
cursor: pointer; display: flex; align-items: center; justify-content: center;
font-size: 14px; color: var(--muted); border-radius: 2px;
}
.agent-detail .detail-body { padding: 16px 20px; flex: 1; overflow-y: auto; }
.agent-detail .detail-section { margin-bottom: 16px; }
.agent-detail .ds-label {
font: 600 10px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.06em; color: var(--muted); margin-bottom: 6px;
}
.agent-detail .log-entry {
padding: 6px 0; border-bottom: 1px solid oklch(94% 0.006 80);
font-size: 12px; line-height: 1.4;
}
.agent-detail .log-entry .log-time { font: 400 10px/1 var(--font-mono); color: var(--muted); }
.agent-detail .dep-tag {
display: inline-block; font: 500 10px/1 var(--font-mono);
padding: 2px 8px; border: 1px solid var(--border);
margin: 2px 4px 2px 0; color: var(--muted);
}
.agent-detail .dep-tag.active { border-color: var(--green); color: var(--green); }
/* ─── ACTIVITY FEED ─── */
.feed { border-top: 1px solid var(--border); padding: 16px 28px; overflow-y: auto; flex: 1; }
.feed-item { display: flex; gap: 10px; padding: 8px 0; border-bottom: 1px solid oklch(94% 0.006 80); }
.feed-item .feed-time { font: 400 10px/1 var(--font-mono); color: var(--muted); white-space: nowrap; padding-top: 2px; min-width: 46px; }
.feed-item .feed-agent { font: 600 11px/1 var(--font-mono); color: var(--accent); white-space: nowrap; min-width: 100px; }
.feed-item .feed-msg { font-size: 12px; line-height: 1.4; color: var(--fg); }
/* ─── COMMAND BAR (agent carousel) ─── */
.command-bar {
flex-shrink: 0; background: var(--surface); border-top: 1px solid var(--border);
display: flex; align-items: stretch; min-height: 52px; position: relative;
}
.agent-carousel {
display: flex; align-items: center; gap: 0;
background: oklch(96% 0.012 80); border-right: 1px solid var(--border);
width: 320px; flex-shrink: 0;
}
.agent-carousel .carousel-arrow {
width: 28px; height: 100%; background: none; border: none;
color: var(--muted); cursor: pointer; display: flex; align-items: center;
justify-content: center; font-size: 10px; flex-shrink: 0;
}
.agent-carousel .carousel-arrow:hover { color: var(--fg); }
.agent-carousel .carousel-arrow:disabled { opacity: 0.3; cursor: default; }
.agent-carousel .carousel-strip {
flex: 1; display: flex; align-items: center; gap: 8px;
padding: 8px 10px; cursor: pointer; overflow: hidden;
}
.agent-carousel .carousel-strip:hover { background: oklch(94% 0.016 80); }
.agent-carousel .agent-dot {
width: 8px; height: 8px; border-radius: 50%; background: var(--accent);
animation: pulse 1.5s ease infinite; flex-shrink: 0;
}
@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }
.agent-carousel .carousel-info { flex: 1; min-width: 0; }
.agent-carousel .carousel-name { font: 600 11px/1.1 var(--font-body); color: var(--fg); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.agent-carousel .carousel-action { font: 400 10px/1.2 var(--font-mono); color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.agent-carousel .carousel-counter {
font: 400 9px/1 var(--font-mono); color: var(--muted); flex-shrink: 0;
}
.command-bar .chat-area {
flex: 1; display: flex; align-items: center; padding: 0 16px; gap: 10px;
}
.command-bar .chat-area .prompt-icon { color: var(--accent); font: 600 12px/1 var(--font-mono); }
.command-bar .chat-area input {
flex: 1; border: none; background: none;
font: 400 13px/1.4 var(--font-body); color: var(--fg); outline: none;
}
.command-bar .chat-area input::placeholder { color: oklch(70% 0.01 80); }
.command-bar .hint {
font: 400 10px/1 var(--font-mono); color: var(--muted);
border: 1px solid var(--border); padding: 2px 6px; margin-right: 16px; align-self: center;
}
/* ─── TOOLBAR ─── */
.toolbar {
display: flex; align-items: center; gap: 8px; padding: 10px 16px;
border-bottom: 1px solid var(--border); background: var(--surface); flex-shrink: 0;
}
.toolbar .toolbar-label {
font: 500 10px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.06em; color: var(--muted);
}
.toolbar select {
font: 500 12px/1 var(--font-body); padding: 5px 8px;
border: 1px solid var(--border); background: var(--surface); color: var(--fg); border-radius: 2px;
}
.toolbar .spacer { flex: 1; }
/* ─── AGENT OVERLAY (fullscreen with agent sidebar) ─── */
.overlay {
display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0;
background: var(--bg); z-index: 500; flex-direction: column;
}
.overlay.open { display: flex; }
.overlay .overlay-header {
display: flex; align-items: center; gap: 12px; padding: 12px 24px;
border-bottom: 1px solid var(--border); background: var(--surface);
}
.overlay .overlay-header h2 { font: 600 16px/1 var(--font-body); }
.overlay .overlay-header .overlay-status {
font: 500 10px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.06em; color: var(--accent);
}
.overlay .overlay-body {
flex: 1; overflow: hidden; display: flex;
}
.overlay .output-col { flex: 1; overflow-y: auto; }
.overlay .agents-sidebar {
width: 260px; border-left: 1px solid var(--border); background: var(--surface);
overflow-y: auto; flex-shrink: 0;
}
.overlay .agents-sidebar .sidebar-title {
font: 600 10px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.08em; color: var(--muted); padding: 14px 16px 8px;
}
.overlay .sidebar-agent {
display: flex; align-items: center; gap: 8px; padding: 8px 16px;
cursor: pointer; transition: background 0.12s; border-bottom: 1px solid oklch(95% 0.006 80);
}
.overlay .sidebar-agent:hover { background: oklch(96% 0.008 80); }
.overlay .sidebar-agent.active { background: oklch(95% 0.015 80); border-left: 3px solid var(--accent); }
.overlay .sidebar-agent .sa-name { font: 600 11px/1.2 var(--font-body); }
.overlay .sidebar-agent .sa-status { font: 400 9px/1 var(--font-mono); color: var(--muted); text-transform: uppercase; letter-spacing: 0.04em; }
.overlay .trace-col {
width: 340px; border-left: 1px solid var(--border); padding: 24px; overflow-y: auto; flex-shrink: 0;
}
.overlay .trace-step {
padding: 8px 0; border-bottom: 1px solid oklch(94% 0.006 80); display: flex; gap: 8px;
}
.overlay .trace-step .step-num { font: 600 10px/1 var(--font-mono); color: var(--accent); min-width: 20px; }
.overlay .trace-step .step-content { font-size: 12px; line-height: 1.4; }
.overlay .trace-step .step-content .step-label { font-weight: 600; }
.overlay .trace-step .step-content .step-detail { color: var(--muted); margin-top: 2px; }
/* ─── ANNOTATION SYSTEM ─── */
.annotation-toolbar {
display: none; position: absolute; background: var(--fg); color: var(--surface);
border-radius: 2px; padding: 4px; gap: 2px; z-index: 300;
box-shadow: 0 4px 12px oklch(20% 0.02 60 / 0.2);
}
.annotation-toolbar.open { display: flex; }
.annotation-toolbar button {
background: none; border: none; color: var(--surface);
font-size: 11px; padding: 4px 8px; cursor: pointer; border-radius: 1px;
}
.annotation-toolbar button:hover { background: oklch(40% 0.02 60); }
.annotation-toolbar button.active { background: var(--accent); }
.highlight-annotation {
background: oklch(90% 0.06 80); border-bottom: 2px solid var(--accent);
cursor: pointer; position: relative;
}
.highlight-annotation:hover::after {
content: attr(data-comment); position: absolute; bottom: 100%; left: 0;
background: var(--fg); color: var(--surface); padding: 4px 8px;
font: 400 11px/1.4 var(--font-body); white-space: nowrap; border-radius: 2px; z-index: 200;
}
.box-annotation { position: absolute; border: 2px solid var(--red); pointer-events: none; z-index: 200; }
.box-annotation .box-label {
position: absolute; top: -20px; left: 0; background: var(--red); color: var(--surface);
font: 500 9px/1 var(--font-mono); padding: 2px 6px; text-transform: uppercase;
letter-spacing: 0.04em; pointer-events: auto; cursor: pointer;
}
.comment-pin {
display: inline-flex; width: 16px; height: 16px; background: var(--accent);
color: var(--surface); border-radius: 50%; align-items: center; justify-content: center;
font: 600 8px/1 var(--font-mono); cursor: pointer; margin-left: 2px; vertical-align: super;
}
/* ─── TREE CHART ─── */
.dep-tree { padding: 20px 28px; background: var(--surface); border-bottom: 1px solid var(--border); overflow-x: auto; }
.dep-tree svg { display: block; }
.dep-tree .tree-node {
display: inline-flex; align-items: center; gap: 6px;
padding: 6px 12px; border: 1px solid var(--border); background: var(--surface);
font: 500 10px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.04em; color: var(--muted); border-radius: 3px;
cursor: default; white-space: nowrap;
}
.dep-tree .tree-node.done { border-color: var(--green); color: var(--green); }
.dep-tree .tree-node.running { border-color: var(--accent); color: var(--accent); }
.dep-tree .tree-node.queued { border-color: oklch(70% 0.06 80); }
.dep-tree .tree-node .node-dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
.dep-tree .tree-arrow { color: var(--border); font-size: 12px; margin: 0 2px; }
.dep-tree .tree-branch-label {
font: 600 9px/1 var(--font-mono); color: oklch(65% 0.01 60);
text-transform: uppercase; letter-spacing: 0.08em; margin: 10px 0 4px 0; padding-left: 4px;
}
.dep-tree .tree-blocking {
display: inline-flex; align-items: center; gap: 4px;
font: 400 9px/1 var(--font-mono); color: var(--red);
margin-left: 8px; padding: 2px 6px; border: 1px solid oklch(85% 0.02 25);
}
.dep-tree .tree-pipeline { display: flex; align-items: center; gap: 0; padding: 6px 0; }
.dep-tree .tree-connector { color: var(--border); margin: 0 4px; }
.dep-tree .tree-status-line {
display: flex; align-items: center; gap: 16px; margin-top: 12px; padding: 8px 0;
}
.dep-tree .tree-legend-item {
display: flex; align-items: center; gap: 6px;
font: 400 10px/1 var(--font-mono); color: var(--muted);
}
.dep-tree .tree-legend-dot { width: 8px; height: 8px; border-radius: 50%; border: 1.5px solid; }
/* ─── HOME DASHBOARD ─── */
.home-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; padding: 28px; }
.home-grid .full-width { grid-column: 1 / -1; }
.home-card {
border: 1px solid var(--border); background: var(--surface); overflow: hidden;
}
.home-card .card-header {
display: flex; align-items: center; justify-content: space-between;
padding: 14px 16px 10px; border-bottom: 1px solid var(--border);
min-height: 44px;
}
.home-card .card-header h3 {
font: 600 10px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.08em; color: var(--muted);
}
.home-card .card-body { padding: 0; }
.home-card .card-row {
display: grid; grid-template-columns: 56px 1fr 80px 120px; align-items: center; gap: 8px; padding: 10px 16px;
border-bottom: 1px solid oklch(95% 0.006 80); cursor: pointer;
transition: background 0.12s;
}
.home-card .card-row:last-child { border-bottom: none; }
.home-card .card-row:hover { background: oklch(96% 0.008 80); }
.home-card .card-row .row-ticker {
font: 700 12px/1 var(--font-mono); background: var(--fg); color: var(--surface);
padding: 3px 7px; letter-spacing: 0.04em; flex-shrink: 0;
width: 44px; text-align: center; display: inline-block;
}
.home-card .card-row .row-name { font: 500 12.5px/1.2 var(--font-body); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.home-card .card-row .row-meta { font-size: 11px; color: var(--muted); white-space: nowrap; text-align: right; }
.home-card .card-row .row-tag { justify-self: end; }
/* Earnings calendar compact rows */
.ec-group-label {
font: 500 9px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.08em; color: var(--muted); padding: 8px 16px 4px;
}
.ec-group-label:first-child { padding-top: 6px; }
.ec-row {
display: grid; grid-template-columns: 44px 1fr 40px 48px; align-items: center;
gap: 6px; padding: 5px 16px; border-bottom: 1px solid oklch(95% 0.006 80);
transition: background 0.12s; cursor: pointer;
}
.ec-row:last-child { border-bottom: none; }
.ec-row:hover { background: oklch(96% 0.008 80); }
.ec-row .row-ticker {
font: 700 11px/1 var(--font-mono); letter-spacing: 0.04em;
background: var(--fg); color: var(--surface);
padding: 3px 7px; text-align: center; display: inline-block;
width: 44px;
}
.ec-row .row-name {
font: 400 11.5px/1.3 var(--font-body); color: var(--fg);
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ec-row .ec-tag {
font: 600 9px/1 var(--font-mono); text-transform: uppercase;
text-align: center; padding: 2px 0;
}
.ec-row .ec-tag.bmo { color: var(--accent); }
.ec-row .ec-tag.amc { color: var(--muted); }
.ec-row .row-meta {
font-size: 10px; color: var(--muted); white-space: nowrap; text-align: right;
}
.stat-row {
display: flex; gap: 1px; background: var(--border); border: 1px solid var(--border); margin-bottom: 12px;
}
.stat-row .stat-cell { flex: 1; background: var(--surface); padding: 14px 16px; text-align: center; }
.stat-row .stat-cell .stat-val { font: 600 22px/1 var(--font-display); letter-spacing: -0.01em; }
.stat-row .stat-cell .stat-label {
font: 500 9px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.06em; color: var(--muted); margin-top: 4px;
}
.report-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; padding: 16px; }
.report-thumb {
border: 1px solid var(--border); background: var(--bg); padding: 14px;
cursor: pointer; transition: border-color 0.15s;
}
.report-thumb:hover { border-color: var(--muted); }
.report-thumb .rt-type {
font: 500 9px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.08em; color: var(--accent); margin-bottom: 6px;
}
.report-thumb .rt-title { font: 600 12px/1.3 var(--font-body); margin-bottom: 4px; }
.report-thumb .rt-meta { font-size: 10px; color: var(--muted); }
/* ─── SETTINGS OVERLAY ─── */
.settings-overlay {
display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0;
background: var(--bg); z-index: 500; flex-direction: column;
}
.settings-overlay.open { display: flex; }
.settings-overlay .settings-header {
display: flex; align-items: center; gap: 12px; padding: 16px 32px;
border-bottom: 1px solid var(--border); background: var(--surface);
}
.settings-overlay .settings-header h2 { font: 600 18px/1 var(--font-display); }
.settings-overlay .settings-body {
flex: 1; overflow-y: auto; padding: 32px; display: flex; gap: 32px;
}
.settings-overlay .settings-nav {
width: 200px; flex-shrink: 0;
}
.settings-overlay .settings-nav button {
display: block; width: 100%; text-align: left; padding: 8px 14px;
border: none; background: none; font: 400 13px/1.4 var(--font-body);
color: var(--muted); cursor: pointer; border-radius: 2px;
}
.settings-overlay .settings-nav button:hover { color: var(--fg); }
.settings-overlay .settings-nav button.active {
color: var(--fg); font-weight: 600; background: var(--surface);
}
.settings-overlay .settings-content { flex: 1; max-width: 560px; }
.settings-overlay .settings-section { margin-bottom: 28px; }
.settings-overlay .settings-section h3 {
font: 600 10px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.08em; color: var(--muted); margin-bottom: 12px;
padding-bottom: 6px; border-bottom: 1px solid var(--border);
}
.settings-overlay .sd-row {
display: flex; justify-content: space-between; align-items: center;
padding: 8px 0; font-size: 13px;
}
.settings-overlay .sd-row .sd-desc { font-size: 11px; color: var(--muted); margin-top: 2px; }
.toggle {
width: 32px; height: 18px; background: var(--border); border-radius: 9px;
position: relative; cursor: pointer; transition: background 0.15s; flex-shrink: 0;
}
.toggle.on { background: var(--accent); }
.toggle::after {
content: ''; width: 14px; height: 14px; border-radius: 50%;
background: var(--surface); position: absolute; top: 2px; left: 2px;
transition: left 0.15s;
}
.toggle.on::after { left: 16px; }
.settings-overlay select, .settings-overlay input[type="text"] {
font: 500 12px/1 var(--font-body); padding: 5px 8px;
border: 1px solid var(--border); background: var(--surface); color: var(--fg); border-radius: 2px;
}
/* ─── PROFILE EDITOR OVERLAY ─── */
.profile-overlay {
display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0;
background: oklch(20% 0.02 60 / 0.3); z-index: 600;
align-items: center; justify-content: center;
}
.profile-overlay.open { display: flex; }
.profile-overlay .profile-card {
width: 420px; background: var(--surface); border: 1px solid var(--border);
padding: 0; overflow: hidden;
}
.profile-overlay .profile-header {
display: flex; align-items: center; gap: 16px; padding: 24px 24px 20px;
border-bottom: 1px solid var(--border);
}
.profile-overlay .profile-avatar {
width: 56px; height: 56px; border-radius: 50%; border: 2px solid var(--border);
display: flex; align-items: center; justify-content: center;
font: 700 20px/1 var(--font-mono); color: var(--fg); background: var(--bg);
}
.profile-overlay .profile-name { font: 600 16px/1.2 var(--font-body); }
.profile-overlay .profile-role { font-size: 12px; color: var(--muted); margin-top: 2px; }
.profile-overlay .profile-body { padding: 20px 24px; }
.profile-overlay .profile-field { margin-bottom: 14px; }
.profile-overlay .profile-field label {
display: block; font: 500 10px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.06em; color: var(--muted); margin-bottom: 4px;
}
.profile-overlay .profile-field input {
width: 100%; font: 400 13px/1.4 var(--font-body); padding: 7px 10px;
border: 1px solid var(--border); background: var(--bg); color: var(--fg); border-radius: 2px;
}
.profile-overlay .profile-footer {
display: flex; justify-content: flex-end; gap: 8px; padding: 16px 24px;
border-top: 1px solid var(--border); background: var(--bg);
}
/* ─── DEP TREE TABS ─── */
.dep-tree-tabs {
display: flex; gap: 0; border-bottom: 1px solid var(--border); margin-bottom: 12px;
}
.dep-tree-tabs button {
font: 500 11px/1 var(--font-mono); padding: 8px 16px;
border: none; background: none; color: var(--muted); cursor: pointer;
border-bottom: 2px solid transparent; transition: color 0.12s, border-color 0.12s;
text-transform: uppercase; letter-spacing: 0.04em;
}
.dep-tree-tabs button:hover { color: var(--fg); }
.dep-tree-tabs button.active { color: var(--fg); border-bottom-color: var(--accent); }
/* ─── OVERLAY AGENT TABS ─── */
.overlay-agent-tabs {
display: flex; gap: 0; padding: 0 24px; border-bottom: 1px solid var(--border); background: var(--surface);
}
.overlay-agent-tabs .oat-btn {
font: 500 11px/1.2 var(--font-body); padding: 10px 16px;
border: none; background: none; color: var(--muted); cursor: pointer;
border-bottom: 2px solid transparent; transition: color 0.12s, border-color 0.12s;
display: flex; align-items: center; gap: 6px;
}
.overlay-agent-tabs .oat-btn:hover { color: var(--fg); }
.overlay-agent-tabs .oat-btn.active { color: var(--fg); border-bottom-color: var(--accent); }
.overlay-agent-tabs .oat-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }
/* ─── OVERLAY CHAT INPUT ─── */
.overlay-chat {
border-top: 1px solid var(--border); padding: 12px 24px; background: var(--surface);
display: flex; align-items: center; gap: 10px; flex-shrink: 0;
}
.overlay-chat .oc-label {
font: 600 11px/1 var(--font-mono); color: var(--accent); flex-shrink: 0;
}
.overlay-chat input {
flex: 1; border: 1px solid var(--border); background: var(--bg);
padding: 7px 12px; font: 400 13px/1.4 var(--font-body); color: var(--fg); border-radius: 2px;
}
.overlay-chat input::placeholder { color: var(--muted); }
.overlay-chat button {
font: 500 11px/1 var(--font-body); padding: 7px 14px;
border: 1px solid var(--border); background: var(--fg); color: var(--surface);
cursor: pointer; border-radius: 2px;
}
.overlay-chat button:hover { opacity: 0.9; }
/* ─── CHARTS PAGE ─── */
.charts-panel {
padding: 24px; display: grid; grid-template-columns: 1fr 1fr; gap: 20px;
}
.chart-card {
border: 1px solid var(--border); background: var(--surface); padding: 20px;
}
.chart-card .chart-title {
font: 600 10px/1 var(--font-mono); text-transform: uppercase;
letter-spacing: 0.08em; color: var(--muted); margin-bottom: 16px;
}
.chart-card svg { width: 100%; height: auto; }
/* ─── PORTFOLIO DASHBOARD (home) ─── */
.portfolio-dashboard {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 1px;
background: var(--border);
border: 1px solid var(--border);
}
.pd-section {
background: var(--surface);
padding: 18px 16px;
}
.pd-section-title {
font: 600 9px/1 var(--font-mono);
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--muted);
margin-bottom: 14px;
}
/* Holdings list */
.pd-holding-row {
display: grid;
grid-template-columns: 44px 1fr 60px 52px 48px 36px;
align-items: center;
gap: 8px;
padding: 8px 2px;
border-bottom: 1px solid oklch(95% 0.006 80);
font-size: 11.5px;
}
.pd-holding-row:last-child { border-bottom: none; }
.pd-ticker {
font: 700 11px/1 var(--font-mono);
background: var(--fg);
color: var(--surface);
padding: 2px 6px;
letter-spacing: 0.04em;
text-align: center;
}
.pd-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--fg);
}
.pd-price {
font: 500 11px/1 var(--font-mono);
text-align: right;
}
.pd-change {
font: 600 10px/1 var(--font-mono);
text-align: right;
}
.pd-change.positive { color: var(--green); }
.pd-change.negative { color: var(--red); }
.pd-weight {
font: 400 10px/1 var(--font-mono);
color: var(--muted);
text-align: right;
}
.pd-spark {
height: 16px;
}
.pd-spark svg {
width: 100%;
height: 100%;
display: block;
}
.pd-spark.positive { color: var(--green); }
.pd-spark.negative { color: var(--red); }
/* Chart */
.pd-area-chart {
width: 100%;
height: 88px;
display: block;
}
.pd-chart-labels {
display: flex;
justify-content: space-between;
font: 400 8px/1 var(--font-mono);
color: var(--muted);
margin-top: 4px;
}
.pd-chart-return {
display: flex;
align-items: baseline;
gap: 8px;
margin-top: 10px;
}
.pd-period {
font: 400 10px/1 var(--font-mono);
color: var(--muted);
}
/* Sectors — split half treemap / factor tilt */
.pd-section.pd-sectors {
padding: 0;
display: flex;
flex-direction: column;
overflow: hidden;
}
.pd-split-col {
display: flex;
flex-direction: column;
height: 100%;
}
.pd-split-half {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
min-height: 0;
}
.pd-split-half:first-child {
border-bottom: 1px solid var(--border);
}
.pd-split-half .pd-section-title {
padding: 10px 14px 6px;
flex-shrink: 0;
}
/* Compact treemap for the top half */
.pd-treemap-compact {
flex: 1;
min-height: 0;
}
.pd-treemap-compact .pd-treemap-cell {
padding: 8px 10px;
}
.pd-treemap-compact .cell-pct {
font-size: 20px;
}
.pd-treemap-compact .cell-sector {
font-size: 8px;
}
.pd-treemap-compact .cell-value {
font-size: 9px;
}
/* Factor tilt chart */
.pd-factor-chart {
padding: 0 14px 12px;
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-around;
gap: 6px;
}
.pd-factor-row {
display: grid;
grid-template-columns: 54px 1fr;
align-items: center;
gap: 6px;
}
.pd-factor-label {
font: 500 9px/1 var(--font-mono);
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--muted);
text-align: right;
}
.pd-factor-bar-track {
height: 16px;
background: oklch(95% 0.005 80);
position: relative;
overflow: hidden;
border-radius: 1px;
}
.pd-factor-bar {
height: 100%;
position: absolute;
top: 0;
left: 0;
display: flex;
align-items: center;
padding-right: 4px;
justify-content: flex-end;
border-radius: 1px;
transition: width 0.4s ease;
}
.pd-factor-bar.positive {
background: oklch(52% 0.12 145 / 0.25);
border-right: 2px solid var(--green);
}
.pd-factor-bar.negative {
background: oklch(52% 0.14 25 / 0.15);
border-right: 2px solid var(--red);
}
.pd-factor-val {
font: 600 8px/1 var(--font-mono);
white-space: nowrap;
}
.pd-factor-bar.positive .pd-factor-val {
color: var(--green);
}
.pd-factor-bar.negative .pd-factor-val {
color: var(--red);
}
.pd-treemap {
display: flex;
flex-direction: column;
gap: 1px;
flex: 1;
}
.pd-treemap-row {
display: flex;
gap: 1px;
}
.pd-treemap-cell {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 10px 8px;
cursor: default;
transition: filter 0.15s, transform 0.15s;
position: relative;
overflow: hidden;
}
.pd-treemap-cell:hover {
filter: brightness(1.12);
z-index: 1;
}
.pd-treemap-cell .cell-ticker {
font: 700 11px/1 var(--font-mono);
letter-spacing: 0.06em;
color: oklch(100% 0 0 / 0.85);
}
.pd-treemap-cell .cell-sector {
font: 400 7px/1 var(--font-mono);
text-transform: uppercase;
letter-spacing: 0.08em;
color: oklch(100% 0 0 / 0.5);
margin-top: 2px;
}
.pd-treemap-cell .cell-pct {
font: 700 20px/1.1 var(--font-display);
color: oklch(100% 0 0 / 0.95);
letter-spacing: -0.02em;
margin: 2px 0;
}
.pd-treemap-cell .cell-value {
font: 400 9px/1 var(--font-mono);
color: oklch(100% 0 0 / 0.55);
}
/* Holdings — scrollable */
.pd-section.pd-holdings {
display: flex;
flex-direction: column;
overflow: hidden;
}
.pd-holdings-scroll {
overflow-y: auto;
overflow-x: hidden;
flex: 1;
min-height: 0;
max-height: 320px;
}
.pd-holdings-scroll::-webkit-scrollbar { width: 4px; }
.pd-holdings-scroll::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
.pd-holdings-scroll::-webkit-scrollbar-track { background: transparent; }
.pd-metrics-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1px;
background: var(--border);
}
.pd-metric {
background: var(--surface);
padding: 10px 12px;
}
.pd-metric-label {
font: 500 8px/1 var(--font-mono);
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--muted);
margin-bottom: 2px;
}
.pd-metric-value {
font: 600 13px/1 var(--font-display);
margin-top: 1px;
}