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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +3 -2
  2. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs +1 -1
  3. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs.map +1 -1
  4. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +14 -8
  5. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -1
  6. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +97 -0
  7. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -0
  8. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +10 -3
  9. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
  10. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +1 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
  12. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +1 -1
  13. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -1
  14. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +1 -1
  15. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
  16. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +81 -0
  17. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -0
  18. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +99 -1
  19. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  20. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +5 -5
  21. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
  22. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +16 -4
  23. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
  24. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +1 -1
  25. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -1
  26. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +124 -25
  27. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
  28. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +3 -3
  29. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -1
  30. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +1 -1
  31. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
  32. package/fesm2022/rt-tools-ui-kit-v2-field.mjs +1 -1
  33. package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
  34. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +1 -1
  35. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
  36. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +1 -1
  37. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
  38. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +64 -27
  39. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -1
  40. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +1 -1
  41. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
  42. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +1 -1
  43. package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
  44. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1 -1
  45. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
  46. package/fesm2022/rt-tools-ui-kit-v2-message.mjs +1 -1
  47. package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -1
  48. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +1 -1
  49. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
  50. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +1 -1
  51. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -1
  52. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +1 -1
  53. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
  54. package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs +46 -0
  55. package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs.map +1 -0
  56. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +336 -12
  57. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  58. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +1 -1
  59. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
  60. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +1 -1
  61. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -1
  62. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +16 -2
  63. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
  64. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +3 -3
  65. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
  66. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +1 -1
  67. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -1
  68. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +2 -2
  69. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
  70. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +1 -1
  71. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
  72. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +1 -1
  73. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
  74. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +31 -5
  75. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
  76. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +1 -1
  77. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
  78. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +1 -1
  79. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
  80. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +1 -1
  81. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -1
  82. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +2 -2
  83. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
  84. package/fesm2022/rt-tools-ui-kit-v2.mjs +3 -0
  85. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  86. package/package.json +13 -1
  87. package/rt-tools-ui-kit-v2-0.19.1.tgz +0 -0
  88. package/src/assets/icons/sparkle.svg +9 -0
  89. package/src/assets/icons/thumb-down.svg +10 -0
  90. package/src/assets/icons/thumb-up.svg +9 -0
  91. package/src/assets/icons/trash-x.svg +7 -0
  92. package/src/assets/icons-material/sparkle.fill.svg +5 -0
  93. package/src/assets/icons-material/sparkle.svg +5 -0
  94. package/src/assets/icons-material/thumb-down.fill.svg +5 -0
  95. package/src/assets/icons-material/thumb-down.svg +5 -0
  96. package/src/assets/icons-material/thumb-up.fill.svg +5 -0
  97. package/src/assets/icons-material/thumb-up.svg +5 -0
  98. package/src/assets/icons-material/trash-x.fill.svg +5 -0
  99. package/src/assets/icons-material/trash-x.svg +5 -0
  100. package/src/lib/components/action-bar/CONTEXT.md +8 -2
  101. package/src/lib/components/action-bar/rt-action-bar-holder.component.scss +10 -7
  102. package/src/lib/components/action-bar/rt-action-bar.component.scss +82 -34
  103. package/src/lib/components/ai-run-status/CONTEXT.md +41 -0
  104. package/src/lib/components/ai-run-status/rt-ai-run-status.component.scss +158 -0
  105. package/src/lib/components/aside/CONTEXT.md +1 -0
  106. package/src/lib/components/aside/header/rt-aside-header.component.scss +27 -11
  107. package/src/lib/components/copy-value/CONTEXT.md +31 -0
  108. package/src/lib/components/copy-value/rt-copy-value.component.scss +39 -0
  109. package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +5 -5
  110. package/src/lib/components/data-table/CONTEXT.md +5 -0
  111. package/src/lib/components/dynamic-selector/CONTEXT.md +18 -0
  112. package/src/lib/components/dynamic-selector/list/rt-dynamic-selector-list.component.scss +29 -1
  113. package/src/lib/components/dynamic-selector/popup/rt-dynamic-selector-popup.component.scss +84 -25
  114. package/src/lib/components/empty-state/CONTEXT.md +2 -1
  115. package/src/lib/components/empty-state/rt-empty-state.component.scss +4 -2
  116. package/src/lib/components/icon/CONTEXT.md +16 -12
  117. package/src/lib/components/icon/rt-icon.component.scss +13 -3
  118. package/src/lib/components/prompt-suggestion/CONTEXT.md +29 -0
  119. package/src/lib/components/prompt-suggestion/rt-prompt-suggestion.component.scss +58 -0
  120. package/src/lib/components/select/CONTEXT.md +2 -2
  121. package/src/lib/components/thread-list/CONTEXT.md +4 -0
  122. package/src/lib/components/thread-list/rt-thread-list.component.scss +29 -0
  123. package/src/lib/components/toolbar/CONTEXT.md +4 -0
  124. package/src/lib/components/toolbar/rt-toolbar.component.scss +7 -0
  125. package/src/rich-editor/lib/components/ai-chat/CONTEXT.md +58 -0
  126. package/src/rich-editor/lib/components/ai-chat/answer/rt-ai-chat-answer.component.scss +12 -0
  127. package/src/rich-editor/lib/components/ai-chat/rt-ai-chat.component.scss +222 -0
  128. package/src/rich-editor/lib/components/rich-editor/rt-rich-editor.component.scss +3 -0
  129. package/src/styles/_scrollbar.scss +9 -0
  130. package/styles/tokens.css +3 -0
  131. package/types/rt-tools-ui-kit-v2-action-bar.d.ts +11 -2
  132. package/types/rt-tools-ui-kit-v2-ai-run-status.d.ts +49 -0
  133. package/types/rt-tools-ui-kit-v2-aside.d.ts +9 -1
  134. package/types/rt-tools-ui-kit-v2-copy-value.d.ts +29 -0
  135. package/types/rt-tools-ui-kit-v2-core.d.ts +94 -54
  136. package/types/rt-tools-ui-kit-v2-data-table.d.ts +7 -0
  137. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +44 -5
  138. package/types/rt-tools-ui-kit-v2-icon.d.ts +12 -4
  139. package/types/rt-tools-ui-kit-v2-prompt-suggestion.d.ts +21 -0
  140. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +186 -2
  141. package/types/rt-tools-ui-kit-v2-select.d.ts +6 -0
  142. package/types/rt-tools-ui-kit-v2-thread-list.d.ts +15 -2
  143. package/types/rt-tools-ui-kit-v2.d.ts +3 -0
  144. package/rt-tools-ui-kit-v2-0.18.0.tgz +0 -0
@@ -267,7 +267,7 @@ class RtScrollAreaComponent {
267
267
  // Angular
268
268
  NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type:
269
269
  // standalone components / directives
270
- RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "size", "color", "fill", "spin", "rotate"] }, { kind: "directive", type: RtTooltipDirective, selector: "[rtTooltip]", inputs: ["rtTooltip", "rtTooltipPlacement", "rtTooltipWhenTruncated"], exportAs: ["rtTooltip"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
270
+ RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "glyphStrategy", "size", "color", "fill", "spin", "rotate"] }, { kind: "directive", type: RtTooltipDirective, selector: "[rtTooltip]", inputs: ["rtTooltip", "rtTooltipPlacement", "rtTooltipWhenTruncated"], exportAs: ["rtTooltip"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
271
271
  }
272
272
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtScrollAreaComponent, decorators: [{
273
273
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"rt-tools-ui-kit-v2-scroll-area.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/scroll-area/rt-scroll-area.directives.ts","../../../projects/ui-kit-v2/src/lib/components/scroll-area/rt-scroll-area.component.ts","../../../projects/ui-kit-v2/src/lib/components/scroll-area/rt-scroll-area.component.html","../../../projects/ui-kit-v2/src/lib/components/scroll-area/rt-tools-ui-kit-v2-scroll-area.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Маркеры частей области прокрутки — своим файлом, как у соседних семей.\n *\n * Каждый маркер держит свой шаблон и не знает об области ничего: область читает маркеры среди\n * своего содержимого и берёт у них шаблон. Часть, которую потребитель не объявил, для области\n * просто отсутствует — рисовать нечего.\n */\n\n/**\n * Шапка области: стоит сверху и не прокручивается.\n *\n * @example\n * ```html\n * <rt-scroll-area>\n * <ng-container *rtScrollAreaHeader>\n * <h3>Заголовок</h3>\n * </ng-container>\n * </rt-scroll-area>\n * ```\n */\n@Directive({\n selector: '[rtScrollAreaHeader]',\n})\nexport class RtScrollAreaHeaderDirective {\n public readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n\n/** Тело области: единственная часть, которая прокручивается. */\n@Directive({\n selector: '[rtScrollAreaContent]',\n})\nexport class RtScrollAreaContentDirective {\n public readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n\n/** Подвал области: стоит снизу и не прокручивается. */\n@Directive({\n selector: '[rtScrollAreaFooter]',\n})\nexport class RtScrollAreaFooterDirective {\n public readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChild,\n DestroyRef,\n ElementRef,\n inject,\n input,\n InputSignalWithTransform,\n signal,\n Signal,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\nimport { TNullable } from '@rt-tools/utils';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { RtScrollAreaContentDirective, RtScrollAreaFooterDirective, RtScrollAreaHeaderDirective } from './rt-scroll-area.directives';\n\nconst BEM_BLOCK: string = 'rt-scroll-area';\n\n/**\n * Целый пункт запаса при сравнении прокрутки с высотой.\n *\n * Дробная высота строки оставляет остаток, при котором прокрутка уже в самом низу, а разность\n * всё ещё больше нуля: без запаса признак непоказанного висел бы навсегда.\n */\nconst BOTTOM_SLACK_PX: number = 1;\n\n/**\n * Область прокрутки: шапка и подвал стоят, тело прокручивается.\n *\n * Части объявляет потребитель — по директиве на каждую. Необъявленная часть не рисуется вовсе:\n * пустая шапка это полоса отступа над списком, а высоту она забирает у тела, ради которого\n * область и открыли.\n *\n * Договорённость — `docs/specs/ui-kit-v2/scroll-area/`.\n */\n@Component({\n selector: 'rt-scroll-area',\n templateUrl: './rt-scroll-area.component.html',\n styleUrls: ['./rt-scroll-area.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n NgTemplateOutlet,\n\n // standalone components / directives\n RtIconComponent,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ],\n host: { class: BEM_BLOCK },\n})\nexport class RtScrollAreaComponent {\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly bodyRef: Signal<TNullable<ElementRef<HTMLElement>>> = viewChild<ElementRef<HTMLElement>>('body');\n protected readonly footerRef: Signal<TNullable<ElementRef<HTMLElement>>> = viewChild<ElementRef<HTMLElement>>('foot');\n\n /**\n * Ниже окна области ещё есть содержимое. Считается по трём числам самого узла, а не по числу\n * пунктов: область не знает, что ей подали, и высота строки у каждого потребителя своя.\n */\n protected readonly hasMoreBelow: WritableSignal<boolean> = signal(false);\n\n /**\n * На сколько полоса растушёвки поднята над низом области. Она обязана кончиться там, где\n * начинается содержимое подвала: разделитель потребитель рисует первой его строкой, и полоса,\n * оборвавшаяся выше, оставляет до него чистый фон. Считается замером — верхний отступ подвала\n * потребитель пишет как хочет, и вычесть его в стилях не из чего. Без подвала полоса стоит у\n * самого низа.\n */\n protected readonly hintBottom: WritableSignal<number> = signal(0);\n\n public readonly headerTpl: Signal<TNullable<RtScrollAreaHeaderDirective>> = contentChild(RtScrollAreaHeaderDirective);\n public readonly contentTpl: Signal<TNullable<RtScrollAreaContentDirective>> = contentChild(RtScrollAreaContentDirective);\n public readonly footerTpl: Signal<TNullable<RtScrollAreaFooterDirective>> = contentChild(RtScrollAreaFooterDirective);\n\n /**\n * Признак того, что снизу осталось непоказанное. Выключен по умолчанию: область рисуют\n * десятки экранов, и признак, поставленный безусловно, сдвинул бы вид каждому из них.\n */\n public readonly isScrollHintShown: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n /**\n * Наблюдатель за размером тела, его содержимого и подвала. Событие прокрутки приходит только\n * после движения руки, а список не влезает уже в первую минуту показа: без наблюдателя признак\n * появлялся бы у того, кто и так догадался прокрутить, и молчал у того, кому он нужен.\n */\n #sizeWatch: TNullable<ResizeObserver> = null;\n\n /**\n * Наблюдатель за составом тела. Тело — окно постоянной высоты, и когда список дорастает под ним,\n * размер тела не меняется: наблюдатель размера молчит. Пришедшие узлы ставятся под наблюдение\n * размера здесь же — их высота меняется и после того, как они легли.\n */\n #contentWatch: TNullable<MutationObserver> = null;\n\n /** Узлы, за которыми наблюдают сейчас: пересозданное тело или подвал ставятся под наблюдение заново. */\n #watchedBody: HTMLElement | null = null;\n #watchedFooter: HTMLElement | null = null;\n\n /** Наблюдение поставлено: тело и подвал могут быть и пустыми, флаг отличает «снято» от «нечего смотреть». */\n #isWatching: boolean = false;\n\n constructor() {\n // Наблюдатели живут, только пока признак включён: выключенный признак ничего не рисует, а\n // наблюдатель состава с поддеревом заставлял бы браузер пересчитывать раскладку на каждую\n // правку внутри тела у каждой области экрана. Включение ставит их, выключение снимает.\n afterRenderEffect((): void => {\n const body: HTMLElement | null = this.bodyRef()?.nativeElement ?? null;\n const footer: HTMLElement | null = this.footerRef()?.nativeElement ?? null;\n\n if (!this.isScrollHintShown()) {\n this.#unwatch();\n this.hasMoreBelow.set(false);\n\n return;\n }\n\n this.onBodyScroll();\n\n if (!this.#isWatching || body !== this.#watchedBody || footer !== this.#watchedFooter) {\n this.#watch(body, footer);\n }\n });\n\n this.#destroyRef.onDestroy((): void => this.#unwatch());\n }\n\n /**\n * Нажатие на значок уводит тело к самому низу. Нажатие останавливается здесь и в содержимое\n * под значком не уходит: под ним живой пункт, и человек, целившийся в подсказку, уехал бы на\n * чужой экран.\n */\n public onScrollHintClick(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n\n const body: TNullable<ElementRef<HTMLElement>> = this.bodyRef();\n\n if (!body) {\n return;\n }\n\n body.nativeElement.scrollTo({ top: body.nativeElement.scrollHeight, behavior: 'smooth' });\n }\n\n public onBodyScroll(): void {\n // Выключенный признак не рисуется, и замер для него — чтение раскладки на каждое движение.\n if (!this.isScrollHintShown()) {\n return;\n }\n\n this.#measureHintBottom();\n\n const body: TNullable<ElementRef<HTMLElement>> = this.bodyRef();\n\n if (!body) {\n this.hasMoreBelow.set(false);\n\n return;\n }\n\n const node: HTMLElement = body.nativeElement;\n\n this.hasMoreBelow.set(node.scrollHeight - node.scrollTop - node.clientHeight > BOTTOM_SLACK_PX);\n }\n\n /**\n * Подъём полосы над низом области: высота подвала без его верхнего отступа. Ровно на этом\n * месте начинается содержимое подвала, и до него полоса и должна доходить.\n */\n #measureHintBottom(): void {\n const footer: TNullable<ElementRef<HTMLElement>> = this.footerRef();\n\n if (!footer) {\n this.hintBottom.set(0);\n\n return;\n }\n\n const node: HTMLElement = footer.nativeElement;\n const paddingTop: number = parseFloat(getComputedStyle(node).paddingTop) || 0;\n\n this.hintBottom.set(Math.max(node.offsetHeight - paddingTop, 0));\n }\n\n /** Ставит под наблюдение нынешние тело и подвал; прежние наблюдатели снимаются. */\n #watch(body: HTMLElement | null, footer: HTMLElement | null): void {\n this.#unwatch();\n this.#watchedBody = body;\n this.#watchedFooter = footer;\n this.#isWatching = true;\n\n if (!body) {\n return;\n }\n\n if (typeof ResizeObserver !== 'undefined') {\n this.#sizeWatch = new ResizeObserver((): void => this.onBodyScroll());\n this.#observeSizes();\n }\n\n if (typeof MutationObserver !== 'undefined') {\n this.#contentWatch = new MutationObserver((): void => {\n this.#observeSizes();\n this.onBodyScroll();\n });\n this.#contentWatch.observe(body, { childList: true, subtree: true, characterData: true });\n }\n }\n\n /**\n * Размер наблюдается у тела, у каждого его прямого потомка и у подвала. Подвал — наравне с\n * телом: от его высоты считается подъём полосы, и не наблюдавшаяся, она осталась бы стоять по\n * прежней высоте подвала и наехала бы на его первую строку.\n */\n #observeSizes(): void {\n const watch: TNullable<ResizeObserver> = this.#sizeWatch;\n const body: HTMLElement | null = this.#watchedBody;\n\n if (!watch || !body) {\n return;\n }\n\n // Состав тела сменился — ушедшие узлы снимаются вместе со всеми, пришедшие ставятся заново.\n watch.disconnect();\n watch.observe(body);\n Array.from(body.children).forEach((child: Element): void => watch.observe(child));\n\n if (this.#watchedFooter) {\n watch.observe(this.#watchedFooter);\n }\n }\n\n #unwatch(): void {\n this.#sizeWatch?.disconnect();\n this.#sizeWatch = null;\n this.#contentWatch?.disconnect();\n this.#contentWatch = null;\n this.#watchedBody = null;\n this.#watchedFooter = null;\n this.#isWatching = false;\n }\n}\n","<ng-container rtBlock=\"rt-scroll-area\">\n @if (headerTpl()) {\n <div rtElem=\"header\" qa-dataid=\"scroll-area-header\">\n <ng-container [ngTemplateOutlet]=\"headerTpl()?.templateRef ?? null\" />\n </div>\n }\n\n @if (contentTpl()) {\n <div #body rtElem=\"body\" qa-dataid=\"scroll-area-body\" (scroll)=\"onBodyScroll()\">\n <ng-container [ngTemplateOutlet]=\"contentTpl()?.templateRef ?? null\" />\n </div>\n }\n\n @if (footerTpl()) {\n <div #foot rtElem=\"footer\" qa-dataid=\"scroll-area-footer\">\n <ng-container [ngTemplateOutlet]=\"footerTpl()?.templateRef ?? null\" />\n </div>\n }\n\n <!--\n Признак того, что снизу осталось непоказанное: край списка, ровно обрезанный подвалом,\n читается как конец списка, и человек считает, что пункт пропал. Полоса живёт на хосте, а\n не внутри тела: тело обрезает всё по своему краю, и полоса обрывалась бы на верхнем\n отступе подвала — между ней и разделителем, который потребитель рисует первой строкой\n подвала, оставалась бы полоса чистого фона.\n -->\n @if (isScrollHintShown() && hasMoreBelow()) {\n <div rtElem=\"scroll-hint\" qa-dataid=\"scroll-area-scroll-hint\" [style.bottom.px]=\"hintBottom()\">\n <rt-icon\n rtElem=\"scroll-hint-icon\"\n qa-dataid=\"scroll-area-scroll-hint-icon\"\n name=\"chevron-down\"\n size=\"md\"\n role=\"button\"\n tabindex=\"0\"\n rtTooltipPlacement=\"top\"\n [rtTooltip]=\"t().uiScrollDown\"\n [attr.aria-label]=\"t().uiScrollDown\"\n (click)=\"onScrollHintClick($event)\"\n (keydown.enter)=\"onScrollHintClick($event)\" />\n </div>\n }\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-scroll-area.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/scroll-area/rt-scroll-area.directives.ts","../../../projects/ui-kit-v2/src/lib/components/scroll-area/rt-scroll-area.component.ts","../../../projects/ui-kit-v2/src/lib/components/scroll-area/rt-scroll-area.component.html","../../../projects/ui-kit-v2/src/lib/components/scroll-area/rt-tools-ui-kit-v2-scroll-area.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Маркеры частей области прокрутки — своим файлом, как у соседних семей.\n *\n * Каждый маркер держит свой шаблон и не знает об области ничего: область читает маркеры среди\n * своего содержимого и берёт у них шаблон. Часть, которую потребитель не объявил, для области\n * просто отсутствует — рисовать нечего.\n */\n\n/**\n * Шапка области: стоит сверху и не прокручивается.\n *\n * @example\n * ```html\n * <rt-scroll-area>\n * <ng-container *rtScrollAreaHeader>\n * <h3>Заголовок</h3>\n * </ng-container>\n * </rt-scroll-area>\n * ```\n */\n@Directive({\n selector: '[rtScrollAreaHeader]',\n})\nexport class RtScrollAreaHeaderDirective {\n public readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n\n/** Тело области: единственная часть, которая прокручивается. */\n@Directive({\n selector: '[rtScrollAreaContent]',\n})\nexport class RtScrollAreaContentDirective {\n public readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n\n/** Подвал области: стоит снизу и не прокручивается. */\n@Directive({\n selector: '[rtScrollAreaFooter]',\n})\nexport class RtScrollAreaFooterDirective {\n public readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChild,\n DestroyRef,\n ElementRef,\n inject,\n input,\n InputSignalWithTransform,\n signal,\n Signal,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\nimport { TNullable } from '@rt-tools/utils';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { RtScrollAreaContentDirective, RtScrollAreaFooterDirective, RtScrollAreaHeaderDirective } from './rt-scroll-area.directives';\n\nconst BEM_BLOCK: string = 'rt-scroll-area';\n\n/**\n * Целый пункт запаса при сравнении прокрутки с высотой.\n *\n * Дробная высота строки оставляет остаток, при котором прокрутка уже в самом низу, а разность\n * всё ещё больше нуля: без запаса признак непоказанного висел бы навсегда.\n */\nconst BOTTOM_SLACK_PX: number = 1;\n\n/**\n * Область прокрутки: шапка и подвал стоят, тело прокручивается.\n *\n * Части объявляет потребитель — по директиве на каждую. Необъявленная часть не рисуется вовсе:\n * пустая шапка это полоса отступа над списком, а высоту она забирает у тела, ради которого\n * область и открыли.\n *\n * Договорённость — `docs/specs/ui-kit-v2/scroll-area/`.\n */\n@Component({\n selector: 'rt-scroll-area',\n templateUrl: './rt-scroll-area.component.html',\n styleUrls: ['./rt-scroll-area.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n NgTemplateOutlet,\n\n // standalone components / directives\n RtIconComponent,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ],\n host: { class: BEM_BLOCK },\n})\nexport class RtScrollAreaComponent {\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly bodyRef: Signal<TNullable<ElementRef<HTMLElement>>> = viewChild<ElementRef<HTMLElement>>('body');\n protected readonly footerRef: Signal<TNullable<ElementRef<HTMLElement>>> = viewChild<ElementRef<HTMLElement>>('foot');\n\n /**\n * Ниже окна области ещё есть содержимое. Считается по трём числам самого узла, а не по числу\n * пунктов: область не знает, что ей подали, и высота строки у каждого потребителя своя.\n */\n protected readonly hasMoreBelow: WritableSignal<boolean> = signal(false);\n\n /**\n * На сколько полоса растушёвки поднята над низом области. Она обязана кончиться там, где\n * начинается содержимое подвала: разделитель потребитель рисует первой его строкой, и полоса,\n * оборвавшаяся выше, оставляет до него чистый фон. Считается замером — верхний отступ подвала\n * потребитель пишет как хочет, и вычесть его в стилях не из чего. Без подвала полоса стоит у\n * самого низа.\n */\n protected readonly hintBottom: WritableSignal<number> = signal(0);\n\n public readonly headerTpl: Signal<TNullable<RtScrollAreaHeaderDirective>> = contentChild(RtScrollAreaHeaderDirective);\n public readonly contentTpl: Signal<TNullable<RtScrollAreaContentDirective>> = contentChild(RtScrollAreaContentDirective);\n public readonly footerTpl: Signal<TNullable<RtScrollAreaFooterDirective>> = contentChild(RtScrollAreaFooterDirective);\n\n /**\n * Признак того, что снизу осталось непоказанное. Выключен по умолчанию: область рисуют\n * десятки экранов, и признак, поставленный безусловно, сдвинул бы вид каждому из них.\n */\n public readonly isScrollHintShown: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n /**\n * Наблюдатель за размером тела, его содержимого и подвала. Событие прокрутки приходит только\n * после движения руки, а список не влезает уже в первую минуту показа: без наблюдателя признак\n * появлялся бы у того, кто и так догадался прокрутить, и молчал у того, кому он нужен.\n */\n #sizeWatch: TNullable<ResizeObserver> = null;\n\n /**\n * Наблюдатель за составом тела. Тело — окно постоянной высоты, и когда список дорастает под ним,\n * размер тела не меняется: наблюдатель размера молчит. Пришедшие узлы ставятся под наблюдение\n * размера здесь же — их высота меняется и после того, как они легли.\n */\n #contentWatch: TNullable<MutationObserver> = null;\n\n /** Узлы, за которыми наблюдают сейчас: пересозданное тело или подвал ставятся под наблюдение заново. */\n #watchedBody: HTMLElement | null = null;\n #watchedFooter: HTMLElement | null = null;\n\n /** Наблюдение поставлено: тело и подвал могут быть и пустыми, флаг отличает «снято» от «нечего смотреть». */\n #isWatching: boolean = false;\n\n constructor() {\n // Наблюдатели живут, только пока признак включён: выключенный признак ничего не рисует, а\n // наблюдатель состава с поддеревом заставлял бы браузер пересчитывать раскладку на каждую\n // правку внутри тела у каждой области экрана. Включение ставит их, выключение снимает.\n afterRenderEffect((): void => {\n const body: HTMLElement | null = this.bodyRef()?.nativeElement ?? null;\n const footer: HTMLElement | null = this.footerRef()?.nativeElement ?? null;\n\n if (!this.isScrollHintShown()) {\n this.#unwatch();\n this.hasMoreBelow.set(false);\n\n return;\n }\n\n this.onBodyScroll();\n\n if (!this.#isWatching || body !== this.#watchedBody || footer !== this.#watchedFooter) {\n this.#watch(body, footer);\n }\n });\n\n this.#destroyRef.onDestroy((): void => this.#unwatch());\n }\n\n /**\n * Нажатие на значок уводит тело к самому низу. Нажатие останавливается здесь и в содержимое\n * под значком не уходит: под ним живой пункт, и человек, целившийся в подсказку, уехал бы на\n * чужой экран.\n */\n public onScrollHintClick(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n\n const body: TNullable<ElementRef<HTMLElement>> = this.bodyRef();\n\n if (!body) {\n return;\n }\n\n body.nativeElement.scrollTo({ top: body.nativeElement.scrollHeight, behavior: 'smooth' });\n }\n\n public onBodyScroll(): void {\n // Выключенный признак не рисуется, и замер для него — чтение раскладки на каждое движение.\n if (!this.isScrollHintShown()) {\n return;\n }\n\n this.#measureHintBottom();\n\n const body: TNullable<ElementRef<HTMLElement>> = this.bodyRef();\n\n if (!body) {\n this.hasMoreBelow.set(false);\n\n return;\n }\n\n const node: HTMLElement = body.nativeElement;\n\n this.hasMoreBelow.set(node.scrollHeight - node.scrollTop - node.clientHeight > BOTTOM_SLACK_PX);\n }\n\n /**\n * Подъём полосы над низом области: высота подвала без его верхнего отступа. Ровно на этом\n * месте начинается содержимое подвала, и до него полоса и должна доходить.\n */\n #measureHintBottom(): void {\n const footer: TNullable<ElementRef<HTMLElement>> = this.footerRef();\n\n if (!footer) {\n this.hintBottom.set(0);\n\n return;\n }\n\n const node: HTMLElement = footer.nativeElement;\n const paddingTop: number = parseFloat(getComputedStyle(node).paddingTop) || 0;\n\n this.hintBottom.set(Math.max(node.offsetHeight - paddingTop, 0));\n }\n\n /** Ставит под наблюдение нынешние тело и подвал; прежние наблюдатели снимаются. */\n #watch(body: HTMLElement | null, footer: HTMLElement | null): void {\n this.#unwatch();\n this.#watchedBody = body;\n this.#watchedFooter = footer;\n this.#isWatching = true;\n\n if (!body) {\n return;\n }\n\n if (typeof ResizeObserver !== 'undefined') {\n this.#sizeWatch = new ResizeObserver((): void => this.onBodyScroll());\n this.#observeSizes();\n }\n\n if (typeof MutationObserver !== 'undefined') {\n this.#contentWatch = new MutationObserver((): void => {\n this.#observeSizes();\n this.onBodyScroll();\n });\n this.#contentWatch.observe(body, { childList: true, subtree: true, characterData: true });\n }\n }\n\n /**\n * Размер наблюдается у тела, у каждого его прямого потомка и у подвала. Подвал — наравне с\n * телом: от его высоты считается подъём полосы, и не наблюдавшаяся, она осталась бы стоять по\n * прежней высоте подвала и наехала бы на его первую строку.\n */\n #observeSizes(): void {\n const watch: TNullable<ResizeObserver> = this.#sizeWatch;\n const body: HTMLElement | null = this.#watchedBody;\n\n if (!watch || !body) {\n return;\n }\n\n // Состав тела сменился — ушедшие узлы снимаются вместе со всеми, пришедшие ставятся заново.\n watch.disconnect();\n watch.observe(body);\n Array.from(body.children).forEach((child: Element): void => watch.observe(child));\n\n if (this.#watchedFooter) {\n watch.observe(this.#watchedFooter);\n }\n }\n\n #unwatch(): void {\n this.#sizeWatch?.disconnect();\n this.#sizeWatch = null;\n this.#contentWatch?.disconnect();\n this.#contentWatch = null;\n this.#watchedBody = null;\n this.#watchedFooter = null;\n this.#isWatching = false;\n }\n}\n","<ng-container rtBlock=\"rt-scroll-area\">\n @if (headerTpl()) {\n <div rtElem=\"header\" qa-dataid=\"scroll-area-header\">\n <ng-container [ngTemplateOutlet]=\"headerTpl()?.templateRef ?? null\" />\n </div>\n }\n\n @if (contentTpl()) {\n <div #body rtElem=\"body\" qa-dataid=\"scroll-area-body\" (scroll)=\"onBodyScroll()\">\n <ng-container [ngTemplateOutlet]=\"contentTpl()?.templateRef ?? null\" />\n </div>\n }\n\n @if (footerTpl()) {\n <div #foot rtElem=\"footer\" qa-dataid=\"scroll-area-footer\">\n <ng-container [ngTemplateOutlet]=\"footerTpl()?.templateRef ?? null\" />\n </div>\n }\n\n <!--\n Признак того, что снизу осталось непоказанное: край списка, ровно обрезанный подвалом,\n читается как конец списка, и человек считает, что пункт пропал. Полоса живёт на хосте, а\n не внутри тела: тело обрезает всё по своему краю, и полоса обрывалась бы на верхнем\n отступе подвала — между ней и разделителем, который потребитель рисует первой строкой\n подвала, оставалась бы полоса чистого фона.\n -->\n @if (isScrollHintShown() && hasMoreBelow()) {\n <div rtElem=\"scroll-hint\" qa-dataid=\"scroll-area-scroll-hint\" [style.bottom.px]=\"hintBottom()\">\n <rt-icon\n rtElem=\"scroll-hint-icon\"\n qa-dataid=\"scroll-area-scroll-hint-icon\"\n name=\"chevron-down\"\n size=\"md\"\n role=\"button\"\n tabindex=\"0\"\n rtTooltipPlacement=\"top\"\n [rtTooltip]=\"t().uiScrollDown\"\n [attr.aria-label]=\"t().uiScrollDown\"\n (click)=\"onScrollHintClick($event)\"\n (keydown.enter)=\"onScrollHintClick($event)\" />\n </div>\n }\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -19,7 +19,7 @@ class RtSectionNavComponent {
19
19
  this.itemSelect.emit(item.id);
20
20
  }
21
21
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtSectionNavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtSectionNavComponent, isStandalone: true, selector: "rt-section-nav", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelect: "itemSelect" }, host: { attributes: { "role": "navigation" }, classAttribute: "rt-section-nav" }, hostDirectives: [{ directive: i1.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<ng-container rtBlock=\"rt-section-nav\">\n @for (item of items(); track item.id) {\n <button\n rtElem=\"tile\"\n qa-dataid=\"section-nav-tile\"\n type=\"button\"\n [attr.data-key]=\"item.id\"\n [attr.data-active]=\"item.active\"\n [attr.aria-current]=\"item.active ? 'page' : null\"\n [rtMod]=\"{ active: item.active }\"\n (click)=\"onSelect(item)\">\n <rt-icon rtElem=\"icon\" size=\"lg\" [name]=\"item.icon\" />\n <span rtElem=\"label\">{{ item.label }}</span>\n </button>\n }\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-section-nav{--rt-section-nav-tile-radius: var(--rt-radius-xl);--rt-section-nav-tile-shadow: var(--rt-shadow-card-soft);--rt-section-nav-transition-duration: var(--rt-duration-fast);display:flex;gap:var(--rt-space-md)}.rt-section-nav__tile{display:flex;min-width:0;flex:1 0 0;flex-direction:column;align-items:center;justify-content:center;padding:var(--rt-space-md);border:0;border-radius:var(--rt-section-nav-tile-radius);background:transparent;box-shadow:none;color:var(--rt-color-text-primary);cursor:pointer;gap:var(--rt-space-2);transition:background var(--rt-section-nav-transition-duration) ease,box-shadow var(--rt-section-nav-transition-duration) ease}.rt-section-nav__tile:not(.rt-section-nav__tile--active):hover{background:var(--rt-color-bg-surface-subtle);box-shadow:var(--rt-section-nav-tile-shadow)}.rt-section-nav__tile--active{background:var(--rt-color-bg-surface);box-shadow:var(--rt-section-nav-tile-shadow);cursor:default}.rt-section-nav__icon{color:inherit}.rt-section-nav__label{color:inherit;font-family:var(--rt-font-family-sans);font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-bold);letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-snug)}.rt-section-nav[data-rt-radius=none]{--rt-section-nav-tile-radius: var(--rt-radius-none)}.rt-section-nav[data-rt-radius=xs]{--rt-section-nav-tile-radius: var(--rt-radius-xs)}.rt-section-nav[data-rt-radius=sm]{--rt-section-nav-tile-radius: var(--rt-radius-sm)}.rt-section-nav[data-rt-radius=ms]{--rt-section-nav-tile-radius: var(--rt-radius-ms)}.rt-section-nav[data-rt-radius=md]{--rt-section-nav-tile-radius: var(--rt-radius-md)}.rt-section-nav[data-rt-radius=lg]{--rt-section-nav-tile-radius: var(--rt-radius-lg)}.rt-section-nav[data-rt-radius=xl]{--rt-section-nav-tile-radius: var(--rt-radius-xl)}.rt-section-nav[data-rt-radius=\"2xl\"]{--rt-section-nav-tile-radius: var(--rt-radius-2xl)}.rt-section-nav[data-rt-radius=full]{--rt-section-nav-tile-radius: var(--rt-radius-full)}[data-theme=dark] .rt-section-nav__tile--active{background:var(--rt-color-bg-nav)}}\n"], dependencies: [{ kind: "component", type: RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "size", "color", "fill", "spin", "rotate"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
22
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtSectionNavComponent, isStandalone: true, selector: "rt-section-nav", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelect: "itemSelect" }, host: { attributes: { "role": "navigation" }, classAttribute: "rt-section-nav" }, hostDirectives: [{ directive: i1.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<ng-container rtBlock=\"rt-section-nav\">\n @for (item of items(); track item.id) {\n <button\n rtElem=\"tile\"\n qa-dataid=\"section-nav-tile\"\n type=\"button\"\n [attr.data-key]=\"item.id\"\n [attr.data-active]=\"item.active\"\n [attr.aria-current]=\"item.active ? 'page' : null\"\n [rtMod]=\"{ active: item.active }\"\n (click)=\"onSelect(item)\">\n <rt-icon rtElem=\"icon\" size=\"lg\" [name]=\"item.icon\" />\n <span rtElem=\"label\">{{ item.label }}</span>\n </button>\n }\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-section-nav{--rt-section-nav-tile-radius: var(--rt-radius-xl);--rt-section-nav-tile-shadow: var(--rt-shadow-card-soft);--rt-section-nav-transition-duration: var(--rt-duration-fast);display:flex;gap:var(--rt-space-md)}.rt-section-nav__tile{display:flex;min-width:0;flex:1 0 0;flex-direction:column;align-items:center;justify-content:center;padding:var(--rt-space-md);border:0;border-radius:var(--rt-section-nav-tile-radius);background:transparent;box-shadow:none;color:var(--rt-color-text-primary);cursor:pointer;gap:var(--rt-space-2);transition:background var(--rt-section-nav-transition-duration) ease,box-shadow var(--rt-section-nav-transition-duration) ease}.rt-section-nav__tile:not(.rt-section-nav__tile--active):hover{background:var(--rt-color-bg-surface-subtle);box-shadow:var(--rt-section-nav-tile-shadow)}.rt-section-nav__tile--active{background:var(--rt-color-bg-surface);box-shadow:var(--rt-section-nav-tile-shadow);cursor:default}.rt-section-nav__icon{color:inherit}.rt-section-nav__label{color:inherit;font-family:var(--rt-font-family-sans);font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-bold);letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-snug)}.rt-section-nav[data-rt-radius=none]{--rt-section-nav-tile-radius: var(--rt-radius-none)}.rt-section-nav[data-rt-radius=xs]{--rt-section-nav-tile-radius: var(--rt-radius-xs)}.rt-section-nav[data-rt-radius=sm]{--rt-section-nav-tile-radius: var(--rt-radius-sm)}.rt-section-nav[data-rt-radius=ms]{--rt-section-nav-tile-radius: var(--rt-radius-ms)}.rt-section-nav[data-rt-radius=md]{--rt-section-nav-tile-radius: var(--rt-radius-md)}.rt-section-nav[data-rt-radius=lg]{--rt-section-nav-tile-radius: var(--rt-radius-lg)}.rt-section-nav[data-rt-radius=xl]{--rt-section-nav-tile-radius: var(--rt-radius-xl)}.rt-section-nav[data-rt-radius=\"2xl\"]{--rt-section-nav-tile-radius: var(--rt-radius-2xl)}.rt-section-nav[data-rt-radius=full]{--rt-section-nav-tile-radius: var(--rt-radius-full)}[data-theme=dark] .rt-section-nav__tile--active{background:var(--rt-color-bg-nav)}}\n"], dependencies: [{ kind: "component", type: RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "glyphStrategy", "size", "color", "fill", "spin", "rotate"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
23
23
  }
24
24
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtSectionNavComponent, decorators: [{
25
25
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"rt-tools-ui-kit-v2-section-nav.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/section-nav/rt-section-nav.component.ts","../../../projects/ui-kit-v2/src/lib/components/section-nav/rt-section-nav.component.html","../../../projects/ui-kit-v2/src/lib/components/section-nav/rt-tools-ui-kit-v2-section-nav.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input, InputSignal, output, OutputEmitterRef, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { IRtSectionNav } from './rt-section-nav.model';\n\nconst BEM_BLOCK: string = 'rt-section-nav';\n\n@Component({\n selector: 'rt-section-nav',\n templateUrl: './rt-section-nav.component.html',\n styleUrls: ['./rt-section-nav.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtIconComponent, BlockDirective, ElemDirective, ModDirective],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n role: 'navigation',\n },\n})\nexport class RtSectionNavComponent {\n public readonly items: InputSignal<readonly IRtSectionNav.Item[]> = input<readonly IRtSectionNav.Item[]>([]);\n\n public readonly itemSelect: OutputEmitterRef<string> = output<string>();\n\n protected onSelect(item: IRtSectionNav.Item): void {\n if (item.active) {\n return;\n }\n this.itemSelect.emit(item.id);\n }\n}\n","<ng-container rtBlock=\"rt-section-nav\">\n @for (item of items(); track item.id) {\n <button\n rtElem=\"tile\"\n qa-dataid=\"section-nav-tile\"\n type=\"button\"\n [attr.data-key]=\"item.id\"\n [attr.data-active]=\"item.active\"\n [attr.aria-current]=\"item.active ? 'page' : null\"\n [rtMod]=\"{ active: item.active }\"\n (click)=\"onSelect(item)\">\n <rt-icon rtElem=\"icon\" size=\"lg\" [name]=\"item.icon\" />\n <span rtElem=\"label\">{{ item.label }}</span>\n </button>\n }\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAQA,MAAM,SAAS,GAAW,gBAAgB;MAe7B,qBAAqB,CAAA;AAblC,IAAA,WAAA,GAAA;QAcoB,IAAA,CAAA,KAAK,GAA+C,KAAK,CAAgC,EAAE;kFAAC;QAE5F,IAAA,CAAA,UAAU,GAA6B,MAAM,EAAU;AAQ1E,IAAA;AANa,IAAA,QAAQ,CAAC,IAAwB,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACb;QACJ;QACA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACjC;8GAVS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,YAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBlC,snBAgBA,EAAA,MAAA,EAAA,CAAA,mkEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDAc,eAAe,0HAAE,cAAc,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,SAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAO7D,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAbjC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,CAAC,EAAA,cAAA,EACvD,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAA,IAAA,EAChE;AACF,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,IAAI,EAAE,YAAY;AACrB,qBAAA,EAAA,QAAA,EAAA,snBAAA,EAAA,MAAA,EAAA,CAAA,mkEAAA,CAAA,EAAA;;;AErBL;;AAEG;;;;"}
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-section-nav.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/section-nav/rt-section-nav.component.ts","../../../projects/ui-kit-v2/src/lib/components/section-nav/rt-section-nav.component.html","../../../projects/ui-kit-v2/src/lib/components/section-nav/rt-tools-ui-kit-v2-section-nav.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input, InputSignal, output, OutputEmitterRef, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { IRtSectionNav } from './rt-section-nav.model';\n\nconst BEM_BLOCK: string = 'rt-section-nav';\n\n@Component({\n selector: 'rt-section-nav',\n templateUrl: './rt-section-nav.component.html',\n styleUrls: ['./rt-section-nav.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtIconComponent, BlockDirective, ElemDirective, ModDirective],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n role: 'navigation',\n },\n})\nexport class RtSectionNavComponent {\n public readonly items: InputSignal<readonly IRtSectionNav.Item[]> = input<readonly IRtSectionNav.Item[]>([]);\n\n public readonly itemSelect: OutputEmitterRef<string> = output<string>();\n\n protected onSelect(item: IRtSectionNav.Item): void {\n if (item.active) {\n return;\n }\n this.itemSelect.emit(item.id);\n }\n}\n","<ng-container rtBlock=\"rt-section-nav\">\n @for (item of items(); track item.id) {\n <button\n rtElem=\"tile\"\n qa-dataid=\"section-nav-tile\"\n type=\"button\"\n [attr.data-key]=\"item.id\"\n [attr.data-active]=\"item.active\"\n [attr.aria-current]=\"item.active ? 'page' : null\"\n [rtMod]=\"{ active: item.active }\"\n (click)=\"onSelect(item)\">\n <rt-icon rtElem=\"icon\" size=\"lg\" [name]=\"item.icon\" />\n <span rtElem=\"label\">{{ item.label }}</span>\n </button>\n }\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAQA,MAAM,SAAS,GAAW,gBAAgB;MAe7B,qBAAqB,CAAA;AAblC,IAAA,WAAA,GAAA;QAcoB,IAAA,CAAA,KAAK,GAA+C,KAAK,CAAgC,EAAE;kFAAC;QAE5F,IAAA,CAAA,UAAU,GAA6B,MAAM,EAAU;AAQ1E,IAAA;AANa,IAAA,QAAQ,CAAC,IAAwB,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACb;QACJ;QACA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACjC;8GAVS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,YAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBlC,snBAgBA,EAAA,MAAA,EAAA,CAAA,mkEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDAc,eAAe,2IAAE,cAAc,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,SAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAO7D,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAbjC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,CAAC,EAAA,cAAA,EACvD,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAA,IAAA,EAChE;AACF,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,IAAI,EAAE,YAAY;AACrB,qBAAA,EAAA,QAAA,EAAA,snBAAA,EAAA,MAAA,EAAA,CAAA,mkEAAA,CAAA,EAAA;;;AErBL;;AAEG;;;;"}
@@ -347,9 +347,21 @@ class RtSelectComponent extends RtFormControlBase {
347
347
  super.clear(event);
348
348
  this.selectionChange.emit(null);
349
349
  }
350
+ /**
351
+ * Открытый список встаёт подсветкой на выбранный пункт.
352
+ *
353
+ * Иначе стрелка вниз начинала с первого пункта, и человек с выбранным «20» из «10, 20, 40»
354
+ * получал «10» вместо «40».
355
+ */
350
356
  onOpened() {
351
357
  const v = this.value();
352
358
  this.openBranches.set(rtTreeOpenFor(this.options(), v === null ? [] : [v]));
359
+ if (v !== null) {
360
+ const chosen = this.rows().findIndex((row) => row.option.value === v);
361
+ if (chosen >= 0) {
362
+ this.activeIndex.set(chosen);
363
+ }
364
+ }
353
365
  }
354
366
  toggleBranch(event, value) {
355
367
  event.stopPropagation();
@@ -382,7 +394,9 @@ class RtSelectComponent extends RtFormControlBase {
382
394
  if (OPEN_KEYS.has(event.key)) {
383
395
  event.preventDefault();
384
396
  this.popover().open();
385
- this.#moveActive(1);
397
+ if (this.activeIndex() < 0) {
398
+ this.#moveActive(1);
399
+ }
386
400
  }
387
401
  return;
388
402
  }
@@ -454,7 +468,7 @@ class RtSelectComponent extends RtFormControlBase {
454
468
  // Angular
455
469
  FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type:
456
470
  // standalone components / directives
457
- RtIconButtonComponent, selector: "rt-icon-button", inputs: ["icon", "glyph", "ariaLabel", "variant", "iconColor", "iconFill", "size", "iconSize", "type", "tooltip", "tabIndex", "loading", "disabled", "active", "indicator"], outputs: ["clicked"] }, { kind: "component", type: RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "size", "color", "fill", "spin", "rotate"] }, { kind: "component", type: RtInputComponent, selector: "rt-input", inputs: ["appearance", "type", "placeholder", "iconLeft", "iconRight", "passwordToggle", "autocomplete"] }, { kind: "directive", type: RtPopoverDirective, selector: "[rtPopover]", inputs: ["rtPopover", "rtPopoverTrigger", "rtPopoverWidth", "rtPopoverAlign", "rtPopoverFitViewport", "rtPopoverContext", "rtPopoverPanelClass", "rtPopoverDisabled", "rtPopoverOffsetY", "rtPopoverOffsetX"], outputs: ["rtPopoverOpened", "rtPopoverClosed"], exportAs: ["rtPopover"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
471
+ RtIconButtonComponent, selector: "rt-icon-button", inputs: ["icon", "glyph", "ariaLabel", "variant", "iconColor", "iconFill", "size", "iconSize", "type", "tooltip", "tabIndex", "loading", "disabled", "active", "indicator"], outputs: ["clicked"] }, { kind: "component", type: RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "glyphStrategy", "size", "color", "fill", "spin", "rotate"] }, { kind: "component", type: RtInputComponent, selector: "rt-input", inputs: ["appearance", "type", "placeholder", "iconLeft", "iconRight", "passwordToggle", "autocomplete"] }, { kind: "directive", type: RtPopoverDirective, selector: "[rtPopover]", inputs: ["rtPopover", "rtPopoverTrigger", "rtPopoverWidth", "rtPopoverAlign", "rtPopoverFitViewport", "rtPopoverContext", "rtPopoverPanelClass", "rtPopoverDisabled", "rtPopoverOffsetY", "rtPopoverOffsetX"], outputs: ["rtPopoverOpened", "rtPopoverClosed"], exportAs: ["rtPopover"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
458
472
  }
459
473
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtSelectComponent, decorators: [{
460
474
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"rt-tools-ui-kit-v2-select.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/select/rt-select-active-option.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select-tree.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select-trigger.directive.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select.component.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select.component.html","../../../projects/ui-kit-v2/src/lib/components/select/rt-tools-ui-kit-v2-select.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport { afterRenderEffect, inject } from '@angular/core';\n\n/**\n * Держит подсвеченную клавишами опцию в видимой части панели.\n *\n * Панель списка ограничена по высоте, и длинный список прокручивается внутри неё. Клавиши двигают\n * подсветку, но фокус остаётся на поле: браузер сам панель не прокручивает, и подсветка уходила\n * за нижний край — человек выбирал Enter'ом то, чего не видел. После каждой отрисовки, в которой\n * сменилась подсвеченная опция, она прокручивается ровно настолько, чтобы встать в панель.\n *\n * Панель рисуется в наложении, вне поддерева семьи, поэтому опция ищется в документе по своему\n * идентификатору — тому же, что стоит в `aria-activedescendant`. На сервере отрисовки нет, и\n * эффект не выполняется; среда без `scrollIntoView` пропускается.\n *\n * Зовётся в контексте внедрения — полем или конструктором семьи.\n *\n * @param activeOptionId идентификатор подсвеченной опции; `null` — подсветки нет или панель закрыта\n */\nexport function rtScrollActiveOptionIntoView(activeOptionId: () => string | null): void {\n const document: Document = inject(DOCUMENT);\n\n afterRenderEffect((): void => {\n const id: string | null = activeOptionId();\n const option: HTMLElement | null = id ? document.getElementById(id) : null;\n\n if (typeof option?.scrollIntoView === 'function') {\n option.scrollIntoView({ block: 'nearest' });\n }\n });\n}\n","import { IRtSelect } from './rt-select.model';\n\n/**\n * Дерево опций выбора из списка — общее для `rt-select` и `rt-multiselect`.\n *\n * Обе семьи раскладывают, ищут и считают дерево одинаково, поэтому это чистые функции в одном\n * месте: две копии разошлись бы на первой правке. Состояние — какие ветки раскрыты — живёт в семье,\n * здесь только расчёт по нему.\n */\n\ntype TOption<TValue> = IRtSelect.Option<TValue>;\ntype TRow<TValue> = IRtSelect.Row<TValue>;\n\nfunction childrenOf<TValue>(option: TOption<TValue>): ReadonlyArray<TOption<TValue>> {\n return option.children ?? [];\n}\n\nfunction isBranch<TValue>(option: TOption<TValue>): boolean {\n return childrenOf(option).length > 0;\n}\n\n/** Список — дерево, если хоть у одной опции есть дети. Плоский список рисуется как прежде. */\nexport function rtTreeIsTree<TValue>(options: ReadonlyArray<TOption<TValue>>): boolean {\n return options.some((option: TOption<TValue>): boolean => isBranch(option));\n}\n\n/** Опция по значению на любой глубине. */\nexport function rtTreeFind<TValue>(options: ReadonlyArray<TOption<TValue>>, value: TValue): TOption<TValue> | undefined {\n for (const option of options) {\n if (option.value === value) {\n return option;\n }\n const found: TOption<TValue> | undefined = rtTreeFind(childrenOf(option), value);\n if (found) {\n return found;\n }\n }\n return undefined;\n}\n\n/**\n * Включённые листья под опцией; у самого листа — он сам. Отключённая ветка не отдаёт никого: её\n * листья выбрать нельзя, как и её саму.\n */\nexport function rtTreeLeaves<TValue>(option: TOption<TValue>): ReadonlyArray<TValue> {\n if (option.disabled) {\n return [];\n }\n if (!isBranch(option)) {\n return [option.value];\n }\n return childrenOf(option).flatMap((child: TOption<TValue>): ReadonlyArray<TValue> => rtTreeLeaves(child));\n}\n\n/** Сколько включённых листьев ветки выбрано. Флажок ветки выводится из этого, а не хранится. */\nexport function rtTreeBranchState<TValue>(option: TOption<TValue>, chosen: ReadonlyArray<TValue>): IRtSelect.TBranchState {\n const leaves: ReadonlyArray<TValue> = rtTreeLeaves(option);\n const count: number = leaves.filter((leaf: TValue): boolean => chosen.includes(leaf)).length;\n if (count === 0) {\n return 'none';\n }\n return count === leaves.length ? 'all' : 'some';\n}\n\nfunction holdsChosen<TValue>(option: TOption<TValue>, chosen: ReadonlyArray<TValue>): boolean {\n return childrenOf(option).some((child: TOption<TValue>): boolean => chosen.includes(child.value) || holdsChosen(child, chosen));\n}\n\nfunction collectOpen<TValue>(list: ReadonlyArray<TOption<TValue>>, chosen: ReadonlyArray<TValue>, open: Set<TValue>): void {\n for (const option of list) {\n if (holdsChosen(option, chosen)) {\n open.add(option.value);\n collectOpen(childrenOf(option), chosen, open);\n }\n }\n}\n\n/** Ветки, под которыми лежит выбранное значение: они раскрыты, когда список открывается. */\nexport function rtTreeOpenFor<TValue>(options: ReadonlyArray<TOption<TValue>>, chosen: ReadonlyArray<TValue>): ReadonlySet<TValue> {\n const open: Set<TValue> = new Set<TValue>();\n collectOpen(options, chosen, open);\n return open;\n}\n\nfunction matches<TValue>(option: TOption<TValue>, term: string): boolean {\n return option.label.toLowerCase().includes(term);\n}\n\nfunction descendantMatches<TValue>(option: TOption<TValue>, term: string): boolean {\n return childrenOf(option).some((child: TOption<TValue>): boolean => matches(child, term) || descendantMatches(child, term));\n}\n\ninterface ITreeWalk<TValue> {\n readonly open: ReadonlySet<TValue>;\n readonly term: string;\n readonly rows: TRow<TValue>[];\n}\n\ninterface IRowPlace<TValue> {\n readonly level: number;\n readonly parent: TValue | null;\n readonly filtered: boolean;\n}\n\n/**\n * Раскладка одной опции: кладёт её строку и отвечает, где раскладывать её детей, или `null`, если\n * их не видно. `filtered` — действует ли поисковое слово на уровень: под веткой, совпавшей самой и\n * раскрытой, дети идут все, как без поиска.\n */\nfunction placeOption<TValue>(walk: ITreeWalk<TValue>, option: TOption<TValue>, place: IRowPlace<TValue>): IRowPlace<TValue> | null {\n const self: boolean = !place.filtered || matches(option, walk.term);\n const below: boolean = place.filtered && descendantMatches(option, walk.term);\n if (!self && !below) {\n return null;\n }\n const branch: boolean = isBranch(option);\n const openBySet: boolean = self && walk.open.has(option.value);\n const open: boolean = branch && (openBySet || below);\n walk.rows.push({ option, branch, open, level: place.level, parent: place.parent });\n return open ? { level: place.level + 1, parent: option.value, filtered: place.filtered && !openBySet } : null;\n}\n\nfunction walkRows<TValue>(walk: ITreeWalk<TValue>, list: ReadonlyArray<TOption<TValue>>, place: IRowPlace<TValue>): void {\n for (const option of list) {\n const childPlace: IRowPlace<TValue> | null = placeOption(walk, option, place);\n if (childPlace) {\n walkRows(walk, childrenOf(option), childPlace);\n }\n }\n}\n\n/**\n * Видимые строки по уровням. Без поискового слова раскрыты ветки из `open`. Со словом строка\n * остаётся, если совпала она сама или кто-то под ней, и путь к совпадению показан раскрытым.\n * Ветка, совпавшая сама, держит детей такими, какими они были.\n */\nexport function rtTreeRows<TValue>(\n options: ReadonlyArray<TOption<TValue>>,\n open: ReadonlySet<TValue>,\n rawTerm: string = ''\n): ReadonlyArray<TRow<TValue>> {\n const term: string = rawTerm.toLowerCase().trim();\n const walk: ITreeWalk<TValue> = { open, term, rows: [] };\n walkRows(walk, options, { level: 0, parent: null, filtered: term.length > 0 });\n return walk.rows;\n}\n\nfunction sideRight<TValue>(rows: ReadonlyArray<TRow<TValue>>, row: TRow<TValue>, index: number): IRtSelect.SideKeyAnswer<TValue> {\n if (row.branch && !row.open) {\n return { toggle: row.option.value, index };\n }\n const firstChild: boolean = row.branch && rows[index + 1]?.parent === row.option.value;\n return { toggle: null, index: firstChild ? index + 1 : index };\n}\n\nfunction sideLeft<TValue>(rows: ReadonlyArray<TRow<TValue>>, row: TRow<TValue>, index: number): IRtSelect.SideKeyAnswer<TValue> {\n if (row.branch && row.open) {\n return { toggle: row.option.value, index };\n }\n const parentIndex: number = rows.findIndex((candidate: TRow<TValue>): boolean => candidate.option.value === row.parent);\n return { toggle: null, index: parentIndex >= 0 ? parentIndex : index };\n}\n\n/**\n * Ответ на боковую стрелку. Вправо: свёрнутая ветка раскрывается, раскрытая уводит подсветку на\n * первого ребёнка. Влево: раскрытая ветка сворачивается, иначе подсветка уходит на родителя.\n */\nexport function rtTreeSideKey<TValue>(rows: ReadonlyArray<TRow<TValue>>, index: number, key: string): IRtSelect.SideKeyAnswer<TValue> {\n const row: TRow<TValue> | undefined = rows[index];\n if (row && key === 'ArrowRight') {\n return sideRight(rows, row, index);\n }\n if (row && key === 'ArrowLeft') {\n return sideLeft(rows, row, index);\n }\n return { toggle: null, index };\n}\n\n/** Набор раскрытых веток с переключённой одной. */\nexport function rtTreeToggle<TValue>(open: ReadonlySet<TValue>, value: TValue): ReadonlySet<TValue> {\n const next: Set<TValue> = new Set<TValue>(open);\n if (next.has(value)) {\n next.delete(value);\n } else {\n next.add(value);\n }\n return next;\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { IRtSelect } from './rt-select.model';\n\n/**\n * Маркер своей разметки указателя — того, что человек нажимает, чтобы открыть список.\n *\n * Поведение указателя остаётся киту: открытие панели, её ширина, приметы доступности,\n * отключённость, клавиши и закрытие висят на кнопке. Потребитель даёт только то, что рисуется\n * внутри неё, и получает три значения обстановки: открыт ли список, что выбрано, отключён ли выбор.\n *\n * Один маркер на обе семьи выбора: они отличаются только разметкой внутри кнопки, и два маркера\n * разошлись бы на первой же правке.\n *\n * @example\n * ```html\n * <rt-select [options]=\"options\">\n * <ng-template rtSelectTrigger let-state>\n * <rt-tag [value]=\"state.label\" [icon]=\"state.isOpen ? 'chevron-up' : 'chevron-down'\" />\n * </ng-template>\n * </rt-select>\n * ```\n */\n@Directive({\n selector: '[rtSelectTrigger]',\n})\nexport class RtSelectTriggerDirective<TValue = unknown> {\n public readonly templateRef: TemplateRef<IRtSelect.TriggerContext<TValue>> =\n inject<TemplateRef<IRtSelect.TriggerContext<TValue>>>(TemplateRef);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n computed,\n contentChild,\n forwardRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { RtFormControlBase } from '@rt-tools/ui-kit-v2/form-control';\nimport { IRtInput } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtInputComponent } from '@rt-tools/ui-kit-v2/input';\nimport { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';\nimport { IRtPopover } from '@rt-tools/ui-kit-v2/popover';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { rtScrollActiveOptionIntoView } from './rt-select-active-option';\nimport { rtTreeFind, rtTreeIsTree, rtTreeOpenFor, rtTreeRows, rtTreeSideKey, rtTreeToggle } from './rt-select-tree';\nimport { RtSelectTriggerDirective } from './rt-select-trigger.directive';\nimport { IRtSelect } from './rt-select.model';\n\nconst BEM_BLOCK: string = 'rt-select';\n\n/** Клавиши, открывающие закрытый dropdown с фокуса на trigger'е. */\nconst OPEN_KEYS: ReadonlySet<string> = new Set<string>(['ArrowDown', 'ArrowUp', 'Enter', ' ']);\n\ntype TBooleanInput = boolean | string;\n\nlet panelIdSeed: number = 0;\n\nfunction nextPanelId(): number {\n panelIdSeed += 1;\n return panelIdSeed;\n}\n\n/**\n * Single-select dropdown с опциональным filter input.\n *\n * Panel рендерится через CDK Overlay (директива `[rtPopover]` на trigger'е) —\n * не обрезается `overflow: hidden` предками (таблицы, aside, карточки) и\n * авто-flip'ается у края viewport. CVA через общий `RtFormControlBase`. Крестик\n * (`clearable`) слева от шеврона — виден при наличии значения, очищает выбор.\n *\n * Keyboard-nav (activedescendant): фокус на trigger'е, ArrowUp/Down двигают\n * виртуальный highlight (`aria-activedescendant`), Enter выбирает, Escape\n * закрывает. Home/End/typeahead — deferred.\n */\n@Component({\n selector: 'rt-select',\n templateUrl: './rt-select.component.html',\n styleUrl: './rt-select.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n FormsModule,\n NgTemplateOutlet,\n\n // standalone components / directives\n RtIconButtonComponent,\n RtIconComponent,\n RtInputComponent,\n RtPopoverDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n providers: [\n // Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtSelectComponent) },\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[class.rt-select--open]': 'isOpen()',\n '[class.rt-select--disabled]': 'isDisabled()',\n '[class.rt-select--readonly]': 'isReadonly()',\n '[class.rt-select--invalid]': 'isInvalid()',\n '[class.rt-select--borderless]': '!bordered()',\n '[class.rt-select--appearance--fill]': \"appearance() === 'fill'\",\n '[class.rt-select--size--sm]': \"size() === 'sm'\",\n '[class.rt-select--size--lg]': \"size() === 'lg'\",\n '[class.rt-select--with-icon-left]': '!!iconLeft()',\n },\n})\nexport class RtSelectComponent<TValue> extends RtFormControlBase<TValue | null> {\n readonly #t_uiSearch: Signal<string> = rtKitLabel('uiSearch');\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly panelId: string = `rt-select-panel-${nextPanelId()}`;\n\n protected readonly filterPlaceholderText: Signal<string> = computed((): string => this.filterPlaceholder() || this.#t_uiSearch());\n\n protected readonly popover: Signal<RtPopoverDirective> = viewChild.required(RtPopoverDirective);\n\n protected readonly triggerEl: Signal<ElementRef<HTMLButtonElement> | undefined> = viewChild<ElementRef<HTMLButtonElement>>('triggerEl');\n\n protected readonly filterTerm: WritableSignal<string> = signal<string>('');\n protected readonly activeIndex: WritableSignal<number> = signal<number>(-1);\n /** Раскрытые ветки дерева. Живут, пока открыта панель: при открытии раскрыты ветки над выбранным. */\n protected readonly openBranches: WritableSignal<ReadonlySet<TValue>> = signal<ReadonlySet<TValue>>(new Set<TValue>());\n\n protected readonly isOpen: Signal<boolean> = computed((): boolean => this.popover().isOpen());\n\n /** Идентификатор подсвеченной опции — тот же, что уходит в `aria-activedescendant`. */\n protected readonly activeOptionId: Signal<string | null> = computed((): string | null =>\n this.isOpen() && this.activeIndex() >= 0 ? `${this.panelId}-opt-${this.activeIndex()}` : null\n );\n\n /**\n * Своя разметка указателя, если потребитель её объявил. Не объявил — кит рисует свою, и ни один\n * нынешний потребитель не двигается.\n */\n protected readonly triggerTpl: Signal<RtSelectTriggerDirective<TValue> | undefined> = contentChild(RtSelectTriggerDirective);\n\n protected readonly hasValue: Signal<boolean> = computed((): boolean => this.value() !== null);\n\n protected readonly selectedLabel: Signal<string> = computed((): string => {\n const v: TValue | null = this.value();\n if (v === null) {\n return '';\n }\n return rtTreeFind(this.options(), v)?.label ?? '';\n });\n\n /** Дерево ли список: тогда у строк есть место под стрелку и отступ по уровню. */\n protected readonly isTree: Signal<boolean> = computed((): boolean => rtTreeIsTree(this.options()));\n\n /** Видимые строки: плоский список — как прежде, дерево — по раскрытым веткам и поисковому слову. */\n protected readonly rows: Signal<ReadonlyArray<IRtSelect.Row<TValue>>> = computed((): ReadonlyArray<IRtSelect.Row<TValue>> =>\n rtTreeRows(this.options(), this.openBranches(), this.filterTerm())\n );\n\n /** Три значения, которые кит отдаёт своей разметке указателя, и не больше. */\n protected readonly triggerState: Signal<IRtSelect.TriggerState<TValue>> = computed((): IRtSelect.TriggerState<TValue> => ({\n isOpen: this.isOpen(),\n value: this.value(),\n label: this.selectedLabel(),\n isDisabled: this.isDisabled(),\n }));\n\n /** Вид рамки: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. */\n public readonly appearance: InputSignal<IRtInput.Appearance> = input<IRtInput.Appearance>('outline');\n\n public readonly displayText: Signal<string> = computed((): string => this.selectedLabel());\n\n public readonly options: InputSignal<ReadonlyArray<IRtSelect.Option<TValue>>> = input<ReadonlyArray<IRtSelect.Option<TValue>>>([]);\n\n public readonly placeholder: InputSignal<string> = input<string>('');\n\n public readonly iconLeft: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n public readonly filter: InputSignalWithTransform<boolean, TBooleanInput> = input<boolean, TBooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly filterPlaceholder: InputSignal<string> = input<string>('');\n\n /**\n * Чем мерится панель. По умолчанию она не уже кнопки и дальше растёт по содержимому:\n * со своим указателем кнопка бывает узкой, и панель по её ширине давила бы содержимое.\n * `trigger` возвращает прежнее — ровно по кнопке, `auto` пускает панель по содержимому\n * целиком. Предел высоты назначается входом `panelMaxHeight`.\n */\n public readonly panelWidth: InputSignal<IRtPopover.Width> = input<IRtPopover.Width>('trigger-min');\n\n /**\n * Предел высоты панели — длина как в стилях, например `20rem`. Пусто — предел кита\n * `--rt-input-panel-max-height`, и длинный список прокручивается внутри панели: без предела\n * он уходил за нижний край экрана, и пункты за краем были недостижимы. `none` снимает предел —\n * для короткого списка, который должен открываться целиком, без прокрутки. Значение ставится\n * на саму панель: она рисуется в наложении, вне поддерева блока.\n */\n public readonly panelMaxHeight: InputSignal<string | null> = input<string | null>(null);\n\n public readonly selectionChange: OutputEmitterRef<TValue | null> = output<TValue | null>();\n\n constructor() {\n super();\n // Подсветка, сдвинутая клавишами, не уходит за край панели с пределом высоты.\n rtScrollActiveOptionIntoView(this.activeOptionId);\n }\n\n public override setDisabledState(disabled: boolean): void {\n super.setDisabledState(disabled);\n if (disabled) {\n this.popover().close();\n }\n }\n\n protected getEmptyValue(): TValue | null {\n return null;\n }\n\n protected focusAfterClear(): void {\n this.triggerEl()?.nativeElement.focus();\n }\n\n protected override clear(event?: Event): void {\n if (this.isDisabled()) {\n return;\n }\n super.clear(event);\n this.selectionChange.emit(null);\n }\n\n protected onOpened(): void {\n const v: TValue | null = this.value();\n this.openBranches.set(rtTreeOpenFor(this.options(), v === null ? [] : [v]));\n }\n\n protected toggleBranch(event: Event, value: TValue): void {\n event.stopPropagation();\n this.openBranches.update((open: ReadonlySet<TValue>): ReadonlySet<TValue> => rtTreeToggle(open, value));\n }\n\n protected onClosed(): void {\n // Закрытие (outside-click / Escape / выбор) = пользователь увёл фокус.\n this.filterTerm.set('');\n this.activeIndex.set(-1);\n this.markTouched();\n }\n\n protected select(opt: IRtSelect.Option<TValue>): void {\n if (opt.disabled) {\n return;\n }\n this.value.set(opt.value);\n this.emitChange(opt.value);\n this.selectionChange.emit(opt.value);\n this.popover().close();\n }\n\n protected setFilter(term: string): void {\n this.filterTerm.set(term);\n this.activeIndex.set(-1);\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) {\n return;\n }\n if (!this.isOpen()) {\n if (OPEN_KEYS.has(event.key)) {\n event.preventDefault();\n this.popover().open();\n this.#moveActive(1);\n }\n return;\n }\n this.#handleOpenKeydown(event);\n }\n\n #handleOpenKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.#moveActive(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.#moveActive(-1);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.#selectActive();\n break;\n case 'Escape':\n event.preventDefault();\n this.popover().close();\n break;\n case 'ArrowRight':\n case 'ArrowLeft':\n event.preventDefault();\n this.#sideKey(event.key);\n break;\n default:\n break;\n }\n }\n\n #sideKey(key: string): void {\n const answer: IRtSelect.SideKeyAnswer<TValue> = rtTreeSideKey(this.rows(), this.activeIndex(), key);\n const toggle: TValue | null = answer.toggle;\n if (toggle !== null) {\n this.openBranches.update((open: ReadonlySet<TValue>): ReadonlySet<TValue> => rtTreeToggle(open, toggle));\n }\n this.activeIndex.set(answer.index);\n }\n\n #moveActive(delta: number): void {\n const opts: ReadonlyArray<IRtSelect.Option<TValue>> = this.rows().map(\n (row: IRtSelect.Row<TValue>): IRtSelect.Option<TValue> => row.option\n );\n if (opts.length === 0) {\n this.activeIndex.set(-1);\n return;\n }\n let index: number = this.activeIndex();\n for (let step: number = 0; step < opts.length; step += 1) {\n index = (index + delta + opts.length) % opts.length;\n if (!opts[index].disabled) {\n this.activeIndex.set(index);\n return;\n }\n }\n }\n\n #selectActive(): void {\n const opts: ReadonlyArray<IRtSelect.Option<TValue>> = this.rows().map(\n (row: IRtSelect.Row<TValue>): IRtSelect.Option<TValue> => row.option\n );\n const index: number = this.activeIndex();\n if (index >= 0 && index < opts.length) {\n this.select(opts[index]);\n }\n }\n}\n","<ng-container rtBlock=\"rt-select\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '—' }}</span>\n }\n <button\n #triggerEl\n rtElem=\"trigger\"\n qa-dataid=\"select-trigger\"\n type=\"button\"\n [rtPopoverWidth]=\"panelWidth()\"\n [rtMod]=\"{ own: !!triggerTpl() }\"\n [rtPopover]=\"panelTpl\"\n [rtPopoverDisabled]=\"isDisabled()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n [disabled]=\"isDisabled()\"\n (keydown)=\"onTriggerKeydown($event)\"\n (rtPopoverOpened)=\"onOpened()\"\n (rtPopoverClosed)=\"onClosed()\">\n <!--\n Разметка указателя: своя, если потребитель её объявил, иначе зашитая китом. Она встаёт\n внутрь кнопки, а не вместо неё: поведение — открытие панели, приметы доступности,\n отключённость, клавиши и закрытие — остаётся на кнопке кита.\n -->\n @if (triggerTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" [ngTemplateOutletContext]=\"{ $implicit: triggerState() }\" />\n } @else {\n @if (iconLeft(); as left) {\n <rt-icon rtElem=\"icon-left\" size=\"sm\" color=\"muted\" [name]=\"left\" />\n }\n <span rtElem=\"label\" [rtMod]=\"{ placeholder: !selectedLabel() }\">\n {{ selectedLabel() || placeholder() }}\n </span>\n @if (showClearButton()) {\n <rt-icon-button\n rtElem=\"clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"t().uiClear\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n <rt-icon rtElem=\"chevron\" name=\"chevron-down\" size=\"sm\" color=\"muted\" />\n }\n </button>\n\n <ng-template #panelTpl>\n <div rtElem=\"panel\" role=\"listbox\" [style.--rt-select-panel-max-height]=\"panelMaxHeight()\" [attr.aria-label]=\"ariaLabel()\">\n @if (filter()) {\n <div rtElem=\"filter\">\n <rt-input\n iconLeft=\"ico-search\"\n [placeholder]=\"filterPlaceholderText()\"\n [ngModel]=\"filterTerm()\"\n (ngModelChange)=\"setFilter($event)\" />\n </div>\n }\n <!--\n Опции listbox'а выбираются мышью через (click); keyboard-nav —\n на trigger'е (activedescendant: ArrowUp/Down/Enter), опции не\n focusable индивидуально, поэтому a11y-правила здесь не применимы.\n -->\n <!-- eslint-disable @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <ul rtElem=\"list\">\n @for (row of rows(); track row.option.value; let i = $index) {\n <li\n rtElem=\"option\"\n qa-dataid=\"select-option\"\n role=\"option\"\n [id]=\"panelId + '-opt-' + i\"\n [attr.data-value]=\"row.option.value\"\n [attr.aria-level]=\"isTree() ? row.level + 1 : null\"\n [style.--rt-select-tree-level]=\"row.level\"\n [rtMod]=\"{\n selected: row.option.value === value(),\n active: i === activeIndex(),\n disabled: !!row.option.disabled,\n }\"\n [attr.aria-selected]=\"row.option.value === value()\"\n [attr.aria-disabled]=\"!!row.option.disabled\"\n (click)=\"select(row.option)\">\n @if (isTree()) {\n @if (row.branch) {\n <button\n rtElem=\"toggle\"\n qa-dataid=\"select-option-toggle\"\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"row.open ? t().uiCollapse : t().uiExpand\"\n [attr.aria-expanded]=\"row.open\"\n (click)=\"toggleBranch($event, row.option.value)\">\n <rt-icon size=\"sm\" color=\"muted\" [name]=\"row.open ? 'chevron-down' : 'chevron-right'\" />\n </button>\n } @else {\n <span rtElem=\"toggle-space\"></span>\n }\n }\n <span rtElem=\"option-label\">{{ row.option.label }}</span>\n @if (row.option.value === value()) {\n <rt-icon rtElem=\"check\" name=\"check\" size=\"sm\" aria-hidden=\"true\" />\n }\n </li>\n } @empty {\n <li rtElem=\"empty\">{{ t().uiNoOptions }}</li>\n }\n </ul>\n </div>\n </ng-template>\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-select.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/select/rt-select-active-option.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select-tree.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select-trigger.directive.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select.component.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select.component.html","../../../projects/ui-kit-v2/src/lib/components/select/rt-tools-ui-kit-v2-select.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport { afterRenderEffect, inject } from '@angular/core';\n\n/**\n * Держит подсвеченную клавишами опцию в видимой части панели.\n *\n * Панель списка ограничена по высоте, и длинный список прокручивается внутри неё. Клавиши двигают\n * подсветку, но фокус остаётся на поле: браузер сам панель не прокручивает, и подсветка уходила\n * за нижний край — человек выбирал Enter'ом то, чего не видел. После каждой отрисовки, в которой\n * сменилась подсвеченная опция, она прокручивается ровно настолько, чтобы встать в панель.\n *\n * Панель рисуется в наложении, вне поддерева семьи, поэтому опция ищется в документе по своему\n * идентификатору — тому же, что стоит в `aria-activedescendant`. На сервере отрисовки нет, и\n * эффект не выполняется; среда без `scrollIntoView` пропускается.\n *\n * Зовётся в контексте внедрения — полем или конструктором семьи.\n *\n * @param activeOptionId идентификатор подсвеченной опции; `null` — подсветки нет или панель закрыта\n */\nexport function rtScrollActiveOptionIntoView(activeOptionId: () => string | null): void {\n const document: Document = inject(DOCUMENT);\n\n afterRenderEffect((): void => {\n const id: string | null = activeOptionId();\n const option: HTMLElement | null = id ? document.getElementById(id) : null;\n\n if (typeof option?.scrollIntoView === 'function') {\n option.scrollIntoView({ block: 'nearest' });\n }\n });\n}\n","import { IRtSelect } from './rt-select.model';\n\n/**\n * Дерево опций выбора из списка — общее для `rt-select` и `rt-multiselect`.\n *\n * Обе семьи раскладывают, ищут и считают дерево одинаково, поэтому это чистые функции в одном\n * месте: две копии разошлись бы на первой правке. Состояние — какие ветки раскрыты — живёт в семье,\n * здесь только расчёт по нему.\n */\n\ntype TOption<TValue> = IRtSelect.Option<TValue>;\ntype TRow<TValue> = IRtSelect.Row<TValue>;\n\nfunction childrenOf<TValue>(option: TOption<TValue>): ReadonlyArray<TOption<TValue>> {\n return option.children ?? [];\n}\n\nfunction isBranch<TValue>(option: TOption<TValue>): boolean {\n return childrenOf(option).length > 0;\n}\n\n/** Список — дерево, если хоть у одной опции есть дети. Плоский список рисуется как прежде. */\nexport function rtTreeIsTree<TValue>(options: ReadonlyArray<TOption<TValue>>): boolean {\n return options.some((option: TOption<TValue>): boolean => isBranch(option));\n}\n\n/** Опция по значению на любой глубине. */\nexport function rtTreeFind<TValue>(options: ReadonlyArray<TOption<TValue>>, value: TValue): TOption<TValue> | undefined {\n for (const option of options) {\n if (option.value === value) {\n return option;\n }\n const found: TOption<TValue> | undefined = rtTreeFind(childrenOf(option), value);\n if (found) {\n return found;\n }\n }\n return undefined;\n}\n\n/**\n * Включённые листья под опцией; у самого листа — он сам. Отключённая ветка не отдаёт никого: её\n * листья выбрать нельзя, как и её саму.\n */\nexport function rtTreeLeaves<TValue>(option: TOption<TValue>): ReadonlyArray<TValue> {\n if (option.disabled) {\n return [];\n }\n if (!isBranch(option)) {\n return [option.value];\n }\n return childrenOf(option).flatMap((child: TOption<TValue>): ReadonlyArray<TValue> => rtTreeLeaves(child));\n}\n\n/** Сколько включённых листьев ветки выбрано. Флажок ветки выводится из этого, а не хранится. */\nexport function rtTreeBranchState<TValue>(option: TOption<TValue>, chosen: ReadonlyArray<TValue>): IRtSelect.TBranchState {\n const leaves: ReadonlyArray<TValue> = rtTreeLeaves(option);\n const count: number = leaves.filter((leaf: TValue): boolean => chosen.includes(leaf)).length;\n if (count === 0) {\n return 'none';\n }\n return count === leaves.length ? 'all' : 'some';\n}\n\nfunction holdsChosen<TValue>(option: TOption<TValue>, chosen: ReadonlyArray<TValue>): boolean {\n return childrenOf(option).some((child: TOption<TValue>): boolean => chosen.includes(child.value) || holdsChosen(child, chosen));\n}\n\nfunction collectOpen<TValue>(list: ReadonlyArray<TOption<TValue>>, chosen: ReadonlyArray<TValue>, open: Set<TValue>): void {\n for (const option of list) {\n if (holdsChosen(option, chosen)) {\n open.add(option.value);\n collectOpen(childrenOf(option), chosen, open);\n }\n }\n}\n\n/** Ветки, под которыми лежит выбранное значение: они раскрыты, когда список открывается. */\nexport function rtTreeOpenFor<TValue>(options: ReadonlyArray<TOption<TValue>>, chosen: ReadonlyArray<TValue>): ReadonlySet<TValue> {\n const open: Set<TValue> = new Set<TValue>();\n collectOpen(options, chosen, open);\n return open;\n}\n\nfunction matches<TValue>(option: TOption<TValue>, term: string): boolean {\n return option.label.toLowerCase().includes(term);\n}\n\nfunction descendantMatches<TValue>(option: TOption<TValue>, term: string): boolean {\n return childrenOf(option).some((child: TOption<TValue>): boolean => matches(child, term) || descendantMatches(child, term));\n}\n\ninterface ITreeWalk<TValue> {\n readonly open: ReadonlySet<TValue>;\n readonly term: string;\n readonly rows: TRow<TValue>[];\n}\n\ninterface IRowPlace<TValue> {\n readonly level: number;\n readonly parent: TValue | null;\n readonly filtered: boolean;\n}\n\n/**\n * Раскладка одной опции: кладёт её строку и отвечает, где раскладывать её детей, или `null`, если\n * их не видно. `filtered` — действует ли поисковое слово на уровень: под веткой, совпавшей самой и\n * раскрытой, дети идут все, как без поиска.\n */\nfunction placeOption<TValue>(walk: ITreeWalk<TValue>, option: TOption<TValue>, place: IRowPlace<TValue>): IRowPlace<TValue> | null {\n const self: boolean = !place.filtered || matches(option, walk.term);\n const below: boolean = place.filtered && descendantMatches(option, walk.term);\n if (!self && !below) {\n return null;\n }\n const branch: boolean = isBranch(option);\n const openBySet: boolean = self && walk.open.has(option.value);\n const open: boolean = branch && (openBySet || below);\n walk.rows.push({ option, branch, open, level: place.level, parent: place.parent });\n return open ? { level: place.level + 1, parent: option.value, filtered: place.filtered && !openBySet } : null;\n}\n\nfunction walkRows<TValue>(walk: ITreeWalk<TValue>, list: ReadonlyArray<TOption<TValue>>, place: IRowPlace<TValue>): void {\n for (const option of list) {\n const childPlace: IRowPlace<TValue> | null = placeOption(walk, option, place);\n if (childPlace) {\n walkRows(walk, childrenOf(option), childPlace);\n }\n }\n}\n\n/**\n * Видимые строки по уровням. Без поискового слова раскрыты ветки из `open`. Со словом строка\n * остаётся, если совпала она сама или кто-то под ней, и путь к совпадению показан раскрытым.\n * Ветка, совпавшая сама, держит детей такими, какими они были.\n */\nexport function rtTreeRows<TValue>(\n options: ReadonlyArray<TOption<TValue>>,\n open: ReadonlySet<TValue>,\n rawTerm: string = ''\n): ReadonlyArray<TRow<TValue>> {\n const term: string = rawTerm.toLowerCase().trim();\n const walk: ITreeWalk<TValue> = { open, term, rows: [] };\n walkRows(walk, options, { level: 0, parent: null, filtered: term.length > 0 });\n return walk.rows;\n}\n\nfunction sideRight<TValue>(rows: ReadonlyArray<TRow<TValue>>, row: TRow<TValue>, index: number): IRtSelect.SideKeyAnswer<TValue> {\n if (row.branch && !row.open) {\n return { toggle: row.option.value, index };\n }\n const firstChild: boolean = row.branch && rows[index + 1]?.parent === row.option.value;\n return { toggle: null, index: firstChild ? index + 1 : index };\n}\n\nfunction sideLeft<TValue>(rows: ReadonlyArray<TRow<TValue>>, row: TRow<TValue>, index: number): IRtSelect.SideKeyAnswer<TValue> {\n if (row.branch && row.open) {\n return { toggle: row.option.value, index };\n }\n const parentIndex: number = rows.findIndex((candidate: TRow<TValue>): boolean => candidate.option.value === row.parent);\n return { toggle: null, index: parentIndex >= 0 ? parentIndex : index };\n}\n\n/**\n * Ответ на боковую стрелку. Вправо: свёрнутая ветка раскрывается, раскрытая уводит подсветку на\n * первого ребёнка. Влево: раскрытая ветка сворачивается, иначе подсветка уходит на родителя.\n */\nexport function rtTreeSideKey<TValue>(rows: ReadonlyArray<TRow<TValue>>, index: number, key: string): IRtSelect.SideKeyAnswer<TValue> {\n const row: TRow<TValue> | undefined = rows[index];\n if (row && key === 'ArrowRight') {\n return sideRight(rows, row, index);\n }\n if (row && key === 'ArrowLeft') {\n return sideLeft(rows, row, index);\n }\n return { toggle: null, index };\n}\n\n/** Набор раскрытых веток с переключённой одной. */\nexport function rtTreeToggle<TValue>(open: ReadonlySet<TValue>, value: TValue): ReadonlySet<TValue> {\n const next: Set<TValue> = new Set<TValue>(open);\n if (next.has(value)) {\n next.delete(value);\n } else {\n next.add(value);\n }\n return next;\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { IRtSelect } from './rt-select.model';\n\n/**\n * Маркер своей разметки указателя — того, что человек нажимает, чтобы открыть список.\n *\n * Поведение указателя остаётся киту: открытие панели, её ширина, приметы доступности,\n * отключённость, клавиши и закрытие висят на кнопке. Потребитель даёт только то, что рисуется\n * внутри неё, и получает три значения обстановки: открыт ли список, что выбрано, отключён ли выбор.\n *\n * Один маркер на обе семьи выбора: они отличаются только разметкой внутри кнопки, и два маркера\n * разошлись бы на первой же правке.\n *\n * @example\n * ```html\n * <rt-select [options]=\"options\">\n * <ng-template rtSelectTrigger let-state>\n * <rt-tag [value]=\"state.label\" [icon]=\"state.isOpen ? 'chevron-up' : 'chevron-down'\" />\n * </ng-template>\n * </rt-select>\n * ```\n */\n@Directive({\n selector: '[rtSelectTrigger]',\n})\nexport class RtSelectTriggerDirective<TValue = unknown> {\n public readonly templateRef: TemplateRef<IRtSelect.TriggerContext<TValue>> =\n inject<TemplateRef<IRtSelect.TriggerContext<TValue>>>(TemplateRef);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n computed,\n contentChild,\n forwardRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { RtFormControlBase } from '@rt-tools/ui-kit-v2/form-control';\nimport { IRtInput } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtInputComponent } from '@rt-tools/ui-kit-v2/input';\nimport { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';\nimport { IRtPopover } from '@rt-tools/ui-kit-v2/popover';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { rtScrollActiveOptionIntoView } from './rt-select-active-option';\nimport { rtTreeFind, rtTreeIsTree, rtTreeOpenFor, rtTreeRows, rtTreeSideKey, rtTreeToggle } from './rt-select-tree';\nimport { RtSelectTriggerDirective } from './rt-select-trigger.directive';\nimport { IRtSelect } from './rt-select.model';\n\nconst BEM_BLOCK: string = 'rt-select';\n\n/** Клавиши, открывающие закрытый dropdown с фокуса на trigger'е. */\nconst OPEN_KEYS: ReadonlySet<string> = new Set<string>(['ArrowDown', 'ArrowUp', 'Enter', ' ']);\n\ntype TBooleanInput = boolean | string;\n\nlet panelIdSeed: number = 0;\n\nfunction nextPanelId(): number {\n panelIdSeed += 1;\n return panelIdSeed;\n}\n\n/**\n * Single-select dropdown с опциональным filter input.\n *\n * Panel рендерится через CDK Overlay (директива `[rtPopover]` на trigger'е) —\n * не обрезается `overflow: hidden` предками (таблицы, aside, карточки) и\n * авто-flip'ается у края viewport. CVA через общий `RtFormControlBase`. Крестик\n * (`clearable`) слева от шеврона — виден при наличии значения, очищает выбор.\n *\n * Keyboard-nav (activedescendant): фокус на trigger'е, ArrowUp/Down двигают\n * виртуальный highlight (`aria-activedescendant`), Enter выбирает, Escape\n * закрывает. Home/End/typeahead — deferred.\n */\n@Component({\n selector: 'rt-select',\n templateUrl: './rt-select.component.html',\n styleUrl: './rt-select.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n FormsModule,\n NgTemplateOutlet,\n\n // standalone components / directives\n RtIconButtonComponent,\n RtIconComponent,\n RtInputComponent,\n RtPopoverDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n providers: [\n // Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtSelectComponent) },\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[class.rt-select--open]': 'isOpen()',\n '[class.rt-select--disabled]': 'isDisabled()',\n '[class.rt-select--readonly]': 'isReadonly()',\n '[class.rt-select--invalid]': 'isInvalid()',\n '[class.rt-select--borderless]': '!bordered()',\n '[class.rt-select--appearance--fill]': \"appearance() === 'fill'\",\n '[class.rt-select--size--sm]': \"size() === 'sm'\",\n '[class.rt-select--size--lg]': \"size() === 'lg'\",\n '[class.rt-select--with-icon-left]': '!!iconLeft()',\n },\n})\nexport class RtSelectComponent<TValue> extends RtFormControlBase<TValue | null> {\n readonly #t_uiSearch: Signal<string> = rtKitLabel('uiSearch');\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly panelId: string = `rt-select-panel-${nextPanelId()}`;\n\n protected readonly filterPlaceholderText: Signal<string> = computed((): string => this.filterPlaceholder() || this.#t_uiSearch());\n\n protected readonly popover: Signal<RtPopoverDirective> = viewChild.required(RtPopoverDirective);\n\n protected readonly triggerEl: Signal<ElementRef<HTMLButtonElement> | undefined> = viewChild<ElementRef<HTMLButtonElement>>('triggerEl');\n\n protected readonly filterTerm: WritableSignal<string> = signal<string>('');\n protected readonly activeIndex: WritableSignal<number> = signal<number>(-1);\n /** Раскрытые ветки дерева. Живут, пока открыта панель: при открытии раскрыты ветки над выбранным. */\n protected readonly openBranches: WritableSignal<ReadonlySet<TValue>> = signal<ReadonlySet<TValue>>(new Set<TValue>());\n\n protected readonly isOpen: Signal<boolean> = computed((): boolean => this.popover().isOpen());\n\n /** Идентификатор подсвеченной опции — тот же, что уходит в `aria-activedescendant`. */\n protected readonly activeOptionId: Signal<string | null> = computed((): string | null =>\n this.isOpen() && this.activeIndex() >= 0 ? `${this.panelId}-opt-${this.activeIndex()}` : null\n );\n\n /**\n * Своя разметка указателя, если потребитель её объявил. Не объявил — кит рисует свою, и ни один\n * нынешний потребитель не двигается.\n */\n protected readonly triggerTpl: Signal<RtSelectTriggerDirective<TValue> | undefined> = contentChild(RtSelectTriggerDirective);\n\n protected readonly hasValue: Signal<boolean> = computed((): boolean => this.value() !== null);\n\n protected readonly selectedLabel: Signal<string> = computed((): string => {\n const v: TValue | null = this.value();\n if (v === null) {\n return '';\n }\n return rtTreeFind(this.options(), v)?.label ?? '';\n });\n\n /** Дерево ли список: тогда у строк есть место под стрелку и отступ по уровню. */\n protected readonly isTree: Signal<boolean> = computed((): boolean => rtTreeIsTree(this.options()));\n\n /** Видимые строки: плоский список — как прежде, дерево — по раскрытым веткам и поисковому слову. */\n protected readonly rows: Signal<ReadonlyArray<IRtSelect.Row<TValue>>> = computed((): ReadonlyArray<IRtSelect.Row<TValue>> =>\n rtTreeRows(this.options(), this.openBranches(), this.filterTerm())\n );\n\n /** Три значения, которые кит отдаёт своей разметке указателя, и не больше. */\n protected readonly triggerState: Signal<IRtSelect.TriggerState<TValue>> = computed((): IRtSelect.TriggerState<TValue> => ({\n isOpen: this.isOpen(),\n value: this.value(),\n label: this.selectedLabel(),\n isDisabled: this.isDisabled(),\n }));\n\n /** Вид рамки: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. */\n public readonly appearance: InputSignal<IRtInput.Appearance> = input<IRtInput.Appearance>('outline');\n\n public readonly displayText: Signal<string> = computed((): string => this.selectedLabel());\n\n public readonly options: InputSignal<ReadonlyArray<IRtSelect.Option<TValue>>> = input<ReadonlyArray<IRtSelect.Option<TValue>>>([]);\n\n public readonly placeholder: InputSignal<string> = input<string>('');\n\n public readonly iconLeft: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n public readonly filter: InputSignalWithTransform<boolean, TBooleanInput> = input<boolean, TBooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly filterPlaceholder: InputSignal<string> = input<string>('');\n\n /**\n * Чем мерится панель. По умолчанию она не уже кнопки и дальше растёт по содержимому:\n * со своим указателем кнопка бывает узкой, и панель по её ширине давила бы содержимое.\n * `trigger` возвращает прежнее — ровно по кнопке, `auto` пускает панель по содержимому\n * целиком. Предел высоты назначается входом `panelMaxHeight`.\n */\n public readonly panelWidth: InputSignal<IRtPopover.Width> = input<IRtPopover.Width>('trigger-min');\n\n /**\n * Предел высоты панели — длина как в стилях, например `20rem`. Пусто — предел кита\n * `--rt-input-panel-max-height`, и длинный список прокручивается внутри панели: без предела\n * он уходил за нижний край экрана, и пункты за краем были недостижимы. `none` снимает предел —\n * для короткого списка, который должен открываться целиком, без прокрутки. Значение ставится\n * на саму панель: она рисуется в наложении, вне поддерева блока.\n */\n public readonly panelMaxHeight: InputSignal<string | null> = input<string | null>(null);\n\n public readonly selectionChange: OutputEmitterRef<TValue | null> = output<TValue | null>();\n\n constructor() {\n super();\n // Подсветка, сдвинутая клавишами, не уходит за край панели с пределом высоты.\n rtScrollActiveOptionIntoView(this.activeOptionId);\n }\n\n public override setDisabledState(disabled: boolean): void {\n super.setDisabledState(disabled);\n if (disabled) {\n this.popover().close();\n }\n }\n\n protected getEmptyValue(): TValue | null {\n return null;\n }\n\n protected focusAfterClear(): void {\n this.triggerEl()?.nativeElement.focus();\n }\n\n protected override clear(event?: Event): void {\n if (this.isDisabled()) {\n return;\n }\n super.clear(event);\n this.selectionChange.emit(null);\n }\n\n /**\n * Открытый список встаёт подсветкой на выбранный пункт.\n *\n * Иначе стрелка вниз начинала с первого пункта, и человек с выбранным «20» из «10, 20, 40»\n * получал «10» вместо «40».\n */\n protected onOpened(): void {\n const v: TValue | null = this.value();\n this.openBranches.set(rtTreeOpenFor(this.options(), v === null ? [] : [v]));\n if (v !== null) {\n const chosen: number = this.rows().findIndex((row: IRtSelect.Row<TValue>): boolean => row.option.value === v);\n if (chosen >= 0) {\n this.activeIndex.set(chosen);\n }\n }\n }\n\n protected toggleBranch(event: Event, value: TValue): void {\n event.stopPropagation();\n this.openBranches.update((open: ReadonlySet<TValue>): ReadonlySet<TValue> => rtTreeToggle(open, value));\n }\n\n protected onClosed(): void {\n // Закрытие (outside-click / Escape / выбор) = пользователь увёл фокус.\n this.filterTerm.set('');\n this.activeIndex.set(-1);\n this.markTouched();\n }\n\n protected select(opt: IRtSelect.Option<TValue>): void {\n if (opt.disabled) {\n return;\n }\n this.value.set(opt.value);\n this.emitChange(opt.value);\n this.selectionChange.emit(opt.value);\n this.popover().close();\n }\n\n protected setFilter(term: string): void {\n this.filterTerm.set(term);\n this.activeIndex.set(-1);\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) {\n return;\n }\n if (!this.isOpen()) {\n if (OPEN_KEYS.has(event.key)) {\n event.preventDefault();\n this.popover().open();\n if (this.activeIndex() < 0) {\n this.#moveActive(1);\n }\n }\n return;\n }\n this.#handleOpenKeydown(event);\n }\n\n #handleOpenKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.#moveActive(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.#moveActive(-1);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.#selectActive();\n break;\n case 'Escape':\n event.preventDefault();\n this.popover().close();\n break;\n case 'ArrowRight':\n case 'ArrowLeft':\n event.preventDefault();\n this.#sideKey(event.key);\n break;\n default:\n break;\n }\n }\n\n #sideKey(key: string): void {\n const answer: IRtSelect.SideKeyAnswer<TValue> = rtTreeSideKey(this.rows(), this.activeIndex(), key);\n const toggle: TValue | null = answer.toggle;\n if (toggle !== null) {\n this.openBranches.update((open: ReadonlySet<TValue>): ReadonlySet<TValue> => rtTreeToggle(open, toggle));\n }\n this.activeIndex.set(answer.index);\n }\n\n #moveActive(delta: number): void {\n const opts: ReadonlyArray<IRtSelect.Option<TValue>> = this.rows().map(\n (row: IRtSelect.Row<TValue>): IRtSelect.Option<TValue> => row.option\n );\n if (opts.length === 0) {\n this.activeIndex.set(-1);\n return;\n }\n let index: number = this.activeIndex();\n for (let step: number = 0; step < opts.length; step += 1) {\n index = (index + delta + opts.length) % opts.length;\n if (!opts[index].disabled) {\n this.activeIndex.set(index);\n return;\n }\n }\n }\n\n #selectActive(): void {\n const opts: ReadonlyArray<IRtSelect.Option<TValue>> = this.rows().map(\n (row: IRtSelect.Row<TValue>): IRtSelect.Option<TValue> => row.option\n );\n const index: number = this.activeIndex();\n if (index >= 0 && index < opts.length) {\n this.select(opts[index]);\n }\n }\n}\n","<ng-container rtBlock=\"rt-select\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '—' }}</span>\n }\n <button\n #triggerEl\n rtElem=\"trigger\"\n qa-dataid=\"select-trigger\"\n type=\"button\"\n [rtPopoverWidth]=\"panelWidth()\"\n [rtMod]=\"{ own: !!triggerTpl() }\"\n [rtPopover]=\"panelTpl\"\n [rtPopoverDisabled]=\"isDisabled()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n [disabled]=\"isDisabled()\"\n (keydown)=\"onTriggerKeydown($event)\"\n (rtPopoverOpened)=\"onOpened()\"\n (rtPopoverClosed)=\"onClosed()\">\n <!--\n Разметка указателя: своя, если потребитель её объявил, иначе зашитая китом. Она встаёт\n внутрь кнопки, а не вместо неё: поведение — открытие панели, приметы доступности,\n отключённость, клавиши и закрытие — остаётся на кнопке кита.\n -->\n @if (triggerTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" [ngTemplateOutletContext]=\"{ $implicit: triggerState() }\" />\n } @else {\n @if (iconLeft(); as left) {\n <rt-icon rtElem=\"icon-left\" size=\"sm\" color=\"muted\" [name]=\"left\" />\n }\n <span rtElem=\"label\" [rtMod]=\"{ placeholder: !selectedLabel() }\">\n {{ selectedLabel() || placeholder() }}\n </span>\n @if (showClearButton()) {\n <rt-icon-button\n rtElem=\"clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"t().uiClear\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n <rt-icon rtElem=\"chevron\" name=\"chevron-down\" size=\"sm\" color=\"muted\" />\n }\n </button>\n\n <ng-template #panelTpl>\n <div rtElem=\"panel\" role=\"listbox\" [style.--rt-select-panel-max-height]=\"panelMaxHeight()\" [attr.aria-label]=\"ariaLabel()\">\n @if (filter()) {\n <div rtElem=\"filter\">\n <rt-input\n iconLeft=\"ico-search\"\n [placeholder]=\"filterPlaceholderText()\"\n [ngModel]=\"filterTerm()\"\n (ngModelChange)=\"setFilter($event)\" />\n </div>\n }\n <!--\n Опции listbox'а выбираются мышью через (click); keyboard-nav —\n на trigger'е (activedescendant: ArrowUp/Down/Enter), опции не\n focusable индивидуально, поэтому a11y-правила здесь не применимы.\n -->\n <!-- eslint-disable @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <ul rtElem=\"list\">\n @for (row of rows(); track row.option.value; let i = $index) {\n <li\n rtElem=\"option\"\n qa-dataid=\"select-option\"\n role=\"option\"\n [id]=\"panelId + '-opt-' + i\"\n [attr.data-value]=\"row.option.value\"\n [attr.aria-level]=\"isTree() ? row.level + 1 : null\"\n [style.--rt-select-tree-level]=\"row.level\"\n [rtMod]=\"{\n selected: row.option.value === value(),\n active: i === activeIndex(),\n disabled: !!row.option.disabled,\n }\"\n [attr.aria-selected]=\"row.option.value === value()\"\n [attr.aria-disabled]=\"!!row.option.disabled\"\n (click)=\"select(row.option)\">\n @if (isTree()) {\n @if (row.branch) {\n <button\n rtElem=\"toggle\"\n qa-dataid=\"select-option-toggle\"\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"row.open ? t().uiCollapse : t().uiExpand\"\n [attr.aria-expanded]=\"row.open\"\n (click)=\"toggleBranch($event, row.option.value)\">\n <rt-icon size=\"sm\" color=\"muted\" [name]=\"row.open ? 'chevron-down' : 'chevron-right'\" />\n </button>\n } @else {\n <span rtElem=\"toggle-space\"></span>\n }\n }\n <span rtElem=\"option-label\">{{ row.option.label }}</span>\n @if (row.option.value === value()) {\n <rt-icon rtElem=\"check\" name=\"check\" size=\"sm\" aria-hidden=\"true\" />\n }\n </li>\n } @empty {\n <li rtElem=\"empty\">{{ t().uiNoOptions }}</li>\n }\n </ul>\n </div>\n </ng-template>\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}