@rt-tools/ui-kit-v2 0.4.0 → 0.5.0

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": "@rt-tools/ui-kit-v2",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Yauheni Krumin",
6
6
  "type": "module",
Binary file
@@ -36,6 +36,28 @@
36
36
  **Стопка уведомлений встроена в каркас** (`rt-toaster` внизу по центру): заводить её отдельно
37
37
  не нужно.
38
38
 
39
+ ## Уход с route-панели
40
+
41
+ Панель, живущая на своём маршруте (`RtRouteAsideComponent` + `rtAsideUnsavedGuard` на
42
+ ro-маршруте), уступает место навигацией, и о несохранённых правках её спрашивает роутер.
43
+
44
+ **Гард спрашивает панель, учтённую под маршрутом ухода, а не компонент, который ему подставил
45
+ роутер.** Когда ro-маршрут объявлен под уровнем без своего компонента — тем, что держит одни
46
+ `providers` для ветки, — Angular отдаёт детям контекст родителя, и в гард приходит компонент
47
+ первичного аутлета. Учёт ведёт `RtRouteAsideRegistry`: панель встаёт в него, когда занимает
48
+ аутлет, и снимается при уничтожении. Наружу кита учёт не выведен — приложению он не нужен.
49
+
50
+ **Компонент от роутера остаётся запасным путём.** Панель приложения может отвечать о правках,
51
+ не наследуя `RtRouteAsideComponent`: гард спросит её, если под маршрутом никто не учтён и метод
52
+ у компонента есть.
53
+
54
+ **Уход, начатый самой панелью, о правках не спрашивает.** Разрешение выдаётся вплотную к вызову
55
+ роутера, действует на один уход и снимается, если навигация не состоялась. Поэтому закрытие
56
+ после удачной записи не открывает окно про то, что уже сохранено.
57
+
58
+ **Отказом навигации гард не отвечает никогда.** Упавший ответ панели отменяет один уход и
59
+ снимает панель с учёта: приложение не запирается на адресе панели.
60
+
39
61
  ## Рядом
40
62
 
41
63
  - [`rt-toaster`](../toast/CONTEXT.md) — та самая стопка.
@@ -0,0 +1,40 @@
1
+ # `rt-table-sort-header`
2
+
3
+ Заголовок сортируемой колонки. Ставится атрибутом на ячейку шапки таблицы, а ключ колонки —
4
+ тот же, что в `cdkColumnDef` и в `[columnsConfig]`.
5
+
6
+ ```html
7
+ <th *cdkHeaderCellDef cdk-header-cell rtSortHeader="checkIn">Заезд</th>
8
+ ```
9
+
10
+ | вход | тип | умолчание |
11
+ | -------------- | -------- | ------------ |
12
+ | `rtSortHeader` | `string` | обязательный |
13
+
14
+ ## Главное, что нужно знать
15
+
16
+ **Сортируемость объявляет таблица, а не заголовок.** Колонка получает кнопку только когда
17
+ помечена `sortable` в `[columnsConfig]`; иначе заголовок остаётся обычной подписью, и лишнего
18
+ элемента управления в шапке не появляется.
19
+
20
+ **Направление читается с самой ячейки.** `aria-sort` стоит на `<th>`, а не на кнопке внутри:
21
+ скринридер объявляет порядок вместе с колонкой. Глазами то же самое показывает стрелка — обе
22
+ стрелки без сортировки, одна выбранная при ней.
23
+
24
+ **Порядок ходит по кругу из трёх состояний:** по возрастанию → по убыванию → без сортировки.
25
+ Третье нужно, чтобы вернуть исходный порядок, не перезагружая список.
26
+
27
+ **Подпись проецируется внутрь кнопки** и служит её доступным именем — отдельного `aria-label`
28
+ у кнопки нет и не должно быть.
29
+
30
+ ## Края
31
+
32
+ - Блок BEM объявлен в шаблоне, а не только классом на хосте: `rtElem` внутри требует блока в
33
+ своём инжекторе, и без него компонент не поднимался вовсе — потребитель получал `NG0201`.
34
+ - Сортировка по соседней колонке эту не помечает: `aria-sort` у неё остаётся `none`, а стрелка
35
+ возвращается к нейтральной.
36
+
37
+ ## Рядом
38
+
39
+ - [`rt-table`](../CONTEXT.md) — таблица, у которой заголовок спрашивает порядок и которой
40
+ сообщает о нажатии.
@@ -41,6 +41,11 @@
41
41
  **Идентификатор, которого нет, откатывается на первую доступную вкладку.** То же с отключённой:
42
42
  активной она стать не может. Так вкладка из старой ссылки не оставляет пустой экран.
43
43
 
44
+ **Контрол шапки объявляется `[rtTabsControl]` на `<ng-template>`.** Сторона задаётся значением
45
+ директивы: `rtTabsControl="left"` слева, `[rtTabsControl]="side"` — вычисленной стороной. Без
46
+ значения контрол встаёт справа — пустая строка приводится к правой стороне намеренно, иначе
47
+ `<ng-template rtTabsControl>` не попадал бы ни в один слот и пропадал из шапки вовсе.
48
+
44
49
  ## Клавиатура и доступность
45
50
 
46
51
  - Стрелки (влево/вправо, а в вертикальной раскладке вверх/вниз) перешагивают отключённые вкладки
@@ -43,6 +43,14 @@ this.#notifications.error('Не удалось сохранить', 'danger', {
43
43
  - `meta` — приписка над сообщением (номер заявки), `description` — вторая строка под ним.
44
44
  - Положение раскладывается на два модификатора: `rt-toaster--y--bottom` и `rt-toaster--x--right`.
45
45
 
46
+ ## Края
47
+
48
+ - **Нулевая длительность не значит «висит, пока не закроют».** `duration: 0` — это таймер на
49
+ ноль миллисекунд: тост гасит себя сразу после первой отрисовки. Держать его открытым умеет
50
+ только пауза таймера — признак `interacting` либо развёрнутая стопка.
51
+ - **В матрице каждому тосту ставится `[interacting]="true"`.** Иначе ячейки гаснут одна за
52
+ другой, пока смотришь на показ, и кадр снимается с пустой сетки.
53
+
46
54
  ## Доступность
47
55
 
48
56
  Стопка — `role="region"` с переведённой подписью, каждый тост — `role="status"` с
@@ -1036,7 +1036,7 @@ declare namespace IButton {
1036
1036
  * ```html
1037
1037
  * <button rtButton label="Войти" theme="primary"></button>
1038
1038
  * <button rtButton label="Скачать" icon="ico-download" theme="success"></button>
1039
- * <button rtButton icon="ico-pencil" theme="info" appearance="text"></button>
1039
+ * <button rtButton icon="pencil" theme="info" appearance="text"></button>
1040
1040
  * <button rtButton label="Сохранение..." [loading]="saving()" [disabled]="saving()"></button>
1041
1041
  * <a rtButton label="Главная" [routerLink]="'/'"></a>
1042
1042
  * ```
@@ -2165,19 +2165,6 @@ declare abstract class RtRouteAsideComponent<T> implements OnInit {
2165
2165
  interface IRtAsideDeactivate {
2166
2166
  canDeactivate(): Observable<boolean>;
2167
2167
  }
2168
- /**
2169
- * Панель с несохранёнными правками спрашивает о них и при смене маршрута, а не
2170
- * только при закрытии: аутлет `ro` занимает соседняя панель, и правки пропали бы
2171
- * молча.
2172
- *
2173
- * Ставится на каждый ro-маршрут: гард висит на кнопках, нажатии мимо и Esc, а
2174
- * смену маршрута ловит только роутер.
2175
- *
2176
- * Панели может не быть: роутер зовёт гард и для маршрута, чей компонент не создан.
2177
- * Спрашивать тогда не о чем — уступить место можно. Без этой проверки первая же
2178
- * такая навигация падает, а следом отказывает любая другая: маршрут остаётся
2179
- * активным, и приложение застревает на адресе панели.
2180
- */
2181
2168
  declare const rtAsideUnsavedGuard: CanDeactivateFn<IRtAsideDeactivate | null>;
2182
2169
 
2183
2170
  /**
@@ -4941,8 +4928,14 @@ declare class RtTabDirective {
4941
4928
  declare class RtTabsControlDirective {
4942
4929
  /** Шаблон контрола, выводимый в header-слоте. */
4943
4930
  readonly templateRef: TemplateRef<unknown>;
4944
- /** Сторона размещения относительно полосы вкладок. */
4945
- readonly side: InputSignal<IRtTabs.ControlSide>;
4931
+ /**
4932
+ * Сторона размещения относительно полосы вкладок.
4933
+ *
4934
+ * Пустое значение приводится к правой стороне: `<ng-template rtTabsControl>` без значения
4935
+ * задаёт входу пустую строку, а не умолчание, и такой контрол не попадал ни в левый слот,
4936
+ * ни в правый — он пропадал из шапки вовсе.
4937
+ */
4938
+ readonly side: InputSignalWithTransform<IRtTabs.ControlSide, IRtTabs.ControlSide | ''>;
4946
4939
  static ɵfac: i0.ɵɵFactoryDeclaration<RtTabsControlDirective, never>;
4947
4940
  static ɵdir: i0.ɵɵDirectiveDeclaration<RtTabsControlDirective, "[rtTabsControl]", never, { "side": { "alias": "rtTabsControl"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4948
4941
  }
Binary file