From e2dbf530bdac2eb98a657b962b2c496af8dca8c5 Mon Sep 17 00:00:00 2001 From: TronoSfera <119615520+TronoSfera@users.noreply.github.com> Date: Mon, 2 Mar 2026 20:26:57 +0300 Subject: [PATCH] add icons --- app/web/admin.css | 100 ++++++++++++------ app/web/admin.html | 1 + app/web/admin.jsx | 46 ++++++-- .../admin/features/config/ConfigSection.jsx | 42 ++++---- .../features/invoices/InvoicesSection.jsx | 19 ++-- app/web/admin/features/kanban/KanbanBoard.jsx | 11 +- .../admin/features/quotes/QuotesSection.jsx | 19 ++-- .../features/requests/RequestsSection.jsx | 19 ++-- .../ServiceRequestsSection.jsx | 15 +-- .../tables/AvailableTablesSection.jsx | 5 +- app/web/admin/shared/icons.jsx | 51 +++++++++ app/web/brand-mark.svg | 16 +++ app/web/client.css | 15 +++ app/web/client.html | 1 + app/web/client.jsx | 5 +- app/web/favicon.svg | 16 +++ app/web/landing.css | 10 ++ app/web/landing.html | 6 +- app/web/privacy.html | 1 + 19 files changed, 291 insertions(+), 107 deletions(-) create mode 100644 app/web/admin/shared/icons.jsx create mode 100644 app/web/brand-mark.svg create mode 100644 app/web/favicon.svg diff --git a/app/web/admin.css b/app/web/admin.css index a7a833b..52a25b9 100644 --- a/app/web/admin.css +++ b/app/web/admin.css @@ -53,6 +53,17 @@ .logo a { color: inherit; text-decoration: none; + display: inline-flex; + align-items: center; + gap: 0.5rem; + } + + .brand-mark { + width: 24px; + height: 24px; + display: inline-block; + flex-shrink: 0; + border-radius: 50%; } .menu { @@ -275,6 +286,13 @@ flex-wrap: wrap; } + .section-head-actions { + display: flex; + gap: 0.5rem; + align-items: center; + flex-wrap: wrap; + } + .config-head-actions { display: flex; gap: 0.5rem; @@ -282,16 +300,16 @@ align-items: center; } - .btn-icon-only { - width: 40px; - min-width: 40px; - height: 40px; - min-height: 40px; - padding: 0; - display: inline-grid; - place-items: center; - font-size: 1.06rem; - line-height: 1; + .ui-glyph { + width: 17px; + height: 17px; + display: block; + stroke: currentColor; + fill: none; + stroke-width: 1.9; + stroke-linecap: round; + stroke-linejoin: round; + vector-effect: non-scaling-stroke; } .muted { @@ -1205,6 +1223,43 @@ margin-top: -1px; } + .table-footer-actions { + display: inline-flex; + align-items: center; + gap: 0.45rem; + flex-wrap: wrap; + margin-left: auto; + } + + .table-control-btn { + width: 40px; + min-width: 40px; + height: 40px; + min-height: 40px; + padding: 0; + display: inline-grid; + place-items: center; + line-height: 1; + } + + .table-control-loadall { + width: auto; + min-width: 58px; + padding: 0 0.62rem; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.33rem; + font-size: 0.9rem; + font-weight: 700; + letter-spacing: 0.01em; + } + + .table-control-loadall .ui-glyph { + width: 15px; + height: 15px; + } + .filter-toolbar + .table-scroll-region { border-bottom-left-radius: 0; border-bottom-right-radius: 0; @@ -1273,31 +1328,6 @@ margin-left: auto; } - .config-control-btn { - width: 40px; - min-width: 40px; - height: 40px; - min-height: 40px; - padding: 0; - display: inline-grid; - place-items: center; - font-size: 1.05rem; - line-height: 1; - } - - .config-control-btn-loadall { - width: auto; - min-width: 58px; - padding: 0 0.62rem; - display: inline-flex; - align-items: center; - justify-content: center; - gap: 0.33rem; - font-size: 0.9rem; - font-weight: 700; - letter-spacing: 0.01em; - } - .block { border: 1px solid var(--line); border-radius: 12px; diff --git a/app/web/admin.html b/app/web/admin.html index 44bc150..4581c53 100644 --- a/app/web/admin.html +++ b/app/web/admin.html @@ -4,6 +4,7 @@ Административная панель • Правовой трекер + diff --git a/app/web/admin.jsx b/app/web/admin.jsx index baedbf6..6b9125d 100644 --- a/app/web/admin.jsx +++ b/app/web/admin.jsx @@ -60,6 +60,7 @@ import { translateApiError, userInitials, } from "./admin/shared/utils.js"; +import { AddIcon, DownloadIcon, FilterIcon, NextIcon, PrevIcon, RefreshIcon } from "./admin/shared/icons.jsx"; import QRCode from "qrcode"; (function () { @@ -120,7 +121,7 @@ const NEW_REQUEST_CLIENT_OPTION = "__new_client__"; ); } - function TablePager({ tableState, onPrev, onNext, onLoadAll }) { + function TablePager({ tableState, onPrev, onNext, onLoadAll, onRefresh, onCreate, onOpenFilter }) { return (
@@ -128,25 +129,45 @@ const NEW_REQUEST_CLIENT_OPTION = "__new_client__"; ? "Всего: " + tableState.total + " • показаны все записи" : "Всего: " + tableState.total + " • смещение: " + tableState.offset}
-
+
- + ) : null} + {onCreate ? ( + + ) : null} + {onOpenFilter ? ( + + ) : null} +
@@ -192,8 +213,8 @@ const NEW_REQUEST_CLIENT_OPTION = "__new_client__";
{!hideAction ? (
-
) : null} @@ -3448,7 +3469,10 @@ const NEW_REQUEST_CLIENT_OPTION = "__new_client__";
@@ -606,55 +596,65 @@ export function ConfigSection(props) {
+
diff --git a/app/web/admin/features/invoices/InvoicesSection.jsx b/app/web/admin/features/invoices/InvoicesSection.jsx index 9c9de6b..2ac30e0 100644 --- a/app/web/admin/features/invoices/InvoicesSection.jsx +++ b/app/web/admin/features/invoices/InvoicesSection.jsx @@ -40,20 +40,13 @@ export function InvoicesSection({

Счета

Выставленные счета клиентам, статусы оплаты и выгрузка PDF.

-
- - -
{ const fieldDef = getFieldDef("invoices", clause.field); return (fieldDef ? fieldDef.label : clause.field) + " " + OPERATOR_LABELS[clause.op] + " " + getFilterValuePreview("invoices", clause); @@ -112,7 +105,15 @@ export function InvoicesSection({ )} /> - + ); diff --git a/app/web/admin/features/kanban/KanbanBoard.jsx b/app/web/admin/features/kanban/KanbanBoard.jsx index 1e2f34a..b4f79ce 100644 --- a/app/web/admin/features/kanban/KanbanBoard.jsx +++ b/app/web/admin/features/kanban/KanbanBoard.jsx @@ -1,4 +1,5 @@ import { KANBAN_GROUPS } from "../../shared/constants.js"; +import { FilterIcon, RefreshIcon } from "../../shared/icons.jsx"; import { fallbackStatusGroup, fmtKanbanDate, resolveDeadlineTone, statusLabel } from "../../shared/utils.js"; export function KanbanBoard({ @@ -70,12 +71,15 @@ export function KanbanBoard({

Канбан заявок

Группировка по группам статусов и серверная фильтрация карточек.

-
+
- +
@@ -85,6 +89,7 @@ export function KanbanBoard({ onOpen={onOpenFilter} onRemove={onRemoveFilter} onEdit={onEditFilter} + hideAction getChipLabel={getFilterChipLabel} /> ) : null} diff --git a/app/web/admin/features/quotes/QuotesSection.jsx b/app/web/admin/features/quotes/QuotesSection.jsx index 5cb94b4..174127a 100644 --- a/app/web/admin/features/quotes/QuotesSection.jsx +++ b/app/web/admin/features/quotes/QuotesSection.jsx @@ -37,20 +37,13 @@ export function QuotesSection({

Цитаты

Управление публичной лентой цитат с серверными фильтрами.

-
- - -
{ const fieldDef = getFieldDef("quotes", clause.field); return (fieldDef ? fieldDef.label : clause.field) + " " + OPERATOR_LABELS[clause.op] + " " + getFilterValuePreview("quotes", clause); @@ -87,7 +80,15 @@ export function QuotesSection({ )} /> - + ); diff --git a/app/web/admin/features/requests/RequestsSection.jsx b/app/web/admin/features/requests/RequestsSection.jsx index 2ad86c5..67ec309 100644 --- a/app/web/admin/features/requests/RequestsSection.jsx +++ b/app/web/admin/features/requests/RequestsSection.jsx @@ -122,20 +122,13 @@ export function RequestsSection({

Заявки

Серверная фильтрация и просмотр клиентских заявок.

-
- - -
{ const fieldDef = getFieldDef("requests", clause.field); return (fieldDef ? fieldDef.label : clause.field) + " " + OPERATOR_LABELS[clause.op] + " " + getFilterValuePreview("requests", clause); @@ -195,7 +188,15 @@ export function RequestsSection({ )} /> - + ); diff --git a/app/web/admin/features/service-requests/ServiceRequestsSection.jsx b/app/web/admin/features/service-requests/ServiceRequestsSection.jsx index 87d6531..9c6c53b 100644 --- a/app/web/admin/features/service-requests/ServiceRequestsSection.jsx +++ b/app/web/admin/features/service-requests/ServiceRequestsSection.jsx @@ -63,17 +63,13 @@ export function ServiceRequestsSection({

Запросы

Запросы клиента к куратору и обращения на смену юриста.

-
- -
{ const fieldDef = getFieldDef("serviceRequests", clause.field); return ( @@ -129,7 +125,14 @@ export function ServiceRequestsSection({ )} /> - + ); diff --git a/app/web/admin/features/tables/AvailableTablesSection.jsx b/app/web/admin/features/tables/AvailableTablesSection.jsx index c5bc53a..92d6373 100644 --- a/app/web/admin/features/tables/AvailableTablesSection.jsx +++ b/app/web/admin/features/tables/AvailableTablesSection.jsx @@ -1,4 +1,5 @@ import { boolLabel, fmtDate } from "../../shared/utils.js"; +import { RefreshIcon } from "../../shared/icons.jsx"; export function AvailableTablesSection({ tables, @@ -21,8 +22,8 @@ export function AvailableTablesSection({

Доступность таблиц

Скрытая служебная вкладка. Доступ только для администратора по прямой ссылке.

-