:root {
--bg-primary: #0f172a;
--bg-secondary: #1e293b;
--bg-tertiary: #334155;
--text-primary: #f8fafc;
--text-secondary: #94a3b8;
--border-color: #475569;
--accent-green: #22c55e;
--accent-yellow: #eab308;
--accent-red: #ef4444;
--accent-blue: #3b82f6;
--accent-orange: #f97316;
--panel-shadow: 0 18px 42px rgba(0, 0, 0, 0.32);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
background: var(--bg-primary);
color: var(--text-primary);
min-height: 100vh;
}
.container {
width: 100vw;
height: 100vh;
overflow: hidden;
}
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.75rem 1.5rem;
background: rgba(15, 23, 42, 0.94);
backdrop-filter: blur(16px);
border-bottom: 1px solid var(--border-color);
gap: 1rem;
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 500;
transform: none;
transition: border-color 0.2s ease, background 0.2s ease;
}
.header:hover,
.header.visible {
transform: none;
}
.header-trigger {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 20px;
z-index: 499;
}
.header-left {
display: flex;
align-items: center;
gap: 1rem;
}
.header h1 {
font-size: 1.25rem;
font-weight: 600;
color: var(--text-primary);
}
.header-stats {
display: flex;
min-width: 0;
flex: 1;
justify-content: center;
}
.health-header-card {
display: grid;
grid-template-columns: auto minmax(18rem, 1fr) auto auto;
align-items: center;
width: min(100%, 980px);
gap: 0.875rem;
}
.health-grade-block {
display: flex;
align-items: center;
gap: 0.5rem;
}
.health-label {
color: var(--text-secondary);
font-size: 0.6875rem;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.health-rationale {
display: flex;
min-width: 0;
align-items: center;
gap: 0.5rem;
color: var(--text-secondary);
font-size: 0.8125rem;
}
.health-rationale span:not(.revision-chip) {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.health-counts {
display: flex;
gap: 0.375rem;
}
.health-count,
.overview-count {
border: 1px solid rgba(148, 163, 184, 0.26);
background: rgba(30, 41, 59, 0.74);
color: var(--text-primary);
cursor: pointer;
transition: border-color 0.15s ease, background 0.15s ease, transform 0.15s ease;
}
.health-count {
display: grid;
grid-template-columns: auto auto;
align-items: baseline;
gap: 0.375rem;
padding: 0.375rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.75rem;
}
.health-count:hover,
.overview-count:hover,
.overview-issue:hover {
transform: translateY(-1px);
border-color: var(--accent-blue);
}
.health-count span {
color: var(--text-secondary);
}
.health-count strong {
font-size: 0.9375rem;
}
.health-count.critical strong,
.overview-count.critical {
color: var(--accent-red);
}
.health-count.high strong,
.overview-count.high {
color: var(--accent-orange);
}
.health-count.medium strong,
.overview-count.medium {
color: var(--accent-yellow);
}
.health-meta {
display: flex;
gap: 0.5rem;
color: var(--text-secondary);
font-size: 0.75rem;
white-space: nowrap;
}
.revision-chip {
display: inline-flex;
align-items: center;
padding: 0.125rem 0.375rem;
border: 1px solid rgba(56, 189, 248, 0.35);
border-radius: 999px;
background: rgba(14, 116, 144, 0.22);
color: #bae6fd;
font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
font-size: 0.6875rem;
}
.stat {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.875rem;
color: var(--text-secondary);
}
.stat-value {
font-weight: 600;
color: var(--text-primary);
}
.issue-critical .stat-value { color: var(--accent-red); }
.issue-high .stat-value { color: #f97316; }
.issue-medium .stat-value { color: var(--accent-yellow); }
.health-grade {
padding: 0.25rem 0.75rem;
border-radius: 0.375rem;
font-weight: 700;
font-size: 1rem;
}
.health-grade.S { background: #14b8a6; color: #000; }
.health-grade.A { background: var(--accent-green); color: #000; }
.health-grade.B { background: #4ade80; color: #000; }
.health-grade.C { background: var(--accent-yellow); color: #000; }
.health-grade.D { background: #f97316; color: #000; }
.health-grade.F { background: var(--accent-red); color: #fff; }
.size-sample {
display: inline-block;
width: 1.25rem;
height: 1.25rem;
border: 2px solid rgba(248, 250, 252, 0.72);
border-radius: 0.375rem;
background: #64748b;
}
.main {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1;
}
.canvas-toolbar {
position: fixed;
top: 4.75rem;
left: 50%;
z-index: 120;
display: flex;
transform: translateX(-50%);
align-items: center;
gap: 0.625rem;
pointer-events: auto;
}
.segmented-control {
display: flex;
flex-wrap: wrap;
padding: 0.1875rem;
border: 1px solid rgba(148, 163, 184, 0.28);
border-radius: 0.5rem;
background: rgba(15, 23, 42, 0.86);
box-shadow: var(--panel-shadow);
backdrop-filter: blur(12px);
}
.segment,
.canvas-tool-btn {
border: 0;
border-radius: 0.375rem;
background: transparent;
color: var(--text-secondary);
cursor: pointer;
font-size: 0.8125rem;
font-weight: 600;
}
.segment {
padding: 0.5rem 0.75rem;
}
.segment.active {
background: rgba(59, 130, 246, 0.25);
color: var(--text-primary);
}
.canvas-tool-btn {
padding: 0.625rem 0.875rem;
border: 1px solid rgba(148, 163, 184, 0.28);
background: rgba(15, 23, 42, 0.86);
box-shadow: var(--panel-shadow);
}
.graph-container {
width: 100%;
height: 100%;
background: var(--bg-primary);
position: relative;
overflow: hidden;
}
#cy {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 100%;
height: 100%;
}
.graph-3d-container {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
}
.graph-error {
padding: 2rem;
color: var(--accent-red);
}
.dimension-space-labels {
position: fixed;
left: 1rem;
bottom: 1rem;
z-index: 50;
display: grid;
gap: 0.375rem;
pointer-events: none;
}
.axis-label {
padding: 0.375rem 0.5rem;
background: rgba(15, 23, 42, 0.82);
border: 1px solid var(--border-color);
border-radius: 0.25rem;
font-size: 0.75rem;
color: var(--text-primary);
}
.axis-x { border-color: var(--strength-intrusive); }
.axis-y { border-color: var(--subdomain-supporting); }
.axis-z { border-color: var(--strength-contract); }
.report-view {
position: absolute;
inset: 0;
z-index: 40;
overflow-y: auto;
background: #111827;
padding: 6.5rem 1.5rem 2.5rem;
}
.report-shell {
display: grid;
grid-template-columns: minmax(11rem, 15rem) minmax(0, 52rem);
gap: 1.25rem;
max-width: 1120px;
margin: 0 auto;
align-items: start;
}
.report-toc {
position: sticky;
top: 6.5rem;
max-height: calc(100vh - 8rem);
overflow-y: auto;
padding: 0.875rem;
border: 1px solid rgba(148, 163, 184, 0.24);
border-radius: 0.5rem;
background: rgba(15, 23, 42, 0.76);
}
.report-toc-title {
margin-bottom: 0.625rem;
color: var(--text-secondary);
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
}
.report-toc-list {
display: grid;
gap: 0.25rem;
}
.report-toc-link {
display: block;
padding: 0.25rem 0;
color: #cbd5e1;
font-size: 0.8125rem;
line-height: 1.35;
text-decoration: none;
}
.report-toc-link:hover {
color: #f8fafc;
}
.report-toc-link.h2 {
padding-left: 0.75rem;
}
.report-toc-link.h3 {
padding-left: 1.5rem;
color: #94a3b8;
font-size: 0.75rem;
}
.report-toc-empty {
color: var(--text-secondary);
font-size: 0.8125rem;
}
.report-panel {
min-width: 0;
border: 1px solid rgba(148, 163, 184, 0.24);
border-radius: 0.5rem;
background: #0b1220;
box-shadow: var(--panel-shadow);
}
.report-meta {
display: flex;
justify-content: flex-end;
padding: 0.75rem 1rem;
border-bottom: 1px solid rgba(148, 163, 184, 0.18);
color: var(--text-secondary);
font-size: 0.75rem;
}
.report-content {
padding: 1.5rem 1.75rem 2rem;
color: #dbeafe;
font-size: 0.9375rem;
line-height: 1.7;
overflow-wrap: anywhere;
}
.report-content h1,
.report-content h2,
.report-content h3 {
position: relative;
color: #f8fafc;
line-height: 1.25;
}
.report-content h1 {
margin: 0 0 1.25rem;
font-size: 1.75rem;
}
.report-content h2 {
margin: 2rem 0 0.75rem;
padding-top: 0.25rem;
border-top: 1px solid rgba(148, 163, 184, 0.18);
font-size: 1.25rem;
}
.report-content h3 {
margin: 1.5rem 0 0.5rem;
font-size: 1rem;
}
.report-content p,
.report-content ul,
.report-content ol,
.report-content table,
.report-content pre {
margin-bottom: 1rem;
}
.report-content ul,
.report-content ol {
padding-left: 1.4rem;
}
.report-content li + li {
margin-top: 0.25rem;
}
.report-content a {
color: #7dd3fc;
}
.report-heading-anchor {
margin-left: 0.5rem;
color: #64748b;
font-size: 0.8em;
text-decoration: none;
opacity: 0;
}
.report-content h1:hover .report-heading-anchor,
.report-content h2:hover .report-heading-anchor,
.report-content h3:hover .report-heading-anchor {
opacity: 1;
}
.report-content code {
padding: 0.125rem 0.25rem;
border-radius: 0.25rem;
background: rgba(30, 41, 59, 0.92);
color: #e0f2fe;
font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
font-size: 0.875em;
}
.report-content pre {
overflow-x: auto;
padding: 1rem;
border: 1px solid rgba(148, 163, 184, 0.18);
border-radius: 0.5rem;
background: #020617;
}
.report-content pre code {
padding: 0;
background: transparent;
}
.report-content table {
display: block;
width: 100%;
overflow-x: auto;
border-collapse: collapse;
}
.report-content th,
.report-content td {
padding: 0.5rem 0.625rem;
border: 1px solid rgba(148, 163, 184, 0.22);
text-align: left;
vertical-align: top;
}
.report-content th {
background: rgba(30, 41, 59, 0.82);
color: #f8fafc;
}
.report-content blockquote {
margin: 0 0 1rem;
padding: 0.75rem 1rem;
border-left: 3px solid #38bdf8;
background: rgba(14, 165, 233, 0.1);
color: #cbd5e1;
}
.report-error {
display: grid;
gap: 0.375rem;
padding: 1rem;
border: 1px solid rgba(239, 68, 68, 0.45);
border-radius: 0.5rem;
background: rgba(127, 29, 29, 0.24);
color: #fecaca;
}
@media (max-width: 840px) {
.report-view {
padding: 6rem 0.875rem 1.5rem;
}
.report-shell {
grid-template-columns: 1fr;
}
.report-toc {
position: static;
max-height: 12rem;
}
.report-content {
padding: 1.125rem;
font-size: 0.875rem;
}
}
.sidebar {
width: 360px;
min-width: 280px;
max-width: 800px;
background: rgba(15, 23, 42, 0.96);
backdrop-filter: blur(16px);
border-left: 1px solid var(--border-color);
overflow-y: auto;
display: flex;
flex-direction: column;
position: fixed;
top: 0;
right: 0;
bottom: 0;
z-index: 400;
transform: translateX(100%);
transition: transform 0.3s ease;
box-shadow: -4px 0 28px rgba(0,0,0,0.38);
}
.sidebar.visible {
transform: translateX(0);
}
.sidebar-toggle {
position: fixed;
top: 50%;
right: 0;
transform: translateY(-50%);
z-index: 450;
width: 32px;
height: 80px;
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-right: none;
border-radius: 8px 0 0 8px;
color: var(--text-secondary);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
transition: all 0.3s ease;
}
.sidebar-toggle:hover {
background: var(--bg-tertiary);
color: var(--text-primary);
width: 40px;
}
.sidebar.visible ~ .sidebar-toggle {
right: 360px;
}
.sidebar-toggle .icon {
transition: transform 0.3s ease;
}
.sidebar.visible ~ .sidebar-toggle .icon {
transform: rotate(180deg);
}
.resize-handle {
position: absolute;
left: -6px;
top: 0;
bottom: 0;
width: 12px;
cursor: ew-resize;
background: transparent;
z-index: 1000;
}
.resize-handle::before {
content: '';
position: absolute;
left: 5px;
top: 0;
bottom: 0;
width: 2px;
background: var(--border-color);
transition: background 0.2s, width 0.2s, left 0.2s;
}
.resize-handle::after {
content: 'â‹®';
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
color: var(--text-secondary);
font-size: 14px;
opacity: 0.6;
transition: opacity 0.2s;
}
.resize-handle:hover::before,
.resize-handle.active::before {
width: 4px;
left: 4px;
background: var(--accent-blue);
}
.resize-handle:hover::after,
.resize-handle.active::after {
opacity: 1;
color: var(--accent-blue);
}
.sidebar.resizing {
user-select: none;
}
body.resizing-sidebar {
cursor: ew-resize !important;
user-select: none;
}
body.resizing-sidebar * {
cursor: ew-resize !important;
}
.panel {
padding: 1rem;
border-bottom: 1px solid var(--border-color);
}
#details-panel {
order: -30;
background: rgba(15, 23, 42, 0.98);
border-bottom-color: rgba(59, 130, 246, 0.42);
}
#critical-issues-panel { order: -20; }
.timeline-panel { order: -18; }
#legend-panel { order: -16; }
.legend-panel:not(#legend-panel) { display: none; }
.panel h2 {
font-size: 0.875rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--text-secondary);
margin-bottom: 1rem;
}
.search-input {
width: 100%;
padding: 0.625rem 0.875rem;
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 0.375rem;
color: var(--text-primary);
font-size: 0.875rem;
}
.search-input:focus {
outline: none;
border-color: var(--accent-blue);
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
}
.search-input::placeholder {
color: var(--text-secondary);
}
.select {
width: 100%;
padding: 0.625rem 0.875rem;
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 0.375rem;
color: var(--text-primary);
font-size: 0.875rem;
cursor: pointer;
}
.select:focus {
outline: none;
border-color: var(--accent-blue);
}
.filter-group {
margin-bottom: 1rem;
}
.filter-group > label {
display: block;
font-size: 0.875rem;
font-weight: 500;
margin-bottom: 0.5rem;
color: var(--text-secondary);
}
.checkbox-group {
display: flex;
flex-direction: column;
gap: 0.375rem;
}
.checkbox-group label {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.875rem;
cursor: pointer;
}
.checkbox-group input[type="checkbox"] {
width: 1rem;
height: 1rem;
accent-color: var(--accent-blue);
}
.range-slider {
display: flex;
gap: 0.5rem;
align-items: center;
}
.range-slider input[type="range"] {
flex: 1;
accent-color: var(--accent-blue);
}
.filter-actions {
display: flex;
gap: 0.5rem;
margin-top: 1rem;
}
.btn {
flex: 1;
padding: 0.5rem 1rem;
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 0.375rem;
color: var(--text-primary);
font-size: 0.875rem;
cursor: pointer;
transition: background 0.2s;
}
.btn:hover {
background: var(--border-color);
}
#details-content {
font-size: 0.875rem;
}
.placeholder {
color: var(--text-secondary);
font-style: italic;
}
.inspector-title {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
margin-bottom: 0.875rem;
color: var(--text-primary);
font-size: 1rem;
font-weight: 700;
word-break: break-word;
}
.inspector-section {
margin-bottom: 0.75rem;
border: 1px solid rgba(148, 163, 184, 0.22);
border-radius: 0.5rem;
background: rgba(30, 41, 59, 0.42);
overflow: hidden;
}
.inspector-section > summary {
padding: 0.625rem 0.75rem;
color: var(--text-primary);
cursor: pointer;
font-size: 0.75rem;
font-weight: 700;
letter-spacing: 0.05em;
list-style-position: inside;
text-transform: uppercase;
}
.inspector-section > :not(summary) {
margin-left: 0.75rem;
margin-right: 0.75rem;
}
.inspector-section > :last-child {
margin-bottom: 0.75rem;
}
.overview-health-row {
display: grid;
grid-template-columns: auto 1fr;
align-items: center;
gap: 0.75rem;
margin-bottom: 0.75rem;
}
.overview-score {
color: var(--text-primary);
font-weight: 700;
}
.overview-rationale {
color: var(--text-secondary);
font-size: 0.8125rem;
line-height: 1.45;
}
.overview-count-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 0.5rem;
}
.overview-count {
display: flex;
min-width: 0;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 0.625rem 0.25rem;
border-radius: 0.5rem;
font-size: 1.25rem;
font-weight: 800;
}
.overview-count span {
margin-top: 0.125rem;
color: var(--text-secondary);
font-size: 0.625rem;
font-weight: 700;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.subdomain-legend-list,
.overview-issue-list {
display: grid;
gap: 0.5rem;
}
.subdomain-row {
display: grid;
grid-template-columns: auto 1fr auto;
align-items: center;
gap: 0.5rem;
color: var(--text-secondary);
font-size: 0.8125rem;
}
.subdomain-swatch {
width: 0.75rem;
height: 0.75rem;
border-radius: 999px;
background: var(--border-color);
}
.subdomain-swatch.core { background: var(--accent-red); }
.subdomain-swatch.supporting { background: #38bdf8; }
.subdomain-swatch.generic { background: #94a3b8; }
.overview-issue {
display: grid;
grid-template-columns: auto 1fr;
gap: 0.125rem 0.5rem;
width: 100%;
padding: 0.625rem;
border: 1px solid rgba(148, 163, 184, 0.22);
border-radius: 0.5rem;
background: rgba(15, 23, 42, 0.46);
color: var(--text-primary);
cursor: pointer;
text-align: left;
}
.overview-issue span {
color: var(--text-secondary);
font-size: 0.6875rem;
font-weight: 800;
text-transform: uppercase;
}
.overview-issue strong {
min-width: 0;
overflow: hidden;
font-size: 0.8125rem;
text-overflow: ellipsis;
white-space: nowrap;
}
.overview-issue small {
grid-column: 1 / -1;
overflow: hidden;
color: var(--text-secondary);
font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
font-size: 0.6875rem;
text-overflow: ellipsis;
white-space: nowrap;
}
.overview-issue.severity-critical { border-left: 3px solid var(--accent-red); }
.overview-issue.severity-high { border-left: 3px solid var(--accent-orange); }
.overview-issue.severity-medium { border-left: 3px solid var(--accent-yellow); }
.overview-issue.severity-low { border-left: 3px solid var(--accent-blue); }
.issue-focus-summary {
padding: 0.75rem;
border: 1px solid rgba(59, 130, 246, 0.28);
border-radius: 0.5rem;
background: rgba(59, 130, 246, 0.12);
color: var(--text-secondary);
font-size: 0.8125rem;
line-height: 1.45;
margin-bottom: 0.75rem;
}
.timeline-header {
display: flex;
align-items: center;
gap: 0.75rem;
margin-bottom: 0.75rem;
}
.timeline-header h2 {
margin-bottom: 0;
}
.timeline-play-btn {
flex: 0 0 auto;
min-width: 4.5rem;
padding: 0.375rem 0.625rem;
font-size: 0.75rem;
}
.timeline-play-btn.active {
border-color: var(--accent-blue);
color: var(--text-primary);
background: rgba(59, 130, 246, 0.25);
}
.timeline-play-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.timeline-chart {
min-height: 150px;
margin-bottom: 0.75rem;
border: 1px solid var(--border-color);
border-radius: 0.5rem;
background: rgba(15, 23, 42, 0.65);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.timeline-svg {
display: block;
width: 100%;
height: 150px;
}
.timeline-grid-line {
stroke: rgba(148, 163, 184, 0.18);
stroke-width: 1;
}
.timeline-line {
fill: none;
stroke: var(--accent-blue);
stroke-width: 3;
stroke-linecap: round;
stroke-linejoin: round;
}
.timeline-playhead {
stroke: rgba(248, 250, 252, 0.75);
stroke-width: 1.5;
stroke-dasharray: 4 4;
}
.timeline-point {
fill: var(--bg-secondary);
stroke: var(--accent-blue);
stroke-width: 2;
cursor: pointer;
transition: r 0.15s ease, fill 0.15s ease, stroke 0.15s ease;
}
.timeline-point:hover,
.timeline-point.active {
fill: var(--text-primary);
stroke: var(--accent-yellow);
}
.timeline-point.grade-S,
.timeline-point.grade-A,
.timeline-point.grade-B {
stroke: var(--accent-green);
}
.timeline-point.grade-C,
.timeline-point.grade-D {
stroke: var(--accent-yellow);
}
.timeline-point.grade-F {
stroke: var(--accent-red);
}
.timeline-scrubber {
width: 100%;
accent-color: var(--accent-blue);
margin-bottom: 0.75rem;
}
.timeline-graph-status {
margin: -0.25rem 0 0.75rem;
color: var(--text-secondary);
font-size: 0.75rem;
}
.timeline-stats {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.5rem;
}
.timeline-stat {
min-width: 0;
padding: 0.5rem;
background: var(--bg-tertiary);
border: 1px solid rgba(148, 163, 184, 0.25);
border-radius: 0.375rem;
}
.timeline-stat span {
display: block;
margin-bottom: 0.25rem;
color: var(--text-secondary);
font-size: 0.6875rem;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.timeline-stat strong {
display: block;
overflow: hidden;
color: var(--text-primary);
font-size: 0.875rem;
font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
text-overflow: ellipsis;
white-space: nowrap;
}
.timeline-stat .health-grade {
display: inline-block;
width: fit-content;
padding: 0.125rem 0.5rem;
font-family: inherit;
font-size: 0.875rem;
}
.detail-section {
margin-bottom: 1rem;
}
.detail-section h4 {
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--text-secondary);
margin-bottom: 0.5rem;
}
.detail-row {
display: flex;
justify-content: space-between;
padding: 0.25rem 0;
border-bottom: 1px solid var(--bg-tertiary);
}
.detail-label {
color: var(--text-secondary);
}
.detail-value {
font-weight: 500;
}
.detail-value.good { color: var(--accent-green); }
.detail-value.warning { color: var(--accent-yellow); }
.detail-value.critical { color: var(--accent-red); }
.detail-value.file-path {
font-family: monospace;
font-size: 0.75rem;
background: var(--bg-tertiary);
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
word-break: break-all;
cursor: pointer;
}
.detail-value.file-path:hover {
background: var(--border-color);
}
.source-code-container {
margin-top: 0.75rem;
border: 1px solid var(--border-color);
border-radius: 0.5rem;
overflow: hidden;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3);
}
.source-code-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.625rem 0.875rem;
background: linear-gradient(to bottom, #2d3748, #1a202c);
border-bottom: 1px solid var(--border-color);
font-size: 0.75rem;
}
.source-code-header .file-info {
display: flex;
align-items: center;
gap: 0.5rem;
}
.source-code-header .file-icon {
color: #f59e0b;
}
.source-code-header .file-name {
font-family: monospace;
font-weight: 600;
color: var(--text-primary);
}
.source-code-header .line-info {
color: var(--text-secondary);
font-size: 0.6875rem;
}
.source-code-actions {
display: flex;
gap: 0.375rem;
}
.source-code-actions button {
padding: 0.25rem 0.5rem;
background: rgba(255, 255, 255, 0.1);
border: none;
border-radius: 0.25rem;
color: var(--text-secondary);
font-size: 0.6875rem;
cursor: pointer;
transition: all 0.2s;
}
.source-code-actions button:hover {
background: rgba(255, 255, 255, 0.2);
color: var(--text-primary);
}
.source-code-content {
max-height: 350px;
overflow: auto;
background: #0d1117;
scrollbar-width: thin;
scrollbar-color: var(--border-color) transparent;
}
.source-code-content::-webkit-scrollbar {
width: 8px;
height: 8px;
}
.source-code-content::-webkit-scrollbar-track {
background: transparent;
}
.source-code-content::-webkit-scrollbar-thumb {
background: var(--border-color);
border-radius: 4px;
}
.source-code-content.expanded {
max-height: none;
}
.source-line {
display: flex;
font-family: 'JetBrains Mono', 'Fira Code', 'Menlo', 'Monaco', 'Consolas', monospace;
font-size: 0.8125rem;
line-height: 1.6;
border-left: 3px solid transparent;
width: max-content;
min-width: 100%;
}
.source-line.highlight {
background: rgba(59, 130, 246, 0.2);
border-left-color: var(--accent-blue);
}
.source-line:hover {
background: rgba(255, 255, 255, 0.03);
}
.line-number {
flex-shrink: 0;
min-width: 3.5rem;
padding: 0 0.75rem;
text-align: right;
color: #6b7280;
background: rgba(0, 0, 0, 0.2);
border-right: 1px solid rgba(255, 255, 255, 0.1);
user-select: none;
font-size: 0.75rem;
}
.source-line.highlight .line-number {
color: var(--accent-blue);
font-weight: 600;
}
.line-content {
flex: 1;
padding: 0 1rem;
white-space: pre;
color: #e6edf3;
tab-size: 4;
}
.source-code-footer {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.5rem 0.875rem;
background: linear-gradient(to bottom, #1a202c, #2d3748);
border-top: 1px solid var(--border-color);
font-size: 0.6875rem;
color: var(--text-secondary);
}
.source-code-footer .path {
font-family: monospace;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 70%;
}
.btn-view-code {
display: flex;
align-items: center;
justify-content: center;
gap: 0.375rem;
width: 100%;
margin-top: 0.5rem;
padding: 0.5rem 0.75rem;
background: linear-gradient(to bottom, var(--bg-tertiary), #1e293b);
border: 1px solid var(--border-color);
border-radius: 0.375rem;
color: var(--text-secondary);
font-size: 0.8125rem;
cursor: pointer;
transition: all 0.2s;
}
.btn-view-code:hover {
background: linear-gradient(to bottom, var(--border-color), var(--bg-tertiary));
color: var(--text-primary);
border-color: var(--accent-blue);
}
.btn-view-code.loading {
opacity: 0.5;
cursor: wait;
}
.btn-view-code .icon {
font-size: 1rem;
}
.source-loading {
padding: 1rem;
text-align: center;
color: var(--text-secondary);
font-style: italic;
}
.source-error {
padding: 1rem;
text-align: center;
color: var(--accent-red);
background: rgba(239, 68, 68, 0.1);
border-radius: 0.375rem;
margin-top: 0.5rem;
}
.btn-expand-source,
.btn-close-source {
padding: 0.25rem 0.5rem;
background: rgba(255, 255, 255, 0.1);
border: none;
border-radius: 0.25rem;
color: var(--text-secondary);
font-size: 0.875rem;
cursor: pointer;
transition: all 0.2s;
}
.btn-expand-source:hover,
.btn-close-source:hover {
background: rgba(255, 255, 255, 0.2);
color: var(--text-primary);
}
.file-path-display {
display: flex;
flex-direction: column;
gap: 0.25rem;
margin: 0.75rem 0;
padding: 0.75rem;
background: var(--bg-tertiary);
border-radius: 0.375rem;
border-left: 3px solid var(--accent-blue);
}
.file-path-label {
font-size: 0.6875rem;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
}
.file-path-value {
font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
font-size: 0.75rem;
color: var(--text-primary);
word-break: break-all;
line-height: 1.4;
}
.module-items-section {
margin-top: 1rem;
border-top: 1px solid var(--border-color);
padding-top: 0.75rem;
}
.module-items-header {
display: flex;
align-items: center;
gap: 0.5rem;
margin-bottom: 0.75rem;
font-size: 0.875rem;
font-weight: 600;
}
.module-items-header .hint {
font-size: 0.6875rem;
color: var(--text-secondary);
font-weight: normal;
}
.item-list-section {
margin-bottom: 0.75rem;
}
.item-list-header {
display: flex;
align-items: center;
gap: 0.375rem;
padding: 0.375rem 0;
font-size: 0.75rem;
color: var(--text-secondary);
border-bottom: 1px solid var(--border-color);
}
.item-list-icon {
font-family: 'SF Mono', 'Monaco', monospace;
font-weight: 700;
width: 1rem;
text-align: center;
color: var(--accent-blue);
}
.item-list-title {
font-weight: 600;
}
.item-list-count {
margin-left: auto;
background: var(--bg-tertiary);
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
font-size: 0.625rem;
}
.item-list-items {
display: flex;
flex-direction: column;
gap: 0.125rem;
padding: 0.25rem 0;
}
.item-list-item {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0.75rem;
border-radius: 0.375rem;
cursor: pointer;
transition: all 0.15s;
font-size: 0.9375rem;
font-family: 'SF Mono', 'Monaco', monospace;
border: 1px solid transparent;
}
.item-list-item:hover {
background: var(--bg-tertiary);
transform: translateX(4px);
}
.item-list-item.public .item-name {
color: var(--text-primary);
}
.item-list-item.private .item-name {
color: var(--text-secondary);
}
.pub-badge {
font-size: 0.5625rem;
padding: 0.0625rem 0.25rem;
border-radius: 0.125rem;
background: rgba(34, 197, 94, 0.2);
color: var(--accent-green);
text-transform: uppercase;
letter-spacing: 0.25px;
}
.item-list-more {
font-size: 0.6875rem;
color: var(--text-secondary);
font-style: italic;
padding: 0.25rem 0.5rem;
}
.issue-badge {
display: inline-block;
padding: 0.125rem 0.5rem;
border-radius: 0.25rem;
font-size: 0.75rem;
font-weight: 500;
margin-top: 0.5rem;
}
.issue-badge.high { background: var(--accent-red); color: #fff; }
.issue-badge.medium { background: var(--accent-yellow); color: #000; }
.issue-badge.low { background: var(--accent-blue); color: #fff; }
.detail-header {
font-size: 1rem;
font-weight: 700;
color: var(--text-primary);
padding-bottom: 0.5rem;
margin-bottom: 0.75rem;
border-bottom: 1px solid var(--border-color);
word-break: break-word;
}
.detail-stats {
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
margin-bottom: 0.75rem;
}
.stat-badge {
display: inline-flex;
align-items: center;
gap: 0.25rem;
padding: 0.25rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.75rem;
font-weight: 600;
font-family: 'SF Mono', 'Monaco', monospace;
}
.stat-badge.fn {
background: rgba(59, 130, 246, 0.15);
color: var(--accent-blue);
}
.stat-badge.type {
background: rgba(139, 92, 246, 0.15);
color: #a78bfa;
}
.stat-badge.impl {
background: rgba(34, 197, 94, 0.15);
color: var(--accent-green);
}
.health-indicator {
display: inline-block;
padding: 0.125rem 0.5rem;
border-radius: 0.25rem;
font-size: 0.75rem;
font-weight: 600;
text-transform: capitalize;
}
.health-indicator.good {
background: rgba(34, 197, 94, 0.15);
color: var(--accent-green);
}
.health-indicator.warning {
background: rgba(234, 179, 8, 0.15);
color: var(--accent-yellow);
}
.health-indicator.critical {
background: rgba(239, 68, 68, 0.15);
color: var(--accent-red);
}
.detail-divider {
border: none;
border-top: 1px solid var(--border-color);
margin: 0.75rem 0;
}
.analysis-result {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.75rem;
border-radius: 0.5rem;
margin-bottom: 0.5rem;
}
.analysis-result.balanced {
background: rgba(34, 197, 94, 0.1);
border: 1px solid var(--accent-green);
}
.analysis-result.stable {
background: rgba(59, 130, 246, 0.1);
border: 1px solid var(--accent-blue);
}
.analysis-result.review {
background: rgba(234, 179, 8, 0.1);
border: 1px solid var(--accent-yellow);
}
.analysis-result.critical {
background: rgba(239, 68, 68, 0.1);
border: 1px solid var(--accent-red);
}
.analysis-icon {
font-size: 1.25rem;
}
.analysis-text {
font-size: 0.875rem;
font-weight: 500;
color: var(--text-primary);
}
.analysis-action {
font-size: 0.75rem;
color: var(--text-secondary);
margin-bottom: 0.5rem;
line-height: 1.5;
}
.classification-badge {
display: inline-block;
padding: 0.375rem 0.625rem;
background: var(--bg-tertiary);
border-radius: 0.375rem;
font-size: 0.75rem;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 0.5rem;
}
.warning-banner {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.625rem 0.875rem;
background: rgba(234, 179, 8, 0.1);
border: 1px solid var(--accent-yellow);
border-radius: 0.375rem;
margin-bottom: 0.75rem;
font-size: 0.8125rem;
color: var(--accent-yellow);
}
.warning-banner.critical {
background: rgba(239, 68, 68, 0.1);
border-color: var(--accent-red);
color: var(--accent-red);
}
.volatility-badge {
display: inline-block;
padding: 0.125rem 0.5rem;
border-radius: 0.25rem;
font-size: 0.75rem;
font-weight: 600;
}
.volatility-badge.low {
background: rgba(34, 197, 94, 0.15);
color: var(--accent-green);
}
.volatility-badge.medium {
background: rgba(234, 179, 8, 0.15);
color: var(--accent-yellow);
}
.volatility-badge.high {
background: rgba(239, 68, 68, 0.15);
color: var(--accent-red);
}
.connascence-info {
display: flex;
gap: 0.5rem;
align-items: center;
margin: 0.5rem 0;
padding: 0.5rem;
background: var(--bg-tertiary);
border-radius: 0.375rem;
}
.connascence-type {
font-weight: 600;
font-size: 0.8125rem;
color: var(--text-primary);
}
.connascence-strength {
font-size: 0.75rem;
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
background: rgba(139, 92, 246, 0.15);
color: #a78bfa;
}
.issue-detail {
padding: 0.75rem;
border-radius: 0.375rem;
margin-top: 0.75rem;
}
.issue-detail.critical {
background: rgba(239, 68, 68, 0.1);
border-left: 3px solid var(--accent-red);
}
.issue-detail.high {
background: rgba(249, 115, 22, 0.1);
border-left: 3px solid #f97316;
}
.issue-detail.medium {
background: rgba(234, 179, 8, 0.1);
border-left: 3px solid var(--accent-yellow);
}
.issue-detail.low {
background: rgba(59, 130, 246, 0.1);
border-left: 3px solid var(--accent-blue);
}
.issue-type {
font-weight: 600;
font-size: 0.875rem;
color: var(--text-primary);
margin-bottom: 0.25rem;
}
.issue-description {
font-size: 0.75rem;
color: var(--text-secondary);
line-height: 1.4;
}
.balance-interpretation {
font-size: 0.8125rem;
color: var(--text-primary);
padding: 0.625rem;
background: var(--bg-tertiary);
border-radius: 0.375rem;
margin-top: 0.5rem;
line-height: 1.5;
}
.impl-breakdown {
display: flex;
gap: 0.75rem;
margin: 0.5rem 0;
padding: 0.5rem;
background: var(--bg-tertiary);
border-radius: 0.375rem;
}
.impl-item {
display: flex;
align-items: center;
gap: 0.25rem;
font-size: 0.75rem;
}
.impl-item .label {
color: var(--text-secondary);
}
.impl-item .count {
font-weight: 600;
color: var(--text-primary);
}
.details-modal {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 2000;
display: flex;
align-items: center;
justify-content: center;
}
.details-modal.hidden {
display: none;
}
.details-modal-backdrop {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(4px);
}
.details-modal-content {
position: relative;
background: var(--bg-secondary);
border-radius: 0.75rem;
width: 90%;
max-width: 900px;
max-height: 85vh;
display: flex;
flex-direction: column;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
border: 1px solid var(--border-color);
overflow: hidden;
}
.details-modal-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.25rem;
background: linear-gradient(to bottom, var(--bg-tertiary), var(--bg-secondary));
border-bottom: 1px solid var(--border-color);
}
.details-modal-header h2 {
font-size: 1.125rem;
font-weight: 600;
color: var(--text-primary);
margin: 0;
}
.btn-close-modal {
background: none;
border: none;
color: var(--text-secondary);
font-size: 1.5rem;
cursor: pointer;
padding: 0.25rem 0.5rem;
line-height: 1;
border-radius: 0.375rem;
transition: all 0.2s;
}
.btn-close-modal:hover {
background: rgba(255, 255, 255, 0.1);
color: var(--text-primary);
}
.details-tabs {
display: flex;
border-bottom: 1px solid var(--border-color);
background: var(--bg-secondary);
padding: 0 0.5rem;
}
.details-tabs .tab {
padding: 0.75rem 1.25rem;
background: none;
border: none;
border-bottom: 2px solid transparent;
color: var(--text-secondary);
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
}
.details-tabs .tab:hover {
color: var(--text-primary);
background: rgba(255, 255, 255, 0.05);
}
.details-tabs .tab.active {
color: var(--accent-blue);
border-bottom-color: var(--accent-blue);
}
.details-modal-body {
flex: 1;
overflow-y: auto;
padding: 1.25rem;
scrollbar-width: thin;
scrollbar-color: var(--border-color) transparent;
}
.details-modal-body::-webkit-scrollbar {
width: 8px;
}
.details-modal-body::-webkit-scrollbar-track {
background: transparent;
}
.details-modal-body::-webkit-scrollbar-thumb {
background: var(--border-color);
border-radius: 4px;
}
.tab-content {
display: none;
}
.tab-content.active {
display: block;
}
.modal-section {
margin-bottom: 1.5rem;
}
.modal-section-title {
font-size: 0.875rem;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 0.75rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid var(--border-color);
}
.modal-stat-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 0.75rem;
}
.modal-stat-card {
background: var(--bg-tertiary);
padding: 0.875rem;
border-radius: 0.5rem;
text-align: center;
}
.modal-stat-value {
font-size: 1.5rem;
font-weight: 700;
color: var(--accent-blue);
}
.modal-stat-value.good { color: var(--accent-green); }
.modal-stat-value.warning { color: var(--accent-yellow); }
.modal-stat-value.critical { color: var(--accent-red); }
.modal-stat-label {
font-size: 0.75rem;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-top: 0.25rem;
}
.coupling-list {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.coupling-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.75rem;
background: var(--bg-tertiary);
border-radius: 0.5rem;
cursor: pointer;
transition: all 0.2s;
border-left: 3px solid transparent;
}
.coupling-item:hover {
background: var(--border-color);
transform: translateX(4px);
}
.coupling-item.outgoing {
border-left-color: var(--accent-yellow);
}
.coupling-item.incoming {
border-left-color: var(--accent-green);
}
.coupling-target {
font-family: 'SF Mono', 'Monaco', monospace;
font-size: 0.875rem;
color: var(--text-primary);
}
.coupling-meta {
display: flex;
gap: 0.5rem;
align-items: center;
}
.modal-item-list {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.modal-item {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0.75rem;
border-radius: 0.375rem;
cursor: pointer;
transition: background 0.15s;
}
.modal-item:hover {
background: var(--bg-tertiary);
}
.modal-item-icon {
font-family: 'SF Mono', 'Monaco', monospace;
font-size: 0.875rem;
font-weight: 600;
width: 1.5rem;
text-align: center;
color: var(--accent-blue);
}
.modal-item-icon.fn { color: var(--accent-blue); }
.modal-item-icon.type { color: #a78bfa; }
.modal-item-icon.trait { color: var(--accent-green); }
.modal-item-name {
font-family: 'SF Mono', 'Monaco', monospace;
font-size: 0.875rem;
color: var(--text-primary);
flex: 1;
}
.modal-item-vis {
font-size: 0.6875rem;
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
background: rgba(34, 197, 94, 0.15);
color: var(--accent-green);
}
.modal-source-code {
background: #0d1117;
border-radius: 0.5rem;
overflow: hidden;
}
.modal-source-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.75rem 1rem;
background: rgba(0, 0, 0, 0.3);
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.modal-source-path {
font-family: 'SF Mono', 'Monaco', monospace;
font-size: 0.8125rem;
color: var(--text-secondary);
}
.modal-source-content {
max-height: 400px;
overflow: auto;
padding: 0;
}
.btn-expand-details {
display: flex;
align-items: center;
justify-content: center;
gap: 0.375rem;
width: 100%;
margin-top: 0.75rem;
padding: 0.625rem;
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 0.375rem;
color: var(--text-primary);
font-size: 0.8125rem;
cursor: pointer;
transition: all 0.2s;
}
.btn-expand-details:hover {
background: var(--border-color);
border-color: var(--accent-blue);
}
.analysis-buttons {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.btn-analysis {
text-align: left;
padding: 0.625rem 0.875rem;
}
.btn-analysis:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.hint {
font-size: 0.75rem;
color: var(--text-secondary);
margin-top: 0.5rem;
font-style: italic;
}
.issue-list {
max-height: 200px;
overflow-y: auto;
}
.issue-filter {
margin-bottom: 0.75rem;
}
.issue-item {
display: flex;
align-items: flex-start;
gap: 0.5rem;
padding: 0.5rem;
margin-bottom: 0.25rem;
background: var(--bg-tertiary);
border-radius: 0.25rem;
cursor: pointer;
font-size: 0.8125rem;
transition: background 0.2s;
}
.issue-item:hover {
background: var(--border-color);
}
.issue-item .severity {
flex-shrink: 0;
width: 0.5rem;
height: 0.5rem;
border-radius: 50%;
margin-top: 0.375rem;
}
.issue-item .severity.critical { background: var(--accent-red); }
.issue-item .severity.high { background: #f97316; }
.issue-item .severity.medium { background: var(--accent-yellow); }
.issue-item .severity.low { background: var(--accent-blue); }
.issue-item .content {
flex: 1;
min-width: 0;
}
.issue-item .type {
font-weight: 500;
color: var(--text-primary);
}
.issue-item .target {
font-size: 0.75rem;
color: var(--text-secondary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.issue-header {
display: flex;
justify-content: space-between;
gap: 0.5rem;
}
.issue-severity {
font-size: 0.6875rem;
color: var(--text-secondary);
text-transform: uppercase;
}
.issue-desc {
margin-top: 0.25rem;
color: var(--text-secondary);
line-height: 1.35;
}
.subdomain-badge,
.volatility-badge {
display: inline-flex;
align-items: center;
padding: 0.125rem 0.5rem;
border-radius: 0.25rem;
font-size: 0.75rem;
font-weight: 600;
}
.subdomain-badge.core {
background: rgba(239, 68, 68, 0.18);
color: #fca5a5;
}
.subdomain-badge.supporting {
background: rgba(56, 189, 248, 0.18);
color: #7dd3fc;
}
.subdomain-badge.generic {
background: rgba(148, 163, 184, 0.18);
color: #cbd5e1;
}
.trust-toggle {
width: 100%;
margin-bottom: 0.75rem;
}
.trust-note,
.blind-spot-item {
padding: 0.625rem;
margin-bottom: 0.5rem;
background: var(--bg-tertiary);
border-left: 3px solid var(--accent-yellow);
border-radius: 0.25rem;
font-size: 0.8125rem;
}
.blind-spot-area {
margin-bottom: 0.25rem;
color: var(--text-primary);
font-weight: 600;
}
.blind-spot-description {
color: var(--text-secondary);
line-height: 1.4;
}
.badge {
display: inline-block;
padding: 0.125rem 0.5rem;
background: var(--accent-red);
color: #fff;
border-radius: 1rem;
font-size: 0.75rem;
font-weight: 500;
margin-left: 0.5rem;
}
.cluster-info {
margin-top: 0.5rem;
font-size: 0.8125rem;
}
.cluster-item {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.25rem 0;
}
.cluster-color {
width: 1rem;
height: 1rem;
border-radius: 0.25rem;
}
.legend {
font-size: 0.8125rem;
}
.legend-section {
margin-bottom: 1rem;
}
.legend-section h4 {
font-size: 0.75rem;
font-weight: 600;
color: var(--text-secondary);
margin-bottom: 0.5rem;
}
.legend-item {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.25rem 0;
}
.color-box {
width: 1rem;
height: 1rem;
border-radius: 0.25rem;
}
.line-style {
width: 2rem;
height: 2px;
}
.line-style.solid { background: var(--text-secondary); }
.line-style.dashed {
background: repeating-linear-gradient(
90deg,
var(--text-secondary),
var(--text-secondary) 4px,
transparent 4px,
transparent 8px
);
}
.line-style.dotted {
background: repeating-linear-gradient(
90deg,
var(--text-secondary),
var(--text-secondary) 2px,
transparent 2px,
transparent 6px
);
}
.shortcuts-list {
display: flex;
flex-direction: column;
gap: 0.375rem;
}
.shortcut {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.8125rem;
}
kbd {
display: inline-block;
padding: 0.125rem 0.375rem;
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 0.25rem;
font-family: monospace;
font-size: 0.75rem;
min-width: 1.5rem;
text-align: center;
}
.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.7);
z-index: 1000;
align-items: center;
justify-content: center;
}
.modal.visible {
display: flex;
}
.modal-content {
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 0.5rem;
padding: 1.5rem;
max-width: 400px;
width: 90%;
}
.modal-content h2 {
margin-bottom: 1rem;
font-size: 1.125rem;
}
.shortcuts-table {
width: 100%;
border-collapse: collapse;
margin-bottom: 1rem;
}
.shortcuts-table td {
padding: 0.5rem;
border-bottom: 1px solid var(--bg-tertiary);
}
.shortcuts-table td:first-child {
width: 60px;
}
.footer {
padding: 0.75rem 1.5rem;
background: var(--bg-secondary);
border-top: 1px solid var(--border-color);
font-size: 0.875rem;
color: var(--text-secondary);
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 500;
transform: translateY(100%);
transition: transform 0.3s ease;
}
.footer:hover,
.footer.visible {
transform: translateY(0);
}
.footer::before {
content: 'â–²';
position: absolute;
left: 50%;
top: -16px;
transform: translateX(-50%);
color: var(--text-secondary);
font-size: 10px;
opacity: 0.6;
padding: 2px 8px;
background: var(--bg-secondary);
border-radius: 4px 4px 0 0;
border: 1px solid var(--border-color);
border-bottom: none;
transition: opacity 0.2s;
}
.footer:hover::before {
opacity: 0;
}
.footer-trigger {
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: 20px;
z-index: 499;
}
#summary-stats {
display: flex;
gap: 2rem;
}
.btn, .select, .search-input, .issue-item, .cluster-item {
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.btn:hover:not(:disabled) {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);
}
.btn:active:not(:disabled) {
transform: translateY(0);
}
.panel {
transition: background 0.3s ease;
}
.panel:hover {
background: rgba(255, 255, 255, 0.02);
}
.risk-score {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0.75rem;
border-radius: 0.5rem;
font-weight: 600;
font-size: 0.875rem;
animation: fadeIn 0.3s ease;
}
.risk-score.low {
background: rgba(34, 197, 94, 0.2);
border: 1px solid var(--accent-green);
color: var(--accent-green);
}
.risk-score.medium {
background: rgba(234, 179, 8, 0.2);
border: 1px solid var(--accent-yellow);
color: var(--accent-yellow);
}
.risk-score.high {
background: rgba(239, 68, 68, 0.2);
border: 1px solid var(--accent-red);
color: var(--accent-red);
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(-5px); }
to { opacity: 1; transform: translateY(0); }
}
.hotspot-item {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.625rem 0.75rem;
background: var(--bg-tertiary);
border-radius: 0.375rem;
margin-bottom: 0.375rem;
cursor: pointer;
transition: all 0.2s ease;
border-left: 3px solid transparent;
}
.hotspot-item:hover {
background: var(--border-color);
transform: translateX(4px);
}
.hotspot-item.critical {
border-left-color: var(--accent-red);
}
.hotspot-item.warning {
border-left-color: var(--accent-yellow);
}
.hotspot-rank {
width: 1.5rem;
height: 1.5rem;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #3b82f6, #8b5cf6);
border-radius: 50%;
font-size: 0.75rem;
font-weight: 700;
color: #fff;
}
.hotspot-info {
flex: 1;
min-width: 0;
}
.hotspot-name {
font-weight: 500;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.hotspot-score {
font-size: 0.75rem;
color: var(--text-secondary);
}
.module-rank-list {
max-height: 200px;
overflow-y: auto;
}
.module-rank-item {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem;
border-radius: 0.25rem;
cursor: pointer;
transition: background 0.2s;
}
.module-rank-item:hover {
background: var(--bg-tertiary);
}
.module-rank-bar {
flex: 1;
height: 6px;
background: var(--bg-tertiary);
border-radius: 3px;
overflow: hidden;
}
.module-rank-fill {
height: 100%;
background: linear-gradient(90deg, var(--accent-blue), #8b5cf6);
transition: width 0.5s ease;
}
.analysis-mode {
padding: 0.5rem 0.75rem;
background: linear-gradient(135deg, rgba(59, 130, 246, 0.2), rgba(139, 92, 246, 0.2));
border: 1px solid rgba(59, 130, 246, 0.3);
border-radius: 0.5rem;
margin-bottom: 0.75rem;
font-size: 0.8125rem;
display: flex;
align-items: center;
gap: 0.5rem;
animation: fadeIn 0.3s ease;
}
.analysis-mode .icon {
font-size: 1rem;
}
.blast-stats {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 0.5rem;
margin-top: 0.75rem;
}
.blast-stat {
display: flex;
flex-direction: column;
padding: 0.625rem;
background: var(--bg-tertiary);
border-radius: 0.375rem;
text-align: center;
}
.blast-stat-value {
font-size: 1.25rem;
font-weight: 700;
color: var(--accent-blue);
}
.blast-stat-label {
font-size: 0.6875rem;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.quick-actions {
display: flex;
gap: 0.375rem;
margin-bottom: 0.75rem;
}
.quick-action {
flex: 1;
padding: 0.375rem;
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 0.25rem;
color: var(--text-secondary);
font-size: 0.6875rem;
cursor: pointer;
text-align: center;
transition: all 0.2s;
}
.quick-action:hover {
background: var(--border-color);
color: var(--text-primary);
}
.quick-action.active {
background: var(--accent-blue);
border-color: var(--accent-blue);
color: #fff;
}
.view-tabs {
display: flex;
gap: 0.25rem;
padding: 0.25rem;
background: var(--bg-tertiary);
border-radius: 0.5rem;
margin-bottom: 1rem;
}
.view-tab {
flex: 1;
padding: 0.5rem;
background: transparent;
border: none;
border-radius: 0.375rem;
color: var(--text-secondary);
font-size: 0.75rem;
cursor: pointer;
transition: all 0.2s;
}
.view-tab:hover {
color: var(--text-primary);
}
.view-tab.active {
background: var(--bg-secondary);
color: var(--text-primary);
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
}
@keyframes pulse {
0%, 100% { box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.4); }
50% { box-shadow: 0 0 0 8px rgba(59, 130, 246, 0); }
}
.selected-pulse {
animation: pulse 2s infinite;
}
@keyframes countUp {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
.count-animated {
animation: countUp 0.5s ease-out;
}
.job-buttons {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0.5rem;
}
.btn-job {
display: flex;
align-items: center;
justify-content: center;
gap: 0.375rem;
padding: 0.625rem 0.5rem;
font-size: 0.75rem;
background: linear-gradient(to bottom, var(--bg-tertiary), #1e293b);
border: 1px solid var(--border-color);
transition: all 0.2s;
}
.btn-job:hover:not(:disabled) {
background: linear-gradient(to bottom, var(--border-color), var(--bg-tertiary));
border-color: var(--accent-blue);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);
}
.btn-job:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.btn-job.active {
background: linear-gradient(135deg, var(--accent-blue), #6366f1);
border-color: var(--accent-blue);
color: #fff;
}
.job-result {
margin-top: 0.75rem;
font-size: 0.8125rem;
}
.job-result:empty {
display: none;
}
.job-result-message {
padding: 0.75rem;
background: var(--bg-tertiary);
border-radius: 0.375rem;
border-left: 3px solid var(--accent-blue);
}
.job-result-message ul {
margin: 0.5rem 0 0 0;
padding-left: 1.25rem;
}
.job-result-message li {
margin: 0.25rem 0;
}
.what-breaks {
padding: 0.75rem;
background: rgba(239, 68, 68, 0.1);
border-radius: 0.375rem;
border-left: 3px solid var(--accent-red);
}
.what-breaks-header {
font-weight: 600;
margin-bottom: 0.5rem;
color: var(--accent-red);
}
.what-breaks ul {
margin: 0;
padding-left: 1.25rem;
}
.what-breaks li {
margin: 0.25rem 0;
}
.entry-points-list {
display: flex;
flex-direction: column;
gap: 0.375rem;
}
.entry-point-item {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0.625rem;
background: var(--bg-tertiary);
border-radius: 0.375rem;
cursor: pointer;
transition: all 0.2s;
border-left: 3px solid var(--accent-blue);
}
.entry-point-item:hover {
background: var(--border-color);
transform: translateX(4px);
}
.entry-point-item .rank {
width: 1.25rem;
height: 1.25rem;
display: flex;
align-items: center;
justify-content: center;
background: var(--accent-blue);
border-radius: 50%;
font-size: 0.6875rem;
font-weight: 700;
color: #fff;
}
.entry-point-item .name {
flex: 1;
font-weight: 500;
}
.entry-point-item .reason {
font-size: 0.6875rem;
color: var(--text-secondary);
}
.path-finder-inputs {
display: flex;
align-items: center;
gap: 0.5rem;
}
.path-finder-inputs .select {
flex: 1;
font-size: 0.8125rem;
}
.path-result {
margin-top: 0.75rem;
}
.path-result:empty {
display: none;
}
.path-chain {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.path-node {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem;
background: var(--bg-tertiary);
border-radius: 0.375rem;
cursor: pointer;
transition: background 0.2s;
}
.path-node:hover {
background: var(--border-color);
}
.path-node.start {
border-left: 3px solid var(--accent-green);
}
.path-node.end {
border-left: 3px solid var(--accent-red);
}
.path-node.intermediate {
border-left: 3px solid var(--accent-yellow);
}
.path-arrow {
text-align: center;
color: var(--text-secondary);
font-size: 0.75rem;
padding: 0.125rem 0;
}
.path-not-found {
padding: 0.75rem;
background: rgba(239, 68, 68, 0.1);
border: 1px solid var(--accent-red);
border-radius: 0.375rem;
color: var(--accent-red);
font-size: 0.8125rem;
text-align: center;
}
.path-found {
padding: 0.5rem;
background: rgba(34, 197, 94, 0.1);
border: 1px solid var(--accent-green);
border-radius: 0.375rem;
color: var(--accent-green);
font-size: 0.75rem;
text-align: center;
margin-bottom: 0.5rem;
}
.simple-view-active {
position: fixed;
top: 60px;
left: 50%;
transform: translateX(-50%);
padding: 0.5rem 1rem;
background: linear-gradient(135deg, var(--accent-blue), #6366f1);
border-radius: 2rem;
color: #fff;
font-size: 0.8125rem;
font-weight: 500;
z-index: 100;
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
animation: fadeIn 0.3s ease;
}
.breaks-list {
display: flex;
flex-direction: column;
gap: 0.375rem;
max-height: 200px;
overflow-y: auto;
}
.breaks-item {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem;
background: var(--bg-tertiary);
border-radius: 0.375rem;
cursor: pointer;
transition: all 0.2s;
}
.breaks-item:hover {
background: var(--border-color);
}
.breaks-item .risk {
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
font-size: 0.625rem;
font-weight: 600;
text-transform: uppercase;
}
.breaks-item .risk.high {
background: var(--accent-red);
color: #fff;
}
.breaks-item .risk.medium {
background: var(--accent-yellow);
color: #000;
}
.breaks-item .risk.low {
background: var(--accent-green);
color: #000;
}
.view-buttons {
display: flex;
gap: 0.5rem;
}
.btn-view {
flex: 1;
padding: 0.5rem;
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
color: var(--text-secondary);
cursor: pointer;
transition: all 0.2s;
}
.btn-view:hover {
background: var(--bg-secondary);
color: var(--text-primary);
}
.btn-view.active {
background: var(--accent-blue);
color: white;
border-color: var(--accent-blue);
}
.tree-container {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--bg-primary);
overflow: auto;
padding: 2rem 3rem;
font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
}
.tree-header {
max-width: 900px;
margin: 0 auto 2rem;
padding-bottom: 1rem;
border-bottom: 1px solid var(--border-color);
}
.tree-header h2 {
font-size: 1.5rem;
color: var(--text-primary);
margin-bottom: 0.5rem;
}
.tree-hint {
font-size: 0.875rem;
color: var(--text-secondary);
}
.tree-content {
max-width: 900px;
margin: 0 auto;
}
.tree-folder {
margin-bottom: 0.25rem;
}
.tree-folder-header {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0.75rem;
color: var(--accent-blue);
font-weight: 600;
cursor: pointer;
border-radius: 0.375rem;
transition: all 0.15s;
}
.tree-folder-header:hover {
background: var(--bg-secondary);
}
.tree-folder-header::before {
content: 'â–¼';
font-size: 0.625rem;
color: var(--text-secondary);
transition: transform 0.2s;
}
.tree-folder.collapsed .tree-folder-header::before {
transform: rotate(-90deg);
}
.tree-folder-content {
margin-left: 1.25rem;
padding-left: 1rem;
border-left: 1px solid var(--border-color);
}
.tree-folder.collapsed .tree-folder-content {
display: none;
}
.tree-icon {
font-size: 1rem;
}
.tree-name {
flex: 1;
}
.tree-count {
font-size: 0.75rem;
color: var(--text-secondary);
background: var(--bg-tertiary);
padding: 0.125rem 0.5rem;
border-radius: 1rem;
}
.tree-file {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0.75rem;
color: var(--text-primary);
cursor: pointer;
border-radius: 0.375rem;
transition: all 0.15s;
margin-bottom: 0.125rem;
}
.tree-file:hover {
background: var(--bg-secondary);
transform: translateX(4px);
}
.tree-file .tree-icon {
color: var(--text-secondary);
}
.tree-file .tree-name {
font-weight: 500;
}
.tree-label {
font-size: 0.75rem;
color: var(--text-secondary);
padding: 0.125rem 0.5rem;
background: var(--bg-tertiary);
border-radius: 0.25rem;
}
.tree-health {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.tree-health.good {
background: var(--accent-green);
}
.tree-health.needs_review {
background: var(--accent-yellow);
}
.tree-health.critical {
background: var(--accent-red);
}
.tree-health.unknown {
background: var(--text-secondary);
}
.tree-cycle {
color: var(--accent-red);
font-weight: bold;
}
.tree-connections {
font-size: 0.6875rem;
color: var(--text-secondary);
min-width: 20px;
text-align: right;
}
.tree-item-count {
font-size: 0.625rem;
color: var(--text-secondary);
background: var(--bg-tertiary);
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
margin-left: 0.25rem;
}
.tree-file-wrapper {
margin-bottom: 0.125rem;
}
.tree-file-wrapper.has-items .tree-file {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.tree-items {
margin-left: 1.5rem;
padding: 0.25rem 0.5rem;
background: var(--bg-secondary);
border-radius: 0 0 0.375rem 0.375rem;
border-left: 2px solid var(--border-color);
margin-bottom: 0.25rem;
}
.tree-item {
display: flex;
align-items: center;
gap: 0.375rem;
padding: 0.25rem 0.5rem;
font-size: 0.8125rem;
color: var(--text-secondary);
border-radius: 0.25rem;
transition: background 0.1s;
}
.tree-item:hover {
background: var(--bg-tertiary);
}
.tree-item-icon {
font-size: 0.75rem;
}
.tree-item-name {
flex: 1;
color: var(--text-primary);
font-family: 'SF Mono', 'Monaco', monospace;
}
.tree-item-kind {
font-size: 0.625rem;
color: var(--accent-blue);
padding: 0.0625rem 0.375rem;
background: rgba(59, 130, 246, 0.1);
border-radius: 0.25rem;
}
.tree-item-vis {
font-size: 0.625rem;
color: var(--text-secondary);
}
.tree-item.public .tree-item-vis {
color: var(--accent-green);
}
.tree-item.private .tree-item-vis {
color: var(--text-secondary);
}
.tree-stats {
display: flex;
gap: 1rem;
margin-top: 0.5rem;
font-size: 0.875rem;
}
.tree-stat {
color: var(--text-secondary);
}
.tree-stat.warning {
color: var(--accent-yellow);
}
.tree-toolbar {
display: flex;
gap: 0.5rem;
margin-top: 1rem;
}
.tree-search {
flex: 1;
padding: 0.5rem 0.75rem;
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 0.375rem;
color: var(--text-primary);
font-size: 0.875rem;
}
.tree-search:focus {
outline: none;
border-color: var(--accent-blue);
}
.btn-sm {
padding: 0.375rem 0.75rem;
font-size: 0.75rem;
}
.tree-couplings {
margin-left: 1.5rem;
padding: 0.5rem;
background: var(--bg-secondary);
border-left: 2px solid var(--border-color);
margin-bottom: 0.5rem;
font-size: 0.8125rem;
}
.coupling-section {
margin-bottom: 0.5rem;
}
.coupling-section:last-child {
margin-bottom: 0;
}
.coupling-label {
display: block;
font-weight: 600;
color: var(--text-secondary);
font-size: 0.75rem;
margin-bottom: 0.25rem;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.coupling-item {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.375rem 0.5rem;
margin-bottom: 0.125rem;
border-radius: 0.25rem;
background: var(--bg-tertiary);
}
.coupling-item.good {
border-left: 3px solid var(--accent-green);
}
.coupling-item.needs_review {
border-left: 3px solid var(--accent-yellow);
}
.coupling-item.critical {
border-left: 3px solid var(--accent-red);
}
.coupling-target {
flex: 1;
font-weight: 500;
color: var(--text-primary);
}
.coupling-dim {
font-size: 0.625rem;
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
text-transform: uppercase;
letter-spacing: 0.25px;
}
.coupling-dim.strength-intrusive {
background: rgba(239, 68, 68, 0.2);
color: var(--accent-red);
}
.coupling-dim.strength-functional {
background: rgba(234, 179, 8, 0.2);
color: var(--accent-yellow);
}
.coupling-dim.strength-model {
background: rgba(59, 130, 246, 0.2);
color: var(--accent-blue);
}
.coupling-dim.strength-contract {
background: rgba(34, 197, 94, 0.2);
color: var(--accent-green);
}
.coupling-dim.distance-samemodule {
background: rgba(34, 197, 94, 0.15);
color: var(--accent-green);
}
.coupling-dim.distance-differentmodule {
background: rgba(59, 130, 246, 0.15);
color: var(--accent-blue);
}
.coupling-dim.volatility-low {
background: rgba(34, 197, 94, 0.15);
color: var(--accent-green);
}
.coupling-dim.volatility-medium {
background: rgba(234, 179, 8, 0.15);
color: var(--accent-yellow);
}
.coupling-dim.volatility-high {
background: rgba(239, 68, 68, 0.15);
color: var(--accent-red);
}
.coupling-balance {
font-size: 0.6875rem;
font-weight: 600;
min-width: 2.5rem;
text-align: right;
color: var(--text-secondary);
}
.coupling-dimensions {
margin-top: 1rem;
}
.coupling-dimension {
display: flex;
flex-direction: column;
padding: 0.5rem;
margin-bottom: 0.5rem;
background: var(--bg-secondary);
border-radius: 0.375rem;
border-left: 3px solid var(--border-color);
}
.dim-label {
font-size: 0.75rem;
color: var(--text-secondary);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.dim-value {
font-size: 1rem;
font-weight: 600;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
display: inline-block;
margin: 0.25rem 0;
}
.dim-value.strength-intrusive {
background: rgba(239, 68, 68, 0.2);
color: var(--accent-red);
}
.dim-value.strength-functional {
background: rgba(234, 179, 8, 0.2);
color: var(--accent-yellow);
}
.dim-value.strength-model {
background: rgba(59, 130, 246, 0.2);
color: var(--accent-blue);
}
.dim-value.strength-contract {
background: rgba(34, 197, 94, 0.2);
color: var(--accent-green);
}
.dim-value.distance-samefunction,
.dim-value.distance-samemodule {
background: rgba(34, 197, 94, 0.2);
color: var(--accent-green);
}
.dim-value.distance-differentmodule {
background: rgba(59, 130, 246, 0.2);
color: var(--accent-blue);
}
.dim-value.distance-differentcrate {
background: rgba(234, 179, 8, 0.2);
color: var(--accent-yellow);
}
.dim-value.volatility-low {
background: rgba(34, 197, 94, 0.2);
color: var(--accent-green);
}
.dim-value.volatility-medium {
background: rgba(234, 179, 8, 0.2);
color: var(--accent-yellow);
}
.dim-value.volatility-high {
background: rgba(239, 68, 68, 0.2);
color: var(--accent-red);
}
.dim-desc {
font-size: 0.75rem;
color: var(--text-secondary);
}
.dim-effective {
font-size: 0.6875rem;
color: var(--accent-blue);
display: block;
margin-top: 0.25rem;
font-style: italic;
}
.balance-display {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.75rem;
border-radius: 0.5rem;
margin: 0.5rem 0;
}
.balance-display.good {
background: rgba(34, 197, 94, 0.15);
border: 1px solid var(--accent-green);
}
.balance-display.acceptable {
background: rgba(234, 179, 8, 0.15);
border: 1px solid var(--accent-yellow);
}
.balance-display.critical {
background: rgba(239, 68, 68, 0.15);
border: 1px solid var(--accent-red);
}
.balance-value {
font-size: 1.5rem;
font-weight: 700;
}
.balance-display.good .balance-value { color: var(--accent-green); }
.balance-display.acceptable .balance-value { color: var(--accent-yellow); }
.balance-display.critical .balance-value { color: var(--accent-red); }
.balance-interpretation {
font-size: 0.875rem;
color: var(--text-secondary);
}
.balance-formula {
font-size: 0.6875rem;
color: var(--text-secondary);
font-family: 'SF Mono', 'Monaco', monospace;
opacity: 0.7;
margin-top: 0.5rem;
}
.recommendation-section {
margin-top: 1rem;
}
.recommendation-card {
display: flex;
gap: 0.75rem;
padding: 1rem;
border-radius: 0.5rem;
background: var(--bg-secondary);
border: 1px solid var(--border-color);
}
.recommendation-card.good {
background: rgba(34, 197, 94, 0.1);
border-color: var(--accent-green);
}
.recommendation-card.acceptable {
background: rgba(234, 179, 8, 0.1);
border-color: var(--accent-yellow);
}
.recommendation-card.critical {
background: rgba(239, 68, 68, 0.1);
border-color: var(--accent-red);
}
.recommendation-icon {
font-size: 1.5rem;
flex-shrink: 0;
}
.recommendation-content {
flex: 1;
min-width: 0;
}
.recommendation-status {
font-weight: 600;
font-size: 0.9375rem;
margin-bottom: 0.25rem;
}
.recommendation-card.good .recommendation-status { color: var(--accent-green); }
.recommendation-card.acceptable .recommendation-status { color: var(--accent-yellow); }
.recommendation-card.critical .recommendation-status { color: var(--accent-red); }
.recommendation-reason {
font-size: 0.8125rem;
color: var(--text-secondary);
line-height: 1.5;
margin-bottom: 0.5rem;
}
.recommendation-action {
font-size: 0.8125rem;
color: var(--text-primary);
padding: 0.5rem 0.75rem;
background: rgba(59, 130, 246, 0.15);
border-left: 3px solid var(--accent-blue);
border-radius: 0.25rem;
margin-top: 0.5rem;
}
.recommendation-action strong {
color: var(--accent-blue);
}
.balance-equation {
margin-top: 0.75rem;
padding: 0.75rem;
background: var(--bg-secondary);
border-radius: 0.375rem;
border: 1px solid var(--border-color);
}
.equation-title {
font-size: 0.75rem;
color: var(--text-secondary);
margin-bottom: 0.375rem;
}
.equation-code {
display: block;
font-size: 0.6875rem;
color: var(--accent-blue);
font-family: 'SF Mono', 'Monaco', monospace;
margin-bottom: 0.75rem;
padding: 0.375rem;
background: rgba(59, 130, 246, 0.1);
border-radius: 0.25rem;
}
.equation-result {
display: flex;
align-items: center;
gap: 0.375rem;
font-size: 0.8125rem;
flex-wrap: wrap;
}
.equation-breakdown {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.eq-step {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.75rem;
padding: 0.375rem;
background: rgba(15, 23, 42, 0.5);
border-radius: 0.25rem;
}
.eq-step.final {
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
}
.eq-label {
font-weight: 600;
color: var(--text-secondary);
min-width: 100px;
}
.eq-expr {
flex: 1;
font-family: 'SF Mono', 'Monaco', monospace;
color: var(--text-primary);
font-size: 0.6875rem;
}
.eq-eval {
font-weight: 700;
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
font-size: 0.6875rem;
}
.eq-eval.true {
background: rgba(34, 197, 94, 0.2);
color: var(--accent-green);
}
.eq-eval.false {
background: rgba(239, 68, 68, 0.2);
color: var(--accent-red);
}
.eq-term {
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-family: 'SF Mono', 'Monaco', monospace;
font-size: 0.75rem;
}
.eq-term.good {
background: rgba(34, 197, 94, 0.2);
color: var(--accent-green);
}
.eq-term.bad {
background: rgba(239, 68, 68, 0.2);
color: var(--accent-red);
}
.eq-term.neutral {
background: rgba(234, 179, 8, 0.2);
color: var(--accent-yellow);
}
.eq-op {
color: var(--text-secondary);
font-weight: 600;
}
.eq-result {
color: var(--text-secondary);
}
.eq-value {
font-weight: 700;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
}
.eq-value.good {
background: var(--accent-green);
color: #000;
}
.eq-value.acceptable {
background: var(--accent-yellow);
color: #000;
}
.eq-value.critical {
background: var(--accent-red);
color: #fff;
}
.legend-panel h2 {
display: flex;
justify-content: space-between;
align-items: center;
}
.btn-toggle {
background: transparent;
border: 1px solid var(--border-color);
color: var(--text-secondary);
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
cursor: pointer;
font-size: 0.75rem;
}
.btn-toggle:hover {
background: var(--bg-tertiary);
color: var(--text-primary);
}
.legend-section {
margin-bottom: 1rem;
}
.legend-section h4 {
font-size: 0.75rem;
color: var(--text-secondary);
margin-bottom: 0.5rem;
font-weight: 600;
}
.legend-items {
display: flex;
flex-direction: column;
gap: 0.375rem;
}
.legend-item {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.75rem;
}
.legend-color {
width: 1rem;
height: 0.5rem;
border-radius: 0.125rem;
}
.legend-line {
width: 1.5rem;
height: 0;
border-top: 2px solid var(--text-secondary);
}
.legend-line.solid {
border-style: solid;
}
.legend-line.dashed {
border-style: dashed;
}
.legend-line.dotted {
border-style: dotted;
}
.legend-label {
color: var(--text-secondary);
}
.balance-rules {
background: var(--bg-secondary);
padding: 0.75rem;
border-radius: 0.375rem;
border: 1px solid var(--border-color);
}
.balance-rules code {
display: block;
font-size: 0.625rem;
color: var(--accent-blue);
margin-bottom: 0.75rem;
word-break: break-all;
}
.balance-table {
width: 100%;
font-size: 0.6875rem;
border-collapse: collapse;
}
.balance-table td {
padding: 0.25rem 0.375rem;
border-bottom: 1px solid var(--border-color);
}
.balance-table td:first-child {
color: var(--text-secondary);
}
.balance-table td.good {
color: var(--accent-green);
text-align: right;
}
.balance-table td.bad {
color: var(--accent-red);
text-align: right;
}
.tree-item-wrapper {
margin-bottom: 0.125rem;
}
.tree-item-wrapper.has-deps .tree-item {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.tree-item-dep-count {
font-size: 0.625rem;
background: var(--bg-tertiary);
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
color: var(--text-secondary);
}
.item-deps {
margin-left: 1.5rem;
padding: 0.375rem 0.5rem;
background: rgba(30, 41, 59, 0.5);
border-radius: 0 0 0.375rem 0.375rem;
border-left: 2px solid var(--border-color);
margin-bottom: 0.25rem;
}
.item-dep {
display: flex;
align-items: center;
gap: 0.375rem;
padding: 0.25rem 0;
font-size: 0.75rem;
color: var(--text-secondary);
}
.item-dep .dep-arrow {
color: var(--accent-blue);
font-weight: bold;
}
.item-dep .dep-target {
font-family: 'SF Mono', 'Monaco', monospace;
color: var(--text-primary);
font-weight: 500;
}
.item-dep .dep-type {
font-size: 0.625rem;
padding: 0.0625rem 0.25rem;
border-radius: 0.125rem;
text-transform: lowercase;
}
.item-dep .dep-type.functioncall { background: rgba(234, 179, 8, 0.2); color: var(--accent-yellow); }
.item-dep .dep-type.methodcall { background: rgba(234, 179, 8, 0.2); color: var(--accent-yellow); }
.item-dep .dep-type.fieldaccess { background: rgba(239, 68, 68, 0.2); color: var(--accent-red); }
.item-dep .dep-type.structconstruction { background: rgba(239, 68, 68, 0.2); color: var(--accent-red); }
.item-dep .dep-type.typeusage { background: rgba(59, 130, 246, 0.2); color: var(--accent-blue); }
.item-dep .dep-strength {
font-size: 0.5625rem;
padding: 0.0625rem 0.25rem;
border-radius: 0.125rem;
text-transform: uppercase;
letter-spacing: 0.25px;
}
.item-dep .dep-strength.intrusive { background: rgba(239, 68, 68, 0.15); color: var(--accent-red); }
.item-dep .dep-strength.functional { background: rgba(234, 179, 8, 0.15); color: var(--accent-yellow); }
.item-dep .dep-strength.model { background: rgba(59, 130, 246, 0.15); color: var(--accent-blue); }
.item-dep .dep-strength.contract { background: rgba(34, 197, 94, 0.15); color: var(--accent-green); }
.item-dep .dep-expr {
font-size: 0.625rem;
color: var(--text-secondary);
font-family: 'SF Mono', 'Monaco', monospace;
opacity: 0.7;
max-width: 150px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.item-dep.more {
color: var(--text-secondary);
font-style: italic;
}
.item-details {
margin-top: 0.75rem;
padding: 0.75rem;
background: var(--card-bg);
border-radius: 0.375rem;
border: 1px solid var(--border-color);
}
.item-detail-header {
font-weight: 600;
font-size: 0.9rem;
margin-bottom: 0.5rem;
color: var(--text-primary);
}
.item-detail-row {
display: flex;
gap: 0.5rem;
margin-bottom: 0.5rem;
}
.item-kind-badge {
padding: 0.125rem 0.5rem;
border-radius: 0.25rem;
font-size: 0.7rem;
font-weight: 500;
}
.item-kind-badge.fn { background: rgba(59, 130, 246, 0.2); color: var(--accent-blue); }
.item-kind-badge.type { background: rgba(139, 92, 246, 0.2); color: #a78bfa; }
.item-kind-badge.trait { background: rgba(34, 197, 94, 0.2); color: var(--accent-green); }
.item-visibility-badge {
padding: 0.125rem 0.5rem;
border-radius: 0.25rem;
font-size: 0.7rem;
background: rgba(251, 191, 36, 0.15);
color: var(--accent-yellow);
}
.item-deps-section {
margin-top: 0.5rem;
}
.item-deps-header {
font-size: 0.75rem;
color: var(--text-secondary);
margin-bottom: 0.25rem;
}
.item-dep.external {
color: var(--text-secondary);
font-size: 0.7rem;
}
.strength-badge {
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
font-size: 0.65rem;
font-weight: 500;
}
.strength-badge.intrusive { background: rgba(239, 68, 68, 0.15); color: var(--accent-red); }
.strength-badge.functional { background: rgba(234, 179, 8, 0.15); color: var(--accent-yellow); }
.strength-badge.model { background: rgba(59, 130, 246, 0.15); color: var(--accent-blue); }
.strength-badge.contract { background: rgba(34, 197, 94, 0.15); color: var(--accent-green); }
@media (max-width: 768px) {
.header {
align-items: flex-start;
padding: 0.625rem 0.75rem;
}
.header-left h1 {
font-size: 1rem;
}
.health-header-card {
grid-template-columns: 1fr;
gap: 0.5rem;
}
.health-meta {
flex-wrap: wrap;
white-space: normal;
}
.health-rationale span:not(.revision-chip) {
white-space: normal;
}
.canvas-toolbar {
top: 8.25rem;
width: calc(100vw - 1rem);
justify-content: center;
}
.segment {
padding: 0.5rem;
font-size: 0.75rem;
}
.sidebar {
width: 100%;
max-width: 100%;
min-width: 100%;
max-height: 60vh;
top: auto;
bottom: 0;
transform: translateY(calc(100% - 40px));
}
.sidebar:hover,
.sidebar.visible {
transform: translateY(0);
}
.sidebar::before {
content: 'â–²';
left: 50%;
top: 4px;
transform: translateX(-50%);
}
.footer {
display: none;
}
}
.critical-issues-list {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.critical-issue-item {
padding: 0.75rem;
background: var(--bg-tertiary);
border-radius: 0.5rem;
border-left: 3px solid var(--accent-yellow);
cursor: pointer;
transition: all 0.2s ease;
}
.critical-issue-item:hover {
transform: translateX(4px);
background: var(--border-color);
}
.critical-issue-item.critical {
border-left-color: var(--accent-red);
background: rgba(239, 68, 68, 0.1);
}
.critical-issue-item.acceptable {
border-left-color: var(--accent-yellow);
background: rgba(234, 179, 8, 0.1);
}
.critical-issue-header {
display: flex;
align-items: center;
gap: 0.5rem;
margin-bottom: 0.375rem;
}
.critical-issue-icon {
font-size: 1rem;
}
.critical-issue-path {
font-weight: 600;
font-size: 0.875rem;
color: var(--text-primary);
}
.critical-issue-dims {
display: flex;
gap: 0.375rem;
margin-bottom: 0.5rem;
flex-wrap: wrap;
}
.dim-tag {
font-size: 0.625rem;
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
background: var(--bg-secondary);
color: var(--text-secondary);
}
.dim-tag.strength {
background: rgba(139, 92, 246, 0.2);
color: #a78bfa;
}
.dim-tag.distance {
background: rgba(59, 130, 246, 0.2);
color: #60a5fa;
}
.dim-tag.volatility {
background: rgba(236, 72, 153, 0.2);
color: #f472b6;
}
.critical-issue-reason {
font-size: 0.75rem;
color: var(--text-secondary);
line-height: 1.4;
margin-bottom: 0.5rem;
}
.critical-issue-fix {
font-size: 0.75rem;
color: var(--text-primary);
background: var(--bg-secondary);
padding: 0.5rem;
border-radius: 0.375rem;
border: 1px solid var(--border-color);
}
.fix-code {
margin-top: 0.5rem;
padding: 0.5rem;
background: var(--bg-primary);
border-radius: 0.25rem;
overflow-x: auto;
font-size: 0.6875rem;
line-height: 1.4;
}
.fix-code code {
color: var(--accent-green);
font-family: 'SF Mono', Monaco, 'Fira Code', monospace;
white-space: pre;
}
.badge.critical {
background: var(--accent-red);
}
.header-right {
display: flex;
align-items: center;
gap: 0.5rem;
}
.btn-lang {
padding: 0.25rem 0.5rem;
font-size: 0.75rem;
font-weight: 600;
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 0.25rem;
color: var(--text-primary);
cursor: pointer;
transition: all 0.2s ease;
}
.btn-lang:hover {
background: var(--accent-blue);
border-color: var(--accent-blue);
}
.critical-issue-classification {
font-size: 0.75rem;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 0.5rem;
padding: 0.25rem 0.5rem;
background: var(--bg-secondary);
border-radius: 0.25rem;
display: inline-block;
}
.critical-issue-item.critical .critical-issue-classification {
background: rgba(239, 68, 68, 0.2);
color: var(--accent-red);
}
.critical-issue-item.possible-issue .critical-issue-classification {
background: rgba(234, 179, 8, 0.2);
color: var(--accent-yellow);
}
.module-stats {
display: flex;
gap: 1rem;
justify-content: space-around;
padding: 0.75rem;
background: var(--bg-secondary);
border-radius: 0.5rem;
margin-top: 0.5rem;
}
.stat-item {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.25rem;
}
.stat-count {
font-size: 1.25rem;
font-weight: 700;
color: var(--accent-blue);
}
.stat-label {
font-size: 0.6875rem;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
}
#item-graph-panel {
max-height: 400px;
display: flex;
flex-direction: column;
}
.item-graph-hint {
font-size: 0.6875rem;
color: var(--text-secondary);
margin-bottom: 0.5rem;
}
.item-graph-container {
height: 250px;
background: var(--bg-primary);
border-radius: 0.375rem;
border: 1px solid var(--border-color);
overflow: hidden;
}
.item-graph-legend {
display: flex;
gap: 1rem;
margin-top: 0.5rem;
font-size: 0.6875rem;
color: var(--text-secondary);
}
.item-graph-legend .legend-item {
display: flex;
align-items: center;
gap: 0.25rem;
}
.item-graph-legend .dot {
width: 8px;
height: 8px;
border-radius: 50%;
}
.item-graph-legend .dot.fn {
background: #3b82f6;
}
.item-graph-legend .dot.type {
background: #8b5cf6;
}
.item-graph-legend .dot.trait {
background: #22c55e;
}
.btn-close {
float: right;
background: none;
border: none;
color: var(--text-secondary);
font-size: 1.25rem;
cursor: pointer;
padding: 0;
line-height: 1;
}
.btn-close:hover {
color: var(--text-primary);
}
.item-filter-group {
display: flex;
gap: 0.75rem;
margin-top: 0.5rem;
font-size: 0.75rem;
}
.item-filter-group label {
display: flex;
align-items: center;
gap: 0.25rem;
cursor: pointer;
}
.tree-container {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
overflow: auto;
padding: 1.5rem;
background: var(--bg-primary);
}
.tree-group {
margin-bottom: 1.5rem;
background: var(--bg-secondary);
border-radius: 8px;
overflow: hidden;
border: 1px solid var(--border-color);
}
.tree-group-header {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.75rem 1rem;
background: var(--bg-tertiary);
border-bottom: 1px solid var(--border-color);
}
.tree-group-icon {
font-size: 1rem;
}
.tree-group-name {
font-weight: 600;
font-size: 0.9rem;
color: var(--accent-blue);
font-family: 'SF Mono', 'Monaco', 'Inconsolata', monospace;
}
.tree-group-count {
margin-left: auto;
font-size: 0.75rem;
color: var(--text-secondary);
}
.tree-modules {
padding: 0.5rem;
}
.tree-module {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.6rem 0.75rem;
margin: 0.25rem 0;
border-radius: 6px;
cursor: pointer;
transition: all 0.2s ease;
border-left: 3px solid transparent;
}
.tree-module:hover {
background: var(--bg-tertiary);
border-left-color: var(--accent-blue);
}
.tree-module.health-good {
border-left-color: var(--accent-green);
}
.tree-module.health-warning {
border-left-color: var(--accent-yellow);
}
.tree-module.health-critical {
border-left-color: var(--accent-red);
}
.tree-module-main {
display: flex;
align-items: center;
gap: 0.5rem;
}
.tree-module-icon {
font-size: 0.9rem;
opacity: 0.7;
}
.tree-module-name {
font-family: 'SF Mono', 'Monaco', 'Inconsolata', monospace;
font-size: 0.85rem;
color: var(--text-primary);
font-weight: 500;
}
.tree-module-info {
display: flex;
align-items: center;
gap: 1rem;
}
.tree-module-deps {
display: flex;
gap: 0.5rem;
font-size: 0.75rem;
font-family: 'SF Mono', 'Monaco', 'Inconsolata', monospace;
}
.dep-out {
color: var(--accent-yellow);
}
.dep-in {
color: var(--accent-green);
}
.tree-module-items {
font-size: 0.7rem;
color: var(--text-secondary);
font-family: 'SF Mono', 'Monaco', 'Inconsolata', monospace;
background: var(--bg-tertiary);
padding: 0.2rem 0.5rem;
border-radius: 4px;
}
.tree-module-container {
margin-bottom: 0.25rem;
}
.tree-expand-icon {
font-size: 0.7rem;
color: var(--text-secondary);
width: 1rem;
text-align: center;
transition: transform 0.2s ease;
}
.tree-module.expanded .tree-expand-icon {
color: var(--accent-blue);
}
.tree-items {
margin-left: 1.5rem;
padding: 0.25rem 0;
border-left: 1px solid var(--border-color);
margin-top: -0.25rem;
}
.tree-item-group {
margin-bottom: 0.5rem;
}
.tree-item-group-header {
font-size: 0.7rem;
color: var(--text-secondary);
padding: 0.25rem 0.5rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.tree-item {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.3rem 0.5rem;
margin-left: 0.5rem;
border-radius: 4px;
cursor: pointer;
transition: background 0.15s ease;
}
.tree-item:hover {
background: var(--bg-tertiary);
}
.tree-item-icon {
font-family: 'SF Mono', 'Monaco', 'Inconsolata', monospace;
font-size: 0.8rem;
font-weight: 600;
width: 1.2rem;
text-align: center;
color: var(--accent-blue);
}
.tree-item-name {
font-family: 'SF Mono', 'Monaco', 'Inconsolata', monospace;
font-size: 0.8rem;
color: var(--text-primary);
flex: 1;
}
.tree-item-vis {
font-size: 0.65rem;
color: var(--text-secondary);
font-family: 'SF Mono', 'Monaco', 'Inconsolata', monospace;
}
.tree-item.vis-public .tree-item-icon {
color: var(--accent-green);
}
.tree-item.vis-crate .tree-item-icon {
color: var(--accent-yellow);
}
.tree-item.vis-private .tree-item-icon {
color: var(--text-secondary);
}
.tree-filters {
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 0.75rem 1rem;
margin-bottom: 1rem;
}
.tree-filter-title {
font-size: 0.75rem;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 0.5rem;
}
.tree-filter-options {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
}
.tree-filter-options label {
display: flex;
align-items: center;
gap: 0.35rem;
font-size: 0.8rem;
color: var(--text-primary);
cursor: pointer;
}
.tree-filter-options input[type="checkbox"] {
cursor: pointer;
}
.tree-item-kind {
font-size: 0.65rem;
color: var(--text-secondary);
background: var(--bg-tertiary);
padding: 0.1rem 0.3rem;
border-radius: 3px;
font-family: 'SF Mono', 'Monaco', 'Inconsolata', monospace;
min-width: 3rem;
text-align: center;
}
.tree-item-pub {
font-size: 0.6rem;
color: var(--accent-green);
font-family: 'SF Mono', 'Monaco', 'Inconsolata', monospace;
margin-left: auto;
}
#item-details {
margin-top: 0.75rem;
padding-top: 0.75rem;
border-top: 1px solid var(--border-color);
max-height: 400px;
overflow-y: auto;
}
.item-detail-header {
font-size: 1rem;
font-weight: 700;
color: var(--text-primary);
padding-bottom: 0.5rem;
margin-bottom: 0.5rem;
border-bottom: 1px solid var(--border-color);
word-break: break-word;
}
.item-detail-badges {
display: flex;
gap: 0.5rem;
margin-bottom: 0.75rem;
}
.item-kind-badge {
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 0.6875rem;
font-weight: 600;
text-transform: uppercase;
}
.item-kind-badge.fn {
background: rgba(59, 130, 246, 0.15);
color: var(--accent-blue);
}
.item-kind-badge.type {
background: rgba(139, 92, 246, 0.15);
color: #a78bfa;
}
.item-kind-badge.trait {
background: rgba(34, 197, 94, 0.15);
color: var(--accent-green);
}
.item-kind-badge.module {
background: rgba(100, 116, 139, 0.15);
color: #94a3b8;
}
.item-visibility-badge {
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 0.6875rem;
font-weight: 500;
background: var(--bg-tertiary);
color: var(--text-secondary);
}
.item-visibility-badge.public {
background: rgba(34, 197, 94, 0.15);
color: var(--accent-green);
}
.item-stats-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 0.375rem;
margin-bottom: 0.75rem;
}
.item-stat {
display: flex;
flex-direction: column;
align-items: center;
padding: 0.5rem 0.25rem;
background: var(--bg-tertiary);
border-radius: 0.375rem;
}
.item-stat .stat-value {
font-size: 1.125rem;
font-weight: 700;
color: var(--accent-blue);
}
.item-stat .stat-label {
font-size: 0.5625rem;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
}
.item-deps-section {
margin-bottom: 0.75rem;
border: 1px solid var(--border-color);
border-radius: 0.5rem;
overflow: hidden;
}
.item-deps-section.incoming {
border-color: rgba(34, 197, 94, 0.3);
}
.item-deps-section.same-module {
border-color: rgba(59, 130, 246, 0.3);
}
.item-deps-section.other-module {
border-color: rgba(234, 179, 8, 0.3);
}
.item-deps-section.external {
border-color: rgba(100, 116, 139, 0.3);
}
.item-deps-header {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0.75rem;
background: var(--bg-tertiary);
font-size: 0.75rem;
font-weight: 600;
color: var(--text-primary);
border-bottom: 1px solid var(--border-color);
}
.deps-icon {
font-size: 0.875rem;
}
.item-deps-group {
padding: 0.5rem;
}
.item-deps-group-header {
font-size: 0.6875rem;
color: var(--text-secondary);
margin-bottom: 0.375rem;
}
.item-dep-card {
padding: 0.625rem;
background: var(--bg-secondary);
border-radius: 0.375rem;
margin-bottom: 0.375rem;
cursor: pointer;
transition: all 0.15s;
border-left: 3px solid transparent;
}
.item-dep-card:hover {
background: var(--bg-tertiary);
border-left-color: var(--accent-blue);
transform: translateX(2px);
}
.dep-card-header {
display: flex;
align-items: center;
gap: 0.5rem;
margin-bottom: 0.25rem;
}
.dep-target-name {
font-family: 'SF Mono', 'Monaco', monospace;
font-size: 0.8125rem;
font-weight: 600;
color: var(--text-primary);
}
.dep-card-path {
font-family: 'SF Mono', 'Monaco', monospace;
font-size: 0.6875rem;
color: var(--text-secondary);
margin-bottom: 0.375rem;
word-break: break-all;
}
.dep-card-expression {
padding: 0.375rem 0.5rem;
background: #0d1117;
border-radius: 0.25rem;
margin-bottom: 0.375rem;
overflow-x: auto;
}
.dep-card-expression code {
font-family: 'SF Mono', 'Monaco', 'Fira Code', monospace;
font-size: 0.6875rem;
color: #e6edf3;
white-space: pre;
}
.dep-card-meta {
display: flex;
gap: 0.375rem;
flex-wrap: wrap;
}
.meta-tag {
font-size: 0.5625rem;
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
background: var(--bg-tertiary);
color: var(--text-secondary);
}
.meta-tag.distance {
background: rgba(139, 92, 246, 0.15);
color: #a78bfa;
}
.item-dep-simple {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.5rem 0.75rem;
border-bottom: 1px solid var(--bg-tertiary);
}
.item-dep-simple:last-child {
border-bottom: none;
}
.item-dep-simple .dep-name {
font-family: 'SF Mono', 'Monaco', monospace;
font-size: 0.8125rem;
color: var(--text-primary);
}
.item-dep-more {
padding: 0.375rem 0.75rem;
font-size: 0.6875rem;
color: var(--text-secondary);
font-style: italic;
text-align: center;
background: var(--bg-tertiary);
}
.item-no-deps {
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
padding: 1.5rem;
color: var(--text-secondary);
font-size: 0.875rem;
}
.no-deps-icon {
font-size: 1.25rem;
}
.item-detail-hint {
display: flex;
align-items: center;
gap: 0.375rem;
padding: 0.5rem;
margin-top: 0.5rem;
background: rgba(59, 130, 246, 0.1);
border-radius: 0.375rem;
font-size: 0.6875rem;
color: var(--text-secondary);
}
.hint-icon {
font-size: 0.875rem;
}
.item-edge-info {
margin-bottom: 0.75rem;
}
.edge-endpoints {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.625rem;
background: var(--bg-tertiary);
border-radius: 0.375rem;
font-family: 'SF Mono', 'Monaco', monospace;
font-size: 0.8125rem;
}
.edge-source {
color: var(--accent-blue);
}
.edge-arrow {
color: var(--text-secondary);
font-weight: 700;
}
.edge-target {
color: var(--accent-yellow);
word-break: break-all;
}
.item-detail-section {
margin-bottom: 0.75rem;
}
.dep-expression-box {
padding: 0.625rem;
background: #0d1117;
border-radius: 0.375rem;
overflow-x: auto;
}
.dep-expression-box code {
font-family: 'SF Mono', 'Monaco', 'Fira Code', monospace;
font-size: 0.75rem;
color: #e6edf3;
white-space: pre-wrap;
word-break: break-all;
}
.distance-badge {
font-size: 0.6875rem;
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
background: rgba(139, 92, 246, 0.15);
color: #a78bfa;
}
:root {
--space-1: 0.25rem;
--space-2: 0.5rem;
--space-3: 0.75rem;
--space-4: 1rem;
--space-5: 1.25rem;
--space-6: 1.5rem;
--radius-sm: 0.25rem;
--radius-md: 0.5rem;
--radius-lg: 0.75rem;
--duration-fast: 160ms;
--bg-primary: #08111f;
--bg-secondary: #111827;
--bg-tertiary: #1f2937;
--surface-raised: rgba(17, 24, 39, 0.9);
--surface-soft: rgba(31, 41, 55, 0.66);
--text-primary: #f8fafc;
--text-secondary: #b6c2d1;
--text-muted: #8291a6;
--border-color: #3f4b5f;
--focus-ring: #7dd3fc;
--accent-blue: #38bdf8;
--accent-green: #34d399;
--accent-yellow: #facc15;
--accent-orange: #fb923c;
--accent-red: #f87171;
--grade-s: #2dd4bf;
--grade-a: #34d399;
--grade-b: #a3e635;
--grade-c: #facc15;
--grade-d: #fb923c;
--grade-f: #f87171;
--severity-critical: #f87171;
--severity-high: #fb923c;
--severity-medium: #facc15;
--severity-low: #60a5fa;
--subdomain-core: #fb7185;
--subdomain-supporting: #38bdf8;
--subdomain-generic: #cbd5e1;
--strength-intrusive: #fb7185;
--strength-functional: #fb923c;
--strength-model: #facc15;
--strength-contract: #34d399;
--quadrant-high-cohesion: #34d399;
--quadrant-loose-coupling: #2dd4bf;
--quadrant-acceptable: #60a5fa;
--quadrant-local-complexity: #facc15;
--quadrant-global-complexity: #f87171;
--panel-shadow: 0 18px 48px rgba(2, 6, 23, 0.46);
}
body {
line-height: 1.5;
}
button,
input,
select,
summary,
[tabindex] {
transition:
background-color var(--duration-fast) ease,
border-color var(--duration-fast) ease,
color var(--duration-fast) ease,
opacity var(--duration-fast) ease,
box-shadow var(--duration-fast) ease,
transform var(--duration-fast) ease;
}
button:focus-visible,
input:focus-visible,
select:focus-visible,
summary:focus-visible,
a:focus-visible,
[tabindex]:focus-visible {
outline: 2px solid var(--focus-ring);
outline-offset: 2px;
box-shadow: 0 0 0 4px rgba(56, 189, 248, 0.18);
}
.header {
padding: var(--space-3) var(--space-5);
background: rgba(8, 17, 31, 0.9);
border-bottom-color: rgba(125, 211, 252, 0.18);
}
.header h1 {
font-size: 1.125rem;
letter-spacing: 0;
}
.health-header-card {
grid-template-columns: auto minmax(16rem, 1.35fr) minmax(15rem, auto) minmax(18rem, 1fr);
width: min(100%, 1180px);
gap: var(--space-3);
}
.health-grade-block {
gap: var(--space-2);
padding-right: var(--space-2);
}
.health-label {
color: var(--text-muted);
font-size: 0.6875rem;
letter-spacing: 0.06em;
}
.health-grade {
display: inline-grid;
min-width: 3rem;
min-height: 3rem;
place-items: center;
padding: 0 var(--space-3);
border-radius: var(--radius-md);
font-size: 1.75rem;
line-height: 1;
box-shadow: inset 0 -1px 0 rgba(2, 6, 23, 0.32);
}
.health-grade.S { background: var(--grade-s); color: #042f2e; }
.health-grade.A { background: var(--grade-a); color: #052e1b; }
.health-grade.B { background: var(--grade-b); color: #1a2e05; }
.health-grade.C { background: var(--grade-c); color: #2f2400; }
.health-grade.D { background: var(--grade-d); color: #331400; }
.health-grade.F { background: var(--grade-f); color: #450a0a; }
.health-rationale {
align-items: flex-start;
gap: var(--space-2);
line-height: 1.35;
}
.health-rationale strong {
color: var(--text-primary);
font-size: 1rem;
line-height: 1.35;
}
.health-rationale span:not(.revision-chip) {
overflow: visible;
text-overflow: clip;
white-space: normal;
}
.health-counts {
gap: var(--space-2);
}
.health-count,
.overview-count,
.btn,
.select,
.search-input,
.canvas-tool-btn,
.segment {
border-color: rgba(148, 163, 184, 0.28);
background: rgba(31, 41, 55, 0.72);
}
.health-count {
grid-template-columns: 1fr;
justify-items: start;
min-width: 4.75rem;
padding: var(--space-2) var(--space-3);
border-radius: var(--radius-md);
}
.health-count strong {
order: -1;
font-size: 1.25rem;
line-height: 1;
}
.health-count span {
color: var(--text-secondary);
font-size: 0.6875rem;
font-weight: 700;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.health-count.critical strong,
.overview-count.critical,
.issue-item .severity.critical {
color: var(--severity-critical);
}
.health-count.high strong,
.overview-count.high,
.issue-item .severity.high {
color: var(--severity-high);
}
.health-count.medium strong,
.overview-count.medium,
.issue-item .severity.medium {
color: var(--severity-medium);
}
.health-meta {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
gap: var(--space-2);
white-space: normal;
}
.metric-chip {
display: inline-flex;
align-items: center;
min-height: 2rem;
gap: 0.375rem;
padding: 0.25rem 0.5rem;
border: 1px solid rgba(148, 163, 184, 0.24);
border-radius: 999px;
background: rgba(15, 23, 42, 0.58);
color: var(--text-secondary);
font-size: 0.75rem;
line-height: 1;
}
.metric-chip strong {
color: var(--text-primary);
font-size: 0.875rem;
}
.metric-icon {
display: inline-grid;
width: 1.25rem;
height: 1.25rem;
place-items: center;
border-radius: 999px;
background: rgba(56, 189, 248, 0.13);
color: var(--accent-blue);
font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
font-size: 0.6875rem;
font-weight: 800;
}
.btn-lang {
flex: 0 0 auto;
}
.canvas-toolbar {
top: 5.25rem;
gap: var(--space-2);
}
.segmented-control,
.canvas-tool-btn,
.sidebar,
.report-toc,
.report-panel {
box-shadow: var(--panel-shadow);
}
.segment,
.canvas-tool-btn,
.btn {
min-height: 2.25rem;
font-weight: 700;
}
.segment:hover,
.canvas-tool-btn:hover,
.btn:hover,
.quick-action:hover {
border-color: rgba(125, 211, 252, 0.5);
background: rgba(56, 189, 248, 0.14);
color: var(--text-primary);
}
.segment.active,
.btn-view.active,
.quick-action.active,
.timeline-play-btn.active {
border-color: rgba(125, 211, 252, 0.62);
background: rgba(56, 189, 248, 0.18);
color: #e0f2fe;
}
.app-loading {
position: fixed;
inset: 0;
z-index: 430;
display: grid;
place-items: center;
gap: var(--space-4);
padding: var(--space-6);
background: rgba(8, 17, 31, 0.88);
backdrop-filter: blur(8px);
}
.app-loading.hidden {
pointer-events: none;
opacity: 0;
}
.loading-panel {
display: flex;
align-items: center;
gap: var(--space-3);
min-width: min(25rem, 92vw);
padding: var(--space-4);
border: 1px solid rgba(125, 211, 252, 0.22);
border-radius: var(--radius-lg);
background: rgba(17, 24, 39, 0.92);
box-shadow: var(--panel-shadow);
}
.loading-panel div {
display: grid;
gap: var(--space-1);
}
.loading-panel strong {
font-size: 0.9375rem;
}
.loading-panel span:not(.loading-spinner) {
color: var(--text-secondary);
font-size: 0.8125rem;
}
.loading-spinner {
width: 1.75rem;
height: 1.75rem;
border: 3px solid rgba(148, 163, 184, 0.28);
border-top-color: var(--focus-ring);
border-radius: 999px;
animation: spin 820ms linear infinite;
}
.loading-skeleton {
display: grid;
width: min(25rem, 92vw);
gap: var(--space-2);
}
.loading-skeleton span {
height: 0.75rem;
border-radius: 999px;
background: linear-gradient(90deg, rgba(148, 163, 184, 0.12), rgba(125, 211, 252, 0.28), rgba(148, 163, 184, 0.12));
background-size: 220% 100%;
animation: shimmer 1.4s ease-in-out infinite;
}
.loading-skeleton span:nth-child(2) {
width: 78%;
}
.loading-skeleton span:nth-child(3) {
width: 54%;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
@keyframes shimmer {
0% { background-position: 120% 0; }
100% { background-position: -120% 0; }
}
.graph-error,
.no-data,
.source-loading,
.source-error {
border-radius: var(--radius-md);
}
.no-data {
padding: var(--space-3);
border: 1px solid rgba(148, 163, 184, 0.18);
background: rgba(15, 23, 42, 0.42);
color: var(--text-secondary);
font-size: 0.8125rem;
}
.sidebar {
width: 384px;
background: rgba(8, 17, 31, 0.96);
border-left-color: rgba(125, 211, 252, 0.16);
transition: transform 220ms ease, width 120ms ease;
}
.panel {
padding: var(--space-5);
border-bottom-color: rgba(148, 163, 184, 0.16);
}
.panel h2,
.detail-section h4,
.legend-section h4 {
color: #dbeafe;
font-size: 0.75rem;
letter-spacing: 0.06em;
}
#details-panel {
background: rgba(12, 20, 34, 0.98);
}
.inspector-title {
margin-bottom: var(--space-4);
font-size: 1rem;
line-height: 1.3;
}
.inspector-section {
margin-bottom: var(--space-3);
border-color: rgba(148, 163, 184, 0.18);
border-radius: var(--radius-md);
background: rgba(17, 24, 39, 0.58);
}
.inspector-section > summary {
padding: var(--space-3) var(--space-4);
}
.detail-row {
gap: var(--space-3);
padding: var(--space-2) 0;
border-bottom-color: rgba(148, 163, 184, 0.14);
}
.overview-health-row {
grid-template-columns: auto minmax(0, 1fr);
gap: var(--space-3);
}
.overview-health-row .health-grade {
min-width: 3.5rem;
min-height: 3.5rem;
font-size: 2rem;
}
.timeline-stat .health-grade {
min-width: auto;
min-height: auto;
padding: 0.125rem 0.5rem;
font-size: 0.875rem;
}
.overview-score {
font-size: 1.25rem;
}
.overview-rationale {
color: var(--text-secondary);
}
.overview-count-grid {
gap: var(--space-2);
}
.overview-count {
min-height: 4.25rem;
padding: var(--space-3) var(--space-2);
}
.subdomain-row strong {
color: var(--text-primary);
font-size: 0.75rem;
white-space: nowrap;
}
.subdomain-swatch.core,
.subdomain-badge.core { background: var(--subdomain-core); }
.subdomain-swatch.supporting,
.subdomain-badge.supporting { background: var(--subdomain-supporting); color: #06283a; }
.subdomain-swatch.generic,
.subdomain-badge.generic { background: var(--subdomain-generic); color: #111827; }
.strength-badge.intrusive { background: rgba(251, 113, 133, 0.16); color: #fecdd3; }
.strength-badge.functional { background: rgba(251, 146, 60, 0.16); color: #fed7aa; }
.strength-badge.model { background: rgba(250, 204, 21, 0.16); color: #fef08a; }
.strength-badge.contract { background: rgba(52, 211, 153, 0.16); color: #bbf7d0; }
.volatility-badge.low,
.detail-value.good { color: #bbf7d0; }
.volatility-badge.medium,
.detail-value.warning { color: #fef08a; }
.volatility-badge.high,
.detail-value.critical { color: #fecaca; }
.overview-issue,
.issue-item,
.hotspot-item,
.critical-issue-item,
.ranking-item,
.cluster-item,
.coupling-item,
.modal-item,
.item-list-item,
.tree-module,
.tree-item {
transition:
background-color var(--duration-fast) ease,
border-color var(--duration-fast) ease,
color var(--duration-fast) ease,
transform var(--duration-fast) ease,
opacity var(--duration-fast) ease;
}
.overview-issue:hover,
.issue-item:hover,
.hotspot-item:hover,
.critical-issue-item:hover,
.ranking-item:hover,
.cluster-item:hover,
.coupling-item:hover,
.modal-item:hover,
.item-list-item:hover,
.tree-module:hover,
.tree-item:hover {
background: rgba(56, 189, 248, 0.11);
border-color: rgba(125, 211, 252, 0.36);
}
.legend-item {
color: var(--text-secondary);
line-height: 1.4;
}
.legend-section code,
.balance-table {
border-color: rgba(148, 163, 184, 0.2);
}
.color-box,
.legend-color {
border: 1px solid rgba(248, 250, 252, 0.24);
box-shadow: inset 0 0 0 1px rgba(2, 6, 23, 0.18);
}
.report-view,
.tree-container {
background: var(--bg-primary);
}
.tree-container {
padding: 6.75rem var(--space-6) var(--space-6);
}
.tree-group,
.tree-filters {
background: rgba(17, 24, 39, 0.86);
border-color: rgba(148, 163, 184, 0.18);
}
.tree-module-name,
.tree-item-name,
.coupling-target,
.file-path-value,
.source-line,
.metric-chip strong {
letter-spacing: 0;
}
@media (max-width: 1180px) {
.health-header-card {
grid-template-columns: auto minmax(14rem, 1fr) auto;
}
.health-meta {
grid-column: 1 / -1;
justify-content: center;
}
}
@media (max-width: 780px) {
.header {
align-items: flex-start;
flex-wrap: wrap;
padding: var(--space-2) var(--space-3);
}
.header-left,
.header-right {
flex: 0 0 auto;
}
.header-stats {
order: 3;
flex-basis: 100%;
}
.health-header-card {
grid-template-columns: 1fr;
justify-items: stretch;
}
.health-grade-block,
.health-rationale,
.health-counts,
.health-meta {
justify-content: flex-start;
}
.canvas-toolbar {
top: 8.5rem;
left: var(--space-3);
right: var(--space-3);
transform: none;
flex-wrap: wrap;
}
.sidebar {
width: min(100vw, 384px);
}
}