UI fix
This commit is contained in:
1 parent
ee2a29cb36
commit
4f597505cc
30 files changed
+830
-305
No files matched your search
@@ -1,106 +1,318 @@
|
||||
/* Compact-density overrides on top of Bootstrap 5 (vendor/bootstrap.min.css)
|
||||
— Bootstrap's own *-sm utilities (table-sm, btn-sm, form-control-sm) do
|
||||
most of the work in the templates themselves; this file only adds what
|
||||
Bootstrap doesn't ship: a "cancelled" badge color, and a few global
|
||||
density knobs (smaller base font, tighter heading/section spacing) so
|
||||
more of the queue/config tables fit on screen without scrolling. */
|
||||
/* Cloud IP Validator — admin dashboard design system.
|
||||
Self-contained, no framework: tokens + a small set of components
|
||||
(sidebar shell, panels, tables, pills, forms, buttons, alerts).
|
||||
Fonts are vendored separately — see vendor/fonts.css. */
|
||||
|
||||
:root {
|
||||
--bg: #F4F7F6;
|
||||
--surface: #FFFFFF;
|
||||
--surface-alt: #ECF2F1;
|
||||
--border: #E1E8E7;
|
||||
--border-soft: #EAF0EF;
|
||||
--text: #12201F;
|
||||
--text-muted: #5E6F6D;
|
||||
--text-faint: #8B9997;
|
||||
|
||||
--accent: #146C74;
|
||||
--accent-strong: #0F565C;
|
||||
--accent-soft: #E1F0EF;
|
||||
--accent-contrast: #FFFFFF;
|
||||
|
||||
--success: #1D8A5C; --success-soft: #E3F6EC;
|
||||
--warning: #B4790F; --warning-soft: #FBF0DD;
|
||||
--danger: #C13A2E; --danger-soft: #FCE8E6;
|
||||
--info: #3A6EA5; --info-soft: #E7EFF8;
|
||||
--neutral: #5B6B6C; --neutral-soft: #EDF1F0;
|
||||
--cancel: #7A5AC0; --cancel-soft: #F1ECFB;
|
||||
|
||||
--radius-sm: 6px;
|
||||
--radius-md: 10px;
|
||||
--radius-lg: 16px;
|
||||
--radius-pill: 999px;
|
||||
|
||||
--shadow-sm: 0 1px 2px rgba(18, 32, 31, .05), 0 1px 1px rgba(18, 32, 31, .04);
|
||||
--shadow-md: 0 8px 24px rgba(18, 32, 31, .08);
|
||||
|
||||
--font-ui: "Manrope", -apple-system, "Segoe UI", sans-serif;
|
||||
--font-mono: "IBM Plex Mono", ui-monospace, "SFMono-Regular", Consolas, monospace;
|
||||
}
|
||||
|
||||
* { box-sizing: border-box; }
|
||||
|
||||
html, body { height: 100%; }
|
||||
body {
|
||||
font-size: 0.875rem;
|
||||
margin: 0;
|
||||
background: var(--bg);
|
||||
color: var(--text);
|
||||
font-family: var(--font-ui);
|
||||
font-size: 14px;
|
||||
line-height: 1.5;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
a { color: inherit; }
|
||||
.mono { font-family: var(--font-mono); font-variant-numeric: tabular-nums; }
|
||||
|
||||
h1 {
|
||||
font-size: 1.5rem;
|
||||
margin-bottom: 0.75rem;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.05rem;
|
||||
margin-top: 1.25rem;
|
||||
margin-bottom: 0.5rem;
|
||||
h1, h2, h3 { text-wrap: balance; }
|
||||
h1 { font-size: 21px; font-weight: 800; letter-spacing: -0.015em; margin: 0 0 4px; }
|
||||
h2.section-title {
|
||||
font-size: 12.5px;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: .05em;
|
||||
color: var(--text-muted);
|
||||
margin: 26px 0 10px;
|
||||
}
|
||||
section:first-of-type h2.section-title,
|
||||
main > h2.section-title:first-child { margin-top: 0; }
|
||||
|
||||
.navbar {
|
||||
padding-top: 0.35rem;
|
||||
padding-bottom: 0.35rem;
|
||||
font-size: 0.9rem;
|
||||
/* ---------- shell layout ---------- */
|
||||
.shell { display: grid; grid-template-columns: 232px 1fr; min-height: 100vh; }
|
||||
.sidebar {
|
||||
background: var(--surface-alt);
|
||||
border-right: 1px solid var(--border-soft);
|
||||
padding: 20px 14px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 22px;
|
||||
}
|
||||
.navbar-brand {
|
||||
font-size: 1rem;
|
||||
font-weight: 600;
|
||||
.brand { display: flex; align-items: center; gap: 10px; padding: 0 8px; }
|
||||
.brand-mark {
|
||||
width: 30px; height: 30px;
|
||||
border-radius: var(--radius-sm);
|
||||
background: linear-gradient(155deg, var(--accent), var(--accent-strong));
|
||||
display: grid; place-items: center; flex-shrink: 0;
|
||||
}
|
||||
.brand-mark svg { width: 16px; height: 16px; }
|
||||
.brand-name { font-weight: 800; font-size: 14.5px; letter-spacing: -0.01em; line-height: 1.2; }
|
||||
.brand-name small { display: block; font-weight: 500; font-size: 11px; color: var(--text-muted); }
|
||||
|
||||
nav.nav-groups { display: flex; flex-direction: column; gap: 2px; }
|
||||
.nav-link {
|
||||
padding-top: 0.25rem !important;
|
||||
padding-bottom: 0.25rem !important;
|
||||
}
|
||||
|
||||
/* Bootstrap ships pass/fail-adjacent colors (success/warning/danger) but
|
||||
nothing for "administrator explicitly stopped this" — give cancelled
|
||||
its own recognizable hue rather than overloading danger/secondary. */
|
||||
.bg-cancelled {
|
||||
background-color: #6d28d9 !important;
|
||||
}
|
||||
|
||||
.badge {
|
||||
display: flex; align-items: center; gap: 10px;
|
||||
padding: 8px 10px;
|
||||
border-radius: var(--radius-sm);
|
||||
text-decoration: none;
|
||||
color: var(--text-muted);
|
||||
font-weight: 600;
|
||||
font-size: 0.75em;
|
||||
font-size: 13.5px;
|
||||
transition: background .12s ease, color .12s ease;
|
||||
}
|
||||
.nav-link svg { width: 17px; height: 17px; flex-shrink: 0; opacity: .85; }
|
||||
.nav-link:hover { background: var(--border-soft); color: var(--text); }
|
||||
.nav-link.active { background: var(--accent-soft); color: var(--accent-strong); }
|
||||
.nav-link.active svg { opacity: 1; }
|
||||
|
||||
.sidebar-foot {
|
||||
margin-top: auto;
|
||||
padding: 10px;
|
||||
border-radius: var(--radius-md);
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--border-soft);
|
||||
font-size: 12px;
|
||||
color: var(--text-muted);
|
||||
display: flex; align-items: center; gap: 8px;
|
||||
}
|
||||
.pulse-dot {
|
||||
width: 7px; height: 7px; border-radius: 50%;
|
||||
background: var(--success);
|
||||
box-shadow: 0 0 0 3px var(--success-soft);
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.main { padding: 22px 28px 60px; max-width: 1180px; }
|
||||
.topbar {
|
||||
display: flex; align-items: baseline; justify-content: space-between;
|
||||
margin-bottom: 20px; flex-wrap: wrap; gap: 10px;
|
||||
}
|
||||
.topbar .sub { color: var(--text-muted); font-size: 12.5px; display: flex; align-items: center; gap: 6px; }
|
||||
|
||||
/* ---------- stat cards ---------- */
|
||||
.stat-grid { display: grid; grid-template-columns: repeat(6, 1fr); gap: 10px; margin-bottom: 4px; }
|
||||
.stat-card {
|
||||
padding: 0.5rem 0.75rem;
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--border-soft);
|
||||
border-radius: var(--radius-md);
|
||||
padding: 12px 14px;
|
||||
box-shadow: var(--shadow-sm);
|
||||
}
|
||||
.stat-card .value {
|
||||
font-family: var(--font-mono);
|
||||
font-size: 22px; font-weight: 500;
|
||||
display: block;
|
||||
font-size: 1.35rem;
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
.stat-card .label { font-size: 11.5px; color: var(--text-muted); font-weight: 600; }
|
||||
.stat-card.accented .value { color: var(--accent-strong); }
|
||||
|
||||
/* ---------- panels ---------- */
|
||||
.panel {
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--border-soft);
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: var(--shadow-sm);
|
||||
overflow: hidden;
|
||||
}
|
||||
.panel + .panel { margin-top: 14px; }
|
||||
.panel-body { padding: 16px 18px; }
|
||||
|
||||
/* ---------- forms ---------- */
|
||||
.field-row { display: flex; gap: 12px; align-items: flex-end; flex-wrap: wrap; }
|
||||
.field { display: flex; flex-direction: column; gap: 5px; flex: 1 1 220px; }
|
||||
.field label { font-size: 12px; font-weight: 700; color: var(--text-muted); }
|
||||
.form-check { display: flex; align-items: center; gap: 6px; font-size: 13px; }
|
||||
|
||||
input[type="text"], input[type="search"], textarea, select {
|
||||
font-family: var(--font-ui);
|
||||
font-size: 13.5px;
|
||||
padding: 8px 11px;
|
||||
border-radius: var(--radius-sm);
|
||||
border: 1px solid var(--border);
|
||||
background: var(--bg);
|
||||
color: var(--text);
|
||||
resize: vertical;
|
||||
width: 100%;
|
||||
}
|
||||
input:focus, textarea:focus, select:focus {
|
||||
outline: none;
|
||||
border-color: var(--accent);
|
||||
box-shadow: 0 0 0 3px var(--accent-soft);
|
||||
}
|
||||
::placeholder { color: var(--text-faint); }
|
||||
|
||||
.btn {
|
||||
display: inline-flex; align-items: center; gap: 6px;
|
||||
font-family: var(--font-ui);
|
||||
font-weight: 700;
|
||||
line-height: 1.2;
|
||||
font-size: 13px;
|
||||
padding: 8px 14px;
|
||||
border-radius: var(--radius-sm);
|
||||
border: 1px solid transparent;
|
||||
cursor: pointer;
|
||||
transition: transform .08s ease, background .12s ease, border-color .12s ease;
|
||||
white-space: nowrap;
|
||||
line-height: 1.3;
|
||||
}
|
||||
.stat-card .label {
|
||||
display: block;
|
||||
font-size: 0.72rem;
|
||||
.btn:active { transform: translateY(1px); }
|
||||
.btn-primary { background: var(--accent); color: var(--accent-contrast); }
|
||||
.btn-primary:hover { background: var(--accent-strong); }
|
||||
.btn-ghost { background: transparent; border-color: var(--border); color: var(--text); }
|
||||
.btn-ghost:hover { border-color: var(--text-muted); }
|
||||
.btn-danger-ghost { background: transparent; border-color: var(--border); color: var(--danger); }
|
||||
.btn-danger-ghost:hover { background: var(--danger-soft); border-color: var(--danger); }
|
||||
.btn-sm { padding: 5px 10px; font-size: 12px; }
|
||||
.btn-block { width: 100%; justify-content: center; }
|
||||
|
||||
/* ---------- tables ---------- */
|
||||
table { width: 100%; border-collapse: collapse; }
|
||||
thead th {
|
||||
text-align: left;
|
||||
font-size: 11px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.03em;
|
||||
opacity: 0.65;
|
||||
letter-spacing: .04em;
|
||||
color: var(--text-faint);
|
||||
font-weight: 700;
|
||||
padding: 10px 18px;
|
||||
border-bottom: 1px solid var(--border-soft);
|
||||
}
|
||||
tbody td { padding: 10px 18px; border-bottom: 1px solid var(--border-soft); vertical-align: middle; }
|
||||
tbody tr:last-child td { border-bottom: none; }
|
||||
tbody tr:hover { background: var(--bg); }
|
||||
td.addr { font-family: var(--font-mono); font-size: 13px; }
|
||||
td.num { font-family: var(--font-mono); font-variant-numeric: tabular-nums; color: var(--text-muted); }
|
||||
.table-scroll { overflow-x: auto; }
|
||||
.actions { display: flex; gap: 6px; justify-content: flex-end; flex-wrap: wrap; }
|
||||
|
||||
.table > :not(caption) > * > * {
|
||||
padding-top: 0.35rem;
|
||||
padding-bottom: 0.35rem;
|
||||
}
|
||||
|
||||
.actions-cell {
|
||||
/* ---------- pills (state/result badges) ---------- */
|
||||
.pill {
|
||||
display: inline-flex; align-items: center; gap: 5px;
|
||||
padding: 3px 10px 3px 8px;
|
||||
border-radius: var(--radius-pill);
|
||||
font-size: 11.5px;
|
||||
font-weight: 700;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.actions-cell .btn {
|
||||
margin-right: 0.25rem;
|
||||
.pill::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
|
||||
.pill-neutral { background: var(--neutral-soft); color: var(--neutral); }
|
||||
.pill-info { background: var(--info-soft); color: var(--info); }
|
||||
.pill-success { background: var(--success-soft); color: var(--success); }
|
||||
.pill-warning { background: var(--warning-soft); color: var(--warning); }
|
||||
.pill-danger { background: var(--danger-soft); color: var(--danger); }
|
||||
.pill-cancel { background: var(--cancel-soft); color: var(--cancel); }
|
||||
|
||||
/* ---------- alerts ---------- */
|
||||
.alert {
|
||||
display: flex; gap: 10px; align-items: flex-start;
|
||||
padding: 10px 14px;
|
||||
border-radius: var(--radius-md);
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
.actions-cell .btn:last-child {
|
||||
margin-right: 0;
|
||||
.alert-warning { background: var(--warning-soft); color: var(--warning); border-color: #f0d9a8; }
|
||||
.alert-danger { background: var(--danger-soft); color: var(--danger); border-color: #f0c2bc; }
|
||||
.alert strong { color: var(--text); font-weight: 700; }
|
||||
#error-banner:empty { display: none; }
|
||||
#error-banner .alert { margin-bottom: 16px; }
|
||||
|
||||
.breakdown { display: flex; gap: 16px; flex-wrap: wrap; margin: 2px 0 14px; font-size: 12.5px; color: var(--text-muted); }
|
||||
.breakdown b { color: var(--text); font-family: var(--font-mono); font-weight: 500; }
|
||||
|
||||
.muted { color: var(--text-faint); font-size: 12px; }
|
||||
code.inline { font-family: var(--font-mono); background: var(--bg); border: 1px solid var(--border-soft); padding: 1px 6px; border-radius: 5px; font-size: 12px; }
|
||||
|
||||
.inline-form { display: flex; gap: 6px; align-items: center; }
|
||||
.inline-form input, .inline-form textarea { margin: 0; }
|
||||
|
||||
/* ---------- responsive ---------- */
|
||||
.nav-toggle { display: none; }
|
||||
.topbar-mobile { display: none; }
|
||||
|
||||
@media (max-width: 900px) {
|
||||
.shell { grid-template-columns: 1fr; }
|
||||
.sidebar {
|
||||
position: fixed;
|
||||
inset: 0 30% 0 0;
|
||||
z-index: 40;
|
||||
transform: translateX(-100%);
|
||||
transition: transform .18s ease;
|
||||
box-shadow: var(--shadow-md);
|
||||
}
|
||||
#nav-toggle:checked ~ .shell .sidebar { transform: translateX(0); }
|
||||
#nav-toggle:checked ~ .shell::after {
|
||||
content: "";
|
||||
position: fixed; inset: 0; z-index: 39;
|
||||
background: rgba(18, 32, 31, .28);
|
||||
}
|
||||
.topbar-mobile {
|
||||
display: flex; align-items: center; gap: 10px;
|
||||
padding: 14px 16px;
|
||||
border-bottom: 1px solid var(--border-soft);
|
||||
background: var(--surface);
|
||||
position: sticky; top: 0; z-index: 30;
|
||||
}
|
||||
label.burger {
|
||||
width: 34px; height: 34px; border-radius: var(--radius-sm);
|
||||
border: 1px solid var(--border);
|
||||
display: grid; place-items: center; cursor: pointer; flex-shrink: 0;
|
||||
}
|
||||
.main { padding: 18px 16px 50px; }
|
||||
.stat-grid { grid-template-columns: repeat(2, 1fr); }
|
||||
}
|
||||
|
||||
.muted {
|
||||
color: var(--bs-secondary-color);
|
||||
font-size: 0.82rem;
|
||||
}
|
||||
|
||||
.inline-form {
|
||||
display: flex;
|
||||
gap: 0.4rem;
|
||||
align-items: center;
|
||||
}
|
||||
.inline-form .form-control,
|
||||
.inline-form textarea.form-control {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#error-banner:empty {
|
||||
display: none;
|
||||
}
|
||||
#error-banner .alert {
|
||||
padding: 0.5rem 0.9rem;
|
||||
margin-bottom: 1rem;
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
main {
|
||||
padding-bottom: 3rem;
|
||||
@media (max-width: 640px) {
|
||||
.field-row { flex-direction: column; align-items: stretch; }
|
||||
thead { display: none; }
|
||||
table, tbody, tr, td { display: block; width: 100%; }
|
||||
tbody tr { border-bottom: 1px solid var(--border-soft); padding: 10px 18px; }
|
||||
tbody td { border: none; padding: 3px 0; }
|
||||
tbody td[data-label]::before {
|
||||
content: attr(data-label);
|
||||
display: block;
|
||||
font-size: 10.5px;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: .04em;
|
||||
color: var(--text-faint);
|
||||
}
|
||||
.actions { justify-content: flex-start; margin-top: 6px; }
|
||||
}
|
||||
+27
-12
@@ -9,18 +9,33 @@ commit, if a newer version is actually needed.
|
||||
|---|---|---|---|
|
||||
| `htmx.min.js` | https://unpkg.com/htmx.org@2.0.10/dist/htmx.min.js | 2.0.10 | 2026-08-23 |
|
||||
| `alpine.min.js` | https://unpkg.com/alpinejs@3.16.2/dist/cdn.min.js | 3.16.2 | 2026-08-23 |
|
||||
| `bootstrap.min.css` | https://unpkg.com/bootstrap@5.3.8/dist/css/bootstrap.min.css | 5.3.8 | 2026-08-23 |
|
||||
| `fonts.css` + `fonts/*.woff2` | Google Fonts CSS2 API (`family=Manrope:wght@500;600;700;800\|family=IBM+Plex+Mono:wght@400;500`) | Manrope v20, IBM Plex Mono v20 | 2026-08-23 |
|
||||
|
||||
Only Bootstrap's CSS is vendored — no `bootstrap.bundle.min.js`/Popper: the
|
||||
dashboard doesn't use any Bootstrap component that requires JS (navbar
|
||||
collapse, dropdowns, modals, tooltips). Confirmations use the browser's
|
||||
native dialog via htmx's `hx-confirm`, not a Bootstrap modal. If a future
|
||||
page genuinely needs Bootstrap JS, vendor `bootstrap.bundle.min.js`
|
||||
alongside this file rather than pulling it from a CDN.
|
||||
## Fonts
|
||||
|
||||
Previously used Pico CSS (classless build) — replaced by Bootstrap 5 for a
|
||||
more compact, conventional admin-dashboard look (denser tables/forms via
|
||||
`table-sm`/`*-sm` utilities) per explicit request.
|
||||
The dashboard's design system (`../dashboard.css`) uses **Manrope**
|
||||
(UI chrome/headings — a variable font, so one file per subset covers all
|
||||
four vendored weights) and **IBM Plex Mono** (tabular data: IP addresses,
|
||||
timestamps, ports — one file per weight per subset). Only the `latin`,
|
||||
`latin-ext`, `cyrillic`, and `cyrillic-ext` subsets are vendored (the UI
|
||||
is Russian/English only) — `greek` and `vietnamese` from the upstream CSS
|
||||
were dropped. `fonts.css` was hand-rewritten from the fetched Google Fonts
|
||||
CSS to point at the local `fonts/*.woff2` files instead of
|
||||
`fonts.gstatic.com`, keeping the original `unicode-range` subsetting so
|
||||
browsers still only fetch the subset(s) actually used.
|
||||
|
||||
Licenses: htmx (BSD 2-Clause), Alpine.js (MIT), Bootstrap (MIT) — all
|
||||
permit vendoring/redistribution unmodified.
|
||||
No CSS framework is vendored: the design system in `dashboard.css` is
|
||||
hand-written (sidebar shell, panels, tables, pills, forms, buttons,
|
||||
alerts) rather than built on Bootstrap/Pico/etc — see
|
||||
`docs/PLAN_ADMIN_DASHBOARD.md` for why (a framework's default look kept
|
||||
fighting the "modern, compact, rounded" brief; a small hand-rolled system
|
||||
gave full control for less code than fighting one).
|
||||
|
||||
Only htmx's and Alpine's CSS-adjacent-nothing JS is vendored — no
|
||||
`bootstrap.bundle.min.js`/Popper equivalent is needed since the dashboard
|
||||
doesn't use any component that requires JS beyond htmx/Alpine themselves
|
||||
(the mobile sidebar toggle is a pure-CSS checkbox trick, not JS;
|
||||
confirmations use the browser's native dialog via htmx's `hx-confirm`).
|
||||
|
||||
Licenses: htmx (BSD 2-Clause), Alpine.js (MIT), Manrope (OFL-1.1), IBM Plex
|
||||
Mono (OFL-1.1) — all permit vendoring/redistribution unmodified.
|
||||
@@ -1,6 +0,0 @@
|
||||
@charset "UTF-8";/*!
|
||||
* Bootstrap v5.3.8 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2025 The Bootstrap Authors
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
*/:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(13, 110, 253, 0.25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherLine truncated
|
||||
/*# sourceMappingURL=bootstrap.min.css.map */
|
||||
+192
@@ -0,0 +1,192 @@
|
||||
@font-face {
|
||||
font-family: 'IBM Plex Mono';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("fonts/ibm-plex-mono-cyrillic-ext.woff2") format("woff2");
|
||||
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'IBM Plex Mono';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("fonts/ibm-plex-mono-cyrillic.woff2") format("woff2");
|
||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'IBM Plex Mono';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("fonts/ibm-plex-mono-latin-ext.woff2") format("woff2");
|
||||
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'IBM Plex Mono';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("fonts/ibm-plex-mono-latin.woff2") format("woff2");
|
||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'IBM Plex Mono';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("fonts/ibm-plex-mono-cyrillic-ext-2.woff2") format("woff2");
|
||||
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'IBM Plex Mono';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("fonts/ibm-plex-mono-cyrillic-2.woff2") format("woff2");
|
||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'IBM Plex Mono';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("fonts/ibm-plex-mono-latin-ext-2.woff2") format("woff2");
|
||||
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'IBM Plex Mono';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("fonts/ibm-plex-mono-latin-2.woff2") format("woff2");
|
||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-cyrillic-ext.woff2") format("woff2");
|
||||
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-cyrillic.woff2") format("woff2");
|
||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-latin-ext.woff2") format("woff2");
|
||||
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-latin.woff2") format("woff2");
|
||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-cyrillic-ext.woff2") format("woff2");
|
||||
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-cyrillic.woff2") format("woff2");
|
||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-latin-ext.woff2") format("woff2");
|
||||
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-latin.woff2") format("woff2");
|
||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-cyrillic-ext.woff2") format("woff2");
|
||||
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-cyrillic.woff2") format("woff2");
|
||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-latin-ext.woff2") format("woff2");
|
||||
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-latin.woff2") format("woff2");
|
||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 800;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-cyrillic-ext.woff2") format("woff2");
|
||||
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 800;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-cyrillic.woff2") format("woff2");
|
||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 800;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-latin-ext.woff2") format("woff2");
|
||||
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Manrope';
|
||||
font-style: normal;
|
||||
font-weight: 800;
|
||||
font-display: swap;
|
||||
src: url("fonts/manrope-latin.woff2") format("woff2");
|
||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in new issue
Block a user