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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +2 -0
  2. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -1
  3. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +2 -0
  4. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
  5. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +2 -0
  6. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
  7. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +2 -0
  8. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -1
  9. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +2 -0
  10. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs +2 -0
  12. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs.map +1 -1
  13. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +4 -0
  14. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
  15. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +4 -0
  16. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
  17. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +4 -0
  18. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
  19. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +2 -0
  20. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
  21. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs +2 -0
  22. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs.map +1 -1
  23. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +2 -0
  24. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -1
  25. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +2 -0
  26. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
  27. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +2 -0
  28. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
  29. package/fesm2022/rt-tools-ui-kit-v2-header.mjs +2 -0
  30. package/fesm2022/rt-tools-ui-kit-v2-header.mjs.map +1 -1
  31. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +103 -6
  32. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
  33. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +2 -0
  34. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -1
  35. package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs +2 -0
  36. package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs.map +1 -1
  37. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +2 -0
  38. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
  39. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +6 -1
  40. package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
  41. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +2 -0
  42. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
  43. package/fesm2022/rt-tools-ui-kit-v2-message.mjs +2 -0
  44. package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -1
  45. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +2 -0
  46. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
  47. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +2 -0
  48. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -1
  49. package/fesm2022/rt-tools-ui-kit-v2-pdf-viewer.mjs +2 -0
  50. package/fesm2022/rt-tools-ui-kit-v2-pdf-viewer.mjs.map +1 -1
  51. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs +2 -0
  52. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs.map +1 -1
  53. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +10 -0
  54. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  55. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +2 -0
  56. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
  57. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +6 -0
  58. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
  59. package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs +2 -0
  60. package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs.map +1 -1
  61. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +8 -0
  62. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
  63. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +2 -0
  64. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
  65. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +2 -0
  66. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -1
  67. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +2 -0
  68. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
  69. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +2 -0
  70. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
  71. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +14 -2
  72. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -1
  73. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +2 -0
  74. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
  75. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +2 -0
  76. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -1
  77. package/package.json +1 -1
  78. package/src/lib/components/icon-button/CONTEXT.md +32 -16
  79. package/src/lib/components/icon-button/rt-icon-button.component.scss +17 -9
  80. package/src/lib/components/input/CONTEXT.md +6 -0
  81. package/src/lib/components/tooltip/CONTEXT.md +3 -0
  82. package/src/styles/_form.scss +14 -1
  83. package/styles/tokens.css +13 -1
  84. package/types/rt-tools-ui-kit-v2-icon-button.d.ts +38 -2
  85. package/types/rt-tools-ui-kit-v2-input.d.ts +2 -0
  86. package/types/rt-tools-ui-kit-v2-tooltip.d.ts +6 -1
@@ -263,6 +263,8 @@ var RtFileCardComponent = class RtFileCardComponent {
263
263
  "disabled",
264
264
  "active",
265
265
  "expanded",
266
+ "ariaHaspopup",
267
+ "link",
266
268
  "indicator"
267
269
  ],
268
270
  outputs: ["clicked"]
@@ -1 +1 @@
1
- {"version":3,"file":"rt-tools-ui-kit-v2-file-card.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/file-card/file-card.helper.ts","../../../projects/ui-kit-v2/src/lib/components/file-card/rt-truncate-middle.pipe.ts","../../../projects/ui-kit-v2/src/lib/components/file-card/rt-file-card.component.ts","../../../projects/ui-kit-v2/src/lib/components/file-card/rt-file-card.component.html"],"sourcesContent":["import { IRtIcon } from '@rt-tools/ui-kit-v2/core';\n\n/** Иконка Word-семейства (несколько расширений делят один глиф). */\nconst ICON_WORD: IRtIcon.Name = 'attach-docx-doc';\n\n/** Иконка растровых изображений. */\nconst ICON_IMAGE: IRtIcon.Name = 'attach-jpg-png';\n\n/** Иконка презентаций. */\nconst ICON_PRESENTATION: IRtIcon.Name = 'attach-ppt-pptx';\n\n/** Иконка таблиц Excel-семейства. */\nconst ICON_SPREADSHEET: IRtIcon.Name = 'attach-xlsx-xls';\n\n/** Иконка архивов. */\nconst ICON_ARCHIVE: IRtIcon.Name = 'attach-zip-rar';\n\n/** Иконка web-форматов изображений/видео. */\nconst ICON_WEB_MEDIA: IRtIcon.Name = 'attach-webp';\n\n/**\n * Маппинг расширения файла → имя цветной иконки типа (`attach-*` в rt-icon-реестре).\n */\nconst FILE_TYPE_ICON: Readonly<Record<string, IRtIcon.Name>> = {\n doc: ICON_WORD,\n docx: ICON_WORD,\n odt: ICON_WORD,\n gif: ICON_IMAGE,\n jpg: ICON_IMAGE,\n jpeg: ICON_IMAGE,\n png: ICON_IMAGE,\n pdf: 'attach-pdf',\n ppt: ICON_PRESENTATION,\n pptx: ICON_PRESENTATION,\n txt: 'attach-txt',\n webp: ICON_WEB_MEDIA,\n webm: ICON_WEB_MEDIA,\n xls: ICON_SPREADSHEET,\n xlsx: ICON_SPREADSHEET,\n zip: ICON_ARCHIVE,\n rar: ICON_ARCHIVE,\n msg: 'attach-msg',\n eml: 'attach-eml',\n};\n\n/**\n * Возвращает имя иконки типа файла по его имени (берётся расширение после\n * последней точки). Неизвестное/отсутствующее расширение → нейтральный `attach-other`.\n */\nexport function getFileTypeIcon(fileName: string): IRtIcon.Name {\n const ext: string = fileName.split('.').pop()?.toLowerCase() ?? '';\n return FILE_TYPE_ICON[ext] ?? 'attach-other';\n}\n\n/**\n * Выводит читаемый заголовок из имени файла: отбрасывает расширение и заменяет\n * разделители `_`/`-` на пробелы (CamelCase намеренно НЕ разбивается — это давало\n * бы непредсказуемый результат на произвольных именах). Если после очистки строка\n * пустая (например имя было `.pdf`) — возвращается исходное имя.\n */\nexport function deriveFileTitle(fileName: string): string {\n const withoutExt: string = fileName.replace(/\\.[^./\\\\]+$/, '');\n const cleaned: string = withoutExt.replace(/[_-]+/g, ' ').replace(/\\s+/g, ' ').trim();\n return cleaned || fileName;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/** Многоточие, вставляемое в середину строки при усечении. */\nconst ELLIPSIS: string = '...';\n\n/** Длина строки по умолчанию, при которой включается усечение. */\nconst DEFAULT_MAX_LENGTH: number = 32;\n\n/**\n * Усекает длинное имя файла по середине, сохраняя расширение видимым:\n * `10588-1_EvaluationSearchReport.pdf` → `10588-1_EvaluationSearchRe...pdf`.\n *\n * Обычный CSS `text-overflow: ellipsis` режет хвост и теряет расширение —\n * поэтому усечение по середине делается здесь, а не в стилях. Усечение\n * посимвольное (не по ширине контейнера): предсказуемо и без измерений DOM.\n *\n * Pure-pipe: пересчитывается только при смене входа.\n */\n@Pipe({ name: 'rtTruncateMiddle' })\nexport class RtTruncateMiddlePipe implements PipeTransform {\n public transform(value: string | null | undefined, maxLength: number = DEFAULT_MAX_LENGTH): string {\n if (!value) {\n return '';\n }\n if (value.length <= maxLength) {\n return value;\n }\n\n const lastDot: number = value.lastIndexOf('.');\n const hasExt: boolean = lastDot > 0 && lastDot < value.length - 1;\n const ext: string = hasExt ? value.slice(lastDot + 1) : '';\n const base: string = hasExt ? value.slice(0, lastDot) : value;\n\n const headLength: number = maxLength - ext.length - ELLIPSIS.length;\n if (headLength <= 0) {\n // Расширение длиннее лимита — деградируем до простого усечения хвоста.\n return value.slice(0, Math.max(0, maxLength - ELLIPSIS.length)) + ELLIPSIS;\n }\n\n return base.slice(0, headLength) + ELLIPSIS + ext;\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { formatFileSize } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { IRtIconButton } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { deriveFileTitle, getFileTypeIcon } from './file-card.helper';\nimport { IRtFileCard } from './rt-file-card.model';\nimport { RtTruncateMiddlePipe } from './rt-truncate-middle.pipe';\n\nconst BEM_BLOCK: string = 'rt-file-card';\n\n/** Иконка типа файла крупнее прочего: по ней карточку находят взглядом. */\nconst ICON_SIZES: Readonly<Record<IRtFileCard.Size, IRtIcon.Size>> = {\n sm: 'sm',\n md: 'xl',\n lg: 'xl',\n};\n\n/** Кнопки действий: в компактной карточке они не должны задавать её высоту. */\nconst ACTION_SIZES: Readonly<Record<IRtFileCard.Size, IRtIconButton.Size>> = {\n sm: 'sm',\n md: 'sm',\n lg: 'md',\n};\n\n/**\n * Карточка загруженного файла: цветная иконка типа, заголовок (выведенный из имени),\n * усечённое по середине имя файла, бейдж размера и опциональные действия справа\n * (скачать / переименовать / удалить).\n *\n * Презентационный компонент: сам ничего не решает, только эмиттит события действий.\n * Кнопки включаются точечно через `showDownload`/`showRemove`/`showRename` — в режиме\n * загрузки обычно нужен только remove, при показе сохранённых файлов — download.\n *\n * `showRename` по умолчанию выключен и сейчас нигде не включается: бэкенд не\n * поддерживает переименование (`original_name` неизменяем после создания). Вход\n * оставлен, чтобы кнопку можно было включить без правки компонента, когда появится API.\n */\n@Component({\n selector: 'rt-file-card',\n templateUrl: './rt-file-card.component.html',\n styleUrls: ['./rt-file-card.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\n // pipes\n RtTruncateMiddlePipe,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[class.rt-file-card--sm]': \"size() === 'sm'\",\n '[class.rt-file-card--md]': \"size() === 'md'\",\n '[class.rt-file-card--lg]': \"size() === 'lg'\",\n },\n})\nexport class RtFileCardComponent {\n /** Имя цветной иконки типа файла по расширению. */\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly iconName: Signal<IRtIcon.Name> = computed((): IRtIcon.Name => getFileTypeIcon(this.name()));\n\n /** Заголовок карточки, выведенный из имени файла (без расширения, разделители → пробелы). */\n protected readonly title: Signal<string> = computed((): string => deriveFileTitle(this.name()));\n\n /** Отформатированный размер; пустая строка → размер неизвестен. */\n protected readonly sizeLabel: Signal<string> = computed((): string => formatFileSize(this.sizeBytes()));\n\n /** Показывать ли бейдж размера. */\n protected readonly hasSize: Signal<boolean> = computed((): boolean => this.sizeLabel() !== '');\n\n /** Размер иконки типа файла — маппится от размера карточки. */\n protected readonly iconSize: Signal<IRtIcon.Size> = computed((): IRtIcon.Size => ICON_SIZES[this.size()]);\n\n /** Размер кнопок действий — маппится от размера карточки. */\n protected readonly actionSize: Signal<IRtIconButton.Size> = computed((): IRtIconButton.Size => ACTION_SIZES[this.size()]);\n\n /** Имя файла с расширением — обязательно. */\n public readonly name: InputSignal<string> = input.required<string>();\n\n /** Размер в байтах. `null` → бейдж размера скрыт. */\n public readonly sizeBytes: InputSignal<number | null> = input<number | null>(null);\n\n /** Плотность карточки: `sm` для тесных мест вроде композера, `lg` — для страниц. */\n public readonly size: InputSignal<IRtFileCard.Size> = input<IRtFileCard.Size>('md');\n\n /** Показывать кнопку скачивания. */\n public readonly showDownload: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Показывать кнопку удаления. */\n public readonly showRemove: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Показывать кнопку переименования (отключена до появления API на бэке). */\n public readonly showRename: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Блокирует кнопки действий (например, во время сабмита формы). */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Запрошено скачивание файла. */\n public readonly download: OutputEmitterRef<void> = output<void>();\n\n /** Запрошено удаление файла. */\n public readonly removed: OutputEmitterRef<void> = output<void>();\n\n /** Запрошено переименование файла. */\n public readonly rename: OutputEmitterRef<void> = output<void>();\n\n protected onDownload(): void {\n this.download.emit();\n }\n\n protected onRemove(): void {\n this.removed.emit();\n }\n\n protected onRename(): void {\n this.rename.emit();\n }\n}\n","<ng-container rtBlock=\"rt-file-card\">\n <rt-icon rtElem=\"icon\" [size]=\"iconSize()\" [name]=\"iconName()\" />\n\n <span rtElem=\"text\">\n <span rtElem=\"title\" qa-dataid=\"file-card-title\" [rtTooltip]=\"title()\">{{ title() }}</span>\n <span rtElem=\"name\" qa-dataid=\"file-card-name\" [rtTooltip]=\"name()\">{{ name() | rtTruncateMiddle }}</span>\n </span>\n\n <span rtElem=\"meta\">\n @if (hasSize()) {\n <span rtElem=\"size\" qa-dataid=\"file-card-size\">{{ sizeLabel() }}</span>\n }\n\n @if (showDownload()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"file-card-download\"\n icon=\"ico-download\"\n variant=\"ghost\"\n [ariaLabel]=\"t().uiDownload\"\n [tooltip]=\"t().uiDownload\"\n [size]=\"actionSize()\"\n [disabled]=\"disabled()\"\n (clicked)=\"onDownload()\" />\n }\n\n @if (showRename()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"file-card-rename\"\n icon=\"ico-edit\"\n variant=\"ghost\"\n [ariaLabel]=\"t().uiRename\"\n [tooltip]=\"t().uiRename\"\n [size]=\"actionSize()\"\n [disabled]=\"disabled()\"\n (clicked)=\"onRename()\" />\n }\n\n @if (showRemove()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"file-card-remove\"\n icon=\"ico-trash\"\n variant=\"ghost\"\n [ariaLabel]=\"t().uiRemove\"\n [tooltip]=\"t().uiRemove\"\n [size]=\"actionSize()\"\n [disabled]=\"disabled()\"\n (clicked)=\"onRemove()\" />\n }\n </span>\n</ng-container>\n"],"mappings":"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"}
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-file-card.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/file-card/file-card.helper.ts","../../../projects/ui-kit-v2/src/lib/components/file-card/rt-truncate-middle.pipe.ts","../../../projects/ui-kit-v2/src/lib/components/file-card/rt-file-card.component.ts","../../../projects/ui-kit-v2/src/lib/components/file-card/rt-file-card.component.html"],"sourcesContent":["import { IRtIcon } from '@rt-tools/ui-kit-v2/core';\n\n/** Иконка Word-семейства (несколько расширений делят один глиф). */\nconst ICON_WORD: IRtIcon.Name = 'attach-docx-doc';\n\n/** Иконка растровых изображений. */\nconst ICON_IMAGE: IRtIcon.Name = 'attach-jpg-png';\n\n/** Иконка презентаций. */\nconst ICON_PRESENTATION: IRtIcon.Name = 'attach-ppt-pptx';\n\n/** Иконка таблиц Excel-семейства. */\nconst ICON_SPREADSHEET: IRtIcon.Name = 'attach-xlsx-xls';\n\n/** Иконка архивов. */\nconst ICON_ARCHIVE: IRtIcon.Name = 'attach-zip-rar';\n\n/** Иконка web-форматов изображений/видео. */\nconst ICON_WEB_MEDIA: IRtIcon.Name = 'attach-webp';\n\n/**\n * Маппинг расширения файла → имя цветной иконки типа (`attach-*` в rt-icon-реестре).\n */\nconst FILE_TYPE_ICON: Readonly<Record<string, IRtIcon.Name>> = {\n doc: ICON_WORD,\n docx: ICON_WORD,\n odt: ICON_WORD,\n gif: ICON_IMAGE,\n jpg: ICON_IMAGE,\n jpeg: ICON_IMAGE,\n png: ICON_IMAGE,\n pdf: 'attach-pdf',\n ppt: ICON_PRESENTATION,\n pptx: ICON_PRESENTATION,\n txt: 'attach-txt',\n webp: ICON_WEB_MEDIA,\n webm: ICON_WEB_MEDIA,\n xls: ICON_SPREADSHEET,\n xlsx: ICON_SPREADSHEET,\n zip: ICON_ARCHIVE,\n rar: ICON_ARCHIVE,\n msg: 'attach-msg',\n eml: 'attach-eml',\n};\n\n/**\n * Возвращает имя иконки типа файла по его имени (берётся расширение после\n * последней точки). Неизвестное/отсутствующее расширение → нейтральный `attach-other`.\n */\nexport function getFileTypeIcon(fileName: string): IRtIcon.Name {\n const ext: string = fileName.split('.').pop()?.toLowerCase() ?? '';\n return FILE_TYPE_ICON[ext] ?? 'attach-other';\n}\n\n/**\n * Выводит читаемый заголовок из имени файла: отбрасывает расширение и заменяет\n * разделители `_`/`-` на пробелы (CamelCase намеренно НЕ разбивается — это давало\n * бы непредсказуемый результат на произвольных именах). Если после очистки строка\n * пустая (например имя было `.pdf`) — возвращается исходное имя.\n */\nexport function deriveFileTitle(fileName: string): string {\n const withoutExt: string = fileName.replace(/\\.[^./\\\\]+$/, '');\n const cleaned: string = withoutExt.replace(/[_-]+/g, ' ').replace(/\\s+/g, ' ').trim();\n return cleaned || fileName;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/** Многоточие, вставляемое в середину строки при усечении. */\nconst ELLIPSIS: string = '...';\n\n/** Длина строки по умолчанию, при которой включается усечение. */\nconst DEFAULT_MAX_LENGTH: number = 32;\n\n/**\n * Усекает длинное имя файла по середине, сохраняя расширение видимым:\n * `10588-1_EvaluationSearchReport.pdf` → `10588-1_EvaluationSearchRe...pdf`.\n *\n * Обычный CSS `text-overflow: ellipsis` режет хвост и теряет расширение —\n * поэтому усечение по середине делается здесь, а не в стилях. Усечение\n * посимвольное (не по ширине контейнера): предсказуемо и без измерений DOM.\n *\n * Pure-pipe: пересчитывается только при смене входа.\n */\n@Pipe({ name: 'rtTruncateMiddle' })\nexport class RtTruncateMiddlePipe implements PipeTransform {\n public transform(value: string | null | undefined, maxLength: number = DEFAULT_MAX_LENGTH): string {\n if (!value) {\n return '';\n }\n if (value.length <= maxLength) {\n return value;\n }\n\n const lastDot: number = value.lastIndexOf('.');\n const hasExt: boolean = lastDot > 0 && lastDot < value.length - 1;\n const ext: string = hasExt ? value.slice(lastDot + 1) : '';\n const base: string = hasExt ? value.slice(0, lastDot) : value;\n\n const headLength: number = maxLength - ext.length - ELLIPSIS.length;\n if (headLength <= 0) {\n // Расширение длиннее лимита — деградируем до простого усечения хвоста.\n return value.slice(0, Math.max(0, maxLength - ELLIPSIS.length)) + ELLIPSIS;\n }\n\n return base.slice(0, headLength) + ELLIPSIS + ext;\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { formatFileSize } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { IRtIconButton } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { deriveFileTitle, getFileTypeIcon } from './file-card.helper';\nimport { IRtFileCard } from './rt-file-card.model';\nimport { RtTruncateMiddlePipe } from './rt-truncate-middle.pipe';\n\nconst BEM_BLOCK: string = 'rt-file-card';\n\n/** Иконка типа файла крупнее прочего: по ней карточку находят взглядом. */\nconst ICON_SIZES: Readonly<Record<IRtFileCard.Size, IRtIcon.Size>> = {\n sm: 'sm',\n md: 'xl',\n lg: 'xl',\n};\n\n/** Кнопки действий: в компактной карточке они не должны задавать её высоту. */\nconst ACTION_SIZES: Readonly<Record<IRtFileCard.Size, IRtIconButton.Size>> = {\n sm: 'sm',\n md: 'sm',\n lg: 'md',\n};\n\n/**\n * Карточка загруженного файла: цветная иконка типа, заголовок (выведенный из имени),\n * усечённое по середине имя файла, бейдж размера и опциональные действия справа\n * (скачать / переименовать / удалить).\n *\n * Презентационный компонент: сам ничего не решает, только эмиттит события действий.\n * Кнопки включаются точечно через `showDownload`/`showRemove`/`showRename` — в режиме\n * загрузки обычно нужен только remove, при показе сохранённых файлов — download.\n *\n * `showRename` по умолчанию выключен и сейчас нигде не включается: бэкенд не\n * поддерживает переименование (`original_name` неизменяем после создания). Вход\n * оставлен, чтобы кнопку можно было включить без правки компонента, когда появится API.\n */\n@Component({\n selector: 'rt-file-card',\n templateUrl: './rt-file-card.component.html',\n styleUrls: ['./rt-file-card.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\n // pipes\n RtTruncateMiddlePipe,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[class.rt-file-card--sm]': \"size() === 'sm'\",\n '[class.rt-file-card--md]': \"size() === 'md'\",\n '[class.rt-file-card--lg]': \"size() === 'lg'\",\n },\n})\nexport class RtFileCardComponent {\n /** Имя цветной иконки типа файла по расширению. */\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly iconName: Signal<IRtIcon.Name> = computed((): IRtIcon.Name => getFileTypeIcon(this.name()));\n\n /** Заголовок карточки, выведенный из имени файла (без расширения, разделители → пробелы). */\n protected readonly title: Signal<string> = computed((): string => deriveFileTitle(this.name()));\n\n /** Отформатированный размер; пустая строка → размер неизвестен. */\n protected readonly sizeLabel: Signal<string> = computed((): string => formatFileSize(this.sizeBytes()));\n\n /** Показывать ли бейдж размера. */\n protected readonly hasSize: Signal<boolean> = computed((): boolean => this.sizeLabel() !== '');\n\n /** Размер иконки типа файла — маппится от размера карточки. */\n protected readonly iconSize: Signal<IRtIcon.Size> = computed((): IRtIcon.Size => ICON_SIZES[this.size()]);\n\n /** Размер кнопок действий — маппится от размера карточки. */\n protected readonly actionSize: Signal<IRtIconButton.Size> = computed((): IRtIconButton.Size => ACTION_SIZES[this.size()]);\n\n /** Имя файла с расширением — обязательно. */\n public readonly name: InputSignal<string> = input.required<string>();\n\n /** Размер в байтах. `null` → бейдж размера скрыт. */\n public readonly sizeBytes: InputSignal<number | null> = input<number | null>(null);\n\n /** Плотность карточки: `sm` для тесных мест вроде композера, `lg` — для страниц. */\n public readonly size: InputSignal<IRtFileCard.Size> = input<IRtFileCard.Size>('md');\n\n /** Показывать кнопку скачивания. */\n public readonly showDownload: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Показывать кнопку удаления. */\n public readonly showRemove: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Показывать кнопку переименования (отключена до появления API на бэке). */\n public readonly showRename: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Блокирует кнопки действий (например, во время сабмита формы). */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Запрошено скачивание файла. */\n public readonly download: OutputEmitterRef<void> = output<void>();\n\n /** Запрошено удаление файла. */\n public readonly removed: OutputEmitterRef<void> = output<void>();\n\n /** Запрошено переименование файла. */\n public readonly rename: OutputEmitterRef<void> = output<void>();\n\n protected onDownload(): void {\n this.download.emit();\n }\n\n protected onRemove(): void {\n this.removed.emit();\n }\n\n protected onRename(): void {\n this.rename.emit();\n }\n}\n","<ng-container rtBlock=\"rt-file-card\">\n <rt-icon rtElem=\"icon\" [size]=\"iconSize()\" [name]=\"iconName()\" />\n\n <span rtElem=\"text\">\n <span rtElem=\"title\" qa-dataid=\"file-card-title\" [rtTooltip]=\"title()\">{{ title() }}</span>\n <span rtElem=\"name\" qa-dataid=\"file-card-name\" [rtTooltip]=\"name()\">{{ name() | rtTruncateMiddle }}</span>\n </span>\n\n <span rtElem=\"meta\">\n @if (hasSize()) {\n <span rtElem=\"size\" qa-dataid=\"file-card-size\">{{ sizeLabel() }}</span>\n }\n\n @if (showDownload()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"file-card-download\"\n icon=\"ico-download\"\n variant=\"ghost\"\n [ariaLabel]=\"t().uiDownload\"\n [tooltip]=\"t().uiDownload\"\n [size]=\"actionSize()\"\n [disabled]=\"disabled()\"\n (clicked)=\"onDownload()\" />\n }\n\n @if (showRename()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"file-card-rename\"\n icon=\"ico-edit\"\n variant=\"ghost\"\n [ariaLabel]=\"t().uiRename\"\n [tooltip]=\"t().uiRename\"\n [size]=\"actionSize()\"\n [disabled]=\"disabled()\"\n (clicked)=\"onRename()\" />\n }\n\n @if (showRemove()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"file-card-remove\"\n icon=\"ico-trash\"\n variant=\"ghost\"\n [ariaLabel]=\"t().uiRemove\"\n [tooltip]=\"t().uiRemove\"\n [size]=\"actionSize()\"\n [disabled]=\"disabled()\"\n (clicked)=\"onRemove()\" />\n }\n </span>\n</ng-container>\n"],"mappings":"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"}
@@ -99,6 +99,8 @@ var RtHeaderComponent = class RtHeaderComponent {
99
99
  "disabled",
100
100
  "active",
101
101
  "expanded",
102
+ "ariaHaspopup",
103
+ "link",
102
104
  "indicator"
103
105
  ],
104
106
  outputs: ["clicked"]
@@ -1 +1 @@
1
- {"version":3,"file":"rt-tools-ui-kit-v2-header.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/header/rt-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/header/rt-header.component.html"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\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 { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtLogoComponent } from '@rt-tools/ui-kit-v2/logo';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\n\nconst BEM_BLOCK: string = 'rt-header';\n\n/**\n * Общий хедер приложения.\n *\n * Слева — slot 35×45 под back-button (rt-icon-button arrow-left, ghost variant),\n * который виден по входному сигналу `canGoBack` и эмитит `backClick`. Когда\n * `canGoBack=false` (default) — slot полностью скрыт через display:none, wordmark\n * выравнивается слева.\n *\n * Далее — wordmark, справа — action-иконки (rt-icon-button шагом md): опциональная «Пригласить пользователя»\n * (`showInvite`), слот колокольчика и профиль.\n *\n * Колокольчик уведомлений — проекция `[rtHeaderBell]`: домен кладёт в слот\n * `rt-notifications-bell` (общий попап-компонент), хедер про его устройство не знает.\n *\n * Темизация — через семантические `--rt-color-bg-surface` / `--rt-color-text-primary`,\n * dark override карточного фона выполняется в SCSS (header navy совпадает с фоном\n * страницы в dark).\n */\n@Component({\n selector: 'rt-header',\n templateUrl: './rt-header.component.html',\n styleUrls: ['./rt-header.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n RtLogoComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtHeaderComponent {\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n public readonly canGoBack: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Показывать action-иконку «Пригласить пользователя» слева от колокола. */\n public readonly showInvite: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n public readonly backClick: OutputEmitterRef<void> = output<void>();\n public readonly inviteClick: OutputEmitterRef<void> = output<void>();\n public readonly profileClick: OutputEmitterRef<void> = output<void>();\n\n protected onBackClick(): void {\n this.backClick.emit();\n }\n\n protected onInviteClick(): void {\n this.inviteClick.emit();\n }\n\n protected onProfileClick(): void {\n this.profileClick.emit();\n }\n}\n","<ng-container rtBlock=\"rt-header\">\n <div rtElem=\"content\">\n <rt-icon-button\n rtElem=\"back\"\n qa-dataid=\"header-back\"\n icon=\"arrow-left\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiBack\"\n [tooltip]=\"t().uiBack\"\n [rtMod]=\"{ visible: canGoBack() }\"\n (clicked)=\"onBackClick()\" />\n\n <div rtElem=\"logo\" qa-dataid=\"header-logo\">\n <rt-logo variant=\"wordmark\" height=\"15\" />\n </div>\n\n @if (showInvite()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"header-invite\"\n icon=\"user-plus\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiInviteUser\"\n [tooltip]=\"t().uiInviteUser\"\n (clicked)=\"onInviteClick()\" />\n }\n\n <ng-content select=\"[rtHeaderBell]\" />\n\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"header-profile\"\n icon=\"user\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiProfile\"\n [tooltip]=\"t().uiProfile\"\n (clicked)=\"onProfileClick()\" />\n </div>\n</ng-container>\n"],"mappings":";;;;;;;;AAqBA,MAAM,YAAoB;AAuC1B,IAAa,oBAAb,MAAa,kBAAiB;CAnB9B,cAAA;EAoBuB,KAAA,IAA4B,OAAO,aAAa;EAEnD,KAAA,YAA6D,MAA6B,OAAK;GAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;GAC3G,WAAW;EAAgB,CAAA;EAIf,KAAA,aAAkE,MAAiC,OAAK;GAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;GACpH,WAAW;EAAgB,CAAA;EAGf,KAAA,YAAoC,OAAM;EAC1C,KAAA,cAAsC,OAAM;EAC5C,KAAA,eAAuC,OAAM;CAahE;CAXa,cAAW;EACjB,KAAK,UAAU,KAAI;CACvB;CAEU,gBAAa;EACnB,KAAK,YAAY,KAAI;CACzB;CAEU,iBAAc;EACpB,KAAK,aAAa,KAAI;CAC1B;CA1BS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAiB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAjB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAiB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,WAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,YAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;GAAA;GAAA,SAAA;IAAA,WAAA;IAAA,aAAA;IAAA,cAAA;GAAA;GAAA,MAAA,EAAA,gBAAA,YAAA;GAAA,gBAAA,CAAA;IAAA,WAAA,GAAA;IAAA,QAAA,CAAA,UAAA,QAAA;GAAA,CAAA;GAAA,UAAA;GAAA,UC5D9B;GA6CA,QAAA,CAAA,06DAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDIQ;KAAqB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACrB;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAAc,UAAA;KAAA,QAAA,CAAA,OAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACd;KAAa,UAAA;KAAA,QAAA,CAAA,OAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACb;KAAY,UAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;GAAA,eAAA,GAAA,kBAAA;EAAA,CAAA;CAAA;;AAOP,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAnB7B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAW,iBAGJ,wBAAwB;GAAM,eAChC,kBAAkB;GAAI,SAC5B;IAEL;IACA;IACA;IACA;IACA;GACH;GAAA,gBACe,CAAC;IAAE,WAAW;IAAmB,QAAQ,CAAC,QAAQ;GAAC,CAAE;GAAC,MAChE,EACF,OAAO,UACV;GAAA,UAAA;GAAA,QAAA,CAAA,06DAAA;EAAA,CAAA"}
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-header.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/header/rt-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/header/rt-header.component.html"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\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 { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtLogoComponent } from '@rt-tools/ui-kit-v2/logo';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\n\nconst BEM_BLOCK: string = 'rt-header';\n\n/**\n * Общий хедер приложения.\n *\n * Слева — slot 35×45 под back-button (rt-icon-button arrow-left, ghost variant),\n * который виден по входному сигналу `canGoBack` и эмитит `backClick`. Когда\n * `canGoBack=false` (default) — slot полностью скрыт через display:none, wordmark\n * выравнивается слева.\n *\n * Далее — wordmark, справа — action-иконки (rt-icon-button шагом md): опциональная «Пригласить пользователя»\n * (`showInvite`), слот колокольчика и профиль.\n *\n * Колокольчик уведомлений — проекция `[rtHeaderBell]`: домен кладёт в слот\n * `rt-notifications-bell` (общий попап-компонент), хедер про его устройство не знает.\n *\n * Темизация — через семантические `--rt-color-bg-surface` / `--rt-color-text-primary`,\n * dark override карточного фона выполняется в SCSS (header navy совпадает с фоном\n * страницы в dark).\n */\n@Component({\n selector: 'rt-header',\n templateUrl: './rt-header.component.html',\n styleUrls: ['./rt-header.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n RtLogoComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtHeaderComponent {\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n public readonly canGoBack: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Показывать action-иконку «Пригласить пользователя» слева от колокола. */\n public readonly showInvite: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n public readonly backClick: OutputEmitterRef<void> = output<void>();\n public readonly inviteClick: OutputEmitterRef<void> = output<void>();\n public readonly profileClick: OutputEmitterRef<void> = output<void>();\n\n protected onBackClick(): void {\n this.backClick.emit();\n }\n\n protected onInviteClick(): void {\n this.inviteClick.emit();\n }\n\n protected onProfileClick(): void {\n this.profileClick.emit();\n }\n}\n","<ng-container rtBlock=\"rt-header\">\n <div rtElem=\"content\">\n <rt-icon-button\n rtElem=\"back\"\n qa-dataid=\"header-back\"\n icon=\"arrow-left\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiBack\"\n [tooltip]=\"t().uiBack\"\n [rtMod]=\"{ visible: canGoBack() }\"\n (clicked)=\"onBackClick()\" />\n\n <div rtElem=\"logo\" qa-dataid=\"header-logo\">\n <rt-logo variant=\"wordmark\" height=\"15\" />\n </div>\n\n @if (showInvite()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"header-invite\"\n icon=\"user-plus\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiInviteUser\"\n [tooltip]=\"t().uiInviteUser\"\n (clicked)=\"onInviteClick()\" />\n }\n\n <ng-content select=\"[rtHeaderBell]\" />\n\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"header-profile\"\n icon=\"user\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiProfile\"\n [tooltip]=\"t().uiProfile\"\n (clicked)=\"onProfileClick()\" />\n </div>\n</ng-container>\n"],"mappings":";;;;;;;;AAqBA,MAAM,YAAoB;AAuC1B,IAAa,oBAAb,MAAa,kBAAiB;CAnB9B,cAAA;EAoBuB,KAAA,IAA4B,OAAO,aAAa;EAEnD,KAAA,YAA6D,MAA6B,OAAK;GAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;GAC3G,WAAW;EAAgB,CAAA;EAIf,KAAA,aAAkE,MAAiC,OAAK;GAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;GACpH,WAAW;EAAgB,CAAA;EAGf,KAAA,YAAoC,OAAM;EAC1C,KAAA,cAAsC,OAAM;EAC5C,KAAA,eAAuC,OAAM;CAahE;CAXa,cAAW;EACjB,KAAK,UAAU,KAAI;CACvB;CAEU,gBAAa;EACnB,KAAK,YAAY,KAAI;CACzB;CAEU,iBAAc;EACpB,KAAK,aAAa,KAAI;CAC1B;CA1BS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAiB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAjB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAiB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,WAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,YAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;GAAA;GAAA,SAAA;IAAA,WAAA;IAAA,aAAA;IAAA,cAAA;GAAA;GAAA,MAAA,EAAA,gBAAA,YAAA;GAAA,gBAAA,CAAA;IAAA,WAAA,GAAA;IAAA,QAAA,CAAA,UAAA,QAAA;GAAA,CAAA;GAAA,UAAA;GAAA,UC5D9B;GA6CA,QAAA,CAAA,06DAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDIQ;KAAqB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACrB;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAAc,UAAA;KAAA,QAAA,CAAA,OAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACd;KAAa,UAAA;KAAA,QAAA,CAAA,OAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACb;KAAY,UAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;GAAA,eAAA,GAAA,kBAAA;EAAA,CAAA;CAAA;;AAOP,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAnB7B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAW,iBAGJ,wBAAwB;GAAM,eAChC,kBAAkB;GAAI,SAC5B;IAEL;IACA;IACA;IACA;IACA;GACH;GAAA,gBACe,CAAC;IAAE,WAAW;IAAmB,QAAQ,CAAC,QAAQ;GAAC,CAAE;GAAC,MAChE,EACF,OAAO,UACV;GAAA,UAAA;GAAA,QAAA,CAAA,06DAAA;EAAA,CAAA"}
@@ -1,6 +1,8 @@
1
1
  import { CdkMonitorFocus } from "@angular/cdk/a11y";
2
+ import { NgTemplateOutlet } from "@angular/common";
2
3
  import * as i0 from "@angular/core";
3
- import { ChangeDetectionStrategy, Component, ViewEncapsulation, booleanAttribute, computed, input, numberAttribute, output } from "@angular/core";
4
+ import { ChangeDetectionStrategy, Component, ViewEncapsulation, booleanAttribute, computed, input, numberAttribute, output, viewChild } from "@angular/core";
5
+ import { RouterLink } from "@angular/router";
4
6
  import { BlockDirective, ElemDirective, ModDirective } from "@rt-tools/core";
5
7
  import { RtIconComponent } from "@rt-tools/ui-kit-v2/icon";
6
8
  import { rtKitDefault } from "@rt-tools/ui-kit-v2/core";
@@ -22,6 +24,11 @@ var RtIconButtonComponent = class RtIconButtonComponent {
22
24
  "2xl": "2xl"
23
25
  }[this.size()];
24
26
  }, ...ngDevMode ? [{ debugName: "resolvedIconSize" }] : /* istanbul ignore next */ []);
27
+ this.buttonEl = viewChild("buttonEl", ...ngDevMode ? [{ debugName: "buttonEl" }] : /* istanbul ignore next */ []);
28
+ this.linkEl = viewChild("linkEl", ...ngDevMode ? [{ debugName: "linkEl" }] : /* istanbul ignore next */ []);
29
+ this.isLink = computed(() => this.link() !== null, ...ngDevMode ? [{ debugName: "isLink" }] : /* istanbul ignore next */ []);
30
+ this.linkTarget = computed(() => this.isDisabled() ? null : this.link(), ...ngDevMode ? [{ debugName: "linkTarget" }] : /* istanbul ignore next */ []);
31
+ this.linkTabIndex = computed(() => this.isDisabled() ? -1 : this.tabIndex(), ...ngDevMode ? [{ debugName: "linkTabIndex" }] : /* istanbul ignore next */ []);
25
32
  this.isDisabled = computed(() => this.disabled() || this.loading(), ...ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []);
26
33
  this.bemMods = computed(() => ({
27
34
  [this.variant()]: true,
@@ -64,14 +71,22 @@ var RtIconButtonComponent = class RtIconButtonComponent {
64
71
  transform: booleanAttribute
65
72
  });
66
73
  this.expanded = input(null, ...ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []);
74
+ this.ariaHaspopup = input(null, ...ngDevMode ? [{ debugName: "ariaHaspopup" }] : /* istanbul ignore next */ []);
75
+ this.link = input(null, ...ngDevMode ? [{ debugName: "link" }] : /* istanbul ignore next */ []);
67
76
  this.indicator = input(false, {
68
77
  ...ngDevMode ? { debugName: "indicator" } : /* istanbul ignore next */ {},
69
78
  transform: booleanAttribute
70
79
  });
71
80
  this.clicked = output();
72
81
  }
82
+ focus(options) {
83
+ (this.linkEl() ?? this.buttonEl())?.nativeElement.focus(options);
84
+ }
73
85
  onClick(event) {
74
- if (this.isDisabled()) return;
86
+ if (this.isDisabled()) {
87
+ event.preventDefault();
88
+ return;
89
+ }
75
90
  this.clicked.emit(event);
76
91
  }
77
92
  static {
@@ -204,6 +219,20 @@ var RtIconButtonComponent = class RtIconButtonComponent {
204
219
  isRequired: false,
205
220
  transformFunction: null
206
221
  },
222
+ ariaHaspopup: {
223
+ classPropertyName: "ariaHaspopup",
224
+ publicName: "ariaHaspopup",
225
+ isSignal: true,
226
+ isRequired: false,
227
+ transformFunction: null
228
+ },
229
+ link: {
230
+ classPropertyName: "link",
231
+ publicName: "link",
232
+ isSignal: true,
233
+ isRequired: false,
234
+ transformFunction: null
235
+ },
207
236
  indicator: {
208
237
  classPropertyName: "indicator",
209
238
  publicName: "indicator",
@@ -214,14 +243,56 @@ var RtIconButtonComponent = class RtIconButtonComponent {
214
243
  },
215
244
  outputs: { clicked: "clicked" },
216
245
  host: { classAttribute: "rt-icon-button" },
246
+ viewQueries: [{
247
+ propertyName: "buttonEl",
248
+ first: true,
249
+ predicate: ["buttonEl"],
250
+ descendants: true,
251
+ isSignal: true
252
+ }, {
253
+ propertyName: "linkEl",
254
+ first: true,
255
+ predicate: ["linkEl"],
256
+ descendants: true,
257
+ isSignal: true
258
+ }],
217
259
  hostDirectives: [{
218
260
  directive: i1.RtRadiusDirective,
219
261
  inputs: ["radius", "radius"]
220
262
  }],
221
263
  ngImport: i0,
222
- template: "<button\n rtBlock=\"rt-icon-button\"\n qa-dataid=\"icon-button-control\"\n rtRipple\n cdkMonitorElementFocus\n [rippleDisabled]=\"isDisabled() || loading()\"\n [rtTooltip]=\"tooltip()\"\n [rtTooltipHideOnClick]=\"tooltipHideOnClick()\"\n [rtMod]=\"bemMods()\"\n [type]=\"type()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-pressed]=\"active() ? 'true' : null\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.tabindex]=\"tabIndex()\"\n (click)=\"onClick($event)\">\n @if (loading()) {\n <rt-icon rtElem=\"spinner\" name=\"spinner\" color=\"current\" [size]=\"resolvedIconSize()\" />\n } @else if (icon() || glyph()) {\n <rt-icon rtElem=\"icon\" [color]=\"iconColor()\" [name]=\"icon()\" [glyph]=\"glyph()\" [size]=\"resolvedIconSize()\" [fill]=\"iconFill()\" />\n } @else {\n <span rtElem=\"content\" qa-dataid=\"icon-button-content\"><ng-content /></span>\n }\n @if (indicator()) {\n <span rtElem=\"indicator\" aria-hidden=\"true\"></span>\n }\n</button>\n",
223
- styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-icon-button{display:inline-flex;--rt-icon-button-color: var(--rt-color-text-primary)}rt-icon-button .rt-icon-button{--rt-icon-button-radius: var(--rt-radius-md);--rt-icon-button-indicator-radius: var(--rt-radius-full);--rt-icon-button-focus-shadow: var(--rt-shadow-focus-ring);--rt-icon-button-shadow: var(--rt-shadow-none);--rt-icon-button-shadow-hover: var(--rt-icon-button-shadow);--rt-icon-button-color-hover: var(--rt-icon-button-color);--rt-icon-button-transition-duration: var(--rt-duration-fast);--rt-icon-button-bg-variant: transparent;--rt-icon-button-size-step: var(--rt-control-height-md);position:relative;display:inline-flex;width:var(--rt-icon-button-size, var(--rt-icon-button-size-step));height:var(--rt-icon-button-size, var(--rt-icon-button-size-step));align-items:center;justify-content:center;padding:0;border:0;border-radius:var(--rt-icon-button-radius);background-color:var(--rt-icon-button-bg, var(--rt-icon-button-bg-variant));box-shadow:var(--rt-icon-button-shadow);color:var(--rt-icon-button-color);cursor:pointer;transition:background-color var(--rt-icon-button-transition-duration) ease,box-shadow var(--rt-icon-button-transition-duration) ease}rt-icon-button .rt-icon-button--2xs{--rt-icon-button-size-step: var(--rt-size-5)}rt-icon-button .rt-icon-button--xs{--rt-icon-button-size-step: 22px}rt-icon-button .rt-icon-button--sm{--rt-icon-button-size-step: var(--rt-control-height-sm)}rt-icon-button .rt-icon-button--md{--rt-icon-button-size-step: var(--rt-control-height-md)}rt-icon-button .rt-icon-button--lg{--rt-icon-button-size-step: var(--rt-control-height-lg)}rt-icon-button .rt-icon-button--xl{--rt-icon-button-size-step: var(--rt-control-height-xl)}rt-icon-button .rt-icon-button--2xl{--rt-icon-button-size-step: var(--rt-control-height-2xl)}rt-icon-button .rt-icon-button:hover:not(:disabled){box-shadow:var(--rt-icon-button-shadow-hover)}rt-icon-button .rt-icon-button--ghost:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover));color:var(--rt-icon-button-color-hover)}rt-icon-button .rt-icon-button--ghost.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--primary{--rt-icon-button-bg-variant: var(--rt-color-action-primary);color:var(--rt-color-action-on-primary)}rt-icon-button .rt-icon-button--primary:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-color-action-primary-hover))}rt-icon-button .rt-icon-button--secondary{--rt-icon-button-bg-variant: var(--rt-color-bg-surface-subtle);color:var(--rt-color-text-primary)}rt-icon-button .rt-icon-button--secondary:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--danger{color:var(--rt-color-state-danger)}rt-icon-button .rt-icon-button--danger:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--danger.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--success{color:var(--rt-color-state-success)}rt-icon-button .rt-icon-button--success:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--success.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--warning{color:var(--rt-color-state-warning)}rt-icon-button .rt-icon-button--warning:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--warning.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button:disabled{background-color:color-mix(in srgb,var(--rt-icon-button-bg, var(--rt-icon-button-bg-variant)) var(--rt-icon-button-disabled-fill),transparent);cursor:not-allowed;opacity:var(--rt-icon-button-disabled-opacity)}rt-icon-button .rt-icon-button:disabled .rt-icon svg{color:var(--rt-icon-button-disabled-color)}rt-icon-button .rt-icon-button:focus-visible:not(.cdk-mouse-focused,.cdk-touch-focused){box-shadow:var(--rt-icon-button-focus-shadow);outline:2px solid transparent;outline-offset:2px}rt-icon-button .rt-icon-button__content{display:inline-flex;align-items:center;justify-content:center;color:inherit;line-height:1}rt-icon-button .rt-icon-button__spinner{--rt-icon-button-spin-duration: 1s;animation:rt-icon-button-spin var(--rt-icon-button-spin-duration) linear infinite}rt-icon-button .rt-icon-button__indicator{position:absolute;width:8px;height:8px;border-radius:var(--rt-icon-button-indicator-radius);background:var(--rt-color-state-danger);inset-block-start:-2px;inset-inline-end:-2px;pointer-events:none}rt-icon-button[data-rt-radius=none]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-none)}rt-icon-button[data-rt-radius=xs]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-xs)}rt-icon-button[data-rt-radius=sm]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-sm)}rt-icon-button[data-rt-radius=ms]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-ms)}rt-icon-button[data-rt-radius=md]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-md)}rt-icon-button[data-rt-radius=lg]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-lg)}rt-icon-button[data-rt-radius=xl]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-xl)}rt-icon-button[data-rt-radius=\"2xl\"]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-2xl)}rt-icon-button[data-rt-radius=full]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-full)}@keyframes rt-icon-button-spin{to{transform:rotate(360deg)}}}\n"],
264
+ template: "<!-- Ссылка стоит перед кнопкой: в режиме ссылки поиск по `qa-dataid` находит её первой. -->\n@if (isLink()) {\n <a\n #linkEl\n rtBlock=\"rt-icon-button\"\n qa-dataid=\"icon-button-control\"\n rtRipple\n cdkMonitorElementFocus\n [routerLink]=\"linkTarget()\"\n [rippleDisabled]=\"isDisabled()\"\n [rtTooltip]=\"tooltip()\"\n [rtTooltipHideOnClick]=\"tooltipHideOnClick()\"\n [rtMod]=\"bemMods()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : null\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-haspopup]=\"ariaHaspopup()\"\n [attr.tabindex]=\"linkTabIndex()\"\n (click)=\"onClick($event)\">\n <ng-container *ngTemplateOutlet=\"content\" />\n </a>\n}\n\n<!-- Кнопка стоит в шаблоне без условия и появляется с первым проходом, как до входа `link`: в\n блоке `@if` она рождалась бы проходом позже, и родитель, который меряет соседей на первой\n проверке (автовысота поля сообщения), считал бы ряд без неё. У ссылки кнопка спрятана. -->\n<button\n #buttonEl\n rtBlock=\"rt-icon-button\"\n qa-dataid=\"icon-button-control\"\n rtRipple\n cdkMonitorElementFocus\n [hidden]=\"isLink()\"\n [rippleDisabled]=\"isDisabled() || loading()\"\n [rtTooltip]=\"isLink() ? '' : tooltip()\"\n [rtTooltipHideOnClick]=\"tooltipHideOnClick()\"\n [rtMod]=\"bemMods()\"\n [type]=\"type()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-pressed]=\"active() ? 'true' : null\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-haspopup]=\"ariaHaspopup()\"\n [attr.tabindex]=\"tabIndex()\"\n (click)=\"onClick($event)\">\n @if (!isLink()) {\n <ng-container *ngTemplateOutlet=\"content\" />\n }\n</button>\n\n<!-- Содержимое общее у кнопки и ссылки и рисуется один раз — в том, что видно. Шаблон берёт\n инжектор места объявления, поэтому `rtElem` внутри получает блок от `ng-container`. -->\n<ng-container rtBlock=\"rt-icon-button\">\n <ng-template #content>\n @if (loading()) {\n <rt-icon rtElem=\"spinner\" name=\"spinner\" color=\"current\" [size]=\"resolvedIconSize()\" />\n } @else if (icon() || glyph()) {\n <rt-icon\n rtElem=\"icon\"\n [color]=\"iconColor()\"\n [name]=\"icon()\"\n [glyph]=\"glyph()\"\n [size]=\"resolvedIconSize()\"\n [fill]=\"iconFill()\" />\n } @else {\n <span rtElem=\"content\" qa-dataid=\"icon-button-content\"><ng-content /></span>\n }\n @if (indicator()) {\n <span rtElem=\"indicator\" aria-hidden=\"true\"></span>\n }\n </ng-template>\n</ng-container>\n",
265
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-icon-button{display:inline-flex;--rt-icon-button-color: var(--rt-color-text-primary)}rt-icon-button .rt-icon-button{--rt-icon-button-radius: var(--rt-radius-md);--rt-icon-button-indicator-radius: var(--rt-radius-full);--rt-icon-button-focus-shadow: var(--rt-shadow-focus-ring);--rt-icon-button-shadow: var(--rt-shadow-none);--rt-icon-button-shadow-hover: var(--rt-icon-button-shadow);--rt-icon-button-color-hover: var(--rt-icon-button-color);--rt-icon-button-transition-duration: var(--rt-duration-fast);--rt-icon-button-bg-variant: transparent;--rt-icon-button-size-step: var(--rt-control-height-md);position:relative;display:inline-flex;width:var(--rt-icon-button-size, var(--rt-icon-button-size-step));height:var(--rt-icon-button-size, var(--rt-icon-button-size-step));box-sizing:border-box;align-items:center;justify-content:center;padding:0;border:0;border-radius:var(--rt-icon-button-radius);background-color:var(--rt-icon-button-bg, var(--rt-icon-button-bg-variant));box-shadow:var(--rt-icon-button-shadow);color:var(--rt-icon-button-color);cursor:pointer;text-decoration:none;transition:background-color var(--rt-icon-button-transition-duration) ease,box-shadow var(--rt-icon-button-transition-duration) ease}rt-icon-button .rt-icon-button--2xs{--rt-icon-button-size-step: var(--rt-size-5)}rt-icon-button .rt-icon-button--xs{--rt-icon-button-size-step: 22px}rt-icon-button .rt-icon-button--sm{--rt-icon-button-size-step: var(--rt-control-height-sm)}rt-icon-button .rt-icon-button--md{--rt-icon-button-size-step: var(--rt-control-height-md)}rt-icon-button .rt-icon-button--lg{--rt-icon-button-size-step: var(--rt-control-height-lg)}rt-icon-button .rt-icon-button--xl{--rt-icon-button-size-step: var(--rt-control-height-xl)}rt-icon-button .rt-icon-button--2xl{--rt-icon-button-size-step: var(--rt-control-height-2xl)}rt-icon-button .rt-icon-button:hover:not(:disabled,[aria-disabled=true]){box-shadow:var(--rt-icon-button-shadow-hover)}rt-icon-button .rt-icon-button--ghost:hover:not(:disabled,[aria-disabled=true]){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover));color:var(--rt-icon-button-color-hover)}rt-icon-button .rt-icon-button--ghost.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--primary{--rt-icon-button-bg-variant: var(--rt-color-action-primary);color:var(--rt-color-action-on-primary)}rt-icon-button .rt-icon-button--primary:hover:not(:disabled,[aria-disabled=true]){background-color:var(--rt-icon-button-bg-hover, var(--rt-color-action-primary-hover))}rt-icon-button .rt-icon-button--secondary{--rt-icon-button-bg-variant: var(--rt-color-bg-surface-subtle);color:var(--rt-color-text-primary)}rt-icon-button .rt-icon-button--secondary:hover:not(:disabled,[aria-disabled=true]){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--danger{color:var(--rt-color-state-danger)}rt-icon-button .rt-icon-button--danger:hover:not(:disabled,[aria-disabled=true]){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--danger.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--success{color:var(--rt-color-state-success)}rt-icon-button .rt-icon-button--success:hover:not(:disabled,[aria-disabled=true]){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--success.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--warning{color:var(--rt-color-state-warning)}rt-icon-button .rt-icon-button--warning:hover:not(:disabled,[aria-disabled=true]){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--warning.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button:disabled,rt-icon-button .rt-icon-button[aria-disabled=true]{background-color:color-mix(in srgb,var(--rt-icon-button-bg, var(--rt-icon-button-bg-variant)) var(--rt-icon-button-disabled-fill),transparent);cursor:not-allowed;opacity:var(--rt-icon-button-disabled-opacity)}rt-icon-button .rt-icon-button:disabled .rt-icon svg,rt-icon-button .rt-icon-button[aria-disabled=true] .rt-icon svg{color:var(--rt-icon-button-disabled-color)}rt-icon-button .rt-icon-button[hidden]{display:none}rt-icon-button .rt-icon-button:focus-visible:not(.cdk-mouse-focused,.cdk-touch-focused){box-shadow:var(--rt-icon-button-focus-shadow);outline:2px solid transparent;outline-offset:2px}rt-icon-button .rt-icon-button__content{display:inline-flex;align-items:center;justify-content:center;color:inherit;line-height:1}rt-icon-button .rt-icon-button__spinner{--rt-icon-button-spin-duration: 1s;animation:rt-icon-button-spin var(--rt-icon-button-spin-duration) linear infinite}rt-icon-button .rt-icon-button__indicator{position:absolute;width:8px;height:8px;border-radius:var(--rt-icon-button-indicator-radius);background:var(--rt-color-state-danger);inset-block-start:-2px;inset-inline-end:-2px;pointer-events:none}rt-icon-button[data-rt-radius=none]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-none)}rt-icon-button[data-rt-radius=xs]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-xs)}rt-icon-button[data-rt-radius=sm]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-sm)}rt-icon-button[data-rt-radius=ms]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-ms)}rt-icon-button[data-rt-radius=md]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-md)}rt-icon-button[data-rt-radius=lg]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-lg)}rt-icon-button[data-rt-radius=xl]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-xl)}rt-icon-button[data-rt-radius=\"2xl\"]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-2xl)}rt-icon-button[data-rt-radius=full]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-full)}@keyframes rt-icon-button-spin{to{transform:rotate(360deg)}}}\n"],
224
266
  dependencies: [
267
+ {
268
+ kind: "directive",
269
+ type: NgTemplateOutlet,
270
+ selector: "[ngTemplateOutlet]",
271
+ inputs: [
272
+ "ngTemplateOutletContext",
273
+ "ngTemplateOutlet",
274
+ "ngTemplateOutletInjector"
275
+ ]
276
+ },
277
+ {
278
+ kind: "directive",
279
+ type: RouterLink,
280
+ selector: "[routerLink]",
281
+ inputs: [
282
+ "target",
283
+ "queryParams",
284
+ "fragment",
285
+ "queryParamsHandling",
286
+ "state",
287
+ "info",
288
+ "relativeTo",
289
+ "preserveFragment",
290
+ "skipLocationChange",
291
+ "replaceUrl",
292
+ "browserUrl",
293
+ "routerLink"
294
+ ]
295
+ },
225
296
  {
226
297
  kind: "component",
227
298
  type: RtIconComponent,
@@ -298,6 +369,8 @@ i0.ɵɵngDeclareClassMetadata({
298
369
  changeDetection: ChangeDetectionStrategy.OnPush,
299
370
  encapsulation: ViewEncapsulation.None,
300
371
  imports: [
372
+ NgTemplateOutlet,
373
+ RouterLink,
301
374
  RtIconComponent,
302
375
  RtRippleDirective,
303
376
  CdkMonitorFocus,
@@ -311,11 +384,19 @@ i0.ɵɵngDeclareClassMetadata({
311
384
  inputs: ["radius"]
312
385
  }],
313
386
  host: { class: BEM_BLOCK },
314
- template: "<button\n rtBlock=\"rt-icon-button\"\n qa-dataid=\"icon-button-control\"\n rtRipple\n cdkMonitorElementFocus\n [rippleDisabled]=\"isDisabled() || loading()\"\n [rtTooltip]=\"tooltip()\"\n [rtTooltipHideOnClick]=\"tooltipHideOnClick()\"\n [rtMod]=\"bemMods()\"\n [type]=\"type()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-pressed]=\"active() ? 'true' : null\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.tabindex]=\"tabIndex()\"\n (click)=\"onClick($event)\">\n @if (loading()) {\n <rt-icon rtElem=\"spinner\" name=\"spinner\" color=\"current\" [size]=\"resolvedIconSize()\" />\n } @else if (icon() || glyph()) {\n <rt-icon rtElem=\"icon\" [color]=\"iconColor()\" [name]=\"icon()\" [glyph]=\"glyph()\" [size]=\"resolvedIconSize()\" [fill]=\"iconFill()\" />\n } @else {\n <span rtElem=\"content\" qa-dataid=\"icon-button-content\"><ng-content /></span>\n }\n @if (indicator()) {\n <span rtElem=\"indicator\" aria-hidden=\"true\"></span>\n }\n</button>\n",
315
- styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-icon-button{display:inline-flex;--rt-icon-button-color: var(--rt-color-text-primary)}rt-icon-button .rt-icon-button{--rt-icon-button-radius: var(--rt-radius-md);--rt-icon-button-indicator-radius: var(--rt-radius-full);--rt-icon-button-focus-shadow: var(--rt-shadow-focus-ring);--rt-icon-button-shadow: var(--rt-shadow-none);--rt-icon-button-shadow-hover: var(--rt-icon-button-shadow);--rt-icon-button-color-hover: var(--rt-icon-button-color);--rt-icon-button-transition-duration: var(--rt-duration-fast);--rt-icon-button-bg-variant: transparent;--rt-icon-button-size-step: var(--rt-control-height-md);position:relative;display:inline-flex;width:var(--rt-icon-button-size, var(--rt-icon-button-size-step));height:var(--rt-icon-button-size, var(--rt-icon-button-size-step));align-items:center;justify-content:center;padding:0;border:0;border-radius:var(--rt-icon-button-radius);background-color:var(--rt-icon-button-bg, var(--rt-icon-button-bg-variant));box-shadow:var(--rt-icon-button-shadow);color:var(--rt-icon-button-color);cursor:pointer;transition:background-color var(--rt-icon-button-transition-duration) ease,box-shadow var(--rt-icon-button-transition-duration) ease}rt-icon-button .rt-icon-button--2xs{--rt-icon-button-size-step: var(--rt-size-5)}rt-icon-button .rt-icon-button--xs{--rt-icon-button-size-step: 22px}rt-icon-button .rt-icon-button--sm{--rt-icon-button-size-step: var(--rt-control-height-sm)}rt-icon-button .rt-icon-button--md{--rt-icon-button-size-step: var(--rt-control-height-md)}rt-icon-button .rt-icon-button--lg{--rt-icon-button-size-step: var(--rt-control-height-lg)}rt-icon-button .rt-icon-button--xl{--rt-icon-button-size-step: var(--rt-control-height-xl)}rt-icon-button .rt-icon-button--2xl{--rt-icon-button-size-step: var(--rt-control-height-2xl)}rt-icon-button .rt-icon-button:hover:not(:disabled){box-shadow:var(--rt-icon-button-shadow-hover)}rt-icon-button .rt-icon-button--ghost:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover));color:var(--rt-icon-button-color-hover)}rt-icon-button .rt-icon-button--ghost.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--primary{--rt-icon-button-bg-variant: var(--rt-color-action-primary);color:var(--rt-color-action-on-primary)}rt-icon-button .rt-icon-button--primary:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-color-action-primary-hover))}rt-icon-button .rt-icon-button--secondary{--rt-icon-button-bg-variant: var(--rt-color-bg-surface-subtle);color:var(--rt-color-text-primary)}rt-icon-button .rt-icon-button--secondary:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--danger{color:var(--rt-color-state-danger)}rt-icon-button .rt-icon-button--danger:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--danger.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--success{color:var(--rt-color-state-success)}rt-icon-button .rt-icon-button--success:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--success.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--warning{color:var(--rt-color-state-warning)}rt-icon-button .rt-icon-button--warning:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--warning.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button:disabled{background-color:color-mix(in srgb,var(--rt-icon-button-bg, var(--rt-icon-button-bg-variant)) var(--rt-icon-button-disabled-fill),transparent);cursor:not-allowed;opacity:var(--rt-icon-button-disabled-opacity)}rt-icon-button .rt-icon-button:disabled .rt-icon svg{color:var(--rt-icon-button-disabled-color)}rt-icon-button .rt-icon-button:focus-visible:not(.cdk-mouse-focused,.cdk-touch-focused){box-shadow:var(--rt-icon-button-focus-shadow);outline:2px solid transparent;outline-offset:2px}rt-icon-button .rt-icon-button__content{display:inline-flex;align-items:center;justify-content:center;color:inherit;line-height:1}rt-icon-button .rt-icon-button__spinner{--rt-icon-button-spin-duration: 1s;animation:rt-icon-button-spin var(--rt-icon-button-spin-duration) linear infinite}rt-icon-button .rt-icon-button__indicator{position:absolute;width:8px;height:8px;border-radius:var(--rt-icon-button-indicator-radius);background:var(--rt-color-state-danger);inset-block-start:-2px;inset-inline-end:-2px;pointer-events:none}rt-icon-button[data-rt-radius=none]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-none)}rt-icon-button[data-rt-radius=xs]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-xs)}rt-icon-button[data-rt-radius=sm]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-sm)}rt-icon-button[data-rt-radius=ms]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-ms)}rt-icon-button[data-rt-radius=md]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-md)}rt-icon-button[data-rt-radius=lg]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-lg)}rt-icon-button[data-rt-radius=xl]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-xl)}rt-icon-button[data-rt-radius=\"2xl\"]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-2xl)}rt-icon-button[data-rt-radius=full]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-full)}@keyframes rt-icon-button-spin{to{transform:rotate(360deg)}}}\n"]
387
+ template: "<!-- Ссылка стоит перед кнопкой: в режиме ссылки поиск по `qa-dataid` находит её первой. -->\n@if (isLink()) {\n <a\n #linkEl\n rtBlock=\"rt-icon-button\"\n qa-dataid=\"icon-button-control\"\n rtRipple\n cdkMonitorElementFocus\n [routerLink]=\"linkTarget()\"\n [rippleDisabled]=\"isDisabled()\"\n [rtTooltip]=\"tooltip()\"\n [rtTooltipHideOnClick]=\"tooltipHideOnClick()\"\n [rtMod]=\"bemMods()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : null\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-haspopup]=\"ariaHaspopup()\"\n [attr.tabindex]=\"linkTabIndex()\"\n (click)=\"onClick($event)\">\n <ng-container *ngTemplateOutlet=\"content\" />\n </a>\n}\n\n<!-- Кнопка стоит в шаблоне без условия и появляется с первым проходом, как до входа `link`: в\n блоке `@if` она рождалась бы проходом позже, и родитель, который меряет соседей на первой\n проверке (автовысота поля сообщения), считал бы ряд без неё. У ссылки кнопка спрятана. -->\n<button\n #buttonEl\n rtBlock=\"rt-icon-button\"\n qa-dataid=\"icon-button-control\"\n rtRipple\n cdkMonitorElementFocus\n [hidden]=\"isLink()\"\n [rippleDisabled]=\"isDisabled() || loading()\"\n [rtTooltip]=\"isLink() ? '' : tooltip()\"\n [rtTooltipHideOnClick]=\"tooltipHideOnClick()\"\n [rtMod]=\"bemMods()\"\n [type]=\"type()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-pressed]=\"active() ? 'true' : null\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-haspopup]=\"ariaHaspopup()\"\n [attr.tabindex]=\"tabIndex()\"\n (click)=\"onClick($event)\">\n @if (!isLink()) {\n <ng-container *ngTemplateOutlet=\"content\" />\n }\n</button>\n\n<!-- Содержимое общее у кнопки и ссылки и рисуется один раз — в том, что видно. Шаблон берёт\n инжектор места объявления, поэтому `rtElem` внутри получает блок от `ng-container`. -->\n<ng-container rtBlock=\"rt-icon-button\">\n <ng-template #content>\n @if (loading()) {\n <rt-icon rtElem=\"spinner\" name=\"spinner\" color=\"current\" [size]=\"resolvedIconSize()\" />\n } @else if (icon() || glyph()) {\n <rt-icon\n rtElem=\"icon\"\n [color]=\"iconColor()\"\n [name]=\"icon()\"\n [glyph]=\"glyph()\"\n [size]=\"resolvedIconSize()\"\n [fill]=\"iconFill()\" />\n } @else {\n <span rtElem=\"content\" qa-dataid=\"icon-button-content\"><ng-content /></span>\n }\n @if (indicator()) {\n <span rtElem=\"indicator\" aria-hidden=\"true\"></span>\n }\n </ng-template>\n</ng-container>\n",
388
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-icon-button{display:inline-flex;--rt-icon-button-color: var(--rt-color-text-primary)}rt-icon-button .rt-icon-button{--rt-icon-button-radius: var(--rt-radius-md);--rt-icon-button-indicator-radius: var(--rt-radius-full);--rt-icon-button-focus-shadow: var(--rt-shadow-focus-ring);--rt-icon-button-shadow: var(--rt-shadow-none);--rt-icon-button-shadow-hover: var(--rt-icon-button-shadow);--rt-icon-button-color-hover: var(--rt-icon-button-color);--rt-icon-button-transition-duration: var(--rt-duration-fast);--rt-icon-button-bg-variant: transparent;--rt-icon-button-size-step: var(--rt-control-height-md);position:relative;display:inline-flex;width:var(--rt-icon-button-size, var(--rt-icon-button-size-step));height:var(--rt-icon-button-size, var(--rt-icon-button-size-step));box-sizing:border-box;align-items:center;justify-content:center;padding:0;border:0;border-radius:var(--rt-icon-button-radius);background-color:var(--rt-icon-button-bg, var(--rt-icon-button-bg-variant));box-shadow:var(--rt-icon-button-shadow);color:var(--rt-icon-button-color);cursor:pointer;text-decoration:none;transition:background-color var(--rt-icon-button-transition-duration) ease,box-shadow var(--rt-icon-button-transition-duration) ease}rt-icon-button .rt-icon-button--2xs{--rt-icon-button-size-step: var(--rt-size-5)}rt-icon-button .rt-icon-button--xs{--rt-icon-button-size-step: 22px}rt-icon-button .rt-icon-button--sm{--rt-icon-button-size-step: var(--rt-control-height-sm)}rt-icon-button .rt-icon-button--md{--rt-icon-button-size-step: var(--rt-control-height-md)}rt-icon-button .rt-icon-button--lg{--rt-icon-button-size-step: var(--rt-control-height-lg)}rt-icon-button .rt-icon-button--xl{--rt-icon-button-size-step: var(--rt-control-height-xl)}rt-icon-button .rt-icon-button--2xl{--rt-icon-button-size-step: var(--rt-control-height-2xl)}rt-icon-button .rt-icon-button:hover:not(:disabled,[aria-disabled=true]){box-shadow:var(--rt-icon-button-shadow-hover)}rt-icon-button .rt-icon-button--ghost:hover:not(:disabled,[aria-disabled=true]){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover));color:var(--rt-icon-button-color-hover)}rt-icon-button .rt-icon-button--ghost.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--primary{--rt-icon-button-bg-variant: var(--rt-color-action-primary);color:var(--rt-color-action-on-primary)}rt-icon-button .rt-icon-button--primary:hover:not(:disabled,[aria-disabled=true]){background-color:var(--rt-icon-button-bg-hover, var(--rt-color-action-primary-hover))}rt-icon-button .rt-icon-button--secondary{--rt-icon-button-bg-variant: var(--rt-color-bg-surface-subtle);color:var(--rt-color-text-primary)}rt-icon-button .rt-icon-button--secondary:hover:not(:disabled,[aria-disabled=true]){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--danger{color:var(--rt-color-state-danger)}rt-icon-button .rt-icon-button--danger:hover:not(:disabled,[aria-disabled=true]){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--danger.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--success{color:var(--rt-color-state-success)}rt-icon-button .rt-icon-button--success:hover:not(:disabled,[aria-disabled=true]){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--success.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--warning{color:var(--rt-color-state-warning)}rt-icon-button .rt-icon-button--warning:hover:not(:disabled,[aria-disabled=true]){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--warning.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button:disabled,rt-icon-button .rt-icon-button[aria-disabled=true]{background-color:color-mix(in srgb,var(--rt-icon-button-bg, var(--rt-icon-button-bg-variant)) var(--rt-icon-button-disabled-fill),transparent);cursor:not-allowed;opacity:var(--rt-icon-button-disabled-opacity)}rt-icon-button .rt-icon-button:disabled .rt-icon svg,rt-icon-button .rt-icon-button[aria-disabled=true] .rt-icon svg{color:var(--rt-icon-button-disabled-color)}rt-icon-button .rt-icon-button[hidden]{display:none}rt-icon-button .rt-icon-button:focus-visible:not(.cdk-mouse-focused,.cdk-touch-focused){box-shadow:var(--rt-icon-button-focus-shadow);outline:2px solid transparent;outline-offset:2px}rt-icon-button .rt-icon-button__content{display:inline-flex;align-items:center;justify-content:center;color:inherit;line-height:1}rt-icon-button .rt-icon-button__spinner{--rt-icon-button-spin-duration: 1s;animation:rt-icon-button-spin var(--rt-icon-button-spin-duration) linear infinite}rt-icon-button .rt-icon-button__indicator{position:absolute;width:8px;height:8px;border-radius:var(--rt-icon-button-indicator-radius);background:var(--rt-color-state-danger);inset-block-start:-2px;inset-inline-end:-2px;pointer-events:none}rt-icon-button[data-rt-radius=none]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-none)}rt-icon-button[data-rt-radius=xs]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-xs)}rt-icon-button[data-rt-radius=sm]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-sm)}rt-icon-button[data-rt-radius=ms]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-ms)}rt-icon-button[data-rt-radius=md]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-md)}rt-icon-button[data-rt-radius=lg]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-lg)}rt-icon-button[data-rt-radius=xl]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-xl)}rt-icon-button[data-rt-radius=\"2xl\"]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-2xl)}rt-icon-button[data-rt-radius=full]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-full)}@keyframes rt-icon-button-spin{to{transform:rotate(360deg)}}}\n"]
316
389
  }]
317
390
  }],
318
391
  propDecorators: {
392
+ buttonEl: [{
393
+ type: i0.ViewChild,
394
+ args: ["buttonEl", { isSignal: true }]
395
+ }],
396
+ linkEl: [{
397
+ type: i0.ViewChild,
398
+ args: ["linkEl", { isSignal: true }]
399
+ }],
319
400
  icon: [{
320
401
  type: i0.Input,
321
402
  args: [{
@@ -444,6 +525,22 @@ i0.ɵɵngDeclareClassMetadata({
444
525
  required: false
445
526
  }]
446
527
  }],
528
+ ariaHaspopup: [{
529
+ type: i0.Input,
530
+ args: [{
531
+ isSignal: true,
532
+ alias: "ariaHaspopup",
533
+ required: false
534
+ }]
535
+ }],
536
+ link: [{
537
+ type: i0.Input,
538
+ args: [{
539
+ isSignal: true,
540
+ alias: "link",
541
+ required: false
542
+ }]
543
+ }],
447
544
  indicator: [{
448
545
  type: i0.Input,
449
546
  args: [{
@@ -1 +1 @@
1
- {"version":3,"file":"rt-tools-ui-kit-v2-icon-button.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/icon-button/rt-icon-button.component.ts","../../../projects/ui-kit-v2/src/lib/components/icon-button/rt-icon-button.component.html"],"sourcesContent":["import { CdkMonitorFocus } from '@angular/cdk/a11y';\nimport { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n output,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon, IRtKitConfig, rtKitDefault } from '@rt-tools/ui-kit-v2/core';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RtRippleDirective } from '@rt-tools/ui-kit-v2/ripple';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { IRtIconButton } from './rt-icon-button.model';\n\nconst BEM_BLOCK: string = 'rt-icon-button';\n\n/**\n * Универсальная icon-only кнопка кита.\n *\n * Рендерит свой собственный `<button type=\"...\">` внутри template (НЕ host-button).\n * Все цвета и размеры — через семантические `--rt-*` токены; геометрия квадрата\n * берётся из `--rt-icon-button-size`, а без него — из шага `size`. Свойство, заданное на теге\n * `<rt-icon-button>` или выше, доходит до кнопки; так же и `--rt-icon-button-bg`.\n *\n * Loading state — заменяет иконку на `<rt-icon name=\"spinner\">` и блокирует\n * клики (`button[disabled]`). Active state управляет `aria-pressed` (для toggle-кнопок).\n * Indicator — небольшой dot top-right через BEM-элемент `__indicator`.\n *\n * BEM-разметка — через `rtBlock=\"rt-icon-button\"` + `[rtMod]` объект; камелкейс\n * модификаторов автоматически конвертируется директивой в kebab-case\n * (`hasIndicator` → `rt-icon-button--has-indicator`).\n */\n@Component({\n selector: 'rt-icon-button',\n templateUrl: './rt-icon-button.component.html',\n styleUrls: ['./rt-icon-button.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconComponent,\n RtRippleDirective,\n CdkMonitorFocus,\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 RtIconButtonComponent {\n /**\n * Размер дочерней `<rt-icon>`. По умолчанию маппится 1-к-1 от размера кнопки,\n * но потребитель может задать свой: у крупной кнопки-действия (плавающая\n * кнопка чата) иконка во весь диаметр выглядит тяжеловесно, а сама кнопка\n * должна остаться большой — в неё целятся пальцем.\n */\n protected readonly resolvedIconSize: Signal<IRtIcon.Size> = computed((): IRtIcon.Size => {\n const map: Readonly<Record<IRtIconButton.Size, IRtIcon.Size>> = {\n '2xs': 'sm',\n xs: 'sm',\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n xl: 'xl',\n '2xl': '2xl',\n };\n return this.iconSize() ?? map[this.size()];\n });\n\n /** Кнопка отключена, если установлен disabled ИЛИ loading. */\n protected readonly isDisabled: Signal<boolean> = computed((): boolean => this.disabled() || this.loading());\n\n /**\n * BEM-модификаторы для `[rtMod]`. Собираем в .ts (а не в шаблоне), потому что\n * Angular template-parser не поддерживает computed property keys в inline-объектах.\n * camelCase ключи `hasIndicator` директива автоматически конвертирует в `has-indicator`.\n */\n protected readonly bemMods: Signal<Record<string, boolean>> = computed((): Record<string, boolean> => ({\n [this.variant()]: true,\n [this.size()]: true,\n loading: this.loading(),\n active: this.active(),\n hasIndicator: this.indicator(),\n }));\n\n /**\n * Имя иконки в наборе кита. Нужно оно или `glyph`; когда переданы оба, побеждает имя. Нет ни\n * того ни другого — значок кит не рисует, и кнопка показывает вложенное содержимое: свой\n * рисунок приложения встаёт в кнопку с её размером, формой и состояниями.\n */\n public readonly icon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Имя Material вместо имени кита — рисуется так же, как вход `glyph` у `rt-icon`. */\n public readonly glyph: InputSignal<string | null> = input<string | null>(null);\n\n /** Доступное имя для screen-reader'ов — обязательно (icon-only кнопка). */\n public readonly ariaLabel: InputSignal<string> = input.required<string>();\n\n /** Семантическая палитра. */\n public readonly variant: InputSignal<IRtIconButton.Variant> = input<IRtIconButton.Variant>('ghost');\n\n /**\n * Цвет самой иконки. Default `current` — иконка наследует цвет текста кнопки\n * (поведение по умолчанию). Явное значение нужно, когда иконка должна\n * отличаться от текста кнопки — например крестик-очистка внутри поля,\n * который должен совпадать по цвету с иконками-аффордансами самого поля.\n */\n public readonly iconColor: InputSignal<IRtIcon.Color> = input<IRtIcon.Color>('current');\n\n /**\n * Залитый рисунок значка вместо контурного — как `fill` у `rt-icon`. Рисует его материальный\n * набор; значок своего набора один и от признака не меняется.\n */\n public readonly iconFill: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Размер квадрата. */\n public readonly size: InputSignal<IRtIconButton.Size> = input<IRtIconButton.Size>('md');\n\n /** Размер иконки; пусто — берётся от размера кнопки. */\n public readonly iconSize: InputSignal<IRtIcon.Size | null> = input<IRtIcon.Size | null>(null);\n\n /** HTML-type для нативного `<button>`. */\n public readonly type: InputSignal<IRtIconButton.Type> = input<IRtIconButton.Type>('button');\n\n /**\n * Текст styled-tooltip'а (`rtTooltip`), показывается на hover/focus. Пустая\n * строка → tooltip выключен. Для icon-only кнопок обычно дублирует `ariaLabel`.\n */\n public readonly tooltip: InputSignal<string> = input<string>('');\n\n /**\n * Прячет ли клик открытую подсказку (`rtTooltipHideOnClick`). `false` — у переключателя:\n * подсказка остаётся и показывает новое состояние на месте. Умолчание — из настроек кита\n * `components.tooltip.hideOnClick`, как у самой подсказки: иначе своё `true` кнопки перебивало бы их.\n */\n public readonly tooltipHideOnClick: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(\n rtKitDefault('tooltip', (it: IRtKitConfig.Tooltip): boolean | undefined => it.hideOnClick, true),\n {\n transform: booleanAttribute,\n }\n );\n\n /**\n * Tabindex внутренней `<button>`. Default `0` (в обычном таб-порядке).\n * Значение `-1` исключает кнопку из таб-навигации, оставляя клик мышью —\n * нужно для вспомогательных аффордансов вроде крестика-очистки внутри поля.\n */\n public readonly tabIndex: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(0, { transform: numberAttribute });\n\n /** Состояние загрузки: показывает spinner вместо иконки + disabled. */\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Нативное отключение кнопки. */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Toggle-состояние — превращается в `aria-pressed=\"true\"`. */\n public readonly active: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /**\n * Раскрыта ли панель, которую кнопка открывает, — превращается в `aria-expanded`. `null` —\n * кнопка ничего не раскрывает, и атрибута нет.\n */\n public readonly expanded: InputSignal<boolean | null> = input<boolean | null>(null);\n\n /** Бейдж-индикатор (dot top-right через BEM-модификатор). */\n public readonly indicator: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Эмиттит MouseEvent при клике (только когда не disabled и не loading). */\n public readonly clicked: OutputEmitterRef<MouseEvent> = output<MouseEvent>();\n\n protected onClick(event: MouseEvent): void {\n if (this.isDisabled()) {\n return;\n }\n this.clicked.emit(event);\n }\n}\n","<button\n rtBlock=\"rt-icon-button\"\n qa-dataid=\"icon-button-control\"\n rtRipple\n cdkMonitorElementFocus\n [rippleDisabled]=\"isDisabled() || loading()\"\n [rtTooltip]=\"tooltip()\"\n [rtTooltipHideOnClick]=\"tooltipHideOnClick()\"\n [rtMod]=\"bemMods()\"\n [type]=\"type()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-pressed]=\"active() ? 'true' : null\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.tabindex]=\"tabIndex()\"\n (click)=\"onClick($event)\">\n @if (loading()) {\n <rt-icon rtElem=\"spinner\" name=\"spinner\" color=\"current\" [size]=\"resolvedIconSize()\" />\n } @else if (icon() || glyph()) {\n <rt-icon rtElem=\"icon\" [color]=\"iconColor()\" [name]=\"icon()\" [glyph]=\"glyph()\" [size]=\"resolvedIconSize()\" [fill]=\"iconFill()\" />\n } @else {\n <span rtElem=\"content\" qa-dataid=\"icon-button-content\"><ng-content /></span>\n }\n @if (indicator()) {\n <span rtElem=\"indicator\" aria-hidden=\"true\"></span>\n }\n</button>\n"],"mappings":"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"}
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-icon-button.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/icon-button/rt-icon-button.component.ts","../../../projects/ui-kit-v2/src/lib/components/icon-button/rt-icon-button.component.html"],"sourcesContent":["import { CdkMonitorFocus } from '@angular/cdk/a11y';\nimport { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n output,\n OutputEmitterRef,\n Signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon, IRtKitConfig, rtKitDefault } from '@rt-tools/ui-kit-v2/core';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RtRippleDirective } from '@rt-tools/ui-kit-v2/ripple';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { IRtIconButton } from './rt-icon-button.model';\n\nconst BEM_BLOCK: string = 'rt-icon-button';\n\n/**\n * Универсальная icon-only кнопка кита.\n *\n * Рендерит свой собственный `<button type=\"...\">` внутри template (НЕ host-button), а с входом\n * `link` — ссылку `<a>` с тем же видом: её можно открыть в новой вкладке, и скринридер называет её ссылкой.\n * Все цвета и размеры — через семантические `--rt-*` токены; геометрия квадрата\n * берётся из `--rt-icon-button-size`, а без него — из шага `size`. Свойство, заданное на теге\n * `<rt-icon-button>` или выше, доходит до кнопки; так же и `--rt-icon-button-bg`.\n *\n * Loading state — заменяет иконку на `<rt-icon name=\"spinner\">` и блокирует\n * клики (`button[disabled]`). Active state управляет `aria-pressed` (для toggle-кнопок).\n * Indicator — небольшой dot top-right через BEM-элемент `__indicator`.\n *\n * BEM-разметка — через `rtBlock=\"rt-icon-button\"` + `[rtMod]` объект; камелкейс\n * модификаторов автоматически конвертируется директивой в kebab-case\n * (`hasIndicator` → `rt-icon-button--has-indicator`).\n */\n@Component({\n selector: 'rt-icon-button',\n templateUrl: './rt-icon-button.component.html',\n styleUrls: ['./rt-icon-button.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n NgTemplateOutlet,\n RouterLink,\n RtIconComponent,\n RtRippleDirective,\n CdkMonitorFocus,\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 RtIconButtonComponent {\n /**\n * Размер дочерней `<rt-icon>`. По умолчанию маппится 1-к-1 от размера кнопки,\n * но потребитель может задать свой: у крупной кнопки-действия (плавающая\n * кнопка чата) иконка во весь диаметр выглядит тяжеловесно, а сама кнопка\n * должна остаться большой — в неё целятся пальцем.\n */\n protected readonly resolvedIconSize: Signal<IRtIcon.Size> = computed((): IRtIcon.Size => {\n const map: Readonly<Record<IRtIconButton.Size, IRtIcon.Size>> = {\n '2xs': 'sm',\n xs: 'sm',\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n xl: 'xl',\n '2xl': '2xl',\n };\n return this.iconSize() ?? map[this.size()];\n });\n\n protected readonly buttonEl: Signal<ElementRef<HTMLButtonElement> | undefined> = viewChild<ElementRef<HTMLButtonElement>>('buttonEl');\n\n protected readonly linkEl: Signal<ElementRef<HTMLAnchorElement> | undefined> = viewChild<ElementRef<HTMLAnchorElement>>('linkEl');\n\n /** Компонент рисует ссылку: задан `link`. */\n protected readonly isLink: Signal<boolean> = computed((): boolean => this.link() !== null);\n\n /** Адрес ссылки: у недоступной или загружающейся его нет, и ссылка никуда не ведёт. */\n protected readonly linkTarget: Signal<RouterLink['routerLink']> = computed((): RouterLink['routerLink'] =>\n this.isDisabled() ? null : this.link()\n );\n\n /** Недоступная ссылка выпадает из порядка Tab, как отключённая кнопка. */\n protected readonly linkTabIndex: Signal<number> = computed((): number => (this.isDisabled() ? -1 : this.tabIndex()));\n\n /** Кнопка отключена, если установлен disabled ИЛИ loading. */\n protected readonly isDisabled: Signal<boolean> = computed((): boolean => this.disabled() || this.loading());\n\n /**\n * BEM-модификаторы для `[rtMod]`. Собираем в .ts (а не в шаблоне), потому что\n * Angular template-parser не поддерживает computed property keys в inline-объектах.\n * camelCase ключи `hasIndicator` директива автоматически конвертирует в `has-indicator`.\n */\n protected readonly bemMods: Signal<Record<string, boolean>> = computed((): Record<string, boolean> => ({\n [this.variant()]: true,\n [this.size()]: true,\n loading: this.loading(),\n active: this.active(),\n hasIndicator: this.indicator(),\n }));\n\n /**\n * Имя иконки в наборе кита. Нужно оно или `glyph`; когда переданы оба, побеждает имя. Нет ни\n * того ни другого — значок кит не рисует, и кнопка показывает вложенное содержимое: свой\n * рисунок приложения встаёт в кнопку с её размером, формой и состояниями.\n */\n public readonly icon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Имя Material вместо имени кита — рисуется так же, как вход `glyph` у `rt-icon`. */\n public readonly glyph: InputSignal<string | null> = input<string | null>(null);\n\n /** Доступное имя для screen-reader'ов — обязательно (icon-only кнопка). */\n public readonly ariaLabel: InputSignal<string> = input.required<string>();\n\n /** Семантическая палитра. */\n public readonly variant: InputSignal<IRtIconButton.Variant> = input<IRtIconButton.Variant>('ghost');\n\n /**\n * Цвет самой иконки. Default `current` — иконка наследует цвет текста кнопки\n * (поведение по умолчанию). Явное значение нужно, когда иконка должна\n * отличаться от текста кнопки — например крестик-очистка внутри поля,\n * который должен совпадать по цвету с иконками-аффордансами самого поля.\n */\n public readonly iconColor: InputSignal<IRtIcon.Color> = input<IRtIcon.Color>('current');\n\n /**\n * Залитый рисунок значка вместо контурного — как `fill` у `rt-icon`. Рисует его материальный\n * набор; значок своего набора один и от признака не меняется.\n */\n public readonly iconFill: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Размер квадрата. */\n public readonly size: InputSignal<IRtIconButton.Size> = input<IRtIconButton.Size>('md');\n\n /** Размер иконки; пусто — берётся от размера кнопки. */\n public readonly iconSize: InputSignal<IRtIcon.Size | null> = input<IRtIcon.Size | null>(null);\n\n /** HTML-type для нативного `<button>`. */\n public readonly type: InputSignal<IRtIconButton.Type> = input<IRtIconButton.Type>('button');\n\n /**\n * Текст styled-tooltip'а (`rtTooltip`), показывается на hover/focus. Пустая\n * строка → tooltip выключен. Для icon-only кнопок обычно дублирует `ariaLabel`.\n */\n public readonly tooltip: InputSignal<string> = input<string>('');\n\n /**\n * Прячет ли клик открытую подсказку (`rtTooltipHideOnClick`). `false` — у переключателя:\n * подсказка остаётся и показывает новое состояние на месте. Умолчание — из настроек кита\n * `components.tooltip.hideOnClick`, как у самой подсказки: иначе своё `true` кнопки перебивало бы их.\n */\n public readonly tooltipHideOnClick: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(\n rtKitDefault('tooltip', (it: IRtKitConfig.Tooltip): boolean | undefined => it.hideOnClick, true),\n {\n transform: booleanAttribute,\n }\n );\n\n /**\n * Tabindex внутренней `<button>`. Default `0` (в обычном таб-порядке).\n * Значение `-1` исключает кнопку из таб-навигации, оставляя клик мышью —\n * нужно для вспомогательных аффордансов вроде крестика-очистки внутри поля.\n */\n public readonly tabIndex: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(0, { transform: numberAttribute });\n\n /** Состояние загрузки: показывает spinner вместо иконки + disabled. */\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Нативное отключение кнопки. */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Toggle-состояние — превращается в `aria-pressed=\"true\"`. */\n public readonly active: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /**\n * Раскрыта ли панель, которую кнопка открывает, — превращается в `aria-expanded`. `null` —\n * кнопка ничего не раскрывает, и атрибута нет.\n */\n public readonly expanded: InputSignal<boolean | null> = input<boolean | null>(null);\n\n /**\n * Какую панель открывает кнопка — превращается в `aria-haspopup`: `'menu'` у кнопки, которая\n * раскрывает меню. `null` — атрибута нет.\n */\n public readonly ariaHaspopup: InputSignal<IRtIconButton.HasPopup | null> = input<IRtIconButton.HasPopup | null>(null);\n\n /**\n * Команды маршрута приложения, как у `routerLink`. Задан — компонент рисует ссылку `<a href>` с тем\n * же видом, подсказкой и рябью: Ctrl/Cmd-click, Shift-click, средняя кнопка и контекстное меню\n * браузера открывают её в новой вкладке или окне. `type`, `active` и `aria-pressed` у ссылки не\n * пишутся. `null` — обычная кнопка.\n */\n public readonly link: InputSignal<RouterLink['routerLink']> = input<RouterLink['routerLink']>(null);\n\n /** Бейдж-индикатор (dot top-right через BEM-модификатор). */\n public readonly indicator: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Эмиттит MouseEvent при клике (только когда не disabled и не loading). */\n public readonly clicked: OutputEmitterRef<MouseEvent> = output<MouseEvent>();\n\n /** Фокусирует кнопку или ссылку внутри — например, когда закрылось меню, которое она открыла. */\n public focus(options?: FocusOptions): void {\n (this.linkEl() ?? this.buttonEl())?.nativeElement.focus(options);\n }\n\n protected onClick(event: MouseEvent): void {\n if (this.isDisabled()) {\n // У недоступной ссылки нет адреса, но клик по `<a>` без `href` всё равно не должен уйти наружу.\n event.preventDefault();\n return;\n }\n this.clicked.emit(event);\n }\n}\n","<!-- Ссылка стоит перед кнопкой: в режиме ссылки поиск по `qa-dataid` находит её первой. -->\n@if (isLink()) {\n <a\n #linkEl\n rtBlock=\"rt-icon-button\"\n qa-dataid=\"icon-button-control\"\n rtRipple\n cdkMonitorElementFocus\n [routerLink]=\"linkTarget()\"\n [rippleDisabled]=\"isDisabled()\"\n [rtTooltip]=\"tooltip()\"\n [rtTooltipHideOnClick]=\"tooltipHideOnClick()\"\n [rtMod]=\"bemMods()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : null\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-haspopup]=\"ariaHaspopup()\"\n [attr.tabindex]=\"linkTabIndex()\"\n (click)=\"onClick($event)\">\n <ng-container *ngTemplateOutlet=\"content\" />\n </a>\n}\n\n<!-- Кнопка стоит в шаблоне без условия и появляется с первым проходом, как до входа `link`: в\n блоке `@if` она рождалась бы проходом позже, и родитель, который меряет соседей на первой\n проверке (автовысота поля сообщения), считал бы ряд без неё. У ссылки кнопка спрятана. -->\n<button\n #buttonEl\n rtBlock=\"rt-icon-button\"\n qa-dataid=\"icon-button-control\"\n rtRipple\n cdkMonitorElementFocus\n [hidden]=\"isLink()\"\n [rippleDisabled]=\"isDisabled() || loading()\"\n [rtTooltip]=\"isLink() ? '' : tooltip()\"\n [rtTooltipHideOnClick]=\"tooltipHideOnClick()\"\n [rtMod]=\"bemMods()\"\n [type]=\"type()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-pressed]=\"active() ? 'true' : null\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-haspopup]=\"ariaHaspopup()\"\n [attr.tabindex]=\"tabIndex()\"\n (click)=\"onClick($event)\">\n @if (!isLink()) {\n <ng-container *ngTemplateOutlet=\"content\" />\n }\n</button>\n\n<!-- Содержимое общее у кнопки и ссылки и рисуется один раз — в том, что видно. Шаблон берёт\n инжектор места объявления, поэтому `rtElem` внутри получает блок от `ng-container`. -->\n<ng-container rtBlock=\"rt-icon-button\">\n <ng-template #content>\n @if (loading()) {\n <rt-icon rtElem=\"spinner\" name=\"spinner\" color=\"current\" [size]=\"resolvedIconSize()\" />\n } @else if (icon() || glyph()) {\n <rt-icon\n rtElem=\"icon\"\n [color]=\"iconColor()\"\n [name]=\"icon()\"\n [glyph]=\"glyph()\"\n [size]=\"resolvedIconSize()\"\n [fill]=\"iconFill()\" />\n } @else {\n <span rtElem=\"content\" qa-dataid=\"icon-button-content\"><ng-content /></span>\n }\n @if (indicator()) {\n <span rtElem=\"indicator\" aria-hidden=\"true\"></span>\n }\n </ng-template>\n</ng-container>\n"],"mappings":"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"}
@@ -369,6 +369,8 @@ var RtImageUploadComponent = class RtImageUploadComponent {
369
369
  "disabled",
370
370
  "active",
371
371
  "expanded",
372
+ "ariaHaspopup",
373
+ "link",
372
374
  "indicator"
373
375
  ],
374
376
  outputs: ["clicked"]