diff --git a/SQLLinter/Infrastructure/Reporters/HtmlMinifier.cs b/SQLLinter/Infrastructure/Reporters/HtmlMinifier.cs index c601224..6117201 100644 --- a/SQLLinter/Infrastructure/Reporters/HtmlMinifier.cs +++ b/SQLLinter/Infrastructure/Reporters/HtmlMinifier.cs @@ -5,6 +5,11 @@ public static class HtmlMinifier { public static string MinifyHtml(string html) { + + var htmlMinifier = new WebMarkupMin.Core.HtmlMinifier(); + var result = htmlMinifier.Minify(html, generateStatistics: true); + return result.MinifiedContent; + if (string.IsNullOrEmpty(html)) return html; diff --git a/SQLLinter/Infrastructure/Reporters/Static/HtmlFormatter.css b/SQLLinter/Infrastructure/Reporters/Static/HtmlFormatter.css index 82a8d63..799400a 100644 --- a/SQLLinter/Infrastructure/Reporters/Static/HtmlFormatter.css +++ b/SQLLinter/Infrastructure/Reporters/Static/HtmlFormatter.css @@ -1445,3 +1445,237 @@ svg .flowchart-link { * { -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); + } +} \ No newline at end of file diff --git a/SQLLinter/Infrastructure/Reporters/Static/HtmlFormatter.js b/SQLLinter/Infrastructure/Reporters/Static/HtmlFormatter.js index 16a1ae8..a40f2e3 100644 --- a/SQLLinter/Infrastructure/Reporters/Static/HtmlFormatter.js +++ b/SQLLinter/Infrastructure/Reporters/Static/HtmlFormatter.js @@ -35,6 +35,7 @@ class ReportRenderer { this.tabsList.innerHTML = ''; + //Add file tabs this.files.forEach((file, index) => { const tab = document.createElement('button'); tab.className = `tab ${index === 0 ? 'active' : ''}`; @@ -65,23 +66,23 @@ class ReportRenderer { this.tabsList.appendChild(tab); }); + // Add Summary tab + const summaryTab = document.createElement('button'); + summaryTab.className = 'tab'; + summaryTab.dataset.target = 'summary_report'; + summaryTab.innerHTML = `