/* DM Sans – local webfonts (no external requests) */ @font-face { font-family: 'DM Sans'; font-style: normal; font-display: swap; font-weight: 400; src: url('../fonts/dm-sans-latin-400-normal.woff2') format('woff2'); } @font-face { font-family: 'DM Sans'; font-style: normal; font-display: swap; font-weight: 500; src: url('../fonts/dm-sans-latin-500-normal.woff2') format('woff2'); } @font-face { font-family: 'DM Sans'; font-style: normal; font-display: swap; font-weight: 600; src: url('../fonts/dm-sans-latin-600-normal.woff2') format('woff2'); } @font-face { font-family: 'DM Sans'; font-style: normal; font-display: swap; font-weight: 700; src: url('../fonts/dm-sans-latin-700-normal.woff2') format('woff2'); } @font-face { font-family: 'DM Sans'; font-style: italic; font-display: swap; font-weight: 400; src: url('../fonts/dm-sans-latin-400-italic.woff2') format('woff2'); } @font-face { font-family: 'DM Sans'; font-style: italic; font-display: swap; font-weight: 500; src: url('../fonts/dm-sans-latin-500-italic.woff2') format('woff2'); } @font-face { font-family: 'DM Sans'; font-style: italic; font-display: swap; font-weight: 600; src: url('../fonts/dm-sans-latin-600-italic.woff2') format('woff2'); } @font-face { font-family: 'DM Sans'; font-style: italic; font-display: swap; font-weight: 700; src: url('../fonts/dm-sans-latin-700-italic.woff2') format('woff2'); } @import "tailwindcss"; @plugin "daisyui"; @theme { --font-sans: "DM Sans", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; } @plugin "daisyui/theme" { name: "light"; default: true; prefersdark: false; color-scheme: "light"; --color-base-100: oklch(100% 0.004 260); --color-base-200: oklch(98% 0.004 260); --color-base-300: oklch(95% 0.004 260); --color-base-content: oklch(22% 0.02 260); --color-primary: #0a2973; --color-primary-content: #ffffff; --color-secondary: #009fdf; --color-secondary-content: #ffffff; --color-accent: #009fdf; --color-accent-content: #ffffff; --color-neutral: #333333; --color-neutral-content: oklch(92% 0.004 286.32); --color-info: oklch(74% 0.16 232.661); --color-info-content: oklch(29% 0.066 243.157); --color-success: oklch(76% 0.177 163.223); --color-success-content: oklch(37% 0.077 168.94); --color-warning: oklch(82% 0.189 84.429); --color-warning-content: oklch(41% 0.112 45.904); --color-error: oklch(71% 0.194 13.428); --color-error-content: oklch(27% 0.105 12.094); --radius-selector: 0.5rem; --radius-field: 0.25rem; --radius-box: 0.5rem; --size-selector: 0.25rem; --size-field: 0.25rem; --border: 1px; --depth: 1; --noise: 0; --chart-grid-color: color-mix(in oklch, var(--color-base-content) 10%, transparent); } @plugin "daisyui/theme" { name: "dark"; default: false; prefersdark: true; color-scheme: "dark"; --color-base-100: oklch(22% 0.014 260); --color-base-200: oklch(19% 0.012 260); --color-base-300: oklch(16% 0.01 260); --color-base-content: oklch(96% 0.01 260); /* Lighter primary/secondary for readability on dark background (cards, progress, %) */ --color-primary: oklch(65% 0.2 260); --color-primary-content: #ffffff; --color-secondary: oklch(72% 0.16 230); --color-secondary-content: #ffffff; --color-accent: oklch(72% 0.16 230); --color-accent-content: #ffffff; --color-neutral: oklch(28% 0.02 260); --color-neutral-content: oklch(92% 0.004 286.32); --color-info: oklch(74% 0.16 232.661); --color-info-content: oklch(29% 0.066 243.157); --color-success: oklch(76% 0.177 163.223); --color-success-content: oklch(37% 0.077 168.94); --color-warning: oklch(82% 0.189 84.429); --color-warning-content: oklch(41% 0.112 45.904); --color-error: oklch(71% 0.194 13.428); --color-error-content: oklch(27% 0.105 12.094); --radius-selector: 0.5rem; --radius-field: 0.25rem; --radius-box: 0.5rem; --size-selector: 0.25rem; --size-field: 0.25rem; --border: 1px; --depth: 1; --noise: 0; --chart-grid-color: color-mix(in oklch, var(--color-base-content) 10%, transparent); } /* VTB gradient (both themes) */ :root { --gradient-vtb: linear-gradient(135deg, #0a2973 0%, #009fdf 100%); } /* Gradient top border for cards */ .border-t-gradient-vtb { position: relative; } .border-t-gradient-vtb::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: var(--gradient-vtb); border-radius: var(--radius-box) var(--radius-box) 0 0; } /* Gradient button (e.g. Load Analysis) */ .btn-gradient-vtb { background: var(--gradient-vtb); color: #ffffff; border: none; } .btn-gradient-vtb:hover { opacity: 0.9; color: #ffffff; } /* Main content area: distinct background so cards (base-100) stand out */ [data-theme=light] main { background-color: var(--color-base-200); } [data-theme=dark] main { background-color: var(--color-base-200); } /* Dark theme: improve contrast for muted text and controls */ [data-theme=dark] .text-base-content\/60 { color: color-mix(in oklch, var(--color-base-content) 88%, transparent); } [data-theme=dark] .text-base-content\/70 { color: color-mix(in oklch, var(--color-base-content) 92%, transparent); } [data-theme=dark] .text-base-content\/30 { color: color-mix(in oklch, var(--color-base-content) 55%, transparent); } [data-theme=dark] .badge-outline { border-color: color-mix(in oklch, var(--color-base-content) 75%, transparent); color: color-mix(in oklch, var(--color-base-content) 90%, transparent); } [data-theme=dark] .badge-neutral { background-color: var(--color-base-300); color: var(--color-base-content); border-color: transparent; } [data-theme=dark] .btn-ghost { color: color-mix(in oklch, var(--color-base-content) 90%, transparent); } [data-theme=dark] .btn-ghost:hover { color: var(--color-base-content); background-color: color-mix(in oklch, var(--color-base-content) 12%, transparent); } /* Dark theme: better contrast for CPU chart stats (Mean, ±0.5σ) */ [data-theme=dark] section[aria-label="CPU distribution chart"] .text-success { color: oklch(85% 0.16 163); } [data-theme=dark] section[aria-label="CPU distribution chart"] .text-error\/60 { color: oklch(82% 0.18 13); } /* Accessibility: ensure focus ring is visible on key controls */ .btn:focus-visible, .select:focus-within, label.swap:focus-within:not(.theme-toggle) { outline: 2px solid var(--color-primary); outline-offset: 2px; } /* Light theme: slightly stronger card shadow for depth */ [data-theme=light] .card.shadow-sm { box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.08), 0 1px 2px -1px rgb(0 0 0 / 0.06); } [data-theme=light] .card.shadow-sm:hover { box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.08), 0 2px 4px -2px rgb(0 0 0 / 0.06); } @source "../../templates"; /* --- Print (Save as PDF) --- */ @page { size: A4; margin: 15mm; } @media print { /* Force printable area width (A4 minus margins) so layout doesn't use screen width */ html { width: 180mm !important; min-width: 180mm !important; max-width: 180mm !important; margin: 0 !important; padding: 0 !important; overflow-x: hidden !important; } body { width: 180mm !important; min-width: 180mm !important; max-width: 180mm !important; margin: 0 !important; padding: 0 !important; overflow-x: hidden !important; -webkit-print-color-adjust: exact; print-color-adjust: exact; box-sizing: border-box !important; } body *, body *::before, body *::after { box-sizing: border-box !important; } /* Allow flex/grid children to shrink so they don't force overflow */ body * { min-width: 0 !important; } .no-print { display: none !important; } .print-only { display: block !important; } /* Main and content: stay within body width */ main.container { width: 100% !important; max-width: 100% !important; margin: 0 !important; padding: 0.5rem 0.5rem 0 !important; min-width: 0 !important; } #dashboard-content { width: 100% !important; max-width: 100% !important; min-width: 0 !important; overflow-x: hidden !important; padding: 0.5rem 0 !important; } /* Keep card backgrounds and colors when printing */ .card, .badge, .progress { -webkit-print-color-adjust: exact; print-color-adjust: exact; } /* Avoid breaking cards and sections across pages */ .card { break-inside: avoid; page-break-inside: avoid; } section { break-inside: avoid; page-break-inside: avoid; } /* Tables: fit to page, allow column shrink */ .overflow-x-auto { max-width: 100% !important; overflow-x: visible !important; } .table { table-layout: fixed !important; width: 100% !important; max-width: 100% !important; } .table td, .table th { overflow: hidden; text-overflow: ellipsis; } /* Chart: constrain so it doesn't overflow (canvas has fixed size from Chart.js) */ section[aria-label="CPU distribution chart"] .card-body { max-width: 100% !important; overflow: hidden !important; } section[aria-label="CPU distribution chart"] .h-48, section[aria-label="CPU distribution chart"] [class*="h-48"] { max-width: 100% !important; min-height: 10rem !important; } section[aria-label="CPU distribution chart"] canvas { max-width: 100% !important; height: auto !important; } /* Navbar fits page width */ .navbar { width: 100% !important; max-width: 100% !important; } } @media screen { .print-only { display: none !important; } } /* Multi-line tooltip (formula): preserve newlines from data-tip */ .tooltip-formula[data-tip]::before { white-space: pre-line; text-align: left; }