This commit is contained in:
ayurishchev committed 2026-08-23 21:58:19 +03:00
1 parent ee2a29cb36
commit 4f597505cc
30 files changed
+830 -305

No files matched your search

+291 -79
View File
@@ -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
View File
@@ -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.
-6
View File
@@ -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
View File
@@ -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.