@rt-tools/ui-kit-v2 0.39.1 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/fesm2022/rt-tools-ui-kit-v2-ai-prompt-input.mjs +13 -1
  2. package/fesm2022/rt-tools-ui-kit-v2-ai-prompt-input.mjs.map +1 -1
  3. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +12 -0
  4. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  5. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +3 -1
  6. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
  7. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +60 -7
  8. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
  9. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +91 -10
  10. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs +2 -2
  12. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs.map +1 -1
  13. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +76 -5
  14. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
  15. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +111 -35
  16. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  17. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +37 -16
  18. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -1
  19. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +94 -5
  20. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
  21. package/package.json +1 -1
  22. package/src/lib/components/date-picker/panel/rt-date-panel.component.scss +51 -2
  23. package/src/lib/components/date-range/panel/rt-date-range-panel.component.scss +95 -2
  24. package/src/lib/components/detail-list/CONTEXT.md +3 -0
  25. package/src/lib/components/detail-list/rt-detail-row.component.scss +1 -0
  26. package/src/lib/components/input-number/CONTEXT.md +8 -0
  27. package/src/lib/components/input-number/rt-input-number.component.scss +50 -0
  28. package/src/lib/components/stat-tile/CONTEXT.md +11 -6
  29. package/src/lib/components/stat-tile/rt-stat-tile.component.scss +21 -0
  30. package/src/lib/components/stat-tile/stories/component/test-stat-tile-matrix.component.scss +15 -0
  31. package/src/lib/components/table/CONTEXT.md +20 -0
  32. package/src/lib/components/table/rt-table.component.scss +77 -22
  33. package/src/lib/components/table/stories/component/test-table-pinned.component.scss +76 -0
  34. package/src/rich-editor/lib/components/chat/CONTEXT.md +5 -0
  35. package/src/styles/_primitives.scss +2 -0
  36. package/src/styles/_semantic.scss +9 -0
  37. package/src/styles/_theme-dark.scss +2 -0
  38. package/styles/tokens.css +66 -0
  39. package/types/rt-tools-ui-kit-v2-ai-prompt-input.d.ts +4 -0
  40. package/types/rt-tools-ui-kit-v2-core.d.ts +9 -1
  41. package/types/rt-tools-ui-kit-v2-date-picker.d.ts +14 -0
  42. package/types/rt-tools-ui-kit-v2-input-number.d.ts +30 -2
  43. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +13 -1
  44. package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +29 -6
  45. package/types/rt-tools-ui-kit-v2-table.d.ts +31 -0
@@ -11,6 +11,10 @@ const BEM_BLOCK = "rt-ai-prompt-input";
11
11
  function rtPromptCanSend(text, files, busy) {
12
12
  return !busy && (text.trim().length > 0 || files > 0);
13
13
  }
14
+ function rtCaretToEnd(node) {
15
+ node.focus();
16
+ node.setSelectionRange(node.value.length, node.value.length);
17
+ }
14
18
  var RtAiPromptInputComponent = class RtAiPromptInputComponent {
15
19
  constructor() {
16
20
  this.#t_placeholder = rtKitLabel("chatPlaceholder");
@@ -75,6 +79,14 @@ var RtAiPromptInputComponent = class RtAiPromptInputComponent {
75
79
  focus() {
76
80
  this.textInput()?.nativeElement.focus();
77
81
  }
82
+ setDraft(text) {
83
+ this.text.set(text);
84
+ const node = this.textInput()?.nativeElement;
85
+ if (node) {
86
+ node.value = text;
87
+ rtCaretToEnd(node);
88
+ }
89
+ }
78
90
  onInput(event) {
79
91
  this.text.set(event.target.value);
80
92
  }
@@ -569,6 +581,6 @@ i0.ɵɵngDeclareClassMetadata({
569
581
  }]
570
582
  }
571
583
  });
572
- export { RtAiPromptInputComponent, rtPromptCanSend };
584
+ export { RtAiPromptInputComponent, rtCaretToEnd, rtPromptCanSend };
573
585
 
574
586
  //# sourceMappingURL=rt-tools-ui-kit-v2-ai-prompt-input.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"rt-tools-ui-kit-v2-ai-prompt-input.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/ai-prompt-input/rt-ai-prompt-input.component.ts","../../../projects/ui-kit-v2/src/lib/components/ai-prompt-input/rt-ai-prompt-input.component.html"],"sourcesContent":["import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport { CdkTextareaAutosize } from '@angular/cdk/text-field';\nimport {\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n ModelSignal,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';\nimport { RT_KIT_LABELS, TRtKitLabelMap, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { RtFileCardComponent } from '@rt-tools/ui-kit-v2/file-card';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtUsageRingComponent } from '@rt-tools/ui-kit-v2/usage-ring';\n\nimport { IRtAiPromptInput } from './rt-ai-prompt-input.model';\n\nconst BEM_BLOCK: string = 'rt-ai-prompt-input';\n\n/** Можно ли отправить: есть непустой текст или файл, поле свободно. */\nexport function rtPromptCanSend(text: string, files: number, busy: boolean): boolean {\n return !busy && (text.trim().length > 0 || files > 0);\n}\n\n/**\n * Поле ввода ИИ-чата: одна рамка, текст сверху, ряд действий внутри рамки снизу.\n *\n * Слева в ряду «+» для файлов, справа модель, усилие, режим, кольцо расхода и отправка. Каждый\n * элемент ряда включается своим входом: без значения его нет. Что открывает нажатие на модель,\n * усилие и режим, решает приложение: поле сообщает, какую кнопку нажали.\n *\n * Свои элементы ряда приложение кладёт проекцией: с меткой `rtPromptInputStart` они встают слева\n * после «+», с меткой `rtPromptInputEnd` справа перед моделью и отправкой. Подходит любой\n * элемент высотой с кнопку sm: кнопка-иконка, кнопка с текстом, выпадающий список.\n *\n * @example\n * ```html\n * <rt-ai-prompt-input attachments>\n * <rt-icon-button rtPromptInputStart icon=\"bolt\" variant=\"ghost\" size=\"sm\" ariaLabel=\"Быстрые ответы\" />\n * <button rtButton rtPromptInputStart appearance=\"text\" size=\"sm\" label=\"Отправить позже\"></button>\n * <rt-icon-button rtPromptInputEnd icon=\"mic\" variant=\"ghost\" size=\"sm\" ariaLabel=\"Голос\" />\n * </rt-ai-prompt-input>\n * ```\n *\n * Подсказка стоит отдельной строкой под полем или над ним, в ряд действий она не входит.\n *\n * Отправка — `Enter` без Shift или кнопка со стрелкой; `Shift+Enter` переносит строку. Со\n * `stoppable` во время `sending` стрелку сменяет «Стоп», а поле остаётся открытым.\n */\n@Component({\n selector: 'rt-ai-prompt-input',\n templateUrl: './rt-ai-prompt-input.component.html',\n styleUrl: './rt-ai-prompt-input.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // cdk\n CdkTextareaAutosize,\n\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n RtButtonDirective,\n RtFileCardComponent,\n RtIconButtonComponent,\n RtUsageRingComponent,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtAiPromptInputComponent {\n readonly #t_placeholder: Signal<string> = rtKitLabel('chatPlaceholder');\n\n readonly #t_disclaimer: Signal<string> = rtKitLabel('aiDisclaimer');\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly fileInput: Signal<ElementRef<HTMLInputElement> | undefined> = viewChild<ElementRef<HTMLInputElement>>('fileEl');\n\n protected readonly textInput: Signal<ElementRef<HTMLTextAreaElement> | undefined> =\n viewChild<ElementRef<HTMLTextAreaElement>>('textEl');\n\n protected readonly files: WritableSignal<File[]> = signal<File[]>([]);\n\n protected readonly placeholderText: Signal<string> = computed((): string => this.placeholder() || this.#t_placeholder());\n\n /** Текст подсказки: `null` — английское умолчание кита, пустая строка — подсказки нет. */\n protected readonly hintText: Signal<string> = computed((): string => this.hint() ?? this.#t_disclaimer());\n\n protected readonly hintAbove: Signal<boolean> = computed((): boolean => this.hintText() !== '' && this.hintPosition() === 'above');\n\n protected readonly hintBelow: Signal<boolean> = computed((): boolean => this.hintText() !== '' && this.hintPosition() === 'below');\n\n /** Поле закрыто для набора: выключено или идёт ответ, который нельзя остановить. */\n protected readonly locked: Signal<boolean> = computed((): boolean => this.disabled() || (this.sending() && !this.stoppable()));\n\n protected readonly canSend: Signal<boolean> = computed((): boolean =>\n rtPromptCanSend(this.text(), this.attachments() ? this.files().length : 0, this.sending() || this.disabled())\n );\n\n /** Идёт ответ, который можно остановить: вместо стрелки стоит «Стоп». */\n protected readonly isStoppable: Signal<boolean> = computed((): boolean => this.stoppable() && this.sending() && !this.disabled());\n\n protected readonly hasUsage: Signal<boolean> = computed((): boolean => this.usage() !== null);\n\n protected readonly boxMods: Signal<Record<string, boolean>> = computed((): Record<string, boolean> => ({\n disabled: this.disabled(),\n }));\n\n /** Текст-подсказка поля. Пусто — переведённое умолчание кита. */\n public readonly placeholder: InputSignal<string> = input<string>('');\n\n /** Подсказка отдельной строкой. `null` — английское умолчание кита, пустая строка убирает её. */\n public readonly hint: InputSignal<string | null> = input<string | null>(null);\n\n /** Где стоит подсказка: под полем, а где места под ним нет — над полем. */\n public readonly hintPosition: InputSignal<IRtAiPromptInput.HintPosition> = input<IRtAiPromptInput.HintPosition>('below');\n\n /** Кнопка «+» и карточки приложенных файлов. */\n public readonly attachments: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Фильтр типов файлов (`.pdf,.png`). */\n public readonly accept: InputSignal<string> = input<string>('');\n\n /** Подпись модели. Пусто — кнопки модели нет. */\n public readonly model: InputSignal<string> = input<string>('');\n\n /** Подпись усилия. Пусто — кнопки усилия нет. */\n public readonly effort: InputSignal<string> = input<string>('');\n\n /** Подпись режима. Пусто — кнопки режима нет. */\n public readonly mode: InputSignal<string> = input<string>('');\n\n /** Потраченная доля лимита в процентах. `null` — кольца нет. */\n public readonly usage: InputSignal<number | null> = input<number | null>(null);\n\n /** Подсказка кольца по наведению: доля и дата сброса словами приложения. */\n public readonly usageHint: InputSignal<string> = input<string>('');\n\n /** С этой доли кольцо оранжевое. */\n public readonly usageWarnAt: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(80, {\n transform: numberAttribute,\n });\n\n /** Отправка идёт: кнопка крутит индикатор, без `stoppable` поле закрыто. */\n public readonly sending: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Ответ можно остановить: во время `sending` стрелку сменяет «Стоп», поле открыто. */\n public readonly stoppable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Наименьшая высота поля в строках. */\n public readonly minRows: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(1, { transform: numberAttribute });\n\n /** Наибольшая высота поля в строках, дальше текст прокручивается. */\n public readonly maxRows: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(8, { transform: numberAttribute });\n\n /** Черновик: задаётся снаружи, правки уходят наружу, после отправки пуст. */\n public readonly text: ModelSignal<string> = model<string>('');\n\n /** Отправка вопроса. */\n public readonly submitted: OutputEmitterRef<IRtAiPromptInput.SubmitPayload> = output<IRtAiPromptInput.SubmitPayload>();\n\n /** Нажата «Стоп» во время ответа. */\n public readonly stopped: OutputEmitterRef<void> = output<void>();\n\n /** Нажата кнопка модели, усилия или режима. */\n public readonly controlPicked: OutputEmitterRef<IRtAiPromptInput.Control> = output<IRtAiPromptInput.Control>();\n\n /** Ставит фокус в поле. */\n public focus(): void {\n this.textInput()?.nativeElement.focus();\n }\n\n protected onInput(event: Event): void {\n this.text.set((event.target as HTMLTextAreaElement).value);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n // Enter без Shift отправляет; подтверждение набора IME не перехватывается.\n if (event.key === 'Enter' && !event.shiftKey && !event.isComposing) {\n event.preventDefault();\n this.submit();\n }\n }\n\n protected pick(control: IRtAiPromptInput.Control): void {\n this.controlPicked.emit(control);\n }\n\n protected stop(): void {\n if (this.isStoppable()) {\n this.stopped.emit();\n }\n }\n\n protected openPicker(): void {\n if (!this.locked()) {\n this.fileInput()?.nativeElement.click();\n }\n }\n\n protected onFilesPicked(event: Event): void {\n const el: HTMLInputElement = event.target as HTMLInputElement;\n const picked: File[] = el.files ? Array.from(el.files) : [];\n if (picked.length > 0) {\n this.files.update((current: File[]): File[] => [...current, ...picked]);\n }\n // Сброс значения: повторный выбор того же файла снова даёт событие.\n el.value = '';\n }\n\n protected removeFile(index: number): void {\n this.files.update((current: File[]): File[] => current.filter((_: File, i: number): boolean => i !== index));\n }\n\n protected submit(): void {\n if (!this.canSend()) {\n return;\n }\n this.submitted.emit({ text: this.text().trim(), files: this.attachments() ? this.files() : [] });\n this.text.set('');\n this.files.set([]);\n }\n}\n","<ng-container rtBlock=\"rt-ai-prompt-input\">\n @if (hintAbove()) {\n <p rtElem=\"hint\" qa-dataid=\"ai-prompt-input-hint\" [rtMod]=\"{ above: true }\">{{ hintText() }}</p>\n }\n\n <div rtElem=\"box\" qa-dataid=\"ai-prompt-input-box\" [rtMod]=\"boxMods()\">\n @if (attachments() && files().length) {\n <div rtElem=\"files\" qa-dataid=\"ai-prompt-input-files\">\n @for (file of files(); track $index) {\n <rt-file-card\n showRemove\n qa-dataid=\"ai-prompt-input-file\"\n size=\"sm\"\n [name]=\"file.name\"\n [sizeBytes]=\"file.size\"\n [disabled]=\"locked()\"\n (removed)=\"removeFile($index)\" />\n }\n </div>\n }\n\n <textarea\n #textEl\n rtElem=\"input\"\n qa-dataid=\"ai-prompt-input-field\"\n cdkTextareaAutosize\n [attr.aria-label]=\"t().chatComposerAria\"\n [placeholder]=\"placeholderText()\"\n [value]=\"text()\"\n [disabled]=\"locked()\"\n [cdkAutosizeMinRows]=\"minRows()\"\n [cdkAutosizeMaxRows]=\"maxRows()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"></textarea>\n\n <div rtElem=\"actions\">\n @if (attachments()) {\n <input\n #fileEl\n qa-dataid=\"ai-prompt-input-file-input\"\n type=\"file\"\n hidden\n multiple\n [attr.accept]=\"accept() || null\"\n (change)=\"onFilesPicked($event)\" />\n <rt-icon-button\n qa-dataid=\"ai-prompt-input-attach\"\n icon=\"ico-plus\"\n iconColor=\"muted\"\n size=\"sm\"\n variant=\"ghost\"\n [ariaLabel]=\"t().chatAttachAria\"\n [tooltip]=\"t().chatAttachTooltip\"\n [disabled]=\"locked()\"\n (clicked)=\"openPicker()\" />\n }\n\n <ng-content select=\"[rtPromptInputStart]\" />\n\n <div rtElem=\"controls\">\n <ng-content select=\"[rtPromptInputEnd]\" />\n\n @if (model()) {\n <button\n rtButton\n rtElem=\"control\"\n qa-dataid=\"ai-prompt-input-model\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n [label]=\"model()\"\n [attr.aria-label]=\"t().aiPromptModelAria + ': ' + model()\"\n [disabled]=\"disabled()\"\n (click)=\"pick('model')\"></button>\n }\n\n @if (effort()) {\n <button\n rtButton\n rtElem=\"control\"\n qa-dataid=\"ai-prompt-input-effort\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n [rtMod]=\"{ muted: true }\"\n [label]=\"effort()\"\n [attr.aria-label]=\"t().aiPromptEffortAria + ': ' + effort()\"\n [disabled]=\"disabled()\"\n (click)=\"pick('effort')\"></button>\n }\n\n @if (mode()) {\n <button\n rtButton\n rtElem=\"control\"\n qa-dataid=\"ai-prompt-input-mode\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n [rtMod]=\"{ muted: true }\"\n [label]=\"mode()\"\n [attr.aria-label]=\"t().aiPromptModeAria + ': ' + mode()\"\n [disabled]=\"disabled()\"\n (click)=\"pick('mode')\"></button>\n }\n\n @if (hasUsage()) {\n <rt-usage-ring qa-dataid=\"ai-prompt-input-usage\" [value]=\"usage() ?? 0\" [warnAt]=\"usageWarnAt()\" [hint]=\"usageHint()\" />\n }\n\n @if (isStoppable()) {\n <rt-icon-button\n qa-dataid=\"ai-prompt-input-stop\"\n icon=\"stop\"\n size=\"sm\"\n variant=\"primary\"\n [ariaLabel]=\"t().chatStopAria\"\n [tooltip]=\"t().chatStopLabel\"\n (clicked)=\"stop()\" />\n } @else {\n <rt-icon-button\n qa-dataid=\"ai-prompt-input-send\"\n icon=\"arrow-up\"\n size=\"sm\"\n variant=\"primary\"\n [ariaLabel]=\"t().chatSendAria\"\n [tooltip]=\"t().chatSendLabel\"\n [loading]=\"sending()\"\n [disabled]=\"!canSend()\"\n (clicked)=\"submit()\" />\n }\n </div>\n </div>\n </div>\n\n @if (hintBelow()) {\n <p rtElem=\"hint\" qa-dataid=\"ai-prompt-input-hint\">{{ hintText() }}</p>\n }\n</ng-container>\n"],"mappings":"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"}
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-ai-prompt-input.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/ai-prompt-input/rt-ai-prompt-input.component.ts","../../../projects/ui-kit-v2/src/lib/components/ai-prompt-input/rt-ai-prompt-input.component.html"],"sourcesContent":["import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport { CdkTextareaAutosize } from '@angular/cdk/text-field';\nimport {\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n ModelSignal,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';\nimport { RT_KIT_LABELS, TRtKitLabelMap, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { RtFileCardComponent } from '@rt-tools/ui-kit-v2/file-card';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtUsageRingComponent } from '@rt-tools/ui-kit-v2/usage-ring';\n\nimport { IRtAiPromptInput } from './rt-ai-prompt-input.model';\n\nconst BEM_BLOCK: string = 'rt-ai-prompt-input';\n\n/** Можно ли отправить: есть непустой текст или файл, поле свободно. */\nexport function rtPromptCanSend(text: string, files: number, busy: boolean): boolean {\n return !busy && (text.trim().length > 0 || files > 0);\n}\n\n/** Ставит фокус в поле, а курсор — за последний символ. */\nexport function rtCaretToEnd(node: HTMLTextAreaElement): void {\n node.focus();\n node.setSelectionRange(node.value.length, node.value.length);\n}\n\n/**\n * Поле ввода ИИ-чата: одна рамка, текст сверху, ряд действий внутри рамки снизу.\n *\n * Слева в ряду «+» для файлов, справа модель, усилие, режим, кольцо расхода и отправка. Каждый\n * элемент ряда включается своим входом: без значения его нет. Что открывает нажатие на модель,\n * усилие и режим, решает приложение: поле сообщает, какую кнопку нажали.\n *\n * Свои элементы ряда приложение кладёт проекцией: с меткой `rtPromptInputStart` они встают слева\n * после «+», с меткой `rtPromptInputEnd` справа перед моделью и отправкой. Подходит любой\n * элемент высотой с кнопку sm: кнопка-иконка, кнопка с текстом, выпадающий список.\n *\n * @example\n * ```html\n * <rt-ai-prompt-input attachments>\n * <rt-icon-button rtPromptInputStart icon=\"bolt\" variant=\"ghost\" size=\"sm\" ariaLabel=\"Быстрые ответы\" />\n * <button rtButton rtPromptInputStart appearance=\"text\" size=\"sm\" label=\"Отправить позже\"></button>\n * <rt-icon-button rtPromptInputEnd icon=\"mic\" variant=\"ghost\" size=\"sm\" ariaLabel=\"Голос\" />\n * </rt-ai-prompt-input>\n * ```\n *\n * Подсказка стоит отдельной строкой под полем или над ним, в ряд действий она не входит.\n *\n * Отправка — `Enter` без Shift или кнопка со стрелкой; `Shift+Enter` переносит строку. Со\n * `stoppable` во время `sending` стрелку сменяет «Стоп», а поле остаётся открытым.\n */\n@Component({\n selector: 'rt-ai-prompt-input',\n templateUrl: './rt-ai-prompt-input.component.html',\n styleUrl: './rt-ai-prompt-input.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // cdk\n CdkTextareaAutosize,\n\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n RtButtonDirective,\n RtFileCardComponent,\n RtIconButtonComponent,\n RtUsageRingComponent,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtAiPromptInputComponent {\n readonly #t_placeholder: Signal<string> = rtKitLabel('chatPlaceholder');\n\n readonly #t_disclaimer: Signal<string> = rtKitLabel('aiDisclaimer');\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly fileInput: Signal<ElementRef<HTMLInputElement> | undefined> = viewChild<ElementRef<HTMLInputElement>>('fileEl');\n\n protected readonly textInput: Signal<ElementRef<HTMLTextAreaElement> | undefined> =\n viewChild<ElementRef<HTMLTextAreaElement>>('textEl');\n\n protected readonly files: WritableSignal<File[]> = signal<File[]>([]);\n\n protected readonly placeholderText: Signal<string> = computed((): string => this.placeholder() || this.#t_placeholder());\n\n /** Текст подсказки: `null` — английское умолчание кита, пустая строка — подсказки нет. */\n protected readonly hintText: Signal<string> = computed((): string => this.hint() ?? this.#t_disclaimer());\n\n protected readonly hintAbove: Signal<boolean> = computed((): boolean => this.hintText() !== '' && this.hintPosition() === 'above');\n\n protected readonly hintBelow: Signal<boolean> = computed((): boolean => this.hintText() !== '' && this.hintPosition() === 'below');\n\n /** Поле закрыто для набора: выключено или идёт ответ, который нельзя остановить. */\n protected readonly locked: Signal<boolean> = computed((): boolean => this.disabled() || (this.sending() && !this.stoppable()));\n\n protected readonly canSend: Signal<boolean> = computed((): boolean =>\n rtPromptCanSend(this.text(), this.attachments() ? this.files().length : 0, this.sending() || this.disabled())\n );\n\n /** Идёт ответ, который можно остановить: вместо стрелки стоит «Стоп». */\n protected readonly isStoppable: Signal<boolean> = computed((): boolean => this.stoppable() && this.sending() && !this.disabled());\n\n protected readonly hasUsage: Signal<boolean> = computed((): boolean => this.usage() !== null);\n\n protected readonly boxMods: Signal<Record<string, boolean>> = computed((): Record<string, boolean> => ({\n disabled: this.disabled(),\n }));\n\n /** Текст-подсказка поля. Пусто — переведённое умолчание кита. */\n public readonly placeholder: InputSignal<string> = input<string>('');\n\n /** Подсказка отдельной строкой. `null` — английское умолчание кита, пустая строка убирает её. */\n public readonly hint: InputSignal<string | null> = input<string | null>(null);\n\n /** Где стоит подсказка: под полем, а где места под ним нет — над полем. */\n public readonly hintPosition: InputSignal<IRtAiPromptInput.HintPosition> = input<IRtAiPromptInput.HintPosition>('below');\n\n /** Кнопка «+» и карточки приложенных файлов. */\n public readonly attachments: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Фильтр типов файлов (`.pdf,.png`). */\n public readonly accept: InputSignal<string> = input<string>('');\n\n /** Подпись модели. Пусто — кнопки модели нет. */\n public readonly model: InputSignal<string> = input<string>('');\n\n /** Подпись усилия. Пусто — кнопки усилия нет. */\n public readonly effort: InputSignal<string> = input<string>('');\n\n /** Подпись режима. Пусто — кнопки режима нет. */\n public readonly mode: InputSignal<string> = input<string>('');\n\n /** Потраченная доля лимита в процентах. `null` — кольца нет. */\n public readonly usage: InputSignal<number | null> = input<number | null>(null);\n\n /** Подсказка кольца по наведению: доля и дата сброса словами приложения. */\n public readonly usageHint: InputSignal<string> = input<string>('');\n\n /** С этой доли кольцо оранжевое. */\n public readonly usageWarnAt: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(80, {\n transform: numberAttribute,\n });\n\n /** Отправка идёт: кнопка крутит индикатор, без `stoppable` поле закрыто. */\n public readonly sending: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Ответ можно остановить: во время `sending` стрелку сменяет «Стоп», поле открыто. */\n public readonly stoppable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Наименьшая высота поля в строках. */\n public readonly minRows: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(1, { transform: numberAttribute });\n\n /** Наибольшая высота поля в строках, дальше текст прокручивается. */\n public readonly maxRows: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(8, { transform: numberAttribute });\n\n /** Черновик: задаётся снаружи, правки уходят наружу, после отправки пуст. */\n public readonly text: ModelSignal<string> = model<string>('');\n\n /** Отправка вопроса. */\n public readonly submitted: OutputEmitterRef<IRtAiPromptInput.SubmitPayload> = output<IRtAiPromptInput.SubmitPayload>();\n\n /** Нажата «Стоп» во время ответа. */\n public readonly stopped: OutputEmitterRef<void> = output<void>();\n\n /** Нажата кнопка модели, усилия или режима. */\n public readonly controlPicked: OutputEmitterRef<IRtAiPromptInput.Control> = output<IRtAiPromptInput.Control>();\n\n /** Ставит фокус в поле. */\n public focus(): void {\n this.textInput()?.nativeElement.focus();\n }\n\n /** Заменяет черновик и ставит курсор в конец: значение пишется в узел сразу, не ждёт отрисовки. */\n public setDraft(text: string): void {\n this.text.set(text);\n const node: HTMLTextAreaElement | undefined = this.textInput()?.nativeElement;\n if (node) {\n node.value = text;\n rtCaretToEnd(node);\n }\n }\n\n protected onInput(event: Event): void {\n this.text.set((event.target as HTMLTextAreaElement).value);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n // Enter без Shift отправляет; подтверждение набора IME не перехватывается.\n if (event.key === 'Enter' && !event.shiftKey && !event.isComposing) {\n event.preventDefault();\n this.submit();\n }\n }\n\n protected pick(control: IRtAiPromptInput.Control): void {\n this.controlPicked.emit(control);\n }\n\n protected stop(): void {\n if (this.isStoppable()) {\n this.stopped.emit();\n }\n }\n\n protected openPicker(): void {\n if (!this.locked()) {\n this.fileInput()?.nativeElement.click();\n }\n }\n\n protected onFilesPicked(event: Event): void {\n const el: HTMLInputElement = event.target as HTMLInputElement;\n const picked: File[] = el.files ? Array.from(el.files) : [];\n if (picked.length > 0) {\n this.files.update((current: File[]): File[] => [...current, ...picked]);\n }\n // Сброс значения: повторный выбор того же файла снова даёт событие.\n el.value = '';\n }\n\n protected removeFile(index: number): void {\n this.files.update((current: File[]): File[] => current.filter((_: File, i: number): boolean => i !== index));\n }\n\n protected submit(): void {\n if (!this.canSend()) {\n return;\n }\n this.submitted.emit({ text: this.text().trim(), files: this.attachments() ? this.files() : [] });\n this.text.set('');\n this.files.set([]);\n }\n}\n","<ng-container rtBlock=\"rt-ai-prompt-input\">\n @if (hintAbove()) {\n <p rtElem=\"hint\" qa-dataid=\"ai-prompt-input-hint\" [rtMod]=\"{ above: true }\">{{ hintText() }}</p>\n }\n\n <div rtElem=\"box\" qa-dataid=\"ai-prompt-input-box\" [rtMod]=\"boxMods()\">\n @if (attachments() && files().length) {\n <div rtElem=\"files\" qa-dataid=\"ai-prompt-input-files\">\n @for (file of files(); track $index) {\n <rt-file-card\n showRemove\n qa-dataid=\"ai-prompt-input-file\"\n size=\"sm\"\n [name]=\"file.name\"\n [sizeBytes]=\"file.size\"\n [disabled]=\"locked()\"\n (removed)=\"removeFile($index)\" />\n }\n </div>\n }\n\n <textarea\n #textEl\n rtElem=\"input\"\n qa-dataid=\"ai-prompt-input-field\"\n cdkTextareaAutosize\n [attr.aria-label]=\"t().chatComposerAria\"\n [placeholder]=\"placeholderText()\"\n [value]=\"text()\"\n [disabled]=\"locked()\"\n [cdkAutosizeMinRows]=\"minRows()\"\n [cdkAutosizeMaxRows]=\"maxRows()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"></textarea>\n\n <div rtElem=\"actions\">\n @if (attachments()) {\n <input\n #fileEl\n qa-dataid=\"ai-prompt-input-file-input\"\n type=\"file\"\n hidden\n multiple\n [attr.accept]=\"accept() || null\"\n (change)=\"onFilesPicked($event)\" />\n <rt-icon-button\n qa-dataid=\"ai-prompt-input-attach\"\n icon=\"ico-plus\"\n iconColor=\"muted\"\n size=\"sm\"\n variant=\"ghost\"\n [ariaLabel]=\"t().chatAttachAria\"\n [tooltip]=\"t().chatAttachTooltip\"\n [disabled]=\"locked()\"\n (clicked)=\"openPicker()\" />\n }\n\n <ng-content select=\"[rtPromptInputStart]\" />\n\n <div rtElem=\"controls\">\n <ng-content select=\"[rtPromptInputEnd]\" />\n\n @if (model()) {\n <button\n rtButton\n rtElem=\"control\"\n qa-dataid=\"ai-prompt-input-model\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n [label]=\"model()\"\n [attr.aria-label]=\"t().aiPromptModelAria + ': ' + model()\"\n [disabled]=\"disabled()\"\n (click)=\"pick('model')\"></button>\n }\n\n @if (effort()) {\n <button\n rtButton\n rtElem=\"control\"\n qa-dataid=\"ai-prompt-input-effort\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n [rtMod]=\"{ muted: true }\"\n [label]=\"effort()\"\n [attr.aria-label]=\"t().aiPromptEffortAria + ': ' + effort()\"\n [disabled]=\"disabled()\"\n (click)=\"pick('effort')\"></button>\n }\n\n @if (mode()) {\n <button\n rtButton\n rtElem=\"control\"\n qa-dataid=\"ai-prompt-input-mode\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n [rtMod]=\"{ muted: true }\"\n [label]=\"mode()\"\n [attr.aria-label]=\"t().aiPromptModeAria + ': ' + mode()\"\n [disabled]=\"disabled()\"\n (click)=\"pick('mode')\"></button>\n }\n\n @if (hasUsage()) {\n <rt-usage-ring qa-dataid=\"ai-prompt-input-usage\" [value]=\"usage() ?? 0\" [warnAt]=\"usageWarnAt()\" [hint]=\"usageHint()\" />\n }\n\n @if (isStoppable()) {\n <rt-icon-button\n qa-dataid=\"ai-prompt-input-stop\"\n icon=\"stop\"\n size=\"sm\"\n variant=\"primary\"\n [ariaLabel]=\"t().chatStopAria\"\n [tooltip]=\"t().chatStopLabel\"\n (clicked)=\"stop()\" />\n } @else {\n <rt-icon-button\n qa-dataid=\"ai-prompt-input-send\"\n icon=\"arrow-up\"\n size=\"sm\"\n variant=\"primary\"\n [ariaLabel]=\"t().chatSendAria\"\n [tooltip]=\"t().chatSendLabel\"\n [loading]=\"sending()\"\n [disabled]=\"!canSend()\"\n (clicked)=\"submit()\" />\n }\n </div>\n </div>\n </div>\n\n @if (hintBelow()) {\n <p rtElem=\"hint\" qa-dataid=\"ai-prompt-input-hint\">{{ hintText() }}</p>\n }\n</ng-container>\n"],"mappings":"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"}
@@ -172,6 +172,7 @@ const RT_KIT_LABELS_EN = {
172
172
  uiChangeAgent: "Change agent",
173
173
  uiChooseFile: "Choose file",
174
174
  uiChooseMonth: "Choose month and year",
175
+ uiChooseYear: "Choose year",
175
176
  uiClear: "Clear",
176
177
  uiClearFilters: "Clear filters",
177
178
  uiClearSelection: "Clear selection",
@@ -203,6 +204,7 @@ const RT_KIT_LABELS_EN = {
203
204
  uiDaysMany: COUNT_DAYS,
204
205
  uiDaysOne: "{{count}} day",
205
206
  uiDaysOther: COUNT_DAYS,
207
+ uiDecrease: "Decrease",
206
208
  uiDetails: "Details",
207
209
  uiDiscardChanges: "Discard Changes",
208
210
  uiDone: "Done",
@@ -248,6 +250,7 @@ const RT_KIT_LABELS_EN = {
248
250
  uiImageUploadChoose: "Choose file",
249
251
  uiImageUploadDrop: "Drag and drop an image here or",
250
252
  uiImageUploadImage: "Current image",
253
+ uiIncrease: "Increase",
251
254
  uiInviteUser: "Invite user",
252
255
  uiItemsPerPage: "Items per page",
253
256
  uiLast30Days: "Last 30 days",
@@ -267,6 +270,7 @@ const RT_KIT_LABELS_EN = {
267
270
  uiNextMonth: "Next month",
268
271
  uiNextPage: "Next page",
269
272
  uiNextYear: "Next year",
273
+ uiNextYears: "Next 12 years",
270
274
  uiNightGridAria: "Occupancy grid",
271
275
  uiNoData: "No data yet",
272
276
  uiNoOptions: "No options",
@@ -277,16 +281,20 @@ const RT_KIT_LABELS_EN = {
277
281
  uiOpenCalendar: "Open the calendar",
278
282
  uiPageOf: "Page {{page}} of {{last}}",
279
283
  uiPagination: "Pagination",
284
+ uiPercentagePoints: "{{value}} pp",
280
285
  uiPerPage: "Items per page:",
281
286
  uiPeriod: "Period",
282
287
  uiPickAgent: "Select an agent",
283
288
  uiPickAnotherAgent: "Select a different agent",
284
289
  uiPickEndDate: "Pick the end date",
290
+ uiPickMonth: "choose a month",
285
291
  uiPickStartDate: "Pick the start date",
286
292
  uiPickTransition: "Select a transition",
293
+ uiPickYear: "choose a year",
287
294
  uiPrevMonth: "Previous month",
288
295
  uiPrevPage: "Previous page",
289
296
  uiPrevYear: "Previous year",
297
+ uiPrevYears: "Previous 12 years",
290
298
  uiProfile: "Profile",
291
299
  uiQuickRanges: "Quick ranges",
292
300
  uiRangeEmpty: "0 of 0",
@@ -1268,7 +1276,9 @@ const RT_DESIGN_TOKEN_NAMES = [
1268
1276
  "--rt-color-stepper-current-subtle",
1269
1277
  "--rt-color-stepper-progress",
1270
1278
  "--rt-color-stepper-track",
1279
+ "--rt-color-table-bg",
1271
1280
  "--rt-color-table-head-bg",
1281
+ "--rt-color-table-pinned-shadow",
1272
1282
  "--rt-color-text-disabled",
1273
1283
  "--rt-color-text-inverse",
1274
1284
  "--rt-color-text-link",
@@ -1566,8 +1576,10 @@ const RT_DESIGN_TOKEN_NAMES = [
1566
1576
  "--rt-neutral-950",
1567
1577
  "--rt-opacity-disabled",
1568
1578
  "--rt-overlay-amber-16",
1579
+ "--rt-overlay-black-16",
1569
1580
  "--rt-overlay-black-4",
1570
1581
  "--rt-overlay-black-50",
1582
+ "--rt-overlay-black-64",
1571
1583
  "--rt-overlay-black-8",
1572
1584
  "--rt-overlay-brand-24",
1573
1585
  "--rt-overlay-brand-8",