@rt-tools/ui-kit-v2 0.34.4 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/fesm2022/rt-tools-ui-kit-v2-ai-prompt-input.mjs +574 -0
  2. package/fesm2022/rt-tools-ui-kit-v2-ai-prompt-input.mjs.map +1 -0
  3. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +76 -10
  4. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
  5. package/fesm2022/rt-tools-ui-kit-v2-button.mjs +18 -9
  6. package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -1
  7. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs +2 -2
  8. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs.map +1 -1
  9. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +66 -4
  10. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs +2 -2
  12. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs.map +1 -1
  13. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +128 -20
  14. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  15. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +2 -2
  16. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
  17. package/fesm2022/rt-tools-ui-kit-v2-usage-ring.mjs +163 -0
  18. package/fesm2022/rt-tools-ui-kit-v2-usage-ring.mjs.map +1 -0
  19. package/fesm2022/rt-tools-ui-kit-v2.mjs +2 -0
  20. package/package.json +9 -1
  21. package/src/lib/components/ai-prompt-input/CONTEXT.md +60 -0
  22. package/src/lib/components/ai-prompt-input/rt-ai-prompt-input.component.scss +113 -0
  23. package/src/lib/components/aside/footer/rt-aside-footer.component.scss +3 -1
  24. package/src/lib/components/aside/unsaved-dialog/rt-aside-unsaved-dialog.component.scss +10 -3
  25. package/src/lib/components/markdown-text/rt-markdown-text.component.scss +3 -0
  26. package/src/lib/components/thread-list/rt-thread-list.component.scss +19 -11
  27. package/src/lib/components/usage-ring/CONTEXT.md +33 -0
  28. package/src/lib/components/usage-ring/rt-usage-ring.component.scss +64 -0
  29. package/src/rich-editor/lib/components/ai-chat/CONTEXT.md +1 -1
  30. package/src/rich-editor/lib/components/ai-chat/answer/rt-ai-chat-answer.component.scss +1 -0
  31. package/src/rich-editor/lib/components/ai-chat/rt-ai-chat.component.scss +6 -0
  32. package/types/rt-tools-ui-kit-v2-ai-prompt-input.d.ts +193 -0
  33. package/types/rt-tools-ui-kit-v2-aside.d.ts +17 -7
  34. package/types/rt-tools-ui-kit-v2-button.d.ts +6 -1
  35. package/types/rt-tools-ui-kit-v2-core.d.ts +22 -0
  36. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +49 -3
  37. package/types/rt-tools-ui-kit-v2-usage-ring.d.ts +47 -0
  38. package/types/rt-tools-ui-kit-v2.d.ts +2 -0
@@ -23,6 +23,17 @@ export declare namespace IButton {
23
23
  * невидимы, но держат ширину кнопки, а спиннер стоит по центру.
24
24
  */
25
25
  type LoadingLabel = 'keep' | 'hide';
26
+ /**
27
+ * Вид, который кнопке задаёт место, где она стоит, — например слот подвала панели. Названное
28
+ * здесь сильнее входов кнопки, неназванное берётся из входов. `icon: null` снимает значок,
29
+ * `label` подменяет подпись.
30
+ */
31
+ interface PlaceLook {
32
+ readonly theme?: Theme;
33
+ readonly appearance?: Appearance;
34
+ readonly icon?: null;
35
+ readonly label?: string;
36
+ }
26
37
  }
27
38
  /** Вид колонки: решает, чем рисуется значение ячейки. */
28
39
  export declare enum ERtDataTableColumnType {
@@ -476,12 +487,16 @@ export declare const RT_KIT_LABELS_EN: {
476
487
  readonly aiLike: "Good answer";
477
488
  readonly aiNewThread: "New conversation";
478
489
  readonly aiNoThreads: "No conversations yet";
490
+ readonly aiPromptEffortAria: "Effort";
491
+ readonly aiPromptModeAria: "Mode";
492
+ readonly aiPromptModelAria: "Model";
479
493
  readonly aiReference: "Reference";
480
494
  readonly aiRetry: "Ask again";
481
495
  readonly aiSearchThreads: "Search conversations";
482
496
  readonly aiShowSteps: "Show steps";
483
497
  readonly aiThreads: "Conversations";
484
498
  readonly aiTitle: "Assistant";
499
+ readonly aiUsageAria: "Used {{percent}}% of the limit";
485
500
  readonly aiYou: "You";
486
501
  readonly asideCopyErrorInfo: "Copy error info";
487
502
  readonly asideRequestError: "Request Error";
@@ -1044,6 +1059,8 @@ export declare function rtSearchWords(query: string): string[];
1044
1059
  export declare function rtSearchMatches(text: string, query: string): boolean;
1045
1060
  /** Порог узкого вида — тот же, что у `$rt-bp-lg` в стилях кита. */
1046
1061
  export declare const RT_NARROW_WIDTH: number;
1062
+ /** Порог телефона — тот же, что у `$rt-bp-sm` в стилях кита. */
1063
+ export declare const RT_PHONE_WIDTH: number;
1047
1064
  /**
1048
1065
  * Узок ли вид. Ширина места страницы решает, когда место объявлено; без него решает окно.
1049
1066
  */
@@ -1067,6 +1084,11 @@ export declare class BreakpointsService {
1067
1084
  * `initialValue: false` — на SSR/CSR до первого matchMedia рендерим desktop-вариант.
1068
1085
  */
1069
1086
  readonly viewportNarrow: Signal<boolean>;
1087
+ /**
1088
+ * Окно телефона (≤480px). На нём то, что на экране шире стоит в строку, встаёт короче или
1089
+ * столбиком: подпись первой кнопки подвала панели. `initialValue: false` — как у узкого окна.
1090
+ */
1091
+ readonly phone: Signal<boolean>;
1070
1092
  /**
1071
1093
  * Узкий вид (≤1080px) — единый порог для компонентов, которые на узком месте подменяют
1072
1094
  * развёрнутый контрол на компактный (напр. `rt-filter-control`: сегменты → `rt-select`).
@@ -1,6 +1,6 @@
1
1
  import * as i0 from "@angular/core";
2
2
  import { AfterViewInit, ElementRef, InputSignal, InputSignalWithTransform, ModelSignal, OnDestroy, OutputEmitterRef, PipeTransform, Signal, TemplateRef, WritableSignal } from "@angular/core";
3
- import { IQuillDelta, IRtAiRunStatus, IRtIcon, IRtServiceLogo, IRtSideMenu, IRtThreadList, IRtTimeline, RtFormControlBase, TRtKitLabelMap } from "@rt-tools/ui-kit-v2";
3
+ import { IQuillDelta, IRtAiPromptInput, IRtAiRunStatus, IRtIcon, IRtServiceLogo, IRtSideMenu, IRtThreadList, IRtTimeline, RtAiPromptInputComponent, RtFormControlBase, TRtKitLabelMap } from "@rt-tools/ui-kit-v2";
4
4
  import { BooleanInput, NumberInput } from "@angular/cdk/coercion";
5
5
  import { FormControl, FormGroup } from "@angular/forms";
6
6
  /**
@@ -816,7 +816,7 @@ interface IThreadRow extends IRtThreadList.Row {
816
816
  */
817
817
  export declare class RtAiChatComponent {
818
818
  #private;
819
- protected readonly composer: Signal<RtMessageComposerComponent | undefined>;
819
+ protected readonly composer: Signal<RtAiPromptInputComponent | undefined>;
820
820
  protected readonly backButton: Signal<ElementRef<HTMLElement> | undefined>;
821
821
  protected readonly feed: Signal<ElementRef<HTMLElement> | undefined>;
822
822
  protected readonly t: Signal<TRtKitLabelMap>;
@@ -827,6 +827,7 @@ export declare class RtAiChatComponent {
827
827
  protected readonly emptyTitleText: Signal<string>;
828
828
  protected readonly emptyDescriptionText: Signal<string>;
829
829
  protected readonly disclaimerText: Signal<string>;
830
+ protected readonly disclaimerAbove: Signal<boolean>;
830
831
  /** Значение признака одних значков на шапке: только материальный набор, свой — без признака. */
831
832
  protected readonly headerIconSign: Signal<IRtIcon.Preset | null>;
832
833
  protected readonly hasThreads: Signal<boolean>;
@@ -853,6 +854,18 @@ export declare class RtAiChatComponent {
853
854
  readonly placeholder: InputSignal<string>;
854
855
  /** Подпись под полем сообщения; `null` — подпись кита, пустая строка — без подписи. */
855
856
  readonly disclaimer: InputSignal<string | null>;
857
+ /** Где стоит подпись: под полем, а где места под ним нет — над полем. */
858
+ readonly disclaimerPosition: InputSignal<IRtAiPromptInput.HintPosition>;
859
+ /** Подпись модели в ряду поля. Пусто — кнопки модели нет. */
860
+ readonly model: InputSignal<string>;
861
+ /** Подпись усилия в ряду поля. Пусто — кнопки усилия нет. */
862
+ readonly effort: InputSignal<string>;
863
+ /** Подпись режима в ряду поля. Пусто — кнопки режима нет. */
864
+ readonly mode: InputSignal<string>;
865
+ /** Потраченная доля лимита в процентах. `null` — кольца расхода нет. */
866
+ readonly usage: InputSignal<number | null>;
867
+ /** Подсказка кольца расхода: доля и дата сброса словами приложения. */
868
+ readonly usageHint: InputSignal<string>;
856
869
  /** Ответ пишется: поле сообщения в режиме остановки, подсказки и новая беседа выключены. */
857
870
  readonly sending: InputSignalWithTransform<boolean, BooleanInput>;
858
871
  /** Беседа загружается: крутилка, пока сообщений нет. */
@@ -899,11 +912,13 @@ export declare class RtAiChatComponent {
899
912
  readonly searchThreads: OutputEmitterRef<string>;
900
913
  readonly loadMoreThreads: OutputEmitterRef<void>;
901
914
  readonly feedbackChange: OutputEmitterRef<IRtAiChat.FeedbackChange>;
915
+ /** Нажата кнопка модели, усилия или режима в ряду поля: что она открывает, решает приложение. */
916
+ readonly controlPicked: OutputEmitterRef<IRtAiPromptInput.Control>;
902
917
  constructor();
903
918
  /** Фокус в поле сообщения после отрисовки: приложению — после своих действий вне панели. */
904
919
  focusComposer(): void;
905
920
  protected onFeedScroll(): void;
906
- protected onSubmitted(value: IRtMessageComposer.SubmitPayload): void;
921
+ protected onSubmitted(value: IRtAiPromptInput.SubmitPayload): void;
907
922
  protected onSuggestion(text: string): void;
908
923
  protected onToggleRun(messageId: string, open: boolean): void;
909
924
  protected onFeedback(message: IRtAiChat.Message, feedback: Exclude<IRtAiChat.Feedback, null>): void;
@@ -956,6 +971,36 @@ export declare class RtAiChatComponent {
956
971
  "required": false;
957
972
  "isSignal": true;
958
973
  };
974
+ "disclaimerPosition": {
975
+ "alias": "disclaimerPosition";
976
+ "required": false;
977
+ "isSignal": true;
978
+ };
979
+ "model": {
980
+ "alias": "model";
981
+ "required": false;
982
+ "isSignal": true;
983
+ };
984
+ "effort": {
985
+ "alias": "effort";
986
+ "required": false;
987
+ "isSignal": true;
988
+ };
989
+ "mode": {
990
+ "alias": "mode";
991
+ "required": false;
992
+ "isSignal": true;
993
+ };
994
+ "usage": {
995
+ "alias": "usage";
996
+ "required": false;
997
+ "isSignal": true;
998
+ };
999
+ "usageHint": {
1000
+ "alias": "usageHint";
1001
+ "required": false;
1002
+ "isSignal": true;
1003
+ };
959
1004
  "sending": {
960
1005
  "alias": "sending";
961
1006
  "required": false;
@@ -1055,6 +1100,7 @@ export declare class RtAiChatComponent {
1055
1100
  "searchThreads": "searchThreads";
1056
1101
  "loadMoreThreads": "loadMoreThreads";
1057
1102
  "feedbackChange": "feedbackChange";
1103
+ "controlPicked": "controlPicked";
1058
1104
  }, ["extraTemplate"], never, true, never>;
1059
1105
  }
1060
1106
  /**
@@ -0,0 +1,47 @@
1
+ import { NumberInput } from "@angular/cdk/coercion";
2
+ import * as i0 from "@angular/core";
3
+ import { InputSignal, InputSignalWithTransform, Signal } from "@angular/core";
4
+ /** Длина окружности дуги: из неё складывается доля, закрашенная по `stroke-dasharray`. */
5
+ export declare const RT_USAGE_RING_CIRCUMFERENCE: number;
6
+ /** Доля от 0 до 100 в целых процентах; всё вне границ прижимается к краю. */
7
+ export declare function rtUsagePercent(value: number): number;
8
+ /**
9
+ * Кольцо расхода: доля потраченного лимита дугой по кругу, с порога предупреждения оранжевая.
10
+ *
11
+ * Кольцо рисует только долю. Что за лимит и когда он сбрасывается, говорит подсказка `hint`
12
+ * по наведению и фокусу: её текст собирает приложение, кит не знает ни лимита, ни дат.
13
+ */
14
+ export declare class RtUsageRingComponent {
15
+ /** Доля в целых процентах, прижатая к 0…100. */
16
+ protected readonly percent: Signal<number>;
17
+ protected readonly radius: number;
18
+ protected readonly circumference: number;
19
+ /** Незакрашенная часть окружности: дуга рисуется штрихом этой длины со смещением. */
20
+ protected readonly dashOffset: Signal<number>;
21
+ protected readonly mods: Signal<Record<string, boolean>>;
22
+ protected readonly label: Signal<string>;
23
+ /** Потраченная доля лимита в процентах. */
24
+ readonly value: InputSignalWithTransform<number, NumberInput>;
25
+ /** С этой доли кольцо оранжевое. */
26
+ readonly warnAt: InputSignalWithTransform<number, NumberInput>;
27
+ /** Подсказка по наведению и фокусу: доля и дата сброса словами приложения. Пусто — подсказки нет. */
28
+ readonly hint: InputSignal<string>;
29
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtUsageRingComponent, never>;
30
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtUsageRingComponent, "rt-usage-ring", never, {
31
+ "value": {
32
+ "alias": "value";
33
+ "required": false;
34
+ "isSignal": true;
35
+ };
36
+ "warnAt": {
37
+ "alias": "warnAt";
38
+ "required": false;
39
+ "isSignal": true;
40
+ };
41
+ "hint": {
42
+ "alias": "hint";
43
+ "required": false;
44
+ "isSignal": true;
45
+ };
46
+ }, {}, never, never, true, never>;
47
+ }
@@ -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-prompt-input";
3
4
  export * from "@rt-tools/ui-kit-v2/ai-run-status";
4
5
  export * from "@rt-tools/ui-kit-v2/action-bar";
5
6
  export * from "@rt-tools/ui-kit-v2/aside-section";
@@ -101,6 +102,7 @@ export * from "@rt-tools/ui-kit-v2/toolbar";
101
102
  export * from "@rt-tools/ui-kit-v2/tooltip";
102
103
  export * from "@rt-tools/ui-kit-v2/tree";
103
104
  export * from "@rt-tools/ui-kit-v2/tree-selector";
105
+ export * from "@rt-tools/ui-kit-v2/usage-ring";
104
106
  export * from "@rt-tools/ui-kit-v2/welcome-dialog";
105
107
  export * from "@rt-tools/ui-kit-v2/workspace-details";
106
108
  export * from "@rt-tools/ui-kit-v2/workspace";