@rt-tools/ui-kit-v2 0.18.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +3 -2
  2. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs +1 -1
  3. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs.map +1 -1
  4. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +14 -8
  5. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -1
  6. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +97 -0
  7. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -0
  8. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +10 -3
  9. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
  10. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +1 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
  12. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +1 -1
  13. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -1
  14. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +1 -1
  15. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
  16. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +81 -0
  17. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -0
  18. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +99 -1
  19. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  20. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +5 -5
  21. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
  22. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +16 -4
  23. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
  24. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +1 -1
  25. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -1
  26. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +124 -25
  27. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
  28. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +3 -3
  29. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -1
  30. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +1 -1
  31. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
  32. package/fesm2022/rt-tools-ui-kit-v2-field.mjs +1 -1
  33. package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
  34. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +1 -1
  35. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
  36. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +1 -1
  37. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
  38. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +64 -27
  39. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -1
  40. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +1 -1
  41. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
  42. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +1 -1
  43. package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
  44. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1 -1
  45. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
  46. package/fesm2022/rt-tools-ui-kit-v2-message.mjs +1 -1
  47. package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -1
  48. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +1 -1
  49. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
  50. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +1 -1
  51. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -1
  52. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +1 -1
  53. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
  54. package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs +46 -0
  55. package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs.map +1 -0
  56. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +336 -12
  57. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  58. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +1 -1
  59. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
  60. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +1 -1
  61. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -1
  62. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +16 -2
  63. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
  64. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +3 -3
  65. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
  66. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +1 -1
  67. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -1
  68. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +2 -2
  69. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
  70. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +1 -1
  71. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
  72. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +1 -1
  73. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
  74. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +31 -5
  75. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
  76. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +1 -1
  77. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
  78. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +1 -1
  79. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
  80. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +1 -1
  81. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -1
  82. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +2 -2
  83. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
  84. package/fesm2022/rt-tools-ui-kit-v2.mjs +3 -0
  85. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  86. package/package.json +13 -1
  87. package/rt-tools-ui-kit-v2-0.19.1.tgz +0 -0
  88. package/src/assets/icons/sparkle.svg +9 -0
  89. package/src/assets/icons/thumb-down.svg +10 -0
  90. package/src/assets/icons/thumb-up.svg +9 -0
  91. package/src/assets/icons/trash-x.svg +7 -0
  92. package/src/assets/icons-material/sparkle.fill.svg +5 -0
  93. package/src/assets/icons-material/sparkle.svg +5 -0
  94. package/src/assets/icons-material/thumb-down.fill.svg +5 -0
  95. package/src/assets/icons-material/thumb-down.svg +5 -0
  96. package/src/assets/icons-material/thumb-up.fill.svg +5 -0
  97. package/src/assets/icons-material/thumb-up.svg +5 -0
  98. package/src/assets/icons-material/trash-x.fill.svg +5 -0
  99. package/src/assets/icons-material/trash-x.svg +5 -0
  100. package/src/lib/components/action-bar/CONTEXT.md +8 -2
  101. package/src/lib/components/action-bar/rt-action-bar-holder.component.scss +10 -7
  102. package/src/lib/components/action-bar/rt-action-bar.component.scss +82 -34
  103. package/src/lib/components/ai-run-status/CONTEXT.md +41 -0
  104. package/src/lib/components/ai-run-status/rt-ai-run-status.component.scss +158 -0
  105. package/src/lib/components/aside/CONTEXT.md +1 -0
  106. package/src/lib/components/aside/header/rt-aside-header.component.scss +27 -11
  107. package/src/lib/components/copy-value/CONTEXT.md +31 -0
  108. package/src/lib/components/copy-value/rt-copy-value.component.scss +39 -0
  109. package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +5 -5
  110. package/src/lib/components/data-table/CONTEXT.md +5 -0
  111. package/src/lib/components/dynamic-selector/CONTEXT.md +18 -0
  112. package/src/lib/components/dynamic-selector/list/rt-dynamic-selector-list.component.scss +29 -1
  113. package/src/lib/components/dynamic-selector/popup/rt-dynamic-selector-popup.component.scss +84 -25
  114. package/src/lib/components/empty-state/CONTEXT.md +2 -1
  115. package/src/lib/components/empty-state/rt-empty-state.component.scss +4 -2
  116. package/src/lib/components/icon/CONTEXT.md +16 -12
  117. package/src/lib/components/icon/rt-icon.component.scss +13 -3
  118. package/src/lib/components/prompt-suggestion/CONTEXT.md +29 -0
  119. package/src/lib/components/prompt-suggestion/rt-prompt-suggestion.component.scss +58 -0
  120. package/src/lib/components/select/CONTEXT.md +2 -2
  121. package/src/lib/components/thread-list/CONTEXT.md +4 -0
  122. package/src/lib/components/thread-list/rt-thread-list.component.scss +29 -0
  123. package/src/lib/components/toolbar/CONTEXT.md +4 -0
  124. package/src/lib/components/toolbar/rt-toolbar.component.scss +7 -0
  125. package/src/rich-editor/lib/components/ai-chat/CONTEXT.md +58 -0
  126. package/src/rich-editor/lib/components/ai-chat/answer/rt-ai-chat-answer.component.scss +12 -0
  127. package/src/rich-editor/lib/components/ai-chat/rt-ai-chat.component.scss +222 -0
  128. package/src/rich-editor/lib/components/rich-editor/rt-rich-editor.component.scss +3 -0
  129. package/src/styles/_scrollbar.scss +9 -0
  130. package/styles/tokens.css +3 -0
  131. package/types/rt-tools-ui-kit-v2-action-bar.d.ts +11 -2
  132. package/types/rt-tools-ui-kit-v2-ai-run-status.d.ts +49 -0
  133. package/types/rt-tools-ui-kit-v2-aside.d.ts +9 -1
  134. package/types/rt-tools-ui-kit-v2-copy-value.d.ts +29 -0
  135. package/types/rt-tools-ui-kit-v2-core.d.ts +94 -54
  136. package/types/rt-tools-ui-kit-v2-data-table.d.ts +7 -0
  137. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +44 -5
  138. package/types/rt-tools-ui-kit-v2-icon.d.ts +12 -4
  139. package/types/rt-tools-ui-kit-v2-prompt-suggestion.d.ts +21 -0
  140. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +186 -2
  141. package/types/rt-tools-ui-kit-v2-select.d.ts +6 -0
  142. package/types/rt-tools-ui-kit-v2-thread-list.d.ts +15 -2
  143. package/types/rt-tools-ui-kit-v2.d.ts +3 -0
  144. package/rt-tools-ui-kit-v2-0.18.0.tgz +0 -0
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { AfterViewInit, OnDestroy, Signal, ElementRef, WritableSignal, InputSignal, OutputEmitterRef, InputSignalWithTransform, ModelSignal, TemplateRef, PipeTransform } from '@angular/core';
3
- import { RtFormControlBase, IQuillDelta, TRtKitLabelMap } from '@rt-tools/ui-kit-v2';
3
+ import { RtFormControlBase, IQuillDelta, TRtKitLabelMap, IRtAiRunStatus, IRtTimeline, IRtThreadList, IRtSideMenu } from '@rt-tools/ui-kit-v2';
4
4
  import { BooleanInput, NumberInput } from '@angular/cdk/coercion';
5
5
  import { FormGroup, FormControl } from '@angular/forms';
6
6
 
@@ -540,6 +540,190 @@ interface IToRtMessageOptions<TMessage extends IRtMappableMessage> {
540
540
  */
541
541
  declare function toRtMessage<TMessage extends IRtMappableMessage>(message: TMessage, options: IToRtMessageOptions<TMessage>): IRtChat.Message;
542
542
 
543
+ declare namespace IRtAiChat {
544
+ /** Кто написал сообщение. */
545
+ type Role = 'user' | 'assistant';
546
+ /** Оценка ответа человеком; `null` — не оценён. */
547
+ type Feedback = 'liked' | 'disliked' | null;
548
+ /** Ход работы над ответом: строка `rt-ai-run-status` над текстом ответа. */
549
+ interface Run {
550
+ readonly state: IRtAiRunStatus.State;
551
+ readonly label: string;
552
+ readonly meta?: string;
553
+ readonly steps?: readonly IRtTimeline.Step[];
554
+ }
555
+ interface Message {
556
+ readonly id: string;
557
+ readonly role: Role;
558
+ /** Текст сообщения; у ответа — markdown. Пустой ответ рисует только ход работы. */
559
+ readonly text: string;
560
+ /** Время под пузырём вопроса; пусто — не рисуется. */
561
+ readonly time?: string;
562
+ /** Ход работы над этим ответом. */
563
+ readonly run?: Run;
564
+ /** Ответ ещё пишется: оценка не рисуется. */
565
+ readonly streaming?: boolean;
566
+ readonly feedback?: Feedback;
567
+ }
568
+ /** Ответ оборвался: текст ошибки, номер обращения и можно ли спросить снова. */
569
+ interface RunError {
570
+ readonly message: string;
571
+ readonly referenceId?: string;
572
+ readonly retryable?: boolean;
573
+ }
574
+ /** Беседа в списке бесед. */
575
+ interface Thread {
576
+ readonly id: string;
577
+ readonly title: string;
578
+ /** Время последнего сообщения, готовой строкой. */
579
+ readonly time?: string;
580
+ /** Непрочитанных ответов; больше нуля — строка помечена и показывает число. */
581
+ readonly unreadCount?: number;
582
+ }
583
+ /** Оценка ответа: какое сообщение и какая оценка. */
584
+ interface FeedbackChange {
585
+ readonly messageId: string;
586
+ readonly feedback: Feedback;
587
+ }
588
+ /** Контекст шаблона вложений ответа. */
589
+ interface ExtraContext {
590
+ readonly $implicit: Message;
591
+ }
592
+ }
593
+
594
+ /**
595
+ * Вложения ответа ассистента: то, что рисует приложение под текстом ответа — график, таблица,
596
+ * карточка. Шаблон получает сообщение.
597
+ */
598
+ declare class RtAiChatMessageExtraDirective {
599
+ readonly templateRef: TemplateRef<IRtAiChat.ExtraContext>;
600
+ static ngTemplateContextGuard(_directive: RtAiChatMessageExtraDirective, context: unknown): context is IRtAiChat.ExtraContext;
601
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtAiChatMessageExtraDirective, never>;
602
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RtAiChatMessageExtraDirective, "ng-template[rtAiChatMessageExtra]", never, {}, {}, never, never, true, never>;
603
+ }
604
+
605
+ /** Строка беседы для списка бесед: `rt-thread-list` ждёт `id` и `hasUnread`. */
606
+ interface IThreadRow extends IRtThreadList.Row {
607
+ readonly id: string;
608
+ readonly hasUnread: boolean;
609
+ readonly title: string;
610
+ readonly titleParts: readonly IRtSideMenu.TitlePart[];
611
+ readonly time: string;
612
+ readonly unreadCount: number;
613
+ }
614
+ /**
615
+ * Панель ИИ-ассистента одним компонентом: шапка с действиями, лента вопросов и ответов с ходом
616
+ * работы, пустой экран с подсказками, ошибка с номером обращения, поле сообщения и подпись под
617
+ * ним; по кнопке «Conversations» — список бесед.
618
+ *
619
+ * Компонент презентационный: сообщения, ход работы, беседы и ошибка приходят входами, действия
620
+ * уходят выходами. Вложения ответа — графики и прочее — приложение отдаёт шаблоном
621
+ * `rtAiChatMessageExtra`.
622
+ */
623
+ declare class RtAiChatComponent {
624
+ #private;
625
+ protected readonly composer: Signal<RtMessageComposerComponent | undefined>;
626
+ protected readonly backButton: Signal<ElementRef<HTMLElement> | undefined>;
627
+ protected readonly feed: Signal<ElementRef<HTMLElement> | undefined>;
628
+ protected readonly t: Signal<TRtKitLabelMap>;
629
+ protected readonly extraTemplate: Signal<RtAiChatMessageExtraDirective | undefined>;
630
+ /** Ответы, у которых человек раскрыл шаги. */
631
+ protected readonly openRuns: WritableSignal<ReadonlySet<string>>;
632
+ protected readonly titleText: Signal<string>;
633
+ protected readonly emptyTitleText: Signal<string>;
634
+ protected readonly emptyDescriptionText: Signal<string>;
635
+ protected readonly disclaimerText: Signal<string>;
636
+ protected readonly hasThreads: Signal<boolean>;
637
+ /** Список бесед стоит колонкой слева: на весь экран, когда беседы есть. */
638
+ protected readonly isThreadColumn: Signal<boolean>;
639
+ /** Список бесед стоит на месте ленты: в узкой панели по кнопке «Conversations». */
640
+ protected readonly isThreadPage: Signal<boolean>;
641
+ protected readonly isEmpty: Signal<boolean>;
642
+ /** Строка поиска по беседам: подсвечивает совпадения и меняет подпись пустого списка. */
643
+ protected readonly threadQuery: WritableSignal<string>;
644
+ protected readonly threadRows: Signal<readonly IThreadRow[]>;
645
+ /** Пустой список: без поиска — «бесед нет», с поиском — подпись списка «ничего не найдено». */
646
+ protected readonly threadsEmptyText: Signal<string>;
647
+ /** Заголовок беседы над лентой; пусто — строки нет. */
648
+ readonly title: InputSignal<string>;
649
+ /** Вторая строка шапки — обычно название беседы. Пусто — не рисуется. */
650
+ readonly subtitle: InputSignal<string>;
651
+ readonly messages: InputSignal<readonly IRtAiChat.Message[]>;
652
+ /** Готовые вопросы пустого экрана. */
653
+ readonly suggestions: InputSignal<readonly string[]>;
654
+ readonly emptyTitle: InputSignal<string>;
655
+ readonly emptyDescription: InputSignal<string>;
656
+ /** Подсказка в поле сообщения; пусто — подпись поля кита. */
657
+ readonly placeholder: InputSignal<string>;
658
+ /** Подпись под полем сообщения; `null` — подпись кита, пустая строка — без подписи. */
659
+ readonly disclaimer: InputSignal<string | null>;
660
+ /** Ответ пишется: поле сообщения в режиме остановки, подсказки и новая беседа выключены. */
661
+ readonly sending: InputSignalWithTransform<boolean, BooleanInput>;
662
+ /** Беседа загружается: крутилка, пока сообщений нет. */
663
+ readonly loading: InputSignalWithTransform<boolean, BooleanInput>;
664
+ readonly error: InputSignal<IRtAiChat.RunError | null>;
665
+ /** Беседы; `null` — кнопки «Conversations» нет. */
666
+ readonly threads: InputSignal<readonly IRtAiChat.Thread[] | null>;
667
+ readonly activeThreadId: InputSignal<string | null>;
668
+ readonly threadsLoading: InputSignalWithTransform<boolean, BooleanInput>;
669
+ readonly threadsFetching: InputSignalWithTransform<boolean, BooleanInput>;
670
+ readonly threadsHasMore: InputSignalWithTransform<boolean, BooleanInput>;
671
+ /** Кнопка «Full screen» в шапке. */
672
+ readonly fullScreenable: InputSignalWithTransform<boolean, BooleanInput>;
673
+ /** Кнопка закрытия в шапке. */
674
+ readonly closable: InputSignalWithTransform<boolean, BooleanInput>;
675
+ /** Черновик в поле сообщения. */
676
+ readonly draft: ModelSignal<string>;
677
+ /** Список бесед открыт на месте ленты. */
678
+ readonly threadsOpen: ModelSignal<boolean>;
679
+ readonly fullScreen: ModelSignal<boolean>;
680
+ /** Вопрос ушёл: набранный или выбранная подсказка. */
681
+ readonly send: OutputEmitterRef<string>;
682
+ readonly stop: OutputEmitterRef<void>;
683
+ readonly retry: OutputEmitterRef<void>;
684
+ readonly newThread: OutputEmitterRef<void>;
685
+ readonly closed: OutputEmitterRef<void>;
686
+ readonly selectThread: OutputEmitterRef<string>;
687
+ readonly deleteThread: OutputEmitterRef<string>;
688
+ readonly searchThreads: OutputEmitterRef<string>;
689
+ readonly loadMoreThreads: OutputEmitterRef<void>;
690
+ readonly feedbackChange: OutputEmitterRef<IRtAiChat.FeedbackChange>;
691
+ constructor();
692
+ /** Фокус в поле сообщения после отрисовки: приложению — после своих действий вне панели. */
693
+ focusComposer(): void;
694
+ protected onFeedScroll(): void;
695
+ protected onSubmitted(value: IRtMessageComposer.SubmitPayload): void;
696
+ protected onSuggestion(text: string): void;
697
+ protected onToggleRun(messageId: string, open: boolean): void;
698
+ protected onFeedback(message: IRtAiChat.Message, feedback: Exclude<IRtAiChat.Feedback, null>): void;
699
+ protected onToggleThreads(): void;
700
+ protected onNewThread(): void;
701
+ protected onStop(): void;
702
+ protected onToggleFullScreen(): void;
703
+ protected onSearchThreads(query: string): void;
704
+ protected onSelectThread(id: IRtThreadList.TRowId): void;
705
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtAiChatComponent, never>;
706
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtAiChatComponent, "rt-ai-chat", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "messages": { "alias": "messages"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "emptyTitle": { "alias": "emptyTitle"; "required": false; "isSignal": true; }; "emptyDescription": { "alias": "emptyDescription"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disclaimer": { "alias": "disclaimer"; "required": false; "isSignal": true; }; "sending": { "alias": "sending"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "threads": { "alias": "threads"; "required": false; "isSignal": true; }; "activeThreadId": { "alias": "activeThreadId"; "required": false; "isSignal": true; }; "threadsLoading": { "alias": "threadsLoading"; "required": false; "isSignal": true; }; "threadsFetching": { "alias": "threadsFetching"; "required": false; "isSignal": true; }; "threadsHasMore": { "alias": "threadsHasMore"; "required": false; "isSignal": true; }; "fullScreenable": { "alias": "fullScreenable"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "draft": { "alias": "draft"; "required": false; "isSignal": true; }; "threadsOpen": { "alias": "threadsOpen"; "required": false; "isSignal": true; }; "fullScreen": { "alias": "fullScreen"; "required": false; "isSignal": true; }; }, { "draft": "draftChange"; "threadsOpen": "threadsOpenChange"; "fullScreen": "fullScreenChange"; "send": "send"; "stop": "stop"; "retry": "retry"; "newThread": "newThread"; "closed": "closed"; "selectThread": "selectThread"; "deleteThread": "deleteThread"; "searchThreads": "searchThreads"; "loadMoreThreads": "loadMoreThreads"; "feedbackChange": "feedbackChange"; }, ["extraTemplate"], never, true, never>;
707
+ }
708
+
709
+ /**
710
+ * Ответ ассистента в ленте `rt-ai-chat`: ход работы, текст в markdown, вложения приложения и оценка.
711
+ * Оценка появляется, когда текст дописан.
712
+ */
713
+ declare class RtAiChatAnswerComponent {
714
+ protected readonly t: Signal<TRtKitLabelMap>;
715
+ protected readonly isRated: Signal<boolean>;
716
+ readonly message: InputSignal<IRtAiChat.Message>;
717
+ /** Шаблон вложений ответа; `null` — вложений нет. */
718
+ readonly extra: InputSignal<TemplateRef<IRtAiChat.ExtraContext> | null>;
719
+ /** Шаги хода работы раскрыты. */
720
+ readonly expanded: ModelSignal<boolean>;
721
+ /** Нажата оценка; повторное нажатие той же снимает её — решает родитель. */
722
+ readonly feedbackChange: OutputEmitterRef<Exclude<IRtAiChat.Feedback, null>>;
723
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtAiChatAnswerComponent, never>;
724
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtAiChatAnswerComponent, "rt-ai-chat-answer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; "extra": { "alias": "extra"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; }, { "expanded": "expandedChange"; "feedbackChange": "feedbackChange"; }, never, never, true, never>;
725
+ }
726
+
543
727
  /** Ключ текстовой расшифровки иконки статуса сообщения. */
544
728
  declare class RtChatStatusLabelPipe implements PipeTransform {
545
729
  transform(status: ERtChatMessageStatus): string;
@@ -547,5 +731,5 @@ declare class RtChatStatusLabelPipe implements PipeTransform {
547
731
  static ɵpipe: i0.ɵɵPipeDeclaration<RtChatStatusLabelPipe, "rtChatStatusLabel", true>;
548
732
  }
549
733
 
550
- export { ERtChatMessageStatus, IRtChat, IRtMessageComposer, RtChatComponent, RtChatMessageActionsDirective, RtChatMessageHasActionsPipe, RtChatStatusLabelPipe, RtMessageComposerComponent, RtRichEditorComponent, deliveryStatus, messageHasAvailableActions, pendingToRtMessage, toRtMessage };
734
+ export { ERtChatMessageStatus, IRtAiChat, IRtChat, IRtMessageComposer, RtAiChatAnswerComponent, RtAiChatComponent, RtAiChatMessageExtraDirective, RtChatComponent, RtChatMessageActionsDirective, RtChatMessageHasActionsPipe, RtChatStatusLabelPipe, RtMessageComposerComponent, RtRichEditorComponent, deliveryStatus, messageHasAvailableActions, pendingToRtMessage, toRtMessage };
551
735
  export type { IRtChatMessageActionsContext, IRtMappableMessage, IRtPendingMessage, IToRtMessageOptions, TRtRichEditorToolbar };
@@ -148,6 +148,12 @@ declare class RtSelectComponent<TValue> extends RtFormControlBase<TValue | null>
148
148
  protected getEmptyValue(): TValue | null;
149
149
  protected focusAfterClear(): void;
150
150
  protected clear(event?: Event): void;
151
+ /**
152
+ * Открытый список встаёт подсветкой на выбранный пункт.
153
+ *
154
+ * Иначе стрелка вниз начинала с первого пункта, и человек с выбранным «20» из «10, 20, 40»
155
+ * получал «10» вместо «40».
156
+ */
151
157
  protected onOpened(): void;
152
158
  protected toggleBranch(event: Event, value: TValue): void;
153
159
  protected onClosed(): void;
@@ -41,6 +41,18 @@ declare class RtThreadListRowDirective<TRow extends IRtThreadList.Row> {
41
41
  static ɵfac: i0.ɵɵFactoryDeclaration<RtThreadListRowDirective<any>, never>;
42
42
  static ɵdir: i0.ɵɵDirectiveDeclaration<RtThreadListRowDirective<any>, "ng-template[rtThreadListRow]", never, { "rows": { "alias": "rtThreadListRow"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
43
43
  }
44
+ /**
45
+ * Помечает `<ng-template>` действий строки (удалить, закрепить). Действия рисуются рядом с
46
+ * кнопкой строки, а не внутри неё: вложенная кнопка в `<button>` недопустима и крадёт клик
47
+ * выбора строки. Видны при наведении и фокусе внутри строки.
48
+ */
49
+ declare class RtThreadListRowActionsDirective<TRow extends IRtThreadList.Row> {
50
+ readonly templateRef: TemplateRef<IRtThreadList.RowContext<TRow>>;
51
+ readonly rows: InputSignal<readonly TRow[]>;
52
+ static ngTemplateContextGuard<TRow extends IRtThreadList.Row>(_directive: RtThreadListRowActionsDirective<TRow>, context: unknown): context is IRtThreadList.RowContext<TRow>;
53
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtThreadListRowActionsDirective<any>, never>;
54
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RtThreadListRowActionsDirective<any>, "ng-template[rtThreadListRowActions]", never, { "rows": { "alias": "rtThreadListRowActions"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
55
+ }
44
56
  /**
45
57
  * Помечает `<ng-template>` с фильтрами — его содержимое рендерится в поповере,
46
58
  * который открывает иконка-фильтр в шапке списка.
@@ -86,6 +98,7 @@ declare class RtThreadListComponent<TRow extends IRtThreadList.Row> implements O
86
98
  }[];
87
99
  protected readonly searchControl: FormControl<string>;
88
100
  protected readonly rowTemplate: Signal<RtThreadListRowDirective<TRow> | undefined>;
101
+ protected readonly rowActionsTemplate: Signal<RtThreadListRowActionsDirective<TRow> | undefined>;
89
102
  protected readonly filtersTemplate: Signal<RtThreadListFiltersDirective | undefined>;
90
103
  protected readonly searchTemplate: Signal<RtThreadListSearchDirective | undefined>;
91
104
  readonly rows: InputSignal<readonly TRow[]>;
@@ -105,7 +118,7 @@ declare class RtThreadListComponent<TRow extends IRtThreadList.Row> implements O
105
118
  protected onSelect(id: IRtThreadList.TRowId, event: MouseEvent): void;
106
119
  protected onLoadMore(): void;
107
120
  static ɵfac: i0.ɵɵFactoryDeclaration<RtThreadListComponent<any>, never>;
108
- static ɵcmp: i0.ɵɵComponentDeclaration<RtThreadListComponent<any>, "rt-thread-list", never, { "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "activeId": { "alias": "activeId"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fetching": { "alias": "fetching"; "required": false; "isSignal": true; }; "hasMore": { "alias": "hasMore"; "required": false; "isSignal": true; }; "filtersActive": { "alias": "filtersActive"; "required": false; "isSignal": true; }; }, { "selectRow": "selectRow"; "openInNewTab": "openInNewTab"; "searchChange": "searchChange"; "loadMore": "loadMore"; }, ["rowTemplate", "filtersTemplate", "searchTemplate"], never, true, [{ directive: typeof i1.RtRadiusDirective; inputs: { "radius": "radius"; }; outputs: {}; }]>;
121
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtThreadListComponent<any>, "rt-thread-list", never, { "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "activeId": { "alias": "activeId"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fetching": { "alias": "fetching"; "required": false; "isSignal": true; }; "hasMore": { "alias": "hasMore"; "required": false; "isSignal": true; }; "filtersActive": { "alias": "filtersActive"; "required": false; "isSignal": true; }; }, { "selectRow": "selectRow"; "openInNewTab": "openInNewTab"; "searchChange": "searchChange"; "loadMore": "loadMore"; }, ["rowTemplate", "rowActionsTemplate", "filtersTemplate", "searchTemplate"], never, true, [{ directive: typeof i1.RtRadiusDirective; inputs: { "radius": "radius"; }; outputs: {}; }]>;
109
122
  }
110
123
 
111
- export { IRtThreadList, RtThreadListComponent, RtThreadListFiltersDirective, RtThreadListRowDirective, RtThreadListSearchDirective };
124
+ export { IRtThreadList, RtThreadListComponent, RtThreadListFiltersDirective, RtThreadListRowActionsDirective, RtThreadListRowDirective, RtThreadListSearchDirective };
@@ -1,5 +1,6 @@
1
1
  export * from '@rt-tools/ui-kit-v2/core';
2
2
  export * from '@rt-tools/ui-kit-v2/accordion';
3
+ export * from '@rt-tools/ui-kit-v2/ai-run-status';
3
4
  export * from '@rt-tools/ui-kit-v2/action-bar';
4
5
  export * from '@rt-tools/ui-kit-v2/aside-section';
5
6
  export * from '@rt-tools/ui-kit-v2/aside';
@@ -13,6 +14,7 @@ export * from '@rt-tools/ui-kit-v2/checkbox';
13
14
  export * from '@rt-tools/ui-kit-v2/collapsible-text';
14
15
  export * from '@rt-tools/ui-kit-v2/confirm-popover';
15
16
  export * from '@rt-tools/ui-kit-v2/container';
17
+ export * from '@rt-tools/ui-kit-v2/copy-value';
16
18
  export * from '@rt-tools/ui-kit-v2/counter-row';
17
19
  export * from '@rt-tools/ui-kit-v2/counter';
18
20
  export * from '@rt-tools/ui-kit-v2/data-list';
@@ -57,6 +59,7 @@ export * from '@rt-tools/ui-kit-v2/page-header';
57
59
  export * from '@rt-tools/ui-kit-v2/pagination';
58
60
  export * from '@rt-tools/ui-kit-v2/photo-viewer';
59
61
  export * from '@rt-tools/ui-kit-v2/popover';
62
+ export * from '@rt-tools/ui-kit-v2/prompt-suggestion';
60
63
  export * from '@rt-tools/ui-kit-v2/radio-button';
61
64
  export * from '@rt-tools/ui-kit-v2/radius';
62
65
  export * from '@rt-tools/ui-kit-v2/ripple';
Binary file