@rt-tools/ui-kit-v2 0.38.0 → 0.39.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.
Files changed (33) hide show
  1. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +43 -5
  2. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
  3. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +1 -0
  4. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  5. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +5 -2
  6. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
  7. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +2 -2
  8. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
  9. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs +22 -6
  10. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs.map +1 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs +9 -5
  12. package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs.map +1 -1
  13. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +2 -1
  14. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  15. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +3 -1
  16. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
  17. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +342 -17
  18. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
  19. package/package.json +1 -1
  20. package/src/lib/components/aside/CONTEXT.md +4 -1
  21. package/src/lib/components/aside/header/rt-aside-header.component.scss +4 -1
  22. package/src/lib/components/popover/CONTEXT.md +3 -0
  23. package/src/lib/components/profile-menu/CONTEXT.md +4 -0
  24. package/src/lib/components/profile-menu/rt-profile-menu.component.scss +11 -0
  25. package/src/lib/components/tabs/CONTEXT.md +1 -0
  26. package/src/lib/components/toolbar/CONTEXT.md +21 -4
  27. package/src/lib/components/toolbar/filters-aside/rt-toolbar-filters-aside.component.scss +22 -0
  28. package/src/lib/components/toolbar/rt-toolbar.component.scss +12 -0
  29. package/types/rt-tools-ui-kit-v2-aside.d.ts +21 -2
  30. package/types/rt-tools-ui-kit-v2-core.d.ts +1 -0
  31. package/types/rt-tools-ui-kit-v2-popover.d.ts +3 -1
  32. package/types/rt-tools-ui-kit-v2-profile-menu.d.ts +6 -1
  33. package/types/rt-tools-ui-kit-v2-toolbar.d.ts +79 -2
@@ -10,11 +10,15 @@
10
10
  </rt-toolbar>
11
11
  ```
12
12
 
13
- | вход | тип | умолчание |
14
- | ------- | --------- | --------- |
15
- | `dense` | `boolean` | `false` |
13
+ | вход | тип | умолчание |
14
+ | --------------- | --------- | --------- |
15
+ | `dense` | `boolean` | `false` |
16
+ | `filtersActive` | `boolean` | `false` |
16
17
 
17
- Выходов нет.
18
+ | выход | когда |
19
+ | -------------- | ---------------------------------------------- |
20
+ | `filtersApply` | нажата «Применить» панели отборов, она закрыта |
21
+ | `filtersReset` | нажата «Сбросить» панели отборов, она открыта |
18
22
 
19
23
  ## Главное, что нужно знать
20
24
 
@@ -37,3 +41,16 @@
37
41
  **Плотная полоса остаётся строкой на любой ширине, и её левая часть сжимается.** Длинный
38
42
  заголовок в ней переносится по словам и не выходит за правый край. Кнопки справа держат свою
39
43
  ширину. Обычная полоса левую часть не сжимает: на узком экране она стекает в колонку.
44
+
45
+ **Отборы списка объявляются слотом `rtToolbarFilters`, и на узком месте они уходят за кнопку.** На
46
+ широком месте слот стоит в левой части после её содержимого. На узком месте
47
+ (`BreakpointsService.narrow`) вместо полей рисуется кнопка фильтров, первой в ряду кнопок правой
48
+ части; ниже 768 этот ряд начинается от левого края. Вход `filtersActive` ставит точку в угол значка.
49
+ Кнопка открывает панель `RtToolbarFiltersAsideComponent` службой боковых панелей. «Сбросить»
50
+ сообщает `filtersReset`, и панель остаётся открытой; «Применить» сообщает `filtersApply` и
51
+ закрывает её. Контекст шаблона — место, где он нарисован: `bar` или `panel`. Хозяин панели —
52
+ инжектор полосы: уничтожение полосы закрывает панель, и расширение места тоже — иначе поля отборов
53
+ стояли бы в полосе и в панели сразу; фокус из закрытой так панели уходит в левую секцию полосы.
54
+ Второе нажатие кнопки, пока панель открыта, ничего не открывает. Панель держит фокус
55
+ (`trapFocus`) и объявлена модальным диалогом (`modal`), а имя кнопки при `filtersActive` говорит
56
+ скринридеру, что отбор включён.
@@ -0,0 +1,22 @@
1
+ @layer rt-kit.components {
2
+ /* rt-toolbar-filters-aside — панель отборов полосы на узком экране. ViewEncapsulation.None. */
3
+ .rt-toolbar-filters-aside {
4
+ --rt-toolbar-filters-aside-gap: var(--rt-space-md);
5
+
6
+ /* Поля отборов — одно под другим во всю ширину тела панели. */
7
+ &__fields {
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: var(--rt-toolbar-filters-aside-gap);
11
+
12
+ // Блок получает начальный фокус панели как место, а не как элемент управления: рамки нет
13
+ &:focus {
14
+ outline: none;
15
+ }
16
+
17
+ > * {
18
+ width: 100%;
19
+ }
20
+ }
21
+ }
22
+ }
@@ -83,6 +83,12 @@
83
83
  gap: var(--rt-space-sm);
84
84
  }
85
85
  }
86
+
87
+ /* Кнопка фильтров узкого места — первая в ряду кнопок и не сжимается: точка включённого
88
+ отбора выступает за её угол, и полоса её не режет — у секций нет своего overflow. */
89
+ &__filters-trigger {
90
+ flex-shrink: 0;
91
+ }
86
92
  }
87
93
 
88
94
  // Плотная полоса не стекает в колонку, и длинный заголовок левой зоны ей некуда деть: зона
@@ -119,5 +125,11 @@
119
125
  margin-left: 0;
120
126
  }
121
127
  }
128
+
129
+ // Отборы ушли за кнопку: она открывает ряд кнопок полосы у левого края, как в макете
130
+ // «Телефон · Toolbar · фильтры за кнопкой».
131
+ .rt-toolbar--filters-collapsed:not(.rt-toolbar--dense) .rt-toolbar__bar--right {
132
+ justify-content: flex-start;
133
+ }
122
134
  }
123
135
  }
@@ -35,7 +35,8 @@ export type TRtAsideContentLayout = 'default' | 'tabs';
35
35
  * обводка фокуса поля срезалась краем такого мини-скроллера.
36
36
  *
37
37
  * Семантика — `role="complementary"` (mirror rt-dialog имеет `role="dialog"`,
38
- * aside — другая роль, side-sheet не обязательно блокирующий).
38
+ * aside — другая роль, side-sheet не обязательно блокирующий). Панель, которая блокирует
39
+ * страницу и держит фокус, включает вход `modal`: рамка объявлена `role="dialog"` с `aria-modal`.
39
40
  *
40
41
  * `ViewEncapsulation.None` — стили префиксованы `.rt-aside`, чтобы соседние
41
42
  * rt-aside-header / rt-aside-footer работали с одним BEM-блоком без
@@ -59,6 +60,8 @@ export declare class RtAsideComponent {
59
60
  * элемент под Tab, а когда панель уходит или вход гаснет, возвращается туда, где стоял.
60
61
  */
61
62
  readonly trapFocus: InputSignalWithTransform<boolean, BooleanInput>;
63
+ /** Панель блокирует страницу: рамка объявлена скринридеру модальным диалогом. */
64
+ readonly modal: InputSignalWithTransform<boolean, BooleanInput>;
62
65
  /** Идёт запрос: панель накрыта слоем с крутилкой и помечена занятой. */
63
66
  readonly pending: InputSignalWithTransform<boolean, BooleanInput>;
64
67
  constructor();
@@ -94,6 +97,11 @@ export declare class RtAsideComponent {
94
97
  "required": false;
95
98
  "isSignal": true;
96
99
  };
100
+ "modal": {
101
+ "alias": "modal";
102
+ "required": false;
103
+ "isSignal": true;
104
+ };
97
105
  "pending": {
98
106
  "alias": "pending";
99
107
  "required": false;
@@ -429,9 +437,20 @@ export declare class RtAsideFooterComponent {
429
437
  #private;
430
438
  protected readonly buttons: Signal<readonly RtButtonDirective[]>;
431
439
  protected readonly hosts: Signal<readonly ElementRef<HTMLElement>[]>;
440
+ /**
441
+ * На телефоне кнопка слота `[asideDismiss]` читается «Закрыть»: так она названа у всех панелей.
442
+ * `false` оставляет подпись потребителя — у панели фильтров эта кнопка «Сбросить», а не выход.
443
+ */
444
+ readonly phoneCloseLabel: InputSignalWithTransform<boolean, boolean | string>;
432
445
  constructor();
433
446
  static ɵfac: i0.ɵɵFactoryDeclaration<RtAsideFooterComponent, never>;
434
- static ɵcmp: i0.ɵɵComponentDeclaration<RtAsideFooterComponent, "rt-aside-footer", never, {}, {}, ["buttons", "hosts"], ["[asideDismiss]", "[asidePrimary]"], true, never>;
447
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtAsideFooterComponent, "rt-aside-footer", never, {
448
+ "phoneCloseLabel": {
449
+ "alias": "phoneCloseLabel";
450
+ "required": false;
451
+ "isSignal": true;
452
+ };
453
+ }, {}, ["buttons", "hosts"], ["[asideDismiss]", "[asidePrimary]"], true, never>;
435
454
  }
436
455
  /**
437
456
  * Блок ошибки запроса боковой панели: надпись и кнопка, которая кладёт в буфер обмена время и
@@ -670,6 +670,7 @@ export declare const RT_KIT_LABELS_EN: {
670
670
  readonly uiFilterStartsWith: "Starts with";
671
671
  readonly uiFilterValue: "Filter value";
672
672
  readonly uiFilters: "Filters";
673
+ readonly uiFiltersActive: "Filters, applied";
673
674
  readonly uiForward: "Forward";
674
675
  readonly uiHide: "Hide";
675
676
  readonly uiHideColumn: "Hide column";
@@ -26,7 +26,8 @@ export declare namespace IRtPopover {
26
26
  * Триггеры:
27
27
  * - `click` (default) — toggle по клику на host; outside-click закрывает.
28
28
  * - `hover` — открытие на `mouseenter`, закрытие с grace-периодом на `mouseleave`
29
- * (наведение на панель удерживает её открытой).
29
+ * (наведение на панель удерживает её открытой). Наведение судится только мышиное:
30
+ * касание и перо открывают панель нажатием.
30
31
  * - `manual` — авто-listener'ы не вешаются; host сам зовёт `open()/close()`.
31
32
  * Используется form-control'ами с собственным жестом (autocomplete — открытие
32
33
  * по набору текста).
@@ -80,6 +81,7 @@ export declare class RtPopoverDirective implements OnDestroy {
80
81
  close(): void;
81
82
  toggle(): void;
82
83
  protected onHostClick(): void;
84
+ protected onHostPointerEnter(event: PointerEvent): void;
83
85
  protected onHostMouseEnter(): void;
84
86
  protected onHostMouseLeave(event: MouseEvent): void;
85
87
  static ɵfac: i0.ɵɵFactoryDeclaration<RtPopoverDirective, never>;
@@ -2,6 +2,7 @@ import { BooleanInput } from "@angular/cdk/coercion";
2
2
  import * as i0 from "@angular/core";
3
3
  import { InputSignal, InputSignalWithTransform, OutputEmitterRef, Signal } from "@angular/core";
4
4
  import { IRtIcon, TRtKitLabelMap } from "@rt-tools/ui-kit-v2/core";
5
+ import * as i1 from "@angular/cdk/scrolling";
5
6
  /**
6
7
  * Модель `<rt-profile-menu>`: один корневой неймспейс с префиксом `I`.
7
8
  */
@@ -99,5 +100,9 @@ export declare class RtProfileMenuComponent {
99
100
  "changePassword": "changePassword";
100
101
  "localeChange": "localeChange";
101
102
  "signOut": "signOut";
102
- }, never, never, true, never>;
103
+ }, never, never, true, [{
104
+ directive: typeof i1.CdkScrollable;
105
+ inputs: {};
106
+ outputs: {};
107
+ }]>;
103
108
  }
@@ -1,5 +1,19 @@
1
1
  import * as i0 from "@angular/core";
2
- import { InputSignalWithTransform, Signal, TemplateRef } from "@angular/core";
2
+ import { InputSignalWithTransform, OutputEmitterRef, Signal, TemplateRef } from "@angular/core";
3
+ export declare namespace IRtToolbar {
4
+ /** Где нарисован слот отборов: в полосе широкого экрана или в панели узкого. */
5
+ type TFiltersPlace = 'bar' | 'panel';
6
+ /** Контекст шаблона `rtToolbarFilters`: полю в панели нужна подпись над ним, полю в полосе — нет. */
7
+ interface IFiltersContext {
8
+ $implicit: TFiltersPlace;
9
+ }
10
+ /** Данные панели отборов: шаблон слота и два нажатия подвала. */
11
+ interface IFiltersPanelData {
12
+ template: TemplateRef<IFiltersContext>;
13
+ reset: () => void;
14
+ apply: () => void;
15
+ }
16
+ }
3
17
  /**
4
18
  * Маркер-директива для контента в левой секции тулбара.
5
19
  *
@@ -48,7 +62,35 @@ export declare class RtToolbarRightDirective {
48
62
  static ɵfac: i0.ɵɵFactoryDeclaration<RtToolbarRightDirective, never>;
49
63
  static ɵdir: i0.ɵɵDirectiveDeclaration<RtToolbarRightDirective, "[rtToolbarRight]", never, {}, {}, never, never, true, never>;
50
64
  }
65
+ /**
66
+ * Маркер-директива для отборов списка. На широком экране они стоят в левой секции после её
67
+ * содержимого, на узком — за кнопкой фильтров, которая открывает панель отборов. Контекст шаблона
68
+ * — место, где он нарисован: `bar` или `panel`.
69
+ *
70
+ * @example
71
+ * ```html
72
+ * <rt-toolbar [filtersActive]="hasFilter()" (filtersReset)="reset()">
73
+ * <ng-template rtToolbarFilters let-place>
74
+ * <rt-select [label]="place === 'panel' ? 'Статус' : null" … />
75
+ * </ng-template>
76
+ * </rt-toolbar>
77
+ * ```
78
+ */
79
+ export declare class RtToolbarFiltersDirective {
80
+ static ngTemplateContextGuard(_directive: RtToolbarFiltersDirective, context: unknown): context is IRtToolbar.IFiltersContext;
81
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtToolbarFiltersDirective, never>;
82
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RtToolbarFiltersDirective, "[rtToolbarFilters]", never, {}, {}, never, never, true, never>;
83
+ }
51
84
  export declare class RtToolbarComponent {
85
+ #private;
86
+ protected readonly filtersLabel: Signal<string>;
87
+ /** Имя кнопки для скринридера: точку в углу он не видит, и включённый отбор назван словами. */
88
+ protected readonly filtersAriaLabel: Signal<string>;
89
+ protected readonly filtersTpl: Signal<TemplateRef<IRtToolbar.IFiltersContext> | undefined>;
90
+ /** Отборы ушли за кнопку: они объявлены, а место узкое. */
91
+ protected readonly collapsed: Signal<boolean>;
92
+ /** Отборы стоят в левой секции: они объявлены, а место широкое. */
93
+ protected readonly filtersInBar: Signal<boolean>;
52
94
  protected readonly leftTpl: Signal<TemplateRef<unknown> | undefined>;
53
95
  protected readonly centerTpl: Signal<TemplateRef<unknown> | undefined>;
54
96
  protected readonly rightTpl: Signal<TemplateRef<unknown> | undefined>;
@@ -58,6 +100,14 @@ export declare class RtToolbarComponent {
58
100
  * ≤768px, что для узкой шапки (напр. rt-chat) неверно.
59
101
  */
60
102
  readonly dense: InputSignalWithTransform<boolean, boolean | string>;
103
+ /** Включён хотя бы один отбор: кнопка фильтров узкого экрана несёт точку в углу значка. */
104
+ readonly filtersActive: InputSignalWithTransform<boolean, boolean | string>;
105
+ /** Нажата «Применить» панели отборов; панель после этого закрыта. */
106
+ readonly filtersApply: OutputEmitterRef<void>;
107
+ /** Нажата «Сбросить» панели отборов; панель остаётся открытой. */
108
+ readonly filtersReset: OutputEmitterRef<void>;
109
+ constructor();
110
+ protected openFilters(): void;
61
111
  static ɵfac: i0.ɵɵFactoryDeclaration<RtToolbarComponent, never>;
62
112
  static ɵcmp: i0.ɵɵComponentDeclaration<RtToolbarComponent, "rt-toolbar", never, {
63
113
  "dense": {
@@ -65,5 +115,32 @@ export declare class RtToolbarComponent {
65
115
  "required": false;
66
116
  "isSignal": true;
67
117
  };
68
- }, {}, ["leftTpl", "centerTpl", "rightTpl"], never, true, never>;
118
+ "filtersActive": {
119
+ "alias": "filtersActive";
120
+ "required": false;
121
+ "isSignal": true;
122
+ };
123
+ }, {
124
+ "filtersApply": "filtersApply";
125
+ "filtersReset": "filtersReset";
126
+ }, ["filtersTpl", "leftTpl", "centerTpl", "rightTpl"], never, true, never>;
127
+ }
128
+ /**
129
+ * Панель отборов полосы `rt-toolbar` на узком экране.
130
+ *
131
+ * Её поднимает кнопка фильтров полосы службой боковых панелей кита. В теле — слот
132
+ * `rtToolbarFilters` с контекстом `panel`; шапка — заголовок «Фильтры» и стрелка возврата, без
133
+ * надзаголовка и действий; подвал — «Сбросить» и «Применить» по краям. «Сбросить» сообщает о себе
134
+ * и оставляет панель открытой, «Применить» сообщает и закрывает, стрелка закрывает молча.
135
+ */
136
+ export declare class RtToolbarFiltersAsideComponent {
137
+ #private;
138
+ protected readonly data: IRtToolbar.IFiltersPanelData;
139
+ protected readonly title: Signal<string>;
140
+ protected readonly resetLabel: Signal<string>;
141
+ protected readonly applyLabel: Signal<string>;
142
+ protected onReset(): void;
143
+ protected onApply(): void;
144
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtToolbarFiltersAsideComponent, never>;
145
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtToolbarFiltersAsideComponent, "rt-toolbar-filters-aside", never, {}, {}, never, never, true, never>;
69
146
  }