@rt-tools/ui-kit-v2 0.6.0 → 0.8.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.
@@ -1,11 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InputSignal, WritableSignal, Renderer2, InjectionToken, Signal, EnvironmentProviders, InputSignalWithTransform, OutputEmitterRef, OnInit, OnDestroy, TemplateRef, ElementRef, AfterViewInit, DestroyRef, AfterContentInit, PipeTransform, ModelSignal } from '@angular/core';
2
+ import { InputSignal, WritableSignal, Renderer2, InjectionToken, Signal, EnvironmentProviders, PipeTransform, InputSignalWithTransform, OutputEmitterRef, OnInit, OnDestroy, TemplateRef, ElementRef, AfterViewInit, DestroyRef, AfterContentInit, ModelSignal } from '@angular/core';
3
3
  import { OverlayRef, ComponentType, ConnectedPosition } from '@angular/cdk/overlay';
4
4
  import { Observable, MonoTypeOperatorFunction } from 'rxjs';
5
5
  import { BooleanInput, NumberInput } from '@angular/cdk/coercion';
6
6
  import { ControlValueAccessor, ValidationErrors, FormGroup, FormControl, AbstractControl } from '@angular/forms';
7
7
  import { Router, ActivatedRoute, Params, CanDeactivateFn } from '@angular/router';
8
- import { IPageModel, ISortModel, ListSortOrderType } from '@rt-tools/utils';
8
+ import { IPageModel, ISortModel, TListSortOrderType } from '@rt-tools/utils';
9
9
  import { CdkTable, CdkColumnDef, CdkTableDataSourceInput } from '@angular/cdk/table';
10
10
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
11
11
 
@@ -15,7 +15,7 @@ import { CdkDragDrop } from '@angular/cdk/drag-drop';
15
15
  * - `md` — 540px (`--rt-aside-width-md`, дефолт)
16
16
  * - `lg` — 720px (`--rt-aside-width-lg`)
17
17
  */
18
- type IRtAsideSize = 'sm' | 'md' | 'lg';
18
+ type TRtAsideSize = 'sm' | 'md' | 'lg';
19
19
  /**
20
20
  * Раскладка контентной зоны side-sheet:
21
21
  * - `default` — контентная зона сама скроллится при overflow (штатный режим);
@@ -23,7 +23,7 @@ type IRtAsideSize = 'sm' | 'md' | 'lg';
23
23
  * полоса вкладок прибита, скроллится только контент активной вкладки
24
24
  * (`rt-tabs__content`).
25
25
  */
26
- type IRtAsideContentLayout = 'default' | 'tabs';
26
+ type TRtAsideContentLayout = 'default' | 'tabs';
27
27
  /**
28
28
  * Презентационный styled-frame для side-sheet.
29
29
  *
@@ -45,8 +45,8 @@ type IRtAsideContentLayout = 'default' | 'tabs';
45
45
  * cross-encapsulation хака.
46
46
  */
47
47
  declare class RtAsideComponent {
48
- readonly size: InputSignal<IRtAsideSize>;
49
- readonly contentLayout: InputSignal<IRtAsideContentLayout>;
48
+ readonly size: InputSignal<TRtAsideSize>;
49
+ readonly contentLayout: InputSignal<TRtAsideContentLayout>;
50
50
  readonly width: InputSignal<string | null>;
51
51
  readonly ariaLabel: InputSignal<string | null>;
52
52
  static ɵfac: i0.ɵɵFactoryDeclaration<RtAsideComponent, never>;
@@ -99,7 +99,7 @@ declare class RtAsideRef<T = unknown> {
99
99
  /**
100
100
  * Позиционирование side-sheet — у какого края viewport "приклеена" панель.
101
101
  */
102
- type IRtAsidePosition = 'right' | 'left';
102
+ type TRtAsidePosition = 'right' | 'left';
103
103
  /**
104
104
  * Конфигурация открытия side-sheet через `RtAsideService.open()`.
105
105
  */
@@ -115,7 +115,7 @@ interface IRtAsideConfig<TData = unknown> {
115
115
  /** Закрывать aside по ESC. По дефолту `true`. */
116
116
  closeOnEscape?: boolean;
117
117
  /** К какому краю viewport "приклеить" панель. По дефолту `"right"`. */
118
- position?: IRtAsidePosition;
118
+ position?: TRtAsidePosition;
119
119
  }
120
120
  /**
121
121
  * Программный API для открытия side-sheet поверх CDK Overlay.
@@ -201,7 +201,7 @@ declare const RT_ASIDE_DATA: InjectionToken<unknown>;
201
201
  * среди ключей много `aria`-подписей, и пустая там означает кнопку без имени
202
202
  * для скринридера.
203
203
  *
204
- * Набор задаёт и **перечень ключей**: `RtKitLabelKey` выводится отсюда, поэтому
204
+ * Набор задаёт и **перечень ключей**: `TRtKitLabelKey` выводится отсюда, поэтому
205
205
  * опечатка в ключе не доживает до рантайма.
206
206
  *
207
207
  * Места вида `{{name}}` заполняются параметрами — их принимает `rtKitLabel()`.
@@ -345,13 +345,13 @@ declare const RT_KIT_LABELS_EN: {
345
345
  * что стоит умолчанием, — поэтому ключа, которого кит не рисует, не существует,
346
346
  * а опечатка не доживает до рантайма.
347
347
  */
348
- type RtKitLabelKey = keyof typeof RT_KIT_LABELS_EN;
348
+ type TRtKitLabelKey = keyof typeof RT_KIT_LABELS_EN;
349
349
  /**
350
350
  * Подстановки в места вида `{{name}}`. Их просят пять подписей: строка
351
351
  * сравнения, имя скачиваемого файла, «страница N из M», диапазон записей и
352
352
  * подпись раздела в разработке.
353
353
  */
354
- type RtKitLabelParams = Readonly<Record<string, string | number>>;
354
+ type TRtKitLabelParams = Readonly<Record<string, string | number>>;
355
355
  /**
356
356
  * Чем кит получает подпись. Даёт её приложение — оно одно знает и язык
357
357
  * продукта, и его формулировки.
@@ -361,7 +361,7 @@ type RtKitLabelParams = Readonly<Record<string, string | number>>;
361
361
  * английское умолчание, потому что пустая `aria`-подпись означает кнопку без
362
362
  * имени для скринридера, а это хуже чужого языка.
363
363
  */
364
- type RtKitTranslator = (key: RtKitLabelKey, params?: RtKitLabelParams) => string;
364
+ type TRtKitTranslator = (key: TRtKitLabelKey, params?: TRtKitLabelParams) => string;
365
365
  /**
366
366
  * Все подписи разом, ключ → готовая строка.
367
367
  *
@@ -370,7 +370,7 @@ type RtKitTranslator = (key: RtKitLabelKey, params?: RtKitLabelParams) => string
370
370
  * Подписи с подстановками в карту не входят — им нужны параметры, и они берутся
371
371
  * через `rtKitLabel()`.
372
372
  */
373
- type RtKitLabelMap = Readonly<Record<RtKitLabelKey, string>>;
373
+ type TRtKitLabelMap = Readonly<Record<TRtKitLabelKey, string>>;
374
374
 
375
375
  /**
376
376
  * Функция, которой кит получает подписи. Её отдаёт приложение —
@@ -380,7 +380,7 @@ type RtKitLabelMap = Readonly<Record<RtKitLabelKey, string>>;
380
380
  * на ходу, кладёт в него новую функцию, и всё, что от неё считано,
381
381
  * пересчитывается само.
382
382
  */
383
- declare const RT_KIT_TRANSLATOR: InjectionToken<Signal<RtKitTranslator>>;
383
+ declare const RT_KIT_TRANSLATOR: InjectionToken<Signal<TRtKitTranslator>>;
384
384
  /**
385
385
  * Активная локаль. Ею кит форматирует даты — больше ни для чего она ему не
386
386
  * нужна.
@@ -399,7 +399,7 @@ declare const RT_KIT_LOCALE: InjectionToken<Signal<string>>;
399
399
  * Подпись, которой переводчик не дал (вернул пустое или упал), берётся
400
400
  * английской: пустая `aria`-подпись означает кнопку без имени для скринридера.
401
401
  */
402
- declare const RT_KIT_LABELS: InjectionToken<Signal<RtKitLabelMap>>;
402
+ declare const RT_KIT_LABELS: InjectionToken<Signal<TRtKitLabelMap>>;
403
403
  /**
404
404
  * Одна подпись, а не вся карта.
405
405
  *
@@ -418,7 +418,7 @@ declare const RT_KIT_LABELS: InjectionToken<Signal<RtKitLabelMap>>;
418
418
  * умолчание тут показало бы ошибку там, где её не случилось.
419
419
  * @param params Подстановки — значением или сигналом, если они меняются.
420
420
  */
421
- declare function rtKitLabel(key: RtKitLabelKey | '' | Signal<RtKitLabelKey | ''>, params?: RtKitLabelParams | Signal<RtKitLabelParams>): Signal<string>;
421
+ declare function rtKitLabel(key: TRtKitLabelKey | '' | Signal<TRtKitLabelKey | ''>, params?: TRtKitLabelParams | Signal<TRtKitLabelParams>): Signal<string>;
422
422
  /**
423
423
  * Отдаёт киту подписи приложения.
424
424
  *
@@ -443,10 +443,23 @@ declare function rtKitLabel(key: RtKitLabelKey | '' | Signal<RtKitLabelKey | ''>
443
443
  * без неё кит форматирует даты по-английски.
444
444
  */
445
445
  declare function provideRtKitLabels(source: {
446
- readonly translator: Signal<RtKitTranslator>;
446
+ readonly translator: Signal<TRtKitTranslator>;
447
447
  readonly locale?: Signal<string>;
448
448
  }): EnvironmentProviders;
449
449
 
450
+ /**
451
+ * Подпись кита по ключу — для значений, приходящих из контекста шаблона.
452
+ *
453
+ * Шаблон не зовёт методов: имя раздела приходит элементом цикла, и посчитать подпись заранее
454
+ * нечем. Пайп чистый, поэтому функция-переводчик передаётся ему вторым доводом — сменившись,
455
+ * она пересчитывает подпись сама.
456
+ */
457
+ declare class RtKitLabelPipe implements PipeTransform {
458
+ transform(key: TRtKitLabelKey, translator: TRtKitTranslator, params?: TRtKitLabelParams): string;
459
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtKitLabelPipe, never>;
460
+ static ɵpipe: i0.ɵɵPipeDeclaration<RtKitLabelPipe, "rtKitLabel", true>;
461
+ }
462
+
450
463
  /**
451
464
  * Имена иконок rt-icon. Набор лежит в `assets/icons` пакета, откуда сборка
452
465
  * приложения кладёт его туда, куда указывает `provideRtIcons()`. Большинство
@@ -455,8 +468,8 @@ declare function provideRtKitLabels(source: {
455
468
  *
456
469
  * При добавлении новой иконки: положить SVG в `assets/icons` пакета, добавить
457
470
  * slug сюда, прогнать pnpm exec eslint --fix + pnpm exec prettier --write по этому файлу.
458
- * Имя без файла роняет весь набор: реестр собирает спрайт одним `forkJoin`, и один отказ
459
- * гасит иконки во всём приложении.
471
+ * Имя без файла гасит только свой значок: реестр ходит за каждым именем отдельно, и промах
472
+ * виден пустым местом на экране, а не отказом в прогоне.
460
473
  *
461
474
  * Аннотация типа намеренно не указывается: явный `readonly string[]` потерял бы узкий
462
475
  * литеральный тип, нужный для `IRtIcon.Name` (см. `rt-icon.model.ts`). `as const`
@@ -482,17 +495,17 @@ declare namespace IRtIcon {
482
495
  * Порядок фиксирован — соответствует порядку отображения в Catalog story (rt-icon.stories.ts).
483
496
  *
484
497
  * Аннотация типа намеренно не указывается: явный `readonly string[]` потерял бы узкий
485
- * литеральный тип, нужный для {@link IIconCategory}. `as const` сохраняет литеральные ключи.
498
+ * литеральный тип, нужный для {@link TIconCategory}. `as const` сохраняет литеральные ключи.
486
499
  */
487
500
  declare const CATEGORY_ORDER: readonly ["Navigation", "Alignment & Sorting", "Status", "Time & Calendar", "Communication", "Documents", "People", "Commerce", "Custom", "Misc"];
488
501
  /** Литеральный union из {@link CATEGORY_ORDER}. */
489
- type IIconCategory = (typeof CATEGORY_ORDER)[number];
502
+ type TIconCategory = (typeof CATEGORY_ORDER)[number];
490
503
  /**
491
504
  * Правило маппинга имени иконки в категорию.
492
505
  * Порядок правил в {@link ICON_CATEGORY_RULES} важен: первое совпавшее правило выигрывает.
493
506
  */
494
507
  interface IIconCategoryRule {
495
- readonly category: IIconCategory;
508
+ readonly category: TIconCategory;
496
509
  readonly match: (name: string) => boolean;
497
510
  }
498
511
  /**
@@ -506,7 +519,7 @@ declare const ICON_CATEGORY_RULES: readonly IIconCategoryRule[];
506
519
  * Возвращает категорию для имени иконки.
507
520
  * Первое совпавшее правило в {@link ICON_CATEGORY_RULES} выигрывает; иначе — `Misc`.
508
521
  */
509
- declare function categoryOf(name: IRtIcon.Name): IIconCategory;
522
+ declare function categoryOf(name: IRtIcon.Name): TIconCategory;
510
523
 
511
524
  declare class RtIconComponent {
512
525
  #private;
@@ -517,14 +530,28 @@ declare class RtIconComponent {
517
530
  readonly name: InputSignal<IRtIcon.Name>;
518
531
  readonly size: InputSignal<IRtIcon.Size>;
519
532
  readonly color: InputSignal<IRtIcon.Color>;
520
- readonly rotate: InputSignalWithTransform<number | null, IRotateInput>;
533
+ readonly rotate: InputSignalWithTransform<number | null, TRotateInput>;
534
+ constructor();
521
535
  static ɵfac: i0.ɵɵFactoryDeclaration<RtIconComponent, never>;
522
536
  static ɵcmp: i0.ɵɵComponentDeclaration<RtIconComponent, "rt-icon", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "rotate": { "alias": "rotate"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
523
537
  }
524
- type IRotateInput = number | string | null;
538
+ type TRotateInput = number | string | null;
539
+
540
+ /**
541
+ * Имена, которыми набор значков виден со стороны страницы.
542
+ *
543
+ * Отдельный файл, а не константы реестра: те же имена читает обвязка снимков витрины, а она идёт
544
+ * под Playwright и ни одного объявления Angular поднять не может. Своя копия там уже стояла —
545
+ * второе объявление того же значения расходится с первым молча: ожидание набора ищет один узел,
546
+ * а реестр создаёт другой, и кадр выходит без значков.
547
+ */
548
+ /** Селектор inline-sprite, создаваемого один раз при первом обращении. */
549
+ declare const RT_ICON_SPRITE_ID: string;
550
+ /** Префикс `id` для inline-sprite символов. Изолирует от внешних `id` на странице. */
551
+ declare const RT_ICON_SYMBOL_ID_PREFIX: string;
525
552
 
526
553
  /**
527
- * Регистрирует все SVG-иконки `rt-icon` в sprite-реестре при бутстрапе приложения.
554
+ * Называет адрес, по которому приложение опубликовало набор значков `rt-icon`.
528
555
  *
529
556
  * ```typescript
530
557
  * export function withCoreProviders(): EnvironmentProviders {
@@ -536,12 +563,11 @@ type IRotateInput = number | string | null;
536
563
  * }
537
564
  * ```
538
565
  *
539
- * Внутри: forkJoin по всем именам из `rt-icon-names.ts`, склейка в `<svg><symbol>...`,
540
- * вставка в `<body>` первым элементом. Компонент `<rt-icon>` через `<use href="#rt-icon-NAME">`
541
- * рендерит иконку из inline-sprite без дополнительных HTTP-запросов.
566
+ * Вперёд отсюда не грузится ничего: значок едет тогда, когда его попросила разметка, и платит
567
+ * за него та страница, которая его нарисовала. Сборка спрайта и загрузка — дело `RtIconRegistry`.
542
568
  *
543
- * Сами файлы приложение публикует само — набор лежит в `assets/icons` пакета, и
544
- * сборка копирует его в свою статику.
569
+ * Сами файлы приложение публикует само — набор лежит в `assets/icons` пакета, и сборка копирует
570
+ * его в свою статику.
545
571
  *
546
572
  * @param baseUrl Адрес опубликованного набора. По умолчанию `/icons`.
547
573
  */
@@ -555,15 +581,19 @@ declare function provideRtIcons(baseUrl?: string): EnvironmentProviders;
555
581
  declare const RT_ICONS_BASE_URL: InjectionToken<string>;
556
582
  declare class RtIconRegistry {
557
583
  #private;
584
+ constructor();
558
585
  /**
559
586
  * Имя symbol для `<use href="#X">`. Возвращает строку с ведущим `#`.
560
587
  */
561
588
  symbolHref(name: IRtIcon.Name): string;
562
589
  /**
563
- * Загружает все SVG из реестра и склеивает их в inline-sprite в `<body>`.
564
- * Вызывается из `provideAppInitializer`. Повторные вызовы — no-op (shareReplay).
590
+ * Просит значок по имени: грузит файл и дописывает `<symbol>` в спрайт страницы.
591
+ *
592
+ * Ответа зовущий не ждёт и потока не получает: разметка рисует ссылку на символ сразу, а
593
+ * браузер дорисовывает её, когда символ приезжает. Подписка живёт здесь и только здесь —
594
+ * иначе каждая разметка гасила бы её сама, а таких мест у значка два.
565
595
  */
566
- preloadAll(): Observable<void>;
596
+ request(name: IRtIcon.Name): void;
567
597
  static ɵfac: i0.ɵɵFactoryDeclaration<RtIconRegistry, never>;
568
598
  static ɵprov: i0.ɵɵInjectableDeclaration<RtIconRegistry>;
569
599
  }
@@ -651,7 +681,7 @@ declare class RtAsideHeaderComponent {
651
681
  #private;
652
682
  /** Текст заголовка — рендерится в `<h2>`. Null/пустая строка вместе с
653
683
  * `[loading]=true` показывают skeleton вместо title. */
654
- protected readonly t: Signal<RtKitLabelMap>;
684
+ protected readonly t: Signal<TRtKitLabelMap>;
655
685
  readonly title: InputSignal<string | null>;
656
686
  /**
657
687
  * Мелкий приглушённый надзаголовок НАД основным title (контекст действия:
@@ -737,25 +767,11 @@ declare namespace IRtInput {
737
767
  * раскладку под локаль, а разбор строки руками означал бы своё поле ввода
738
768
  * времени рядом с китом.
739
769
  */
740
- type Type = 'text' | 'password' | 'email' | 'time';
770
+ type Type = 'text' | 'password' | 'email' | 'time' | 'url';
741
771
  /** Размерный вариант поля (высота). Общий для всего input-семейства. */
742
772
  type Size = 'sm' | 'md' | 'lg';
743
773
  }
744
774
 
745
- /**
746
- * Базовый класс input-семейства common/ui. Владеет единым CVA-ядром:
747
- * - self-injected `NgControl` + ручная привязка `valueAccessor` (без
748
- * `NG_VALUE_ACCESSOR` provider — иначе NG0200 cycle при self-reference),
749
- * что даёт доступ к `control.invalid/touched` для авто-подсветки ошибки;
750
- * - сигнал значения `value`, состояния `isDisabled`/`isInvalid` (отключение
751
- * складывается из входа `disabled` и слова формы — см. `isDisabled`);
752
- * - общие инпуты `size`/`disabled`/`controlId`/`ariaLabel`/`clearable`;
753
- * - оркестрацию очистки (`clear`) через абстрактные хуки конкретного поля.
754
- *
755
- * Конкретные поля реализуют `getEmptyValue`/`hasValue`/`focusAfterClear`. Поля
756
- * с отдельным display-состоянием (autocomplete, input-number) дополнительно
757
- * переопределяют `writeValue`/`clearValue`, синхронизируя свой display-сигнал.
758
- */
759
775
  declare abstract class RtFormControlBase<TValue> implements ControlValueAccessor, OnInit {
760
776
  #private;
761
777
  protected readonly value: WritableSignal<TValue>;
@@ -767,7 +783,7 @@ declare abstract class RtFormControlBase<TValue> implements ControlValueAccessor
767
783
  * контрол, созданный отключённым, оказывался бы редактируемым.
768
784
  */
769
785
  protected readonly isDisabled: Signal<boolean>;
770
- protected readonly isInvalid: WritableSignal<boolean>;
786
+ protected readonly isInvalid: Signal<boolean>;
771
787
  /** Видимость кнопки очистки: включена, есть значение, поле активно. */
772
788
  protected readonly showClearButton: Signal<boolean>;
773
789
  /** Есть ли в поле значение — гейт видимости крестика. */
@@ -787,7 +803,7 @@ declare abstract class RtFormControlBase<TValue> implements ControlValueAccessor
787
803
  readonly effectiveControlId: Signal<string | null>;
788
804
  /** Read-only режим (плоский текст вместо контрола); включается rt-field'ом. */
789
805
  readonly isReadonly: Signal<boolean>;
790
- /** Публичный invalid для rt-field (touched/dirty уже учтён в #syncState). */
806
+ /** Публичный invalid для rt-field (touched/dirty учтён в состоянии). */
791
807
  readonly invalid: Signal<boolean>;
792
808
  /** Текущие ошибки связанного контрола — источник текста ошибки в rt-field. */
793
809
  readonly errors: Signal<ValidationErrors | null>;
@@ -921,7 +937,7 @@ declare namespace IRtAutocomplete {
921
937
  */
922
938
  declare class RtAutocompleteComponent<TItem> extends RtFormControlBase<TItem | null> {
923
939
  #private;
924
- protected readonly t: Signal<RtKitLabelMap>;
940
+ protected readonly t: Signal<TRtKitLabelMap>;
925
941
  protected readonly panelId: string;
926
942
  protected readonly popover: Signal<RtPopoverDirective>;
927
943
  protected readonly fieldEl: Signal<ElementRef<HTMLInputElement> | undefined>;
@@ -996,7 +1012,7 @@ declare class RtBarListComponent {
996
1012
 
997
1013
  declare class RtBottomSheetComponent {
998
1014
  #private;
999
- protected readonly t: Signal<RtKitLabelMap>;
1015
+ protected readonly t: Signal<TRtKitLabelMap>;
1000
1016
  protected readonly dragDeltaY: WritableSignal<number>;
1001
1017
  protected readonly dragging: WritableSignal<boolean>;
1002
1018
  readonly open: InputSignal<boolean>;
@@ -1154,23 +1170,6 @@ declare class RtCardComponent {
1154
1170
  static ɵcmp: i0.ɵɵComponentDeclaration<RtCardComponent, "rt-card", never, { "header": { "alias": "header"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; }, { "cardClick": "cardClick"; }, never, ["[rtCardHeader]", "*", "[rtCardFooter]"], true, never>;
1155
1171
  }
1156
1172
 
1157
- /**
1158
- * Модель `<rt-message-composer>`: один корневой неймспейс с
1159
- * префиксом `I`.
1160
- */
1161
- declare namespace IRtMessageComposer {
1162
- /** Полезная нагрузка отправки: текст сообщения + прикреплённые файлы. */
1163
- interface SubmitPayload {
1164
- text: string;
1165
- files: File[];
1166
- /**
1167
- * Rich-тело строкой JSON (при `formatting`-режиме) — взаимоисключимо с
1168
- * непустым `text`. `null`/отсутствует ⇒ отправляется plain-текст.
1169
- */
1170
- delta?: string | null;
1171
- }
1172
- }
1173
-
1174
1173
  /**
1175
1174
  * Извлекает имя файла из URL: последний сегмент пути без query/fragment,
1176
1175
  * декодированный из percent-encoding. Нужен для вложений, у которых источник
@@ -1194,6 +1193,95 @@ declare function fileNameFromUrl(url: string | null | undefined, fallback?: stri
1194
1193
  */
1195
1194
  declare function formatFileSize(bytes: number | null | undefined): string;
1196
1195
 
1196
+ /**
1197
+ * Дерево узлов показа разметки: то, во что разборщик переводит присланный текст.
1198
+ *
1199
+ * Перечень узлов закрыт. Разборщик не умеет строить ничего, кроме перечисленного здесь, —
1200
+ * поэтому сырой HTML, картинки и адреса чужих схем в вывод не попадают вовсе: для них тут
1201
+ * просто нет узла, и они остаются видимым текстом.
1202
+ */
1203
+ /** Род блока — то, чем текст разделён по вертикали. */
1204
+ declare enum ERtMarkdownBlock {
1205
+ Heading = "heading",
1206
+ Paragraph = "paragraph",
1207
+ List = "list",
1208
+ Quote = "quote",
1209
+ Code = "code",
1210
+ Table = "table"
1211
+ }
1212
+ /** Род куска строки — то, чем текст размечен внутри абзаца. */
1213
+ declare enum ERtMarkdownInline {
1214
+ Text = "text",
1215
+ Strong = "strong",
1216
+ Emphasis = "emphasis",
1217
+ Strike = "strike",
1218
+ Code = "code",
1219
+ Link = "link",
1220
+ Break = "break"
1221
+ }
1222
+ /** Кусок строки: либо сам текст, либо разметка вокруг вложенных кусков. */
1223
+ interface IRtMarkdownInlineNode {
1224
+ readonly kind: ERtMarkdownInline;
1225
+ /** Текст куска. У разметки вокруг вложенного — пустая строка. */
1226
+ readonly text: string;
1227
+ /** Вложенные куски у жирного, курсива и зачёркнутого; у остальных пусто. */
1228
+ readonly children: readonly IRtMarkdownInlineNode[];
1229
+ /** Адрес ссылки. Стоит только у ссылки и только разрешённой схемы. */
1230
+ readonly href: string | null;
1231
+ }
1232
+ /** Пункт списка: свои куски строки и уровень вложенности, считая от нуля. */
1233
+ interface IRtMarkdownListItem {
1234
+ readonly level: number;
1235
+ /**
1236
+ * Тот же уровень строкой — для модификатора разметки.
1237
+ *
1238
+ * Директива модификатора числа не принимает: любое нестроковое значение она сводит к
1239
+ * признаку и даёт класс без значения, то есть один и тот же на все уровни.
1240
+ */
1241
+ readonly levelName: string;
1242
+ readonly content: readonly IRtMarkdownInlineNode[];
1243
+ }
1244
+ /** Блок показа. Поля, которых у этого рода нет, стоят пустыми. */
1245
+ interface IRtMarkdownBlockNode {
1246
+ readonly kind: ERtMarkdownBlock;
1247
+ /** Уровень заголовка, от 1 до 6. У остальных родов — 0. */
1248
+ readonly level: number;
1249
+ /** Тот же уровень строкой — для модификатора разметки; у остальных родов пусто. */
1250
+ readonly levelName: string;
1251
+ /** Куски строки у заголовка, абзаца и цитаты. */
1252
+ readonly content: readonly IRtMarkdownInlineNode[];
1253
+ /** Пункты списка. */
1254
+ readonly items: readonly IRtMarkdownListItem[];
1255
+ /** Признак нумерованного списка. */
1256
+ readonly ordered: boolean;
1257
+ /** Текст блока кода как есть, без разбора разметки внутри. */
1258
+ readonly code: string;
1259
+ /** Слово языка у ограды блока кода. Разбирается, но на вид не влияет. */
1260
+ readonly language: string | null;
1261
+ /** Строка заголовка таблицы: ячейка — свои куски строки. */
1262
+ readonly head: readonly (readonly IRtMarkdownInlineNode[])[];
1263
+ /** Прочие строки таблицы. */
1264
+ readonly rows: readonly (readonly (readonly IRtMarkdownInlineNode[])[])[];
1265
+ }
1266
+
1267
+ /** Перенос строки внутри абзаца: одиночный перенос остаётся переносом. */
1268
+ declare function breakNode(): IRtMarkdownInlineNode;
1269
+ /**
1270
+ * Разбирает строку на куски показа.
1271
+ *
1272
+ * @param source Строка без переносов.
1273
+ * @returns Куски строки по порядку; у строки без разметки — один кусок текста.
1274
+ */
1275
+ declare function parseInline(source: string): IRtMarkdownInlineNode[];
1276
+
1277
+ /**
1278
+ * Разбирает текст груза в дерево узлов показа.
1279
+ *
1280
+ * @param source Текст записи. Пустота и отсутствие значения дают пустой список блоков.
1281
+ * @returns Блоки показа по порядку.
1282
+ */
1283
+ declare function parseMarkdown(source: string | null | undefined): IRtMarkdownBlockNode[];
1284
+
1197
1285
  /**
1198
1286
  * Готовая начинка `<picture>`: источники по форматам и запасной кадр на `<img>`.
1199
1287
  *
@@ -1266,37 +1354,6 @@ declare const SEARCH_DEBOUNCE_MS: number;
1266
1354
  */
1267
1355
  declare function searchDebounce(): MonoTypeOperatorFunction<string>;
1268
1356
 
1269
- /**
1270
- * Режим тулбара: `full` — весь whitelist, `minimal` — жирный + два списка
1271
- * (G113: чаты оператора/админа/саппорта).
1272
- */
1273
- type IRtRichEditorToolbar = 'full' | 'minimal';
1274
- /**
1275
- * Rich-редактор чата на Quill. Наследует CVA-ядро input-семейства
1276
- * (`RtFormControlBase`) — плагается в reactive-форму. Quill грузится **лениво**
1277
- * (`import("quill")` в `ngAfterViewInit`), тип импортируется `import type` и в
1278
- * бандл не попадает. Значение CVA — `IQuillDelta` (или `null`, когда пусто).
1279
- */
1280
- declare class RtRichEditorComponent extends RtFormControlBase<IQuillDelta | null> implements AfterViewInit, OnDestroy {
1281
- #private;
1282
- protected readonly editorHost: Signal<ElementRef<HTMLElement>>;
1283
- protected readonly hasValue: Signal<boolean>;
1284
- readonly placeholder: InputSignal<string>;
1285
- /** Набор кнопок форматирования; сужает и принимаемые форматы (вставка из буфера). */
1286
- readonly toolbar: InputSignal<IRtRichEditorToolbar>;
1287
- /** Enter без Shift в редакторе — сигнал отправки (Shift+Enter остаётся переносом). */
1288
- readonly enterPressed: OutputEmitterRef<void>;
1289
- readonly displayText: Signal<string>;
1290
- ngAfterViewInit(): Promise<void>;
1291
- ngOnDestroy(): void;
1292
- writeValue(value: IQuillDelta | null): void;
1293
- setDisabledState(isDisabled: boolean): void;
1294
- protected getEmptyValue(): IQuillDelta | null;
1295
- protected focusAfterClear(): void;
1296
- static ɵfac: i0.ɵɵFactoryDeclaration<RtRichEditorComponent, never>;
1297
- static ɵcmp: i0.ɵɵComponentDeclaration<RtRichEditorComponent, "rt-rich-editor", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "toolbar": { "alias": "toolbar"; "required": false; "isSignal": true; }; }, { "enterPressed": "enterPressed"; }, never, never, true, never>;
1298
- }
1299
-
1300
1357
  /**
1301
1358
  * Модель общего чат-компонента `rt-chat`: один корневой неймспейс
1302
1359
  * с префиксом `I`. Доменные стора маппят свою модель сообщения в `Message`, а сам
@@ -1316,6 +1373,13 @@ declare enum ERtChatMessageStatus {
1316
1373
  declare namespace IRtChat {
1317
1374
  /** Алиас enum'а для доменных мапперов, работающих через неймспейс. */
1318
1375
  type MessageStatus = ERtChatMessageStatus;
1376
+ /**
1377
+ * Есть ли у реплики доступные действия потребителя — гейт кнопки «…» у неё.
1378
+ *
1379
+ * Признак приходит предикатом, а не полем модели: действие, которого кит не знает,
1380
+ * его моделью и не описывается.
1381
+ */
1382
+ type MessageActionsPredicate = (message: Message) => boolean;
1319
1383
  /** Вложение сообщения — домен маппит свой ресурс, скачивание по `public_id`. */
1320
1384
  interface Attachment {
1321
1385
  id: number;
@@ -1389,6 +1453,96 @@ declare namespace IRtChat {
1389
1453
  }
1390
1454
  }
1391
1455
 
1456
+ /**
1457
+ * Контекст шаблона `[rtChatMessageActions]`: `$implicit` — реплика треда.
1458
+ */
1459
+ interface IRtChatMessageActionsContext {
1460
+ $implicit: IRtChat.Message;
1461
+ }
1462
+ /**
1463
+ * Захватывает `<ng-template rtChatMessageActions let-message>` — содержимое «…»-меню
1464
+ * действий у реплики. `rt-chat` рисует этот шаблон рядом с точечными действиями реплики,
1465
+ * прокидывая её через `$implicit`.
1466
+ *
1467
+ * Точечные действия остаются на месте: удаление, повтор отправки и скачивание общи для
1468
+ * любой переписки. Шаблон нужен тем действиям, которых кит не знает и знать не должен, —
1469
+ * без него потребителю оставалось ждать правки кита либо ставить кнопку над диалогом, то
1470
+ * есть не там, где читают реплику.
1471
+ *
1472
+ * Дженерика у контекста нет: тип реплики у переписки один, и type-carrier, который у
1473
+ * строки таблицы несёт тип строки, здесь не нужен.
1474
+ *
1475
+ * @example
1476
+ * ```html
1477
+ * <rt-chat [messages]="messages()" [messageHasActions]="canAct">
1478
+ * <ng-template rtChatMessageActions let-message>
1479
+ * <rt-menu-item icon="link" label="Скопировать ссылку" (selected)="copy(message)" />
1480
+ * </ng-template>
1481
+ * </rt-chat>
1482
+ * ```
1483
+ */
1484
+ declare class RtChatMessageActionsDirective {
1485
+ readonly template: TemplateRef<IRtChatMessageActionsContext>;
1486
+ /** Type-guard: сужает контекст шаблона до реплики при проверке шаблонов. */
1487
+ static ngTemplateContextGuard(_directive: RtChatMessageActionsDirective, context: unknown): context is IRtChatMessageActionsContext;
1488
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtChatMessageActionsDirective, never>;
1489
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RtChatMessageActionsDirective, "ng-template[rtChatMessageActions]", never, {}, {}, never, never, true, never>;
1490
+ }
1491
+
1492
+ /**
1493
+ * Модель `<rt-message-composer>`: один корневой неймспейс с
1494
+ * префиксом `I`.
1495
+ */
1496
+ declare namespace IRtMessageComposer {
1497
+ /** Полезная нагрузка отправки: текст сообщения + прикреплённые файлы. */
1498
+ interface SubmitPayload {
1499
+ text: string;
1500
+ files: File[];
1501
+ /**
1502
+ * Rich-тело строкой JSON (при `formatting`-режиме) — взаимоисключимо с
1503
+ * непустым `text`. `null`/отсутствует ⇒ отправляется plain-текст.
1504
+ */
1505
+ delta?: string | null;
1506
+ }
1507
+ }
1508
+
1509
+ /**
1510
+ * Режим тулбара: `full` — весь whitelist, `minimal` — жирный + два списка
1511
+ * (G113: чаты оператора/админа/саппорта).
1512
+ */
1513
+ type TRtRichEditorToolbar = 'full' | 'minimal';
1514
+ /**
1515
+ * Rich-редактор чата на Quill. Наследует CVA-ядро input-семейства
1516
+ * (`RtFormControlBase`) — плагается в reactive-форму. Quill грузится **лениво**
1517
+ * (`import("quill")` в `ngAfterViewInit`), тип импортируется `import type` и в
1518
+ * бандл не попадает. Значение CVA — `IQuillDelta` (или `null`, когда пусто).
1519
+ */
1520
+ declare class RtRichEditorComponent extends RtFormControlBase<IQuillDelta | null> implements AfterViewInit, OnDestroy {
1521
+ #private;
1522
+ protected readonly editorHost: Signal<ElementRef<HTMLElement>>;
1523
+ /**
1524
+ * Смонтирована ли начинка редактора. Пока нет, хост несёт признак недостроенности: съёмке
1525
+ * витрины и любой другой проверке снаружи иначе нечем отличить недостроенный редактор от
1526
+ * достроенного пустого — оба выглядят пустым местом.
1527
+ */
1528
+ protected readonly mounted: WritableSignal<boolean>;
1529
+ protected readonly hasValue: Signal<boolean>;
1530
+ readonly placeholder: InputSignal<string>;
1531
+ /** Набор кнопок форматирования; сужает и принимаемые форматы (вставка из буфера). */
1532
+ readonly toolbar: InputSignal<TRtRichEditorToolbar>;
1533
+ /** Enter без Shift в редакторе — сигнал отправки (Shift+Enter остаётся переносом). */
1534
+ readonly enterPressed: OutputEmitterRef<void>;
1535
+ readonly displayText: Signal<string>;
1536
+ ngAfterViewInit(): Promise<void>;
1537
+ ngOnDestroy(): void;
1538
+ writeValue(value: IQuillDelta | null): void;
1539
+ setDisabledState(isDisabled: boolean): void;
1540
+ protected getEmptyValue(): IQuillDelta | null;
1541
+ protected focusAfterClear(): void;
1542
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtRichEditorComponent, never>;
1543
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtRichEditorComponent, "rt-rich-editor", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "toolbar": { "alias": "toolbar"; "required": false; "isSignal": true; }; }, { "enterPressed": "enterPressed"; }, never, never, true, never>;
1544
+ }
1545
+
1392
1546
  /**
1393
1547
  * Общий презентационный чат: тред сообщений + композер. Никакого data-access/api —
1394
1548
  * история приходит готовым массивом `IRtChat.Message[]`, отправка/обновление/
@@ -1413,7 +1567,7 @@ declare class RtChatComponent {
1413
1567
  * Данные локали для `DatePipe` регистрирует приложение: без них пайп падает
1414
1568
  * `Missing locale data`, и кит за это не отвечает.
1415
1569
  */
1416
- protected readonly t: Signal<RtKitLabelMap>;
1570
+ protected readonly t: Signal<TRtKitLabelMap>;
1417
1571
  protected readonly locale: Signal<string>;
1418
1572
  /**
1419
1573
  * Скролл-контейнер треда — для автопрокрутки к последнему сообщению.
@@ -1462,6 +1616,12 @@ declare class RtChatComponent {
1462
1616
  * принимает drop напрямую в свой `replyForm`.
1463
1617
  */
1464
1618
  protected readonly droppedFiles: WritableSignal<File[] | null>;
1619
+ /**
1620
+ * Шаблон действий у реплики: `<ng-template rtChatMessageActions let-message>`.
1621
+ *
1622
+ * Не объявлен — разметка реплики прежняя, и лишней кнопки у неё не появляется.
1623
+ */
1624
+ protected readonly messageActions: Signal<RtChatMessageActionsDirective | undefined>;
1465
1625
  /** История сообщений (consumer уже смаппил из доменной модели). */
1466
1626
  readonly messages: InputSignal<readonly IRtChat.Message[]>;
1467
1627
  /** Первичная загрузка — скелетоны вместо треда. */
@@ -1501,7 +1661,7 @@ declare class RtChatComponent {
1501
1661
  */
1502
1662
  readonly formatting: InputSignalWithTransform<boolean, BooleanInput>;
1503
1663
  /** Набор кнопок rich-редактора (проброс до `rt-rich-editor` через композер). */
1504
- readonly formattingToolbar: InputSignal<IRtRichEditorToolbar>;
1664
+ readonly formattingToolbar: InputSignal<TRtRichEditorToolbar>;
1505
1665
  /**
1506
1666
  * Растягивать чат на всю высоту контейнера: тред занимает свободное место,
1507
1667
  * композер прижат к низу. По умолчанию выключен (тред с фикс. max-height).
@@ -1516,7 +1676,8 @@ declare class RtChatComponent {
1516
1676
  readonly send: OutputEmitterRef<IRtChat.SendPayload>;
1517
1677
  /** Клик refresh — consumer перетягивает тред. */
1518
1678
  readonly refresh: OutputEmitterRef<void>;
1519
- /** Клик по вложению — consumer качает blob своим api. */
1679
+ /** Клик по вложению — consumer качает blob своим api. Шаблон зовёт выход прямо: релей-метод,
1680
+ * который только повторял `emit`, ничего не добавлял, а файл при этом рос. */
1520
1681
  readonly downloadFile: OutputEmitterRef<IRtChat.Message>;
1521
1682
  /** Клик по карточке вложения из `attachments[]` — консюмер качает по `publicId`. */
1522
1683
  readonly downloadAttachment: OutputEmitterRef<IRtChat.Attachment>;
@@ -1525,6 +1686,13 @@ declare class RtChatComponent {
1525
1686
  readonly deleteMessage: OutputEmitterRef<IRtChat.Message>;
1526
1687
  /** Повторная отправка своего сообщения со статусом `failed`. */
1527
1688
  readonly retryMessage: OutputEmitterRef<IRtChat.Message>;
1689
+ /**
1690
+ * Есть ли у реплики действия потребителя — гейт кнопки «…» у неё.
1691
+ *
1692
+ * Не задан — точка действий показывается у каждой реплики: экран, который ничего не
1693
+ * гейтит, показывает её так же, как это делает строка таблицы.
1694
+ */
1695
+ readonly messageHasActions: InputSignal<IRtChat.MessageActionsPredicate | null>;
1528
1696
  constructor();
1529
1697
  protected onSubmit(): void;
1530
1698
  protected onComposerKeydown(event: KeyboardEvent): void;
@@ -1538,27 +1706,37 @@ declare class RtChatComponent {
1538
1706
  protected openFilePicker(): void;
1539
1707
  protected onFilesPicked(event: Event): void;
1540
1708
  protected removeFile(index: number): void;
1541
- /**
1542
- * Обновляем «у нижнего ли края» по скроллу — основа решения об автоскролле.
1543
- * Прилипание к низу снимаем ТОЛЬКО когда пользователь прокрутил ВВЕРХ (scrollTop
1544
- * уменьшился). Событие от программной прокрутки и рост контента идут при том же
1545
- * или большем scrollTop — тогда прилипание лишь усиливаем, но не снимаем. Иначе
1546
- * async-событие от нашего же `scrollTop = scrollHeight`, долетающее уже после
1547
- * поздней дорисовки rich-контента (высота выросла, scrollTop прежний → мнимый
1548
- * «отрыв от низа»), сбрасывало бы `#atBottom` и ломало до-прокрутку.
1549
- */
1709
+ /** Признак «читатель у нижнего края» обновляется по прокрутке: на нём стоит автопрокрутка. */
1550
1710
  protected onThreadScroll(): void;
1551
- protected onRefresh(): void;
1552
- protected onDownload(message: IRtChat.Message): void;
1553
- /** Релей клика по вложению наружу — сам компонент файлов не качает. */
1554
- protected onDownloadAttachment(attachment: IRtChat.Attachment): void;
1555
- /** Релей запроса на удаление сообщения — удаляет домен, компонент только рисует. */
1556
- protected onDeleteMessage(message: IRtChat.Message): void;
1557
- /** Релей повтора отправки упавшего сообщения — переотправляет домен. */
1558
- protected onRetryMessage(message: IRtChat.Message): void;
1559
1711
  protected toggleExpand(): void;
1560
1712
  static ɵfac: i0.ɵɵFactoryDeclaration<RtChatComponent, never>;
1561
- static ɵcmp: i0.ɵɵComponentDeclaration<RtChatComponent, "rt-chat", never, { "messages": { "alias": "messages"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fetching": { "alias": "fetching"; "required": false; "isSignal": true; }; "canReply": { "alias": "canReply"; "required": false; "isSignal": true; }; "replyBlockReason": { "alias": "replyBlockReason"; "required": false; "isSignal": true; }; "sending": { "alias": "sending"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "emptyHint": { "alias": "emptyHint"; "required": false; "isSignal": true; }; "hasThread": { "alias": "hasThread"; "required": false; "isSignal": true; }; "attachments": { "alias": "attachments"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "richComposer": { "alias": "richComposer"; "required": false; "isSignal": true; }; "formatting": { "alias": "formatting"; "required": false; "isSignal": true; }; "formattingToolbar": { "alias": "formattingToolbar"; "required": false; "isSignal": true; }; "fill": { "alias": "fill"; "required": false; "isSignal": true; }; "showRefresh": { "alias": "showRefresh"; "required": false; "isSignal": true; }; "showExpand": { "alias": "showExpand"; "required": false; "isSignal": true; }; }, { "send": "send"; "refresh": "refresh"; "downloadFile": "downloadFile"; "downloadAttachment": "downloadAttachment"; "expandedChange": "expandedChange"; "deleteMessage": "deleteMessage"; "retryMessage": "retryMessage"; }, never, ["[rtChatHeaderActions]", "[rtChatFooter]"], true, never>;
1713
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtChatComponent, "rt-chat", never, { "messages": { "alias": "messages"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fetching": { "alias": "fetching"; "required": false; "isSignal": true; }; "canReply": { "alias": "canReply"; "required": false; "isSignal": true; }; "replyBlockReason": { "alias": "replyBlockReason"; "required": false; "isSignal": true; }; "sending": { "alias": "sending"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "emptyHint": { "alias": "emptyHint"; "required": false; "isSignal": true; }; "hasThread": { "alias": "hasThread"; "required": false; "isSignal": true; }; "attachments": { "alias": "attachments"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "richComposer": { "alias": "richComposer"; "required": false; "isSignal": true; }; "formatting": { "alias": "formatting"; "required": false; "isSignal": true; }; "formattingToolbar": { "alias": "formattingToolbar"; "required": false; "isSignal": true; }; "fill": { "alias": "fill"; "required": false; "isSignal": true; }; "showRefresh": { "alias": "showRefresh"; "required": false; "isSignal": true; }; "showExpand": { "alias": "showExpand"; "required": false; "isSignal": true; }; "messageHasActions": { "alias": "messageHasActions"; "required": false; "isSignal": true; }; }, { "send": "send"; "refresh": "refresh"; "downloadFile": "downloadFile"; "downloadAttachment": "downloadAttachment"; "expandedChange": "expandedChange"; "deleteMessage": "deleteMessage"; "retryMessage": "retryMessage"; }, ["messageActions"], ["[rtChatHeaderActions]", "[rtChatFooter]"], true, never>;
1714
+ }
1715
+
1716
+ /**
1717
+ * Есть ли у реплики хотя бы одно доступное действие потребителя.
1718
+ *
1719
+ * Признак приходит предикатом от экрана, а не подсчётом отрисованных пунктов меню:
1720
+ * содержимое спроецированного шаблона известно только после отрисовки, и кнопка
1721
+ * успевала бы мигнуть на первом кадре.
1722
+ *
1723
+ * Предикат не задан — у реплики есть действия: экран, который ничего не гейтит,
1724
+ * показывает кнопку меню. Так же это устроено у строки таблицы, и расхождение между
1725
+ * двумя точками проекции одного кита читалось бы дефектом.
1726
+ */
1727
+ declare function messageHasAvailableActions(message: IRtChat.Message, hasActions: IRtChat.MessageActionsPredicate | null): boolean;
1728
+
1729
+ /**
1730
+ * Есть ли у реплики доступные действия — гейт кнопки «…» у неё.
1731
+ *
1732
+ * Pure-pipe: пересчитывается только при смене реплики или предиката, а не на каждом
1733
+ * цикле проверки. Значение приходит из контекста шаблона (реплика треда), поэтому
1734
+ * `computed()` здесь неприменим.
1735
+ */
1736
+ declare class RtChatMessageHasActionsPipe implements PipeTransform {
1737
+ transform(message: IRtChat.Message, hasActions: IRtChat.MessageActionsPredicate | null): boolean;
1738
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtChatMessageHasActionsPipe, never>;
1739
+ static ɵpipe: i0.ɵɵPipeDeclaration<RtChatMessageHasActionsPipe, "rtChatMessageHasActions", true>;
1562
1740
  }
1563
1741
 
1564
1742
  /**
@@ -1674,7 +1852,7 @@ declare class RtCheckboxComponent implements ControlValueAccessor {
1674
1852
 
1675
1853
  declare class RtCollapsibleTextComponent implements OnDestroy {
1676
1854
  #private;
1677
- protected readonly t: Signal<RtKitLabelMap>;
1855
+ protected readonly t: Signal<TRtKitLabelMap>;
1678
1856
  protected readonly textRef: Signal<ElementRef<HTMLElement> | undefined>;
1679
1857
  protected readonly expanded: WritableSignal<boolean>;
1680
1858
  protected readonly overflowing: WritableSignal<boolean>;
@@ -1823,6 +2001,13 @@ declare class RtContainerComponent {
1823
2001
  static ɵcmp: i0.ɵɵComponentDeclaration<RtContainerComponent, "rt-container", never, { "mobileLeftNav": { "alias": "mobileLeftNav"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, { "backdropClick": "backdropClick"; "rightOpened": "rightOpened"; "rightClosed": "rightClosed"; }, ["headerTpl", "leftSidenavTpl", "rightSidenavTpl", "toolbarLeftTpl", "toolbarCenterTpl", "toolbarRightTpl", "contentTpl"], never, true, never>;
1824
2002
  }
1825
2003
 
2004
+ /**
2005
+ * Маркеры слотов оболочки — своим файлом, а не рядом с панельными директивами.
2006
+ *
2007
+ * Панельные директивы берут сам компонент оболочки значением, а компонент объявляет маркеры в
2008
+ * своих импортах: вместе это круг «оболочка → директивы → оболочка». Маркеры пусты и не знают
2009
+ * об оболочке ничего, поэтому расходятся с ней без потерь.
2010
+ */
1826
2011
  /**
1827
2012
  * Маркер-директива для содержимого хедера `rt-container`.
1828
2013
  *
@@ -1935,6 +2120,7 @@ declare class RtContainerContentDirective {
1935
2120
  static ɵfac: i0.ɵɵFactoryDeclaration<RtContainerContentDirective, never>;
1936
2121
  static ɵdir: i0.ɵɵDirectiveDeclaration<RtContainerContentDirective, "[rtContainerContent]", never, {}, {}, never, never, true, never>;
1937
2122
  }
2123
+
1938
2124
  /**
1939
2125
  * Driver-директива для управления левой sidenav через шаблонную ссылку.
1940
2126
  *
@@ -2085,6 +2271,14 @@ declare abstract class RtRouteAsideComponent<T> implements OnInit {
2085
2271
  */
2086
2272
  protected readonly pristine: Signal<boolean>;
2087
2273
  protected readonly submitError: WritableSignal<string | null>;
2274
+ /**
2275
+ * Удача мутации — тем же способом, что и отказ. Человек, работающий в панели,
2276
+ * смотрит в панель, а не на экран за её краем: тост об успехе всплывает там,
2277
+ * куда он в эту минуту не смотрит. Оба сигнала гасятся в начале каждой
2278
+ * попытки и гасят друг друга — это ответы на один вопрос, и двух сразу не
2279
+ * бывает.
2280
+ */
2281
+ protected readonly submitSuccess: WritableSignal<string | null>;
2088
2282
  protected readonly idParamName: string;
2089
2283
  /** id-only режим: нужен только id (например, смена пароля по userId), сущность не грузится. */
2090
2284
  protected readonly idOnly: boolean;
@@ -2100,11 +2294,7 @@ declare abstract class RtRouteAsideComponent<T> implements OnInit {
2100
2294
  */
2101
2295
  canDeactivate(): Observable<boolean>;
2102
2296
  protected setEntity(entity: T | null): void;
2103
- /**
2104
- * Признак нетронутой формы. Контрол принимается и сигналом: форма панели
2105
- * собрана директивой `ngForm` и до отрисовки шаблона её ещё нет, поэтому
2106
- * `viewChild(NgForm)` отдаёт её только сигналом.
2107
- */
2297
+ /** Признак нетронутой формы — тот же, что гейтит кнопку записи. */
2108
2298
  protected pristineSignal(control: AbstractControl | Signal<AbstractControl | undefined>): Signal<boolean>;
2109
2299
  /**
2110
2300
  * Ставит гард закрытия: пока форма тронута, любой из четырёх путей закрытия
@@ -2139,10 +2329,18 @@ declare abstract class RtRouteAsideComponent<T> implements OnInit {
2139
2329
  * `errorText` принимается и функцией: причина отказа известна только после
2140
2330
  * него — стор кладёт её в свой сигнал, а панель без стора выводит из ответа
2141
2331
  * сервера, — и готовой строкой на момент запуска мутации её не передать.
2332
+ *
2333
+ * `successMessage` — текст удачи, который панель показывает внутри себя,
2334
+ * рядом с формой. Довод отделён от `successText` намеренно: переезд текста
2335
+ * из тоста в панель сломал бы всякого потребителя, который тост и хотел, а
2336
+ * сказать «мне нужен тост» ему после этого было бы нечем. Назван он по месту
2337
+ * показа, а не по исходу: два довода с разницей в одном слоге читались бы
2338
+ * как опечатка.
2142
2339
  */
2143
2340
  protected runMutation(op$: Observable<unknown>, opts?: {
2144
2341
  onSuccess?: () => void;
2145
2342
  successText?: string;
2343
+ successMessage?: string;
2146
2344
  errorText?: string | ((error: unknown) => string);
2147
2345
  closeOnSuccess?: boolean;
2148
2346
  refreshOnSuccess?: boolean;
@@ -2161,10 +2359,16 @@ declare abstract class RtRouteAsideComponent<T> implements OnInit {
2161
2359
  static ɵdir: i0.ɵɵDirectiveDeclaration<RtRouteAsideComponent<any>, never, never, {}, {}, never, never, true, never>;
2162
2360
  }
2163
2361
 
2164
- /** Панель, которая умеет ответить на вопрос «можно ли уступить место». */
2362
+ /**
2363
+ * Панель, которая умеет ответить на вопрос «можно ли уступить место».
2364
+ *
2365
+ * Объявлена рядом с учётом панелей, а не рядом с гардом: гард берёт учёт значением, и
2366
+ * объявление у него замыкало круг «учёт → гард → учёт».
2367
+ */
2165
2368
  interface IRtAsideDeactivate {
2166
2369
  canDeactivate(): Observable<boolean>;
2167
2370
  }
2371
+
2168
2372
  declare const rtAsideUnsavedGuard: CanDeactivateFn<IRtAsideDeactivate | null>;
2169
2373
 
2170
2374
  /**
@@ -2227,8 +2431,8 @@ declare class RtCounterComponent implements ControlValueAccessor {
2227
2431
  * берёт компонент, у которого есть доступ к текущей локали; перекрываются
2228
2432
  * поштучно через input'ы `decreaseLabel` / `increaseLabel`.
2229
2433
  */
2230
- declare const RT_COUNTER_DECREASE_KEY: RtKitLabelKey;
2231
- declare const RT_COUNTER_INCREASE_KEY: RtKitLabelKey;
2434
+ declare const RT_COUNTER_DECREASE_KEY: TRtKitLabelKey;
2435
+ declare const RT_COUNTER_INCREASE_KEY: TRtKitLabelKey;
2232
2436
 
2233
2437
  /**
2234
2438
  * Строка списка со счётчиком: подпись с пояснением слева, контрол справа,
@@ -2266,7 +2470,7 @@ declare namespace IRtDatePicker {
2266
2470
  */
2267
2471
  declare class RtDatePickerComponent extends RtFormControlBase<string> {
2268
2472
  #private;
2269
- protected readonly t: Signal<RtKitLabelMap>;
2473
+ protected readonly t: Signal<TRtKitLabelMap>;
2270
2474
  protected readonly fieldEl: Signal<ElementRef<HTMLInputElement> | undefined>;
2271
2475
  protected readonly hasValue: Signal<boolean>;
2272
2476
  readonly displayText: Signal<string>;
@@ -2309,7 +2513,7 @@ declare class RtDetailRowComponent {
2309
2513
  static ɵcmp: i0.ɵɵComponentDeclaration<RtDetailRowComponent, "rt-detail-row", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2310
2514
  }
2311
2515
 
2312
- type IRtDialogSize = 'sm' | 'md' | 'lg';
2516
+ type TRtDialogSize = 'sm' | 'md' | 'lg';
2313
2517
  /**
2314
2518
  * Презентационный styled-frame для модалки поверх CDK Overlay.
2315
2519
  *
@@ -2344,7 +2548,7 @@ declare class RtDialogComponent {
2344
2548
  * - `md` — 660px (`--rt-dialog-width-md`, дефолт)
2345
2549
  * - `lg` — 860px (`--rt-dialog-width-lg`)
2346
2550
  */
2347
- readonly size: InputSignal<IRtDialogSize>;
2551
+ readonly size: InputSignal<TRtDialogSize>;
2348
2552
  /** Override ширины через CSS-property `--rt-dialog-width`. Имеет приоритет над `size`. */
2349
2553
  readonly width: InputSignal<string | null>;
2350
2554
  /** ARIA-label для dialog-обёртки (если нет видимого заголовка). */
@@ -2514,7 +2718,7 @@ declare const RT_DIALOG_DATA: InjectionToken<unknown>;
2514
2718
  declare class RtDialogHeaderComponent {
2515
2719
  #private;
2516
2720
  /** Текст заголовка — рендерится в `<h2>`. */
2517
- protected readonly t: Signal<RtKitLabelMap>;
2721
+ protected readonly t: Signal<TRtKitLabelMap>;
2518
2722
  readonly title: InputSignal<string>;
2519
2723
  /** Показывать кнопку закрытия в углу заголовка. Дефолт `true`. */
2520
2724
  readonly closable: InputSignalWithTransform<boolean, BooleanInput>;
@@ -2598,7 +2802,7 @@ declare namespace IRtField {
2598
2802
  * страницы ещё неизвестен, и готовый текст остался бы на языке по умолчанию
2599
2803
  * даже под переведённой подписью поля. Переводит сам компонент поля.
2600
2804
  */
2601
- declare const RT_FIELD_DEFAULT_ERROR_KEYS: Readonly<Record<string, RtKitLabelKey>>;
2805
+ declare const RT_FIELD_DEFAULT_ERROR_KEYS: Readonly<Record<string, TRtKitLabelKey>>;
2602
2806
  /** Текст-плейсхолдер read-only поля без значения. */
2603
2807
  declare const RT_FIELD_EMPTY_VALUE: string;
2604
2808
 
@@ -2618,7 +2822,7 @@ declare const RT_FIELD_EMPTY_VALUE: string;
2618
2822
  */
2619
2823
  declare class RtFieldComponent implements AfterContentInit {
2620
2824
  #private;
2621
- protected readonly t: Signal<RtKitLabelMap>;
2825
+ protected readonly t: Signal<TRtKitLabelMap>;
2622
2826
  protected readonly projectedControl: Signal<RtFormControlBase<unknown> | undefined>;
2623
2827
  protected readonly projectedHint: Signal<RtFieldHintDirective | undefined>;
2624
2828
  /** Итоговый id: явный controlId контрола важнее авто-id. */
@@ -2697,7 +2901,7 @@ declare namespace IRtFileCard {
2697
2901
  */
2698
2902
  declare class RtFileCardComponent {
2699
2903
  /** Имя цветной иконки типа файла по расширению. */
2700
- protected readonly t: Signal<RtKitLabelMap>;
2904
+ protected readonly t: Signal<TRtKitLabelMap>;
2701
2905
  protected readonly iconName: Signal<IRtIcon.Name>;
2702
2906
  /** Заголовок карточки, выведенный из имени файла (без расширения, разделители → пробелы). */
2703
2907
  protected readonly title: Signal<string>;
@@ -2984,7 +3188,7 @@ declare class RtFilterControlComponent<T = string> {
2984
3188
  * страницы в dark).
2985
3189
  */
2986
3190
  declare class RtHeaderComponent {
2987
- protected readonly t: Signal<RtKitLabelMap>;
3191
+ protected readonly t: Signal<TRtKitLabelMap>;
2988
3192
  readonly canGoBack: InputSignal<boolean>;
2989
3193
  /** Показывать action-иконку «Пригласить пользователя» слева от колокола. */
2990
3194
  readonly showInvite: InputSignalWithTransform<boolean, boolean | string>;
@@ -3097,7 +3301,7 @@ declare class RtInfoItemComponent {
3097
3301
  * Все размеры/цвета — через `--rt-input-*` semantic-токены.
3098
3302
  */
3099
3303
  declare class RtInputComponent extends RtFormControlBase<string> {
3100
- protected readonly t: Signal<RtKitLabelMap>;
3304
+ protected readonly t: Signal<TRtKitLabelMap>;
3101
3305
  protected readonly fieldEl: Signal<ElementRef<HTMLInputElement> | undefined>;
3102
3306
  protected readonly isPasswordVisible: WritableSignal<boolean>;
3103
3307
  protected readonly hasValue: Signal<boolean>;
@@ -3145,7 +3349,7 @@ declare class RtInputComponent extends RtFormControlBase<string> {
3145
3349
  */
3146
3350
  declare class RtInputNumberComponent extends RtFormControlBase<number | null> {
3147
3351
  #private;
3148
- protected readonly t: Signal<RtKitLabelMap>;
3352
+ protected readonly t: Signal<TRtKitLabelMap>;
3149
3353
  protected readonly fieldEl: Signal<ElementRef<HTMLInputElement> | undefined>;
3150
3354
  protected readonly displayValue: WritableSignal<string>;
3151
3355
  protected readonly hasValue: Signal<boolean>;
@@ -3253,6 +3457,30 @@ declare class RtLogoComponent {
3253
3457
  static ɵcmp: i0.ɵɵComponentDeclaration<RtLogoComponent, "rt-logo", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "aspect": { "alias": "aspect"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3254
3458
  }
3255
3459
 
3460
+ /**
3461
+ * Текст, написанный разметкой, показанный узлами.
3462
+ *
3463
+ * Перечень разметки зашит в разборщике и входом не задаётся: вход у компонента один — сам
3464
+ * текст. Настраивать нечего, значит нечем и ослабить.
3465
+ *
3466
+ * Присланная строка в страницу не отдаётся ни разу: компонент рисует дерево узлов, которое
3467
+ * вернул разбор, и другого пути у текста внутрь страницы нет. Поэтому сырой HTML, картинки и
3468
+ * адреса чужих схем показываются видимым текстом — узла для них разборщик не строит.
3469
+ *
3470
+ * Таблица рисуется своей разметкой, а не таблицей кита: та объявляет колонки заранее
3471
+ * директивами, а число столбцов здесь приходит из текста и заранее не известно никому.
3472
+ */
3473
+ declare class RtMarkdownTextComponent {
3474
+ /** Роды блоков в шаблоне: сравнение идёт со значением перечисления, а не со строкой. */
3475
+ protected readonly blockKind: typeof ERtMarkdownBlock;
3476
+ /** Роды кусков строки в шаблоне. */
3477
+ protected readonly inlineKind: typeof ERtMarkdownInline;
3478
+ protected readonly blocks: Signal<readonly IRtMarkdownBlockNode[]>;
3479
+ readonly text: InputSignal<string | null>;
3480
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtMarkdownTextComponent, never>;
3481
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtMarkdownTextComponent, "rt-markdown-text", never, { "text": { "alias": "text"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
3482
+ }
3483
+
3256
3484
  /**
3257
3485
  * Контракты `rt-menu` — dropdown-меню действий (триггер «…» + плавающая панель
3258
3486
  * с пунктами `rt-menu-item`). Один корневой неймспейс с префиксом `I`.
@@ -3452,7 +3680,7 @@ declare class RtMessageComponent {
3452
3680
  * передайте пустую строку как `[icon]` — она будет falsy и не «победит» default.
3453
3681
  * Полное отключение делается через severity `secondary` / `neutral`.
3454
3682
  */
3455
- protected readonly t: Signal<RtKitLabelMap>;
3683
+ protected readonly t: Signal<TRtKitLabelMap>;
3456
3684
  protected readonly effectiveIcon: Signal<IRtIcon.Name | null>;
3457
3685
  /** Семантическая палитра. По умолчанию `info` (синий info-banner). */
3458
3686
  readonly severity: InputSignal<IRtTag.Severity>;
@@ -3484,7 +3712,7 @@ interface IComposerFormShape {
3484
3712
  */
3485
3713
  declare class RtMessageComposerComponent {
3486
3714
  #private;
3487
- protected readonly t: Signal<RtKitLabelMap>;
3715
+ protected readonly t: Signal<TRtKitLabelMap>;
3488
3716
  protected readonly placeholderText: Signal<string>;
3489
3717
  protected readonly fileInput: Signal<ElementRef<HTMLInputElement> | undefined>;
3490
3718
  protected readonly form: FormGroup<IComposerFormShape>;
@@ -3504,7 +3732,7 @@ declare class RtMessageComposerComponent {
3504
3732
  /** Rich-режим: вместо textarea — Quill-редактор, отправка уходит delta-каналом. */
3505
3733
  readonly formatting: InputSignalWithTransform<boolean, BooleanInput>;
3506
3734
  /** Набор кнопок rich-редактора (проброс в `rt-rich-editor`). */
3507
- readonly toolbar: InputSignal<IRtRichEditorToolbar>;
3735
+ readonly toolbar: InputSignal<TRtRichEditorToolbar>;
3508
3736
  /** Минимальная высота textarea в строках. */
3509
3737
  readonly minRows: InputSignalWithTransform<number, NumberInput>;
3510
3738
  /** Максимальная высота textarea в строках (дальше — скролл). */
@@ -3570,7 +3798,7 @@ declare class RtMoneyRowComponent {
3570
3798
  */
3571
3799
  declare class RtMultiselectComponent<TValue> extends RtFormControlBase<ReadonlyArray<TValue>> {
3572
3800
  #private;
3573
- protected readonly t: Signal<RtKitLabelMap>;
3801
+ protected readonly t: Signal<TRtKitLabelMap>;
3574
3802
  protected readonly panelId: string;
3575
3803
  protected readonly placeholderText: Signal<string>;
3576
3804
  protected readonly popover: Signal<RtPopoverDirective>;
@@ -3790,7 +4018,9 @@ declare namespace IRtPageHeaderView {
3790
4018
  */
3791
4019
  declare class RtPageHeaderComponent {
3792
4020
  #private;
3793
- protected readonly t: Signal<RtKitLabelMap>;
4021
+ /** Переводчик для чистого пайпа подписи: шаблон отдаёт его вторым доводом. */
4022
+ protected readonly translate: Signal<TRtKitTranslator>;
4023
+ protected readonly t: Signal<TRtKitLabelMap>;
3794
4024
  protected readonly mobileNavPopoverRef: Signal<RtPopoverDirective | undefined>;
3795
4025
  /** Форма пункта решается один раз здесь, а не ветвлениями в шаблоне. */
3796
4026
  protected readonly sections: Signal<ReadonlyArray<IRtPageHeaderView.Section>>;
@@ -3820,12 +4050,6 @@ declare class RtPageHeaderComponent {
3820
4050
  readonly itemClick: OutputEmitterRef<string>;
3821
4051
  readonly userClick: OutputEmitterRef<void>;
3822
4052
  constructor();
3823
- /**
3824
- * Подпись раздела в разработке. Методом, а не сигналом: имя раздела приходит
3825
- * элементом цикла, и до него подписи ещё нет. Метод читает сигнал
3826
- * переводчика, поэтому смена языка перерисовывает разметку и зовёт его заново.
3827
- */
3828
- protected sectionInProgressLabel(label: string): string;
3829
4053
  protected onItemClick(id: string): void;
3830
4054
  protected onUserClick(): void;
3831
4055
  /** Аккордеон мобильной панели: тумблер раскрытия раздела по его id. */
@@ -3888,7 +4112,7 @@ declare namespace IRtPhotoViewer {
3888
4112
  */
3889
4113
  declare class RtPhotoViewerComponent {
3890
4114
  #private;
3891
- protected readonly t: Signal<RtKitLabelMap>;
4115
+ protected readonly t: Signal<TRtKitLabelMap>;
3892
4116
  protected readonly track: Signal<ElementRef<HTMLElement> | undefined>;
3893
4117
  protected readonly photos: readonly IRtPhotoViewer.Photo[];
3894
4118
  /** Панель правки под дорожкой; там, где кадр только смотрят, её нет */
@@ -3935,7 +4159,7 @@ declare namespace IRtPagination {
3935
4159
  }
3936
4160
 
3937
4161
  declare class RtPaginationComponent {
3938
- protected readonly t: Signal<RtKitLabelMap>;
4162
+ protected readonly t: Signal<TRtKitLabelMap>;
3939
4163
  protected readonly perPageSelectOptions: Signal<ReadonlyArray<IRtSelect.Option<number>>>;
3940
4164
  /**
3941
4165
  * Диапазон записей и номер страницы — с подстановками, поэтому карте подписей
@@ -3991,7 +4215,7 @@ declare class RtSectionNavComponent {
3991
4215
  static ɵcmp: i0.ɵɵComponentDeclaration<RtSectionNavComponent, "rt-section-nav", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, { "itemSelect": "itemSelect"; }, never, never, true, never>;
3992
4216
  }
3993
4217
 
3994
- type IBooleanInput = boolean | string;
4218
+ type TBooleanInput = boolean | string;
3995
4219
  /**
3996
4220
  * Single-select dropdown с опциональным filter input.
3997
4221
  *
@@ -4006,7 +4230,7 @@ type IBooleanInput = boolean | string;
4006
4230
  */
4007
4231
  declare class RtSelectComponent<TValue> extends RtFormControlBase<TValue | null> {
4008
4232
  #private;
4009
- protected readonly t: Signal<RtKitLabelMap>;
4233
+ protected readonly t: Signal<TRtKitLabelMap>;
4010
4234
  protected readonly panelId: string;
4011
4235
  protected readonly filterPlaceholderText: Signal<string>;
4012
4236
  protected readonly popover: Signal<RtPopoverDirective>;
@@ -4021,7 +4245,7 @@ declare class RtSelectComponent<TValue> extends RtFormControlBase<TValue | null>
4021
4245
  readonly options: InputSignal<ReadonlyArray<IRtSelect.Option<TValue>>>;
4022
4246
  readonly placeholder: InputSignal<string>;
4023
4247
  readonly iconLeft: InputSignal<IRtIcon.Name | null>;
4024
- readonly filter: InputSignalWithTransform<boolean, IBooleanInput>;
4248
+ readonly filter: InputSignalWithTransform<boolean, TBooleanInput>;
4025
4249
  /** Пусто — берётся переведённая подпись по умолчанию */
4026
4250
  readonly filterPlaceholder: InputSignal<string>;
4027
4251
  readonly selectionChange: OutputEmitterRef<TValue | null>;
@@ -4037,9 +4261,9 @@ declare class RtSelectComponent<TValue> extends RtFormControlBase<TValue | null>
4037
4261
  static ɵcmp: i0.ɵɵComponentDeclaration<RtSelectComponent<any>, "rt-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "iconLeft": { "alias": "iconLeft"; "required": false; "isSignal": true; }; "filter": { "alias": "filter"; "required": false; "isSignal": true; }; "filterPlaceholder": { "alias": "filterPlaceholder"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, never, never, true, never>;
4038
4262
  }
4039
4263
 
4040
- type IRtSkeletonShape = 'rectangle' | 'circle' | 'square';
4041
- type IRtSkeletonSize = 'sm' | 'md' | 'lg';
4042
- type IRtSkeletonRadius = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
4264
+ type TRtSkeletonShape = 'rectangle' | 'circle' | 'square';
4265
+ type TRtSkeletonSize = 'sm' | 'md' | 'lg';
4266
+ type TRtSkeletonRadius = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
4043
4267
  /**
4044
4268
  * Visual primitive для loading-state'а: серая полоска с shimmer-анимацией.
4045
4269
  *
@@ -4052,8 +4276,8 @@ type IRtSkeletonRadius = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
4052
4276
  */
4053
4277
  declare class RtSkeletonComponent {
4054
4278
  #private;
4055
- readonly shape: InputSignal<IRtSkeletonShape>;
4056
- readonly size: InputSignal<IRtSkeletonSize>;
4279
+ readonly shape: InputSignal<TRtSkeletonShape>;
4280
+ readonly size: InputSignal<TRtSkeletonSize>;
4057
4281
  readonly width: InputSignal<string>;
4058
4282
  readonly height: InputSignal<string>;
4059
4283
  /**
@@ -4062,7 +4286,7 @@ declare class RtSkeletonComponent {
4062
4286
  * `xl`: тогда явный `xl` неотличим от невыставленного, и квадрату
4063
4287
  * приходилось прибивать `sm` жёстко — вход у него молча пропадал.
4064
4288
  */
4065
- readonly borderRadius: InputSignal<IRtSkeletonRadius | null>;
4289
+ readonly borderRadius: InputSignal<TRtSkeletonRadius | null>;
4066
4290
  readonly animation: InputSignalWithTransform<boolean, BooleanInput>;
4067
4291
  protected get isRectangle(): boolean;
4068
4292
  protected get isCircle(): boolean;
@@ -4093,10 +4317,10 @@ declare class RtSkeletonComponent {
4093
4317
  declare class RtSkeletonWrapperComponent {
4094
4318
  readonly width: InputSignal<string>;
4095
4319
  readonly height: InputSignal<string>;
4096
- readonly shape: InputSignal<IRtSkeletonShape>;
4097
- readonly size: InputSignal<IRtSkeletonSize>;
4320
+ readonly shape: InputSignal<TRtSkeletonShape>;
4321
+ readonly size: InputSignal<TRtSkeletonSize>;
4098
4322
  /** Как у `rt-skeleton`: `null` — «по фигуре», а не «без скругления». */
4099
- readonly borderRadius: InputSignal<IRtSkeletonRadius | null>;
4323
+ readonly borderRadius: InputSignal<TRtSkeletonRadius | null>;
4100
4324
  readonly animation: InputSignalWithTransform<boolean, BooleanInput>;
4101
4325
  readonly isLoading: InputSignalWithTransform<boolean, BooleanInput>;
4102
4326
  static ɵfac: i0.ɵɵFactoryDeclaration<RtSkeletonWrapperComponent, never>;
@@ -4253,7 +4477,7 @@ declare class RtStatTileComponent {
4253
4477
  * = null) не рисуется вовсе: «—» рядом с цифрой читается как поломка, а не
4254
4478
  * как «сравнивать не с чем».
4255
4479
  */
4256
- protected readonly t: Signal<RtKitLabelMap>;
4480
+ protected readonly t: Signal<TRtKitLabelMap>;
4257
4481
  protected readonly primaryDelta: Signal<IDeltaRow | null>;
4258
4482
  /** Годовое сравнение — отдельным компактным чипом, без слов в строке. */
4259
4483
  protected readonly yearDelta: Signal<IDeltaRow | null>;
@@ -4326,7 +4550,7 @@ declare class RtStepperComponent {
4326
4550
  }
4327
4551
 
4328
4552
  /** Значение для буфера: явная строка/число либо `null` (тогда берётся отображаемый текст). */
4329
- type ICopyValue = string | number | null;
4553
+ type TCopyValue = string | number | null;
4330
4554
  /**
4331
4555
  * Ячейка с копированием в буфер — переиспользуемый примитив для `cdkCellDef`
4332
4556
  * (и не только). rt-table projection-driven: контент ячейки пишет
@@ -4350,13 +4574,20 @@ type ICopyValue = string | number | null;
4350
4574
  declare class RtCopyCellComponent {
4351
4575
  #private;
4352
4576
  protected readonly copied: WritableSignal<boolean>;
4577
+ /**
4578
+ * Подсказка со значением целиком — только у обрезанного.
4579
+ *
4580
+ * У помещающегося она повторяла бы то, что человек и так читает, и всплывала бы над каждой
4581
+ * ячейкой таблицы; пустая строка директиву подсказки выключает.
4582
+ */
4583
+ protected readonly hint: WritableSignal<string>;
4353
4584
  protected readonly iconName: Signal<IRtIcon.Name>;
4354
4585
  protected readonly actionLabel: Signal<string>;
4355
4586
  /**
4356
4587
  * Строка для буфера. Если не задана — копируется отображаемый текст
4357
4588
  * (textContent проецируемого контента). Число приводится к строке.
4358
4589
  */
4359
- readonly value: InputSignal<ICopyValue>;
4590
+ readonly value: InputSignal<TCopyValue>;
4360
4591
  /** Палитра кнопки копирования. В таблицах — `ghost`; вне таблиц удобнее `secondary`. */
4361
4592
  readonly variant: InputSignal<IRtIconButton.Variant>;
4362
4593
  /**
@@ -4366,6 +4597,13 @@ declare class RtCopyCellComponent {
4366
4597
  */
4367
4598
  readonly revealOnHover: InputSignalWithTransform<boolean, BooleanInput>;
4368
4599
  constructor();
4600
+ /**
4601
+ * Замер обрезки в момент наведения.
4602
+ *
4603
+ * Ширина известна только отрисованному узлу, а меняется она и от переезда столбца, и от
4604
+ * ширины окна: посчитанная один раз при заведении, она соврала бы при первом же изменении.
4605
+ */
4606
+ protected measureTruncation(): void;
4369
4607
  protected onCopy(event: MouseEvent): void;
4370
4608
  static ɵfac: i0.ɵɵFactoryDeclaration<RtCopyCellComponent, never>;
4371
4609
  static ɵcmp: i0.ɵɵComponentDeclaration<RtCopyCellComponent, "rt-copy-cell", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "revealOnHover": { "alias": "revealOnHover"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
@@ -4415,7 +4653,7 @@ declare namespace IRtTable {
4415
4653
  }
4416
4654
 
4417
4655
  /** Значение атрибута `aria-sort` заголовка: направление либо его отсутствие. */
4418
- type IRtTableAriaSort = 'ascending' | 'descending' | 'none';
4656
+ type TRtTableAriaSort = 'ascending' | 'descending' | 'none';
4419
4657
  /**
4420
4658
  * Следующее состояние сортировки при нажатии на заголовок колонки.
4421
4659
  *
@@ -4424,9 +4662,9 @@ type IRtTableAriaSort = 'ascending' | 'descending' | 'none';
4424
4662
  */
4425
4663
  declare function nextSort(current: ISortModel<string> | null, propertyName: string): ISortModel<string> | null;
4426
4664
  /** Направление сортировки по этой колонке либо `null`, когда сортирует другая. */
4427
- declare function sortDirectionOf(current: ISortModel<string> | null, propertyName: string): ListSortOrderType | null;
4665
+ declare function sortDirectionOf(current: ISortModel<string> | null, propertyName: string): TListSortOrderType | null;
4428
4666
  /** Значение `aria-sort` заголовка: направление читается скринридером с самой колонки. */
4429
- declare function ariaSortOf(current: ISortModel<string> | null, propertyName: string): IRtTableAriaSort;
4667
+ declare function ariaSortOf(current: ISortModel<string> | null, propertyName: string): TRtTableAriaSort;
4430
4668
  /**
4431
4669
  * Сортируется ли колонка. Колонка, описанная в `columnsConfig`, сортируется только
4432
4670
  * по своему признаку; колонки, которой в конфиге нет, метаданных взять неоткуда —
@@ -4449,12 +4687,12 @@ declare function isColumnSortable(config: ReadonlyArray<IRtTable.ColumnConfig>,
4449
4687
  declare class RtTableSortHeaderComponent {
4450
4688
  #private;
4451
4689
  /** Направление сортировки по этой колонке; `null` — сортирует другая либо никакая. */
4452
- protected readonly direction: Signal<ListSortOrderType | null>;
4690
+ protected readonly direction: Signal<TListSortOrderType | null>;
4453
4691
  protected readonly icon: Signal<IRtIcon.Name>;
4454
4692
  protected readonly sortable: Signal<boolean>;
4455
4693
  /** Ключ колонки — тот же, что в `cdkColumnDef` и в `[columnsConfig]`. */
4456
4694
  readonly rtSortHeader: InputSignal<string>;
4457
- readonly ariaSort: Signal<IRtTableAriaSort>;
4695
+ readonly ariaSort: Signal<TRtTableAriaSort>;
4458
4696
  protected onToggle(): void;
4459
4697
  static ɵfac: i0.ɵɵFactoryDeclaration<RtTableSortHeaderComponent, never>;
4460
4698
  static ɵcmp: i0.ɵɵComponentDeclaration<RtTableSortHeaderComponent, "rt-table-sort-header, th[rtSortHeader]", never, { "rtSortHeader": { "alias": "rtSortHeader"; "required": true; "isSignal": true; }; }, {}, never, ["*"], true, never>;
@@ -4589,15 +4827,42 @@ declare class RtTableRowDirective {
4589
4827
  /** Имя внутренней «…»-колонки действий, добавляемой при `[showRowActions]`. */
4590
4828
  declare const RT_TABLE_ROW_ACTIONS_COLUMN: string;
4591
4829
  /**
4592
- * Описатель поля авто-карточки мобильного режима: лейбл колонки (из `columnsConfig`)
4593
- * + её cell-шаблон (`cdkColumnDef`.cell), который рендерится в значение через
4594
- * `ngTemplateOutlet` с контекстом `{ $implicit: row }`.
4830
+ * Колонки конфига без применённых настроек пользователя — источник для кнопки
4831
+ * «Сбросить» в панели. Закрытая колонка видима всегда: скрыть её панель не даёт.
4832
+ */
4833
+ declare function defaultColumnItems(config: ReadonlyArray<IRtTable.ColumnConfig>): ReadonlyArray<IRtTable.ColumnSettingItem>;
4834
+ /**
4835
+ * Разрешённые колонки настраиваемой таблицы: конфиг в применённом порядке с текущим
4836
+ * признаком скрытия.
4837
+ *
4838
+ * Порядок берётся из сохранённых настроек, а колонки, появившиеся в конфиге после
4839
+ * сохранения, встают в конец: настройки, снятые с прежнего состава, иначе прятали бы
4840
+ * новую колонку молча. Настроек нет — порядок и скрытие берутся из самого конфига.
4841
+ */
4842
+ declare function resolveColumns(config: ReadonlyArray<IRtTable.ColumnConfig>, settings: IRtTable.ColumnSettings | null): ReadonlyArray<IRtTable.ColumnSettingItem>;
4843
+ /**
4844
+ * Имена колонок для строк CDK: у настраиваемой таблицы — видимые в применённом порядке,
4845
+ * у остальных — то, что назвал вход `[columns]`. Колонка действий встаёт последней, когда
4846
+ * действия строки включены.
4847
+ */
4848
+ declare function displayedColumnKeys(resolved: ReadonlyArray<IRtTable.ColumnSettingItem>, legacyColumns: ReadonlyArray<string>, configurable: boolean, showRowActions: boolean): ReadonlyArray<string>;
4849
+ /**
4850
+ * Настройки панели, приведённые к конфигу: ключи закрытых колонок из списка скрытых
4851
+ * вычищаются. Панель их не предлагает, но настройки приезжают и из хранилища — снятые с
4852
+ * той поры, когда колонка закрытой ещё не была.
4853
+ */
4854
+ declare function withoutLockedHidden(config: ReadonlyArray<IRtTable.ColumnConfig>, settings: IRtTable.ColumnSettings): IRtTable.ColumnSettings;
4855
+
4856
+ /**
4857
+ * Поле авто-карточки узкого экрана: подпись колонки и её шаблон ячейки. Значение рисуется
4858
+ * тем же шаблоном, что и в строке таблицы, — второй разметки у карточки нет.
4595
4859
  */
4596
4860
  interface IRtTableCardColumn<TRow> {
4597
4861
  key: string;
4598
4862
  label: string;
4599
4863
  cell: TemplateRef<IRtTableCardContext<TRow>>;
4600
4864
  }
4865
+
4601
4866
  /**
4602
4867
  * Таблица — стилизованная обёртка над `cdk-table` (`@angular/cdk/table`).
4603
4868
  *
@@ -4642,6 +4907,13 @@ declare class RtTableComponent<TRow> extends CdkTable<TRow> {
4642
4907
  */
4643
4908
  private readonly actionsCellDef?;
4644
4909
  private readonly actionsHeaderCellDef?;
4910
+ /**
4911
+ * Роль хоста: у native `<table rt-table>` она есть от самого тега, а элементному
4912
+ * `<rt-table>` её ставим сами. Без неё скрин-ридер читает список строками текста: роли
4913
+ * строк и ячеек CDK проставляет сам, а роли самой таблицы у него нет, и проставленные
4914
+ * остаются висеть вне таблицы. Считается один раз — тег хоста по ходу жизни не меняется.
4915
+ */
4916
+ protected readonly hostRole: 'table' | null;
4645
4917
  /** `true` когда initial-load в полёте и entities ещё нет — рендерим skeleton rows. */
4646
4918
  protected readonly isInitialLoading: Signal<boolean>;
4647
4919
  /** `true` когда загрузка завершена и entities пустые — рендерим empty placeholder. */
@@ -4663,17 +4935,11 @@ declare class RtTableComponent<TRow> extends CdkTable<TRow> {
4663
4935
  /** Карточки показываются только когда card-режим включён (`[cards]`) и экран узкий. */
4664
4936
  protected readonly showCards: Signal<boolean>;
4665
4937
  /**
4666
- * Строки для card-рендера. CdkTable хранит `dataSource` как array | Observable |
4667
- * DataSource — карточки строим только для массива (client-side pattern);
4668
- * для остальных типов пусто (карточки не поддерживаются). `#dataSourceVersion`
4669
- * инвалидирует computed при смене источника.
4938
+ * Строки для карточек узкого экрана. Признак `#dataSourceVersion` пересчитывает список
4939
+ * при смене источника: CDK хранит его полем, а не сигналом.
4670
4940
  */
4671
4941
  protected readonly cardRows: Signal<ReadonlyArray<TRow>>;
4672
- /**
4673
- * Поля авто-карточки: видимые колонки (кроме «…»-действий) с лейблом из
4674
- * `columnsConfig` (fallback — ключ колонки) и cell-шаблоном из `cdkColumnDef`.
4675
- * Колонки без cell-шаблона пропускаются.
4676
- */
4942
+ /** Поля авто-карточки узкого экрана: видимые колонки с подписью и шаблоном ячейки. */
4677
4943
  protected readonly cardColumns: Signal<ReadonlyArray<IRtTableCardColumn<TRow>>>;
4678
4944
  /** ContentChild template для кастом empty-placeholder'а. Опционален; fallback — emptyMessage. */
4679
4945
  readonly emptyTemplate: Signal<TemplateRef<unknown> | undefined>;
@@ -4749,8 +5015,7 @@ declare class RtTableComponent<TRow> extends CdkTable<TRow> {
4749
5015
  readonly canConfigure: Signal<boolean>;
4750
5016
  /** Сколько skeleton-строк рендерить во время initial-load. Default 5. */
4751
5017
  readonly skeletonRows: InputSignalWithTransform<number, NumberInput>;
4752
- /** Текст empty-placeholder'а если `rtTableEmpty` ContentChild template не задан. */
4753
- /** Пусто — берётся переведённая подпись по умолчанию */
5018
+ /** Подпись пустой таблицы; пусто — берётся переведённое умолчание. */
4754
5019
  readonly emptyMessage: InputSignal<string>;
4755
5020
  /** Своя подпись пустой таблицы важнее умолчания */
4756
5021
  readonly emptyText: Signal<string>;
@@ -4758,13 +5023,8 @@ declare class RtTableComponent<TRow> extends CdkTable<TRow> {
4758
5023
  readonly emptyIcon: InputSignal<IRtIcon.Name | null>;
4759
5024
  /** Описание под заголовком дефолтного empty-placeholder'а. Опционально. */
4760
5025
  readonly emptyDescription: InputSignal<string | null>;
4761
- constructor();
4762
5026
  ngOnInit(): void;
4763
5027
  ngOnDestroy(): void;
4764
- /**
4765
- * Применяет новые настройки колонок (из панели настроек): порядок + скрытые.
4766
- * Locked-колонки принудительно остаются видимыми (их ключи вычищаются из hidden).
4767
- */
4768
5028
  /**
4769
5029
  * Переключает порядок по колонке: по возрастанию → по убыванию → без сортировки.
4770
5030
  * Выбранное состояние уходит наружу — выборку делает потребитель.
@@ -4837,7 +5097,7 @@ declare class RtTableSettingsRegistry {
4837
5097
  declare class RtTableSettingsAsideComponent extends RtRouteAsideComponent<never> {
4838
5098
  #private;
4839
5099
  /** Рабочая копия списка колонок (сидится из регистрации, редактируется телом-панелью). */
4840
- protected readonly t: Signal<RtKitLabelMap>;
5100
+ protected readonly t: Signal<TRtKitLabelMap>;
4841
5101
  protected readonly items: WritableSignal<ReadonlyArray<IRtTable.ColumnSettingItem>>;
4842
5102
  constructor();
4843
5103
  protected resolve(): Observable<never | null>;
@@ -4856,7 +5116,7 @@ declare class RtTableSettingsAsideComponent extends RtRouteAsideComponent<never>
4856
5116
  * для «Сохранить»/«Сбросить» и передаёт сюда через `[(items)]`.
4857
5117
  */
4858
5118
  declare class RtTableSettingsPanelComponent {
4859
- protected readonly t: Signal<RtKitLabelMap>;
5119
+ protected readonly t: Signal<TRtKitLabelMap>;
4860
5120
  readonly items: ModelSignal<ReadonlyArray<IRtTable.ColumnSettingItem>>;
4861
5121
  /** Reorder через drag-drop. Locked-строки drag-disabled; индексы — по всему списку. */
4862
5122
  protected onDrop(event: CdkDragDrop<ReadonlyArray<IRtTable.ColumnSettingItem>>): void;
@@ -4940,7 +5200,7 @@ declare class RtTabsControlDirective {
4940
5200
  static ɵdir: i0.ɵɵDirectiveDeclaration<RtTabsControlDirective, "[rtTabsControl]", never, { "side": { "alias": "rtTabsControl"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4941
5201
  }
4942
5202
 
4943
- type IScrollDirection = 'before' | 'after';
5203
+ type TScrollDirection = 'before' | 'after';
4944
5204
  /**
4945
5205
  * Полоса вкладок с проекцией контента. Вкладки декларируются через
4946
5206
  * `<ng-template rtTab="id" label="…">…</ng-template>` (см. {@link RtTabDirective}),
@@ -4996,7 +5256,7 @@ declare class RtTabsComponent {
4996
5256
  /** Навигация по вкладкам с клавиатуры (automatic activation). */
4997
5257
  protected onTabKeydown(event: KeyboardEvent): void;
4998
5258
  /** Старт прокрутки полосы по удержанию ЛКМ на стрелке. */
4999
- protected onRestPointerDown(direction: IScrollDirection, event: MouseEvent): void;
5259
+ protected onRestPointerDown(direction: TScrollDirection, event: MouseEvent): void;
5000
5260
  protected onRestPointerUp(): void;
5001
5261
  protected onTabListScroll(): void;
5002
5262
  static ɵfac: i0.ɵɵFactoryDeclaration<RtTabsComponent, never>;
@@ -5015,7 +5275,7 @@ declare class RtTabsComponent {
5015
5275
  */
5016
5276
  declare class RtTagComponent {
5017
5277
  /** Текст pill — обязательный input. */
5018
- protected readonly t: Signal<RtKitLabelMap>;
5278
+ protected readonly t: Signal<TRtKitLabelMap>;
5019
5279
  readonly value: InputSignal<string>;
5020
5280
  /** Семантическая палитра. По умолчанию `neutral` (нейтральный серый). */
5021
5281
  readonly severity: InputSignal<IRtTag.Severity>;
@@ -5038,7 +5298,7 @@ declare class RtTagComponent {
5038
5298
  static ɵcmp: i0.ɵɵComponentDeclaration<RtTagComponent, "rt-tag", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "severity": { "alias": "severity"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "radius": { "alias": "radius"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconEnd": { "alias": "iconEnd"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
5039
5299
  }
5040
5300
 
5041
- type IRtTextareaResize = 'none' | 'vertical';
5301
+ type TRtTextareaResize = 'none' | 'vertical';
5042
5302
  /**
5043
5303
  * Шеренный textarea common/ui. CVA через общий `RtFormControlBase` —
5044
5304
  * авто-подсветка invalid. Размерные варианты sm/md/lg через host-класс. Resize
@@ -5057,7 +5317,7 @@ declare class RtTextareaComponent extends RtFormControlBase<string> {
5057
5317
  readonly placeholder: InputSignal<string>;
5058
5318
  readonly readonly: InputSignalWithTransform<boolean, BooleanInput>;
5059
5319
  readonly rows: InputSignalWithTransform<number, NumberInput>;
5060
- readonly resize: InputSignal<IRtTextareaResize>;
5320
+ readonly resize: InputSignal<TRtTextareaResize>;
5061
5321
  protected getEmptyValue(): string;
5062
5322
  protected focusAfterClear(): void;
5063
5323
  protected onInput(event: Event): void;
@@ -5172,7 +5432,7 @@ declare class RtThreadListSearchDirective {
5172
5432
  */
5173
5433
  declare class RtThreadListComponent<TRow extends IRtThreadList.Row> implements OnInit {
5174
5434
  #private;
5175
- protected readonly t: Signal<RtKitLabelMap>;
5435
+ protected readonly t: Signal<TRtKitLabelMap>;
5176
5436
  protected readonly searchPlaceholderText: Signal<string>;
5177
5437
  protected readonly emptyTitle: Signal<string>;
5178
5438
  protected readonly skeletonRows: number[];
@@ -5409,7 +5669,7 @@ declare namespace IRtToaster {
5409
5669
 
5410
5670
  declare class RtToastComponent implements AfterViewInit, OnDestroy {
5411
5671
  #private;
5412
- protected readonly t: Signal<RtKitLabelMap>;
5672
+ protected readonly t: Signal<TRtKitLabelMap>;
5413
5673
  protected readonly icon: Signal<IRtIcon.Name>;
5414
5674
  readonly toast: InputSignal<IRtToaster.Toast>;
5415
5675
  readonly index: InputSignal<number>;
@@ -5681,7 +5941,7 @@ declare namespace IRtWelcomeDialog {
5681
5941
  */
5682
5942
  declare class RtWelcomeDialogComponent {
5683
5943
  #private;
5684
- protected readonly t: Signal<RtKitLabelMap>;
5944
+ protected readonly t: Signal<TRtKitLabelMap>;
5685
5945
  protected readonly title: string;
5686
5946
  protected readonly paragraphs: string[];
5687
5947
  /** Своя подпись важнее умолчания: роль знает, куда ведёт кнопка */
@@ -5737,7 +5997,7 @@ declare class RtWorkspaceAsideDirective {
5737
5997
 
5738
5998
  declare class RtWorkspaceComponent implements IRtWorkspace.PanelApi {
5739
5999
  #private;
5740
- protected readonly t: Signal<RtKitLabelMap>;
6000
+ protected readonly t: Signal<TRtKitLabelMap>;
5741
6001
  protected readonly listSlot: Signal<RtWorkspaceListDirective | undefined>;
5742
6002
  protected readonly centerSlot: Signal<RtWorkspaceCenterDirective | undefined>;
5743
6003
  protected readonly asideSlot: Signal<RtWorkspaceAsideDirective | undefined>;
@@ -5848,7 +6108,7 @@ interface ITransitionFormShape {
5848
6108
  }
5849
6109
  declare class RtWorkspaceDetailsComponent {
5850
6110
  #private;
5851
- protected readonly t: Signal<RtKitLabelMap>;
6111
+ protected readonly t: Signal<TRtKitLabelMap>;
5852
6112
  protected readonly editingAgent: WritableSignal<boolean>;
5853
6113
  protected readonly selectedAgentId: WritableSignal<number | null>;
5854
6114
  protected readonly transitionForm: FormGroup<ITransitionFormShape>;
@@ -5940,5 +6200,14 @@ declare class RtInfiniteScrollDirective implements OnDestroy {
5940
6200
  static ɵdir: i0.ɵɵDirectiveDeclaration<RtInfiniteScrollDirective, "[rtInfiniteScroll]", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "rootMargin": { "alias": "rootMargin"; "required": false; "isSignal": true; }; }, { "loadMore": "loadMore"; }, never, never, true, never>;
5941
6201
  }
5942
6202
 
5943
- export { BreakpointsService, CATEGORY_ORDER, ERtCalendarDayState, ERtChatMessageStatus, ERtStorageKeys, IButton, ICON_CATEGORY_RULES, INotification, IRtAsideHeader, IRtAutocomplete, IRtBarList, IRtCalendar, IRtChat, IRtConfirmPopover, IRtDatePicker, IRtField, IRtFileCard, IRtFileDrop, IRtFileInput, IRtFilterControl, IRtIcon, IRtIconButton, IRtInput, IRtLogo, IRtMenu, IRtMessageComposer, IRtNightGrid, IRtPageHeader, IRtPagination, IRtPhotoViewer, IRtPopover, IRtSectionNav, IRtSelect, IRtSpinner, IRtSplitButton, IRtStatTile, IRtStepper, IRtTable, IRtTabs, IRtTag, IRtThemeToggle, IRtThreadList, IRtTimeline, IRtToaster, IRtToggleButtonGroup, IRtToggleSwitch, IRtTooltip, IRtWelcomeDialog, IRtWorkspace, IRtWorkspaceDetails, ITheme, MessageBus, NotificationBus, RT_ASIDE_DATA, RT_COUNTER_DECREASE_KEY, RT_COUNTER_INCREASE_KEY, RT_DIALOG_DATA, RT_FIELD_DEFAULT_ERROR_KEYS, RT_FIELD_EMPTY_VALUE, RT_ICONS_BASE_URL, RT_KIT_LABELS, RT_KIT_LABELS_EN, RT_KIT_LOCALE, RT_KIT_TRANSLATOR, RT_MENU_SELECT_EVENT, RT_TABLE_ROW_ACTIONS_COLUMN, RT_TOASTER_GAP_PX, RtAsideComponent, RtAsideFooterComponent, RtAsideHeaderComponent, RtAsideRef, RtAsideSectionComponent, RtAsideService, RtAutocompleteComponent, RtBarListComponent, RtBottomSheetComponent, RtButtonDirective, RtCalendarComponent, RtCardComponent, RtChatComponent, RtChatStatusLabelPipe, RtCheckboxComponent, RtCollapsibleTextComponent, RtConfirmDirective, RtConfirmPopoverComponent, RtContainerComponent, RtContainerContentDirective, RtContainerContentPanelDirective, RtContainerHeaderDirective, RtContainerLeftSidenavDirective, RtContainerLeftSidenavPanelDirective, RtContainerRightSidenavDirective, RtContainerRightSidenavPanelDirective, RtContainerStateService, RtContainerToolbarCenterDirective, RtContainerToolbarLeftDirective, RtContainerToolbarRightDirective, RtCopyCellComponent, RtCounterComponent, RtCounterRowComponent, RtDatePickerComponent, RtDayStampPipe, RtDeltaViewComponent, RtDetailListComponent, RtDetailRowComponent, RtDialogComponent, RtDialogFooterComponent, RtDialogHeaderComponent, RtDialogRef, RtDialogService, RtDownloadLinkComponent, RtEmptyStateComponent, RtFieldComponent, RtFieldHintDirective, RtFileCardComponent, RtFileDropComponent, RtFileInputComponent, RtFileListComponent, RtFilterControlComponent, RtFormControlBase, RtHeaderComponent, RtIconButtonComponent, RtIconComponent, RtIconRegistry, RtInfiniteScrollDirective, RtInfoItemComponent, RtInputComponent, RtInputNumberComponent, RtLiveBadgeComponent, RtLogoComponent, RtMenuComponent, RtMenuItemComponent, RtMessageComponent, RtMessageComposerComponent, RtMoneyListComponent, RtMoneyRowComponent, RtMultiselectComponent, RtNightGridComponent, RtNoteComponent, RtNotificationsBellComponent, RtPageHeaderComponent, RtPaginationComponent, RtPhotoViewerComponent, RtPopoverDirective, RtRichEditorComponent, RtRouteAsideComponent, RtRowHasActionsPipe, RtSectionNavComponent, RtSelectComponent, RtSkeletonComponent, RtSkeletonWrapperComponent, RtSpinnerComponent, RtSplitButtonComponent, RtStatTileComponent, RtStepperComponent, RtTabDirective, RtTableCardDirective, RtTableComponent, RtTableRowActionsDirective, RtTableRowDirective, RtTableSettingsAsideComponent, RtTableSettingsPanelComponent, RtTableSettingsRegistry, RtTableSortHeaderComponent, RtTabsComponent, RtTabsControlDirective, RtTagComponent, RtTextareaComponent, RtThemeToggleComponent, RtThreadListComponent, RtThreadListFiltersDirective, RtThreadListRowDirective, RtThreadListSearchDirective, RtTimelineComponent, RtToastComponent, RtToasterComponent, RtToggleButtonGroupComponent, RtToggleSwitchComponent, RtToolbarCenterDirective, RtToolbarComponent, RtToolbarLeftDirective, RtToolbarRightDirective, RtTooltipComponent, RtTooltipDirective, RtTruncateMiddlePipe, RtWelcomeDialogComponent, RtWorkspaceAsideDirective, RtWorkspaceCenterDirective, RtWorkspaceComponent, RtWorkspaceDesktopOnlyDirective, RtWorkspaceDetailsComponent, RtWorkspaceListDirective, SEARCH_DEBOUNCE_MS, ThemeService, ariaSortOf, categoryOf, coerceQuillDeltaOutput, deliveryStatus, deriveFileTitle, fileNameFromUrl, formatFileSize, getFileTypeIcon, iconsName, indexFromParam, indexFromScroll, isColumnSortable, nextPhotoIndex, nextSort, normalizeQuillDelta, paramFromIndex, pendingToRtMessage, provideRtIcons, provideRtKitLabels, rowHasAvailableActions, rtAsideUnsavedGuard, rtKitLabel, searchDebounce, shouldRenderPhoto, sortDirectionOf, toRtMessage };
5944
- export type { IIconCategory, IMessageBusEvent, IQuillDelta, IQuillDeltaAttributes, IQuillDeltaOp, IRtAsideConfig, IRtAsideContentLayout, IRtAsideDeactivate, IRtAsidePosition, IRtAsideSize, IRtDialogConfig, IRtDialogSize, IRtMappableMessage, IRtPendingMessage, IRtPicture, IRtPictureSource, IRtRichEditorToolbar, IRtSkeletonRadius, IRtSkeletonShape, IRtSkeletonSize, IRtTableAriaSort, IRtTableCardContext, IRtTableRowActionsContext, IRtTableSettingsRegistration, IRtTextareaResize, IToRtMessageOptions, RtKitLabelKey, RtKitLabelMap, RtKitLabelParams, RtKitTranslator };
6203
+ /** Имя свойства оформления, которое кит объявляет сам. */
6204
+ type TRtDesignTokenName = '--rt-amber-400' | '--rt-border-width-medium' | '--rt-border-width-thick' | '--rt-border-width-thin' | '--rt-bp-lg' | '--rt-bp-md' | '--rt-bp-sm' | '--rt-bp-xl' | '--rt-brand-100' | '--rt-brand-200' | '--rt-brand-300' | '--rt-brand-400' | '--rt-brand-50' | '--rt-brand-500' | '--rt-brand-600' | '--rt-brand-700' | '--rt-brand-800' | '--rt-brand-900' | '--rt-brand-950' | '--rt-btn-tint-active' | '--rt-btn-tint-hover' | '--rt-charcoal-700' | '--rt-charcoal-800' | '--rt-charcoal-900' | '--rt-charcoal-950' | '--rt-charcoal-border' | '--rt-charcoal-border-strong' | '--rt-chat-bubble-date' | '--rt-chat-bubble-in-author' | '--rt-chat-bubble-in-bg' | '--rt-chat-bubble-own-author' | '--rt-chat-bubble-own-bg' | '--rt-chat-status-read' | '--rt-color-action-danger' | '--rt-color-action-danger-active' | '--rt-color-action-danger-hover' | '--rt-color-action-danger-on-surface' | '--rt-color-action-disabled' | '--rt-color-action-info' | '--rt-color-action-info-active' | '--rt-color-action-info-hover' | '--rt-color-action-info-on-surface' | '--rt-color-action-on-danger' | '--rt-color-action-on-disabled' | '--rt-color-action-on-info' | '--rt-color-action-on-primary' | '--rt-color-action-on-secondary' | '--rt-color-action-on-success' | '--rt-color-action-on-warning' | '--rt-color-action-primary' | '--rt-color-action-primary-active' | '--rt-color-action-primary-hover' | '--rt-color-action-primary-on-surface' | '--rt-color-action-primary-soft' | '--rt-color-action-primary-subtle' | '--rt-color-action-secondary' | '--rt-color-action-secondary-active' | '--rt-color-action-secondary-hover' | '--rt-color-action-secondary-on-surface' | '--rt-color-action-success' | '--rt-color-action-success-active' | '--rt-color-action-success-hover' | '--rt-color-action-success-on-surface' | '--rt-color-action-warning' | '--rt-color-action-warning-active' | '--rt-color-action-warning-hover' | '--rt-color-action-warning-on-surface' | '--rt-color-bg-hover' | '--rt-color-bg-inverse' | '--rt-color-bg-nav' | '--rt-color-bg-overlay' | '--rt-color-bg-page' | '--rt-color-bg-page-auth' | '--rt-color-bg-subtle' | '--rt-color-bg-surface' | '--rt-color-bg-surface-auth-card' | '--rt-color-bg-surface-subtle' | '--rt-color-bg-surface-subtle-2' | '--rt-color-border-default' | '--rt-color-border-focus' | '--rt-color-border-strong' | '--rt-color-border-subtle' | '--rt-color-state-danger' | '--rt-color-state-danger-bg' | '--rt-color-state-error-text' | '--rt-color-state-info' | '--rt-color-state-info-bg' | '--rt-color-state-success' | '--rt-color-state-success-bg' | '--rt-color-state-warning' | '--rt-color-state-warning-bg' | '--rt-color-state-warning-text' | '--rt-color-stepper-current' | '--rt-color-stepper-current-subtle' | '--rt-color-stepper-progress' | '--rt-color-stepper-track' | '--rt-color-text-disabled' | '--rt-color-text-inverse' | '--rt-color-text-link' | '--rt-color-text-link-hover' | '--rt-color-text-muted' | '--rt-color-text-primary' | '--rt-control-height-2xl' | '--rt-control-height-lg' | '--rt-control-height-md' | '--rt-control-height-sm' | '--rt-control-height-xl' | '--rt-control-max-width' | '--rt-control-panel-max-height' | '--rt-control-textarea-min-height-lg' | '--rt-control-textarea-min-height-md' | '--rt-control-textarea-min-height-sm' | '--rt-counter-gap' | '--rt-counter-row-color-border' | '--rt-counter-row-gap' | '--rt-counter-row-hint-color' | '--rt-counter-row-hint-font-size' | '--rt-counter-row-label-color' | '--rt-counter-row-label-font-size' | '--rt-counter-row-padding-y' | '--rt-counter-value-color' | '--rt-counter-value-font-size' | '--rt-counter-value-min-width' | '--rt-danger-50' | '--rt-danger-500' | '--rt-danger-600' | '--rt-danger-700' | '--rt-duration-base' | '--rt-duration-fast' | '--rt-duration-slow' | '--rt-duration-slower' | '--rt-field-error-color' | '--rt-field-error-font-size' | '--rt-field-gap' | '--rt-field-hint-color' | '--rt-field-hint-font-size' | '--rt-field-label-color' | '--rt-field-label-font-size' | '--rt-field-label-font-weight' | '--rt-field-label-help-gap' | '--rt-field-required-color' | '--rt-field-value-color' | '--rt-field-value-empty-color' | '--rt-field-value-font-size' | '--rt-focus-ring-color' | '--rt-focus-ring-color-danger' | '--rt-focus-ring-offset' | '--rt-focus-ring-width' | '--rt-font-family-mono' | '--rt-font-family-sans' | '--rt-font-weight-bold' | '--rt-font-weight-medium' | '--rt-font-weight-regular' | '--rt-font-weight-semibold' | '--rt-gray-350' | '--rt-icon-button-color-bg-hover' | '--rt-info-50' | '--rt-info-500' | '--rt-info-600' | '--rt-info-700' | '--rt-input-border-width' | '--rt-input-color-bg' | '--rt-input-color-bg-disabled' | '--rt-input-color-bg-hover' | '--rt-input-color-border' | '--rt-input-color-border-error' | '--rt-input-color-border-focus' | '--rt-input-color-text' | '--rt-input-color-text-placeholder' | '--rt-input-disabled-opacity' | '--rt-input-focus-outline-offset' | '--rt-input-focus-shadow' | '--rt-input-focus-shadow-error' | '--rt-input-font-size' | '--rt-input-height' | '--rt-input-height-lg' | '--rt-input-height-md' | '--rt-input-height-sm' | '--rt-input-line-height' | '--rt-input-max-width' | '--rt-input-padding-x' | '--rt-input-padding-y' | '--rt-input-panel-max-height' | '--rt-input-radius' | '--rt-input-transition' | '--rt-leading-none' | '--rt-leading-normal' | '--rt-leading-relaxed' | '--rt-leading-snug' | '--rt-leading-tight' | '--rt-letter-spacing-wide' | '--rt-nav-caret-size' | '--rt-nav-color-disabled' | '--rt-nav-color-focus' | '--rt-nav-header-color-bg' | '--rt-nav-header-padding' | '--rt-nav-item-color' | '--rt-nav-item-color-bg' | '--rt-nav-item-color-bg-active' | '--rt-nav-item-color-border' | '--rt-nav-item-color-caret' | '--rt-nav-item-color-hover' | '--rt-nav-item-color-pressed' | '--rt-nav-item-content-gap' | '--rt-nav-item-font-size' | '--rt-nav-item-font-weight' | '--rt-nav-item-gap' | '--rt-nav-item-height' | '--rt-nav-item-line-height' | '--rt-nav-item-padding' | '--rt-nav-marker-color' | '--rt-nav-marker-size' | '--rt-nav-panel-color-bg' | '--rt-nav-panel-color-border' | '--rt-nav-panel-column-gap' | '--rt-nav-panel-column-width' | '--rt-nav-panel-columns' | '--rt-nav-panel-group-color' | '--rt-nav-panel-group-content-gap' | '--rt-nav-panel-group-font-size' | '--rt-nav-panel-group-font-weight' | '--rt-nav-panel-group-gap' | '--rt-nav-panel-item-color' | '--rt-nav-panel-item-color-active' | '--rt-nav-panel-item-color-bg-active' | '--rt-nav-panel-item-color-bg-hover' | '--rt-nav-panel-item-content-gap' | '--rt-nav-panel-item-font-size' | '--rt-nav-panel-item-font-weight' | '--rt-nav-panel-item-gap' | '--rt-nav-panel-item-height' | '--rt-nav-panel-item-padding' | '--rt-nav-panel-padding' | '--rt-nav-panel-padding-y' | '--rt-nav-panel-shadow' | '--rt-navy-600' | '--rt-navy-900' | '--rt-neutral-0' | '--rt-neutral-100' | '--rt-neutral-200' | '--rt-neutral-300' | '--rt-neutral-400' | '--rt-neutral-50' | '--rt-neutral-500' | '--rt-neutral-600' | '--rt-neutral-700' | '--rt-neutral-800' | '--rt-neutral-900' | '--rt-neutral-950' | '--rt-opacity-disabled' | '--rt-overlay-amber-16' | '--rt-overlay-black-4' | '--rt-overlay-black-50' | '--rt-overlay-black-8' | '--rt-overlay-brand-24' | '--rt-overlay-brand-8' | '--rt-overlay-danger-16' | '--rt-overlay-navy-70' | '--rt-overlay-white-25' | '--rt-overlay-white-4' | '--rt-overlay-white-40' | '--rt-overlay-white-50' | '--rt-overlay-white-8' | '--rt-profile-avatar-font-size' | '--rt-profile-avatar-size' | '--rt-profile-item-content-gap' | '--rt-profile-item-font-size' | '--rt-profile-item-font-weight' | '--rt-profile-item-padding-y' | '--rt-profile-item-radius' | '--rt-profile-menu-min-width' | '--rt-profile-menu-padding' | '--rt-profile-menu-shadow' | '--rt-profile-row-inset' | '--rt-profile-theme-icon-padding' | '--rt-radius-2xl' | '--rt-radius-full' | '--rt-radius-lg' | '--rt-radius-md' | '--rt-radius-ms' | '--rt-radius-none' | '--rt-radius-sm' | '--rt-radius-xl' | '--rt-radius-xs' | '--rt-shadow-card' | '--rt-shadow-card-soft' | '--rt-shadow-dialog' | '--rt-shadow-focus-ring' | '--rt-shadow-focus-ring-danger' | '--rt-shadow-lg' | '--rt-shadow-md' | '--rt-shadow-nav-panel' | '--rt-shadow-none' | '--rt-shadow-profile-menu' | '--rt-shadow-sm' | '--rt-shadow-status-dot' | '--rt-shadow-step-indicator' | '--rt-shadow-xl' | '--rt-size-1' | '--rt-size-10' | '--rt-size-100' | '--rt-size-12' | '--rt-size-16' | '--rt-size-2' | '--rt-size-20' | '--rt-size-24' | '--rt-size-3' | '--rt-size-30' | '--rt-size-4' | '--rt-size-40' | '--rt-size-5' | '--rt-size-6' | '--rt-size-60' | '--rt-size-64' | '--rt-size-8' | '--rt-slate-300' | '--rt-space-0' | '--rt-space-0-5' | '--rt-space-1' | '--rt-space-10' | '--rt-space-12' | '--rt-space-16' | '--rt-space-2' | '--rt-space-20' | '--rt-space-24' | '--rt-space-2xl' | '--rt-space-2xs' | '--rt-space-3xl' | '--rt-space-4' | '--rt-space-5' | '--rt-space-6' | '--rt-space-8' | '--rt-space-lg' | '--rt-space-md' | '--rt-space-sm' | '--rt-space-xl' | '--rt-space-xs' | '--rt-success-100' | '--rt-success-50' | '--rt-success-500' | '--rt-success-600' | '--rt-success-700' | '--rt-text-2xl' | '--rt-text-2xs' | '--rt-text-3xl' | '--rt-text-3xs' | '--rt-text-4xl' | '--rt-text-base' | '--rt-text-lg' | '--rt-text-md' | '--rt-text-sm' | '--rt-text-xl' | '--rt-text-xs' | '--rt-textarea-line-height' | '--rt-textarea-min-height' | '--rt-textarea-min-height-lg' | '--rt-textarea-min-height-md' | '--rt-textarea-min-height-sm' | '--rt-textarea-padding-y' | '--rt-toggle-color-border' | '--rt-toggle-color-icon' | '--rt-toggle-color-thumb' | '--rt-toggle-color-track' | '--rt-toggle-color-track-on' | '--rt-toggle-shadow-border' | '--rt-toggle-shadow-thumb' | '--rt-warning-50' | '--rt-warning-500' | '--rt-warning-600' | '--rt-warning-700' | '--rt-yellow-400' | '--rt-z-base' | '--rt-z-dropdown' | '--rt-z-fixed' | '--rt-z-modal' | '--rt-z-modal-backdrop' | '--rt-z-popover' | '--rt-z-sticky' | '--rt-z-tooltip';
6205
+ /** Имя ручки потребителя — свойства, которое кит намеренно не объявляет. */
6206
+ type TRtConsumerHandleName = '--rt-aside-width' | '--rt-dialog-width' | '--rt-header-content-max-width' | '--rt-header-height' | '--rt-logo-tagline' | '--rt-logo-tagline-dark' | '--rt-logo-wordmark' | '--rt-logo-wordmark-dark' | '--rt-page-header-bg' | '--rt-workspace-aside-size' | '--rt-workspace-list-size';
6207
+ /** Все свойства оформления, объявленные китом. */
6208
+ declare const RT_DESIGN_TOKEN_NAMES: readonly TRtDesignTokenName[];
6209
+ /** Все ручки потребителя: значение приходит от приложения, до него работает запасное. */
6210
+ declare const RT_CONSUMER_HANDLE_NAMES: readonly TRtConsumerHandleName[];
6211
+
6212
+ export { BreakpointsService, CATEGORY_ORDER, ERtCalendarDayState, ERtChatMessageStatus, ERtMarkdownBlock, ERtMarkdownInline, ERtStorageKeys, IButton, ICON_CATEGORY_RULES, INotification, IRtAsideHeader, IRtAutocomplete, IRtBarList, IRtCalendar, IRtChat, IRtConfirmPopover, IRtDatePicker, IRtField, IRtFileCard, IRtFileDrop, IRtFileInput, IRtFilterControl, IRtIcon, IRtIconButton, IRtInput, IRtLogo, IRtMenu, IRtMessageComposer, IRtNightGrid, IRtPageHeader, IRtPagination, IRtPhotoViewer, IRtPopover, IRtSectionNav, IRtSelect, IRtSpinner, IRtSplitButton, IRtStatTile, IRtStepper, IRtTable, IRtTabs, IRtTag, IRtThemeToggle, IRtThreadList, IRtTimeline, IRtToaster, IRtToggleButtonGroup, IRtToggleSwitch, IRtTooltip, IRtWelcomeDialog, IRtWorkspace, IRtWorkspaceDetails, ITheme, MessageBus, NotificationBus, RT_ASIDE_DATA, RT_CONSUMER_HANDLE_NAMES, RT_COUNTER_DECREASE_KEY, RT_COUNTER_INCREASE_KEY, RT_DESIGN_TOKEN_NAMES, RT_DIALOG_DATA, RT_FIELD_DEFAULT_ERROR_KEYS, RT_FIELD_EMPTY_VALUE, RT_ICONS_BASE_URL, RT_ICON_SPRITE_ID, RT_ICON_SYMBOL_ID_PREFIX, RT_KIT_LABELS, RT_KIT_LABELS_EN, RT_KIT_LOCALE, RT_KIT_TRANSLATOR, RT_MENU_SELECT_EVENT, RT_TABLE_ROW_ACTIONS_COLUMN, RT_TOASTER_GAP_PX, RtAsideComponent, RtAsideFooterComponent, RtAsideHeaderComponent, RtAsideRef, RtAsideSectionComponent, RtAsideService, RtAutocompleteComponent, RtBarListComponent, RtBottomSheetComponent, RtButtonDirective, RtCalendarComponent, RtCardComponent, RtChatComponent, RtChatMessageActionsDirective, RtChatMessageHasActionsPipe, RtChatStatusLabelPipe, RtCheckboxComponent, RtCollapsibleTextComponent, RtConfirmDirective, RtConfirmPopoverComponent, RtContainerComponent, RtContainerContentDirective, RtContainerContentPanelDirective, RtContainerHeaderDirective, RtContainerLeftSidenavDirective, RtContainerLeftSidenavPanelDirective, RtContainerRightSidenavDirective, RtContainerRightSidenavPanelDirective, RtContainerStateService, RtContainerToolbarCenterDirective, RtContainerToolbarLeftDirective, RtContainerToolbarRightDirective, RtCopyCellComponent, RtCounterComponent, RtCounterRowComponent, RtDatePickerComponent, RtDayStampPipe, RtDeltaViewComponent, RtDetailListComponent, RtDetailRowComponent, RtDialogComponent, RtDialogFooterComponent, RtDialogHeaderComponent, RtDialogRef, RtDialogService, RtDownloadLinkComponent, RtEmptyStateComponent, RtFieldComponent, RtFieldHintDirective, RtFileCardComponent, RtFileDropComponent, RtFileInputComponent, RtFileListComponent, RtFilterControlComponent, RtFormControlBase, RtHeaderComponent, RtIconButtonComponent, RtIconComponent, RtIconRegistry, RtInfiniteScrollDirective, RtInfoItemComponent, RtInputComponent, RtInputNumberComponent, RtKitLabelPipe, RtLiveBadgeComponent, RtLogoComponent, RtMarkdownTextComponent, RtMenuComponent, RtMenuItemComponent, RtMessageComponent, RtMessageComposerComponent, RtMoneyListComponent, RtMoneyRowComponent, RtMultiselectComponent, RtNightGridComponent, RtNoteComponent, RtNotificationsBellComponent, RtPageHeaderComponent, RtPaginationComponent, RtPhotoViewerComponent, RtPopoverDirective, RtRichEditorComponent, RtRouteAsideComponent, RtRowHasActionsPipe, RtSectionNavComponent, RtSelectComponent, RtSkeletonComponent, RtSkeletonWrapperComponent, RtSpinnerComponent, RtSplitButtonComponent, RtStatTileComponent, RtStepperComponent, RtTabDirective, RtTableCardDirective, RtTableComponent, RtTableRowActionsDirective, RtTableRowDirective, RtTableSettingsAsideComponent, RtTableSettingsPanelComponent, RtTableSettingsRegistry, RtTableSortHeaderComponent, RtTabsComponent, RtTabsControlDirective, RtTagComponent, RtTextareaComponent, RtThemeToggleComponent, RtThreadListComponent, RtThreadListFiltersDirective, RtThreadListRowDirective, RtThreadListSearchDirective, RtTimelineComponent, RtToastComponent, RtToasterComponent, RtToggleButtonGroupComponent, RtToggleSwitchComponent, RtToolbarCenterDirective, RtToolbarComponent, RtToolbarLeftDirective, RtToolbarRightDirective, RtTooltipComponent, RtTooltipDirective, RtTruncateMiddlePipe, RtWelcomeDialogComponent, RtWorkspaceAsideDirective, RtWorkspaceCenterDirective, RtWorkspaceComponent, RtWorkspaceDesktopOnlyDirective, RtWorkspaceDetailsComponent, RtWorkspaceListDirective, SEARCH_DEBOUNCE_MS, ThemeService, ariaSortOf, breakNode, categoryOf, coerceQuillDeltaOutput, defaultColumnItems, deliveryStatus, deriveFileTitle, displayedColumnKeys, fileNameFromUrl, formatFileSize, getFileTypeIcon, iconsName, indexFromParam, indexFromScroll, isColumnSortable, messageHasAvailableActions, nextPhotoIndex, nextSort, normalizeQuillDelta, paramFromIndex, parseInline, parseMarkdown, pendingToRtMessage, provideRtIcons, provideRtKitLabels, resolveColumns, rowHasAvailableActions, rtAsideUnsavedGuard, rtKitLabel, searchDebounce, shouldRenderPhoto, sortDirectionOf, toRtMessage, withoutLockedHidden };
6213
+ export type { IMessageBusEvent, IQuillDelta, IQuillDeltaAttributes, IQuillDeltaOp, IRtAsideConfig, IRtChatMessageActionsContext, IRtDialogConfig, IRtMappableMessage, IRtMarkdownBlockNode, IRtMarkdownInlineNode, IRtMarkdownListItem, IRtPendingMessage, IRtPicture, IRtPictureSource, IRtTableCardContext, IRtTableRowActionsContext, IRtTableSettingsRegistration, IToRtMessageOptions, TIconCategory, TRtAsideContentLayout, TRtAsidePosition, TRtAsideSize, TRtConsumerHandleName, TRtDesignTokenName, TRtDialogSize, TRtKitLabelKey, TRtKitLabelMap, TRtKitLabelParams, TRtKitTranslator, TRtRichEditorToolbar, TRtSkeletonRadius, TRtSkeletonShape, TRtSkeletonSize, TRtTableAriaSort, TRtTextareaResize };