:root {
--bg: #f8f9fa;
--text: #333;
--text-muted: #666;
--text-light: #999;
--border: #e0e0e0;
--blue: #4a88c7;
--surface: #fff;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
#app {
display: flex;
flex-direction: column;
flex-grow: 1;
min-height: 0;
overflow: hidden;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.5;
display: flex;
flex-direction: column;
height: 100vh;
overflow: hidden;
}
.header {
background: var(--surface);
padding: 16px 24px;
flex-shrink: 0;
}
.header-top {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
}
.header-top h1 {
font-size: 20px;
font-weight: 600;
}
.stats {
display: flex;
flex-wrap: wrap;
gap: 16px;
font-size: 13px;
color: var(--text);
font-weight: 500;
margin-bottom: 6px;
}
.stat-item {
display: flex;
align-items: center;
gap: 6px;
}
.stat-item svg {
width: 16px; height: 16px;
color: var(--text-muted);
flex-shrink: 0;
}
.stat-item[title] { cursor: help; }
.meta {
font-size: 12px;
color: var(--text-light);
}
.tabs {
display: flex;
background: var(--surface);
padding: 12px 24px 0 24px;
gap: 4px;
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.tab-btn {
border: 1px solid transparent;
border-bottom: none;
background: var(--surface);
cursor: pointer;
font-size: 14px;
font-weight: 500;
color: var(--text-muted);
transition: all 0.15s ease-in-out;
padding: 8px 18px;
border-radius: 6px 6px 0 0;
margin-bottom: -1px;
}
.tab-btn:hover {
background: #f0f0f0;
color: var(--text);
}
.tab-btn.active {
background: var(--bg);
color: var(--text);
font-weight: 600;
border-color: var(--border);
border-bottom-color: var(--bg);
}
.tab-content {
display: none;
flex-grow: 1;
overflow-y: auto;
}
.tab-content.active {
display: flex;
flex-direction: column;
min-height: 0;
overflow-y: auto;
}
#tab-flamegraph {
background: var(--bg);
padding: 16px 24px;
}
#flamegraph-container > svg {
display: block;
width: 100%;
height: auto;
}
.flamegraph-wrap {
background: var(--surface);
border-radius: 6px;
border: 1px solid var(--border);
flex-grow: 1;
overflow: hidden;
}
.bottom-bar {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 6px;
padding: 10px 20px;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
font-size: 13px;
gap: 12px;
flex-wrap: wrap;
margin-bottom: 12px;
}
.controls-left {
display: flex;
gap: 8px;
align-items: center;
}
.search-box {
position: relative;
display: flex;
align-items: center;
}
.search-box > svg {
position: absolute;
left: 10px;
width: 14px;
height: 14px;
min-width: 14px;
min-height: 14px;
max-width: 14px;
max-height: 14px;
color: #999;
pointer-events: none;
z-index: 1;
}
.search-box input {
padding: 6px 10px 6px 30px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 13px;
width: 200px;
outline: none;
font-family: inherit;
}
.search-box input:focus {
border-color: var(--blue);
}
.control-btn {
padding: 6px 12px;
background: var(--surface);
border: 1px solid #ddd;
border-radius: 4px;
color: var(--text);
cursor: pointer;
font-size: 13px;
font-weight: 500;
font-family: inherit;
}
.control-btn:hover { background: #f0f0f0; }
.control-btn.active {
background: var(--blue);
color: #fff;
border-color: var(--blue);
}
.legend-right {
display: flex;
gap: 14px;
align-items: center;
color: var(--text-muted);
font-size: 12px;
}
.legend-item {
display: flex;
align-items: center;
gap: 5px;
}
.legend-color {
width: 14px;
height: 11px;
border-radius: 2px;
}
#search-matches {
color: #c44;
font-size: 12px;
font-weight: 500;
}
#tab-targets, #tab-table { padding: 24px; }
.action-summary {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 6px;
padding: 16px 20px;
margin-bottom: 20px;
}
.action-summary h3 { font-size: 14px; margin-bottom: 8px; color: #444; }
.action-summary ul { list-style: none; padding: 0; }
.action-summary li { font-size: 13px; padding: 3px 0; }
.cargo-diff {
background: #1e1e1e;
border-radius: 4px;
padding: 8px 12px;
margin: 6px 0 10px 20px;
font-family: "Consolas", "Fira Code", monospace;
font-size: 12px;
line-height: 1.6;
overflow-x: auto;
display: none;
}
.show-diff-btn {
display: inline-block;
font-size: 11px;
color: var(--blue);
border: 1px solid var(--blue);
border-radius: 3px;
padding: 1px 6px;
margin-left: 6px;
cursor: pointer;
vertical-align: middle;
font-family: inherit;
}
.cargo-diff .diff-file { color: #888; }
.cargo-diff .diff-rm { color: #f44; }
.cargo-diff .diff-add { color: #4c4; }
.cargo-diff .diff-comment { color: #888; font-style: italic; }
.targets-table {
width: 100%;
border-collapse: collapse;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 6px;
overflow: hidden;
font-size: 13px;
}
.targets-table th {
background: #f8f8f8;
text-align: left;
padding: 10px 12px;
border-bottom: 2px solid #ddd;
font-weight: 600;
font-size: 12px;
text-transform: uppercase;
color: #555;
white-space: nowrap;
}
.targets-table th[title] { cursor: help; }
.targets-table td {
padding: 8px 12px;
border-bottom: 1px solid #eee;
vertical-align: top;
}
.targets-table tr:hover { background: #f9f9f9; }
.targets-table tr.expandable { cursor: pointer; }
.detail-row { display: none; }
.detail-row.open { display: table-row; }
.detail-row td {
background: #fafafa;
padding: 12px 20px;
border-bottom: 1px solid #ddd;
}
.detail-box {
font-family: "Consolas", monospace;
font-size: 12px;
line-height: 1.6;
}
.detail-box .label { color: #888; }
.badge {
display: inline-block;
padding: 1px 6px;
border-radius: 3px;
font-size: 11px;
font-weight: 600;
}
.badge-high { background: #e8f5e9; color: #2e7d32; }
.badge-medium { background: #fff3e0; color: #e65100; }
.badge-low { background: #fce4ec; color: #c62828; }
.badge-noise { background: #f3e5f5; color: #6a1b9a; }
.badge-flag { background: #e3f2fd; color: #1565c0; margin-right: 4px; }
.ref-file { color: var(--blue); }
.ref-line { color: #888; margin-left: 16px; }
#tab-json { padding: 24px; }
.json-container {
position: relative;
background: #1e1e1e;
border-radius: 6px;
overflow: hidden;
flex-grow: 1;
}
.json-container pre {
padding: 20px;
overflow: auto;
color: #d4d4d4;
font-family: "Consolas", "Fira Code", monospace;
font-size: 12px;
line-height: 1.5;
margin: 0;
height: 100%;
}
.copy-btn {
position: absolute;
top: 8px; right: 8px;
padding: 6px 14px;
background: #333;
color: #ccc;
border: 1px solid #555;
border-radius: 4px;
cursor: pointer;
font-size: 12px;
}
.copy-btn:hover { background: #444; }
.flamegraph-main {
display: flex;
flex-grow: 1;
gap: 12px;
overflow: hidden;
}
.flamegraph-main .flamegraph-wrap {
flex: 1;
min-width: 0;
}
.feature-sidebar {
width: 280px;
flex-shrink: 0;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 6px;
display: flex;
flex-direction: column;
overflow: hidden;
}
.feature-sidebar-header {
padding: 10px 12px;
border-bottom: 1px solid #eee;
flex-shrink: 0;
}
.feature-sidebar-header select {
width: 100%;
padding: 5px 8px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 12px;
font-family: "Consolas", monospace;
background: var(--surface);
cursor: pointer;
}
.feature-sidebar-body {
padding: 8px 12px;
overflow-y: auto;
flex: 1;
}
.feature-sidebar-footer {
padding: 8px 12px;
border-top: 1px solid #eee;
display: flex;
align-items: center;
gap: 6px;
flex-wrap: wrap;
flex-shrink: 0;
}
.feature-crate-link {
font-size: 12px;
font-family: "Consolas", monospace;
padding: 4px 0;
margin-bottom: 4px;
}
.feature-crate-link a {
display: inline-flex;
align-items: center;
gap: 4px;
}
.crate-icon,
.external-link-icon {
display: inline-flex;
flex-shrink: 0;
align-items: center;
}
.crate-icon svg {
width: 12px;
height: 12px;
color: var(--text-muted);
}
.external-link-icon svg {
width: 9px;
height: 9px;
color: var(--text-light);
}
.feature-parents {
font-size: 12px;
color: var(--text-muted);
padding: 4px 0 8px 0;
margin-bottom: 6px;
border-bottom: 1px solid #eee;
line-height: 1.6;
}
.feature-parents-label {
font-weight: 600;
font-size: 11px;
color: var(--text-light);
text-transform: uppercase;
letter-spacing: 0.3px;
margin-bottom: 2px;
}
.feature-parent-link {
color: var(--blue);
cursor: pointer;
font-family: "Consolas", monospace;
font-size: 12px;
}
.feature-parent-link:hover {
text-decoration: underline;
}
.feature-parents-more {
color: var(--blue);
cursor: pointer;
font-size: 11px;
}
.feature-parents-more:hover {
text-decoration: underline;
}
.feature-parents-overflow {
display: none;
}
.feature-parents-actions {
margin-top: 6px;
}
.feature-label {
display: block;
padding: 3px 0;
font-size: 13px;
cursor: pointer;
}
.feature-label:hover { background: #f5f5f5; }
.feature-name {
font-family: "Consolas", monospace;
font-size: 12px;
}
.feature-activates {
display: block;
margin-left: 22px;
font-size: 11px;
color: #888;
font-family: "Consolas", monospace;
}
.feature-collapsed-section {
margin-top: 4px;
border-top: 1px solid #eee;
padding-top: 4px;
}
.feature-collapsed-section summary {
font-size: 11px;
color: #999;
cursor: pointer;
padding: 2px 0;
user-select: none;
}
.feature-collapsed-section summary:hover {
color: #666;
}
.feature-panel-footer {
padding: 10px 16px;
border-top: 1px solid #eee;
background: #fafafa;
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.feature-panel-btn {
padding: 5px 14px;
border-radius: 4px;
border: 1px solid #ccc;
cursor: pointer;
font-size: 13px;
background: var(--surface);
font-family: inherit;
}
.feature-panel-btn-apply {
background: var(--blue);
color: #fff;
border-color: var(--blue);
}
.feature-panel-btn-apply:hover { opacity: 0.9; }
.feature-panel-btn-reset:hover { background: #f5f5f5; }
.feature-delta { font-size: 12px; margin-left: 4px; }
.depflame-summary-bar {
display: flex;
align-items: center;
gap: 20px;
padding: 6px 20px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 6px 6px 0 0;
border-bottom: none;
font-size: 13px;
flex-shrink: 0;
min-height: 34px;
}
.feature-dep-delta {
font-size: 11px;
font-weight: 600;
}
.feature-dep-delta.positive { color: #c62828; }
.feature-dep-delta.negative { color: #2e7d32; }
.feature-separator { margin: 4px 0; border: none; border-top: 1px solid #eee; }
.feature-empty { color: #888; font-size: 12px; padding: 8px 0; }
.feature-panel-btn-sm {
margin-left: auto;
padding: 2px 10px;
font-size: 12px;
}
.summary-delta-positive { color: #c62828; font-weight: 600; }
.summary-delta-negative { color: #2e7d32; font-weight: 600; }
.text-muted { color: var(--text-muted); }
.text-light { color: var(--text-light); }
.text-disabled { color: #aaa; }
.text-generated { color: #999; }
.text-section-desc { font-size: 13px; color: #666; margin-bottom: 8px; }
.text-section-title { font-size: 14px; color: #444; margin-bottom: 4px; }
.crate-link { color: inherit; text-decoration: underline dotted; }
.legend-workspace { background: rgb(70,130,180); }
.legend-leaf { background: hsl(120,55%,58%); border: 1px solid rgba(0,0,0,0.12); }
.legend-normal { background: hsl(49,71%,52%); border: 1px solid rgba(0,0,0,0.12); }
.legend-shared { background: hsl(270,50%,65%); border: 1px dashed rgba(0,0,0,0.4); }
.legend-unused { background: #fff; border: 2px solid rgba(220,20,80,0.8); }
.unique-bar {
background: #4caf50;
height: 10px;
border-radius: 2px;
min-width: 0;
}
.dep-summary-cell {
display: flex;
align-items: center;
gap: 6px;
}
.detail-section { margin-bottom: 12px; }
.detail-refs-header { margin-top: 8px; }
.detail-refs-body { margin-left: 8px; }
.dep-summary-table { margin-top: 8px; }
.upstream-badge { cursor: help; }
.flamegraph-error { color: red; }
.disclaimer {
background: #fff3cd;
border: 1px solid #ffc107;
border-radius: 6px;
padding: 12px 16px;
margin-bottom: 20px;
font-size: 13px;
color: #664d03;
}