fix(ui): restore TopBar search + add notifications bell + theme to sidebar

Follow-up к MR !90 per user feedback iterations:

1) "в поиске по справочникам два крестика" — fixed в SearchInput:
   `type="search"` (native browser X) → `type="text"`. Custom onClear X
   остаётся единственным. Catalog input тоже type="text".

2) "блин два крестика было на топбар поиске а тут норм все. верни" —
   restore TopBar search input. Context-aware behavior сохранён:
   - На /dictionaries → live filter каталога через URL ?q=
   - На остальных routes → submit (Enter) → /search records search
   Single X confirmed by visual test.

3) "свитч темы можно тоже в профиль перенести" — ThemeSwitch переехал в
   Sidebar footer (рядом с RU/EN button). Right row в footer: lang button
   слева, theme switch (3 icons sun/moon/monitor) справа через ml-auto.

4) "руководство и версию оставить в топбар чтобы подсвечивать новинки" —
   Docs + VersionBadge stays in TopBar. Туда же добавлена
   NotificationsBell (placeholder Bell icon) — broadcast slot для
   webhook errors / draft reviews / system notices когда backend
   notifications stream появится.
This commit is contained in:
Zimin A.N.
2026-05-11 22:03:12 +03:00
parent d9df2fc359
commit 7e44df3493
4 changed files with 51 additions and 27 deletions
@@ -231,10 +231,12 @@ function DictionariesPage() {
{/* Toolbar — top section of the panel, tinted bg + bottom border.
* Узкая: px-3 py-1.5 (~6px vertical) — per user feedback ("бар поужать"). */}
<div className="flex flex-wrap items-center gap-2 bg-surface-2 border-b border-line px-3 py-1.5">
{/* Catalog search — filter dicts by name/displayName/description. */}
{/* Catalog search — filter dicts by name/displayName/description.
* type="text" (не "search") чтобы избежать native X — мы рендерим
* свой clear button если нужно. */}
<div className="flex-1 min-w-[200px] max-w-xs">
<input
type="search"
type="text"
value={search.q ?? ''}
onChange={(e) =>
setSearch({ q: e.target.value || undefined })