- NetPulse
+
+ NetPulse — моніторинг мережі
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/preview-nav.html b/web/preview-nav.html
deleted file mode 100644
index e5a50d0..0000000
--- a/web/preview-nav.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
- NetPulse — огляд меню
-
-
-
-
-
-
diff --git a/web/public/apple-touch-icon.png b/web/public/apple-touch-icon.png
new file mode 100644
index 0000000..bea8e0f
Binary files /dev/null and b/web/public/apple-touch-icon.png differ
diff --git a/web/public/favicon-32.png b/web/public/favicon-32.png
new file mode 100644
index 0000000..5312d65
Binary files /dev/null and b/web/public/favicon-32.png differ
diff --git a/web/public/favicon.ico b/web/public/favicon.ico
new file mode 100644
index 0000000..6a86aaa
Binary files /dev/null and b/web/public/favicon.ico differ
diff --git a/web/public/favicon.svg b/web/public/favicon.svg
new file mode 100644
index 0000000..19a790b
--- /dev/null
+++ b/web/public/favicon.svg
@@ -0,0 +1,26 @@
+
diff --git a/web/src/components/AppShell.tsx b/web/src/components/AppShell.tsx
index 61aba1b..b75015e 100644
--- a/web/src/components/AppShell.tsx
+++ b/web/src/components/AppShell.tsx
@@ -5,6 +5,7 @@ import { session } from '../api/session'
import { live } from '../api/ws'
import { useAlerts } from '../hooks/useAlerts'
import type { Permission } from '../types'
+import { LogoMark } from './Logo'
import { plural, useWideScreen } from './ui'
interface NavItem {
@@ -399,7 +400,10 @@ export function AppShell() {
☰
- NetPulse
+
+
+ NetPulse
+
{/* Замерзлий інтерфейс виглядає точно так само, як справний.
@@ -516,10 +520,10 @@ export function AppShell() {
onClick={() => toggleGroup(g.id)}
aria-expanded={open}
aria-controls={panelID}
- // py-3 на телефоні, а не таке, як на моніторі: там у
- // заголовок цілять пальцем, і 26 px висоти — це
- // промах через раз. Поруч пункти по 40 px, тож
- // однакова висота ще й вирівнює список.
+ // На телефоні заголовок вищий, ніж на моніторі: там у
+ // нього цілять пальцем, а спільні 31 px — це промах
+ // через раз. Поруч пункти по 40 px, тож py-3 ще й
+ // вирівнює список.
//
// Фокус — outline, а не ring: ring малюється тінню,
// а тіні зникають у режимі високої контрастності
@@ -567,7 +571,10 @@ export function AppShell() {
) : (
{g.items.length}
diff --git a/web/src/components/InterfaceFilterEditor.tsx b/web/src/components/InterfaceFilterEditor.tsx
index fd62329..3bca41e 100644
--- a/web/src/components/InterfaceFilterEditor.tsx
+++ b/web/src/components/InterfaceFilterEditor.tsx
@@ -1,6 +1,6 @@
import { useEffect, useMemo, useState } from 'react'
import { api } from '../api/client'
-import { Button, ErrorNote, Field, formatBps, inputClass, plural } from './ui'
+import { Button, ErrorNote, Field, FieldGap, formatBps, inputClass, plural } from './ui'
import type {
IfFilterField,
IfFilterOp,
@@ -344,7 +344,7 @@ export function InterfaceFilterEditor({
{/* ---- Перевірка на справжньому хості ---- */}
-
+
-
+
+
+
{err}
diff --git a/web/src/components/LoginPage.tsx b/web/src/components/LoginPage.tsx
index 24d890d..6c1ec20 100644
--- a/web/src/components/LoginPage.tsx
+++ b/web/src/components/LoginPage.tsx
@@ -2,6 +2,7 @@ import { useState } from 'react'
import { ApiError, api } from '../api/client'
import { meFromLogin, session } from '../api/session'
import type { TenantMembership } from '../types'
+import { LogoMark } from './Logo'
/**
* Сторінка входу.
@@ -57,15 +58,29 @@ export function LoginPage({ onDone }: { onDone: () => void }) {
}
return (
-
+
-
-
NetPulse
-
моніторинг мережі
+ {/* Вхід — єдиний екран, який людина бачить до того, як щось
+ запрацює. Тому знак тут великий і стоїть над карткою, а не
+ рядком у кутку: за ці кілька секунд продукт або виглядає
+ зробленим, або не виглядає ніяк.
+
+ text-slate-100 на самому знаку обов'язково: штрих малюється
+ через currentColor, а на цій сторінці колір тексту ніде не
+ заданий — знак успадкував би типовий чорний і зник би на
+ темному тлі. */}
+
+ {/* Квадрат тут більший, ніж здається потрібним: малюнок займає
+ лише середню смугу поля зору (пульс не сягає ані верху, ані
+ низу сітки 32×32), тож знак «на 56 px» насправді має висоту
+ 37. Розмір підібрано за шириною слова під ним. */}
+
+