diff options
| author | Christian Cleberg <[email protected]> | 2026-02-21 23:46:01 -0600 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-02-21 23:46:01 -0600 |
| commit | 59ab9790e2f03046ca7fef31a6db883e1ec31075 (patch) | |
| tree | fb6962a5410ef9a614accd49fb769fc434fc42f3 /assets/css/app.css | |
| parent | 4ba605214e407d49f5ebd80b42767d92c60a7bc9 (diff) | |
| download | 401k-59ab9790e2f03046ca7fef31a6db883e1ec31075.tar.gz 401k-59ab9790e2f03046ca7fef31a6db883e1ec31075.tar.bz2 401k-59ab9790e2f03046ca7fef31a6db883e1ec31075.zip | |
modernize site and migrate to TypeScript
Diffstat (limited to 'assets/css/app.css')
| -rw-r--r-- | assets/css/app.css | 371 |
1 files changed, 261 insertions, 110 deletions
diff --git a/assets/css/app.css b/assets/css/app.css index 5ecf69a..f0458bc 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -1,147 +1,298 @@ -html { - scroll-behavior: smooth; +/* ── Base ─────────────────────────────────────────────────────────────── */ +:root { + --color-bg: #f4f6f9; + --color-surface: #ffffff; + --color-surface-alt: #f8f9fb; + --color-border: #e2e6ea; + --color-text: #1a1d23; + --color-text-muted: #6b7280; + --color-accent: #4f6ef7; + --color-accent-hover:#3a58e0; + --color-green: #22c55e; + --color-blue: #3b82f6; + --radius: 12px; + --radius-sm: 8px; + --shadow: 0 1px 3px rgba(0,0,0,.08), 0 4px 16px rgba(0,0,0,.06); + --shadow-lg: 0 4px 6px rgba(0,0,0,.07), 0 10px 40px rgba(0,0,0,.1); + --transition: 180ms ease; } -h1, h2, h3, h4, h5, h6 { +@media (prefers-color-scheme: dark) { + :root { + --color-bg: #0f1117; + --color-surface: #1a1d27; + --color-surface-alt: #21242f; + --color-border: #2d3141; + --color-text: #e8eaf0; + --color-text-muted: #8b92a5; + --color-accent: #6c8aff; + --color-accent-hover:#849dff; + --shadow: 0 1px 3px rgba(0,0,0,.3), 0 4px 16px rgba(0,0,0,.25); + --shadow-lg: 0 4px 6px rgba(0,0,0,.3), 0 10px 40px rgba(0,0,0,.4); + } +} + +*, *::before, *::after { box-sizing: border-box; } + +html { scroll-behavior: smooth; } + +body { + background: var(--color-bg); + color: var(--color-text); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 1rem; + line-height: 1.6; + -webkit-font-smoothing: antialiased; +} + +/* ── Layout ──────────────────────────────────────────────────────────── */ +.app-container { + max-width: 900px; + margin: 0 auto; + padding: 2rem 1rem 4rem; +} + +/* ── App header ──────────────────────────────────────────────────────── */ +.app-header { + text-align: center; + padding: 3rem 1rem 2rem; +} + +.app-header h1 { + font-size: clamp(1.8rem, 4vw, 2.8rem); + font-weight: 800; + letter-spacing: -0.03em; + color: var(--color-text); + margin: 0 0 0.5rem; +} + +.app-header p { + color: var(--color-text-muted); + font-size: 1.05rem; + margin: 0; +} + +/* ── Cards ───────────────────────────────────────────────────────────── */ +.panel { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius); + box-shadow: var(--shadow); + padding: 2rem; + margin-bottom: 1.5rem; +} + +/* ── Section label ───────────────────────────────────────────────────── */ +.section-label { + font-size: 0.7rem; font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; + color: var(--color-text-muted); + margin: 0 0 1.25rem; } -a:focus { +/* ── Form grid ───────────────────────────────────────────────────────── */ +.form-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1rem; +} + +@media (max-width: 540px) { + .form-grid { grid-template-columns: 1fr; } +} + +.field label { + display: block; + font-size: 0.85rem; + font-weight: 600; + color: var(--color-text-muted); + margin-bottom: 0.4rem; +} + +.field input { + width: 100%; + padding: 0.65rem 0.9rem; + font-size: 1rem; + color: var(--color-text); + background: var(--color-surface-alt); + border: 1.5px solid var(--color-border); + border-radius: var(--radius-sm); outline: none; + transition: border-color var(--transition), box-shadow var(--transition); + -moz-appearance: textfield; } -.card { - margin: 4rem auto; +.field input::-webkit-outer-spin-button, +.field input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; } -.card-header { - padding: 2rem 0; +.field input::placeholder { color: var(--color-text-muted); opacity: 0.6; } + +.field input:focus { + border-color: var(--color-accent); + box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-accent) 20%, transparent); } -.card-body { - padding: 2rem; +/* ── Divider ─────────────────────────────────────────────────────────── */ +.divider { + display: flex; + align-items: center; + gap: 0.75rem; + margin: 1.75rem 0; + color: var(--color-text-muted); + font-size: 0.8rem; + font-weight: 600; + letter-spacing: 0.05em; + text-transform: uppercase; } -.graphCard { - display: none; +.divider::before, +.divider::after { + content: ""; + flex: 1; + height: 1px; + background: var(--color-border); } -#resultsTableHeading, #infoTableHeading { - display: none; - margin-top: 4rem; +/* ── Submit columns ──────────────────────────────────────────────────── */ +.submit-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1rem; } -.table { - display: none; +@media (max-width: 540px) { + .submit-grid { grid-template-columns: 1fr; } } -.card, -.btn, -.form-control { - border-radius: 0; +.submit-group label { + display: block; + font-size: 0.85rem; + font-weight: 600; + color: var(--color-text-muted); + margin-bottom: 0.4rem; } -@media(prefers-color-scheme: dark) { - body { - background: #161616; - color: #ccc; - } +.submit-group input { + width: 100%; + padding: 0.65rem 0.9rem; + font-size: 1rem; + color: var(--color-text); + background: var(--color-surface-alt); + border: 1.5px solid var(--color-border); + border-radius: var(--radius-sm); + outline: none; + transition: border-color var(--transition), box-shadow var(--transition); + -moz-appearance: textfield; +} - h1, - h2, - h3, - h4, - h5, - h6 { - color: white; - } +.submit-group input::-webkit-outer-spin-button, +.submit-group input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} - .navbar-light .navbar-brand { - color: white; - } +.submit-group input::placeholder { color: var(--color-text-muted); opacity: 0.6; } - .navbar-light .navbar-brand:hover { - color: white; - text-decoration: underline; - } +.submit-group input:focus { + border-color: var(--color-accent); + box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-accent) 20%, transparent); +} - .border-bottom { - border-color: #5b5b5b !important; - } +/* ── Buttons ─────────────────────────────────────────────────────────── */ +.btn-primary { + display: block; + width: 100%; + margin-top: 0.75rem; + padding: 0.7rem 1rem; + font-size: 0.95rem; + font-weight: 600; + color: #fff; + background: var(--color-accent); + border: none; + border-radius: var(--radius-sm); + cursor: pointer; + transition: background var(--transition), transform var(--transition), box-shadow var(--transition); +} - .card { - border-color: #7b7b7b; - } +.btn-primary:hover { + background: var(--color-accent-hover); + box-shadow: 0 4px 12px color-mix(in srgb, var(--color-accent) 35%, transparent); + transform: translateY(-1px); +} - .card-header { - background-color: #202020; - border-color: #7b7b7b; - } +.btn-primary:active { + transform: translateY(0); + box-shadow: none; +} - .card-body { - background-color: #202020; - } +.btn-primary:focus-visible { + outline: 3px solid var(--color-accent); + outline-offset: 2px; +} - .card-body label { - color: white; - } +/* ── Charts panel ────────────────────────────────────────────────────── */ +#graphCard { + display: none; +} - .card-body .form-control { - background: #3b3b3b; - border-color: #5b5b5b; - color: white; - } +.chart-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1rem; +} - .card-body .form-control:focus { - color: white; - background-color: #5b5b5b; - border-color: #00ff00; - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 255, 0, 0.25); - } +@media (max-width: 640px) { + .chart-grid { grid-template-columns: 1fr; } +} - .btn-outline-primary { - color: #00ff00; - border-color: #00ff00 - } - .btn-outline-primary:hover { - color: #fff; - background-color: #00ff00; - border-color: #00ff00 - } - .btn-outline-primary.focus, - .btn-outline-primary:focus { - box-shadow: 0 0 0 0.2rem rgba(0, 255, 0, 0.5) - } - .btn-outline-primary.disabled, - .btn-outline-primary:disabled { - color: #00ff00; - background-color: transparent - } - .btn-outline-primary:not(:disabled):not(.disabled).active, - .btn-outline-primary:not(:disabled):not(.disabled):active, - .show > .btn-outline-primary.dropdown-toggle { - color: #fff; - background-color: #00ff00; - border-color: #00ff00 - } - .btn-outline-primary:not(:disabled):not(.disabled).active:focus, - .btn-outline-primary:not(:disabled):not(.disabled):active:focus, - .show > .btn-outline-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(0, 255, 0, 0.5) - } +.chartContainer { + border-radius: var(--radius-sm); + overflow: hidden; +} - td, - th { - border-color: #7b7b7b !important; - } +/* ── Tables ──────────────────────────────────────────────────────────── */ +.table-section { + display: none; + margin-top: 1.5rem; +} - th { - background-color: #202020; - color: white; - } +.table-section h2 { + font-size: 1rem; + font-weight: 700; + letter-spacing: -0.01em; + color: var(--color-text); + margin: 0 0 0.75rem; +} - td { - color: #ddd; - } +.data-table { + width: 100%; + border-collapse: collapse; + font-size: 0.9rem; +} + +.data-table th { + padding: 0.6rem 0.9rem; + text-align: left; + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--color-text-muted); + background: var(--color-surface-alt); + border-bottom: 1px solid var(--color-border); } + +.data-table td { + padding: 0.55rem 0.9rem; + color: var(--color-text); + border-bottom: 1px solid var(--color-border); +} + +.data-table tbody tr:last-child td { border-bottom: none; } + +.data-table tbody tr:hover { background: var(--color-surface-alt); } |
