Files
SQLLint/SQLLinter/Infrastructure/Reporters/Static/HtmlFormatter.css
FrigaT f988d9af1e
All checks were successful
CI / build-test (push) Successful in 31s
Release / pack-and-publish (release) Successful in 30s
Добавлена страница Summary
2025-12-27 03:05:01 +03:00

1681 lines
41 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
:root {
/* Colors - Light Theme */
--color-primary: #0078d4;
--color-primary-dark: #106ebe;
--color-primary-darker: #005a9e;
--color-primary-light: #c7e0f4;
--color-primary-lighter: #deecf9;
--color-text-primary: #323130;
--color-text-secondary: #605e5c;
--color-text-tertiary: #a19f9d;
--color-text-disabled: #c8c6c4;
--color-background: #ffffff;
--color-background-alt: #faf9f8;
--color-background-neutral: #f3f2f1;
--color-background-neutral-dark: #edebe9;
--color-border: #edebe9;
--color-border-strong: #d2d0ce;
--color-border-input: #8a8886;
--color-critical: #d13438;
--color-critical-bg: #fde7e9;
--color-warning: #ffaa44;
--color-warning-bg: #fff4ce;
--color-success: #107c10;
--color-success-bg: #dff6dd;
--color-info: #0078d4;
--color-info-bg: #c7e0f4;
--color-mermaid-node: #f0f8ff;
--color-mermaid-node-border: #0078d4;
--color-mermaid-cluster: #f3f2f1;
--color-mermaid-edge: #8a8886;
--color-mermaid-text: #323130;
/* Shadows (облегчённые) */
--shadow-2: 0 1px 2px rgba(0, 0, 0, 0.08);
--shadow-4: 0 2px 4px rgba(0, 0, 0, 0.12);
--shadow-8: 0 4px 8px rgba(0, 0, 0, 0.14);
--shadow-16: 0 8px 16px rgba(0, 0, 0, 0.16);
/* Spacing */
--spacing-xxs: 1px;
--spacing-xs: 4px;
--spacing-sm: 8px;
--spacing-md: 12px;
--spacing-lg: 16px;
--spacing-xl: 20px;
--spacing-xxl: 24px;
--spacing-xxxl: 32px;
/* Border Radius */
--border-radius-small: 2px;
--border-radius-medium: 4px;
--border-radius-large: 6px;
--border-radius-xlarge: 8px;
/* Typography */
--font-family: 'Segoe UI', 'Segoe UI Web (West European)', -apple-system, BlinkMacSystemFont, Roboto, 'Helvetica Neue', sans-serif;
--font-size-xxs: 10px;
--font-size-xs: 12px;
--font-size-sm: 13px;
--font-size-md: 14px;
--font-size-lg: 16px;
--font-size-xl: 18px;
--font-size-xxl: 20px;
--font-size-xxxl: 24px;
/* Transitions */
--transition-fast: 0.1s cubic-bezier(0.4, 0, 0.2, 1);
--transition-medium: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
--transition-slow: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
/* Z-index */
--z-index-base: 1;
--z-index-dropdown: 100;
--z-index-sticky: 200;
--z-index-fixed: 300;
--z-index-modal: 400;
--z-index-popover: 500;
--z-index-tooltip: 600;
}
/* Dark Theme Variables */
@media (prefers-color-scheme: dark) {
:root {
--color-primary: #2899f5;
--color-primary-dark: #3aa0f3;
--color-primary-darker: #6cb8f6;
--color-primary-light: #0f2b4d;
--color-primary-lighter: #1a365d;
--color-text-primary: #f3f2f1;
--color-text-secondary: #a19f9d;
--color-text-tertiary: #797775;
--color-text-disabled: #605e5c;
--color-background: #1e1e1e;
--color-background-alt: #2d2d2d;
--color-background-neutral: #3c3c3c;
--color-background-neutral-dark: #424242;
--color-border: #424242;
--color-border-strong: #616161;
--color-border-input: #797775;
--color-critical: #d13438;
--color-critical-bg: #4c191b;
--color-warning: #ffaa44;
--color-warning-bg: #4c3b1a;
--color-success: #107c10;
--color-success-bg: #1c3b1c;
--color-info: #2899f5;
--color-info-bg: #0f2b4d;
--color-mermaid-node: #2d2d2d;
--color-mermaid-node-border: #2899f5;
--color-mermaid-cluster: #201f1e;
--color-mermaid-edge: #797775;
--color-mermaid-text: #f3f2f1;
}
}
/* ---------------------------------------------------------
RESET & BASE STYLES
--------------------------------------------------------- */
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
font-size: 100%;
-webkit-text-size-adjust: 100%;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
scroll-behavior: smooth;
}
body {
font-family: var(--font-family);
font-size: var(--font-size-md);
line-height: 1.5;
color: var(--color-text-primary);
background-color: var(--color-background-neutral);
margin: 0;
padding: 0;
overflow-x: hidden;
}
/* ---------------------------------------------------------
TYPOGRAPHY
--------------------------------------------------------- */
h3 {
font-size: var(--font-size-xl);
font-weight: 600;
line-height: 1.3;
margin-bottom: var(--spacing-md);
color: var(--color-text-primary);
}
/* ---------------------------------------------------------
FILE REPORTS & LAYOUT
--------------------------------------------------------- */
main#main-content {
min-height: 100vh;
}
/* Основной контейнер отчёта по файлу */
.file-report {
display: none;
padding-bottom: 120px;
animation: fadeIn var(--transition-slow);
}
.file-report.active {
display: block;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(6px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Заголовок файла */
.file-title-container {
padding: var(--spacing-xl) var(--spacing-xl) var(--spacing-lg);
border-bottom: 1px solid var(--color-border);
background-color: var(--color-background);
position: sticky;
top: 0;
z-index: var(--z-index-sticky);
box-shadow: var(--shadow-2);
}
.file-title {
display: flex;
align-items: center;
gap: var(--spacing-md);
font-size: var(--font-size-xl);
font-weight: 600;
color: var(--color-text-primary);
}
.file-title svg {
flex-shrink: 0;
opacity: 0.8;
}
.file-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Состояние без нарушений */
.no-violations {
display: flex;
align-items: center;
justify-content: center;
min-height: 300px;
padding: var(--spacing-xl);
}
.no-violations-content {
text-align: center;
max-width: 400px;
}
.no-violations-icon {
font-size: 48px;
margin-bottom: var(--spacing-md);
color: var(--color-success);
}
.no-violations-title {
font-size: 20px;
font-weight: 600;
margin-bottom: var(--spacing-sm);
color: var(--color-text-primary);
}
.no-violations-description {
color: var(--color-text-secondary);
line-height: 1.6;
}
/* ---------------------------------------------------------
SEVERITY SECTIONS
--------------------------------------------------------- */
.severity-section {
margin: var(--spacing-xl) var(--spacing-xxxl);
padding: var(--spacing-xl);
background-color: var(--color-background);
border-radius: var(--border-radius-large);
box-shadow: var(--shadow-4);
border-top: 4px solid transparent;
transition: transform var(--transition-medium), box-shadow var(--transition-medium);
}
.severity-section:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-8);
}
.severity-section.critical {
border-top-color: var(--color-critical);
}
.severity-section.warning {
border-top-color: var(--color-warning);
}
.severity-section.info {
border-top-color: var(--color-info);
}
.severity-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: var(--spacing-xl);
padding-bottom: var(--spacing-md);
border-bottom: 1px solid var(--color-border);
}
.severity-title {
display: flex;
align-items: center;
gap: var(--spacing-sm);
}
.severity-count {
background-color: var(--color-background-neutral);
color: var(--color-text-secondary);
font-size: var(--font-size-sm);
font-weight: 600;
padding: var(--spacing-xs) var(--spacing-sm);
border-radius: var(--border-radius-medium);
min-width: 24px;
text-align: center;
border: 1px solid var(--color-border);
}
.severity-section.critical .severity-count {
background-color: var(--color-critical-bg);
color: var(--color-critical);
border-color: var(--color-critical);
}
.severity-section.warning .severity-count {
background-color: var(--color-warning-bg);
color: var(--color-warning);
border-color: var(--color-warning);
}
.severity-section.info .severity-count {
background-color: var(--color-info-bg);
color: var(--color-info);
border-color: var(--color-info);
}
/* ---------------------------------------------------------
TABLES
--------------------------------------------------------- */
.table-container {
overflow-x: auto;
border-radius: var(--border-radius-medium);
border: 1px solid var(--color-border);
background-color: var(--color-background);
}
.table-container table {
width: 100%;
border-collapse: separate;
border-spacing: 0;
font-size: var(--font-size-sm);
min-width: 100%;
}
.table-container thead {
background-color: var(--color-background-alt);
position: sticky;
top: 0;
z-index: var(--z-index-base);
}
th {
font-weight: 600;
text-align: left;
color: var(--color-text-primary);
padding: var(--spacing-md) var(--spacing-lg);
border-bottom: 2px solid var(--color-border);
white-space: nowrap;
position: sticky;
top: 0;
z-index: 10;
background-color: var(--color-background-alt);
}
td {
padding: var(--spacing-md) var(--spacing-lg);
border-bottom: 1px solid var(--color-border);
color: var(--color-text-primary);
vertical-align: top;
}
tbody tr {
transition: background-color var(--transition-fast);
}
tbody tr:last-child td {
border-bottom: none;
}
/* Table cell specific styles */
td.line,
td.column {
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
font-size: var(--font-size-xs);
color: var(--color-text-secondary);
text-align: center;
width: 60px;
font-feature-settings: "tnum";
font-variant-numeric: tabular-nums;
}
td.index {
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
font-size: var(--font-size-xs);
color: var(--color-text-tertiary);
text-align: center;
width: 40px;
font-feature-settings: "tnum";
font-variant-numeric: tabular-nums;
}
td.rule {
font-weight: 600;
color: var(--color-text-primary);
width: 250px;
}
td.description {
color: var(--color-text-primary);
line-height: 1.4;
}
/* Подсветка строк в зависимости от severity */
.severity-section.critical tbody tr {
border-left: 3px solid var(--color-critical);
}
.severity-section.critical tbody tr:hover {
background-color: rgba(209, 52, 56, 0.06);
}
.severity-section.warning tbody tr {
border-left: 3px solid var(--color-warning);
}
.severity-section.warning tbody tr:hover {
background-color: rgba(255, 170, 68, 0.06);
}
.severity-section.info tbody tr {
border-left: 3px solid var(--color-info);
}
.severity-section.info tbody tr:hover {
background-color: rgba(0, 120, 212, 0.06);
}
/* ---------------------------------------------------------
TABS NAVIGATION
--------------------------------------------------------- */
.tabs-container {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background-color: var(--color-background);
border-top: 1px solid var(--color-border);
box-shadow: 0 -2px 6px rgba(0, 0, 0, 0.08);
z-index: var(--z-index-fixed);
padding: var(--spacing-sm) var(--spacing-xxxl);
}
.tabs {
display: flex;
gap: var(--spacing-xs);
overflow-x: auto;
overflow-y: hidden;
scrollbar-width: thin;
padding: var(--spacing-xs) 0;
cursor: grab;
scroll-behavior: smooth;
flex-wrap: nowrap;
width: 100%;
-webkit-overflow-scrolling: touch; /* Для плавного скролла на iOS */
user-select: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-webkit-touch-callout: none;
/*white-space: nowrap;*/
height: auto; /* Автоматическая высота */
min-height: 50px; /* Минимальная высота */
}
.tabs:active {
cursor: grabbing;
}
.tabs::-webkit-scrollbar {
height: 6px;
}
.tabs::-webkit-scrollbar-track {
background: var(--color-background-neutral);
border-radius: var(--border-radius-medium);
}
.tabs::-webkit-scrollbar-thumb {
background: var(--color-border-strong);
border-radius: var(--border-radius-medium);
}
.tabs::-webkit-scrollbar-thumb:hover {
background: var(--color-text-tertiary);
}
.tab {
position: relative;
padding: var(--spacing-sm) var(--spacing-md);
background: none;
border: none;
border-bottom: 2px solid transparent;
color: var(--color-text-secondary);
font-family: var(--font-family);
font-size: var(--font-size-md);
font-weight: 600;
cursor: pointer;
white-space: normal; /* Изменено с nowrap на normal */
transition: color var(--transition-medium), background-color var(--transition-medium), border-color var(--transition-medium), transform var(--transition-medium);
border-radius: var(--border-radius-medium) var(--border-radius-medium) 0 0;
min-height: auto;
display: flex;
align-items: flex-start; /* Важно: flex-start вместо center */
z-index: 1002;
user-select: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
justify-content: space-between;
flex-shrink: 0;
max-width: 300px; /* Ограничиваем максимальную ширину */
min-width: 150px; /* Минимальная ширина для читаемости */
text-align: left;
line-height: 1.4;
}
.tab:hover {
background-color: var(--color-background-neutral);
color: var(--color-text-primary);
}
.tab.active {
color: var(--color-primary);
border-bottom-color: var(--color-primary);
background-color: var(--color-background-neutral);
}
.tab-inner {
display: flex;
align-items: flex-start;
justify-content: space-between;
width: 100%;
min-width: 0; /* Важно для работы text-overflow */
gap: 8px;
}
.tab-counters {
display: flex;
flex-direction: column;
gap: 2px;
margin-left: 8px;
justify-content: flex-start;
align-items: flex-end;
flex-shrink: 0;
min-height: 32px; /* Минимальная высота для трех счетчиков с отступами */
}
.tab-counter {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 16px;
height: 16px;
padding: 0 var(--spacing-xxs);
font-size: var(--font-size-xxs);
font-weight: 400;
border-radius: var(--border-radius-small);
text-align: center;
color: white;
line-height: 1;
border: 1px solid var(--color-border);
font-feature-settings: "tnum";
font-variant-numeric: tabular-nums;
flex-shrink: 0;
box-sizing: border-box;
}
.tab-counter.empty {
background-color: transparent !important;
color: transparent !important;
border-style: dashed !important;
opacity: 0.5;
cursor: default;
box-shadow: none !important;
text-shadow: none !important;
background-image: none !important;
}
/* Цветные пунктирные границы для пустых счетчиков */
.tab-counter.critical.empty {
border-color: var(--color-critical) !important;
}
.tab-counter.warning.empty {
border-color: var(--color-warning) !important;
}
.tab-counter.info.empty {
border-color: var(--color-info) !important;
}
.tab-counter.critical:not(.empty) {
background-color: var(--color-critical-bg);
color: var(--color-critical);
border-color: var(--color-critical);
}
.tab-counter.warning:not(.empty) {
background-color: var(--color-warning-bg);
color: var(--color-warning);
border-color: var(--color-warning);
}
.tab-counter.info:not(.empty) {
background-color: var(--color-info-bg);
color: var(--color-info);
border-color: var(--color-info);
}
/* При наведении на таб не менять стили пустых счетчиков */
.tab:hover .tab-counter.empty {
background-color: transparent !important;
color: transparent !important;
opacity: 0.5;
}
/* Активный таб тоже не должен влиять на пустые счетчики */
.tab.active .tab-counter.empty {
background-color: transparent !important;
color: transparent !important;
opacity: 0.5;
}
/* Сохраняем прозрачный текст для пустых счетчиков */
.tab-counter.empty::after {
content: '';
display: block;
width: 0;
height: 0;
}
.tab-text {
display: block;
overflow-wrap: break-word; /* Используем вместо word-break */
word-wrap: break-word; /* Для старых браузеров */
hyphens: auto; /* Автоматическое добавление переносов */
text-align: left;
line-height: 1.3;
white-space: normal;
flex-grow: 1;
min-width: 0;
word-break: break-word; /* Разрешаем разрыв длинных слов */
max-height: 2.8em; /* Примерно 2 строки текста */
display: -webkit-box;
-webkit-line-clamp: 2; /* Ограничиваем 2 строками */
-webkit-box-orient: vertical;
overflow: hidden;
}
/* Адаптивные стили для мобильных */
@media (max-width: 768px) {
.tab {
padding: 8px 10px;
font-size: 13px;
min-width: 120px;
max-width: 200px;
}
.tab-text {
font-size: 13px;
line-height: 1.2;
}
.tab-counters {
margin-left: 8px;
gap: 2px;
min-height: 55px; /* Немного меньше для мобильных */
}
.tab-counter {
min-width: 18px;
height: 18px;
font-size: 10px;
padding: 0 4px;
}
.tab-counter.empty {
opacity: 0.2;
}
}
@media (max-width: 480px) {
.tab {
padding: 6px 8px;
font-size: 12px;
min-width: 100px;
max-width: 160px;
}
.tab-text {
font-size: 12px;
max-height: 2.4em;
}
.tab-counters {
margin-left: 6px;
gap: 1px;
min-height: 50px;
}
.tab-counter {
min-width: 16px;
height: 16px;
font-size: 9px;
padding: 0 3px;
}
.tab-counter.empty {
border-width: 1px !important; /* Уменьшаем толщину границы */
}
}
/* Усилить видимость пунктирных границ на темных темах */
@media (prefers-color-scheme: dark) {
.tab-counter.empty {
opacity: 0.7;
}
.tab-counter.critical.empty {
border-color: var(--color-critical) !important;
}
.tab-counter.warning.empty {
border-color: var(--color-warning) !important;
}
.tab-counter.info.empty {
border-color: var(--color-info) !important;
}
}
/* Усилить видимость пунктирных границ при наведении на таб */
.tab:hover .tab-counter.empty {
opacity: 0.8;
border-style: dashed !important;
}
/* Активный таб - усилить видимость */
.tab.active .tab-counter.empty {
opacity: 0.8;
}
/* ---------------------------------------------------------
DIAGRAM VIEWER
--------------------------------------------------------- */
#mermaid.file-report {
position: fixed;
inset: 0;
width: 100vw;
height: 100vh;
background-color: var(--color-background);
z-index: var(--z-index-modal);
display: none;
padding: 0 !important;
margin: 0 !important;
}
#mermaid.file-report.active {
display: block;
}
/* Для диаграммы убираем заголовок */
#mermaid .file-title-container {
display: none;
}
/* Diagram Toolbar */
.diagram-toolbar {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 52px;
display: flex;
align-items: center;
gap: var(--spacing-md);
padding: var(--spacing-sm) var(--spacing-xxxl);
background-color: var(--color-background);
border-bottom: 1px solid var(--color-border);
box-shadow: var(--shadow-4);
z-index: var(--z-index-fixed);
}
.toolbar-search {
flex: 1;
max-width: 400px;
position: relative;
}
.toolbar-search input {
width: 100%;
padding: var(--spacing-md) var(--spacing-lg);
padding-right: 40px;
border: 1px solid var(--color-border-input);
border-radius: var(--border-radius-medium);
font-family: var(--font-family);
font-size: var(--font-size-md);
background-color: var(--color-background);
color: var(--color-text-primary);
transition: border-color var(--transition-medium), box-shadow var(--transition-medium), background-color var(--transition-medium);
}
.toolbar-search input:focus {
outline: none;
border-color: var(--color-primary);
box-shadow: 0 0 0 1px var(--color-primary-light);
}
.toolbar-search input::placeholder {
color: var(--color-text-tertiary);
}
.search-clear {
position: absolute;
right: var(--spacing-md);
top: 50%;
transform: translateY(-50%);
background: none;
border: none;
color: var(--color-text-tertiary);
cursor: pointer;
padding: var(--spacing-xs);
font-size: var(--font-size-sm);
opacity: 0.7;
transition: opacity var(--transition-fast), background-color var(--transition-fast);
border-radius: 50%;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
}
.search-clear:hover {
opacity: 1;
background-color: var(--color-background-neutral);
}
.toolbar-actions {
display: flex;
align-items: center;
gap: var(--spacing-sm);
margin-left: auto;
}
.toolbar-button {
padding: var(--spacing-md) var(--spacing-lg);
border: none;
border-radius: var(--border-radius-medium);
background-color: var(--color-primary);
color: #ffffff;
font-family: var(--font-family);
font-size: var(--font-size-md);
font-weight: 600;
cursor: pointer;
transition: background-color var(--transition-medium), box-shadow var(--transition-medium), transform var(--transition-medium);
display: inline-flex;
align-items: center;
gap: var(--spacing-sm);
min-height: 40px;
}
.toolbar-button:hover {
background-color: var(--color-primary-dark);
box-shadow: var(--shadow-4);
}
.toolbar-button:active {
background-color: var(--color-primary-darker);
transform: translateY(1px);
}
.toolbar-button.secondary {
background-color: transparent;
color: var(--color-text-primary);
border: 1px solid var(--color-border);
}
.toolbar-button.secondary:hover {
background-color: var(--color-background-neutral);
border-color: var(--color-border-strong);
}
/* Diagram Container */
#diagramContainer {
position: absolute;
top: 52px;
left: 0;
width: 100vw;
height: calc(100vh - 112px); /* 52px тулбар + ~60px табы */
overflow: hidden;
background-color: var(--color-background);
}
#diagramSvgContainer {
width: 100%;
height: 100%;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
#diagramSvgContainer svg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
cursor: grab;
overflow: visible;
display: block;
transition: transform 0.3s ease-out; /* Плавный переход при изменении масштаба */
}
#diagramSvgContainer svg:active {
cursor: grabbing;
}
/* Индикатор загрузки для диаграммы */
#diagramSvgContainer::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 40px;
height: 40px;
border: 3px solid var(--color-border);
border-top-color: var(--color-primary);
border-radius: 50%;
animation: spin 1s linear infinite;
z-index: 100;
opacity: 0;
transition: opacity 0.3s;
}
#diagramSvgContainer.loading::before {
opacity: 1;
}
@keyframes spin {
to {
transform: translate(-50%, -50%) rotate(360deg);
}
}
/* Minimap */
#minimap {
position: absolute;
right: var(--spacing-xxl);
bottom: 120px;
width: 200px;
height: 140px;
border: 1px solid var(--color-border-strong);
background-color: var(--color-background);
/* убран backdrop-filter для производительности */
border-radius: var(--border-radius-large);
box-shadow: var(--shadow-8);
z-index: var(--z-index-popover);
overflow: hidden;
}
@media (prefers-color-scheme: dark) {
#minimap {
background-color: var(--color-background-alt);
border-color: var(--color-border-input);
}
}
.minimap-viewport {
position: absolute;
border: 2px solid var(--color-primary);
background-color: rgba(0, 120, 212, 0.15);
pointer-events: none;
transition: all 0.1s ease;
box-sizing: border-box;
}
@media (prefers-color-scheme: dark) {
.minimap-viewport {
border-color: var(--color-primary);
background-color: rgba(40, 153, 245, 0.2);
}
}
/* Упрощаем отображение элементов в миникарте */
#minimap svg {
width: 100%;
height: 100%;
}
#minimap .node rect {
stroke-width: 1px !important;
rx: 2px !important;
ry: 2px !important;
}
#minimap .edgePath path {
stroke-width: 1px !important;
}
#minimap text {
font-size: 4px !important;
}
/* Search Results Info */
.search-results-info {
position: absolute;
top: 70px;
left: var(--spacing-xxl);
background: var(--color-background);
padding: var(--spacing-md) var(--spacing-lg);
border-radius: var(--border-radius-large);
box-shadow: var(--shadow-8);
border: 1px solid var(--color-border);
font-size: var(--font-size-sm);
z-index: var(--z-index-popover);
display: flex;
align-items: center;
gap: var(--spacing-md);
}
/* ---------------------------------------------------------
MERMAID DIAGRAM STYLING
--------------------------------------------------------- */
#diagramSvgContainer svg {
font-family: var(--font-family);
font-size: var(--font-size-md);
}
#diagramSvgContainer svg .label {
font-family: var(--font-family);
}
/* Nodes */
svg .node rect {
fill: var(--color-mermaid-node);
stroke: var(--color-mermaid-node-border);
stroke-width: 2px;
rx: 6px;
ry: 6px;
}
svg .node circle,
svg .node ellipse,
svg .node polygon {
fill: var(--color-primary-lighter);
stroke: var(--color-mermaid-node-border);
stroke-width: 2px;
}
svg .node text {
fill: var(--color-mermaid-text);
font-family: var(--font-family);
font-size: var(--font-size-md);
font-weight: 500;
}
/* Clusters */
svg .cluster rect {
fill: rgba(243, 242, 241, 0.9);
stroke: var(--color-text-tertiary);
stroke-width: 1.5px;
stroke-dasharray: 5, 5;
rx: 8px;
ry: 8px;
}
svg .cluster text {
fill: var(--color-text-secondary);
font-size: var(--font-size-lg);
font-weight: 600;
}
/* Arrow and Line Styling */
svg marker path {
fill: var(--color-mermaid-edge);
}
svg .arrowheadPath {
fill: var(--color-mermaid-edge) !important;
}
svg .edgePath path {
stroke: var(--color-mermaid-edge);
stroke-width: 2px;
fill: none;
}
svg .edgeLabel text {
fill: var(--color-mermaid-text);
font-size: var(--font-size-sm);
}
svg .edgeLabel rect {
fill: var(--color-background);
stroke: var(--color-border);
stroke-width: 1px;
rx: 4px;
ry: 4px;
}
/* Text Labels */
svg .label text {
font-size: var(--font-size-sm);
font-weight: 400;
}
/* Dark Theme Mermaid Styles */
@media (prefers-color-scheme: dark) {
svg .node rect {
fill: var(--color-mermaid-node);
stroke: var(--color-mermaid-node-border);
}
svg .node circle,
svg .node ellipse,
svg .node polygon {
fill: var(--color-background-neutral);
stroke: var(--color-mermaid-node-border);
}
svg .node text {
fill: var(--color-mermaid-text);
font-weight: 400;
}
svg .cluster rect {
fill: rgba(32, 31, 30, 0.9);
stroke: var(--color-text-tertiary);
stroke-dasharray: 5, 5;
}
svg .cluster text {
fill: var(--color-text-tertiary);
font-weight: 500;
}
svg .edgePath path {
stroke: var(--color-mermaid-edge);
}
svg .edgeLabel text {
fill: var(--color-mermaid-text);
}
svg .edgeLabel rect {
fill: var(--color-background-alt);
stroke: var(--color-border-strong);
}
svg .label text {
fill: var(--color-text-tertiary);
}
#diagramSvgContainer svg,
#diagramContainer {
background-color: var(--color-background);
}
}
/* Node Type Specific Styles */
svg .node.condition rect {
fill: var(--color-warning-bg);
stroke: var(--color-warning);
}
svg .node.process rect {
fill: var(--color-info-bg);
stroke: var(--color-info);
}
svg .node.start rect,
svg .node.end rect {
fill: var(--color-primary-lighter);
stroke: var(--color-primary);
}
svg .node.import rect {
fill: var(--color-success-bg);
stroke: var(--color-success);
}
svg .node.exec rect {
fill: #f0f0ff;
stroke: #4b4bd8;
}
@media (prefers-color-scheme: dark) {
svg .node.start rect,
svg .node.end rect {
fill: var(--color-primary-light);
stroke: var(--color-primary);
}
svg .node.exec rect {
fill: #2d2a4d;
stroke: #4b4bd8;
}
}
/* Node Highlighting (упрощённо, без тяжёлых фильтров) */
.node-search-match rect {
stroke: #ffc107 !important;
stroke-width: 3px !important;
}
.node-highlight rect {
stroke: #ff5722 !important;
stroke-width: 3px !important;
}
.node-search-active rect {
stroke: #4caf50 !important;
stroke-width: 3px !important;
}
/* Усиление видимости линий */
svg .edgePath,
svg .edgePath path,
svg .flowchart-link {
stroke: var(--color-mermaid-edge) !important;
stroke-width: 2.4px !important;
fill: none !important;
opacity: 1 !important;
vector-effect: non-scaling-stroke !important;
}
svg .edgePath:hover .path,
svg .edgePath:hover path {
stroke-width: 3px !important;
}
/* ---------------------------------------------------------
TOAST NOTIFICATIONS
--------------------------------------------------------- */
.toast {
position: fixed;
top: 80px;
right: var(--spacing-xxl);
background: var(--color-background);
color: var(--color-text-primary);
padding: var(--spacing-md) var(--spacing-lg);
border-radius: var(--border-radius-large);
box-shadow: var(--shadow-8);
border: 1px solid var(--color-border);
z-index: var(--z-index-tooltip);
display: flex;
align-items: center;
gap: var(--spacing-md);
max-width: 400px;
border-left: 4px solid var(--color-primary);
}
/* ---------------------------------------------------------
SCROLLBAR STYLING
--------------------------------------------------------- */
::-webkit-scrollbar {
width: 12px;
height: 12px;
}
::-webkit-scrollbar-track {
background: var(--color-background-neutral);
border-radius: var(--border-radius-medium);
}
::-webkit-scrollbar-thumb {
background: var(--color-border-strong);
border-radius: var(--border-radius-medium);
border: 3px solid var(--color-background-neutral);
}
::-webkit-scrollbar-thumb:hover {
background: var(--color-text-tertiary);
}
::-webkit-scrollbar-corner {
background: var(--color-background-neutral);
}
/* For Firefox */
* {
scrollbar-width: thin;
scrollbar-color: var(--color-border-strong) var(--color-background-neutral);
}
/* ---------------------------------------------------------
RESPONSIVE ADJUSTMENTS
--------------------------------------------------------- */
@media (max-width: 768px) {
.severity-section {
margin: var(--spacing-lg);
padding: var(--spacing-lg);
}
.tabs-container {
padding: var(--spacing-sm) var(--spacing-lg);
}
.diagram-toolbar {
padding: var(--spacing-sm) var(--spacing-lg);
}
.toolbar-actions {
flex-wrap: wrap;
justify-content: flex-end;
}
.toolbar-button {
padding: var(--spacing-sm) var(--spacing-md);
font-size: var(--font-size-sm);
}
#minimap {
right: var(--spacing-lg);
bottom: 100px;
width: 150px;
height: 105px;
}
.search-results-info {
left: var(--spacing-lg);
right: var(--spacing-lg);
max-width: none;
}
.toast {
right: var(--spacing-lg);
left: var(--spacing-lg);
max-width: none;
}
.file-title-container {
padding: var(--spacing-lg);
}
.file-title {
font-size: var(--font-size-lg);
}
#diagramContainer {
height: calc(100vh - 102px);
}
}
@media (max-width: 480px) {
:root {
--spacing-xxxl: 24px;
--spacing-xxl: 20px;
--spacing-xl: 16px;
--spacing-lg: 12px;
--spacing-md: 8px;
--spacing-sm: 6px;
--spacing-xs: 4px;
}
.severity-header {
flex-direction: column;
align-items: flex-start;
gap: var(--spacing-md);
}
.toolbar-search {
max-width: none;
}
.toolbar-actions {
width: 100%;
justify-content: space-between;
}
.tabs {
gap: 2px;
}
.tab {
padding: var(--spacing-sm) var(--spacing-md);
font-size: var(--font-size-sm);
}
}
/* ---------------------------------------------------------
PRINT STYLES
--------------------------------------------------------- */
@media print {
.tabs-container,
.diagram-toolbar,
#minimap,
.search-results-info,
.toast {
display: none !important;
}
body {
background-color: #ffffff;
color: #000000;
}
.file-report {
padding-bottom: 0;
display: block !important;
}
.severity-section {
break-inside: avoid;
box-shadow: none;
border: 1px solid #ddd;
}
table {
break-inside: avoid;
}
}
/* ---------------------------------------------------------
ACCESSIBILITY
--------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
:focus-visible {
outline: 2px solid var(--color-primary);
outline-offset: 2px;
border-radius: var(--border-radius-small);
}
::selection {
background-color: var(--color-primary);
color: #ffffff;
}
::-moz-selection {
background-color: var(--color-primary);
color: #ffffff;
}
/* Убираем blue highlight на mobile tap */
* {
-webkit-tap-highlight-color: transparent;
}
/* Summary page styles */
.summary-section {
margin: var(--spacing-xl) var(--spacing-xxxl);
padding: var(--spacing-xl);
background-color: var(--color-background);
border-radius: var(--border-radius-large);
box-shadow: var(--shadow-4);
transition: transform var(--transition-medium), box-shadow var(--transition-medium);
}
.summary-section:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-8);
}
.summary-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: var(--spacing-xl);
padding-bottom: var(--spacing-md);
border-bottom: 1px solid var(--color-border);
}
.summary-title {
display: flex;
align-items: center;
gap: var(--spacing-sm);
}
.summary-stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: var(--spacing-lg);
margin-bottom: var(--spacing-xl);
}
.stat-card {
padding: var(--spacing-lg);
border-radius: var(--border-radius-medium);
background-color: var(--color-background-alt);
border: 1px solid var(--color-border);
transition: all var(--transition-medium);
}
.stat-card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-8);
}
.stat-card.critical {
border-top: 4px solid var(--color-critical);
}
.stat-card.warning {
border-top: 4px solid var(--color-warning);
}
.stat-card.info {
border-top: 4px solid var(--color-info);
}
.stat-card.success {
border-top: 4px solid var(--color-success);
}
.stat-value {
font-size: var(--font-size-xxxl);
font-weight: 700;
margin-bottom: var(--spacing-xs);
line-height: 1;
}
.stat-label {
font-size: var(--font-size-sm);
color: var(--color-text-secondary);
margin-bottom: var(--spacing-xs);
}
.stat-change {
font-size: var(--font-size-xs);
display: flex;
align-items: center;
gap: 2px;
}
.stat-change.positive {
color: var(--color-success);
}
.stat-change.negative {
color: var(--color-critical);
}
.files-overview {
margin-top: var(--spacing-xxl);
}
.files-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: var(--spacing-lg);
}
.file-card {
padding: var(--spacing-lg);
border-radius: var(--border-radius-medium);
background-color: var(--color-background-alt);
border: 1px solid var(--color-border);
transition: all var(--transition-medium);
display: flex;
flex-direction: column;
}
.file-card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-8);
}
.file-card-header {
display: flex;
align-items: flex-start; /* Change from center to flex-start */
justify-content: space-between;
margin-bottom: var(--spacing-md);
gap: var(--spacing-sm); /* Add gap between name and badges */
}
.file-name-small {
font-weight: 600;
color: var(--color-text-primary);
/* Remove truncation properties */
overflow: visible;
text-overflow: clip;
white-space: normal; /* Change from nowrap to normal */
word-wrap: break-word;
word-break: break-word;
flex: 1;
line-height: 1.4;
max-height: none; /* Remove max-height if exists */
display: block; /* Change from -webkit-box */
-webkit-line-clamp: unset; /* Remove line clamp */
-webkit-box-orient: unset;
}
.file-violations {
display: flex;
gap: var(--spacing-xs);
justify-content: flex-end;
flex-shrink: 0;
align-items: flex-start; /* Align badges to top */
}
.violation-badge {
font-size: var(--font-size-xs);
padding: var(--spacing-xxs) var(--spacing-xs);
border-radius: var(--border-radius-small);
font-weight: 600;
}
.violation-badge.critical {
background-color: var(--color-critical-bg);
color: var(--color-critical);
border: 1px solid var(--color-critical);
}
.violation-badge.warning {
background-color: var(--color-warning-bg);
color: var(--color-warning);
border: 1px solid var(--color-warning);
}
.violation-badge.info {
background-color: var(--color-info-bg);
color: var(--color-info);
border: 1px solid var(--color-info);
}
.progress-bar {
height: 8px;
background-color: var(--color-background-neutral);
border-radius: var(--border-radius-small);
overflow: hidden;
margin-top: var(--spacing-md);
display: flex; /* Изменено с block на flex */
}
.progress-fill {
height: 100%;
transition: width var(--transition-medium);
flex-shrink: 0; /* Предотвращает сжатие */
}
.progress-fill.critical {
background-color: var(--color-critical);
order: 1;
}
.progress-fill.warning {
background-color: var(--color-warning);
order: 2;
}
.progress-fill.info {
background-color: var(--color-info);
order: 3;
}
@media (max-width: 768px) {
.summary-section {
margin: var(--spacing-lg);
padding: var(--spacing-lg);
}
.summary-stats-grid {
grid-template-columns: repeat(2, 1fr);
}
.files-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 480px) {
.summary-stats-grid {
grid-template-columns: 1fr;
}
.stat-value {
font-size: var(--font-size-xxl);
}
}