: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;
}
* {
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: linear-gradient(to bottom, #1e293b, var(--bg-secondary));
border-bottom: 1px solid var(--border-color);
gap: 1rem;
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 500;
transform: translateY(-100%);
transition: transform 0.3s ease;
}
.header:hover,
.header.visible {
transform: translateY(0);
}
.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;
background: linear-gradient(135deg, #3b82f6, #8b5cf6);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.header-stats {
display: flex;
gap: 1.5rem;
flex: 1;
justify-content: center;
}
.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);
}
.health-grade {
padding: 0.25rem 0.75rem;
border-radius: 0.375rem;
font-weight: 700;
font-size: 1rem;
}
.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; }
.main {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1;
}
.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%;
}
.sidebar {
width: 360px;
min-width: 280px;
max-width: 800px;
background: var(--bg-secondary);
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 20px rgba(0,0,0,0.3);
}
.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);
}
.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;
}
.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;
}
.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;
overflow-x: auto;
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-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;
}
.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) {
.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;
}