:root {
--bg: #ffffff;
--fg: #1a1a1a;
--muted: #666;
--border: #e2e2e2;
--card: #f7f7f8;
--hover-bg: #f0f0f2;
--accent: #2563eb;
--warn-bg: #fff4e5;
--warn-border: #f0b429;
--ok: #22c55e;
--ok-bg: #d1fae5;
--ok-border: #a7f3d0;
}
.stack-detail summary { cursor: pointer; list-style: none; }
.stack-detail summary::-webkit-details-marker { display: none; }
.stack-detail summary::before { content: "▶ "; font-size: 0.7rem; opacity: 0.6; }
.stack-detail[open] summary::before { content: "▼ "; }
.stack-frames { margin: 0.3rem 0 0 1.25rem; padding: 0; list-style: decimal; }
.stack-frames li { font-size: 0.82rem; color: var(--muted); padding: 0.05rem 0; }
.stack-frames li code { background: none; padding: 0; font-size: inherit; }
tfoot tr { border-top: 2px solid var(--border); }
@media (prefers-color-scheme: dark) {
:root:not([data-theme]) {
--bg: #16181c;
--fg: #cdd0d6;
--muted: #9aa0aa;
--border: #2c2f36;
--card: #1e2127;
--hover-bg: #262a31;
--accent: #60a5fa;
--warn-bg: #2a2318;
--warn-border: #b8860b;
--ok: #4ade80;
--ok-bg: #052e16;
--ok-border: #166534;
--accent-bg: #1e3a5f;
--accent-border: #1d4ed8;
}
}
:root[data-theme="dark"] {
--bg: #16181c;
--fg: #cdd0d6;
--muted: #9aa0aa;
--border: #2c2f36;
--card: #1e2127;
--hover-bg: #262a31;
--accent: #60a5fa;
--warn-bg: #2a2318;
--warn-border: #b8860b;
--ok: #4ade80;
--ok-bg: #052e16;
--ok-border: #166534;
--accent-bg: #1e3a5f;
--accent-border: #1d4ed8;
}
:root[data-theme="light"] {
--bg: #ffffff;
--fg: #1a1a1a;
--muted: #666;
--border: #e2e2e2;
--card: #f7f7f8;
--hover-bg: #f0f0f2;
--accent: #2563eb;
--warn-bg: #fff4e5;
--warn-border: #f0b429;
--ok: #22c55e;
--ok-bg: #d1fae5;
--ok-border: #a7f3d0;
}
* { box-sizing: border-box; }
body { background: var(--bg); color: var(--fg); width: 100%; }
a { color: var(--accent); }
.app { max-width: 1080px; margin: 0 auto; padding: 1.5rem 1.25rem 4rem; }
.report-header { margin-bottom: 1.25rem; }
.report-header h1 { font-size: 1.6rem; margin: 0 0 0.25rem; }
.report-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 0.2rem 0; font-size: 0.82rem; color: var(--muted); margin: 0 0 0.2rem; }
.report-meta a { color: var(--accent); text-decoration: none; }
.report-meta a:hover { text-decoration: underline; }
.report-meta-sep { margin: 0 0.5rem; opacity: 0.4; }
.report-blurb { font-size: 0.82rem; color: var(--muted); margin: 0; }
.report-blurb a { color: var(--accent); text-decoration: none; }
.report-blurb a:hover { text-decoration: underline; }
.waste-summary-table { margin-bottom: 1.5rem; padding-bottom: 0.75rem; }
.waste-summary-table table td, .waste-summary-table table th { padding: 0.5rem 0.6rem; }
.waste-summary-table .bar-bg { display: inline-block; width: 100%; height: 10px; background: var(--border); border-radius: 3px; overflow: hidden; }
.waste-summary-table .bar-fill { display: block; height: 100%; background: var(--accent); border-radius: 3px; }
h1 { font-size: 1.6rem; margin: 0 0 0.25rem; }
h2 { font-size: 1.25rem; margin: 2rem 0 0.75rem; border-bottom: 1px solid var(--border); padding-bottom: 0.35rem; }
h3 { font-size: 1.02rem; margin: 1.25rem 0 0.5rem; }
.subtitle { color: var(--muted); font-size: 0.85rem; margin: 0 0 1rem; }
.oom { background: var(--warn-bg); border: 1px solid var(--warn-border); border-radius: 8px; padding: 1rem 1.25rem; margin: 0 0 1.5rem; }
.oom h2 { border: none; margin: 0 0 0.5rem; }
.oom ul { margin: 0; padding-left: 1.1rem; }
.oom li { margin: 0.3rem 0; line-height: 1.45; }
.kpi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 0.75rem; margin: 0 0 1.5rem; }
.kpi { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 0.75rem 1rem; }
.kpi-link { text-decoration: none; color: inherit; display: block; transition: border-color 0.12s, box-shadow 0.12s; }
.kpi-link:hover { border-color: var(--accent); box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 15%, transparent); }
.kpi-value { font-size: 1.25rem; font-weight: 700; font-variant-numeric: tabular-nums; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kpi-value code { font-size: 0.95rem; display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; cursor: help; }
.kpi-label { color: var(--muted); font-size: 0.78rem; margin-top: 0.15rem; }
code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.9em; background: var(--card); color: var(--fg); padding: 0.05rem 0.3rem; border-radius: 4px; }
a { color: var(--accent); }
a:visited { color: var(--accent); }
code.loader { font-size: 0.78rem; color: var(--muted); }
table { border-collapse: collapse; width: 100%; font-size: 0.86rem; margin: 0.5rem 0 1rem; }
th, td { text-align: left; padding: 0.35rem 0.6rem; border-bottom: 1px solid var(--border); }
th { color: var(--muted); font-weight: 600; }
td.num, th.num { text-align: right; font-variant-numeric: tabular-nums; }
.card { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 0.75rem 1rem; margin: 0.75rem 0; }
.summary-grid { display: grid; grid-template-columns: max-content 1fr; gap: 0.25rem 1.5rem; font-size: 0.9rem; }
.summary-grid dt { color: var(--muted); }
.summary-grid dd { margin: 0; }
.chart-wrap { margin: 0.5rem 0 1rem; }
.chart-download-wrap { position: relative; }
.chart-dl-btn { position: absolute; top: 4px; right: 4px; opacity: 0; transition: opacity 0.15s; background: var(--card); border: 1px solid var(--border); border-radius: 4px; color: var(--muted); cursor: pointer; font-size: 0.72rem; padding: 2px 6px; z-index: 2; }
.chart-download-wrap:hover .chart-dl-btn, .chart-dl-btn:focus { opacity: 1; outline: none; }
.chart-dl-btn:hover { color: var(--accent); border-color: var(--accent); }
details { margin: 0.5rem 0; }
summary { cursor: pointer; color: var(--accent); font-size: 0.85rem; }
.suspect { border-left: 3px solid var(--accent); padding-left: 0.9rem; margin: 1rem 0; }
.pill { display: inline-block; background: var(--card); border: 1px solid var(--border); border-radius: 999px; padding: 0.05rem 0.55rem; font-size: 0.75rem; color: var(--muted); margin-left: 0.4rem; }
.pill.keyword { margin-left: 0; margin-right: 0.4rem; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--accent); }
.thread { margin: 0.25rem 0; border-bottom: 1px solid var(--border); }
.thread summary { color: var(--fg); font-size: 0.9rem; padding: 0.3rem 0; cursor: pointer; display: flex; align-items: baseline; gap: 0.4rem; flex-wrap: wrap; }
.thread-name { font-weight: 600; color: var(--accent); }
.thread-serial { color: var(--muted); font-size: 0.82rem; }
.thread-meta-inline { color: var(--muted); font-size: 0.8rem; display: flex; align-items: center; gap: 0.35rem; flex-wrap: wrap; }
.thread-state-badge { background: var(--card); border: 1px solid var(--border); border-radius: 999px; padding: 0.05rem 0.45rem; font-size: 0.72rem; color: var(--muted); }
.thread-daemon-badge { background: #fef3c7; border: 1px solid #fcd34d; border-radius: 999px; padding: 0.05rem 0.45rem; font-size: 0.72rem; color: #92400e; }
[data-theme=dark] .thread-daemon-badge { background: #451a03; border-color: #78350f; color: #fcd34d; }
.thread-body { padding: 0.4rem 0 0.6rem; }
.thread-meta-row { display: flex; flex-wrap: wrap; gap: 0.5rem 1.2rem; font-size: 0.82rem; color: var(--fg); margin-bottom: 0.5rem; }
.thread-meta-item { display: flex; align-items: baseline; gap: 0.3rem; }
.thread-meta-label { font-size: 0.72rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; color: var(--muted); white-space: nowrap; }
.thread-meta-item code { font-size: 0.8rem; max-width: 28ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: bottom; }
.stack { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.8rem; background: var(--card); border: 1px solid var(--border); border-radius: 6px; padding: 0.6rem 0.8rem; margin: 0.35rem 0 0.75rem; overflow-x: auto; white-space: pre; line-height: 1.5; }
.toc { position: sticky; top: 0; z-index: 5; display: flex; flex-wrap: wrap; align-items: center; gap: 0.25rem 0.35rem; background: var(--bg); border-bottom: 1px solid var(--border); padding: 0.5rem 0; margin: 0.5rem 0 1rem; }
.toc a { text-decoration: none; color: var(--muted); font-size: 0.82rem; padding: 0.2rem 0.6rem; border: 1px solid var(--border); border-radius: 999px; white-space: nowrap; }
.toc a:hover { color: var(--accent); border-color: var(--accent); }
.toc a.active { color: var(--accent); border-color: var(--accent); }
.toc-badge { display: inline-block; background: var(--accent); color: #fff; border-radius: 999px; font-size: 0.65rem; font-weight: 700; line-height: 1; padding: 0.1rem 0.4rem; margin-left: 0.3rem; vertical-align: middle; font-variant-numeric: tabular-nums; }
.toc-group { font-size: 0.68rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--muted); opacity: 0.6; padding: 0 0.15rem; margin-left: 0.5rem; white-space: nowrap; }
.toc-group:first-child { margin-left: 0; }
.skip-link { position: absolute; left: -9999px; top: 1rem; z-index: 100; background: var(--accent); color: #fff; padding: 0.5rem 1rem; border-radius: 6px; font-size: 0.9rem; text-decoration: none; }
.skip-link:focus { left: 1rem; }
.render-error { max-width: 60rem; margin: 3rem auto; padding: 1.5rem 2rem; background: var(--card); border: 1px solid var(--border); border-radius: 8px; color: var(--fg); }
.render-error h1 { margin-top: 0; color: #c0392b; }
.render-error pre { overflow-x: auto; padding: 1rem; background: var(--bg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem; white-space: pre-wrap; }
.back-to-top { position: fixed; right: 1rem; bottom: 2.8rem; z-index: 10; background: var(--card); color: var(--accent); border: 1px solid var(--border); border-radius: 999px; padding: 0.5rem 0.7rem; cursor: pointer; font-size: 1rem; line-height: 1; }
.nav-breadcrumb {
position: fixed; bottom: 0; left: 0; right: 0; z-index: 100;
display: flex; align-items: center; gap: 0.4rem;
padding: 0.3rem 1rem;
font-size: 0.78rem; color: var(--muted);
background: var(--card); border-top: 1px solid var(--border);
flex-wrap: wrap;
box-shadow: 0 -2px 8px rgba(0,0,0,0.08);
}
.nav-bc-label { font-weight: 500; color: var(--muted); margin-right: 0.1rem; }
.nav-bc-sep { color: var(--muted); opacity: 0.5; }
.nav-bc-link { color: var(--accent); text-decoration: none; opacity: 0.8; }
.nav-bc-link:hover { opacity: 1; text-decoration: underline; }
.nav-bc-back { margin-left: auto; font-weight: 500; opacity: 1; }
@media print { .nav-breadcrumb { display: none !important; } }
.theme-toggle { background: var(--card); color: var(--fg); border: 1px solid var(--border); border-radius: 999px; padding: 0.25rem 0.7rem; font-size: 0.8rem; cursor: pointer; }
.theme-toggle:hover { border-color: var(--accent); color: var(--accent); }
.theme-toggle-wrap { display: flex; justify-content: flex-end; margin-bottom: 0.35rem; gap: 0.5rem; }
.show-more-btn { background: none; border: 1px solid var(--border); border-radius: 4px; color: var(--accent); cursor: pointer; font-size: 0.82rem; padding: 0.2rem 0.7rem; }
.show-more-btn:hover { background: var(--card); }
section, .oom { scroll-margin-top: 9rem; }
.tools { display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap; margin: 0.5rem 0; }
.filter { flex: 1; min-width: 200px; max-width: 420px; padding: 0.35rem 0.6rem; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--fg); font-size: 0.85rem; }
.filter:focus { outline: none; border-color: var(--accent); }
.hint { color: var(--muted); font-size: 0.78rem; }
th.sortable { cursor: pointer; user-select: none; }
th.sortable:hover { color: var(--accent); }
th.sortable.active { color: var(--accent); }
.suspect .rank { color: var(--accent); font-weight: 700; }
.accum-path { list-style: none; padding: 0; margin: 0.4rem 0 0.5rem; }
.accum-path li { position: relative; padding: 0.3rem 0 0.3rem 1.3rem; font-size: 0.85rem; }
.accum-path li::before { content: ""; position: absolute; left: 0.45rem; top: 0; bottom: 0; border-left: 2px solid var(--border); }
.accum-path li::after { content: ""; position: absolute; left: 0.2rem; top: 0.6rem; width: 0.55rem; height: 0.55rem; background: var(--accent); border-radius: 50%; }
.accum-path li:first-child::before { top: 0.6rem; }
.accum-path li:last-child::before { bottom: calc(100% - 0.6rem); }
.path-ret { color: var(--muted); font-size: 0.78rem; margin-left: 0.5rem; white-space: nowrap; }
.path-field { color: var(--muted); font-size: 0.85rem; }
.mat-exact { color: var(--muted); font-size: 0.8rem; font-variant-numeric: tabular-nums; }
.label { color: var(--muted); font-weight: 600; font-size: 0.85rem; }
.tree-table { width: 100%; border-collapse: collapse; font-size: 0.86rem; }
.tree-table th { font-size: 0.82rem; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: 0.03em; padding: 3px 5px; border-bottom: 1px solid var(--border); }
.tree-table td { vertical-align: middle; padding: 3px 5px; border-bottom: 1px solid var(--border); }
.tree-table tr:hover td { background: var(--hover-bg); }
.tree-toggle { background: none; border: none; color: var(--accent); cursor: pointer; font-size: 0.8rem; padding: 0 0.35rem 0 0; width: 1.2rem; }
.tree-leaf { color: var(--muted); display: inline-block; width: 1.2rem; text-align: left; padding-right: 0.35rem; }
.bar-cell { position: relative; }
.bar-bg { display: inline-block; width: 60px; height: 8px; background: var(--border); border-radius: 3px; vertical-align: middle; margin-right: 0.5rem; overflow: hidden; }
.bar-fill { display: block; height: 100%; background: var(--accent); border-radius: 3px; }
.dom-subtree { list-style: none; padding: 0; margin: 0.3rem 0 0.3rem 0.6rem; border-left: 1px solid var(--border); }
.dom-subtree li { padding: 0.15rem 0; font-size: 0.85rem; }
.dom-subtree summary { cursor: pointer; font-size: 0.85rem; }
.root-path-chain svg { max-width: 100%; display: block; margin: 0.5rem 0; }
.merged-path-sankey svg { display: block; width: 100%; overflow: visible; }
.sankey-node rect { cursor: default; }
.sankey-link { fill: none; }
.copy-cell { display: inline-flex; align-items: center; gap: 0.3rem; max-width: 100%; }
.copy-cell code { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rdt_TableCell .copy-cell { display: flex; width: 100%; min-width: 0; }
.rdt_TableCell .copy-cell code { min-width: 0; flex-shrink: 1; }
.rdt_TableCol { padding-left: 8px; padding-right: 8px; }
.rdt_TableCell { padding-left: 8px; padding-right: 8px; }
.copy-btn { visibility: hidden; background: none; border: none; color: var(--muted); cursor: pointer; font-size: 0.78rem; padding: 0 0.15rem; line-height: 1; border-radius: 3px; }
.copy-btn:hover, .copy-btn:focus { color: var(--accent); visibility: visible; outline: none; }
td:hover .copy-btn, .rdt_TableRow:hover .copy-btn, .copy-cell:focus-within .copy-btn, li:hover .copy-btn, h3:hover .copy-btn, p:hover .copy-btn { visibility: visible; }
.oom li .copy-btn { width: 0; overflow: hidden; padding: 0; }
.oom li:hover .copy-btn { width: auto; overflow: visible; padding: 0 0.15rem; }
@media print {
.toc, .back-to-top, .theme-toggle-wrap { display: none !important; }
details { display: block !important; }
details > * { display: block !important; }
summary { list-style: none; }
.card, .suspect, .kpi, .chart-wrap { break-inside: avoid; page-break-inside: avoid; }
body { background: #fff; color: #000; }
}
section table, .thread-overview-detail table, .thread-locals-inline table,
details > table, .sysprops table {
display: block;
overflow-x: auto;
max-width: 100%;
}
section table thead, section table tbody, section table tfoot,
.thread-overview-detail table thead, .thread-overview-detail table tbody, .thread-overview-detail table tfoot,
details > table thead, details > table tbody, details > table tfoot,
.thread-locals-inline table thead, .thread-locals-inline table tbody, .thread-locals-inline table tfoot {
display: table;
width: 100%;
}
.thread-locals-inline { margin-top: 0.4rem; }
.thread-locals-label { font-size: 0.82rem; color: var(--muted); margin: 0 0 0.25rem; font-weight: 600; }
.table-scroll {
overflow-x: auto;
max-width: 100%;
}
.table-scroll table {
white-space: nowrap;
}
.rdt_TableWrapper { overflow-x: auto; }
.rdt_wrapper { min-width: unset !important; }
td.cls-cell, td.loader-cell, th.cls-th, th.loader-th {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
td.cls-cell .copy-cell {
display: flex;
align-items: center;
gap: 4px;
overflow: hidden;
}
td.cls-cell code {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1;
min-width: 0;
}
.col-resizer {
position: absolute;
right: 0;
top: 0;
height: 100%;
width: 5px;
cursor: col-resize;
user-select: none;
touch-action: none;
background: transparent;
border-right: 2px solid transparent;
transition: border-color 0.1s;
}
.col-resizer:hover, .col-resizer-active {
border-right-color: var(--accent);
}
@media (max-width: 640px) {
.app { padding: 1rem 0.75rem 3rem; }
.summary-grid { grid-template-columns: 1fr; }
.kpi-grid { grid-template-columns: repeat(2, 1fr); }
h1 { font-size: 1.35rem; }
h2 { font-size: 1.1rem; }
table { font-size: 0.8rem; }
}
.expandable-text {
display: flex;
align-items: center;
gap: 4px;
min-width: 0;
}
.expandable-truncated {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
min-width: 0;
flex: 1;
}
.expand-btn {
flex-shrink: 0;
background: none;
border: 1px solid var(--border);
border-radius: 3px;
cursor: pointer;
color: var(--accent);
font-size: 0.8rem;
padding: 1px 4px;
line-height: 1;
opacity: 0.7;
}
.expand-btn:hover { opacity: 1; background: var(--accent); color: #fff; }
dialog.text-modal {
border: none;
border-radius: 8px;
padding: 0;
max-width: min(860px, 92vw);
width: min(860px, 92vw);
max-height: 80vh;
box-shadow: 0 8px 32px rgba(0,0,0,0.25);
background: var(--bg);
color: var(--text);
overflow: hidden;
display: flex;
flex-direction: column;
}
dialog.text-modal::backdrop {
background: rgba(0,0,0,0.45);
}
.text-modal-inner {
display: flex;
flex-direction: column;
height: 100%;
max-height: 80vh;
}
.text-modal-header {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 14px;
border-bottom: 1px solid var(--border);
background: var(--card-bg);
flex-shrink: 0;
}
.text-modal-title {
font-weight: 600;
font-size: 0.88rem;
color: var(--muted);
flex-shrink: 0;
}
.text-modal-header .filter {
flex: 1;
min-width: 0;
}
.text-modal-content {
padding: 14px;
overflow: auto;
flex: 1;
}
.text-modal-body {
white-space: pre-wrap;
word-break: break-all;
font-size: 0.84rem;
line-height: 1.5;
}
.text-modal-content mark {
background: #ffdd57;
color: #000;
border-radius: 2px;
}
.text-modal-footer {
padding: 6px 14px;
border-top: 1px solid var(--border);
background: var(--card-bg);
font-size: 0.8rem;
flex-shrink: 0;
}
.zm-toolbar { display:flex; align-items:center; gap:0.5rem; padding:4px 0 6px; font-size:0.82rem; flex-wrap:wrap; min-height:28px; }
.zm-crumb { color:var(--link); cursor:pointer; background:none; border:none; padding:0; font:inherit; }
.zm-crumb:hover { text-decoration:underline; }
.zm-crumb-cur { color:var(--fg); font-weight:600; cursor:default; }
.zm-sep { color:var(--muted); }
.zm-spacer { flex:1; }
.zm-mode-btn { padding:2px 8px; border:1px solid var(--border); border-radius:3px; font-size:0.78rem; cursor:pointer; background:var(--bg); color:var(--muted); }
.zm-mode-btn.active { background:var(--accent,#2563eb); color:#fff; border-color:var(--accent,#2563eb); }
.flame-container { overflow-y:auto; max-height:400px; }
.flame-level { display:flex; width:100%; margin-bottom:1px; }
.flame-cell { height:26px; box-sizing:border-box; border-right:1px solid rgba(0,0,0,0.2); cursor:pointer; overflow:hidden; display:flex; align-items:center; padding:0 4px; min-width:0; }
.flame-cell:hover { filter:brightness(1.18); }
.flame-cell-leaf { cursor:default; }
.flame-label { font-size:11px; color:#fff; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.report-footer { margin-top: 3rem; padding: 1.2rem 0 2rem; border-top: 1px solid var(--border); font-size: 0.82rem; color: var(--muted); text-align: center; }
.report-footer a { color: var(--accent); text-decoration: none; }
.report-footer a:hover { text-decoration: underline; }
.obj-explorer { display: flex; gap: 1rem; flex-wrap: wrap; }
.obj-explorer-left { flex: 1.5; min-width: 0; min-width: 300px; }
.obj-explorer-right { flex: 1; min-width: 260px; overflow: hidden; }
.obj-nav-row { display: flex; align-items: center; gap: 0.4rem; padding: 2px 0; }
.shared-badge { font-size: 0.75rem; color: var(--muted); }
.breadcrumb { display: flex; flex-wrap: wrap; gap: 0.3rem; margin-bottom: 0.5rem; font-size: 0.85rem; }
.breadcrumb-item { cursor: pointer; color: var(--accent); }
.breadcrumb-sep { color: var(--muted); }
.btn-active { padding: 3px 10px; background: var(--accent); color: #fff; border: 1px solid var(--accent); border-radius: 4px; cursor: pointer; font-size: 0.85rem; }
.btn-link { background: none; border: none; color: var(--accent); cursor: pointer; padding: 0; font: inherit; font-size: 0.85rem; text-decoration: underline; }
.btn-link:disabled { color: var(--muted); text-decoration: none; cursor: default; }
@media print { .report-footer { display: none; } }
.framework-cards { display: flex; flex-wrap: wrap; gap: 0.75rem; margin-top: 0.5rem; }
.framework-card { background: var(--card, #f8f9fa); border: 1px solid var(--border, #dee2e6); border-radius: 6px; padding: 0.75rem 1rem; min-width: 200px; }
.framework-card-name { font-weight: 600; font-size: 0.95rem; margin-bottom: 0.25rem; }
.framework-card-stats { font-size: 0.85rem; color: var(--muted, #6c757d); }
[data-theme="dark"] {
--rdt-color-text-primary: var(--fg);
--rdt-color-text-secondary: var(--muted);
--rdt-color-striped-text: var(--fg);
--rdt-color-selected-text: var(--fg);
--rdt-color-highlight-text: var(--fg);
--rdt-color-btn: var(--muted);
--rdt-color-btn-disabled: var(--border);
--rdt-color-bg: #16181c;
--rdt-color-highlight: #2a2d34;
--rdt-color-selected: #2a2d34;
--rdt-color-striped: #1e2026;
}
[data-theme="dark"] .rdt_TableRow code,
[data-theme="dark"] .rdt_TableRow span { color: var(--fg) !important; }
[data-theme="dark"] .rdt_headSeparator { --rdt-color-text-primary: var(--fg) !important; }
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--rdt-color-text-primary: var(--fg);
--rdt-color-text-secondary: var(--muted);
--rdt-color-striped-text: var(--fg);
--rdt-color-selected-text: var(--fg);
--rdt-color-highlight-text: var(--fg);
--rdt-color-btn: var(--muted);
--rdt-color-btn-disabled: var(--border);
--rdt-color-bg: #16181c;
--rdt-color-highlight: #2a2d34;
--rdt-color-selected: #2a2d34;
--rdt-color-striped: #1e2026;
}
:root:not([data-theme="light"]) .rdt_TableRow code,
:root:not([data-theme="light"]) .rdt_TableRow span { color: var(--fg) !important; }
:root:not([data-theme="light"]) .rdt_headSeparator { --rdt-color-text-primary: var(--fg) !important; }
}
kbd {
display: inline-block;
padding: 0.1em 0.35em;
font-size: 0.82em;
font-family: var(--mono, monospace);
border: 1px solid var(--border);
border-radius: 3px;
background: var(--card);
color: var(--fg);
white-space: nowrap;
}
.save-toast {
position: fixed;
bottom: 24px;
right: 24px;
padding: 8px 16px;
border-radius: 6px;
font-size: 0.85rem;
z-index: 1000;
pointer-events: none;
animation: toast-in 0.2s ease;
}
.save-toast-saving { background: var(--fg); color: var(--bg); }
.save-toast-done { background: #2a7; color: #fff; }
.save-toast-error { background: #c33; color: #fff; }
@keyframes toast-in {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
.nav-toast {
position: fixed;
bottom: 24px;
right: 24px;
padding: 8px 14px;
border-radius: 6px;
font-size: 0.85rem;
z-index: 1001;
background: var(--fg);
color: var(--bg);
display: flex;
align-items: center;
gap: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.18);
animation: toast-in 0.2s ease;
}
.nav-toast-link {
color: inherit;
opacity: 0.7;
font-size: 0.78rem;
text-decoration: underline;
cursor: pointer;
background: none;
border: none;
padding: 0;
}
.nav-toast-close {
opacity: 0.5;
font-size: 0.78rem;
cursor: pointer;
background: none;
border: none;
color: inherit;
padding: 0;
margin-left: 2px;
}
.save-hint {
font-size: 0.8rem;
color: var(--muted);
display: inline-flex;
align-items: center;
gap: 4px;
}
.trg-modal {
position: fixed;
inset: 5vh 5vw;
width: 90vw;
height: 90vh;
max-width: 1100px;
max-height: 800px;
margin: auto;
border: 1px solid var(--border);
border-radius: 8px;
background: var(--bg);
color: var(--fg);
padding: 0;
display: flex;
flex-direction: column;
overflow: hidden;
}
.trg-modal::backdrop {
background: rgba(0,0,0,0.45);
}
.trg-breadcrumb {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 12px;
border-bottom: 1px solid var(--border);
background: var(--card);
flex-shrink: 0;
}
.trg-nav-btn, .trg-close-btn {
background: none;
border: 1px solid var(--border);
border-radius: 4px;
cursor: pointer;
padding: 2px 7px;
font-size: 0.9rem;
color: var(--fg);
}
.trg-nav-btn:disabled { opacity: 0.3; cursor: default; }
.trg-crumb-trail { display: flex; align-items: center; gap: 2px; flex: 1; overflow: hidden; }
.trg-crumb-sep { color: var(--muted); padding: 0 2px; }
.trg-crumb-item { background: none; border: none; cursor: pointer; color: var(--accent); font-size: 0.85rem; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; max-width: 160px; }
.trg-crumb-item.trg-crumb-current { color: var(--fg); font-weight: 600; cursor: default; }
.trg-close-btn { margin-left: auto; }
.trg-modal-body { flex: 1; overflow-y: auto; padding: 16px; }
.trg-class-page { display: flex; flex-direction: column; gap: 16px; }
.trg-page-title { margin: 0; font-size: 1.1rem; }
.trg-stat-table { border-collapse: collapse; }
.trg-stat-table th, .trg-stat-table td { padding: 3px 10px 3px 0; }
.trg-stat-table th { font-weight: 500; color: var(--muted); }
.trg-edge-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.trg-edge-list { margin: 4px 0; padding-left: 0; list-style: none; }
.trg-edge-list li { display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px; padding: 3px 0; border-bottom: 1px solid var(--border); min-width: 0; }
.trg-link-btn { background: none; border: none; cursor: pointer; color: var(--accent); text-align: left; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.trg-sidebar .trg-edge-list li { flex-wrap: nowrap; }
.trg-sidebar .trg-edge-list .trg-link-btn { flex-shrink: 1; }
.trg-edge-stat { font-size: 0.8rem; color: var(--muted); white-space: nowrap; flex-shrink: 0; margin-left: auto; padding-left: 4px; }
.trg-field-names { font-size: 0.72rem; color: var(--muted); font-style: italic; flex-basis: 100%; padding-left: 2px; margin-top: -2px; }
.trg-page-actions { display: flex; gap: 8px; flex-wrap: wrap; }
.trg-dom-ctx { font-size: 0.85rem; color: var(--muted); background: var(--card); padding: 6px 10px; border-radius: 4px; }
.trg-no-data { font-size: 0.85rem; color: var(--muted); font-style: italic; }
.trg-no-data code { white-space: nowrap; }
.trg-wasm-badge { font-weight: 600; color: var(--accent, #3b82f6); }
.trg-inst-list-page { display: flex; flex-direction: column; gap: 12px; }
.trg-page-count { font-size: 0.85rem; color: var(--muted); font-weight: 400; }
.trg-inst-table { border-collapse: collapse; width: 100%; }
.trg-inst-table th, .trg-inst-table td { padding: 5px 10px; text-align: left; border-bottom: 1px solid var(--border); }
.trg-inst-table th { font-size: 0.8rem; color: var(--muted); font-weight: 500; background: var(--card); position: sticky; top: 0; }
.trg-inst-row { cursor: pointer; }
.trg-inst-row:hover { background: var(--hover-bg); }
.trg-pagination { display: flex; align-items: center; gap: 12px; justify-content: center; padding: 8px; }
.trg-inst-detail { display: flex; flex-direction: column; gap: 14px; }
.trg-page-subtitle { font-size: 0.85rem; font-weight: 400; color: var(--muted); }
.trg-field-name { font-size: 0.8rem; color: var(--muted); min-width: 100px; display: inline-block; }
.trg-more { color: var(--muted); font-size: 0.85rem; font-style: italic; }
.hist-row-highlighted {
background: var(--highlight-bg, #fffde7) !important;
transition: background 0.5s;
}
[data-theme=dark] .hist-row-highlighted { background: #2d2a00 !important; }
@media (prefers-color-scheme: dark) {
:root:not([data-theme]) .hist-row-highlighted { background: #2d2a00 !important; }
}
.trg-tooltip {
position: absolute;
background: var(--bg);
border: 1px solid var(--border);
border-radius: 4px;
padding: 5px 8px;
font-size: 0.8rem;
pointer-events: none;
z-index: 10;
white-space: nowrap;
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
}
.trg-hint-wasm { color: var(--accent, #3b82f6); }
.trg-graph-layout {
display: flex;
gap: 12px;
align-items: flex-start;
}
.trg-sidebar {
width: 260px;
flex-shrink: 0;
border: 1px solid var(--border);
border-radius: 6px;
background: var(--card, #f7f7f8);
min-height: 200px;
max-height: 440px;
font-size: 0.82rem;
overflow: hidden;
display: flex;
flex-direction: column;
}
.trg-sidebar-empty {
padding: 16px 14px;
color: var(--muted);
font-style: italic;
}
.trg-sidebar-empty p { margin: 0 0 8px; }
.trg-sidebar-hint { font-size: 0.78rem; }
.trg-sidebar-content {
display: flex;
flex-direction: column;
gap: 10px;
padding: 12px;
overflow-y: auto;
flex: 1;
}
.trg-sidebar-header {
display: flex;
align-items: flex-start;
gap: 6px;
}
.trg-sidebar-dot {
width: 10px;
height: 10px;
border-radius: 50%;
flex-shrink: 0;
margin-top: 3px;
}
.trg-sidebar-cls {
font-size: 0.78rem;
word-break: break-all;
flex: 1;
line-height: 1.3;
}
.trg-sidebar-stats { width: 100%; }
.trg-sidebar-stats th { white-space: nowrap; }
.trg-sidebar-stats td { text-align: right; }
.trg-sidebar-section-label {
margin: 0;
font-size: 0.76rem;
font-weight: 600;
color: var(--muted);
}
.trg-sidebar-actions {
display: flex;
flex-direction: column;
gap: 4px;
}
.trg-sidebar-actions .show-more-btn {
width: 100%;
text-align: left;
font-size: 0.78rem;
}
.trg-sidebar-btns {
display: flex;
gap: 4px;
flex-wrap: wrap;
padding-top: 6px;
border-top: 1px solid var(--border);
}
.heap-inspector {
position: fixed; top: 0; right: 0; bottom: 0;
background: var(--bg); border-left: 1px solid var(--border);
box-shadow: -4px 0 20px rgba(0,0,0,0.12);
display: flex; flex-direction: column; z-index: 200;
min-width: 260px; max-width: 680px;
}
.inspector-resize-handle {
position: absolute; left: 0; top: 0; bottom: 0; width: 6px; cursor: ew-resize;
}
.inspector-resize-handle:hover { background: var(--accent); opacity: 0.4; }
.inspector-header {
display: flex; align-items: center; gap: 6px;
padding: 8px 12px 8px 16px; border-bottom: 1px solid var(--border);
background: var(--card); flex-shrink: 0;
}
.inspector-title { flex: 1; font-weight: 600; font-size: 0.9rem; }
.inspector-nav-btn, .inspector-close-btn {
background: none; border: 1px solid var(--border); border-radius: 4px;
cursor: pointer; padding: 2px 7px; font-size: 0.9rem; color: var(--fg);
}
.inspector-nav-btn:disabled { opacity: 0.3; cursor: default; }
.inspector-body { flex: 1; overflow-y: auto; padding: 14px 16px; }
.inspector-empty { color: var(--muted); font-size: 0.85rem; margin-top: 40px; text-align: center; }
.inspector-tab-btn {
position: fixed; top: 50%; right: 0; writing-mode: vertical-rl;
transform: rotate(180deg); background: var(--card);
border: 1px solid var(--border); border-radius: 4px 0 0 4px;
padding: 8px 4px; cursor: pointer; font-size: 0.8rem; z-index: 200;
}
.inspector-page { display: flex; flex-direction: column; gap: 14px; }
.inspector-page-title { margin: 0; font-size: 1rem; overflow-wrap: anywhere; }
.inspector-page-title code { font-size: 0.85rem; }
.inspector-dom-path { margin: 0; padding-left: 1.2rem; font-size: 0.85rem; }
.inspector-dom-path li { padding: 2px 0; }
.inspector-gcpath { margin-top: 0.75rem; border-top: 1px solid var(--border); padding-top: 0.5rem; }
.inspector-gcpath-toggle { background: none; border: none; cursor: pointer; font-size: 0.82rem; font-weight: 600; color: var(--muted); padding: 0; }
.inspector-gcpath-toggle:hover { color: var(--fg); }
.inspector-nudge { background: var(--accent-bg, #eff6ff); border: 1px solid var(--accent-border, #bfdbfe); border-radius: 5px; padding: 0.35rem 0.5rem; font-size: 0.78rem; margin-bottom: 0.5rem; color: var(--fg); }
.inspector-top-fields { margin-top: 0.6rem; }
.inspector-top-fields h4 { margin: 0 0 0.3rem; font-size: 0.82rem; display: flex; align-items: center; justify-content: space-between; }
.inspector-field-bars { list-style: none; margin: 0; padding: 0; font-size: 0.82rem; }
.inspector-field-bars li { margin-bottom: 0.35rem; }
.inspector-field-bar-row { display: flex; align-items: baseline; gap: 0.3rem; flex-wrap: wrap; }
.inspector-field-bar-track { height: 4px; background: var(--border); border-radius: 2px; margin-top: 2px; }
.inspector-field-bar-fill { height: 4px; background: var(--accent, #3b82f6); border-radius: 2px; min-width: 2px; }
.leak-chain-svg { display: block; margin: 8px 0; }
.trg-field-dist li { flex-wrap: wrap; gap: 4px; }
.trg-field-name-tag { font-family: var(--mono); font-size: 0.78rem; background: var(--code-bg, rgba(0,0,0,0.06)); padding: 1px 4px; border-radius: 3px; flex-shrink: 0; }
.trg-field-dst { font-size: 0.78rem; color: var(--muted); flex-shrink: 0; }
.inspector-field-tags { display: inline-flex; gap: 3px; flex-wrap: wrap; margin-left: 4px; }
.inspector-field-tag { font-family: var(--mono); font-size: 0.72rem; background: var(--code-bg, rgba(0,0,0,0.06)); color: var(--muted); padding: 0px 3px; border-radius: 3px; }
.trg-gcpath-section { margin: 0.5rem 0 0; padding: 0.4rem 0.5rem; border-top: 1px solid var(--border); }
.trg-gcpath-list { margin: 0.2rem 0 0; padding: 0 0 0 1.2rem; font-size: 0.76rem; line-height: 1.6; }
.inspector-idom-chain { display: flex; align-items: center; flex-wrap: wrap; gap: 2px 4px; padding: 6px 8px; background: var(--code-bg, rgba(0,0,0,0.04)); border-radius: 6px; font-size: 0.78rem; }
.inspector-idom-label { color: var(--muted); font-size: 0.74rem; margin-right: 4px; white-space: nowrap; }
.inspector-idom-item { background: none; border: none; cursor: pointer; display: flex; flex-direction: column; align-items: center; gap: 1px; padding: 2px 4px; border-radius: 4px; }
.inspector-idom-item:hover { background: var(--border); }
.inspector-idom-cls { font-family: var(--mono); font-size: 0.76rem; color: var(--fg); }
.inspector-idom-size { font-size: 0.68rem; color: var(--muted); }
.inspector-idom-arrow { color: var(--muted); padding: 0 1px; }
.inspector-idom-this { font-size: 0.76rem; color: var(--muted); font-weight: 600; padding: 2px 4px; }
.cy-graph-container { width: 100%; height: 440px; border: 1px solid var(--border); border-radius: 6px; background: var(--card, #f7f7f8); display: block; }
.gc-heatmap-table { border-collapse: collapse; font-size: 0.78rem; max-width: 100%; }
.gc-heatmap-table th, .gc-heatmap-table td { padding: 4px 6px; border: 1px solid var(--border); }
.gc-heatmap-colhead { font-family: var(--mono); font-size: 0.72rem; text-align: center; width: 70px; max-width: 70px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.gc-heatmap-coltext { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: 62px; }
.gc-heatmap-rowlabel { text-align: left; white-space: nowrap; color: var(--muted); font-size: 0.75rem; }
.gc-heatmap-cell { text-align: center; cursor: pointer; font-size: 0.72rem; min-width: 58px; white-space: nowrap; transition: filter 0.1s; }
.gc-heatmap-cell:hover { filter: brightness(1.1); }
.gc-heatmap-empty { background: var(--code-bg, rgba(0,0,0,0.03)); cursor: default; }
.ret-heatmap-table .gc-heatmap-rowlabel { min-width: 120px; max-width: 200px; overflow: hidden; text-overflow: ellipsis; }
.leak-score-grid { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 0.5rem; }
.leak-score-card { position: relative; min-width: 180px; max-width: 240px; flex: 1 1 180px; border: 1px solid var(--border); border-radius: 6px; overflow: hidden; background: var(--card, #f9f9fb); }
.leak-score-bar { position: absolute; top: 0; left: 0; height: 3px; background: var(--accent, #3b82f6); transition: width 0.3s; }
.leak-score-high .leak-score-bar { background: #e55; }
.leak-score-mid .leak-score-bar { background: #e90; }
.leak-score-low .leak-score-bar { background: var(--accent, #3b82f6); }
.leak-score-body { display: flex; align-items: center; justify-content: space-between; padding: 8px 8px 2px; gap: 4px; }
.leak-score-cls { flex: 1 1 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 0.82rem; }
.leak-score-num { font-size: 1.1rem; font-weight: 700; color: var(--muted); min-width: 32px; text-align: right; }
.leak-score-high .leak-score-num { color: #c44; }
.leak-score-mid .leak-score-num { color: #b80; }
.leak-score-tags { display: flex; flex-wrap: wrap; gap: 3px; padding: 3px 8px 6px; }
.leak-score-tag { font-size: 0.68rem; background: var(--code-bg, rgba(0,0,0,0.06)); border-radius: 3px; padding: 1px 4px; color: var(--muted); }
.sankey-chain-panel { width: 180px; flex-shrink: 0; background: var(--card-bg, var(--bg)); border: 1px solid var(--border); border-radius: 4px; padding: 0.4rem 0.5rem; font-size: 0.8rem; max-height: 420px; overflow-y: auto; }
.sankey-chain-header { font-weight: 600; margin-bottom: 0.35rem; overflow: hidden; font-size: 0.78rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.03em; }
.sankey-chain-step { padding: 0.15rem 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--fg); font-family: var(--mono, monospace); font-size: 0.78rem; }
.sankey-chain-step:hover:not(.sankey-chain-current) { color: var(--accent); text-decoration: underline; }
.sankey-chain-current { font-weight: 600; color: var(--accent); }