@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.
- package/README.md +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +14 -8
- package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +97 -0
- package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +10 -3
- package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +81 -0
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs +99 -1
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +5 -5
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +16 -4
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +124 -25
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +3 -3
- package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +64 -27
- package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-message.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs +46 -0
- package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +336 -12
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs +16 -2
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +3 -3
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +31 -5
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2.mjs +3 -0
- package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
- package/package.json +13 -1
- package/rt-tools-ui-kit-v2-0.19.1.tgz +0 -0
- package/src/assets/icons/sparkle.svg +9 -0
- package/src/assets/icons/thumb-down.svg +10 -0
- package/src/assets/icons/thumb-up.svg +9 -0
- package/src/assets/icons/trash-x.svg +7 -0
- package/src/assets/icons-material/sparkle.fill.svg +5 -0
- package/src/assets/icons-material/sparkle.svg +5 -0
- package/src/assets/icons-material/thumb-down.fill.svg +5 -0
- package/src/assets/icons-material/thumb-down.svg +5 -0
- package/src/assets/icons-material/thumb-up.fill.svg +5 -0
- package/src/assets/icons-material/thumb-up.svg +5 -0
- package/src/assets/icons-material/trash-x.fill.svg +5 -0
- package/src/assets/icons-material/trash-x.svg +5 -0
- package/src/lib/components/action-bar/CONTEXT.md +8 -2
- package/src/lib/components/action-bar/rt-action-bar-holder.component.scss +10 -7
- package/src/lib/components/action-bar/rt-action-bar.component.scss +82 -34
- package/src/lib/components/ai-run-status/CONTEXT.md +41 -0
- package/src/lib/components/ai-run-status/rt-ai-run-status.component.scss +158 -0
- package/src/lib/components/aside/CONTEXT.md +1 -0
- package/src/lib/components/aside/header/rt-aside-header.component.scss +27 -11
- package/src/lib/components/copy-value/CONTEXT.md +31 -0
- package/src/lib/components/copy-value/rt-copy-value.component.scss +39 -0
- package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +5 -5
- package/src/lib/components/data-table/CONTEXT.md +5 -0
- package/src/lib/components/dynamic-selector/CONTEXT.md +18 -0
- package/src/lib/components/dynamic-selector/list/rt-dynamic-selector-list.component.scss +29 -1
- package/src/lib/components/dynamic-selector/popup/rt-dynamic-selector-popup.component.scss +84 -25
- package/src/lib/components/empty-state/CONTEXT.md +2 -1
- package/src/lib/components/empty-state/rt-empty-state.component.scss +4 -2
- package/src/lib/components/icon/CONTEXT.md +16 -12
- package/src/lib/components/icon/rt-icon.component.scss +13 -3
- package/src/lib/components/prompt-suggestion/CONTEXT.md +29 -0
- package/src/lib/components/prompt-suggestion/rt-prompt-suggestion.component.scss +58 -0
- package/src/lib/components/select/CONTEXT.md +2 -2
- package/src/lib/components/thread-list/CONTEXT.md +4 -0
- package/src/lib/components/thread-list/rt-thread-list.component.scss +29 -0
- package/src/lib/components/toolbar/CONTEXT.md +4 -0
- package/src/lib/components/toolbar/rt-toolbar.component.scss +7 -0
- package/src/rich-editor/lib/components/ai-chat/CONTEXT.md +58 -0
- package/src/rich-editor/lib/components/ai-chat/answer/rt-ai-chat-answer.component.scss +12 -0
- package/src/rich-editor/lib/components/ai-chat/rt-ai-chat.component.scss +222 -0
- package/src/rich-editor/lib/components/rich-editor/rt-rich-editor.component.scss +3 -0
- package/src/styles/_scrollbar.scss +9 -0
- package/styles/tokens.css +3 -0
- package/types/rt-tools-ui-kit-v2-action-bar.d.ts +11 -2
- package/types/rt-tools-ui-kit-v2-ai-run-status.d.ts +49 -0
- package/types/rt-tools-ui-kit-v2-aside.d.ts +9 -1
- package/types/rt-tools-ui-kit-v2-copy-value.d.ts +29 -0
- package/types/rt-tools-ui-kit-v2-core.d.ts +94 -54
- package/types/rt-tools-ui-kit-v2-data-table.d.ts +7 -0
- package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +44 -5
- package/types/rt-tools-ui-kit-v2-icon.d.ts +12 -4
- package/types/rt-tools-ui-kit-v2-prompt-suggestion.d.ts +21 -0
- package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +186 -2
- package/types/rt-tools-ui-kit-v2-select.d.ts +6 -0
- package/types/rt-tools-ui-kit-v2-thread-list.d.ts +15 -2
- package/types/rt-tools-ui-kit-v2.d.ts +3 -0
- package/rt-tools-ui-kit-v2-0.18.0.tgz +0 -0
|
@@ -322,7 +322,7 @@ class RtTabsComponent {
|
|
|
322
322
|
// angular
|
|
323
323
|
NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type:
|
|
324
324
|
// standalone components / directives
|
|
325
|
-
RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "size", "color", "fill", "spin", "rotate"] }, { kind: "directive", type: RtTooltipDirective, selector: "[rtTooltip]", inputs: ["rtTooltip", "rtTooltipPlacement", "rtTooltipWhenTruncated"], exportAs: ["rtTooltip"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
325
|
+
RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "glyphStrategy", "size", "color", "fill", "spin", "rotate"] }, { kind: "directive", type: RtTooltipDirective, selector: "[rtTooltip]", inputs: ["rtTooltip", "rtTooltipPlacement", "rtTooltipWhenTruncated"], exportAs: ["rtTooltip"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
326
326
|
}
|
|
327
327
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtTabsComponent, decorators: [{
|
|
328
328
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rt-tools-ui-kit-v2-tabs.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tab.directive.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs-control.directive.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs.component.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs.component.html","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tools-ui-kit-v2-tabs.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n Directive,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n TemplateRef,\n} from '@angular/core';\n\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { IRtTabs } from './rt-tabs.model';\n\n/**\n * Декларирует одну вкладку `<rt-tabs>`. Ставится на `<ng-template>`: контент\n * шаблона становится телом панели и рендерится только когда вкладка активна.\n *\n * Метаданные (label, icon, disabled, badge, invalid) — signal-inputs, поэтому\n * шапка вкладки реагирует на их изменение без ручной перерегистрации. Сам\n * список вкладок `rt-tabs` собирает через `contentChildren`.\n */\n@Directive({\n selector: '[rtTab]',\n})\nexport class RtTabDirective {\n readonly #t_uiTabInvalid: Signal<string> = rtKitLabel('uiTabInvalid');\n\n /** Шаблон тела панели — рендерится в области контента при активной вкладке. */\n public readonly templateRef: TemplateRef<unknown> = inject<TemplateRef<unknown>>(TemplateRef);\n\n /** Стабильный идентификатор вкладки (значение атрибута `rtTab`). */\n public readonly id: InputSignal<IRtTabs.Id> = input<IRtTabs.Id>('', { alias: 'rtTab' });\n\n /** Текстовый заголовок. Игнорируется, если задан `titleTemplate`. */\n public readonly label: InputSignal<string> = input<string>('');\n\n /** Кастомный шаблон заголовка — замещает `label`. */\n public readonly titleTemplate: InputSignal<TemplateRef<unknown> | null> = input<TemplateRef<unknown> | null>(null);\n\n /** Иконка слева от заголовка. */\n public readonly icon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Семантический цвет иконки заголовка. */\n public readonly iconColor: InputSignal<IRtTabs.TitleColor> = input<IRtTabs.TitleColor>('current');\n\n /** Значение бейджа справа от заголовка (число/строка). `null` — без бейджа. */\n public readonly badge: InputSignal<string | number | null> = input<string | number | null>(null);\n\n /**\n * Подсказка при наведении на бейдж. Подсказка самой кнопки занята неверной вкладкой,\n * поэтому у бейджа своя. Пусто — подсказки нет.\n */\n public readonly badgeTitle: InputSignal<string> = input<string>('');\n\n /**\n * Подпись бейджа для чтения с экрана: точка или число сами по себе не говорят, что значат.\n * Пусто — атрибут не ставится, и озвучивается значение бейджа как есть.\n */\n public readonly badgeAriaLabel: InputSignal<string> = input<string>('');\n\n /** Заблокированная вкладка: не выбирается и не получает фокус. */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Скрытая вкладка: не рендерится ни в шапке, ни в контенте. */\n public readonly hidden: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Вкладка с ошибками: подсвечивается danger-цветом. */\n public readonly invalid: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Подсказка для невалидной вкладки. Пусто — берётся переведённое умолчание. */\n public readonly invalidMessage: InputSignal<string> = input<string>('');\n\n /** Готовый текст подсказки: своя формулировка важнее умолчания. */\n public readonly invalidTitle: Signal<string> = computed((): string => this.invalidMessage() || this.#t_uiTabInvalid());\n}\n","import { Directive, inject, input, InputSignalWithTransform, TemplateRef } from '@angular/core';\n\nimport { IRtTabs } from './rt-tabs.model';\n\n/**\n * Декларирует header-контрол `<rt-tabs>` — произвольный шаблон (кнопка, фильтр),\n * который рендерится слева или справа от полосы вкладок. Ставится на\n * `<ng-template>`; `rt-tabs` собирает контролы через `contentChildren` и\n * раскладывает по сторонам согласно `side`.\n */\n@Directive({\n selector: '[rtTabsControl]',\n})\nexport class RtTabsControlDirective {\n /** Шаблон контрола, выводимый в header-слоте. */\n public readonly templateRef: TemplateRef<unknown> = inject<TemplateRef<unknown>>(TemplateRef);\n\n /**\n * Сторона размещения относительно полосы вкладок.\n *\n * Пустое значение приводится к правой стороне: `<ng-template rtTabsControl>` без значения\n * задаёт входу пустую строку, а не умолчание, и такой контрол не попадал ни в левый слот,\n * ни в правый — он пропадал из шапки вовсе.\n */\n public readonly side: InputSignalWithTransform<IRtTabs.ControlSide, IRtTabs.ControlSide | ''> = input<\n IRtTabs.ControlSide,\n IRtTabs.ControlSide | ''\n >('right', {\n alias: 'rtTabsControl',\n transform: (value: IRtTabs.ControlSide | ''): IRtTabs.ControlSide => (value === '' ? 'right' : value),\n });\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n DestroyRef,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { debounceTime, fromEvent } from 'rxjs';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { RtTabDirective } from './rt-tab.directive';\nimport { RtTabsControlDirective } from './rt-tabs-control.directive';\nimport { IRtTabs } from './rt-tabs.model';\n\n/** Шаг ручной прокрутки полосы вкладок за один тик удержания стрелки (px). */\nconst SCROLL_STEP: number = 12;\n\n/** Интервал тика прокрутки при зажатой стрелке (мс). */\nconst SCROLL_TICK_MS: number = 15;\n\n/** Дебаунс пересчёта видимости стрелок прокрутки на resize/scroll (мс). */\nconst REST_DEBOUNCE_MS: number = 50;\n\nconst BEM_BLOCK: string = 'rt-tabs';\n\ntype TScrollDirection = 'before' | 'after';\n\n/**\n * Полоса вкладок с проекцией контента. Вкладки декларируются через\n * `<ng-template rtTab=\"id\" label=\"…\">…</ng-template>` (см. {@link RtTabDirective}),\n * собираются `contentChildren` и рендерятся как header-кнопки + активная панель.\n * Опциональные header-контролы — через `[rtTabsControl]`.\n *\n * Компонент \"controlled-ish\": активная вкладка берётся из `activeId` (если\n * задан), иначе — из внутреннего выбора, иначе — первая доступная. Клик/клавиша\n * эмиттят `activeIdChange`; синхронизацию `activeId` оставляем потребителю.\n *\n * Горизонтальная полоса при переполнении прячет вкладки под скролл и показывает\n * стрелки-«хвосты» (`__rest`) с прокруткой по удержанию. Вертикальная ориентация\n * раскладывает вкладки в колонку без стрелок.\n *\n * Доступность: `role=\"tablist\"`/`role=\"tab\"`/`role=\"tabpanel\"`, `aria-selected`,\n * roving `tabindex`, навигация стрелками + Home/End.\n */\n@Component({\n selector: 'rt-tabs',\n templateUrl: './rt-tabs.component.html',\n styleUrl: './rt-tabs.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // angular\n NgTemplateOutlet,\n\n // standalone components / directives\n RtIconComponent,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-tabs--direction--horizontal]': \"direction() === 'horizontal'\",\n '[class.rt-tabs--direction--vertical]': \"direction() === 'vertical'\",\n },\n})\nexport class RtTabsComponent {\n /** `Window` через `DOCUMENT` (SSR-safe: `defaultView` может быть `null`). */\n readonly #win: Window | null = inject(DOCUMENT).defaultView;\n\n /** Все задекларированные вкладки (включая скрытые). */\n protected readonly tabs: Signal<readonly RtTabDirective[]> = contentChildren(RtTabDirective);\n\n /** Все header-контролы. */\n protected readonly controls: Signal<readonly RtTabsControlDirective[]> = contentChildren(RtTabsControlDirective);\n\n /** Видимые вкладки (без `hidden`). */\n protected readonly visibleTabs: Signal<readonly RtTabDirective[]> = computed((): readonly RtTabDirective[] =>\n this.tabs().filter((tab: RtTabDirective): boolean => !tab.hidden())\n );\n\n protected readonly leftControls: Signal<readonly RtTabsControlDirective[]> = computed((): readonly RtTabsControlDirective[] =>\n this.controls().filter((c: RtTabsControlDirective): boolean => c.side() === 'left')\n );\n\n protected readonly rightControls: Signal<readonly RtTabsControlDirective[]> = computed((): readonly RtTabsControlDirective[] =>\n this.controls().filter((c: RtTabsControlDirective): boolean => c.side() === 'right')\n );\n\n /**\n * Эффективный id активной вкладки. Приоритет: контролируемый `activeId` →\n * внутренний выбор → первая доступная. Кандидат валидируется по множеству\n * видимых незаблокированных вкладок, поэтому корректно реагирует на\n * асинхронную загрузку/смену набора вкладок.\n */\n protected readonly selectedId: Signal<IRtTabs.Id | null> = computed((): IRtTabs.Id | null => {\n const enabled: readonly RtTabDirective[] = this.visibleTabs().filter((tab: RtTabDirective): boolean => !tab.disabled());\n const candidate: IRtTabs.Id | null = this.activeId() ?? this.#internalId();\n const candidateValid: boolean = candidate !== null && enabled.some((tab: RtTabDirective): boolean => tab.id() === candidate);\n\n let result: IRtTabs.Id | null;\n if (candidateValid) {\n result = candidate;\n } else if (enabled.length) {\n result = enabled[0].id();\n } else {\n result = null;\n }\n\n return result;\n });\n\n /** Активная вкладка целиком (для рендера панели). */\n protected readonly activeTab: Signal<RtTabDirective | null> = computed(\n (): RtTabDirective | null => this.visibleTabs().find((tab: RtTabDirective): boolean => tab.id() === this.selectedId()) ?? null\n );\n\n /** Видны ли стрелки прокрутки слева/справа (только горизонтальная полоса). */\n protected readonly restBeforeVisible: WritableSignal<boolean> = signal(false);\n protected readonly restAfterVisible: WritableSignal<boolean> = signal(false);\n\n protected readonly tabListRef: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('tabList');\n\n /** Контролируемый активный id. `null` — компонент сам выбирает первую вкладку. */\n public readonly activeId: InputSignal<IRtTabs.Id | null> = input<IRtTabs.Id | null>(null);\n\n /** Ориентация полосы. */\n public readonly direction: InputSignal<IRtTabs.Direction> = input<IRtTabs.Direction>('horizontal');\n\n /** Растягивать вкладки на всю ширину полосы. */\n public readonly stretch: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Скроллить область контента при переполнении. */\n public readonly contentScrollable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /** Эмиттит id вкладки при её выборе (клик/клавиатура). */\n public readonly activeIdChange: OutputEmitterRef<IRtTabs.Id> = output<IRtTabs.Id>();\n\n /** Внутренний выбор (uncontrolled-ветка). */\n readonly #internalId: WritableSignal<IRtTabs.Id | null> = signal<IRtTabs.Id | null>(null);\n\n /** Хэндл интервала прокрутки по удержанию стрелки. */\n #scrollIntervalId: number | null = null;\n\n constructor() {\n if (this.#win) {\n fromEvent(this.#win, 'resize')\n .pipe(debounceTime(REST_DEBOUNCE_MS), takeUntilDestroyed())\n .subscribe((): void => this.#updateRestVisibility());\n }\n\n afterNextRender((): void => this.#updateRestVisibility());\n\n // Снимаем hold-scroll интервал при уничтожении: если компонент разрушить\n // с зажатой стрелкой (pointerdown без pointerup), интервал остался бы жив.\n inject(DestroyRef).onDestroy((): void => this.#clearScrollInterval());\n }\n\n protected selectTab(id: IRtTabs.Id): void {\n const target: RtTabDirective | undefined = this.visibleTabs().find((tab: RtTabDirective): boolean => tab.id() === id);\n\n if (!target || target.disabled()) {\n return;\n }\n\n this.#internalId.set(id);\n this.activeIdChange.emit(id);\n this.#scrollTabIntoView(id);\n }\n\n /** Навигация по вкладкам с клавиатуры (automatic activation). */\n protected onTabKeydown(event: KeyboardEvent): void {\n const enabled: readonly RtTabDirective[] = this.visibleTabs().filter((tab: RtTabDirective): boolean => !tab.disabled());\n\n if (!enabled.length) {\n return;\n }\n\n const isVertical: boolean = this.direction() === 'vertical';\n const nextKey: string = isVertical ? 'ArrowDown' : 'ArrowRight';\n const prevKey: string = isVertical ? 'ArrowUp' : 'ArrowLeft';\n const currentIndex: number = enabled.findIndex((tab: RtTabDirective): boolean => tab.id() === this.selectedId());\n\n // Карта клавиша → целевой индекс (без if/else-if цепочки).\n const moveByKey: ReadonlyMap<string, number> = new Map<string, number>([\n [nextKey, (currentIndex + 1) % enabled.length],\n [prevKey, (currentIndex - 1 + enabled.length) % enabled.length],\n ['Home', 0],\n ['End', enabled.length - 1],\n ]);\n\n const targetIndex: number | undefined = moveByKey.get(event.key);\n\n if (targetIndex === undefined) {\n return;\n }\n\n event.preventDefault();\n const targetId: IRtTabs.Id = enabled[targetIndex].id();\n this.selectTab(targetId);\n this.#focusTab(targetId);\n }\n\n /** Старт прокрутки полосы по удержанию ЛКМ на стрелке. */\n protected onRestPointerDown(direction: TScrollDirection, event: MouseEvent): void {\n if (event.button !== 0 || this.#scrollIntervalId !== null || !this.#win) {\n return;\n }\n\n this.#scrollIntervalId = this.#win.setInterval((): void => {\n this.#scrollStep(direction);\n this.#updateRestVisibility();\n }, SCROLL_TICK_MS);\n }\n\n protected onRestPointerUp(): void {\n this.#clearScrollInterval();\n }\n\n protected onTabListScroll(): void {\n this.#updateRestVisibility();\n }\n\n #clearScrollInterval(): void {\n if (this.#win && this.#scrollIntervalId !== null) {\n this.#win.clearInterval(this.#scrollIntervalId);\n this.#scrollIntervalId = null;\n }\n }\n\n #scrollStep(direction: TScrollDirection): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n if (!list) {\n return;\n }\n\n const scrolledLeft: number = list.scrollLeft;\n const scrolledRight: number = list.scrollWidth - list.scrollLeft - list.clientWidth;\n const remaining: number = direction === 'before' ? scrolledLeft : scrolledRight;\n\n if (remaining > 0) {\n list.scrollBy(direction === 'before' ? -SCROLL_STEP : SCROLL_STEP, 0);\n }\n\n if (remaining - SCROLL_STEP <= 0) {\n this.#clearScrollInterval();\n }\n }\n\n #updateRestVisibility(): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n\n if (!list || this.direction() !== 'horizontal') {\n this.restBeforeVisible.set(false);\n this.restAfterVisible.set(false);\n return;\n }\n\n const scrolledRight: number = list.scrollWidth - list.scrollLeft - list.clientWidth;\n\n this.restBeforeVisible.set(list.scrollLeft > 0);\n // 1px — погрешность субпиксельного scrollWidth\n this.restAfterVisible.set(scrolledRight > 1);\n }\n\n #scrollTabIntoView(id: IRtTabs.Id): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n const tab: HTMLElement | null | undefined = list?.querySelector<HTMLElement>(`[data-tabid=\"${id}\"]`);\n\n if (!list || !tab) {\n return;\n }\n\n const viewLeft: number = list.scrollLeft;\n const viewRight: number = list.scrollLeft + list.clientWidth;\n\n if (tab.offsetLeft < viewLeft) {\n list.scrollTo({ left: tab.offsetLeft });\n } else if (tab.offsetLeft + tab.offsetWidth > viewRight) {\n list.scrollTo({ left: tab.offsetLeft + tab.offsetWidth - list.clientWidth });\n } else {\n // вкладка целиком в зоне видимости — прокрутка не нужна\n }\n }\n\n #focusTab(id: IRtTabs.Id): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n list?.querySelector<HTMLElement>(`[data-tabid=\"${id}\"]`)?.focus();\n }\n}\n","<ng-container rtBlock=\"rt-tabs\">\n <div rtElem=\"header\">\n @if (leftControls().length) {\n <div rtElem=\"controls\" [rtMod]=\"{ before: true }\">\n @for (control of leftControls(); track $index) {\n <ng-container [ngTemplateOutlet]=\"control.templateRef\" />\n }\n </div>\n }\n\n <div rtElem=\"tab-list-wrapper\">\n <div\n rtElem=\"rest\"\n qa-dataid=\"tabs-scroll-prev\"\n [rtMod]=\"{ before: true, visible: restBeforeVisible() }\"\n (mousedown)=\"onRestPointerDown('before', $event)\"\n (mouseup)=\"onRestPointerUp()\"\n (mouseleave)=\"onRestPointerUp()\">\n <rt-icon name=\"chevron-left\" color=\"current\" size=\"sm\" />\n </div>\n\n <div\n #tabList\n rtElem=\"tab-list\"\n qa-dataid=\"tabs-tab-list\"\n role=\"tablist\"\n [rtMod]=\"{ stretch: stretch(), direction: direction() }\"\n [attr.aria-orientation]=\"direction()\"\n (scroll)=\"onTabListScroll()\">\n @for (tab of visibleTabs(); track tab.id()) {\n <button\n rtBlock=\"rt-tab-item\"\n qa-dataid=\"tabs-tab\"\n type=\"button\"\n role=\"tab\"\n [rtMod]=\"{\n selected: tab.id() === selectedId(),\n disabled: tab.disabled(),\n invalid: tab.invalid(),\n stretch: stretch(),\n }\"\n [id]=\"'rt-tab-' + tab.id()\"\n [disabled]=\"tab.disabled()\"\n [attr.data-tabid]=\"tab.id()\"\n [attr.aria-selected]=\"tab.id() === selectedId()\"\n [attr.aria-controls]=\"'rt-tabpanel-' + tab.id()\"\n [attr.tabindex]=\"tab.id() === selectedId() ? 0 : -1\"\n [rtTooltip]=\"tab.invalid() ? tab.invalidTitle() : ''\"\n (click)=\"selectTab(tab.id())\"\n (keydown)=\"onTabKeydown($event)\">\n @if (tab.icon(); as icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"icon\" [color]=\"tab.iconColor()\" />\n }\n\n @if (tab.titleTemplate(); as titleTpl) {\n <ng-container [ngTemplateOutlet]=\"titleTpl\" />\n } @else {\n <span rtElem=\"title\">{{ tab.label() }}</span>\n }\n\n @if (tab.badge() !== null) {\n <!-- В одну строку: перенос внутри добавил бы пробел в текст кнопки. -->\n <!-- prettier-ignore -->\n <span rtElem=\"badge\" [rtTooltip]=\"tab.badgeTitle()\" [attr.aria-label]=\"tab.badgeAriaLabel() || null\">{{ tab.badge() }}</span>\n }\n </button>\n }\n </div>\n\n <div\n rtElem=\"rest\"\n qa-dataid=\"tabs-scroll-next\"\n [rtMod]=\"{ after: true, visible: restAfterVisible() }\"\n (mousedown)=\"onRestPointerDown('after', $event)\"\n (mouseup)=\"onRestPointerUp()\"\n (mouseleave)=\"onRestPointerUp()\">\n <rt-icon name=\"chevron-right\" color=\"current\" size=\"sm\" />\n </div>\n </div>\n\n @if (rightControls().length) {\n <div rtElem=\"controls\" [rtMod]=\"{ after: true }\">\n @for (control of rightControls(); track $index) {\n <ng-container [ngTemplateOutlet]=\"control.templateRef\" />\n }\n </div>\n }\n </div>\n\n @if (activeTab(); as tab) {\n <div\n rtElem=\"content\"\n qa-dataid=\"tabs-panel\"\n role=\"tabpanel\"\n tabindex=\"0\"\n [rtMod]=\"{ scrollable: contentScrollable() }\"\n [id]=\"'rt-tabpanel-' + tab.id()\"\n [attr.aria-labelledby]=\"'rt-tab-' + tab.id()\">\n <ng-container [ngTemplateOutlet]=\"tab.templateRef\" />\n </div>\n }\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-tabs.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tab.directive.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs-control.directive.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs.component.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs.component.html","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tools-ui-kit-v2-tabs.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n Directive,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n TemplateRef,\n} from '@angular/core';\n\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { IRtTabs } from './rt-tabs.model';\n\n/**\n * Декларирует одну вкладку `<rt-tabs>`. Ставится на `<ng-template>`: контент\n * шаблона становится телом панели и рендерится только когда вкладка активна.\n *\n * Метаданные (label, icon, disabled, badge, invalid) — signal-inputs, поэтому\n * шапка вкладки реагирует на их изменение без ручной перерегистрации. Сам\n * список вкладок `rt-tabs` собирает через `contentChildren`.\n */\n@Directive({\n selector: '[rtTab]',\n})\nexport class RtTabDirective {\n readonly #t_uiTabInvalid: Signal<string> = rtKitLabel('uiTabInvalid');\n\n /** Шаблон тела панели — рендерится в области контента при активной вкладке. */\n public readonly templateRef: TemplateRef<unknown> = inject<TemplateRef<unknown>>(TemplateRef);\n\n /** Стабильный идентификатор вкладки (значение атрибута `rtTab`). */\n public readonly id: InputSignal<IRtTabs.Id> = input<IRtTabs.Id>('', { alias: 'rtTab' });\n\n /** Текстовый заголовок. Игнорируется, если задан `titleTemplate`. */\n public readonly label: InputSignal<string> = input<string>('');\n\n /** Кастомный шаблон заголовка — замещает `label`. */\n public readonly titleTemplate: InputSignal<TemplateRef<unknown> | null> = input<TemplateRef<unknown> | null>(null);\n\n /** Иконка слева от заголовка. */\n public readonly icon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Семантический цвет иконки заголовка. */\n public readonly iconColor: InputSignal<IRtTabs.TitleColor> = input<IRtTabs.TitleColor>('current');\n\n /** Значение бейджа справа от заголовка (число/строка). `null` — без бейджа. */\n public readonly badge: InputSignal<string | number | null> = input<string | number | null>(null);\n\n /**\n * Подсказка при наведении на бейдж. Подсказка самой кнопки занята неверной вкладкой,\n * поэтому у бейджа своя. Пусто — подсказки нет.\n */\n public readonly badgeTitle: InputSignal<string> = input<string>('');\n\n /**\n * Подпись бейджа для чтения с экрана: точка или число сами по себе не говорят, что значат.\n * Пусто — атрибут не ставится, и озвучивается значение бейджа как есть.\n */\n public readonly badgeAriaLabel: InputSignal<string> = input<string>('');\n\n /** Заблокированная вкладка: не выбирается и не получает фокус. */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Скрытая вкладка: не рендерится ни в шапке, ни в контенте. */\n public readonly hidden: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Вкладка с ошибками: подсвечивается danger-цветом. */\n public readonly invalid: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Подсказка для невалидной вкладки. Пусто — берётся переведённое умолчание. */\n public readonly invalidMessage: InputSignal<string> = input<string>('');\n\n /** Готовый текст подсказки: своя формулировка важнее умолчания. */\n public readonly invalidTitle: Signal<string> = computed((): string => this.invalidMessage() || this.#t_uiTabInvalid());\n}\n","import { Directive, inject, input, InputSignalWithTransform, TemplateRef } from '@angular/core';\n\nimport { IRtTabs } from './rt-tabs.model';\n\n/**\n * Декларирует header-контрол `<rt-tabs>` — произвольный шаблон (кнопка, фильтр),\n * который рендерится слева или справа от полосы вкладок. Ставится на\n * `<ng-template>`; `rt-tabs` собирает контролы через `contentChildren` и\n * раскладывает по сторонам согласно `side`.\n */\n@Directive({\n selector: '[rtTabsControl]',\n})\nexport class RtTabsControlDirective {\n /** Шаблон контрола, выводимый в header-слоте. */\n public readonly templateRef: TemplateRef<unknown> = inject<TemplateRef<unknown>>(TemplateRef);\n\n /**\n * Сторона размещения относительно полосы вкладок.\n *\n * Пустое значение приводится к правой стороне: `<ng-template rtTabsControl>` без значения\n * задаёт входу пустую строку, а не умолчание, и такой контрол не попадал ни в левый слот,\n * ни в правый — он пропадал из шапки вовсе.\n */\n public readonly side: InputSignalWithTransform<IRtTabs.ControlSide, IRtTabs.ControlSide | ''> = input<\n IRtTabs.ControlSide,\n IRtTabs.ControlSide | ''\n >('right', {\n alias: 'rtTabsControl',\n transform: (value: IRtTabs.ControlSide | ''): IRtTabs.ControlSide => (value === '' ? 'right' : value),\n });\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n DestroyRef,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { debounceTime, fromEvent } from 'rxjs';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { RtTabDirective } from './rt-tab.directive';\nimport { RtTabsControlDirective } from './rt-tabs-control.directive';\nimport { IRtTabs } from './rt-tabs.model';\n\n/** Шаг ручной прокрутки полосы вкладок за один тик удержания стрелки (px). */\nconst SCROLL_STEP: number = 12;\n\n/** Интервал тика прокрутки при зажатой стрелке (мс). */\nconst SCROLL_TICK_MS: number = 15;\n\n/** Дебаунс пересчёта видимости стрелок прокрутки на resize/scroll (мс). */\nconst REST_DEBOUNCE_MS: number = 50;\n\nconst BEM_BLOCK: string = 'rt-tabs';\n\ntype TScrollDirection = 'before' | 'after';\n\n/**\n * Полоса вкладок с проекцией контента. Вкладки декларируются через\n * `<ng-template rtTab=\"id\" label=\"…\">…</ng-template>` (см. {@link RtTabDirective}),\n * собираются `contentChildren` и рендерятся как header-кнопки + активная панель.\n * Опциональные header-контролы — через `[rtTabsControl]`.\n *\n * Компонент \"controlled-ish\": активная вкладка берётся из `activeId` (если\n * задан), иначе — из внутреннего выбора, иначе — первая доступная. Клик/клавиша\n * эмиттят `activeIdChange`; синхронизацию `activeId` оставляем потребителю.\n *\n * Горизонтальная полоса при переполнении прячет вкладки под скролл и показывает\n * стрелки-«хвосты» (`__rest`) с прокруткой по удержанию. Вертикальная ориентация\n * раскладывает вкладки в колонку без стрелок.\n *\n * Доступность: `role=\"tablist\"`/`role=\"tab\"`/`role=\"tabpanel\"`, `aria-selected`,\n * roving `tabindex`, навигация стрелками + Home/End.\n */\n@Component({\n selector: 'rt-tabs',\n templateUrl: './rt-tabs.component.html',\n styleUrl: './rt-tabs.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // angular\n NgTemplateOutlet,\n\n // standalone components / directives\n RtIconComponent,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-tabs--direction--horizontal]': \"direction() === 'horizontal'\",\n '[class.rt-tabs--direction--vertical]': \"direction() === 'vertical'\",\n },\n})\nexport class RtTabsComponent {\n /** `Window` через `DOCUMENT` (SSR-safe: `defaultView` может быть `null`). */\n readonly #win: Window | null = inject(DOCUMENT).defaultView;\n\n /** Все задекларированные вкладки (включая скрытые). */\n protected readonly tabs: Signal<readonly RtTabDirective[]> = contentChildren(RtTabDirective);\n\n /** Все header-контролы. */\n protected readonly controls: Signal<readonly RtTabsControlDirective[]> = contentChildren(RtTabsControlDirective);\n\n /** Видимые вкладки (без `hidden`). */\n protected readonly visibleTabs: Signal<readonly RtTabDirective[]> = computed((): readonly RtTabDirective[] =>\n this.tabs().filter((tab: RtTabDirective): boolean => !tab.hidden())\n );\n\n protected readonly leftControls: Signal<readonly RtTabsControlDirective[]> = computed((): readonly RtTabsControlDirective[] =>\n this.controls().filter((c: RtTabsControlDirective): boolean => c.side() === 'left')\n );\n\n protected readonly rightControls: Signal<readonly RtTabsControlDirective[]> = computed((): readonly RtTabsControlDirective[] =>\n this.controls().filter((c: RtTabsControlDirective): boolean => c.side() === 'right')\n );\n\n /**\n * Эффективный id активной вкладки. Приоритет: контролируемый `activeId` →\n * внутренний выбор → первая доступная. Кандидат валидируется по множеству\n * видимых незаблокированных вкладок, поэтому корректно реагирует на\n * асинхронную загрузку/смену набора вкладок.\n */\n protected readonly selectedId: Signal<IRtTabs.Id | null> = computed((): IRtTabs.Id | null => {\n const enabled: readonly RtTabDirective[] = this.visibleTabs().filter((tab: RtTabDirective): boolean => !tab.disabled());\n const candidate: IRtTabs.Id | null = this.activeId() ?? this.#internalId();\n const candidateValid: boolean = candidate !== null && enabled.some((tab: RtTabDirective): boolean => tab.id() === candidate);\n\n let result: IRtTabs.Id | null;\n if (candidateValid) {\n result = candidate;\n } else if (enabled.length) {\n result = enabled[0].id();\n } else {\n result = null;\n }\n\n return result;\n });\n\n /** Активная вкладка целиком (для рендера панели). */\n protected readonly activeTab: Signal<RtTabDirective | null> = computed(\n (): RtTabDirective | null => this.visibleTabs().find((tab: RtTabDirective): boolean => tab.id() === this.selectedId()) ?? null\n );\n\n /** Видны ли стрелки прокрутки слева/справа (только горизонтальная полоса). */\n protected readonly restBeforeVisible: WritableSignal<boolean> = signal(false);\n protected readonly restAfterVisible: WritableSignal<boolean> = signal(false);\n\n protected readonly tabListRef: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('tabList');\n\n /** Контролируемый активный id. `null` — компонент сам выбирает первую вкладку. */\n public readonly activeId: InputSignal<IRtTabs.Id | null> = input<IRtTabs.Id | null>(null);\n\n /** Ориентация полосы. */\n public readonly direction: InputSignal<IRtTabs.Direction> = input<IRtTabs.Direction>('horizontal');\n\n /** Растягивать вкладки на всю ширину полосы. */\n public readonly stretch: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Скроллить область контента при переполнении. */\n public readonly contentScrollable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /** Эмиттит id вкладки при её выборе (клик/клавиатура). */\n public readonly activeIdChange: OutputEmitterRef<IRtTabs.Id> = output<IRtTabs.Id>();\n\n /** Внутренний выбор (uncontrolled-ветка). */\n readonly #internalId: WritableSignal<IRtTabs.Id | null> = signal<IRtTabs.Id | null>(null);\n\n /** Хэндл интервала прокрутки по удержанию стрелки. */\n #scrollIntervalId: number | null = null;\n\n constructor() {\n if (this.#win) {\n fromEvent(this.#win, 'resize')\n .pipe(debounceTime(REST_DEBOUNCE_MS), takeUntilDestroyed())\n .subscribe((): void => this.#updateRestVisibility());\n }\n\n afterNextRender((): void => this.#updateRestVisibility());\n\n // Снимаем hold-scroll интервал при уничтожении: если компонент разрушить\n // с зажатой стрелкой (pointerdown без pointerup), интервал остался бы жив.\n inject(DestroyRef).onDestroy((): void => this.#clearScrollInterval());\n }\n\n protected selectTab(id: IRtTabs.Id): void {\n const target: RtTabDirective | undefined = this.visibleTabs().find((tab: RtTabDirective): boolean => tab.id() === id);\n\n if (!target || target.disabled()) {\n return;\n }\n\n this.#internalId.set(id);\n this.activeIdChange.emit(id);\n this.#scrollTabIntoView(id);\n }\n\n /** Навигация по вкладкам с клавиатуры (automatic activation). */\n protected onTabKeydown(event: KeyboardEvent): void {\n const enabled: readonly RtTabDirective[] = this.visibleTabs().filter((tab: RtTabDirective): boolean => !tab.disabled());\n\n if (!enabled.length) {\n return;\n }\n\n const isVertical: boolean = this.direction() === 'vertical';\n const nextKey: string = isVertical ? 'ArrowDown' : 'ArrowRight';\n const prevKey: string = isVertical ? 'ArrowUp' : 'ArrowLeft';\n const currentIndex: number = enabled.findIndex((tab: RtTabDirective): boolean => tab.id() === this.selectedId());\n\n // Карта клавиша → целевой индекс (без if/else-if цепочки).\n const moveByKey: ReadonlyMap<string, number> = new Map<string, number>([\n [nextKey, (currentIndex + 1) % enabled.length],\n [prevKey, (currentIndex - 1 + enabled.length) % enabled.length],\n ['Home', 0],\n ['End', enabled.length - 1],\n ]);\n\n const targetIndex: number | undefined = moveByKey.get(event.key);\n\n if (targetIndex === undefined) {\n return;\n }\n\n event.preventDefault();\n const targetId: IRtTabs.Id = enabled[targetIndex].id();\n this.selectTab(targetId);\n this.#focusTab(targetId);\n }\n\n /** Старт прокрутки полосы по удержанию ЛКМ на стрелке. */\n protected onRestPointerDown(direction: TScrollDirection, event: MouseEvent): void {\n if (event.button !== 0 || this.#scrollIntervalId !== null || !this.#win) {\n return;\n }\n\n this.#scrollIntervalId = this.#win.setInterval((): void => {\n this.#scrollStep(direction);\n this.#updateRestVisibility();\n }, SCROLL_TICK_MS);\n }\n\n protected onRestPointerUp(): void {\n this.#clearScrollInterval();\n }\n\n protected onTabListScroll(): void {\n this.#updateRestVisibility();\n }\n\n #clearScrollInterval(): void {\n if (this.#win && this.#scrollIntervalId !== null) {\n this.#win.clearInterval(this.#scrollIntervalId);\n this.#scrollIntervalId = null;\n }\n }\n\n #scrollStep(direction: TScrollDirection): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n if (!list) {\n return;\n }\n\n const scrolledLeft: number = list.scrollLeft;\n const scrolledRight: number = list.scrollWidth - list.scrollLeft - list.clientWidth;\n const remaining: number = direction === 'before' ? scrolledLeft : scrolledRight;\n\n if (remaining > 0) {\n list.scrollBy(direction === 'before' ? -SCROLL_STEP : SCROLL_STEP, 0);\n }\n\n if (remaining - SCROLL_STEP <= 0) {\n this.#clearScrollInterval();\n }\n }\n\n #updateRestVisibility(): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n\n if (!list || this.direction() !== 'horizontal') {\n this.restBeforeVisible.set(false);\n this.restAfterVisible.set(false);\n return;\n }\n\n const scrolledRight: number = list.scrollWidth - list.scrollLeft - list.clientWidth;\n\n this.restBeforeVisible.set(list.scrollLeft > 0);\n // 1px — погрешность субпиксельного scrollWidth\n this.restAfterVisible.set(scrolledRight > 1);\n }\n\n #scrollTabIntoView(id: IRtTabs.Id): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n const tab: HTMLElement | null | undefined = list?.querySelector<HTMLElement>(`[data-tabid=\"${id}\"]`);\n\n if (!list || !tab) {\n return;\n }\n\n const viewLeft: number = list.scrollLeft;\n const viewRight: number = list.scrollLeft + list.clientWidth;\n\n if (tab.offsetLeft < viewLeft) {\n list.scrollTo({ left: tab.offsetLeft });\n } else if (tab.offsetLeft + tab.offsetWidth > viewRight) {\n list.scrollTo({ left: tab.offsetLeft + tab.offsetWidth - list.clientWidth });\n } else {\n // вкладка целиком в зоне видимости — прокрутка не нужна\n }\n }\n\n #focusTab(id: IRtTabs.Id): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n list?.querySelector<HTMLElement>(`[data-tabid=\"${id}\"]`)?.focus();\n }\n}\n","<ng-container rtBlock=\"rt-tabs\">\n <div rtElem=\"header\">\n @if (leftControls().length) {\n <div rtElem=\"controls\" [rtMod]=\"{ before: true }\">\n @for (control of leftControls(); track $index) {\n <ng-container [ngTemplateOutlet]=\"control.templateRef\" />\n }\n </div>\n }\n\n <div rtElem=\"tab-list-wrapper\">\n <div\n rtElem=\"rest\"\n qa-dataid=\"tabs-scroll-prev\"\n [rtMod]=\"{ before: true, visible: restBeforeVisible() }\"\n (mousedown)=\"onRestPointerDown('before', $event)\"\n (mouseup)=\"onRestPointerUp()\"\n (mouseleave)=\"onRestPointerUp()\">\n <rt-icon name=\"chevron-left\" color=\"current\" size=\"sm\" />\n </div>\n\n <div\n #tabList\n rtElem=\"tab-list\"\n qa-dataid=\"tabs-tab-list\"\n role=\"tablist\"\n [rtMod]=\"{ stretch: stretch(), direction: direction() }\"\n [attr.aria-orientation]=\"direction()\"\n (scroll)=\"onTabListScroll()\">\n @for (tab of visibleTabs(); track tab.id()) {\n <button\n rtBlock=\"rt-tab-item\"\n qa-dataid=\"tabs-tab\"\n type=\"button\"\n role=\"tab\"\n [rtMod]=\"{\n selected: tab.id() === selectedId(),\n disabled: tab.disabled(),\n invalid: tab.invalid(),\n stretch: stretch(),\n }\"\n [id]=\"'rt-tab-' + tab.id()\"\n [disabled]=\"tab.disabled()\"\n [attr.data-tabid]=\"tab.id()\"\n [attr.aria-selected]=\"tab.id() === selectedId()\"\n [attr.aria-controls]=\"'rt-tabpanel-' + tab.id()\"\n [attr.tabindex]=\"tab.id() === selectedId() ? 0 : -1\"\n [rtTooltip]=\"tab.invalid() ? tab.invalidTitle() : ''\"\n (click)=\"selectTab(tab.id())\"\n (keydown)=\"onTabKeydown($event)\">\n @if (tab.icon(); as icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"icon\" [color]=\"tab.iconColor()\" />\n }\n\n @if (tab.titleTemplate(); as titleTpl) {\n <ng-container [ngTemplateOutlet]=\"titleTpl\" />\n } @else {\n <span rtElem=\"title\">{{ tab.label() }}</span>\n }\n\n @if (tab.badge() !== null) {\n <!-- В одну строку: перенос внутри добавил бы пробел в текст кнопки. -->\n <!-- prettier-ignore -->\n <span rtElem=\"badge\" [rtTooltip]=\"tab.badgeTitle()\" [attr.aria-label]=\"tab.badgeAriaLabel() || null\">{{ tab.badge() }}</span>\n }\n </button>\n }\n </div>\n\n <div\n rtElem=\"rest\"\n qa-dataid=\"tabs-scroll-next\"\n [rtMod]=\"{ after: true, visible: restAfterVisible() }\"\n (mousedown)=\"onRestPointerDown('after', $event)\"\n (mouseup)=\"onRestPointerUp()\"\n (mouseleave)=\"onRestPointerUp()\">\n <rt-icon name=\"chevron-right\" color=\"current\" size=\"sm\" />\n </div>\n </div>\n\n @if (rightControls().length) {\n <div rtElem=\"controls\" [rtMod]=\"{ after: true }\">\n @for (control of rightControls(); track $index) {\n <ng-container [ngTemplateOutlet]=\"control.templateRef\" />\n }\n </div>\n }\n </div>\n\n @if (activeTab(); as tab) {\n <div\n rtElem=\"content\"\n qa-dataid=\"tabs-panel\"\n role=\"tabpanel\"\n tabindex=\"0\"\n [rtMod]=\"{ scrollable: contentScrollable() }\"\n [id]=\"'rt-tabpanel-' + tab.id()\"\n [attr.aria-labelledby]=\"'rt-tab-' + tab.id()\">\n <ng-container [ngTemplateOutlet]=\"tab.templateRef\" />\n </div>\n }\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;AAiBA;;;;;;;AAOG;MAIU,cAAc,CAAA;AAH3B,IAAA,WAAA,GAAA;AAIa,QAAA,IAAA,CAAA,eAAe,GAAmB,UAAU,CAAC,cAAc,CAAC;;AAGrD,QAAA,IAAA,CAAA,WAAW,GAAyB,MAAM,CAAuB,WAAW,CAAC;;QAG7E,IAAA,CAAA,EAAE,GAA4B,KAAK,CAAa,EAAE,0EAAI,KAAK,EAAE,OAAO,EAAA,CAAG;;QAGvE,IAAA,CAAA,KAAK,GAAwB,KAAK,CAAS,EAAE;kFAAC;;QAG9C,IAAA,CAAA,aAAa,GAA6C,KAAK,CAA8B,IAAI;0FAAC;;QAGlG,IAAA,CAAA,IAAI,GAAqC,KAAK,CAAsB,IAAI;iFAAC;;QAGzE,IAAA,CAAA,SAAS,GAAoC,KAAK,CAAqB,SAAS;sFAAC;;QAGjF,IAAA,CAAA,KAAK,GAAwC,KAAK,CAAyB,IAAI;kFAAC;AAEhG;;;AAGG;QACa,IAAA,CAAA,UAAU,GAAwB,KAAK,CAAS,EAAE;uFAAC;AAEnE;;;AAGG;QACa,IAAA,CAAA,cAAc,GAAwB,KAAK,CAAS,EAAE;2FAAC;;QAGvD,IAAA,CAAA,QAAQ,GAAoD,KAAK,CAAwB,KAAK,gFAC1G,SAAS,EAAE,gBAAgB,EAAA,CAC7B;;QAGc,IAAA,CAAA,MAAM,GAAoD,KAAK,CAAwB,KAAK,8EACxG,SAAS,EAAE,gBAAgB,EAAA,CAC7B;;QAGc,IAAA,CAAA,OAAO,GAAoD,KAAK,CAAwB,KAAK,+EACzG,SAAS,EAAE,gBAAgB,EAAA,CAC7B;;QAGc,IAAA,CAAA,cAAc,GAAwB,KAAK,CAAS,EAAE;2FAAC;;AAGvD,QAAA,IAAA,CAAA,YAAY,GAAmB,QAAQ,CAAC,MAAc,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE;yFAAC;AACzH,IAAA;AAvDY,IAAA,eAAe;8GADf,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,SAAS;AACtB,iBAAA;;;ACvBD;;;;;AAKG;MAIU,sBAAsB,CAAA;AAHnC,IAAA,WAAA,GAAA;;AAKoB,QAAA,IAAA,CAAA,WAAW,GAAyB,MAAM,CAAuB,WAAW,CAAC;AAE7F;;;;;;AAMG;AACa,QAAA,IAAA,CAAA,IAAI,GAA4E,KAAK,CAGnG,OAAO,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,MAAA,EAAA,8BAAA,EAAA,CAAA,EACL,KAAK,EAAE,eAAe;YACtB,SAAS,EAAE,CAAC,KAA+B,MAA2B,KAAK,KAAK,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC,GACvG;AACL,IAAA;8GAlBY,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,iBAAiB;AAC9B,iBAAA;;;ACuBD;AACA,MAAM,WAAW,GAAW,EAAE;AAE9B;AACA,MAAM,cAAc,GAAW,EAAE;AAEjC;AACA,MAAM,gBAAgB,GAAW,EAAE;AAEnC,MAAM,SAAS,GAAW,SAAS;AAInC;;;;;;;;;;;;;;;;AAgBG;MAwBU,eAAe,CAAA;;AAEf,IAAA,IAAI;;AA2EJ,IAAA,WAAW;;AAGpB,IAAA,iBAAiB;AAEjB,IAAA,WAAA,GAAA;;AAhFS,QAAA,IAAA,CAAA,IAAI,GAAkB,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW;;QAGxC,IAAA,CAAA,IAAI,GAAsC,eAAe,CAAC,cAAc;iFAAC;;QAGzE,IAAA,CAAA,QAAQ,GAA8C,eAAe,CAAC,sBAAsB;qFAAC;;QAG7F,IAAA,CAAA,WAAW,GAAsC,QAAQ,CAAC,MACzE,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,GAAmB,KAAc,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;wFACtE;QAEkB,IAAA,CAAA,YAAY,GAA8C,QAAQ,CAAC,MAClF,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAyB,KAAc,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC;yFACtF;QAEkB,IAAA,CAAA,aAAa,GAA8C,QAAQ,CAAC,MACnF,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAyB,KAAc,CAAC,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC;0FACvF;AAED;;;;;AAKG;AACgB,QAAA,IAAA,CAAA,UAAU,GAA8B,QAAQ,CAAC,MAAwB;YACxF,MAAM,OAAO,GAA8B,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,GAAmB,KAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACvH,MAAM,SAAS,GAAsB,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE;YAC1E,MAAM,cAAc,GAAY,SAAS,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,GAAmB,KAAc,GAAG,CAAC,EAAE,EAAE,KAAK,SAAS,CAAC;AAE5H,YAAA,IAAI,MAAyB;YAC7B,IAAI,cAAc,EAAE;gBAChB,MAAM,GAAG,SAAS;YACtB;AAAO,iBAAA,IAAI,OAAO,CAAC,MAAM,EAAE;gBACvB,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5B;iBAAO;gBACH,MAAM,GAAG,IAAI;YACjB;AAEA,YAAA,OAAO,MAAM;QACjB,CAAC;uFAAC;;AAGiB,QAAA,IAAA,CAAA,SAAS,GAAkC,QAAQ,CAClE,MAA6B,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,GAAmB,KAAc,GAAG,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,IAAI;sFACjI;;QAGkB,IAAA,CAAA,iBAAiB,GAA4B,MAAM,CAAC,KAAK;8FAAC;QAC1D,IAAA,CAAA,gBAAgB,GAA4B,MAAM,CAAC,KAAK;6FAAC;QAEzD,IAAA,CAAA,UAAU,GAAgD,SAAS,CAA0B,SAAS;uFAAC;;QAG1G,IAAA,CAAA,QAAQ,GAAmC,KAAK,CAAoB,IAAI;qFAAC;;QAGzE,IAAA,CAAA,SAAS,GAAmC,KAAK,CAAoB,YAAY;sFAAC;;QAGlF,IAAA,CAAA,OAAO,GAAoD,KAAK,CAAwB,KAAK,+EACzG,SAAS,EAAE,gBAAgB,EAAA,CAC7B;;QAGc,IAAA,CAAA,iBAAiB,GAAoD,KAAK,CAAwB,IAAI,yFAClH,SAAS,EAAE,gBAAgB,EAAA,CAC7B;;QAGc,IAAA,CAAA,cAAc,GAAiC,MAAM,EAAc;;QAG1E,IAAA,CAAA,WAAW,GAAsC,MAAM,CAAoB,IAAI;wFAAC;;QAGzF,IAAA,CAAA,iBAAiB,GAAkB,IAAI;AAGnC,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;AACX,YAAA,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ;iBACxB,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,kBAAkB,EAAE;iBACzD,SAAS,CAAC,MAAY,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC5D;QAEA,eAAe,CAAC,MAAY,IAAI,CAAC,qBAAqB,EAAE,CAAC;;;AAIzD,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAY,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACzE;AAEU,IAAA,SAAS,CAAC,EAAc,EAAA;QAC9B,MAAM,MAAM,GAA+B,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,GAAmB,KAAc,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;QAErH,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE;YAC9B;QACJ;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;IAC/B;;AAGU,IAAA,YAAY,CAAC,KAAoB,EAAA;QACvC,MAAM,OAAO,GAA8B,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,GAAmB,KAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;AAEvH,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACjB;QACJ;QAEA,MAAM,UAAU,GAAY,IAAI,CAAC,SAAS,EAAE,KAAK,UAAU;QAC3D,MAAM,OAAO,GAAW,UAAU,GAAG,WAAW,GAAG,YAAY;QAC/D,MAAM,OAAO,GAAW,UAAU,GAAG,SAAS,GAAG,WAAW;QAC5D,MAAM,YAAY,GAAW,OAAO,CAAC,SAAS,CAAC,CAAC,GAAmB,KAAc,GAAG,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;;AAGhH,QAAA,MAAM,SAAS,GAAgC,IAAI,GAAG,CAAiB;YACnE,CAAC,OAAO,EAAE,CAAC,YAAY,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC;AAC9C,YAAA,CAAC,OAAO,EAAE,CAAC,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;YAC/D,CAAC,MAAM,EAAE,CAAC,CAAC;AACX,YAAA,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9B,SAAA,CAAC;QAEF,MAAM,WAAW,GAAuB,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;AAEhE,QAAA,IAAI,WAAW,KAAK,SAAS,EAAE;YAC3B;QACJ;QAEA,KAAK,CAAC,cAAc,EAAE;QACtB,MAAM,QAAQ,GAAe,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE;AACtD,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;IAC5B;;IAGU,iBAAiB,CAAC,SAA2B,EAAE,KAAiB,EAAA;AACtE,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACrE;QACJ;QAEA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAW;AACtD,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;YAC3B,IAAI,CAAC,qBAAqB,EAAE;QAChC,CAAC,EAAE,cAAc,CAAC;IACtB;IAEU,eAAe,GAAA;QACrB,IAAI,CAAC,oBAAoB,EAAE;IAC/B;IAEU,eAAe,GAAA;QACrB,IAAI,CAAC,qBAAqB,EAAE;IAChC;IAEA,oBAAoB,GAAA;QAChB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,EAAE;YAC9C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAC/C,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QACjC;IACJ;AAEA,IAAA,WAAW,CAAC,SAA2B,EAAA;QACnC,MAAM,IAAI,GAA4B,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa;QACtE,IAAI,CAAC,IAAI,EAAE;YACP;QACJ;AAEA,QAAA,MAAM,YAAY,GAAW,IAAI,CAAC,UAAU;AAC5C,QAAA,MAAM,aAAa,GAAW,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW;AACnF,QAAA,MAAM,SAAS,GAAW,SAAS,KAAK,QAAQ,GAAG,YAAY,GAAG,aAAa;AAE/E,QAAA,IAAI,SAAS,GAAG,CAAC,EAAE;AACf,YAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,QAAQ,GAAG,CAAC,WAAW,GAAG,WAAW,EAAE,CAAC,CAAC;QACzE;AAEA,QAAA,IAAI,SAAS,GAAG,WAAW,IAAI,CAAC,EAAE;YAC9B,IAAI,CAAC,oBAAoB,EAAE;QAC/B;IACJ;IAEA,qBAAqB,GAAA;QACjB,MAAM,IAAI,GAA4B,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa;QAEtE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,YAAY,EAAE;AAC5C,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;AACjC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;YAChC;QACJ;AAEA,QAAA,MAAM,aAAa,GAAW,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW;QAEnF,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;;QAE/C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC;IAChD;AAEA,IAAA,kBAAkB,CAAC,EAAc,EAAA;QAC7B,MAAM,IAAI,GAA4B,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa;QACtE,MAAM,GAAG,GAAmC,IAAI,EAAE,aAAa,CAAc,CAAA,aAAA,EAAgB,EAAE,CAAA,EAAA,CAAI,CAAC;AAEpG,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;YACf;QACJ;AAEA,QAAA,MAAM,QAAQ,GAAW,IAAI,CAAC,UAAU;QACxC,MAAM,SAAS,GAAW,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW;AAE5D,QAAA,IAAI,GAAG,CAAC,UAAU,GAAG,QAAQ,EAAE;YAC3B,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3C;aAAO,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,WAAW,GAAG,SAAS,EAAE;AACrD,YAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAChF;aAAO;;QAEP;IACJ;AAEA,IAAA,SAAS,CAAC,EAAc,EAAA;QACpB,MAAM,IAAI,GAA4B,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa;QACtE,IAAI,EAAE,aAAa,CAAc,CAAA,aAAA,EAAgB,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE;IACrE;8GAlOS,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,sCAAA,EAAA,8BAAA,EAAA,oCAAA,EAAA,4BAAA,EAAA,EAAA,cAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,MAAA,EAAA,SAAA,EAKqD,cAAc,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAGF,sBAAsB,oKChGnH,osJAsGA,EAAA,MAAA,EAAA,CAAA,glIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA;;gBD7BQ,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA;;AAGhB,gBAAA,eAAe,2IACf,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,oBAAA,EAAA,wBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,cAAc,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,aAAa,wEACb,YAAY,EAAA,QAAA,EAAA,SAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAQP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAvB3B,SAAS;+BACI,SAAS,EAAA,eAAA,EAGF,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;;wBAEL,gBAAgB;;wBAGhB,eAAe;wBACf,kBAAkB;wBAClB,cAAc;wBACd,aAAa;wBACb,YAAY;qBACf,EAAA,IAAA,EACK;AACF,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,wCAAwC,EAAE,8BAA8B;AACxE,wBAAA,sCAAsC,EAAE,4BAA4B;AACvE,qBAAA,EAAA,QAAA,EAAA,osJAAA,EAAA,MAAA,EAAA,CAAA,glIAAA,CAAA,EAAA;sHAO4E,cAAc,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAGF,sBAAsB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CA+CC,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE/I7H;;AAEG;;;;"}
|
|
@@ -97,7 +97,7 @@ class RtTagComponent {
|
|
|
97
97
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtTagComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
98
98
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtTagComponent, isStandalone: true, selector: "rt-tag", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, severity: { classPropertyName: "severity", publicName: "severity", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconEnd: { classPropertyName: "iconEnd", publicName: "iconEnd", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, host: { classAttribute: "rt-tag" }, viewQueries: [{ propertyName: "textRef", first: true, predicate: ["text"], descendants: true, isSignal: true }], hostDirectives: [{ directive: i1.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<span\n rtBlock=\"rt-tag\"\n qa-dataid=\"tag\"\n [attr.data-severity]=\"severity()\"\n [rtMod]=\"{\n severity: severity(),\n size: size(),\n appearance: appearance(),\n closable: closable(),\n }\">\n @if (icon(); as iconName) {\n <rt-icon rtElem=\"icon\" [size]=\"iconSize()\" [name]=\"iconName\" />\n }\n <!--\n \u0426\u0435\u043B\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430, \u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043E\u0433\u0434\u0430 \u043F\u043E\u0434\u043F\u0438\u0441\u0438 \u043D\u0435 \u0445\u0432\u0430\u0442\u0438\u043B\u043E \u043C\u0435\u0441\u0442\u0430:\n \u0443\u0440\u0435\u0437\u0430\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \u0431\u0435\u0437 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u043A\u0430\u043A \u0446\u0435\u043B\u044B\u0439 \u2014 \u0443\u0437\u043D\u0430\u0442\u044C, \u0433\u0434\u0435 \u043E\u043D \u043D\u0430 \u0434\u0435\u043B\u0435 \u043A\u043E\u043D\u0447\u0430\u0435\u0442\u0441\u044F,\n \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0443 \u043D\u0435\u043E\u0442\u043A\u0443\u0434\u0430. \u041F\u0443\u0441\u0442\u043E\u0439 \u0442\u0435\u043A\u0441\u0442 \u0434\u0438\u0440\u0435\u043A\u0442\u0438\u0432\u0443 \u0432\u044B\u043A\u043B\u044E\u0447\u0430\u0435\u0442.\n -->\n <span rtElem=\"text\" qa-dataid=\"tag-text\" #text [rtTooltip]=\"overflowing() ? value() : ''\">{{ value() }}</span>\n @if (iconEnd(); as iconEndName) {\n <rt-icon rtElem=\"icon-end\" [size]=\"iconSize()\" [name]=\"iconEndName\" />\n }\n @if (closable()) {\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"tag-close\"\n icon=\"ico-close\"\n variant=\"ghost\"\n size=\"sm\"\n radius=\"full\"\n [ariaLabel]=\"t().uiRemove\"\n (clicked)=\"onClose($event)\" />\n }\n</span>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-tag{--rt-tag-radius: var(--rt-radius-full);--rt-tag-border-width: var(--rt-border-width-thin);display:inline-flex;max-width:100%}rt-tag .rt-tag{--rt-tag-severity-bg: var(--rt-neutral-100);--rt-tag-severity-text: var(--rt-neutral-700);--rt-tag-size-padding-block: var(--rt-space-1);--rt-tag-size-padding-inline: var(--rt-space-2);display:inline-flex;max-width:100%;align-items:center;padding:var(--rt-tag-padding-block, var(--rt-tag-size-padding-block)) var(--rt-tag-padding-inline, var(--rt-tag-size-padding-inline));border-radius:var(--rt-tag-radius);background:var(--rt-tag-color-bg, var(--rt-tag-severity-bg));color:var(--rt-tag-color-text, var(--rt-tag-severity-text));font-size:var(--rt-text-sm);gap:var(--rt-space-1);letter-spacing:var(--rt-tag-letter-spacing);line-height:var(--rt-leading-tight)}rt-tag .rt-tag--size--sm{--rt-tag-size-padding-block: var(--rt-space-0-5);--rt-tag-size-padding-inline: var(--rt-space-1);font-size:var(--rt-text-xs);gap:var(--rt-space-0-5)}rt-tag .rt-tag--size--md{--rt-tag-size-padding-block: var(--rt-space-1);--rt-tag-size-padding-inline: var(--rt-space-2);font-size:var(--rt-text-sm);gap:var(--rt-space-1)}rt-tag .rt-tag--size--lg{--rt-tag-size-padding-block: var(--rt-space-2);--rt-tag-size-padding-inline: var(--rt-space-4);font-size:var(--rt-text-md);gap:var(--rt-space-2)}rt-tag .rt-tag--severity--info{--rt-tag-severity-bg: var(--rt-color-state-info-bg);--rt-tag-severity-text: var(--rt-color-state-info)}rt-tag .rt-tag--severity--success{--rt-tag-severity-bg: var(--rt-color-state-success-bg);--rt-tag-severity-text: var(--rt-color-state-success)}rt-tag .rt-tag--severity--warning{--rt-tag-severity-bg: var(--rt-color-state-warning-bg);--rt-tag-severity-text: var(--rt-color-state-warning)}rt-tag .rt-tag--severity--danger{--rt-tag-severity-bg: var(--rt-color-state-danger-bg);--rt-tag-severity-text: var(--rt-color-state-danger)}rt-tag .rt-tag--severity--secondary,rt-tag .rt-tag--severity--neutral{--rt-tag-severity-bg: var(--rt-color-bg-subtle);--rt-tag-severity-text: var(--rt-color-text-primary)}rt-tag .rt-tag--appearance--outlined{--rt-tag-severity-bg: transparent;border:var(--rt-tag-border-width) solid var(--rt-tag-color-border, currentcolor)}rt-tag .rt-tag__icon{flex-shrink:0}rt-tag .rt-tag__icon-end{flex-shrink:0}rt-tag .rt-tag__text{overflow:hidden;min-width:0;line-height:var(--rt-leading-none);text-overflow:ellipsis;white-space:nowrap}rt-tag .rt-tag__close{margin-inline-start:var(--rt-space-0-5)}rt-tag[data-rt-radius=none]{--rt-tag-radius: var(--rt-radius-none)}rt-tag[data-rt-radius=xs]{--rt-tag-radius: var(--rt-radius-xs)}rt-tag[data-rt-radius=sm]{--rt-tag-radius: var(--rt-radius-sm)}rt-tag[data-rt-radius=ms]{--rt-tag-radius: var(--rt-radius-ms)}rt-tag[data-rt-radius=md]{--rt-tag-radius: var(--rt-radius-md)}rt-tag[data-rt-radius=lg]{--rt-tag-radius: var(--rt-radius-lg)}rt-tag[data-rt-radius=xl]{--rt-tag-radius: var(--rt-radius-xl)}rt-tag[data-rt-radius=\"2xl\"]{--rt-tag-radius: var(--rt-radius-2xl)}rt-tag[data-rt-radius=full]{--rt-tag-radius: var(--rt-radius-full)}}\n"], dependencies: [{ kind: "component", type:
|
|
99
99
|
// standalone components / directives
|
|
100
|
-
RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "size", "color", "fill", "spin", "rotate"] }, { kind: "component", type: RtIconButtonComponent, selector: "rt-icon-button", inputs: ["icon", "glyph", "ariaLabel", "variant", "iconColor", "iconFill", "size", "iconSize", "type", "tooltip", "tabIndex", "loading", "disabled", "active", "indicator"], outputs: ["clicked"] }, { kind: "directive", type: RtTooltipDirective, selector: "[rtTooltip]", inputs: ["rtTooltip", "rtTooltipPlacement", "rtTooltipWhenTruncated"], exportAs: ["rtTooltip"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
100
|
+
RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "glyphStrategy", "size", "color", "fill", "spin", "rotate"] }, { kind: "component", type: RtIconButtonComponent, selector: "rt-icon-button", inputs: ["icon", "glyph", "ariaLabel", "variant", "iconColor", "iconFill", "size", "iconSize", "type", "tooltip", "tabIndex", "loading", "disabled", "active", "indicator"], outputs: ["clicked"] }, { kind: "directive", type: RtTooltipDirective, selector: "[rtTooltip]", inputs: ["rtTooltip", "rtTooltipPlacement", "rtTooltipWhenTruncated"], exportAs: ["rtTooltip"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
101
101
|
}
|
|
102
102
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtTagComponent, decorators: [{
|
|
103
103
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rt-tools-ui-kit-v2-tag.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/tag/rt-tag.component.ts","../../../projects/ui-kit-v2/src/lib/components/tag/rt-tag.component.html","../../../projects/ui-kit-v2/src/lib/components/tag/rt-tools-ui-kit-v2-tag.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n afterRenderEffect,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OnDestroy,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { IRtTag } from './rt-tag.model';\n\nconst BEM_BLOCK: string = 'rt-tag';\n\n/** Ступень значка по ступени пилюли. `md` оставляет значок таким, каким он был до ступеней. */\nconst ICON_BY_SIZE: Readonly<Record<IRtTag.Size, IRtIcon.Size>> = { sm: 'xs', md: 'sm', lg: 'md' };\n\n/**\n * Status/label pill для отображения статусов и счётчиков.\n * Поддерживает 6 severity-вариантов (`info` / `success` / `warning` / `danger` /\n * `secondary` / `neutral`), любой шаг скругления входом `radius` и опциональный close-control\n * (рендерит `rt-icon-button` с иконкой `ico-close` и emits `closed` MouseEvent).\n *\n * Все цвета — через семантические `--rt-color-state-*` токены; layout через\n * primitive `--rt-space-*` / `--rt-radius-*` / `--rt-text-*`. BEM-разметка через\n * директивы `rtBlock` / `rtElem` / `rtMod` из `@rt-tools/core`.\n */\n@Component({\n selector: 'rt-tag',\n templateUrl: './rt-tag.component.html',\n styleUrl: './rt-tag.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconComponent,\n RtIconButtonComponent,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtTagComponent implements OnDestroy {\n /** Текст pill — обязательный input. */\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n #resizeObserver: ResizeObserver | null = null;\n\n protected readonly textRef: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('text');\n\n /** Подписи не хватило места: она урезана многоточием, и целое значение показывает подсказка. */\n protected readonly overflowing: WritableSignal<boolean> = signal<boolean>(false);\n\n /** Размер значка ведёт ступень пилюли: свой вход у него был бы вторым числом об одном. */\n protected readonly iconSize: Signal<IRtIcon.Size> = computed((): IRtIcon.Size => ICON_BY_SIZE[this.size()]);\n\n public readonly value: InputSignal<string> = input.required<string>();\n\n /** Семантическая палитра. По умолчанию `neutral` (нейтральный серый). */\n public readonly severity: InputSignal<IRtTag.Severity> = input<IRtTag.Severity>('neutral');\n\n /**\n * Ступень размера. Умолчание `md` — тот размер, каким метка рисовалась до появления ступеней.\n * Отступы, кегль и значок двигаются вместе: кегль, названный отдельно, оставил бы отступы от\n * другой ступени, и ряд пилюль перестал бы выстраиваться.\n */\n public readonly size: InputSignal<IRtTag.Size> = input<IRtTag.Size>('md');\n\n /** Вид заливки. По умолчанию `solid`; `outlined` — прозрачный фон + рамка. */\n public readonly appearance: InputSignal<IRtTag.Appearance> = input<IRtTag.Appearance>('solid');\n\n /** Префикс-иконка слева от текста. `null` (дефолт) — без иконки. */\n public readonly icon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Суффикс-иконка справа от текста (напр. `external-link` у тега-ссылки). */\n public readonly iconEnd: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Рендерит крестик `rt-icon-button` справа от текста. */\n public readonly closable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Эмиттит MouseEvent при клике на close-button (только если `closable=true`). */\n public readonly closed: OutputEmitterRef<MouseEvent> = output<MouseEvent>();\n\n constructor() {\n afterRenderEffect((): void => {\n this.value();\n this.size();\n this.#observeText();\n this.#measure();\n });\n }\n\n public ngOnDestroy(): void {\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = null;\n }\n\n protected onClose(event: MouseEvent): void {\n event.stopPropagation();\n this.closed.emit(event);\n }\n\n /**\n * Переполнение считается наблюдателем за размером, а не отсчётом после отрисовки: отсчёт\n * отвечает о машине, а не о раскладке — на свободной его всегда хватает, на занятой нет, а\n * подпись, переполнившаяся позже, подсказки не получила бы вовсе.\n */\n #observeText(): void {\n const node: HTMLElement | undefined = this.textRef()?.nativeElement;\n\n if (node === undefined || this.#resizeObserver !== null || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n this.#resizeObserver = new ResizeObserver((): void => this.#measure());\n this.#resizeObserver.observe(node);\n }\n\n #measure(): void {\n const node: HTMLElement | undefined = this.textRef()?.nativeElement;\n\n if (node !== undefined) {\n this.overflowing.set(node.scrollWidth > node.clientWidth);\n }\n }\n}\n","<span\n rtBlock=\"rt-tag\"\n qa-dataid=\"tag\"\n [attr.data-severity]=\"severity()\"\n [rtMod]=\"{\n severity: severity(),\n size: size(),\n appearance: appearance(),\n closable: closable(),\n }\">\n @if (icon(); as iconName) {\n <rt-icon rtElem=\"icon\" [size]=\"iconSize()\" [name]=\"iconName\" />\n }\n <!--\n Целое значение показывает подсказка, и только когда подписи не хватило места:\n урезанный текст без подсказки читается как целый — узнать, где он на деле кончается,\n человеку неоткуда. Пустой текст директиву выключает.\n -->\n <span rtElem=\"text\" qa-dataid=\"tag-text\" #text [rtTooltip]=\"overflowing() ? value() : ''\">{{ value() }}</span>\n @if (iconEnd(); as iconEndName) {\n <rt-icon rtElem=\"icon-end\" [size]=\"iconSize()\" [name]=\"iconEndName\" />\n }\n @if (closable()) {\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"tag-close\"\n icon=\"ico-close\"\n variant=\"ghost\"\n size=\"sm\"\n radius=\"full\"\n [ariaLabel]=\"t().uiRemove\"\n (clicked)=\"onClose($event)\" />\n }\n</span>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-tag.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/tag/rt-tag.component.ts","../../../projects/ui-kit-v2/src/lib/components/tag/rt-tag.component.html","../../../projects/ui-kit-v2/src/lib/components/tag/rt-tools-ui-kit-v2-tag.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n afterRenderEffect,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OnDestroy,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { IRtTag } from './rt-tag.model';\n\nconst BEM_BLOCK: string = 'rt-tag';\n\n/** Ступень значка по ступени пилюли. `md` оставляет значок таким, каким он был до ступеней. */\nconst ICON_BY_SIZE: Readonly<Record<IRtTag.Size, IRtIcon.Size>> = { sm: 'xs', md: 'sm', lg: 'md' };\n\n/**\n * Status/label pill для отображения статусов и счётчиков.\n * Поддерживает 6 severity-вариантов (`info` / `success` / `warning` / `danger` /\n * `secondary` / `neutral`), любой шаг скругления входом `radius` и опциональный close-control\n * (рендерит `rt-icon-button` с иконкой `ico-close` и emits `closed` MouseEvent).\n *\n * Все цвета — через семантические `--rt-color-state-*` токены; layout через\n * primitive `--rt-space-*` / `--rt-radius-*` / `--rt-text-*`. BEM-разметка через\n * директивы `rtBlock` / `rtElem` / `rtMod` из `@rt-tools/core`.\n */\n@Component({\n selector: 'rt-tag',\n templateUrl: './rt-tag.component.html',\n styleUrl: './rt-tag.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconComponent,\n RtIconButtonComponent,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtTagComponent implements OnDestroy {\n /** Текст pill — обязательный input. */\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n #resizeObserver: ResizeObserver | null = null;\n\n protected readonly textRef: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('text');\n\n /** Подписи не хватило места: она урезана многоточием, и целое значение показывает подсказка. */\n protected readonly overflowing: WritableSignal<boolean> = signal<boolean>(false);\n\n /** Размер значка ведёт ступень пилюли: свой вход у него был бы вторым числом об одном. */\n protected readonly iconSize: Signal<IRtIcon.Size> = computed((): IRtIcon.Size => ICON_BY_SIZE[this.size()]);\n\n public readonly value: InputSignal<string> = input.required<string>();\n\n /** Семантическая палитра. По умолчанию `neutral` (нейтральный серый). */\n public readonly severity: InputSignal<IRtTag.Severity> = input<IRtTag.Severity>('neutral');\n\n /**\n * Ступень размера. Умолчание `md` — тот размер, каким метка рисовалась до появления ступеней.\n * Отступы, кегль и значок двигаются вместе: кегль, названный отдельно, оставил бы отступы от\n * другой ступени, и ряд пилюль перестал бы выстраиваться.\n */\n public readonly size: InputSignal<IRtTag.Size> = input<IRtTag.Size>('md');\n\n /** Вид заливки. По умолчанию `solid`; `outlined` — прозрачный фон + рамка. */\n public readonly appearance: InputSignal<IRtTag.Appearance> = input<IRtTag.Appearance>('solid');\n\n /** Префикс-иконка слева от текста. `null` (дефолт) — без иконки. */\n public readonly icon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Суффикс-иконка справа от текста (напр. `external-link` у тега-ссылки). */\n public readonly iconEnd: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Рендерит крестик `rt-icon-button` справа от текста. */\n public readonly closable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Эмиттит MouseEvent при клике на close-button (только если `closable=true`). */\n public readonly closed: OutputEmitterRef<MouseEvent> = output<MouseEvent>();\n\n constructor() {\n afterRenderEffect((): void => {\n this.value();\n this.size();\n this.#observeText();\n this.#measure();\n });\n }\n\n public ngOnDestroy(): void {\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = null;\n }\n\n protected onClose(event: MouseEvent): void {\n event.stopPropagation();\n this.closed.emit(event);\n }\n\n /**\n * Переполнение считается наблюдателем за размером, а не отсчётом после отрисовки: отсчёт\n * отвечает о машине, а не о раскладке — на свободной его всегда хватает, на занятой нет, а\n * подпись, переполнившаяся позже, подсказки не получила бы вовсе.\n */\n #observeText(): void {\n const node: HTMLElement | undefined = this.textRef()?.nativeElement;\n\n if (node === undefined || this.#resizeObserver !== null || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n this.#resizeObserver = new ResizeObserver((): void => this.#measure());\n this.#resizeObserver.observe(node);\n }\n\n #measure(): void {\n const node: HTMLElement | undefined = this.textRef()?.nativeElement;\n\n if (node !== undefined) {\n this.overflowing.set(node.scrollWidth > node.clientWidth);\n }\n }\n}\n","<span\n rtBlock=\"rt-tag\"\n qa-dataid=\"tag\"\n [attr.data-severity]=\"severity()\"\n [rtMod]=\"{\n severity: severity(),\n size: size(),\n appearance: appearance(),\n closable: closable(),\n }\">\n @if (icon(); as iconName) {\n <rt-icon rtElem=\"icon\" [size]=\"iconSize()\" [name]=\"iconName\" />\n }\n <!--\n Целое значение показывает подсказка, и только когда подписи не хватило места:\n урезанный текст без подсказки читается как целый — узнать, где он на деле кончается,\n человеку неоткуда. Пустой текст директиву выключает.\n -->\n <span rtElem=\"text\" qa-dataid=\"tag-text\" #text [rtTooltip]=\"overflowing() ? value() : ''\">{{ value() }}</span>\n @if (iconEnd(); as iconEndName) {\n <rt-icon rtElem=\"icon-end\" [size]=\"iconSize()\" [name]=\"iconEndName\" />\n }\n @if (closable()) {\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"tag-close\"\n icon=\"ico-close\"\n variant=\"ghost\"\n size=\"sm\"\n radius=\"full\"\n [ariaLabel]=\"t().uiRemove\"\n (clicked)=\"onClose($event)\" />\n }\n</span>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -40,6 +40,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
40
40
|
selector: 'ng-template[rtThreadListRow]',
|
|
41
41
|
}]
|
|
42
42
|
}], propDecorators: { rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rtThreadListRow", required: false }] }] } });
|
|
43
|
+
/**
|
|
44
|
+
* Помечает `<ng-template>` действий строки (удалить, закрепить). Действия рисуются рядом с
|
|
45
|
+
* кнопкой строки, а не внутри неё: вложенная кнопка в `<button>` недопустима и крадёт клик
|
|
46
|
+
* выбора строки. Видны при наведении и фокусе внутри строки.
|
|
47
|
+
*/
|
|
48
|
+
class RtThreadListRowActionsDirective {
|
|
49
|
+
constructor() {
|
|
50
|
+
this.templateRef = inject(TemplateRef);
|
|
51
|
+
this.rows = input([], { ...(ngDevMode ? { debugName: "rows" } : /* istanbul ignore next */ {}), alias: 'rtThreadListRowActions' });
|
|
52
|
+
}
|
|
53
|
+
static ngTemplateContextGuard(_directive,
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- второй довод стража контекста шаблона стоит только в типе-предикате; убрать его нечем, подпись задаёт каркас
|
|
55
|
+
context) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtThreadListRowActionsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
59
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: RtThreadListRowActionsDirective, isStandalone: true, selector: "ng-template[rtThreadListRowActions]", inputs: { rows: { classPropertyName: "rows", publicName: "rtThreadListRowActions", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
60
|
+
}
|
|
61
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtThreadListRowActionsDirective, decorators: [{
|
|
62
|
+
type: Directive,
|
|
63
|
+
args: [{
|
|
64
|
+
selector: 'ng-template[rtThreadListRowActions]',
|
|
65
|
+
}]
|
|
66
|
+
}], propDecorators: { rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rtThreadListRowActions", required: false }] }] } });
|
|
43
67
|
/**
|
|
44
68
|
* Помечает `<ng-template>` с фильтрами — его содержимое рендерится в поповере,
|
|
45
69
|
* который открывает иконка-фильтр в шапке списка.
|
|
@@ -112,6 +136,8 @@ class RtThreadListComponent {
|
|
|
112
136
|
});
|
|
113
137
|
this.rowTemplate = contentChild((RtThreadListRowDirective), /* @ts-ignore */
|
|
114
138
|
...(ngDevMode ? [{ debugName: "rowTemplate" }] : /* istanbul ignore next */ []));
|
|
139
|
+
this.rowActionsTemplate = contentChild((RtThreadListRowActionsDirective), /* @ts-ignore */
|
|
140
|
+
...(ngDevMode ? [{ debugName: "rowActionsTemplate" }] : /* istanbul ignore next */ []));
|
|
115
141
|
this.filtersTemplate = contentChild(RtThreadListFiltersDirective, /* @ts-ignore */
|
|
116
142
|
...(ngDevMode ? [{ debugName: "filtersTemplate" }] : /* istanbul ignore next */ []));
|
|
117
143
|
this.searchTemplate = contentChild(RtThreadListSearchDirective, /* @ts-ignore */
|
|
@@ -160,11 +186,11 @@ class RtThreadListComponent {
|
|
|
160
186
|
this.loadMore.emit();
|
|
161
187
|
}
|
|
162
188
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtThreadListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
163
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtThreadListComponent, isStandalone: true, selector: "rt-thread-list", inputs: { rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, activeId: { classPropertyName: "activeId", publicName: "activeId", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, fetching: { classPropertyName: "fetching", publicName: "fetching", isSignal: true, isRequired: false, transformFunction: null }, hasMore: { classPropertyName: "hasMore", publicName: "hasMore", isSignal: true, isRequired: false, transformFunction: null }, filtersActive: { classPropertyName: "filtersActive", publicName: "filtersActive", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectRow: "selectRow", openInNewTab: "openInNewTab", searchChange: "searchChange", loadMore: "loadMore" }, host: { classAttribute: "rt-thread-list" }, queries: [{ propertyName: "rowTemplate", first: true, predicate: (RtThreadListRowDirective), descendants: true, isSignal: true }, { propertyName: "filtersTemplate", first: true, predicate: RtThreadListFiltersDirective, descendants: true, isSignal: true }, { propertyName: "searchTemplate", first: true, predicate: RtThreadListSearchDirective, descendants: true, isSignal: true }], hostDirectives: [{ directive: i1.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<ng-container rtBlock=\"rt-thread-list\">\n <header rtElem=\"head\">\n @if (searchTemplate()) {\n <div rtElem=\"search\" qa-dataid=\"thread-list-search\">\n <ng-container [ngTemplateOutlet]=\"searchTemplate()?.templateRef ?? null\" />\n </div>\n } @else {\n <rt-input\n rtElem=\"search\"\n qa-dataid=\"thread-list-search\"\n iconLeft=\"search\"\n [placeholder]=\"searchPlaceholderText()\"\n [formControl]=\"searchControl\" />\n }\n @if (filtersTemplate()) {\n <rt-icon-button\n rtElem=\"filter-trigger\"\n qa-dataid=\"thread-list-filter\"\n icon=\"filter\"\n variant=\"secondary\"\n rtPopoverAlign=\"end\"\n [ariaLabel]=\"t().uiFilters\"\n [indicator]=\"filtersActive()\"\n [rtPopover]=\"filtersPanel\" />\n }\n </header>\n\n <ng-template #filtersPanel>\n <div rtElem=\"filters-panel\" qa-dataid=\"thread-list-filters-panel\">\n <ng-container [ngTemplateOutlet]=\"filtersTemplate()?.templateRef ?? null\" />\n </div>\n </ng-template>\n\n <div rtElem=\"rows\" qa-dataid=\"thread-list-rows\">\n @if (loading() && !rows().length) {\n @for (i of skeletonRows; track i) {\n <div rtElem=\"row-skeleton\" qa-dataid=\"thread-list-row-skeleton\" aria-hidden=\"true\">\n <rt-skeleton width=\"60%\" height=\"14px\" />\n <rt-skeleton width=\"90%\" height=\"12px\" />\n </div>\n }\n } @else if (!rows().length) {\n <rt-empty-state rtElem=\"empty\" qa-dataid=\"thread-list-empty\" [description]=\"t().uiThreadListEmptyHint\" [title]=\"emptyTitle()\">\n <div rtEmptyIllustration rtElem=\"empty-preview\">\n @for (row of emptyPreviewRows; track row.id) {\n <div rtElem=\"empty-card\" [rtMod]=\"{ offset: row.offset }\">\n <span rtElem=\"empty-avatar\">\n <rt-icon size=\"sm\" [name]=\"row.icon\" />\n </span>\n <span rtElem=\"empty-lines\">\n <span rtElem=\"empty-line\" [rtMod]=\"{ short: true }\"></span>\n <span rtElem=\"empty-line\"></span>\n </span>\n </div>\n }\n </div>\n </rt-empty-state>\n } @else {\n @for (row of rows(); track row.id) {\n <button\n rtElem=\"row\"\n qa-dataid=\"thread-list-row\"\n type=\"button\"\n [attr.data-id]=\"row.id\"\n [attr.data-unread]=\"row.hasUnread\"\n [attr.aria-current]=\"row.id === activeId() ? 'true' : null\"\n [rtMod]=\"{\n active: row.id === activeId(),\n unread: row.hasUnread,\n overdue: !!row.overdue,\n }\"\n (click)=\"onSelect(row.id, $event)\">\n <ng-container [ngTemplateOutlet]=\"rowTemplate()?.templateRef ?? null\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </button>\n }\n @if (fetching()) {\n <div rtElem=\"row-loader\" qa-dataid=\"thread-list-row-loader\">\n <rt-skeleton width=\"90%\" height=\"12px\" />\n </div>\n }\n @if (hasMore()) {\n <div\n rtElem=\"load-anchor\"\n qa-dataid=\"thread-list-load-more\"\n aria-hidden=\"true\"\n rtInfiniteScroll\n [disabled]=\"fetching()\"\n (loadMore)=\"onLoadMore()\"></div>\n }\n }\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-thread-list{--rt-thread-list-border-width: var(--rt-border-width-thin);--rt-thread-list-card-radius: var(--rt-radius-lg);--rt-thread-list-tag-radius: var(--rt-radius-sm);--rt-thread-list-dot-radius: var(--rt-radius-full);--rt-thread-list-avatar-radius: var(--rt-radius-full);--rt-thread-list-line-radius: var(--rt-radius-full);display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0}.rt-thread-list__head{display:flex;flex:0 0 auto;align-items:center;block-size:56px;border-block-end:var(--rt-thread-list-border-width) solid var(--rt-color-border-strong);gap:var(--rt-space-2);padding-inline:var(--rt-space-4)}.rt-thread-list__search{flex:1 1 auto;max-inline-size:400px;min-inline-size:0}.rt-thread-list__filter-trigger{flex:0 0 auto}.rt-thread-list__filters-panel{display:flex;flex-direction:column;padding:var(--rt-space-4);gap:var(--rt-space-2);min-inline-size:220px}.rt-thread-list__rows{display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0;overflow-y:auto}.rt-thread-list__row{display:flex;align-items:center;justify-content:space-between;padding:var(--rt-space-2) var(--rt-space-4);border:none;background:none;border-inline-start:3px solid transparent;cursor:pointer;font-family:inherit;font-size:var(--rt-text-sm);gap:var(--rt-space-4);inline-size:100%;text-align:start}.rt-thread-list__row:hover{background:var(--rt-color-bg-subtle)}.rt-thread-list__row--active,.rt-thread-list__row--active:hover{background:var(--rt-color-state-info-bg);border-inline-start-color:var(--rt-color-action-primary)}.rt-thread-list__row--unread{position:relative;background:var(--rt-color-bg-subtle);border-inline-start-color:var(--rt-color-action-primary)}.rt-thread-list__row--unread .rt-thread-list__row-title{font-weight:var(--rt-font-weight-semibold)}.rt-thread-list__row--unread:before{position:absolute;border-radius:var(--rt-thread-list-dot-radius);background:var(--rt-color-action-primary);block-size:var(--rt-space-2);content:\"\";inline-size:var(--rt-space-2);inset-block-start:50%;inset-inline-start:var(--rt-space-2);transform:translateY(-50%)}.rt-thread-list__row--active,.rt-thread-list__row--active:hover{background:var(--rt-color-state-info-bg)}.rt-thread-list__row--overdue .rt-thread-list__row-time{color:var(--rt-color-state-error-text)}.rt-thread-list__row-body{display:flex;flex-direction:column;gap:var(--rt-space-0-5);min-inline-size:0}.rt-thread-list__row-title{overflow:hidden;color:var(--rt-color-text-primary);text-overflow:ellipsis;white-space:nowrap}.rt-thread-list__row-id{color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-thread-list__row:hover .rt-copy-cell__button,.rt-thread-list__row:focus-within .rt-copy-cell__button{opacity:1}.rt-thread-list__row-subtitle{overflow:hidden;color:var(--rt-color-text-muted);text-overflow:ellipsis;white-space:nowrap}.rt-thread-list__row-meta{display:flex;flex:0 0 auto;align-items:center;gap:var(--rt-space-2)}.rt-thread-list__row-time{color:var(--rt-color-text-muted);white-space:nowrap}.rt-thread-list__row-tag{padding:var(--rt-space-0-5) var(--rt-space-2);border-radius:var(--rt-thread-list-tag-radius);background:var(--rt-color-state-warning-bg);color:var(--rt-color-state-warning-text);font-size:var(--rt-text-xs);white-space:nowrap}.rt-thread-list__row-dot{display:inline-block;border-radius:var(--rt-thread-list-dot-radius);background:var(--rt-color-text-link);block-size:6px;inline-size:6px}.rt-thread-list__row-skeleton{display:flex;flex-direction:column;padding:var(--rt-space-2) var(--rt-space-4);gap:var(--rt-space-2)}.rt-thread-list__row-loader{display:flex;justify-content:center;padding:var(--rt-space-2) var(--rt-space-4)}.rt-thread-list__load-anchor{block-size:1px}.rt-thread-list__empty{padding:var(--rt-space-6) var(--rt-space-4)}.rt-thread-list__empty-preview{display:flex;flex-direction:column;gap:var(--rt-space-1)}.rt-thread-list__empty-card{display:flex;align-items:center;padding:var(--rt-space-2);border:var(--rt-thread-list-border-width) solid var(--rt-color-border-subtle);border-radius:var(--rt-thread-list-card-radius);background:var(--rt-color-bg-surface-subtle);gap:var(--rt-space-2)}.rt-thread-list__empty-card--offset{transform:translate(20px)}.rt-thread-list__empty-avatar{display:grid;flex:0 0 auto;border-radius:var(--rt-thread-list-avatar-radius);background:var(--rt-color-text-muted);block-size:24px;color:var(--rt-color-bg-surface);inline-size:24px;place-items:center}.rt-thread-list__empty-lines{display:flex;flex-direction:column;gap:var(--rt-space-2)}.rt-thread-list__empty-line{border-radius:var(--rt-thread-list-line-radius);background:var(--rt-color-border-strong);block-size:6px;inline-size:112px}.rt-thread-list__empty-line--short{inline-size:48px}.rt-thread-list[data-rt-radius=none]{--rt-thread-list-card-radius: var(--rt-radius-none)}.rt-thread-list[data-rt-radius=xs]{--rt-thread-list-card-radius: var(--rt-radius-xs)}.rt-thread-list[data-rt-radius=sm]{--rt-thread-list-card-radius: var(--rt-radius-sm)}.rt-thread-list[data-rt-radius=ms]{--rt-thread-list-card-radius: var(--rt-radius-ms)}.rt-thread-list[data-rt-radius=md]{--rt-thread-list-card-radius: var(--rt-radius-md)}.rt-thread-list[data-rt-radius=lg]{--rt-thread-list-card-radius: var(--rt-radius-lg)}.rt-thread-list[data-rt-radius=xl]{--rt-thread-list-card-radius: var(--rt-radius-xl)}.rt-thread-list[data-rt-radius=\"2xl\"]{--rt-thread-list-card-radius: var(--rt-radius-2xl)}.rt-thread-list[data-rt-radius=full]{--rt-thread-list-card-radius: var(--rt-radius-full)}}\n"], dependencies: [{ kind: "directive", type:
|
|
189
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtThreadListComponent, isStandalone: true, selector: "rt-thread-list", inputs: { rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, activeId: { classPropertyName: "activeId", publicName: "activeId", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, fetching: { classPropertyName: "fetching", publicName: "fetching", isSignal: true, isRequired: false, transformFunction: null }, hasMore: { classPropertyName: "hasMore", publicName: "hasMore", isSignal: true, isRequired: false, transformFunction: null }, filtersActive: { classPropertyName: "filtersActive", publicName: "filtersActive", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectRow: "selectRow", openInNewTab: "openInNewTab", searchChange: "searchChange", loadMore: "loadMore" }, host: { classAttribute: "rt-thread-list" }, queries: [{ propertyName: "rowTemplate", first: true, predicate: (RtThreadListRowDirective), descendants: true, isSignal: true }, { propertyName: "rowActionsTemplate", first: true, predicate: (RtThreadListRowActionsDirective), descendants: true, isSignal: true }, { propertyName: "filtersTemplate", first: true, predicate: RtThreadListFiltersDirective, descendants: true, isSignal: true }, { propertyName: "searchTemplate", first: true, predicate: RtThreadListSearchDirective, descendants: true, isSignal: true }], hostDirectives: [{ directive: i1.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<ng-container rtBlock=\"rt-thread-list\">\n <header rtElem=\"head\">\n @if (searchTemplate()) {\n <div rtElem=\"search\" qa-dataid=\"thread-list-search\">\n <ng-container [ngTemplateOutlet]=\"searchTemplate()?.templateRef ?? null\" />\n </div>\n } @else {\n <rt-input\n rtElem=\"search\"\n qa-dataid=\"thread-list-search\"\n iconLeft=\"search\"\n [placeholder]=\"searchPlaceholderText()\"\n [formControl]=\"searchControl\" />\n }\n @if (filtersTemplate()) {\n <rt-icon-button\n rtElem=\"filter-trigger\"\n qa-dataid=\"thread-list-filter\"\n icon=\"filter\"\n variant=\"secondary\"\n rtPopoverAlign=\"end\"\n [ariaLabel]=\"t().uiFilters\"\n [indicator]=\"filtersActive()\"\n [rtPopover]=\"filtersPanel\" />\n }\n </header>\n\n <ng-template #rowButton let-row>\n <button\n rtElem=\"row\"\n qa-dataid=\"thread-list-row\"\n type=\"button\"\n [attr.data-id]=\"row.id\"\n [attr.data-unread]=\"row.hasUnread\"\n [attr.aria-current]=\"row.id === activeId() ? 'true' : null\"\n [rtMod]=\"{\n active: row.id === activeId(),\n unread: row.hasUnread,\n overdue: !!row.overdue,\n }\"\n (click)=\"onSelect(row.id, $event)\">\n <ng-container [ngTemplateOutlet]=\"rowTemplate()?.templateRef ?? null\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </button>\n </ng-template>\n\n <ng-template #filtersPanel>\n <div rtElem=\"filters-panel\" qa-dataid=\"thread-list-filters-panel\">\n <ng-container [ngTemplateOutlet]=\"filtersTemplate()?.templateRef ?? null\" />\n </div>\n </ng-template>\n\n <div rtElem=\"rows\" qa-dataid=\"thread-list-rows\">\n @if (loading() && !rows().length) {\n @for (i of skeletonRows; track i) {\n <div rtElem=\"row-skeleton\" qa-dataid=\"thread-list-row-skeleton\" aria-hidden=\"true\">\n <rt-skeleton width=\"60%\" height=\"14px\" />\n <rt-skeleton width=\"90%\" height=\"12px\" />\n </div>\n }\n } @else if (!rows().length) {\n <rt-empty-state rtElem=\"empty\" qa-dataid=\"thread-list-empty\" [description]=\"t().uiThreadListEmptyHint\" [title]=\"emptyTitle()\">\n <div rtEmptyIllustration rtElem=\"empty-preview\">\n @for (row of emptyPreviewRows; track row.id) {\n <div rtElem=\"empty-card\" [rtMod]=\"{ offset: row.offset }\">\n <span rtElem=\"empty-avatar\">\n <rt-icon size=\"sm\" [name]=\"row.icon\" />\n </span>\n <span rtElem=\"empty-lines\">\n <span rtElem=\"empty-line\" [rtMod]=\"{ short: true }\"></span>\n <span rtElem=\"empty-line\"></span>\n </span>\n </div>\n }\n </div>\n </rt-empty-state>\n } @else {\n @for (row of rows(); track row.id) {\n @if (rowActionsTemplate(); as actions) {\n <div rtElem=\"row-wrap\" qa-dataid=\"thread-list-row-wrap\">\n <ng-container [ngTemplateOutlet]=\"rowButton\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n <div rtElem=\"row-actions\" qa-dataid=\"thread-list-row-actions\">\n <ng-container [ngTemplateOutlet]=\"actions.templateRef\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </div>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"rowButton\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n }\n }\n @if (fetching()) {\n <div rtElem=\"row-loader\" qa-dataid=\"thread-list-row-loader\">\n <rt-skeleton width=\"90%\" height=\"12px\" />\n </div>\n }\n @if (hasMore()) {\n <div\n rtElem=\"load-anchor\"\n qa-dataid=\"thread-list-load-more\"\n aria-hidden=\"true\"\n rtInfiniteScroll\n [disabled]=\"fetching()\"\n (loadMore)=\"onLoadMore()\"></div>\n }\n }\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-thread-list{--rt-thread-list-border-width: var(--rt-border-width-thin);--rt-thread-list-card-radius: var(--rt-radius-lg);--rt-thread-list-tag-radius: var(--rt-radius-sm);--rt-thread-list-dot-radius: var(--rt-radius-full);--rt-thread-list-avatar-radius: var(--rt-radius-full);--rt-thread-list-line-radius: var(--rt-radius-full);display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0}.rt-thread-list__head{display:flex;flex:0 0 auto;align-items:center;block-size:56px;border-block-end:var(--rt-thread-list-border-width) solid var(--rt-color-border-strong);gap:var(--rt-space-2);padding-inline:var(--rt-space-4)}.rt-thread-list__search{flex:1 1 auto;max-inline-size:400px;min-inline-size:0}.rt-thread-list__filter-trigger{flex:0 0 auto}.rt-thread-list__filters-panel{display:flex;flex-direction:column;padding:var(--rt-space-4);gap:var(--rt-space-2);min-inline-size:220px}.rt-thread-list__rows{display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0;overflow-y:auto}.rt-thread-list__row{display:flex;align-items:center;justify-content:space-between;padding:var(--rt-space-2) var(--rt-space-4);border:none;background:none;border-inline-start:3px solid transparent;cursor:pointer;font-family:inherit;font-size:var(--rt-text-sm);gap:var(--rt-space-4);inline-size:100%;text-align:start}.rt-thread-list__row:hover{background:var(--rt-color-bg-subtle)}.rt-thread-list__row--active,.rt-thread-list__row--active:hover{background:var(--rt-color-state-info-bg);border-inline-start-color:var(--rt-color-action-primary)}.rt-thread-list__row--unread{position:relative;background:var(--rt-color-bg-subtle);border-inline-start-color:var(--rt-color-action-primary)}.rt-thread-list__row--unread .rt-thread-list__row-title{font-weight:var(--rt-font-weight-semibold)}.rt-thread-list__row--unread:before{position:absolute;border-radius:var(--rt-thread-list-dot-radius);background:var(--rt-color-action-primary);block-size:var(--rt-space-2);content:\"\";inline-size:var(--rt-space-2);inset-block-start:50%;inset-inline-start:var(--rt-space-2);transform:translateY(-50%)}.rt-thread-list__row--active,.rt-thread-list__row--active:hover{background:var(--rt-color-state-info-bg)}.rt-thread-list__row--overdue .rt-thread-list__row-time{color:var(--rt-color-state-error-text)}.rt-thread-list__row-wrap{position:relative}.rt-thread-list__row-wrap:hover .rt-thread-list__row-actions,.rt-thread-list__row-wrap:focus-within .rt-thread-list__row-actions{opacity:1;pointer-events:auto}.rt-thread-list__row-actions{position:absolute;display:flex;align-items:center;background:var(--rt-color-bg-subtle);gap:var(--rt-space-1);inset-block:0;inset-inline-end:0;opacity:0;padding-inline:var(--rt-space-2) var(--rt-space-4);pointer-events:none}.rt-thread-list__row--active+.rt-thread-list__row-actions{background:var(--rt-color-state-info-bg)}.rt-thread-list__row-body{display:flex;flex-direction:column;gap:var(--rt-space-0-5);min-inline-size:0}.rt-thread-list__row-title{overflow:hidden;color:var(--rt-color-text-primary);text-overflow:ellipsis;white-space:nowrap}.rt-thread-list__row-id{color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-thread-list__row:hover .rt-copy-cell__button,.rt-thread-list__row:focus-within .rt-copy-cell__button{opacity:1}.rt-thread-list__row-subtitle{overflow:hidden;color:var(--rt-color-text-muted);text-overflow:ellipsis;white-space:nowrap}.rt-thread-list__row-meta{display:flex;flex:0 0 auto;align-items:center;gap:var(--rt-space-2)}.rt-thread-list__row-time{color:var(--rt-color-text-muted);white-space:nowrap}.rt-thread-list__row-tag{padding:var(--rt-space-0-5) var(--rt-space-2);border-radius:var(--rt-thread-list-tag-radius);background:var(--rt-color-state-warning-bg);color:var(--rt-color-state-warning-text);font-size:var(--rt-text-xs);white-space:nowrap}.rt-thread-list__row-dot{display:inline-block;border-radius:var(--rt-thread-list-dot-radius);background:var(--rt-color-text-link);block-size:6px;inline-size:6px}.rt-thread-list__row-skeleton{display:flex;flex-direction:column;padding:var(--rt-space-2) var(--rt-space-4);gap:var(--rt-space-2)}.rt-thread-list__row-loader{display:flex;justify-content:center;padding:var(--rt-space-2) var(--rt-space-4)}.rt-thread-list__load-anchor{block-size:1px}.rt-thread-list__empty{padding:var(--rt-space-6) var(--rt-space-4)}.rt-thread-list__empty-preview{display:flex;flex-direction:column;gap:var(--rt-space-1)}.rt-thread-list__empty-card{display:flex;align-items:center;padding:var(--rt-space-2);border:var(--rt-thread-list-border-width) solid var(--rt-color-border-subtle);border-radius:var(--rt-thread-list-card-radius);background:var(--rt-color-bg-surface-subtle);gap:var(--rt-space-2)}.rt-thread-list__empty-card--offset{transform:translate(20px)}.rt-thread-list__empty-avatar{display:grid;flex:0 0 auto;border-radius:var(--rt-thread-list-avatar-radius);background:var(--rt-color-text-muted);block-size:24px;color:var(--rt-color-bg-surface);inline-size:24px;place-items:center}.rt-thread-list__empty-lines{display:flex;flex-direction:column;gap:var(--rt-space-2)}.rt-thread-list__empty-line{border-radius:var(--rt-thread-list-line-radius);background:var(--rt-color-border-strong);block-size:6px;inline-size:112px}.rt-thread-list__empty-line--short{inline-size:48px}.rt-thread-list[data-rt-radius=none]{--rt-thread-list-card-radius: var(--rt-radius-none)}.rt-thread-list[data-rt-radius=xs]{--rt-thread-list-card-radius: var(--rt-radius-xs)}.rt-thread-list[data-rt-radius=sm]{--rt-thread-list-card-radius: var(--rt-radius-sm)}.rt-thread-list[data-rt-radius=ms]{--rt-thread-list-card-radius: var(--rt-radius-ms)}.rt-thread-list[data-rt-radius=md]{--rt-thread-list-card-radius: var(--rt-radius-md)}.rt-thread-list[data-rt-radius=lg]{--rt-thread-list-card-radius: var(--rt-radius-lg)}.rt-thread-list[data-rt-radius=xl]{--rt-thread-list-card-radius: var(--rt-radius-xl)}.rt-thread-list[data-rt-radius=\"2xl\"]{--rt-thread-list-card-radius: var(--rt-radius-2xl)}.rt-thread-list[data-rt-radius=full]{--rt-thread-list-card-radius: var(--rt-radius-full)}}\n"], dependencies: [{ kind: "directive", type:
|
|
164
190
|
// Angular
|
|
165
191
|
NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type:
|
|
166
192
|
// standalone components / directives
|
|
167
|
-
RtEmptyStateComponent, selector: "rt-empty-state", inputs: ["icon", "glyph", "title", "description", "framed"] }, { kind: "component", type: RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "size", "color", "fill", "spin", "rotate"] }, { kind: "component", type: RtIconButtonComponent, selector: "rt-icon-button", inputs: ["icon", "glyph", "ariaLabel", "variant", "iconColor", "iconFill", "size", "iconSize", "type", "tooltip", "tabIndex", "loading", "disabled", "active", "indicator"], outputs: ["clicked"] }, { kind: "component", type: RtInputComponent, selector: "rt-input", inputs: ["appearance", "type", "placeholder", "iconLeft", "iconRight", "passwordToggle", "autocomplete"] }, { kind: "directive", type: RtPopoverDirective, selector: "[rtPopover]", inputs: ["rtPopover", "rtPopoverTrigger", "rtPopoverWidth", "rtPopoverAlign", "rtPopoverFitViewport", "rtPopoverContext", "rtPopoverPanelClass", "rtPopoverDisabled", "rtPopoverOffsetY", "rtPopoverOffsetX"], outputs: ["rtPopoverOpened", "rtPopoverClosed"], exportAs: ["rtPopover"] }, { kind: "component", type: RtSkeletonComponent, selector: "rt-skeleton", inputs: ["shape", "size", "width", "height", "animation"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: RtInfiniteScrollDirective, selector: "[rtInfiniteScroll]", inputs: ["disabled", "rootMargin"], outputs: ["loadMore"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
193
|
+
RtEmptyStateComponent, selector: "rt-empty-state", inputs: ["icon", "glyph", "title", "description", "framed"] }, { kind: "component", type: RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "glyphStrategy", "size", "color", "fill", "spin", "rotate"] }, { kind: "component", type: RtIconButtonComponent, selector: "rt-icon-button", inputs: ["icon", "glyph", "ariaLabel", "variant", "iconColor", "iconFill", "size", "iconSize", "type", "tooltip", "tabIndex", "loading", "disabled", "active", "indicator"], outputs: ["clicked"] }, { kind: "component", type: RtInputComponent, selector: "rt-input", inputs: ["appearance", "type", "placeholder", "iconLeft", "iconRight", "passwordToggle", "autocomplete"] }, { kind: "directive", type: RtPopoverDirective, selector: "[rtPopover]", inputs: ["rtPopover", "rtPopoverTrigger", "rtPopoverWidth", "rtPopoverAlign", "rtPopoverFitViewport", "rtPopoverContext", "rtPopoverPanelClass", "rtPopoverDisabled", "rtPopoverOffsetY", "rtPopoverOffsetX"], outputs: ["rtPopoverOpened", "rtPopoverClosed"], exportAs: ["rtPopover"] }, { kind: "component", type: RtSkeletonComponent, selector: "rt-skeleton", inputs: ["shape", "size", "width", "height", "animation"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: RtInfiniteScrollDirective, selector: "[rtInfiniteScroll]", inputs: ["disabled", "rootMargin"], outputs: ["loadMore"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
168
194
|
}
|
|
169
195
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtThreadListComponent, decorators: [{
|
|
170
196
|
type: Component,
|
|
@@ -185,12 +211,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
185
211
|
ModDirective,
|
|
186
212
|
], hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }], host: {
|
|
187
213
|
class: BEM_BLOCK,
|
|
188
|
-
}, template: "<ng-container rtBlock=\"rt-thread-list\">\n <header rtElem=\"head\">\n @if (searchTemplate()) {\n <div rtElem=\"search\" qa-dataid=\"thread-list-search\">\n <ng-container [ngTemplateOutlet]=\"searchTemplate()?.templateRef ?? null\" />\n </div>\n } @else {\n <rt-input\n rtElem=\"search\"\n qa-dataid=\"thread-list-search\"\n iconLeft=\"search\"\n [placeholder]=\"searchPlaceholderText()\"\n [formControl]=\"searchControl\" />\n }\n @if (filtersTemplate()) {\n <rt-icon-button\n rtElem=\"filter-trigger\"\n qa-dataid=\"thread-list-filter\"\n icon=\"filter\"\n variant=\"secondary\"\n rtPopoverAlign=\"end\"\n [ariaLabel]=\"t().uiFilters\"\n [indicator]=\"filtersActive()\"\n [rtPopover]=\"filtersPanel\" />\n }\n </header>\n\n <ng-template #filtersPanel>\n <div rtElem=\"filters-panel\" qa-dataid=\"thread-list-filters-panel\">\n <ng-container [ngTemplateOutlet]=\"filtersTemplate()?.templateRef ?? null\" />\n </div>\n </ng-template>\n\n <div rtElem=\"rows\" qa-dataid=\"thread-list-rows\">\n @if (loading() && !rows().length) {\n @for (i of skeletonRows; track i) {\n <div rtElem=\"row-skeleton\" qa-dataid=\"thread-list-row-skeleton\" aria-hidden=\"true\">\n <rt-skeleton width=\"60%\" height=\"14px\" />\n <rt-skeleton width=\"90%\" height=\"12px\" />\n </div>\n }\n } @else if (!rows().length) {\n <rt-empty-state rtElem=\"empty\" qa-dataid=\"thread-list-empty\" [description]=\"t().uiThreadListEmptyHint\" [title]=\"emptyTitle()\">\n <div rtEmptyIllustration rtElem=\"empty-preview\">\n @for (row of emptyPreviewRows; track row.id) {\n <div rtElem=\"empty-card\" [rtMod]=\"{ offset: row.offset }\">\n <span rtElem=\"empty-avatar\">\n <rt-icon size=\"sm\" [name]=\"row.icon\" />\n </span>\n <span rtElem=\"empty-lines\">\n <span rtElem=\"empty-line\" [rtMod]=\"{ short: true }\"></span>\n <span rtElem=\"empty-line\"></span>\n </span>\n </div>\n }\n </div>\n </rt-empty-state>\n } @else {\n @for (row of rows(); track row.id) {\n <button\n rtElem=\"row\"\n qa-dataid=\"thread-list-row\"\n type=\"button\"\n [attr.data-id]=\"row.id\"\n [attr.data-unread]=\"row.hasUnread\"\n [attr.aria-current]=\"row.id === activeId() ? 'true' : null\"\n [rtMod]=\"{\n active: row.id === activeId(),\n unread: row.hasUnread,\n overdue: !!row.overdue,\n }\"\n (click)=\"onSelect(row.id, $event)\">\n <ng-container [ngTemplateOutlet]=\"rowTemplate()?.templateRef ?? null\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </button>\n }\n @if (fetching()) {\n <div rtElem=\"row-loader\" qa-dataid=\"thread-list-row-loader\">\n <rt-skeleton width=\"90%\" height=\"12px\" />\n </div>\n }\n @if (hasMore()) {\n <div\n rtElem=\"load-anchor\"\n qa-dataid=\"thread-list-load-more\"\n aria-hidden=\"true\"\n rtInfiniteScroll\n [disabled]=\"fetching()\"\n (loadMore)=\"onLoadMore()\"></div>\n }\n }\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-thread-list{--rt-thread-list-border-width: var(--rt-border-width-thin);--rt-thread-list-card-radius: var(--rt-radius-lg);--rt-thread-list-tag-radius: var(--rt-radius-sm);--rt-thread-list-dot-radius: var(--rt-radius-full);--rt-thread-list-avatar-radius: var(--rt-radius-full);--rt-thread-list-line-radius: var(--rt-radius-full);display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0}.rt-thread-list__head{display:flex;flex:0 0 auto;align-items:center;block-size:56px;border-block-end:var(--rt-thread-list-border-width) solid var(--rt-color-border-strong);gap:var(--rt-space-2);padding-inline:var(--rt-space-4)}.rt-thread-list__search{flex:1 1 auto;max-inline-size:400px;min-inline-size:0}.rt-thread-list__filter-trigger{flex:0 0 auto}.rt-thread-list__filters-panel{display:flex;flex-direction:column;padding:var(--rt-space-4);gap:var(--rt-space-2);min-inline-size:220px}.rt-thread-list__rows{display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0;overflow-y:auto}.rt-thread-list__row{display:flex;align-items:center;justify-content:space-between;padding:var(--rt-space-2) var(--rt-space-4);border:none;background:none;border-inline-start:3px solid transparent;cursor:pointer;font-family:inherit;font-size:var(--rt-text-sm);gap:var(--rt-space-4);inline-size:100%;text-align:start}.rt-thread-list__row:hover{background:var(--rt-color-bg-subtle)}.rt-thread-list__row--active,.rt-thread-list__row--active:hover{background:var(--rt-color-state-info-bg);border-inline-start-color:var(--rt-color-action-primary)}.rt-thread-list__row--unread{position:relative;background:var(--rt-color-bg-subtle);border-inline-start-color:var(--rt-color-action-primary)}.rt-thread-list__row--unread .rt-thread-list__row-title{font-weight:var(--rt-font-weight-semibold)}.rt-thread-list__row--unread:before{position:absolute;border-radius:var(--rt-thread-list-dot-radius);background:var(--rt-color-action-primary);block-size:var(--rt-space-2);content:\"\";inline-size:var(--rt-space-2);inset-block-start:50%;inset-inline-start:var(--rt-space-2);transform:translateY(-50%)}.rt-thread-list__row--active,.rt-thread-list__row--active:hover{background:var(--rt-color-state-info-bg)}.rt-thread-list__row--overdue .rt-thread-list__row-time{color:var(--rt-color-state-error-text)}.rt-thread-list__row-body{display:flex;flex-direction:column;gap:var(--rt-space-0-5);min-inline-size:0}.rt-thread-list__row-title{overflow:hidden;color:var(--rt-color-text-primary);text-overflow:ellipsis;white-space:nowrap}.rt-thread-list__row-id{color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-thread-list__row:hover .rt-copy-cell__button,.rt-thread-list__row:focus-within .rt-copy-cell__button{opacity:1}.rt-thread-list__row-subtitle{overflow:hidden;color:var(--rt-color-text-muted);text-overflow:ellipsis;white-space:nowrap}.rt-thread-list__row-meta{display:flex;flex:0 0 auto;align-items:center;gap:var(--rt-space-2)}.rt-thread-list__row-time{color:var(--rt-color-text-muted);white-space:nowrap}.rt-thread-list__row-tag{padding:var(--rt-space-0-5) var(--rt-space-2);border-radius:var(--rt-thread-list-tag-radius);background:var(--rt-color-state-warning-bg);color:var(--rt-color-state-warning-text);font-size:var(--rt-text-xs);white-space:nowrap}.rt-thread-list__row-dot{display:inline-block;border-radius:var(--rt-thread-list-dot-radius);background:var(--rt-color-text-link);block-size:6px;inline-size:6px}.rt-thread-list__row-skeleton{display:flex;flex-direction:column;padding:var(--rt-space-2) var(--rt-space-4);gap:var(--rt-space-2)}.rt-thread-list__row-loader{display:flex;justify-content:center;padding:var(--rt-space-2) var(--rt-space-4)}.rt-thread-list__load-anchor{block-size:1px}.rt-thread-list__empty{padding:var(--rt-space-6) var(--rt-space-4)}.rt-thread-list__empty-preview{display:flex;flex-direction:column;gap:var(--rt-space-1)}.rt-thread-list__empty-card{display:flex;align-items:center;padding:var(--rt-space-2);border:var(--rt-thread-list-border-width) solid var(--rt-color-border-subtle);border-radius:var(--rt-thread-list-card-radius);background:var(--rt-color-bg-surface-subtle);gap:var(--rt-space-2)}.rt-thread-list__empty-card--offset{transform:translate(20px)}.rt-thread-list__empty-avatar{display:grid;flex:0 0 auto;border-radius:var(--rt-thread-list-avatar-radius);background:var(--rt-color-text-muted);block-size:24px;color:var(--rt-color-bg-surface);inline-size:24px;place-items:center}.rt-thread-list__empty-lines{display:flex;flex-direction:column;gap:var(--rt-space-2)}.rt-thread-list__empty-line{border-radius:var(--rt-thread-list-line-radius);background:var(--rt-color-border-strong);block-size:6px;inline-size:112px}.rt-thread-list__empty-line--short{inline-size:48px}.rt-thread-list[data-rt-radius=none]{--rt-thread-list-card-radius: var(--rt-radius-none)}.rt-thread-list[data-rt-radius=xs]{--rt-thread-list-card-radius: var(--rt-radius-xs)}.rt-thread-list[data-rt-radius=sm]{--rt-thread-list-card-radius: var(--rt-radius-sm)}.rt-thread-list[data-rt-radius=ms]{--rt-thread-list-card-radius: var(--rt-radius-ms)}.rt-thread-list[data-rt-radius=md]{--rt-thread-list-card-radius: var(--rt-radius-md)}.rt-thread-list[data-rt-radius=lg]{--rt-thread-list-card-radius: var(--rt-radius-lg)}.rt-thread-list[data-rt-radius=xl]{--rt-thread-list-card-radius: var(--rt-radius-xl)}.rt-thread-list[data-rt-radius=\"2xl\"]{--rt-thread-list-card-radius: var(--rt-radius-2xl)}.rt-thread-list[data-rt-radius=full]{--rt-thread-list-card-radius: var(--rt-radius-full)}}\n"] }]
|
|
189
|
-
}], propDecorators: { rowTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtThreadListRowDirective), { isSignal: true }] }], filtersTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtThreadListFiltersDirective), { isSignal: true }] }], searchTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtThreadListSearchDirective), { isSignal: true }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], activeId: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeId", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], fetching: [{ type: i0.Input, args: [{ isSignal: true, alias: "fetching", required: false }] }], hasMore: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasMore", required: false }] }], filtersActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "filtersActive", required: false }] }], selectRow: [{ type: i0.Output, args: ["selectRow"] }], openInNewTab: [{ type: i0.Output, args: ["openInNewTab"] }], searchChange: [{ type: i0.Output, args: ["searchChange"] }], loadMore: [{ type: i0.Output, args: ["loadMore"] }] } });
|
|
214
|
+
}, template: "<ng-container rtBlock=\"rt-thread-list\">\n <header rtElem=\"head\">\n @if (searchTemplate()) {\n <div rtElem=\"search\" qa-dataid=\"thread-list-search\">\n <ng-container [ngTemplateOutlet]=\"searchTemplate()?.templateRef ?? null\" />\n </div>\n } @else {\n <rt-input\n rtElem=\"search\"\n qa-dataid=\"thread-list-search\"\n iconLeft=\"search\"\n [placeholder]=\"searchPlaceholderText()\"\n [formControl]=\"searchControl\" />\n }\n @if (filtersTemplate()) {\n <rt-icon-button\n rtElem=\"filter-trigger\"\n qa-dataid=\"thread-list-filter\"\n icon=\"filter\"\n variant=\"secondary\"\n rtPopoverAlign=\"end\"\n [ariaLabel]=\"t().uiFilters\"\n [indicator]=\"filtersActive()\"\n [rtPopover]=\"filtersPanel\" />\n }\n </header>\n\n <ng-template #rowButton let-row>\n <button\n rtElem=\"row\"\n qa-dataid=\"thread-list-row\"\n type=\"button\"\n [attr.data-id]=\"row.id\"\n [attr.data-unread]=\"row.hasUnread\"\n [attr.aria-current]=\"row.id === activeId() ? 'true' : null\"\n [rtMod]=\"{\n active: row.id === activeId(),\n unread: row.hasUnread,\n overdue: !!row.overdue,\n }\"\n (click)=\"onSelect(row.id, $event)\">\n <ng-container [ngTemplateOutlet]=\"rowTemplate()?.templateRef ?? null\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </button>\n </ng-template>\n\n <ng-template #filtersPanel>\n <div rtElem=\"filters-panel\" qa-dataid=\"thread-list-filters-panel\">\n <ng-container [ngTemplateOutlet]=\"filtersTemplate()?.templateRef ?? null\" />\n </div>\n </ng-template>\n\n <div rtElem=\"rows\" qa-dataid=\"thread-list-rows\">\n @if (loading() && !rows().length) {\n @for (i of skeletonRows; track i) {\n <div rtElem=\"row-skeleton\" qa-dataid=\"thread-list-row-skeleton\" aria-hidden=\"true\">\n <rt-skeleton width=\"60%\" height=\"14px\" />\n <rt-skeleton width=\"90%\" height=\"12px\" />\n </div>\n }\n } @else if (!rows().length) {\n <rt-empty-state rtElem=\"empty\" qa-dataid=\"thread-list-empty\" [description]=\"t().uiThreadListEmptyHint\" [title]=\"emptyTitle()\">\n <div rtEmptyIllustration rtElem=\"empty-preview\">\n @for (row of emptyPreviewRows; track row.id) {\n <div rtElem=\"empty-card\" [rtMod]=\"{ offset: row.offset }\">\n <span rtElem=\"empty-avatar\">\n <rt-icon size=\"sm\" [name]=\"row.icon\" />\n </span>\n <span rtElem=\"empty-lines\">\n <span rtElem=\"empty-line\" [rtMod]=\"{ short: true }\"></span>\n <span rtElem=\"empty-line\"></span>\n </span>\n </div>\n }\n </div>\n </rt-empty-state>\n } @else {\n @for (row of rows(); track row.id) {\n @if (rowActionsTemplate(); as actions) {\n <div rtElem=\"row-wrap\" qa-dataid=\"thread-list-row-wrap\">\n <ng-container [ngTemplateOutlet]=\"rowButton\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n <div rtElem=\"row-actions\" qa-dataid=\"thread-list-row-actions\">\n <ng-container [ngTemplateOutlet]=\"actions.templateRef\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </div>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"rowButton\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n }\n }\n @if (fetching()) {\n <div rtElem=\"row-loader\" qa-dataid=\"thread-list-row-loader\">\n <rt-skeleton width=\"90%\" height=\"12px\" />\n </div>\n }\n @if (hasMore()) {\n <div\n rtElem=\"load-anchor\"\n qa-dataid=\"thread-list-load-more\"\n aria-hidden=\"true\"\n rtInfiniteScroll\n [disabled]=\"fetching()\"\n (loadMore)=\"onLoadMore()\"></div>\n }\n }\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-thread-list{--rt-thread-list-border-width: var(--rt-border-width-thin);--rt-thread-list-card-radius: var(--rt-radius-lg);--rt-thread-list-tag-radius: var(--rt-radius-sm);--rt-thread-list-dot-radius: var(--rt-radius-full);--rt-thread-list-avatar-radius: var(--rt-radius-full);--rt-thread-list-line-radius: var(--rt-radius-full);display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0}.rt-thread-list__head{display:flex;flex:0 0 auto;align-items:center;block-size:56px;border-block-end:var(--rt-thread-list-border-width) solid var(--rt-color-border-strong);gap:var(--rt-space-2);padding-inline:var(--rt-space-4)}.rt-thread-list__search{flex:1 1 auto;max-inline-size:400px;min-inline-size:0}.rt-thread-list__filter-trigger{flex:0 0 auto}.rt-thread-list__filters-panel{display:flex;flex-direction:column;padding:var(--rt-space-4);gap:var(--rt-space-2);min-inline-size:220px}.rt-thread-list__rows{display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0;overflow-y:auto}.rt-thread-list__row{display:flex;align-items:center;justify-content:space-between;padding:var(--rt-space-2) var(--rt-space-4);border:none;background:none;border-inline-start:3px solid transparent;cursor:pointer;font-family:inherit;font-size:var(--rt-text-sm);gap:var(--rt-space-4);inline-size:100%;text-align:start}.rt-thread-list__row:hover{background:var(--rt-color-bg-subtle)}.rt-thread-list__row--active,.rt-thread-list__row--active:hover{background:var(--rt-color-state-info-bg);border-inline-start-color:var(--rt-color-action-primary)}.rt-thread-list__row--unread{position:relative;background:var(--rt-color-bg-subtle);border-inline-start-color:var(--rt-color-action-primary)}.rt-thread-list__row--unread .rt-thread-list__row-title{font-weight:var(--rt-font-weight-semibold)}.rt-thread-list__row--unread:before{position:absolute;border-radius:var(--rt-thread-list-dot-radius);background:var(--rt-color-action-primary);block-size:var(--rt-space-2);content:\"\";inline-size:var(--rt-space-2);inset-block-start:50%;inset-inline-start:var(--rt-space-2);transform:translateY(-50%)}.rt-thread-list__row--active,.rt-thread-list__row--active:hover{background:var(--rt-color-state-info-bg)}.rt-thread-list__row--overdue .rt-thread-list__row-time{color:var(--rt-color-state-error-text)}.rt-thread-list__row-wrap{position:relative}.rt-thread-list__row-wrap:hover .rt-thread-list__row-actions,.rt-thread-list__row-wrap:focus-within .rt-thread-list__row-actions{opacity:1;pointer-events:auto}.rt-thread-list__row-actions{position:absolute;display:flex;align-items:center;background:var(--rt-color-bg-subtle);gap:var(--rt-space-1);inset-block:0;inset-inline-end:0;opacity:0;padding-inline:var(--rt-space-2) var(--rt-space-4);pointer-events:none}.rt-thread-list__row--active+.rt-thread-list__row-actions{background:var(--rt-color-state-info-bg)}.rt-thread-list__row-body{display:flex;flex-direction:column;gap:var(--rt-space-0-5);min-inline-size:0}.rt-thread-list__row-title{overflow:hidden;color:var(--rt-color-text-primary);text-overflow:ellipsis;white-space:nowrap}.rt-thread-list__row-id{color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-thread-list__row:hover .rt-copy-cell__button,.rt-thread-list__row:focus-within .rt-copy-cell__button{opacity:1}.rt-thread-list__row-subtitle{overflow:hidden;color:var(--rt-color-text-muted);text-overflow:ellipsis;white-space:nowrap}.rt-thread-list__row-meta{display:flex;flex:0 0 auto;align-items:center;gap:var(--rt-space-2)}.rt-thread-list__row-time{color:var(--rt-color-text-muted);white-space:nowrap}.rt-thread-list__row-tag{padding:var(--rt-space-0-5) var(--rt-space-2);border-radius:var(--rt-thread-list-tag-radius);background:var(--rt-color-state-warning-bg);color:var(--rt-color-state-warning-text);font-size:var(--rt-text-xs);white-space:nowrap}.rt-thread-list__row-dot{display:inline-block;border-radius:var(--rt-thread-list-dot-radius);background:var(--rt-color-text-link);block-size:6px;inline-size:6px}.rt-thread-list__row-skeleton{display:flex;flex-direction:column;padding:var(--rt-space-2) var(--rt-space-4);gap:var(--rt-space-2)}.rt-thread-list__row-loader{display:flex;justify-content:center;padding:var(--rt-space-2) var(--rt-space-4)}.rt-thread-list__load-anchor{block-size:1px}.rt-thread-list__empty{padding:var(--rt-space-6) var(--rt-space-4)}.rt-thread-list__empty-preview{display:flex;flex-direction:column;gap:var(--rt-space-1)}.rt-thread-list__empty-card{display:flex;align-items:center;padding:var(--rt-space-2);border:var(--rt-thread-list-border-width) solid var(--rt-color-border-subtle);border-radius:var(--rt-thread-list-card-radius);background:var(--rt-color-bg-surface-subtle);gap:var(--rt-space-2)}.rt-thread-list__empty-card--offset{transform:translate(20px)}.rt-thread-list__empty-avatar{display:grid;flex:0 0 auto;border-radius:var(--rt-thread-list-avatar-radius);background:var(--rt-color-text-muted);block-size:24px;color:var(--rt-color-bg-surface);inline-size:24px;place-items:center}.rt-thread-list__empty-lines{display:flex;flex-direction:column;gap:var(--rt-space-2)}.rt-thread-list__empty-line{border-radius:var(--rt-thread-list-line-radius);background:var(--rt-color-border-strong);block-size:6px;inline-size:112px}.rt-thread-list__empty-line--short{inline-size:48px}.rt-thread-list[data-rt-radius=none]{--rt-thread-list-card-radius: var(--rt-radius-none)}.rt-thread-list[data-rt-radius=xs]{--rt-thread-list-card-radius: var(--rt-radius-xs)}.rt-thread-list[data-rt-radius=sm]{--rt-thread-list-card-radius: var(--rt-radius-sm)}.rt-thread-list[data-rt-radius=ms]{--rt-thread-list-card-radius: var(--rt-radius-ms)}.rt-thread-list[data-rt-radius=md]{--rt-thread-list-card-radius: var(--rt-radius-md)}.rt-thread-list[data-rt-radius=lg]{--rt-thread-list-card-radius: var(--rt-radius-lg)}.rt-thread-list[data-rt-radius=xl]{--rt-thread-list-card-radius: var(--rt-radius-xl)}.rt-thread-list[data-rt-radius=\"2xl\"]{--rt-thread-list-card-radius: var(--rt-radius-2xl)}.rt-thread-list[data-rt-radius=full]{--rt-thread-list-card-radius: var(--rt-radius-full)}}\n"] }]
|
|
215
|
+
}], propDecorators: { rowTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtThreadListRowDirective), { isSignal: true }] }], rowActionsTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtThreadListRowActionsDirective), { isSignal: true }] }], filtersTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtThreadListFiltersDirective), { isSignal: true }] }], searchTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtThreadListSearchDirective), { isSignal: true }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], activeId: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeId", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], fetching: [{ type: i0.Input, args: [{ isSignal: true, alias: "fetching", required: false }] }], hasMore: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasMore", required: false }] }], filtersActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "filtersActive", required: false }] }], selectRow: [{ type: i0.Output, args: ["selectRow"] }], openInNewTab: [{ type: i0.Output, args: ["openInNewTab"] }], searchChange: [{ type: i0.Output, args: ["searchChange"] }], loadMore: [{ type: i0.Output, args: ["loadMore"] }] } });
|
|
190
216
|
|
|
191
217
|
/**
|
|
192
218
|
* Generated bundle index. Do not edit.
|
|
193
219
|
*/
|
|
194
220
|
|
|
195
|
-
export { RtThreadListComponent, RtThreadListFiltersDirective, RtThreadListRowDirective, RtThreadListSearchDirective };
|
|
221
|
+
export { RtThreadListComponent, RtThreadListFiltersDirective, RtThreadListRowActionsDirective, RtThreadListRowDirective, RtThreadListSearchDirective };
|
|
196
222
|
//# sourceMappingURL=rt-tools-ui-kit-v2-thread-list.mjs.map
|