diff --git a/README.md b/README.md
index 63ebd51..c7f1ebe 100644
--- a/README.md
+++ b/README.md
@@ -124,11 +124,32 @@ ecosystem/
"accent": "violet",
"showNumbers": false,
"showTreeTags": true,
- "treeTwoColumn": false,
+ "showTreeType": false,
+ "treeMetaLayout": "inline",
+ "treeColumns": 2,
"autoCollapseSearch": true,
"sidebarWidth": 390,
+ "topBarHeight": 140,
+ "shellMaxWidth": 2800,
+ "sidebarMinWidth": 260,
+ "sidebarMaxWidth": 800,
+ "sidebarMaxWidthWide": 1400,
+ "treeSidebarBaseWidth": 420,
+ "treeSidebarColumnWidth": 120,
+ "topBarMinHeight": 80,
+ "topBarMaxHeight": 560,
"searchPlaceholder": "Grafana, S3, журнал, сервер..."
},
+ "limits": {
+ "shellMaxWidth": { "min": 1200, "max": 3840 },
+ "sidebarMinWidth": { "min": 200, "max": 480 },
+ "sidebarMaxWidth": { "min": 400, "max": 1200 },
+ "sidebarMaxWidthWide": { "min": 560, "max": 2000 },
+ "treeSidebarBaseWidth": { "min": 280, "max": 720 },
+ "treeSidebarColumnWidth": { "min": 60, "max": 200 },
+ "topBarMinHeight": { "min": 64, "max": 240 },
+ "topBarMaxHeight": { "min": 160, "max": 800 }
+ },
"features": {
"allowNavLayoutChange": true,
"allowSearch": true,
@@ -136,6 +157,7 @@ ecosystem/
"allowShowNumbers": true,
"allowTreeOptions": true,
"allowSidebarResize": true,
+ "allowLayoutLimitsChange": true,
"allowThemeChange": true,
"allowAccentChange": true
}
@@ -144,7 +166,8 @@ ecosystem/
| `defaults` | Варианты | Описание |
|------------|----------|----------|
-| `navLayout` | `"sidebar"`, `"top"` | `"sidebar"` — дерево слева; `"top"` — шапка с названием и поиском, без дерева |
+| `navLayout` | `"sidebar"`, `"top"` | `"sidebar"` — панель слева; `"top"` — шапка с названием и поиском |
+| `showTree` | `true`, `false` | Показывать дерево навигации (в любом режиме макета) |
| `theme` | `"dark"`, `"light"` | Стартовая цветовая тема |
| `view` | `"cards"`, `"list"`, `"compact-cards"`, `"compact-list"` | Режим отображения каталога |
| `accent` | `"violet"`, `"cyan"`, `"lime"`, `"amber"`, `"custom"` | Пресет акцента; при `"custom"` используются поля градиента ниже |
@@ -152,26 +175,54 @@ ecosystem/
| `customAccentTo` | `#rrggbb` | Цвет «до» для `accent: "custom"` (по умолчанию `#22d3ee`) |
| `customAccentAngle` | `0`–`360` | Угол градиента в градусах (по умолчанию `135`) |
| `showNumbers` | `true`, `false` | Показывать номера разделов, подразделов и элементов |
-| `showTreeTags` | `true`, `false` | Теги рядом с элементами в дереве (взаимоисключимо с `treeTwoColumn`) |
-| `treeTwoColumn` | `true`, `false` | Элементы папок дерева в 2 колонки (взаимоисключимо с `showTreeTags`) |
+| `showTreeTags` | `true`, `false` | Теги элементов в дереве (оформление как на карточках) |
+| `showTreeType` | `true`, `false` | Подпись типа сервиса в дереве |
+| `treeMetaLayout` | `"inline"`, `"stacked"` | Расположение тегов и типа: сбоку от названия или снизу |
+| `treeColumns` | `1`–`6` (по умолчанию `2`) | Число колонок элементов внутри папок дерева |
| `autoCollapseSearch` | `true`, `false` | При поиске сворачивать ветки дерева без совпадений |
-| `sidebarWidth` | `260`–`560` (`760` при `treeTwoColumn: true`) | Ширина боковой панели в px; игнорируется при `navLayout: "top"` |
+| `sidebarWidth` | `sidebarMinWidth`–`sidebarMaxWidth` (или `sidebarMaxWidthWide` при `treeColumns` > 1) | Текущая ширина бокового меню (drag-resize); при `navLayout: "top"` не применяется |
+| `topBarHeight` | `topBarMinHeight`–`topBarMaxHeight` (до ~75% высоты окна) | Текущая высота верхней шапки (drag-resize); только при `navLayout: "top"` |
+| `shellMaxWidth` | см. `limits.shellMaxWidth` | Максимальная ширина контейнера `.shell` (вся страница) |
+| `sidebarMinWidth` | см. `limits.sidebarMinWidth` | Минимальная ширина бокового меню при drag-resize |
+| `sidebarMaxWidth` | см. `limits.sidebarMaxWidth` | Максимальная ширина меню при `treeColumns: 1` |
+| `sidebarMaxWidthWide` | см. `limits.sidebarMaxWidthWide` | Потолок ширины меню при нескольких колонках дерева |
+| `treeSidebarBaseWidth` | см. `limits.treeSidebarBaseWidth` | База формулы ширины меню: `base + columns × step` |
+| `treeSidebarColumnWidth` | см. `limits.treeSidebarColumnWidth` | Прирост ширины меню за каждую колонку дерева |
+| `topBarMinHeight` | см. `limits.topBarMinHeight` | Минимальная высота шапки в режиме «Сверху» |
+| `topBarMaxHeight` | см. `limits.topBarMaxHeight` | Максимальная высота шапки (также ограничена ~75% окна) |
| `searchPlaceholder` | произвольная строка | Текст-подсказка в поле поиска |
+| `limits` | Формат | Описание |
+|----------|--------|----------|
+| `shellMaxWidth` | `{ "min", "max" }` | Диапазон слайдера «Ширина контента» в ⚙ → Габариты |
+| `sidebarMinWidth` | `{ "min", "max" }` | Диапазон «Меню: мин. ширина» |
+| `sidebarMaxWidth` | `{ "min", "max" }` | Диапазон «Меню: макс. (1 кол.)» |
+| `sidebarMaxWidthWide` | `{ "min", "max" }` | Диапазон «Меню: макс. (неск. кол.)» |
+| `treeSidebarBaseWidth` | `{ "min", "max" }` | Диапазон «Дерево: база ширины» |
+| `treeSidebarColumnWidth` | `{ "min", "max" }` | Диапазон «Дерево: ширина колонки» |
+| `topBarMinHeight` | `{ "min", "max" }` | Диапазон «Шапка: мин. высота» |
+| `topBarMaxHeight` | `{ "min", "max" }` | Диапазон «Шапка: макс. высота» |
+
+При `treeColumns > 1` фактический потолок ширины меню: `min(sidebarMaxWidthWide, treeSidebarBaseWidth + treeColumns × treeSidebarColumnWidth)`.
+
+`shellMaxWidth` автоматически не опускается ниже `sidebarMaxWidthWide + 320`, чтобы оставалось место для каталога.
+
| `features` | Варианты | Описание |
|------------|----------|----------|
| `allowNavLayoutChange` | `true`, `false` | Переключатель «Сбоку / Сверху» |
+| `allowShowTreeChange` | `true`, `false` | Показ/скрытие дерева и кнопка «Скрыть дерево» в панели |
| `allowSearch` | `true`, `false` | Поле поиска |
| `allowViewChange` | `true`, `false` | Режимы каталога |
| `allowShowNumbers` | `true`, `false` | Нумерация |
-| `allowTreeOptions` | `true`, `false` | Теги, 2 колонки, авто-раскрытие дерева |
-| `allowSidebarResize` | `true`, `false` | Drag-resize боковой панели |
+| `allowTreeOptions` | `true`, `false` | Колонки, теги, тип, расположение мета, авто-раскрытие дерева |
+| `allowSidebarResize` | `true`, `false` | Drag-resize боковой панели (ширина) или верхней шапки (высота) |
+| `allowLayoutLimitsChange` | `true`, `false` | Раздел ⚙ «Габариты»: лимиты ширины контента и навигации |
| `allowThemeChange` | `true`, `false` | Светлая / тёмная тема |
| `allowAccentChange` | `true`, `false` | Пресеты и свой градиент |
Пользовательские изменения сохраняются в `localStorage`, но заблокированные `features` всегда возвращаются к `defaults`.
-Пример пресета «только шапка»: [`settings-top-bar.example.json`](settings-top-bar.example.json) — `navLayout: "top"`, дерево и resize отключены.
+Пример пресета «шапка сверху»: [`settings-top-bar.example.json`](settings-top-bar.example.json) — `navLayout: "top"`, дерево по умолчанию скрыто (`showTree: false`), но его можно включить.
### Форматы иерархии
@@ -282,7 +333,7 @@ npx serve .
Базовые типы заданы в `script.js` (`defaultServiceMeta`):
-`ceph`, `cloudbeaver`, `config`, `gitea`, `grafana`, `ipmi`, `kubernetes`, `ldap`, `messages`, `opensearch`, `postgresql`, `prometheus`, `rabbitmq`, `redmine`, `rules`, `xpath`, `xmpp`
+`analytics`, `api`, `calendar`, `ceph`, `chat`, `cicd`, `cloudbeaver`, `config`, `drive`, `forum`, `gitea`, `grafana`, `ipmi`, `kubernetes`, `ldap`, `messages`, `opensearch`, `postgresql`, `prometheus`, `rabbitmq`, `redmine`, `rules`, `social`, `vault`, `video`, `vpn`, `wiki`, `xpath`, `xmpp`
Каждый тип имеет собственную SVG в `assets/` (например, `postgresql.svg`, `cloudbeaver.svg`). Иконка показывается на карточке каталога и в дереве навигации.
@@ -329,14 +380,18 @@ Popup сгруппирован по разделам. Доступные бло
| Раздел | Настройки |
|--------|-----------|
-| **Макет** | Панель навигации: **Сбоку** (дерево + поиск) или **Сверху** (только название и поиск) |
+| **Макет** | **Сбоку** / **Сверху**; при «Сбоку» — toggle «Показывать дерево» и кнопка «Скрыть/Показать дерево» в панели |
| **Каталог** | Вид карточек, нумерация |
-| **Дерево** | Теги, 2 колонки, авто-раскрытие поиска (только при `navLayout: sidebar`) |
+| **Дерево** | Теги, 2 колонки, авто-раскрытие (при `showTree: true`; 2 колонки — только «Сбоку») |
| **Оформление** | Тема, акцент, свой градиент |
### Режим «Сверху»
-Компактная шапка над каталогом: заголовок панели, поиск и ⚙. Дерево навигации скрыто — переход только через карточки каталога. Подходит для простых порталов и когда дерево избыточно.
+Компактная шапка: заголовок, поиск и ⚙. Дерево по умолчанию скрыто, но его можно включить (`showTree: true`) — оно появится под шапкой на всю ширину.
+
+### Скрытие дерева
+
+Дерево управляется отдельно от макета (`showTree`). Переключение — в ⚙ → **Макет** или кнопкой **Скрыть/Показать дерево** под поиском.
### Свой градиент
diff --git a/assets/analytics.svg b/assets/analytics.svg
new file mode 100644
index 0000000..78ef5b5
--- /dev/null
+++ b/assets/analytics.svg
@@ -0,0 +1 @@
+
diff --git a/assets/api.svg b/assets/api.svg
new file mode 100644
index 0000000..893233a
--- /dev/null
+++ b/assets/api.svg
@@ -0,0 +1 @@
+
diff --git a/assets/calendar.svg b/assets/calendar.svg
new file mode 100644
index 0000000..c47f8fe
--- /dev/null
+++ b/assets/calendar.svg
@@ -0,0 +1 @@
+
diff --git a/assets/chat.svg b/assets/chat.svg
new file mode 100644
index 0000000..69dd009
--- /dev/null
+++ b/assets/chat.svg
@@ -0,0 +1 @@
+
diff --git a/assets/cicd.svg b/assets/cicd.svg
new file mode 100644
index 0000000..6f510ad
--- /dev/null
+++ b/assets/cicd.svg
@@ -0,0 +1 @@
+
diff --git a/assets/drive.svg b/assets/drive.svg
new file mode 100644
index 0000000..8ebbff8
--- /dev/null
+++ b/assets/drive.svg
@@ -0,0 +1 @@
+
diff --git a/assets/forum.svg b/assets/forum.svg
new file mode 100644
index 0000000..1688d2d
--- /dev/null
+++ b/assets/forum.svg
@@ -0,0 +1 @@
+
diff --git a/assets/social.svg b/assets/social.svg
new file mode 100644
index 0000000..fba41d6
--- /dev/null
+++ b/assets/social.svg
@@ -0,0 +1 @@
+
diff --git a/assets/vault.svg b/assets/vault.svg
new file mode 100644
index 0000000..14118fa
--- /dev/null
+++ b/assets/vault.svg
@@ -0,0 +1 @@
+
diff --git a/assets/video.svg b/assets/video.svg
new file mode 100644
index 0000000..2452348
--- /dev/null
+++ b/assets/video.svg
@@ -0,0 +1 @@
+
diff --git a/assets/vpn.svg b/assets/vpn.svg
new file mode 100644
index 0000000..596c257
--- /dev/null
+++ b/assets/vpn.svg
@@ -0,0 +1 @@
+
diff --git a/assets/wiki.svg b/assets/wiki.svg
new file mode 100644
index 0000000..2ee7a0b
--- /dev/null
+++ b/assets/wiki.svg
@@ -0,0 +1 @@
+
diff --git a/examples/flat/index.html b/examples/flat/index.html
index 2a6f59d..4d80fc9 100644
--- a/examples/flat/index.html
+++ b/examples/flat/index.html
@@ -5,9 +5,9 @@
-
Пример: плоский список
+ Панель экосистемы
- Пример: плоский список
+ Панель экосистемы