Minor UI fixes
This commit is contained in:
1 parent
6410273cf8
commit
7a93594e69
34 files changed
+254
-117
No files matched your search
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
118e09f98944ac59593af603c04a1d5f0e7cafb6549b5a562300bc31d9c769da control-api
|
118e09f98944ac59593af603c04a1d5f0e7cafb6549b5a562300bc31d9c769da control-api
|
||||||
48c9b99fa88be751d9badfba8b7d80f894e326a743a90e85478f1d2251ce4ab6 validator-agent
|
48c9b99fa88be751d9badfba8b7d80f894e326a743a90e85478f1d2251ce4ab6 validator-agent
|
||||||
8877cf7c6d2bdd58faf70865be602b3db5f18508f4607c8942bc8899ce0fb1e6 prober
|
8877cf7c6d2bdd58faf70865be602b3db5f18508f4607c8942bc8899ce0fb1e6 prober
|
||||||
4c7cf560b4a7b87f8de0fcc5a4fe6200c45eadf5ae04b022d67c8a8e196f39cc admin-dashboard
|
83fc0bcf22277ef9fbcd79761999f7b474fd717677d21c75a688b31684a22b15 admin-dashboard
|
||||||
Binary file not shown.
@@ -6,10 +6,11 @@
|
|||||||
Palette: cool signal-blue accent on a blue-grey neutral ground (was a
|
Palette: cool signal-blue accent on a blue-grey neutral ground (was a
|
||||||
warm teal/green), semantic status colors kept independent of the
|
warm teal/green), semantic status colors kept independent of the
|
||||||
accent. Radius: a sharp 2/3/4/6px scale (was 6/10/16px + pill) — status
|
accent. Radius: a sharp 2/3/4/6px scale (was 6/10/16px + pill) — status
|
||||||
badges are square tags, not pills. Typography: --font-display
|
badges are square tags, not pills. Typography: --font-display and
|
||||||
(IBM Plex Mono, already vendored) carries headings/nav/labels/table
|
--font-mono are both JetBrains Mono — one unified operations-console
|
||||||
heads — an operations-console register — while --font-ui (Manrope)
|
monospace register for headings/nav/labels/table heads *and* raw data
|
||||||
stays on body copy and form microcopy for readability at length.
|
(addresses, counters) alike — while --font-ui (IBM Plex Sans) stays on
|
||||||
|
body copy and form microcopy for readability at length.
|
||||||
Both a light and a dark palette are defined. The bare :root (no
|
Both a light and a dark palette are defined. The bare :root (no
|
||||||
data-theme attribute) follows the OS/browser color-scheme; the sidebar
|
data-theme attribute) follows the OS/browser color-scheme; the sidebar
|
||||||
toggle (see layout.html) stamps documentElement with
|
toggle (see layout.html) stamps documentElement with
|
||||||
@@ -48,14 +49,13 @@
|
|||||||
--shadow-sm: 0 1px 2px rgba(12, 18, 30, .06), 0 1px 1px rgba(12, 18, 30, .05);
|
--shadow-sm: 0 1px 2px rgba(12, 18, 30, .06), 0 1px 1px rgba(12, 18, 30, .05);
|
||||||
--shadow-md: 0 10px 28px rgba(12, 18, 30, .16);
|
--shadow-md: 0 10px 28px rgba(12, 18, 30, .16);
|
||||||
|
|
||||||
--font-ui: "Manrope", -apple-system, "Segoe UI", sans-serif;
|
--font-ui: "IBM Plex Sans", -apple-system, "Segoe UI", sans-serif;
|
||||||
--font-mono: "IBM Plex Mono", ui-monospace, "SFMono-Regular", Consolas, monospace;
|
--font-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Consolas, monospace;
|
||||||
/* Same physical face as --font-mono today (only Plex Mono is vendored)
|
/* Same value as --font-mono: kept as a distinct token because it marks
|
||||||
but a distinct token: it marks the "console chrome" role (headings,
|
a different semantic role (console chrome — headings, nav, labels,
|
||||||
nav, labels, table heads) versus --font-mono's "raw data" role
|
table heads — versus --font-mono's "raw data" role), so the two can
|
||||||
(addresses, counters), so the two can diverge later without a
|
diverge later without a find-and-replace. */
|
||||||
find-and-replace. */
|
--font-display: "JetBrains Mono", ui-monospace, "SFMono-Regular", Consolas, monospace;
|
||||||
--font-display: "IBM Plex Mono", ui-monospace, "SFMono-Regular", Consolas, monospace;
|
|
||||||
|
|
||||||
color-scheme: light;
|
color-scheme: light;
|
||||||
}
|
}
|
||||||
@@ -136,18 +136,31 @@ body {
|
|||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
}
|
}
|
||||||
a { color: inherit; }
|
a { color: inherit; }
|
||||||
|
::selection { background: var(--accent-soft); color: var(--text); }
|
||||||
.mono { font-family: var(--font-mono); font-variant-numeric: tabular-nums; }
|
.mono { font-family: var(--font-mono); font-variant-numeric: tabular-nums; }
|
||||||
|
|
||||||
|
/* faint technical grid texture on the page ground, behind .shell */
|
||||||
|
.bg-grid {
|
||||||
|
position: fixed; inset: 0; z-index: 0; pointer-events: none;
|
||||||
|
background-image:
|
||||||
|
linear-gradient(var(--border-soft) 1px, transparent 1px),
|
||||||
|
linear-gradient(90deg, var(--border-soft) 1px, transparent 1px);
|
||||||
|
background-size: 48px 48px;
|
||||||
|
opacity: .35;
|
||||||
|
-webkit-mask-image: linear-gradient(to bottom, black, transparent 640px);
|
||||||
|
mask-image: linear-gradient(to bottom, black, transparent 640px);
|
||||||
|
}
|
||||||
|
|
||||||
h1, h2, h3 { text-wrap: balance; }
|
h1, h2, h3 { text-wrap: balance; }
|
||||||
h1 {
|
h1 {
|
||||||
font-family: var(--font-display);
|
font-family: var(--font-display);
|
||||||
font-size: 19px; font-weight: 500; letter-spacing: -.005em;
|
font-size: 19px; font-weight: 700; letter-spacing: -.005em;
|
||||||
margin: 0 0 4px;
|
margin: 0 0 4px;
|
||||||
}
|
}
|
||||||
h2.section-title {
|
h2.section-title {
|
||||||
font-family: var(--font-display);
|
font-family: var(--font-display);
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-weight: 500;
|
font-weight: 700;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: .07em;
|
letter-spacing: .07em;
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
@@ -157,7 +170,7 @@ section:first-of-type h2.section-title,
|
|||||||
main > h2.section-title:first-child { margin-top: 0; }
|
main > h2.section-title:first-child { margin-top: 0; }
|
||||||
|
|
||||||
/* ---------- shell layout ---------- */
|
/* ---------- shell layout ---------- */
|
||||||
.shell { display: grid; grid-template-columns: 224px 1fr; min-height: 100vh; }
|
.shell { position: relative; z-index: 1; display: grid; grid-template-columns: 224px 1fr; min-height: 100vh; }
|
||||||
.sidebar {
|
.sidebar {
|
||||||
background: var(--surface);
|
background: var(--surface);
|
||||||
border-right: 1px solid var(--border);
|
border-right: 1px solid var(--border);
|
||||||
@@ -179,7 +192,7 @@ main > h2.section-title:first-child { margin-top: 0; }
|
|||||||
.brand-mark svg { width: 15px; height: 15px; }
|
.brand-mark svg { width: 15px; height: 15px; }
|
||||||
.brand-name {
|
.brand-name {
|
||||||
font-family: var(--font-display);
|
font-family: var(--font-display);
|
||||||
font-weight: 500; font-size: 13px; letter-spacing: -.005em; line-height: 1.2;
|
font-weight: 700; font-size: 13px; letter-spacing: -.005em; line-height: 1.2;
|
||||||
}
|
}
|
||||||
.brand-name small { display: block; font-weight: 400; font-size: 10.5px; color: var(--text-faint); letter-spacing: .02em; }
|
.brand-name small { display: block; font-weight: 400; font-size: 10.5px; color: var(--text-faint); letter-spacing: .02em; }
|
||||||
|
|
||||||
@@ -192,7 +205,7 @@ nav.nav-groups { display: flex; flex-direction: column; gap: 1px; }
|
|||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
font-family: var(--font-display);
|
font-family: var(--font-display);
|
||||||
font-weight: 500;
|
font-weight: 600;
|
||||||
font-size: 12.5px;
|
font-size: 12.5px;
|
||||||
transition: background .12s ease, color .12s ease, border-color .12s ease;
|
transition: background .12s ease, color .12s ease, border-color .12s ease;
|
||||||
}
|
}
|
||||||
@@ -219,7 +232,10 @@ nav.nav-groups { display: flex; flex-direction: column; gap: 1px; }
|
|||||||
background: var(--success);
|
background: var(--success);
|
||||||
box-shadow: 0 0 0 3px var(--success-soft);
|
box-shadow: 0 0 0 3px var(--success-soft);
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
|
animation: pulse 2.2s ease-in-out infinite;
|
||||||
}
|
}
|
||||||
|
@media (prefers-reduced-motion: reduce) { .pulse-dot { animation: none; } }
|
||||||
|
@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: .35; } }
|
||||||
|
|
||||||
.theme-toggle {
|
.theme-toggle {
|
||||||
display: grid; place-items: center;
|
display: grid; place-items: center;
|
||||||
@@ -264,16 +280,18 @@ nav.nav-groups { display: flex; flex-direction: column; gap: 1px; }
|
|||||||
.stat-card { background: var(--surface); padding: 12px 14px; }
|
.stat-card { background: var(--surface); padding: 12px 14px; }
|
||||||
.stat-card .value {
|
.stat-card .value {
|
||||||
font-family: var(--font-mono);
|
font-family: var(--font-mono);
|
||||||
font-size: 22px; font-weight: 500;
|
font-size: 22px; font-weight: 700;
|
||||||
display: block;
|
display: block;
|
||||||
font-variant-numeric: tabular-nums;
|
font-variant-numeric: tabular-nums;
|
||||||
}
|
}
|
||||||
.stat-card .label {
|
.stat-card .label {
|
||||||
font-family: var(--font-display);
|
font-family: var(--font-display);
|
||||||
font-size: 10.5px; color: var(--text-muted); font-weight: 500;
|
font-size: 10.5px; color: var(--text-muted); font-weight: 600;
|
||||||
text-transform: uppercase; letter-spacing: .06em;
|
text-transform: uppercase; letter-spacing: .06em;
|
||||||
}
|
}
|
||||||
.stat-card.accented .value { color: var(--accent); }
|
.stat-card.accented .value { color: var(--accent); }
|
||||||
|
.stat-card.warn .value { color: var(--warning); }
|
||||||
|
.stat-card.bad .value { color: var(--danger); }
|
||||||
|
|
||||||
/* ---------- panels ---------- */
|
/* ---------- panels ---------- */
|
||||||
.panel {
|
.panel {
|
||||||
@@ -285,13 +303,20 @@ nav.nav-groups { display: flex; flex-direction: column; gap: 1px; }
|
|||||||
}
|
}
|
||||||
.panel + .panel { margin-top: 14px; }
|
.panel + .panel { margin-top: 14px; }
|
||||||
.panel-body { padding: 16px 18px; }
|
.panel-body { padding: 16px 18px; }
|
||||||
|
.panel-head {
|
||||||
|
display: flex; align-items: center; justify-content: space-between;
|
||||||
|
padding: 10px 16px;
|
||||||
|
border-bottom: 1px solid var(--border-soft);
|
||||||
|
background: var(--surface-alt);
|
||||||
|
}
|
||||||
|
.panel-head h2 { font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--text-muted); }
|
||||||
|
|
||||||
/* ---------- forms ---------- */
|
/* ---------- forms ---------- */
|
||||||
.field-row { display: flex; gap: 12px; align-items: flex-end; flex-wrap: wrap; }
|
.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 { display: flex; flex-direction: column; gap: 5px; flex: 1 1 220px; }
|
||||||
.field label {
|
.field label {
|
||||||
font-family: var(--font-display);
|
font-family: var(--font-display);
|
||||||
font-size: 10.5px; font-weight: 500;
|
font-size: 10.5px; font-weight: 700;
|
||||||
text-transform: uppercase; letter-spacing: .05em;
|
text-transform: uppercase; letter-spacing: .05em;
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
}
|
}
|
||||||
@@ -318,7 +343,7 @@ input:focus, textarea:focus, select:focus {
|
|||||||
.btn {
|
.btn {
|
||||||
display: inline-flex; align-items: center; gap: 6px;
|
display: inline-flex; align-items: center; gap: 6px;
|
||||||
font-family: var(--font-display);
|
font-family: var(--font-display);
|
||||||
font-weight: 500;
|
font-weight: 700;
|
||||||
font-size: 12.5px;
|
font-size: 12.5px;
|
||||||
padding: 8px 13px;
|
padding: 8px 13px;
|
||||||
border-radius: var(--radius-xs);
|
border-radius: var(--radius-xs);
|
||||||
@@ -348,7 +373,7 @@ thead th {
|
|||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: .06em;
|
letter-spacing: .06em;
|
||||||
color: var(--text-faint);
|
color: var(--text-faint);
|
||||||
font-weight: 500;
|
font-weight: 700;
|
||||||
padding: 9px 18px;
|
padding: 9px 18px;
|
||||||
border-bottom: 1px solid var(--border);
|
border-bottom: 1px solid var(--border);
|
||||||
background: var(--surface-alt);
|
background: var(--surface-alt);
|
||||||
@@ -368,7 +393,7 @@ td.num { font-family: var(--font-mono); font-variant-numeric: tabular-nums; colo
|
|||||||
border-radius: var(--radius-xs);
|
border-radius: var(--radius-xs);
|
||||||
font-family: var(--font-display);
|
font-family: var(--font-display);
|
||||||
font-size: 10.5px;
|
font-size: 10.5px;
|
||||||
font-weight: 500;
|
font-weight: 700;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: .02em;
|
letter-spacing: .02em;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
@@ -401,6 +426,7 @@ td.num { font-family: var(--font-mono); font-variant-numeric: tabular-nums; colo
|
|||||||
|
|
||||||
.muted { color: var(--text-faint); font-size: 12px; }
|
.muted { color: var(--text-faint); font-size: 12px; }
|
||||||
code.inline { font-family: var(--font-mono); background: var(--surface-alt); border: 1px solid var(--border-soft); padding: 1px 6px; border-radius: var(--radius-xs); font-size: 12px; }
|
code.inline { font-family: var(--font-mono); background: var(--surface-alt); border: 1px solid var(--border-soft); padding: 1px 6px; border-radius: var(--radius-xs); font-size: 12px; }
|
||||||
|
.section-note { padding: 14px 16px 4px; font-size: 12.5px; color: var(--text-muted); }
|
||||||
|
|
||||||
.inline-form { display: flex; gap: 6px; align-items: center; }
|
.inline-form { display: flex; gap: 6px; align-items: center; }
|
||||||
.inline-form input, .inline-form textarea { margin: 0; }
|
.inline-form input, .inline-form textarea { margin: 0; }
|
||||||
@@ -432,7 +458,7 @@ code.inline { font-family: var(--font-mono); background: var(--surface-alt); bor
|
|||||||
background: var(--surface);
|
background: var(--surface);
|
||||||
position: sticky; top: 0; z-index: 30;
|
position: sticky; top: 0; z-index: 30;
|
||||||
}
|
}
|
||||||
.topbar-mobile strong { font-family: var(--font-display); font-weight: 500; font-size: 13px; }
|
.topbar-mobile strong { font-family: var(--font-display); font-size: 13px; }
|
||||||
label.burger {
|
label.burger {
|
||||||
width: 32px; height: 32px; border-radius: var(--radius-xs);
|
width: 32px; height: 32px; border-radius: var(--radius-xs);
|
||||||
border: 1px solid var(--border);
|
border: 1px solid var(--border);
|
||||||
|
|||||||
+17
-13
@@ -9,20 +9,24 @@ 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 |
|
| `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 |
|
| `alpine.min.js` | https://unpkg.com/alpinejs@3.16.2/dist/cdn.min.js | 3.16.2 | 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 |
|
| `fonts.css` + `fonts/*.woff2` | Google Fonts CSS2 API (`family=JetBrains+Mono:wght@400;500;600;700;800\|family=IBM+Plex+Sans:wght@400;500;600;700`) | JetBrains Mono v24, IBM Plex Sans v23 | 2026-08-26 |
|
||||||
|
|
||||||
## Fonts
|
## Fonts
|
||||||
|
|
||||||
The dashboard's design system (`../dashboard.css`) uses **Manrope**
|
The dashboard's design system (`../dashboard.css`) uses **JetBrains
|
||||||
(UI chrome/headings — a variable font, so one file per subset covers all
|
Mono** (all headings/nav/labels/table chrome *and* tabular data — IP
|
||||||
four vendored weights) and **IBM Plex Mono** (tabular data: IP addresses,
|
addresses, timestamps, ports, counters — a single monospace register
|
||||||
timestamps, ports — one file per weight per subset). Only the `latin`,
|
throughout) and **IBM Plex Sans** (body copy, form microcopy). Both are
|
||||||
`latin-ext`, `cyrillic`, and `cyrillic-ext` subsets are vendored (the UI
|
variable fonts, so one file per subset covers every vendored weight.
|
||||||
is Russian/English only) — `greek` and `vietnamese` from the upstream CSS
|
Only the `latin`, `latin-ext`, `cyrillic`, and `cyrillic-ext` subsets are
|
||||||
were dropped. `fonts.css` was hand-rewritten from the fetched Google Fonts
|
vendored (the UI is Russian/English only) — `greek` and `vietnamese` from
|
||||||
CSS to point at the local `fonts/*.woff2` files instead of
|
the upstream CSS were dropped. `fonts.css` was hand-rewritten from the
|
||||||
`fonts.gstatic.com`, keeping the original `unicode-range` subsetting so
|
fetched Google Fonts CSS to point at the local `fonts/*.woff2` files
|
||||||
browsers still only fetch the subset(s) actually used.
|
instead of `fonts.gstatic.com`, keeping the original `unicode-range`
|
||||||
|
subsetting so browsers still only fetch the subset(s) actually used.
|
||||||
|
|
||||||
|
Replaces the previously vendored Manrope + IBM Plex Mono (removed
|
||||||
|
2026-08-26 — superseded, no longer referenced by `dashboard.css`).
|
||||||
|
|
||||||
No CSS framework is vendored: the design system in `dashboard.css` is
|
No CSS framework is vendored: the design system in `dashboard.css` is
|
||||||
hand-written (sidebar shell, panels, tables, pills, forms, buttons,
|
hand-written (sidebar shell, panels, tables, pills, forms, buttons,
|
||||||
@@ -37,5 +41,5 @@ doesn't use any component that requires JS beyond htmx/Alpine themselves
|
|||||||
(the mobile sidebar toggle is a pure-CSS checkbox trick, not JS;
|
(the mobile sidebar toggle is a pure-CSS checkbox trick, not JS;
|
||||||
confirmations use the browser's native dialog via htmx's `hx-confirm`).
|
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
|
Licenses: htmx (BSD 2-Clause), Alpine.js (MIT), JetBrains Mono (OFL-1.1),
|
||||||
Mono (OFL-1.1) — all permit vendoring/redistribution unmodified.
|
IBM Plex Sans (OFL-1.1) — all permit vendoring/redistribution unmodified.
|
||||||
+171
-75
@@ -1,192 +1,288 @@
|
|||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'IBM Plex Mono';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/ibm-plex-mono-cyrillic-ext.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-cyrillic-ext.woff2") format("woff2");
|
||||||
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'IBM Plex Mono';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/ibm-plex-mono-cyrillic.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-cyrillic.woff2") format("woff2");
|
||||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'IBM Plex Mono';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/ibm-plex-mono-latin-ext.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-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;
|
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-face {
|
||||||
font-family: 'IBM Plex Mono';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/ibm-plex-mono-latin.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-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;
|
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-face {
|
||||||
font-family: 'IBM Plex Mono';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/ibm-plex-mono-cyrillic-ext-2.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-cyrillic-ext.woff2") format("woff2");
|
||||||
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'IBM Plex Mono';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/ibm-plex-mono-cyrillic-2.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-cyrillic.woff2") format("woff2");
|
||||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'IBM Plex Mono';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/ibm-plex-mono-latin-ext-2.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-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;
|
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-face {
|
||||||
font-family: 'IBM Plex Mono';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/ibm-plex-mono-latin-2.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-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;
|
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-face {
|
||||||
font-family: 'Manrope';
|
font-family: 'IBM Plex Sans';
|
||||||
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-style: normal;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/manrope-cyrillic-ext.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-cyrillic-ext.woff2") format("woff2");
|
||||||
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Manrope';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/manrope-cyrillic.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-cyrillic.woff2") format("woff2");
|
||||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Manrope';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/manrope-latin-ext.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-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;
|
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-face {
|
||||||
font-family: 'Manrope';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/manrope-latin.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-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;
|
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-face {
|
||||||
font-family: 'Manrope';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/manrope-cyrillic-ext.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-cyrillic-ext.woff2") format("woff2");
|
||||||
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Manrope';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/manrope-cyrillic.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-cyrillic.woff2") format("woff2");
|
||||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Manrope';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/manrope-latin-ext.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-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;
|
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-face {
|
||||||
font-family: 'Manrope';
|
font-family: 'IBM Plex Sans';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/manrope-latin.woff2") format("woff2");
|
src: url("fonts/ibm-plex-sans-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;
|
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-face {
|
||||||
font-family: 'Manrope';
|
font-family: 'JetBrains Mono';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 800;
|
font-weight: 400;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/manrope-cyrillic-ext.woff2") format("woff2");
|
src: url("fonts/jetbrains-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;
|
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Manrope';
|
font-family: 'JetBrains Mono';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 800;
|
font-weight: 400;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/manrope-cyrillic.woff2") format("woff2");
|
src: url("fonts/jetbrains-mono-cyrillic.woff2") format("woff2");
|
||||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Manrope';
|
font-family: 'JetBrains Mono';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 800;
|
font-weight: 400;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/manrope-latin-ext.woff2") format("woff2");
|
src: url("fonts/jetbrains-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;
|
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-face {
|
||||||
font-family: 'Manrope';
|
font-family: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-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: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-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: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-mono-cyrillic.woff2") format("woff2");
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-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: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-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: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-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: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-mono-cyrillic.woff2") format("woff2");
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-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: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-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: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-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: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-mono-cyrillic.woff2") format("woff2");
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-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: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-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: 'JetBrains Mono';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("fonts/manrope-latin.woff2") format("woff2");
|
src: url("fonts/jetbrains-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: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 800;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-mono-cyrillic.woff2") format("woff2");
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 800;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-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: 'JetBrains Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 800;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("fonts/jetbrains-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;
|
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.
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.
@@ -3,6 +3,7 @@
|
|||||||
<html lang="ru">
|
<html lang="ru">
|
||||||
<head>{{template "html_head" .}}</head>
|
<head>{{template "html_head" .}}</head>
|
||||||
<body>
|
<body>
|
||||||
|
<div class="bg-grid"></div>
|
||||||
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
||||||
<div class="shell">
|
<div class="shell">
|
||||||
{{template "sidebar_nav" .}}
|
{{template "sidebar_nav" .}}
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
<p class="muted">Сначала создайте хотя бы одну <a href="/targets">группу целей</a>.</p>
|
<p class="muted">Сначала создайте хотя бы одну <a href="/targets">группу целей</a>.</p>
|
||||||
{{else}}
|
{{else}}
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
|
<div class="panel-head"><h2>Новый тип проверки</h2></div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<form hx-post="/check-types" hx-target="#checktypes-table-wrap" hx-swap="innerHTML" hx-on::after-request="this.reset()">
|
<form hx-post="/check-types" hx-target="#checktypes-table-wrap" hx-swap="innerHTML" hx-on::after-request="this.reset()">
|
||||||
<div class="field-row">
|
<div class="field-row">
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<html lang="ru">
|
<html lang="ru">
|
||||||
<head>{{template "html_head" .}}</head>
|
<head>{{template "html_head" .}}</head>
|
||||||
<body>
|
<body>
|
||||||
|
<div class="bg-grid"></div>
|
||||||
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
||||||
<div class="shell">
|
<div class="shell">
|
||||||
{{template "sidebar_nav" .}}
|
{{template "sidebar_nav" .}}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<html lang="ru">
|
<html lang="ru">
|
||||||
<head>{{template "html_head" .}}</head>
|
<head>{{template "html_head" .}}</head>
|
||||||
<body>
|
<body>
|
||||||
|
<div class="bg-grid"></div>
|
||||||
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
||||||
<div class="shell">
|
<div class="shell">
|
||||||
{{template "sidebar_nav" .}}
|
{{template "sidebar_nav" .}}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<html lang="ru">
|
<html lang="ru">
|
||||||
<head>{{template "html_head" .}}</head>
|
<head>{{template "html_head" .}}</head>
|
||||||
<body>
|
<body>
|
||||||
|
<div class="bg-grid"></div>
|
||||||
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
||||||
<div class="shell">
|
<div class="shell">
|
||||||
{{template "sidebar_nav" .}}
|
{{template "sidebar_nav" .}}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<div class="stat-card accented"><span class="value">{{.Status.TotalIPs}}</span><span class="label">всего IP</span></div>
|
<div class="stat-card accented"><span class="value">{{.Status.TotalIPs}}</span><span class="label">всего IP</span></div>
|
||||||
<div class="stat-card"><span class="value">{{.Status.TotalValidators}}</span><span class="label">валидаторов</span></div>
|
<div class="stat-card"><span class="value">{{.Status.TotalValidators}}</span><span class="label">валидаторов</span></div>
|
||||||
{{range $state, $count := .Status.IPsByState}}
|
{{range $state, $count := .Status.IPsByState}}
|
||||||
<div class="stat-card"><span class="value">{{$count}}</span><span class="label">{{$state}}</span></div>
|
<div class="stat-card{{if eq $state "failed"}} bad{{else if eq $state "checking"}} accented{{end}}"><span class="value">{{$count}}</span><span class="label">{{$state}}</span></div>
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<html lang="ru">
|
<html lang="ru">
|
||||||
<head>{{template "html_head" .}}</head>
|
<head>{{template "html_head" .}}</head>
|
||||||
<body>
|
<body>
|
||||||
|
<div class="bg-grid"></div>
|
||||||
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
||||||
<div class="shell">
|
<div class="shell">
|
||||||
{{template "sidebar_nav" .}}
|
{{template "sidebar_nav" .}}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<html lang="ru">
|
<html lang="ru">
|
||||||
<head>{{template "html_head" .}}</head>
|
<head>{{template "html_head" .}}</head>
|
||||||
<body>
|
<body>
|
||||||
|
<div class="bg-grid"></div>
|
||||||
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
||||||
<div class="shell">
|
<div class="shell">
|
||||||
{{template "sidebar_nav" .}}
|
{{template "sidebar_nav" .}}
|
||||||
@@ -20,11 +21,9 @@
|
|||||||
|
|
||||||
{{define "sites_content"}}
|
{{define "sites_content"}}
|
||||||
<div class="topbar"><h1>Площадки</h1></div>
|
<div class="topbar"><h1>Площадки</h1></div>
|
||||||
<p class="muted" style="margin-bottom:16px">Внешние площадки (проберы), проверяющие адреса «снаружи». Число площадок
|
|
||||||
не ограничено — добавляйте столько слотов, сколько нужно. «Статус» показывает, подключён ли прямо сейчас
|
|
||||||
процесс prober на этой площадке (по heartbeat, аналогично валидаторам).</p>
|
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
|
<div class="panel-head"><h2>Добавить площадку</h2></div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<form hx-post="/sites" hx-target="#sites-table-wrap" hx-swap="innerHTML" hx-on::after-request="this.reset()">
|
<form hx-post="/sites" hx-target="#sites-table-wrap" hx-swap="innerHTML" hx-on::after-request="this.reset()">
|
||||||
<div class="field-row">
|
<div class="field-row">
|
||||||
@@ -77,5 +76,7 @@
|
|||||||
</table>
|
</table>
|
||||||
{{if not .Items}}<p class="muted" style="padding:16px">Площадок пока нет — добавьте первую формой выше.</p>{{end}}
|
{{if not .Items}}<p class="muted" style="padding:16px">Площадок пока нет — добавьте первую формой выше.</p>{{end}}
|
||||||
</div>
|
</div>
|
||||||
|
<div class="section-note">Число площадок не ограничено — форма выше добавляет следующий слот. «Статус» отражает
|
||||||
|
<code class="inline">POST /probers/register</code> и heartbeat, аналогично валидаторам.</div>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
<html lang="ru">
|
<html lang="ru">
|
||||||
<head>{{template "html_head" .}}</head>
|
<head>{{template "html_head" .}}</head>
|
||||||
<body>
|
<body>
|
||||||
|
<div class="bg-grid"></div>
|
||||||
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
||||||
<div class="shell">
|
<div class="shell">
|
||||||
{{template "sidebar_nav" .}}
|
{{template "sidebar_nav" .}}
|
||||||
@@ -23,6 +24,7 @@
|
|||||||
<p class="muted" style="margin-bottom:16px">Группа целей — именованный список URL/адресов, на который затем ссылаются типы проверок.</p>
|
<p class="muted" style="margin-bottom:16px">Группа целей — именованный список URL/адресов, на который затем ссылаются типы проверок.</p>
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
|
<div class="panel-head"><h2>Новая группа целей</h2></div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<form hx-post="/targets" hx-target="#targets-table-wrap" hx-swap="innerHTML" hx-on::after-request="this.reset()">
|
<form hx-post="/targets" hx-target="#targets-table-wrap" hx-swap="innerHTML" hx-on::after-request="this.reset()">
|
||||||
<div class="field-row">
|
<div class="field-row">
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<html lang="ru">
|
<html lang="ru">
|
||||||
<head>{{template "html_head" .}}</head>
|
<head>{{template "html_head" .}}</head>
|
||||||
<body>
|
<body>
|
||||||
|
<div class="bg-grid"></div>
|
||||||
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
<input type="checkbox" id="nav-toggle" class="nav-toggle">
|
||||||
<div class="shell">
|
<div class="shell">
|
||||||
{{template "sidebar_nav" .}}
|
{{template "sidebar_nav" .}}
|
||||||
@@ -22,6 +23,7 @@
|
|||||||
<div class="topbar"><h1>Валидаторы</h1></div>
|
<div class="topbar"><h1>Валидаторы</h1></div>
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
|
<div class="panel-head"><h2>Новый валидатор</h2></div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<form hx-post="/validators" hx-target="#validators-table-wrap" hx-swap="innerHTML" hx-on::after-request="this.reset()">
|
<form hx-post="/validators" hx-target="#validators-table-wrap" hx-swap="innerHTML" hx-on::after-request="this.reset()">
|
||||||
<div class="field-row">
|
<div class="field-row">
|
||||||
|
|||||||
Reference in new issue
Block a user