: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-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-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); min-width: 200px; } 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; scrollbar-width: thin; padding: var(--spacing-xs) 0; } .tab { position: relative; padding: var(--spacing-md) var(--spacing-lg); 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: nowrap; 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: 44px; display: flex; align-items: center; justify-content: center; z-index: 1002; } .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-badge { display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 var(--spacing-xs); margin-left: var(--spacing-xs); font-size: var(--font-size-xs); font-weight: 600; background-color: var(--color-background-neutral-dark); color: var(--color-text-secondary); border-radius: 10px; transition: background-color var(--transition-fast), color var(--transition-fast); } .tab.active .tab-badge { background-color: var(--color-primary); color: #ffffff; } /* --------------------------------------------------------- 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; }