diff --git a/ordinis-admin-ui/src/i18n.ts b/ordinis-admin-ui/src/i18n.ts
index 3727ee2..324e6d5 100644
--- a/ordinis-admin-ui/src/i18n.ts
+++ b/ordinis-admin-ui/src/i18n.ts
@@ -225,6 +225,10 @@ i18n
'dict.list.section.PUBLIC': 'Публичные',
'dict.list.section.INTERNAL': 'Внутренние',
'dict.list.section.RESTRICTED': 'Ограниченные',
+ 'dict.list.section.PUBLIC.short': 'PUB',
+ 'dict.list.section.INTERNAL.short': 'INT',
+ 'dict.list.section.RESTRICTED.short': 'RES',
+ 'dict.list.deps.short': 'СО СВЯЗЯМИ',
// Catalog v2 (URL-driven filters + sort + density)
'dict.list.heading': 'Каталог справочников',
'dict.list.filter.scope': 'Фильтр по области',
@@ -695,6 +699,10 @@ i18n
'dict.list.section.PUBLIC': 'Public',
'dict.list.section.INTERNAL': 'Internal',
'dict.list.section.RESTRICTED': 'Restricted',
+ 'dict.list.section.PUBLIC.short': 'PUB',
+ 'dict.list.section.INTERNAL.short': 'INT',
+ 'dict.list.section.RESTRICTED.short': 'RES',
+ 'dict.list.deps.short': 'WITH LINKS',
// Catalog v2
'dict.list.heading': 'Dictionary catalog',
'dict.list.filter.scope': 'Scope filter',
diff --git a/ordinis-admin-ui/src/routes/dictionaries.index.tsx b/ordinis-admin-ui/src/routes/dictionaries.index.tsx
index 660e79e..7e4de2a 100644
--- a/ordinis-admin-ui/src/routes/dictionaries.index.tsx
+++ b/ordinis-admin-ui/src/routes/dictionaries.index.tsx
@@ -213,9 +213,11 @@ function DictionariesPage() {
actions={createButton}
/>
- {/* Toolbar: search + count + scope chips + "deps only" */}
-
-
+ {/* Compact toolbar: всё в одной строке (wraps на narrow viewport).
+ Tradeoff: scope/bundle chips меньше padding'а + краткие labels.
+ UPPERCASE labels оставлены для consistency с brand voice (Tektur-like). */}
+
+
setSearch({ q: e.target.value })}
@@ -224,14 +226,15 @@ function DictionariesPage() {
/>
-
- {t('dict.list.found', { shown: filtered.length, total: data.length })}
+
+ {filtered.length}/{data.length}
+ {/* Scope chips: компактные, dot + count, full label по hover'у через title */}
{SCOPE_ORDER.map((scope) => {
const selected = scopeFilter.has(scope)
@@ -242,76 +245,86 @@ function DictionariesPage() {
type="button"
onClick={() => toggleScope(scope)}
aria-pressed={selected}
- className={`px-3 py-1.5 rounded-full text-2xs uppercase tracking-label flex items-center gap-1.5 border transition focus:outline-none focus:ring-2 focus:ring-ultramarain/40 ${
+ title={t(`dict.list.section.${scope}`)}
+ className={`px-2 py-1 rounded-full text-2xs uppercase tracking-label flex items-center gap-1 border transition focus:outline-none focus:ring-2 focus:ring-ultramarain/40 font-mono ${
selected
? 'border-ultramarain bg-orbit/40 text-ultramarain'
: 'border-regolith hover:border-ultramarain/60 text-carbon'
}`}
>
- {t(`dict.list.section.${scope}`)} · {count}
+ {t(`dict.list.section.${scope}.short`)}
+ {count}
)
})}
+ {/* Vertical divider */}
+
+
+ {/* Bundle filter — chips inline */}
+
+ setBundle(undefined)}
+ aria-pressed={!bundleFilter}
+ className={`px-2 py-1 rounded-sm text-2xs uppercase tracking-label border transition focus:outline-none focus:ring-2 focus:ring-ultramarain/40 ${
+ !bundleFilter
+ ? 'border-ultramarain bg-orbit/40 text-ultramarain'
+ : 'border-regolith hover:border-ultramarain/60 text-carbon'
+ }`}
+ >
+ {t('dict.list.bundle.all')}
+
+ {Array.from(bundleCounts.entries())
+ .sort(([a], [b]) => a.localeCompare(b))
+ .map(([bundle, count]) => {
+ const selected = bundleFilter === bundle
+ return (
+ setBundle(selected ? undefined : bundle)}
+ aria-pressed={selected}
+ className={`px-2 py-1 rounded-sm text-2xs uppercase tracking-label flex items-center gap-1 border transition focus:outline-none focus:ring-2 focus:ring-ultramarain/40 font-mono ${
+ selected
+ ? 'border-ultramarain bg-orbit/40 text-ultramarain'
+ : 'border-regolith hover:border-ultramarain/60 text-carbon'
+ }`}
+ >
+ {bundle}
+ {count}
+
+ )
+ })}
+
+
+ {/* Vertical divider + deps toggle */}
+
+
setSearch({ deps: withDepsOnly ? undefined : '1' })}
aria-pressed={withDepsOnly}
- className={`px-3 py-1.5 rounded-sm text-2xs uppercase tracking-label border transition focus:outline-none focus:ring-2 focus:ring-ultramarain/40 ${
+ title={t('dict.list.deps.only')}
+ className={`px-2 py-1 rounded-sm text-2xs uppercase tracking-label border transition focus:outline-none focus:ring-2 focus:ring-ultramarain/40 ${
withDepsOnly
? 'border-ultramarain bg-orbit/40 text-ultramarain'
: 'border-regolith hover:border-ultramarain/60 text-carbon'
}`}
>
- {t('dict.list.deps.only')}
+ {t('dict.list.deps.short')}
- {/* Bundle filter row */}
-
-
- BUNDLE
-
- setBundle(undefined)}
- aria-pressed={!bundleFilter}
- className={`px-3 py-1 rounded-sm text-2xs uppercase tracking-label border transition focus:outline-none focus:ring-2 focus:ring-ultramarain/40 ${
- !bundleFilter
- ? 'border-ultramarain bg-orbit/40 text-ultramarain'
- : 'border-regolith hover:border-ultramarain/60 text-carbon'
- }`}
- >
- {t('dict.list.bundle.all')}
-
- {Array.from(bundleCounts.entries())
- .sort(([a], [b]) => a.localeCompare(b))
- .map(([bundle, count]) => {
- const selected = bundleFilter === bundle
- return (
- setBundle(selected ? undefined : bundle)}
- aria-pressed={selected}
- className={`px-3 py-1 rounded-sm text-2xs uppercase tracking-label border transition focus:outline-none focus:ring-2 focus:ring-ultramarain/40 font-mono ${
- selected
- ? 'border-ultramarain bg-orbit/40 text-ultramarain'
- : 'border-regolith hover:border-ultramarain/60 text-carbon'
- }`}
- >
- {bundle}
- {count}
-
- )
- })}
-
-
{/* Empty state */}
{filtered.length === 0 ? (