@rt-tools/ui-kit-v2 0.39.1 → 0.40.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 (45) hide show
  1. package/fesm2022/rt-tools-ui-kit-v2-ai-prompt-input.mjs +13 -1
  2. package/fesm2022/rt-tools-ui-kit-v2-ai-prompt-input.mjs.map +1 -1
  3. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +12 -0
  4. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  5. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +3 -1
  6. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
  7. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +60 -7
  8. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
  9. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +91 -10
  10. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs +2 -2
  12. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs.map +1 -1
  13. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +76 -5
  14. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
  15. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +111 -35
  16. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  17. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +37 -16
  18. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -1
  19. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +94 -5
  20. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
  21. package/package.json +1 -1
  22. package/src/lib/components/date-picker/panel/rt-date-panel.component.scss +51 -2
  23. package/src/lib/components/date-range/panel/rt-date-range-panel.component.scss +95 -2
  24. package/src/lib/components/detail-list/CONTEXT.md +3 -0
  25. package/src/lib/components/detail-list/rt-detail-row.component.scss +1 -0
  26. package/src/lib/components/input-number/CONTEXT.md +8 -0
  27. package/src/lib/components/input-number/rt-input-number.component.scss +50 -0
  28. package/src/lib/components/stat-tile/CONTEXT.md +11 -6
  29. package/src/lib/components/stat-tile/rt-stat-tile.component.scss +21 -0
  30. package/src/lib/components/stat-tile/stories/component/test-stat-tile-matrix.component.scss +15 -0
  31. package/src/lib/components/table/CONTEXT.md +20 -0
  32. package/src/lib/components/table/rt-table.component.scss +77 -22
  33. package/src/lib/components/table/stories/component/test-table-pinned.component.scss +76 -0
  34. package/src/rich-editor/lib/components/chat/CONTEXT.md +5 -0
  35. package/src/styles/_primitives.scss +2 -0
  36. package/src/styles/_semantic.scss +9 -0
  37. package/src/styles/_theme-dark.scss +2 -0
  38. package/styles/tokens.css +66 -0
  39. package/types/rt-tools-ui-kit-v2-ai-prompt-input.d.ts +4 -0
  40. package/types/rt-tools-ui-kit-v2-core.d.ts +9 -1
  41. package/types/rt-tools-ui-kit-v2-date-picker.d.ts +14 -0
  42. package/types/rt-tools-ui-kit-v2-input-number.d.ts +30 -2
  43. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +13 -1
  44. package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +29 -6
  45. package/types/rt-tools-ui-kit-v2-table.d.ts +31 -0
@@ -33,6 +33,8 @@ export declare class RtRichEditorComponent extends RtFormControlBase<IQuillDelta
33
33
  ngAfterViewInit(): Promise<void>;
34
34
  /** Ставит фокус в редактор; до загрузки Quill ничего не делает. */
35
35
  focus(): void;
36
+ /** Ставит фокус в редактор, а курсор — за последний символ; до загрузки Quill ничего не делает. */
37
+ focusAtEnd(): void;
36
38
  ngOnDestroy(): void;
37
39
  writeValue(value: IQuillDelta | null): void;
38
40
  setDisabledState(isDisabled: boolean): void;
@@ -142,6 +144,8 @@ export declare class RtMessageComposerComponent {
142
144
  constructor();
143
145
  /** Ставит фокус в поле: в textarea, а в режиме форматирования — в rich-редактор. */
144
146
  focus(): void;
147
+ /** Заменяет черновик и ставит курсор в конец; выбранные файлы остаются. */
148
+ setDraft(text: string): void;
145
149
  protected onKeydown(event: KeyboardEvent): void;
146
150
  protected stop(): void;
147
151
  protected openPicker(): void;
@@ -401,6 +405,10 @@ export declare class RtChatComponent {
401
405
  protected readonly thread: Signal<ElementRef<HTMLElement> | undefined>;
402
406
  /** Скрытый нативный input — открывается кнопкой-скрепкой внутри поля ввода. */
403
407
  protected readonly composerFileEl: Signal<ElementRef<HTMLInputElement> | undefined>;
408
+ /** Поля ответа трёх видов: метод `setDraft` пишет в то, которое сейчас стоит. */
409
+ protected readonly composerInputEl: Signal<ElementRef<HTMLTextAreaElement> | undefined>;
410
+ protected readonly messageComposer: Signal<RtMessageComposerComponent | undefined>;
411
+ protected readonly promptInput: Signal<RtAiPromptInputComponent | undefined>;
404
412
  protected readonly attachmentFallbackName: Signal<string>;
405
413
  /** Подписи с учётом того, что передал хозяин компонента: своё важнее умолчания */
406
414
  protected readonly titleText: Signal<string>;
@@ -488,7 +496,6 @@ export declare class RtChatComponent {
488
496
  * Требует, чтобы родитель давал высоту (flex-цепочка).
489
497
  */
490
498
  readonly fill: InputSignalWithTransform<boolean, BooleanInput>;
491
- /** Показать иконку refresh в шапке. */
492
499
  /**
493
500
  * Вид мессенджера: без подписи автора, свой пузырь цвета действия, время без даты, над
494
501
  * сообщениями дня — его подпись, поле ответа в одну строку с рядом кнопок под ним.
@@ -522,6 +529,11 @@ export declare class RtChatComponent {
522
529
  */
523
530
  readonly messageHasActions: InputSignal<IRtChat.MessageActionsPredicate | null>;
524
531
  constructor();
532
+ /**
533
+ * Заменяет черновик в поле ответа и ставит курсор в конец: так приложение подставляет готовый
534
+ * текст. Выбранные файлы остаются, сигнала набора нет, закрытое поле не меняется.
535
+ */
536
+ setDraft(text: string): void;
525
537
  protected onSubmit(): void;
526
538
  protected onComposerKeydown(event: KeyboardEvent): void;
527
539
  /** Релей submit'а от `rt-message-composer` (rich-режим) наружу как `send`. */
@@ -1,5 +1,6 @@
1
+ import { BooleanInput } from "@angular/cdk/coercion";
1
2
  import * as i0 from "@angular/core";
2
- import { InputSignal, Signal } from "@angular/core";
3
+ import { InputSignal, InputSignalWithTransform, Signal } from "@angular/core";
3
4
  import { IRtIcon, TRtKitLabelMap } from "@rt-tools/ui-kit-v2/core";
4
5
  /**
5
6
  * Контракты `rt-stat-tile` — KPI-плитка с базой сравнения.
@@ -9,16 +10,23 @@ import { IRtIcon, TRtKitLabelMap } from "@rt-tools/ui-kit-v2/core";
9
10
  export declare namespace IRtStatTile {
10
11
  /** Направление изменения — определяет цвет и иконку строки дельты. */
11
12
  type Direction = 'up' | 'down' | 'flat' | 'unknown';
13
+ /**
14
+ * Единица изменения: проценты к базе или процентные пункты — разница двух
15
+ * долей (занятость с 68 % до 78 % выросла на 10 п.п., а не на 15 %).
16
+ */
17
+ type Unit = 'percent' | 'points';
12
18
  /**
13
19
  * Изменение к одной базе сравнения.
14
20
  *
15
- * - `percent` — уже посчитанное изменение в процентах; `null` означает
16
- * «база нулевая или данных нет», и плитка рисует «—», а не «+100 %».
21
+ * - `percent` — уже посчитанное изменение в единицах `unit`; `null` означает
22
+ * «база нулевая или данных нет», и строка не рисуется вовсе.
23
+ * - `unit` — единица числа, по умолчанию проценты.
17
24
  * - `label` — подпись базы («к прошлому периоду», «к прошлому году»).
18
25
  * - `baseline` — необязательное «было X» той же строкой.
19
26
  */
20
27
  interface Delta {
21
28
  readonly percent: number | null;
29
+ readonly unit?: Unit;
22
30
  readonly label: string;
23
31
  readonly baseline?: string;
24
32
  }
@@ -40,17 +48,22 @@ interface IDeltaRow {
40
48
  * готовыми строками, `percent` — посчитанным числом. Так плитка не знает ни про
41
49
  * валюты, ни про методику метрик и остаётся общей для любого домена.
42
50
  *
43
- * Нулевая база показывается как «—»: «+100 %» от нуля вводит в заблуждение, а
44
- * «∞» нечитаемо.
51
+ * Строка с неизвестной базой не рисуется: «+100 %» от нуля вводит в
52
+ * заблуждение, а «—» рядом с цифрой читается как поломка.
53
+ *
54
+ * Цвет строки говорит, хорошо изменение или плохо, а стрелка — только знак
55
+ * числа: у метрики, где рост хуже (отмены, потерянная выручка), рост красный и
56
+ * со стрелкой вверх.
45
57
  */
46
58
  export declare class RtStatTileComponent {
47
59
  #private;
60
+ /** Подписи кита для шаблона — приставка годового чипа. */
61
+ protected readonly t: Signal<TRtKitLabelMap>;
48
62
  /**
49
63
  * Дельта к предыдущему периоду — рядом со значением. Пустая база (`percent`
50
64
  * = null) не рисуется вовсе: «—» рядом с цифрой читается как поломка, а не
51
65
  * как «сравнивать не с чем».
52
66
  */
53
- protected readonly t: Signal<TRtKitLabelMap>;
54
67
  protected readonly primaryDelta: Signal<IDeltaRow | null>;
55
68
  /** Годовое сравнение — отдельным компактным чипом, без слов в строке. */
56
69
  protected readonly yearDelta: Signal<IDeltaRow | null>;
@@ -72,6 +85,11 @@ export declare class RtStatTileComponent {
72
85
  readonly deltaSecondary: InputSignal<IRtStatTile.Delta | null>;
73
86
  /** Пояснение методики — нативный title на иконке подсказки. */
74
87
  readonly hint: InputSignal<string | null>;
88
+ /**
89
+ * Рост метрики плох для владельца (отмены, потерянная выручка): рост обеих
90
+ * строк красный, падение зелёное. Стрелка по-прежнему показывает знак числа.
91
+ */
92
+ readonly growthIsWorse: InputSignalWithTransform<boolean, BooleanInput>;
75
93
  static ɵfac: i0.ɵɵFactoryDeclaration<RtStatTileComponent, never>;
76
94
  static ɵcmp: i0.ɵɵComponentDeclaration<RtStatTileComponent, "rt-stat-tile", never, {
77
95
  "label": {
@@ -104,6 +122,11 @@ export declare class RtStatTileComponent {
104
122
  "required": false;
105
123
  "isSignal": true;
106
124
  };
125
+ "growthIsWorse": {
126
+ "alias": "growthIsWorse";
127
+ "required": false;
128
+ "isSignal": true;
129
+ };
107
130
  }, {}, never, never, true, never>;
108
131
  }
109
132
  export {};
@@ -405,6 +405,35 @@ declare function hasRowsIn(dataSource: unknown): boolean;
405
405
  * её значение нечем.
406
406
  */
407
407
  declare function cardColumnsOf<TRow>(displayedColumns: ReadonlyArray<string>, columnDefs: ReadonlyArray<CdkColumnDef>, columnsConfig: ReadonlyArray<IRtTable.ColumnConfig>): ReadonlyArray<IRtTableCardColumn<TRow>>;
408
+ /** С какой стороны под закреплённой колонкой лежит прокрученное содержимое. */
409
+ interface IRtTablePinnedEdges {
410
+ /** Прокручено от начала: под колонкой, закреплённой у начала, есть скрытые колонки. */
411
+ start: boolean;
412
+ /** Прокручено не до конца: под колонкой, закреплённой у конца, есть скрытые колонки. */
413
+ end: boolean;
414
+ }
415
+ /**
416
+ * Скрытые края по положению прокрутки. При письме справа налево браузер отдаёт отрицательный
417
+ * сдвиг, поэтому берётся его величина: «начало» — сторона, откуда прокрутка началась.
418
+ */
419
+ declare function hiddenEdges(scrollLeft: number, scrollWidth: number, clientWidth: number): IRtTablePinnedEdges;
420
+ /**
421
+ * Ближайший предок, который прокручивается вбок. Таблица сама не прокручивается: её прокручивает
422
+ * контейнер потребителя, и тень у края зависит от его положения.
423
+ */
424
+ declare function horizontalScrollParentOf(element: Element, view: Window): HTMLElement | null;
425
+ /**
426
+ * Следит за прокруткой контейнера таблицы и за его размерами: тень у края нужна, пока под
427
+ * закреплённой колонкой есть скрытое содержимое, а оно меняется и при прокрутке, и при смене
428
+ * ширины окна или набора колонок.
429
+ */
430
+ declare class RtTablePinnedEdges {
431
+ #private;
432
+ constructor(changed: (edges: IRtTablePinnedEdges) => void);
433
+ /** Находит контейнер прокрутки над `table` и сообщает скрытые края сразу и после каждой перемены. */
434
+ watch(table: HTMLElement, view: Window): void;
435
+ stop(): void;
436
+ }
408
437
  /**
409
438
  * Таблица — стилизованная обёртка над `cdk-table` (`@angular/cdk/table`).
410
439
  *
@@ -428,6 +457,8 @@ export declare class RtTableComponent<TRow> extends CdkTable<TRow> {
428
457
  * остаются висеть вне таблицы. Считается один раз — тег хоста по ходу жизни не меняется.
429
458
  */
430
459
  protected readonly hostRole: 'table' | null;
460
+ /** Скрытые края для модификаторов хоста `--hidden-start` и `--hidden-end`. */
461
+ protected readonly hiddenEdges: Signal<IRtTablePinnedEdges>;
431
462
  /** `true` когда initial-load в полёте и entities ещё нет — рендерим skeleton rows. */
432
463
  protected readonly isInitialLoading: Signal<boolean>;
433
464
  /** `true` когда загрузка завершена и entities пустые — рендерим empty placeholder. */