elcrm 1.1.22 → 1.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "elcrm",
3
- "version": "1.1.22",
3
+ "version": "1.1.23",
4
4
  "description": "CLI @elcrm/*: doctor --fix (порядок проекта), update, css, docs, cursor, kit, migrate",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -31,7 +31,8 @@ import type { PricingPlan, HealthmapData } from "@elcrm/components";
31
31
  - **PageHead** — title + actions. `sup` — текст или Badge сразу после title (надстрочно; `0` скрыт). `sticky` — шапка прилипает к верху скролла (фон `--shell-bg`). `children` — фильтры/поиск под заголовком, отступ `--shell-gap`.
32
32
  - **Section** — блок контента / auth.
33
33
  - **Layout / Header** — оболочка приложения. `Layout sidebar={<Sidebar />}` — ряд: меню слева + контент. `fixed={["header", "footer", "sidebar"]}` (по умолчанию) — эти слоты не скроллятся, крутится только `children`. `fixed={[]}` — поток страницы. Высота каркаса: `--layout-height` (`100dvh`).
34
- - **Sidebar** — левое меню. `variant="cards"` (карточки) или `"plain"` (плоский backoffice). `groups` + `value`. Слоты: `brand`, `extra`, `footer`. Меню аккаунта: `footerItems` (как у Dropdown) + `onFooterSelect` клик по `footer` открывает панель, справа ⋮. Пункты: `--sidebar-item-font-size`, `--sidebar-item-padding`, `--sidebar-icon-size`, `--sidebar-group-font-size`. Не наследуют `body` 18px (`Item` `font: inherit` перебит).
34
+ - **Sidebar** — левое меню. `variant="cards"` (карточки) или `"plain"` (плоский backoffice). `groups` + `value`. Подменю: у пункта `items` + `defaultOpen` (открыто/скрыто при старте). Контроль: `open` / `onOpenChange` (массив `value` родителей). Клик по родителю только раскрывает; `onSelect` у листьев. Если выбран потомок — ветка открывается. Слоты: `brand`, `extra`, `footer`. Меню аккаунта: `footerItems` + `onFooterSelect`. Отступ вложенных: `--sidebar-indent`.
35
+ - **NavSections** — сайдбар страницы + lazy-панель. Подменю как у Sidebar: `items` + `defaultOpen`, `open` / `onOpenChange`. Панель грузится по `value` листа (`resolveSection`). Клик по родителю только раскрывает.
35
36
  - **Stack** — ряд/колонка/сетка (`direction="row"|"column"|"grid"`). Не `Block` / `Row` / `Column`. Сетка: `auto-fit` + `--stack-grid-min`, либо `columns={4}` / `columns={["1fr", "100px", "auto"]}`. С `columns` ряды `stretch` (карточки не наезжают); в одну линию — `style={{ alignItems: "center" }}`. Не `height: 100%` у детей сетки.
36
37
  - **Card** — курсор: `--card-pointer` (`auto` / `pointer`). Сетка Stack: `--stack-grid-min`.
37
38
  - **Stat** — метрика: `label` + `value`, `tone` как у Badge, `labelMuted`. Не собирать из `span` в приложении.
@@ -10,7 +10,8 @@
10
10
  function EditModal({ id, onClose }: { id: number; onClose?: () => void }) {
11
11
  return (
12
12
  <Modal.Main title="Редактирование" onClose={onClose} size="m">
13
- <Modal.Scroll>…</Modal.Scroll>
13
+ {/* scroll + padding по умолчанию — без Modal.Scroll */}
14
+ <p>…</p>
14
15
  </Modal.Main>
15
16
  );
16
17
  }
@@ -25,12 +26,30 @@ Open({ id: 123 });
25
26
 
26
27
  | API | Зачем |
27
28
  | --- | --- |
28
- | `Modal.Main` | окно + оверлей: `title`, `size`, `button`, `tabs`, `menu`, `shake`, `escape` |
29
- | `Modal.Panel` | без оверлея |
30
- | `Modal.Scroll` / `Center` / `Form` / `Column` / `List` | раскладка |
29
+ | `Modal.Main` | окно + оверлей: `title`, `size`, `button`, `tabs`, `menu`, `shake`, `escape`, **`scroll`**, **`padding`** |
30
+ | `Modal.Panel` | без оверлея (те же props) |
31
+ | `Modal.Scroll` | редко: сырой layout или `padding={false}` внутри |
32
+ | `Center` / `Form` / `Column` / `List` | раскладка |
31
33
  | `Modal.Close(name?)` | одно или все |
32
34
  | `Modal.Shake` | тряска |
33
35
 
36
+ ### Отступы (по умолчанию уже есть)
37
+
38
+ Один токен **`--modal-padding`** (default `30px`) — шапка, тело, футер, Form, List.
39
+
40
+ | Как | Пример |
41
+ | --- | --- |
42
+ | Тема на всё приложение | `--modal-padding: 24px` в `theme-*.css` |
43
+ | Одно окно | `<Modal.Main padding="20px">` |
44
+ | Без отступов тела | `padding={false}` |
45
+ | Выключить авто-Scroll | `scroll={false}` |
46
+
47
+ `Modal.Main` / `Panel` сами оборачивают children в `Modal.Scroll` с отступами.
48
+
49
+ - Обычный контент — **не** пишите `Modal.Scroll`.
50
+ - Единственный `Modal.List` или `Modal.Form` — без внешнего Scroll (свои отступы через тот же токен).
51
+ - Если единственный ребёнок уже `Modal.Scroll` — второй раз не оборачиваем.
52
+
34
53
  `size`: `a` auto · `s` 400 · `m` 500 · `l` 800 · `x` 1000 · `f` full · `p` page (весь экран поверх страницы).
35
54
  `escape` закрывает верхнее; клик по оверлею при `shake` (default true) трясёт, не закрывает; крестик закрывает всегда. Для `size="p"` обычно `shake={false}`.
36
55
 
@@ -58,3 +77,4 @@ Card.Open({ id: 1 }, { origin: event.currentTarget });
58
77
  - `key={Date.now()}` на модалке.
59
78
  - Без `Modal.Init`.
60
79
  - Нативные input внутри модалки — `@elcrm/form`.
80
+ - Ручные `padding: 0` / пустой layout «в край» без нужды — дефолт уже с отступами.
@@ -143,6 +143,7 @@
143
143
  --sidebar-item-padding: 6px 10px;
144
144
  --sidebar-icon-size: 16px;
145
145
  --sidebar-group-font-size: 11px;
146
+ --sidebar-indent: 14px;
146
147
  --pricing-card-min-width: 16rem;
147
148
  --pricing-table-label-width: 10rem;
148
149
  --chat-list-width: 340px;
@@ -154,6 +154,7 @@
154
154
  --sidebar-item-padding: 6px 10px;
155
155
  --sidebar-icon-size: 16px;
156
156
  --sidebar-group-font-size: 11px;
157
+ --sidebar-indent: 14px;
157
158
  --pricing-card-min-width: 16rem;
158
159
  --pricing-table-label-width: 10rem;
159
160
  --chat-list-width: 340px;