From 48c9e4ddeb5eaf3fb44fc01a3a1343299f068def Mon Sep 17 00:00:00 2001 From: Nikolay Tatarinov Date: Fri, 6 Feb 2026 19:19:21 +0300 Subject: [PATCH] Implement gradient themes in CSS, enhance print functionality, and update card styles in templates. Add a PDF save button and improve layout for better accessibility and user experience. --- static/css/main.css | 271 +++++++++++++++++++++++++++---------------- templates/base.html | 11 +- templates/index.html | 10 +- 3 files changed, 183 insertions(+), 109 deletions(-) diff --git a/static/css/main.css b/static/css/main.css index 648b5d3..38b767d 100644 --- a/static/css/main.css +++ b/static/css/main.css @@ -1,102 +1,169 @@ -@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 0); - --color-base-200: oklch(98% 0 0); - --color-base-300: oklch(95% 0 0); - --color-base-content: oklch(21% 0.006 285.885); - --color-primary: #0A2896; - --color-primary-content: oklch(93% 0.034 272.788); - --color-secondary: #428BCA; - --color-secondary-content: oklch(100% 0 0); - --color-accent: #A492FF; - --color-accent-content: oklch(21% 0.006 285.885); - --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; -} - -@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(95% 0.01 260); - --color-primary: oklch(58% 0.2 270); - --color-primary-content: oklch(96% 0.02 272); - --color-secondary: oklch(62% 0.15 250); - --color-secondary-content: oklch(96% 0.02 250); - --color-accent: oklch(72% 0.18 280); - --color-accent-content: oklch(20% 0.02 280); - --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; -} - -/* 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); -} - -/* Accessibility: ensure focus ring is visible on key controls */ -.btn:focus-visible, -.select:focus-within, -label.swap:focus-within { - 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"; \ No newline at end of file +@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; +} + +@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); + --color-primary: #0a2973; + --color-primary-content: #ffffff; + --color-secondary: #009fdf; + --color-secondary-content: #ffffff; + --color-accent: #009fdf; + --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; +} + +/* 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); +} + +/* 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) --- */ +@media print { + .no-print { + display: none !important; + } + .print-only { + display: block !important; + } + /* Keep card backgrounds and colors when printing */ + .card, + main, + .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; + } + /* Reduce top padding so content starts higher */ + main { + padding-top: 0.5rem !important; + } +} +@media screen { + .print-only { + display: none !important; + } +} \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index 90164fe..c5f1a08 100644 --- a/templates/base.html +++ b/templates/base.html @@ -21,9 +21,15 @@ SWatcher