From 49ab3c1fe40d94fbe6f957cc8d064cac631fa005 Mon Sep 17 00:00:00 2001 From: Cipher Vance Date: Sun, 31 Aug 2025 12:11:48 -0500 Subject: [PATCH] feat(ui): modern light theme, widgets, sticky footer, and refined components --- static/css/style.css | 357 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 304 insertions(+), 53 deletions(-) diff --git a/static/css/style.css b/static/css/style.css index b9c3f88..9dca122 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -1,55 +1,306 @@ +:root { + --primary: #2563eb; + --primary-hover: #1d4ed8; + --bg: #f5f7fb; + --bg-grad-1: #f8fbff; + --bg-grad-2: #eef3fb; + --surface: #ffffff; + --text: #0f172a; + --muted: #64748b; + --border: #e5e7eb; + --ring: rgba(37, 99, 235, 0.25); + --radius: 14px; + --shadow-1: 0 8px 24px rgba(15, 23, 42, 0.08); + --shadow-2: 0 14px 38px rgba(15, 23, 42, 0.12); +} + +*, +*::before, +*::after { + box-sizing: border-box; +} +html, body { + margin: 0; + padding: 0; +} body { - font-family: Arial, sans-serif; - padding: 20px; + font-family: Inter, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; + color: var(--text); + background: radial-gradient(1000px 650px at 0% 0%, var(--bg-grad-1), transparent 60%), + radial-gradient(900px 600px at 100% 0%, var(--bg-grad-2), transparent 55%), + var(--bg); + min-height: 100vh; +} + +.navbar { + position: sticky; + top: 0; + z-index: 1000; + background: rgba(255, 255, 255, 0.8); + backdrop-filter: blur(10px); + border-bottom: 1px solid rgba(15, 23, 42, 0.06); +} +.navbar-content { + max-width: 1100px; + margin: 0 auto; + padding: 14px 20px; + display: flex; + align-items: center; + justify-content: space-between; +} +.brand { + color: var(--text); + font-weight: 700; + text-decoration: none; + letter-spacing: 0.2px; +} +.navbar-links a { + color: var(--muted); + text-decoration: none; + margin-left: 14px; + padding: 8px 12px; + border-radius: 10px; + transition: all 0.2s ease; +} +.navbar-links a:hover { + color: var(--text); + background: rgba(15, 23, 42, 0.05); +} +.navbar-links .logout { + color: #b91c1c; +} +.navbar-links .logout:hover { + background: rgba(185, 28, 28, 0.08); +} + +.container { + max-width: 1100px; + margin: 28px auto 48px; + padding: 0 20px; + padding-bottom: 64px; +} + +.footer { + position: fixed; + left: 0; + right: 0; + bottom: 0; + z-index: 1000; + border-top: 1px solid rgba(15, 23, 42, 0.06); + background: rgba(255, 255, 255, 0.92); + backdrop-filter: blur(8px); +} + +.footer-inner { + max-width: 1100px; + margin: 0 auto; + padding: 14px 20px; + color: var(--muted); + font-size: 14px; +} + +.page-header { + margin-bottom: 18px; + display: flex; + align-items: end; + justify-content: space-between; + gap: 12px; + flex-wrap: wrap; +} +.page-title { + margin: 0 0 4px 0; + font-size: 26px; + font-weight: 700; +} +.page-subtitle { + margin: 0; + color: var(--muted); + font-size: 14px; +} +.page-actions { + display: flex; + gap: 10px; +} + +.card { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + box-shadow: var(--shadow-1); + padding: 20px; +} +.empty-state { + text-align: center; + color: var(--muted); +} + +.widgets { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 18px; +} +.widget-card { + background: linear-gradient(180deg, #fff, #fafcff); + border: 1px solid var(--border); + border-radius: var(--radius); + box-shadow: var(--shadow-1); + padding: 18px; +} +.widget-label { + color: var(--muted); + font-weight: 600; + font-size: 13px; + margin-bottom: 8px; +} +.widget-value { + font-size: 28px; + font-weight: 800; + letter-spacing: 0.3px; + color: var(--text); +} + +.table-wrap { + overflow: hidden; + border-radius: 12px; + border: 1px solid var(--border); +} +.table { + width: 100%; + border-collapse: collapse; + background: transparent; +} +.table thead th { + text-align: left; + font-weight: 600; + color: var(--muted); + font-size: 13px; + letter-spacing: 0.3px; + background: #f9fafb; + padding: 12px 14px; + border-bottom: 1px solid var(--border); +} +.table tbody td { + padding: 14px; + border-bottom: 1px solid #f1f5f9; +} +.table tbody tr:hover td { + background: #f9fbff; + transition: background 0.15s ease; +} + +.form { + display: grid; + gap: 16px; +} +.form-group { + display: grid; + gap: 8px; +} +.form-group label { + font-weight: 600; + color: #334155; + font-size: 14px; +} +.form-group input, +.form-group textarea { + width: 100%; + color: var(--text); + background: #ffffff; + border: 1px solid var(--border); + border-radius: 12px; + padding: 12px 14px; + font-size: 15px; + transition: box-shadow 0.2s ease, border-color 0.2s ease, background 0.2s ease; +} +.form-group textarea { + resize: vertical; + min-height: 160px; +} +.form-group input:focus, +.form-group textarea:focus { + outline: none; + border-color: #a7c2ff; + box-shadow: 0 0 0 4px var(--ring); + background: #ffffff; +} +.form-actions { + display: flex; + gap: 10px; + justify-content: flex-end; +} + +.button { + appearance: none; + border: 1px solid var(--border); + background: #ffffff; + color: var(--text); + border-radius: 12px; + padding: 10px 14px; + cursor: pointer; + font-weight: 600; + transition: transform 0.05s ease, background 0.2s ease, border 0.2s ease; +} +.button:hover { + background: #f5f7fb; +} +.button:active { + transform: translateY(1px); +} +.button-primary { + color: #ffffff; + background: linear-gradient(180deg, #3b82f6, var(--primary)); + border-color: rgba(37, 99, 235, 0.4); +} +.button-primary:hover { + background: linear-gradient(180deg, #2f74ed, var(--primary-hover)); +} +.button-secondary { + background: #ffffff; +} + +.flash-stack { + display: grid; + gap: 10px; + margin-bottom: 18px; +} +.flash { + border-radius: 12px; + padding: 12px 14px; + font-weight: 600; + border: 1px solid var(--border); + background: #ffffff; +} +.flash-success { + border-color: #a7f3d0; + background: #ecfdf5; + color: #065f46; +} +.flash-danger, +.flash-error { + border-color: #fecaca; + background: #fef2f2; + color: #991b1b; +} +.flash-warning { + border-color: #fde68a; + background: #fffbeb; + color: #92400e; +} + +.auth-wrapper { + display: grid; + place-items: center; + min-height: calc(100vh - 120px); + padding-top: 40px; +} +.auth-card { + max-width: 420px; + width: 100%; +} + +@media (max-width: 900px) { + .widgets { + grid-template-columns: 1fr; } - - table { - border-collapse: collapse; - width: 100%; - } - - th, - td { - border: 1px solid #ddd; - padding: 8px; - text-align: left; - } - - th { - background-color: #f2f2f2; - } - - a { - margin-right: 10px; - } - - form { - max-width: 600px; - margin: 0 auto; - } - - label { - display: block; - margin-top: 15px; - } - - input[type="text"], - input[type="password"], - textarea { - width: 100%; - padding: 8px; - } - - button { - margin-top: 15px; - padding: 10px 20px; - } - - .flash { - background-color: #f8d7da; - color: #721c24; - padding: 10px; - margin-bottom: 10px; - text-align: center; - } - \ No newline at end of file +} \ No newline at end of file