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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) 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 +98 -0
  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 +2 -2
  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 +1 -1
  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.0.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 +36 -0
  104. package/src/lib/components/ai-run-status/rt-ai-run-status.component.scss +119 -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/dynamic-selector/CONTEXT.md +18 -0
  111. package/src/lib/components/dynamic-selector/list/rt-dynamic-selector-list.component.scss +29 -1
  112. package/src/lib/components/dynamic-selector/popup/rt-dynamic-selector-popup.component.scss +84 -25
  113. package/src/lib/components/empty-state/CONTEXT.md +2 -1
  114. package/src/lib/components/empty-state/rt-empty-state.component.scss +4 -2
  115. package/src/lib/components/icon/CONTEXT.md +16 -12
  116. package/src/lib/components/icon/rt-icon.component.scss +13 -3
  117. package/src/lib/components/prompt-suggestion/CONTEXT.md +29 -0
  118. package/src/lib/components/prompt-suggestion/rt-prompt-suggestion.component.scss +58 -0
  119. package/src/lib/components/thread-list/CONTEXT.md +4 -0
  120. package/src/lib/components/thread-list/rt-thread-list.component.scss +29 -0
  121. package/src/lib/components/toolbar/CONTEXT.md +4 -0
  122. package/src/lib/components/toolbar/rt-toolbar.component.scss +7 -0
  123. package/src/rich-editor/lib/components/ai-chat/CONTEXT.md +58 -0
  124. package/src/rich-editor/lib/components/ai-chat/answer/rt-ai-chat-answer.component.scss +12 -0
  125. package/src/rich-editor/lib/components/ai-chat/rt-ai-chat.component.scss +222 -0
  126. package/src/rich-editor/lib/components/rich-editor/rt-rich-editor.component.scss +3 -0
  127. package/src/styles/_scrollbar.scss +9 -0
  128. package/styles/tokens.css +3 -0
  129. package/types/rt-tools-ui-kit-v2-action-bar.d.ts +11 -2
  130. package/types/rt-tools-ui-kit-v2-ai-run-status.d.ts +49 -0
  131. package/types/rt-tools-ui-kit-v2-aside.d.ts +9 -1
  132. package/types/rt-tools-ui-kit-v2-copy-value.d.ts +29 -0
  133. package/types/rt-tools-ui-kit-v2-core.d.ts +93 -53
  134. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +44 -5
  135. package/types/rt-tools-ui-kit-v2-icon.d.ts +12 -4
  136. package/types/rt-tools-ui-kit-v2-prompt-suggestion.d.ts +21 -0
  137. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +186 -2
  138. package/types/rt-tools-ui-kit-v2-thread-list.d.ts +15 -2
  139. package/types/rt-tools-ui-kit-v2.d.ts +3 -0
  140. package/rt-tools-ui-kit-v2-0.18.0.tgz +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"rt-tools-ui-kit-v2-notifications-bell.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/notifications-bell/rt-notifications-bell.component.ts","../../../projects/ui-kit-v2/src/lib/components/notifications-bell/rt-notifications-bell.component.html","../../../projects/ui-kit-v2/src/lib/components/notifications-bell/rt-tools-ui-kit-v2-notifications-bell.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\n\nconst BEM_BLOCK: string = 'rt-notifications-bell';\n\n/**\n * Колокольчик в шапке: открывает ленту событий и показывает точкой, что\n * непрочитанное есть.\n *\n * Маркер — точка, а не число: точное число получатель видит в самой ленте, а\n * двузначное в шапке спорило бы с подписями разделов.\n */\n@Component({\n selector: 'rt-notifications-bell',\n templateUrl: './rt-notifications-bell.component.html',\n styleUrl: './rt-notifications-bell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // rt-tools\n BlockDirective,\n ElemDirective,\n\n // components\n RtIconComponent,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtNotificationsBellComponent {\n public readonly unread: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n public readonly ariaLabel: InputSignal<string> = input<string>('');\n\n /** Подпись маркера для скринридера: точка сама по себе ничего не говорит */\n public readonly unreadLabel: InputSignal<string> = input<string>('');\n\n public readonly clicked: OutputEmitterRef<void> = output<void>();\n\n protected onClick(): void {\n this.clicked.emit();\n }\n}\n","<button rtBlock=\"rt-notifications-bell\" type=\"button\" qa-dataid=\"header-bell\" [attr.aria-label]=\"ariaLabel()\" (click)=\"onClick()\">\n <rt-icon rtElem=\"icon\" name=\"bell\" size=\"sm\" />\n\n @if (unread()) {\n <span rtElem=\"marker\" role=\"img\" qa-dataid=\"header-bell-marker\" [attr.aria-label]=\"unreadLabel()\"></span>\n }\n</button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAiBA,MAAM,SAAS,GAAW,uBAAuB;AAEjD;;;;;;AAMG;MAoBU,4BAA4B,CAAA;AAnBzC,IAAA,WAAA,GAAA;QAoBoB,IAAA,CAAA,MAAM,GAAwD,KAAK,CAA4B,KAAK,8EAChH,SAAS,EAAE,gBAAgB,EAAA,CAC7B;QAEc,IAAA,CAAA,SAAS,GAAwB,KAAK,CAAS,EAAE;sFAAC;;QAGlD,IAAA,CAAA,WAAW,GAAwB,KAAK,CAAS,EAAE;wFAAC;QAEpD,IAAA,CAAA,OAAO,GAA2B,MAAM,EAAQ;AAKnE,IAAA;IAHa,OAAO,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACvB;8GAdS,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,+oBC7CzC,gXAOA,EAAA,MAAA,EAAA,CAAA,uoEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA;;AD2BQ,gBAAA,cAAc,yEACd,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA;;gBAGb,eAAe,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAOV,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAnBxC,SAAS;+BACI,uBAAuB,EAAA,eAAA,EAGhB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;;wBAEL,cAAc;wBACd,aAAa;;wBAGb,eAAe;AAClB,qBAAA,EAAA,cAAA,EACe,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAA,IAAA,EAChE;AACF,wBAAA,KAAK,EAAE,SAAS;AACnB,qBAAA,EAAA,QAAA,EAAA,gXAAA,EAAA,MAAA,EAAA,CAAA,uoEAAA,CAAA,EAAA;;;AE3CL;;AAEG;;;;"}
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-notifications-bell.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/notifications-bell/rt-notifications-bell.component.ts","../../../projects/ui-kit-v2/src/lib/components/notifications-bell/rt-notifications-bell.component.html","../../../projects/ui-kit-v2/src/lib/components/notifications-bell/rt-tools-ui-kit-v2-notifications-bell.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\n\nconst BEM_BLOCK: string = 'rt-notifications-bell';\n\n/**\n * Колокольчик в шапке: открывает ленту событий и показывает точкой, что\n * непрочитанное есть.\n *\n * Маркер — точка, а не число: точное число получатель видит в самой ленте, а\n * двузначное в шапке спорило бы с подписями разделов.\n */\n@Component({\n selector: 'rt-notifications-bell',\n templateUrl: './rt-notifications-bell.component.html',\n styleUrl: './rt-notifications-bell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // rt-tools\n BlockDirective,\n ElemDirective,\n\n // components\n RtIconComponent,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtNotificationsBellComponent {\n public readonly unread: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n public readonly ariaLabel: InputSignal<string> = input<string>('');\n\n /** Подпись маркера для скринридера: точка сама по себе ничего не говорит */\n public readonly unreadLabel: InputSignal<string> = input<string>('');\n\n public readonly clicked: OutputEmitterRef<void> = output<void>();\n\n protected onClick(): void {\n this.clicked.emit();\n }\n}\n","<button rtBlock=\"rt-notifications-bell\" type=\"button\" qa-dataid=\"header-bell\" [attr.aria-label]=\"ariaLabel()\" (click)=\"onClick()\">\n <rt-icon rtElem=\"icon\" name=\"bell\" size=\"sm\" />\n\n @if (unread()) {\n <span rtElem=\"marker\" role=\"img\" qa-dataid=\"header-bell-marker\" [attr.aria-label]=\"unreadLabel()\"></span>\n }\n</button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAiBA,MAAM,SAAS,GAAW,uBAAuB;AAEjD;;;;;;AAMG;MAoBU,4BAA4B,CAAA;AAnBzC,IAAA,WAAA,GAAA;QAoBoB,IAAA,CAAA,MAAM,GAAwD,KAAK,CAA4B,KAAK,8EAChH,SAAS,EAAE,gBAAgB,EAAA,CAC7B;QAEc,IAAA,CAAA,SAAS,GAAwB,KAAK,CAAS,EAAE;sFAAC;;QAGlD,IAAA,CAAA,WAAW,GAAwB,KAAK,CAAS,EAAE;wFAAC;QAEpD,IAAA,CAAA,OAAO,GAA2B,MAAM,EAAQ;AAKnE,IAAA;IAHa,OAAO,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACvB;8GAdS,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,+oBC7CzC,gXAOA,EAAA,MAAA,EAAA,CAAA,uoEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA;;AD2BQ,gBAAA,cAAc,yEACd,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA;;gBAGb,eAAe,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAOV,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAnBxC,SAAS;+BACI,uBAAuB,EAAA,eAAA,EAGhB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;;wBAEL,cAAc;wBACd,aAAa;;wBAGb,eAAe;AAClB,qBAAA,EAAA,cAAA,EACe,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAA,IAAA,EAChE;AACF,wBAAA,KAAK,EAAE,SAAS;AACnB,qBAAA,EAAA,QAAA,EAAA,gXAAA,EAAA,MAAA,EAAA,CAAA,uoEAAA,CAAA,EAAA;;;AE3CL;;AAEG;;;;"}
@@ -304,7 +304,7 @@ class RtPageHeaderComponent {
304
304
  // Angular
305
305
  RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type:
306
306
  // standalone components / directives
307
- RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "size", "color", "fill", "spin", "rotate"] }, { 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: RtTooltipDirective, selector: "[rtTooltip]", inputs: ["rtTooltip", "rtTooltipPlacement", "rtTooltipWhenTruncated"], exportAs: ["rtTooltip"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }, { kind: "pipe", type: RtKitLabelPipe, name: "rtKitLabel" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
307
+ RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "glyphStrategy", "size", "color", "fill", "spin", "rotate"] }, { 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: RtTooltipDirective, selector: "[rtTooltip]", inputs: ["rtTooltip", "rtTooltipPlacement", "rtTooltipWhenTruncated"], exportAs: ["rtTooltip"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }, { kind: "pipe", type: RtKitLabelPipe, name: "rtKitLabel" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
308
308
  }
309
309
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtPageHeaderComponent, decorators: [{
310
310
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"rt-tools-ui-kit-v2-page-header.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/page-header/rt-page-header.logic.ts","../../../projects/ui-kit-v2/src/lib/components/page-header/rt-page-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/page-header/rt-page-header.component.html","../../../projects/ui-kit-v2/src/lib/components/page-header/rt-tools-ui-kit-v2-page-header.ts"],"sourcesContent":["import { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { IRtPageHeader } from './rt-page-header.model';\n\n/** Чем пункт отрисуется: панелью, ссылкой или кнопкой. */\nexport enum ERtPageHeaderEntry {\n Panel = 'panel',\n Link = 'link',\n Button = 'button',\n}\n\nexport namespace IRtPageHeaderView {\n /** Пункт, готовый к отрисовке: форма решена заранее, шаблон её не выводит. */\n export interface Entry {\n readonly id: string;\n readonly label: string;\n readonly icon: IRtIcon.Name | null;\n readonly route: string;\n readonly routerLinkActiveExact: boolean;\n readonly disabled: boolean;\n readonly unread: boolean;\n readonly kind: ERtPageHeaderEntry;\n }\n\n export interface Group {\n readonly id: string;\n readonly label: string;\n readonly icon: IRtIcon.Name | null;\n readonly items: ReadonlyArray<Entry>;\n }\n\n export interface Column {\n readonly id: string;\n readonly groups: ReadonlyArray<Group>;\n }\n\n export interface Section extends Entry {\n readonly columns: ReadonlyArray<Column>;\n readonly columnCount: number;\n /** Все пункты панели одним списком: подсветка раздела и сведение маркера. */\n readonly panelItems: ReadonlyArray<Entry>;\n /** Группы всех колонок подряд: на узком экране колонок нет, а группы есть. */\n readonly panelGroups: ReadonlyArray<Group>;\n }\n}\n\n/** Пункты панели одним списком — колонки и группы для этого раскрываются. */\nexport function panelItemsOf(item: IRtPageHeader.Item): ReadonlyArray<IRtPageHeader.Item> {\n return (item.columns ?? []).flatMap((column: IRtPageHeader.Column): ReadonlyArray<IRtPageHeader.Item> =>\n column.groups.flatMap((group: IRtPageHeader.Group): ReadonlyArray<IRtPageHeader.Item> => group.items)\n );\n}\n\n/**\n * Маркер раздела. Пункты панели свёрнуты, и непросмотренное внутри видно только\n * по точке у самого раздела.\n */\nexport function unreadOf(item: IRtPageHeader.Item): boolean {\n return item.unread === true || panelItemsOf(item).some((entry: IRtPageHeader.Item): boolean => entry.unread === true);\n}\n\nexport function entryKindOf(item: IRtPageHeader.Item): ERtPageHeaderEntry {\n if (panelItemsOf(item).length > 0) {\n return ERtPageHeaderEntry.Panel;\n }\n if ((item.route ?? '') !== '' && !item.disabled) {\n return ERtPageHeaderEntry.Link;\n }\n\n return ERtPageHeaderEntry.Button;\n}\n\nexport function toEntry(item: IRtPageHeader.Item): IRtPageHeaderView.Entry {\n return {\n id: item.id,\n label: item.label,\n icon: item.icon ?? null,\n route: item.route ?? '',\n routerLinkActiveExact: item.routerLinkActiveExact === true,\n disabled: item.disabled === true,\n unread: item.unread === true,\n kind: entryKindOf(item),\n };\n}\n\nfunction toGroup(group: IRtPageHeader.Group): IRtPageHeaderView.Group {\n return {\n id: group.id,\n label: group.label ?? '',\n icon: group.icon ?? null,\n items: group.items.map(toEntry),\n };\n}\n\nfunction toColumn(column: IRtPageHeader.Column): IRtPageHeaderView.Column {\n return {\n id: column.id,\n groups: column.groups.map(toGroup),\n };\n}\n\n/** Группы всех колонок одним списком — узкий экран раскладывает панель без колонок. */\nexport function panelGroupsOf(columns: ReadonlyArray<IRtPageHeaderView.Column>): ReadonlyArray<IRtPageHeaderView.Group> {\n return columns.flatMap((column: IRtPageHeaderView.Column): ReadonlyArray<IRtPageHeaderView.Group> => column.groups);\n}\n\n/** Разделы верхнего ряда вместе с раскладкой их панелей. */\nexport function toSections(items: ReadonlyArray<IRtPageHeader.Item>): ReadonlyArray<IRtPageHeaderView.Section> {\n return items.map((item: IRtPageHeader.Item): IRtPageHeaderView.Section => {\n const columns: ReadonlyArray<IRtPageHeaderView.Column> = (item.columns ?? []).map(toColumn);\n\n return {\n ...toEntry(item),\n unread: unreadOf(item),\n columns,\n columnCount: columns.length,\n panelItems: panelItemsOf(item).map(toEntry),\n panelGroups: panelGroupsOf(columns),\n };\n });\n}\n\n/** Адрес без строки запроса и якоря — подсветка считается по пути. */\nexport function pathOf(url: string): string {\n return url.split(/[?#]/)[0] ?? '';\n}\n\nexport function isEntryActive(entry: IRtPageHeaderView.Entry, path: string): boolean {\n if (entry.kind !== ERtPageHeaderEntry.Link) {\n return false;\n }\n\n return entry.routerLinkActiveExact ? path === entry.route : path.startsWith(entry.route);\n}\n\n/**\n * Разделы, у которых активен хоть один пункт панели. Обход идёт по раскрытому\n * списку пунктов: своего адреса у раздела с панелью нет, и подсветить его больше\n * нечем.\n */\n/**\n * Разделы для кругов сжатой полосы: первые `count` из тех, у кого есть иконка. Раздел без\n * иконки в круг не попадает — показать в нём нечего, и он остаётся под кнопкой «ещё».\n */\nexport function compactSectionsOf(\n sections: ReadonlyArray<IRtPageHeaderView.Section>,\n count: number\n): ReadonlyArray<IRtPageHeaderView.Section> {\n return sections.filter((section: IRtPageHeaderView.Section): boolean => section.icon !== null).slice(0, Math.max(0, count));\n}\n\n/**\n * Прилипла ли шапка: липкий узел стоит на пиксель выше края прокрутки и, прилипнув, теряет этот\n * пиксель из видимой области — наблюдатель пересечения отдаёт долю меньше единицы. Узел, ушедший\n * из области целиком, прилипшим не считается: его не видно вовсе.\n */\nexport function isStuck(intersectionRatio: number, isIntersecting: boolean): boolean {\n return isIntersecting && intersectionRatio < 1;\n}\n\nexport function activeSectionIds(sections: ReadonlyArray<IRtPageHeaderView.Section>, url: string): ReadonlySet<string> {\n const path: string = pathOf(url);\n const ids: Set<string> = new Set<string>();\n for (const section of sections) {\n if (section.panelItems.some((entry: IRtPageHeaderView.Entry): boolean => isEntryActive(entry, path))) {\n ids.add(section.id);\n }\n }\n\n return ids;\n}\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n afterNextRender,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n TemplateRef,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Event as RouterEvent, NavigationEnd, Router, RouterLink, RouterLinkActive } from '@angular/router';\n\nimport { filter, map } from 'rxjs';\n\nimport { BlockDirective, ElemDirective, ModDirective, WINDOW } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, RT_KIT_TRANSLATOR, RtKitLabelPipe, TRtKitLabelMap, TRtKitTranslator, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { BreakpointsService } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { activeSectionIds, compactSectionsOf, ERtPageHeaderEntry, IRtPageHeaderView, isStuck, toSections } from './rt-page-header.logic';\nimport { IRtPageHeader } from './rt-page-header.model';\n\nconst BEM_BLOCK: string = 'rt-page-header';\n\n/**\n * Верхняя горизонтальная плашка-навигация для первого уровня доменных страниц.\n *\n * Контракт:\n * - `items` — `Item[]`. Анкор для пунктов с `route`; `<button>` для недоступных\n * и для тех, кто обрабатывается снаружи (`itemClick`). Пункт с `columns` —\n * кнопка-триггер: панель второго уровня открывается наведением ([rtPopover]).\n * - `user` — необязательный блок справа. Если задан `userMenu` (TemplateRef) —\n * блок становится hover-триггером попапа с этим контентом (клик — touch-fallback,\n * панель прижата к правому краю); иначе по клику emit'ит `userClick`.\n *\n * Active state — через `RouterLinkActive` с классом `rt-page-header__link--is-active`;\n * для раздела с панелью — вычисляется по текущему URL (своего route у него нет).\n */\n@Component({\n selector: 'rt-page-header',\n templateUrl: './rt-page-header.component.html',\n // Панель второго уровня и панель узкого экрана рисуются в CDK Overlay, вне\n // хоста, поэтому это отдельные корневые блоки — и отдельные файлы: бюджет\n // стилей компонента считается на каждый файл, и одним они его перебирают.\n styleUrls: [\n './rt-page-header.component.scss',\n './rt-page-header-submenu.scss',\n './rt-page-header-mobile.scss',\n './rt-page-header-compact.scss',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n RtKitLabelPipe,\n // Angular\n RouterLink,\n RouterLinkActive,\n\n // standalone components / directives\n RtIconComponent,\n RtPopoverDirective,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-page-header--sticky]': 'stickyCompact()',\n '[class.rt-page-header--is-compact]': 'compact()',\n },\n})\nexport class RtPageHeaderComponent {\n readonly #router: Router = inject(Router);\n\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n readonly #host: ElementRef<HTMLElement> = inject<ElementRef<HTMLElement>>(ElementRef);\n\n // Конструктор наблюдателя пересечения объявлен на globalThis, а не на интерфейсе Window —\n // токен отдаёт тот же объект, тип лишь уточняется.\n readonly #window: Window & typeof globalThis = inject(WINDOW) as Window & typeof globalThis;\n\n /**\n * Прилипла ли шапка к краю прокрутки. Считается наблюдателем пересечения, а не смещением\n * окна: страница у потребителя прокручивается и внутри контейнера, и окно об этом не знает.\n */\n readonly #stuck: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #t_uiMainNav: Signal<string> = rtKitLabel('uiMainNav');\n\n /* Реактивный URL для подсветки раздела: у раздела с панелью нет своего\n route, поэтому RouterLinkActive не применим — сравниваем по факту навигации. */\n readonly #currentUrl: Signal<string> = toSignal(\n this.#router.events.pipe(\n filter((e: RouterEvent): e is NavigationEnd => e instanceof NavigationEnd),\n map((): string => this.#router.url)\n ),\n { initialValue: this.#router.url }\n );\n\n readonly #breakpoints: BreakpointsService = inject(BreakpointsService);\n\n readonly #translate: Signal<TRtKitTranslator> = inject(RT_KIT_TRANSLATOR);\n\n /** Переводчик для чистого пайпа подписи: шаблон отдаёт его вторым доводом. */\n protected readonly translate: Signal<TRtKitTranslator> = this.#translate;\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly mobileNavPopoverRef: Signal<RtPopoverDirective | undefined> = viewChild('mobileNavPopover', {\n read: RtPopoverDirective,\n });\n\n /** Кнопка «ещё» сжатой полосы открывает ту же панель, что и бургер, своим поповером. */\n protected readonly compactNavPopoverRef: Signal<RtPopoverDirective | undefined> = viewChild('compactNavPopover', {\n read: RtPopoverDirective,\n });\n\n /** Сжатое состояние: шапка липкая и прилипла к верху. */\n protected readonly compact: Signal<boolean> = computed((): boolean => this.stickyCompact() && this.#stuck());\n\n /** Разделы в кругах сжатой полосы: первые с иконкой, число — по входу. */\n protected readonly compactSections: Signal<ReadonlyArray<IRtPageHeaderView.Section>> = computed(\n (): ReadonlyArray<IRtPageHeaderView.Section> => compactSectionsOf(this.sections(), this.compactVisibleCount())\n );\n\n /** Форма пункта решается один раз здесь, а не ветвлениями в шаблоне. */\n protected readonly sections: Signal<ReadonlyArray<IRtPageHeaderView.Section>> = computed((): ReadonlyArray<IRtPageHeaderView.Section> =>\n toSections(this.items())\n );\n\n /**\n * id разделов с активным вложенным адресом — для O(1) lookup в шаблоне.\n * Зависит от #currentUrl + items (сигналы) → подсветка реактивна на навигацию.\n */\n protected readonly activeSectionIds: Signal<ReadonlySet<string>> = computed((): ReadonlySet<string> =>\n activeSectionIds(this.sections(), this.#currentUrl())\n );\n\n protected readonly userAvatar: Signal<string> = computed((): string => {\n const u: IRtPageHeader.User | null = this.user();\n if (!u) {\n return '';\n }\n if (u.avatar && u.avatar.length > 0) {\n return u.avatar.charAt(0).toUpperCase();\n }\n return u.name.charAt(0).toUpperCase();\n });\n\n /** Узкий вьюпорт (≤1080px): инлайн-навигация прячется, показывается гамбургер. */\n protected readonly isNarrow: Signal<boolean> = this.#breakpoints.narrow;\n\n /**\n * id раскрытых разделов-аккордеонов в мобильной панели. Ключ — только раздел:\n * группы внутри раскрытого раздела показаны сразу, и совпасть идентификаторам\n * раздела и группы в этом множестве негде.\n */\n protected readonly expandedSectionIds: WritableSignal<ReadonlySet<string>> = signal<ReadonlySet<string>>(new Set<string>());\n\n protected readonly EntryKind: typeof ERtPageHeaderEntry = ERtPageHeaderEntry;\n\n public readonly items: InputSignal<ReadonlyArray<IRtPageHeader.Item>> = input<ReadonlyArray<IRtPageHeader.Item>>([]);\n\n public readonly user: InputSignal<IRtPageHeader.User | null> = input<IRtPageHeader.User | null>(null);\n\n public readonly userTitle: InputSignal<string> = input<string>('');\n\n public readonly userMenu: InputSignal<TemplateRef<unknown> | null> = input<TemplateRef<unknown> | null>(null);\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly ariaLabel: InputSignal<string> = input<string>('');\n\n /**\n * Шапка липнет к верху окна и, прилипнув, сжимается в полосу: круги первых разделов,\n * кнопка «ещё» и три слота потребителя. Выключено — поведение прежнее.\n */\n public readonly stickyCompact: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Сколько разделов с иконкой показывать кругами в сжатой полосе; остальные — под «ещё». */\n public readonly compactVisibleCount: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(2, {\n transform: numberAttribute,\n });\n\n /** Своё имя навигации важнее умолчания */\n public readonly navAriaLabel: Signal<string> = computed((): string => this.ariaLabel() || this.#t_uiMainNav());\n\n public readonly itemClick: OutputEmitterRef<string> = output<string>();\n\n public readonly userClick: OutputEmitterRef<void> = output<void>();\n\n constructor() {\n // Ресайз обратно в десктоп — гамбургер скрывается CSS'ом; открытую\n // мобильную панель закрываем, иначе overlay зависнет без якоря.\n effect((): void => {\n if (!this.isNarrow()) {\n this.mobileNavPopoverRef()?.close();\n }\n });\n\n afterNextRender((): void => this.#observeStuck());\n }\n\n /**\n * Липкая шапка стоит на пиксель выше края прокрутки и, прилипнув, теряет его из видимой\n * области: наблюдатель пересечения с порогом в единицу ловит ровно этот момент — и в окне,\n * и внутри прокручиваемого контейнера, о котором окно не знает.\n */\n #observeStuck(): void {\n const observer: IntersectionObserver = new this.#window.IntersectionObserver(\n (entries: IntersectionObserverEntry[]): void => {\n const entry: IntersectionObserverEntry | undefined = entries.at(-1);\n if (entry !== undefined) {\n this.#stuck.set(isStuck(entry.intersectionRatio, entry.isIntersecting));\n }\n },\n { threshold: [0, 1] }\n );\n observer.observe(this.#host.nativeElement);\n this.#destroyRef.onDestroy((): void => observer.disconnect());\n }\n\n /** Панель разделов открывают и бургер, и кнопка «ещё»: закрываются обе. */\n protected closeNavPanels(): void {\n this.mobileNavPopoverRef()?.close();\n this.compactNavPopoverRef()?.close();\n }\n\n /** Круг раздела без адреса: раздел с панелью открывает общую панель, прочий — сообщает наружу. */\n protected onCompactSectionClick(section: IRtPageHeaderView.Section): void {\n if (section.kind === ERtPageHeaderEntry.Panel) {\n this.compactNavPopoverRef()?.open();\n return;\n }\n this.itemClick.emit(section.id);\n }\n\n protected onItemClick(id: string): void {\n this.itemClick.emit(id);\n }\n\n protected onUserClick(): void {\n this.userClick.emit();\n }\n\n /** Аккордеон мобильной панели: тумблер раскрытия раздела по его id. */\n protected toggleSection(id: string): void {\n this.expandedSectionIds.update((prev: ReadonlySet<string>): ReadonlySet<string> => {\n const next: Set<string> = new Set<string>(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }\n\n /** Клик по плоскому пункту мобильной панели: emit + закрыть панель. */\n protected onMobileItemClick(id: string): void {\n this.itemClick.emit(id);\n this.closeNavPanels();\n }\n}\n","<ng-container rtBlock=\"rt-page-header\">\n <nav rtElem=\"nav\" [attr.aria-label]=\"navAriaLabel()\">\n <ul rtElem=\"list\" role=\"list\">\n @for (section of sections(); track section.id) {\n <li rtElem=\"item\" qa-dataid=\"header-nav-item\" [attr.data-id]=\"section.id\">\n @switch (section.kind) {\n @case (EntryKind.Panel) {\n <button\n rtElem=\"link\"\n type=\"button\"\n qa-dataid=\"header-nav-trigger\"\n #groupPopover=\"rtPopover\"\n rtPopoverTrigger=\"hover\"\n rtPopoverFitViewport\n rtPopoverOffsetY=\"14\"\n [rtMod]=\"{\n isActive: activeSectionIds().has(section.id),\n isOpen: groupPopover.isOpen(),\n }\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"groupPopover.isOpen()\"\n [rtPopover]=\"submenuTpl\"\n (click)=\"groupPopover.open()\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n <span rtElem=\"caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n <ng-template #submenuTpl>\n <div rtBlock=\"rt-page-header-submenu\" role=\"menu\" [style.--rt-nav-panel-columns]=\"section.columnCount\">\n @for (column of section.columns; track column.id) {\n <div rtElem=\"column\" qa-dataid=\"header-nav-column\" [attr.data-id]=\"column.id\">\n @for (group of column.groups; track group.id) {\n <div rtElem=\"group\" role=\"group\" [attr.aria-label]=\"group.label || null\">\n @if (group.label) {\n <div rtElem=\"group-title\" qa-dataid=\"header-nav-group\" [attr.data-id]=\"group.id\">\n @if (group.icon) {\n <rt-icon rtElem=\"group-icon\" size=\"xs\" [name]=\"group.icon\" />\n }\n <span rtElem=\"group-label\">{{ group.label }}</span>\n </div>\n }\n @for (entry of group.items; track entry.id) {\n @if (entry.kind === EntryKind.Link) {\n <a\n rtElem=\"link\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-subitem\"\n routerLinkActive=\"rt-page-header-submenu__link--is-active\"\n [attr.data-id]=\"entry.id\"\n [routerLink]=\"entry.route\"\n [routerLinkActiveOptions]=\"{ exact: entry.routerLinkActiveExact }\"\n (click)=\"groupPopover.close()\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n } @else if (entry.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"\n 'uiSectionInProgress' | rtKitLabel: translate() : { label: entry.label }\n \">\n <button\n rtElem=\"link\"\n role=\"menuitem\"\n type=\"button\"\n qa-dataid=\"header-nav-subitem\"\n [rtMod]=\"{ disabled: true }\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-disabled]=\"true\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n </button>\n </span>\n } @else {\n <button\n rtElem=\"link\"\n role=\"menuitem\"\n type=\"button\"\n qa-dataid=\"header-nav-subitem\"\n [attr.data-id]=\"entry.id\"\n (click)=\"onItemClick(entry.id)\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n }\n @case (EntryKind.Link) {\n <a\n rtElem=\"link\"\n routerLinkActive=\"rt-page-header__link--is-active\"\n [routerLink]=\"section.route\"\n [routerLinkActiveOptions]=\"{ exact: section.routerLinkActiveExact }\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n }\n @default {\n @if (section.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"'uiSectionInProgress' | rtKitLabel: translate() : { label: section.label }\">\n <button rtElem=\"link\" type=\"button\" [rtMod]=\"{ disabled: true }\" [attr.aria-disabled]=\"true\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n </button>\n </span>\n } @else {\n <button rtElem=\"link\" type=\"button\" (click)=\"onItemClick(section.id)\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n }\n </li>\n }\n </ul>\n </nav>\n\n <button\n rtElem=\"burger\"\n type=\"button\"\n qa-dataid=\"header-nav-burger\"\n #mobileNavPopover=\"rtPopover\"\n rtPopoverFitViewport\n rtPopoverOffsetY=\"14\"\n [attr.aria-label]=\"t().uiNavMenu\"\n [rtMod]=\"{ isOpen: mobileNavPopover.isOpen() }\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"mobileNavPopover.isOpen()\"\n [rtPopover]=\"mobileNavTpl\">\n <rt-icon rtElem=\"burger-icon\" name=\"bars\" size=\"md\" />\n </button>\n\n <!--\n Сжатая полоса стоит в разметке всегда, как и узкая: показывает её модификатор хоста.\n Слева стопка кругов — «ещё» поверх остальных, — дальше три слота потребителя.\n -->\n <div rtElem=\"compact\" qa-dataid=\"header-compact\">\n <div rtElem=\"compact-stack\">\n <button\n rtElem=\"compact-circle\"\n type=\"button\"\n qa-dataid=\"header-compact-more\"\n #compactNavPopover=\"rtPopover\"\n rtPopoverFitViewport\n rtPopoverOffsetY=\"10\"\n [rtMod]=\"{ more: true, isOpen: compactNavPopover.isOpen() }\"\n [attr.aria-label]=\"t().uiNavMenu\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"compactNavPopover.isOpen()\"\n [rtPopover]=\"mobileNavTpl\">\n <rt-icon name=\"ellipsis-h\" size=\"sm\" />\n </button>\n @for (section of compactSections(); track section.id; let index = $index) {\n @if (section.kind === EntryKind.Link) {\n <a\n rtElem=\"compact-circle\"\n qa-dataid=\"header-compact-section\"\n routerLinkActive=\"rt-page-header__compact-circle--is-active\"\n [style.--rt-nav-compact-index]=\"index + 1\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"section.label\"\n [routerLink]=\"section.route\"\n [routerLinkActiveOptions]=\"{ exact: section.routerLinkActiveExact }\"\n [rtTooltip]=\"section.label\">\n @if (section.icon; as icon) {\n <rt-icon size=\"sm\" [name]=\"icon\" />\n }\n @if (section.unread) {\n <span rtElem=\"compact-marker\" role=\"img\" [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n } @else {\n <button\n rtElem=\"compact-circle\"\n type=\"button\"\n qa-dataid=\"header-compact-section\"\n [rtMod]=\"{ isActive: activeSectionIds().has(section.id), disabled: section.disabled }\"\n [style.--rt-nav-compact-index]=\"index + 1\"\n [disabled]=\"section.disabled\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"section.label\"\n [rtTooltip]=\"section.label\"\n (click)=\"onCompactSectionClick(section)\">\n @if (section.icon; as icon) {\n <rt-icon size=\"sm\" [name]=\"icon\" />\n }\n @if (section.unread) {\n <span rtElem=\"compact-marker\" role=\"img\" [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n </div>\n <div rtElem=\"compact-slot\" [rtMod]=\"{ left: true }\"><ng-content select=\"[rtCompactLeft]\" /></div>\n <div rtElem=\"compact-slot\" [rtMod]=\"{ center: true }\"><ng-content select=\"[rtCompactCenter]\" /></div>\n <div rtElem=\"compact-slot\" [rtMod]=\"{ right: true }\"><ng-content select=\"[rtCompactRight]\" /></div>\n </div>\n\n <ng-template #mobileNavTpl>\n <div rtBlock=\"rt-page-header-mobile\" role=\"menu\">\n @for (section of sections(); track section.id) {\n @switch (section.kind) {\n @case (EntryKind.Panel) {\n <button\n rtElem=\"section\"\n type=\"button\"\n qa-dataid=\"header-nav-mobile-trigger\"\n [rtMod]=\"{\n isExpanded: expandedSectionIds().has(section.id),\n isActive: activeSectionIds().has(section.id),\n }\"\n [attr.data-id]=\"section.id\"\n [attr.aria-expanded]=\"expandedSectionIds().has(section.id)\"\n (click)=\"toggleSection(section.id)\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n <span rtElem=\"caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n @if (expandedSectionIds().has(section.id)) {\n <div rtElem=\"children\">\n @for (group of section.panelGroups; track group.id) {\n <div rtElem=\"group\" role=\"group\" [attr.aria-label]=\"group.label || null\">\n @if (group.label) {\n <div rtElem=\"group-title\" qa-dataid=\"header-nav-mobile-group\" [attr.data-id]=\"group.id\">\n @if (group.icon) {\n <rt-icon rtElem=\"group-icon\" size=\"xs\" [name]=\"group.icon\" />\n }\n <span rtElem=\"group-label\">{{ group.label }}</span>\n </div>\n }\n @for (entry of group.items; track entry.id) {\n @if (entry.kind === EntryKind.Link) {\n <a\n rtElem=\"link\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n routerLinkActive=\"rt-page-header-mobile__link--is-active\"\n [rtMod]=\"{ child: true }\"\n [attr.data-id]=\"entry.id\"\n [routerLink]=\"entry.route\"\n [routerLinkActiveOptions]=\"{ exact: entry.routerLinkActiveExact }\"\n (click)=\"closeNavPanels()\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n } @else if (entry.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"'uiSectionInProgress' | rtKitLabel: translate() : { label: entry.label }\">\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [rtMod]=\"{ child: true, disabled: true }\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-disabled]=\"true\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n </button>\n </span>\n } @else {\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [rtMod]=\"{ child: true }\"\n [attr.data-id]=\"entry.id\"\n (click)=\"onMobileItemClick(entry.id)\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n </div>\n }\n </div>\n }\n }\n @case (EntryKind.Link) {\n <a\n rtElem=\"link\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n routerLinkActive=\"rt-page-header-mobile__link--is-active\"\n [attr.data-id]=\"section.id\"\n [routerLink]=\"section.route\"\n [routerLinkActiveOptions]=\"{ exact: section.routerLinkActiveExact }\"\n (click)=\"closeNavPanels()\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n }\n @default {\n @if (section.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"'uiSectionInProgress' | rtKitLabel: translate() : { label: section.label }\">\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [rtMod]=\"{ disabled: true }\"\n [attr.data-id]=\"section.id\"\n [attr.aria-disabled]=\"true\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n </button>\n </span>\n } @else {\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [attr.data-id]=\"section.id\"\n (click)=\"onMobileItemClick(section.id)\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n }\n }\n </div>\n </ng-template>\n\n <ng-content select=\"[rtHeaderBell]\" />\n\n @if (user(); as u) {\n @if (userMenu(); as menuTpl) {\n <!--\n Меню профиля открывается наведением, как и разделы: весь верхний\n ряд ведёт себя одинаково. Нажатие остаётся запасным путём для\n касания, а переход курсора на список языков панель переживает —\n вложенный оверлей за уход наружу не считается.\n -->\n <button\n rtElem=\"user\"\n type=\"button\"\n qa-dataid=\"header-user-menu\"\n #userPopover=\"rtPopover\"\n rtPopoverTrigger=\"hover\"\n rtPopoverAlign=\"end\"\n rtPopoverOffsetY=\"14\"\n [rtMod]=\"{ isOpen: userPopover.isOpen() }\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"userPopover.isOpen()\"\n [rtPopover]=\"menuTpl\"\n (click)=\"userPopover.open()\">\n <span rtElem=\"user-avatar\" aria-hidden=\"true\">{{ userAvatar() }}</span>\n <span rtElem=\"user-name\" qa-dataid=\"header-user-name\">{{ u.name }}</span>\n <span rtElem=\"user-caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n } @else {\n <button rtElem=\"user\" type=\"button\" (click)=\"onUserClick()\">\n <span rtElem=\"user-avatar\" aria-hidden=\"true\">{{ userAvatar() }}</span>\n <span rtElem=\"user-name\" qa-dataid=\"header-user-name\">{{ u.name }}</span>\n <span rtElem=\"user-caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n }\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-page-header.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/page-header/rt-page-header.logic.ts","../../../projects/ui-kit-v2/src/lib/components/page-header/rt-page-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/page-header/rt-page-header.component.html","../../../projects/ui-kit-v2/src/lib/components/page-header/rt-tools-ui-kit-v2-page-header.ts"],"sourcesContent":["import { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { IRtPageHeader } from './rt-page-header.model';\n\n/** Чем пункт отрисуется: панелью, ссылкой или кнопкой. */\nexport enum ERtPageHeaderEntry {\n Panel = 'panel',\n Link = 'link',\n Button = 'button',\n}\n\nexport namespace IRtPageHeaderView {\n /** Пункт, готовый к отрисовке: форма решена заранее, шаблон её не выводит. */\n export interface Entry {\n readonly id: string;\n readonly label: string;\n readonly icon: IRtIcon.Name | null;\n readonly route: string;\n readonly routerLinkActiveExact: boolean;\n readonly disabled: boolean;\n readonly unread: boolean;\n readonly kind: ERtPageHeaderEntry;\n }\n\n export interface Group {\n readonly id: string;\n readonly label: string;\n readonly icon: IRtIcon.Name | null;\n readonly items: ReadonlyArray<Entry>;\n }\n\n export interface Column {\n readonly id: string;\n readonly groups: ReadonlyArray<Group>;\n }\n\n export interface Section extends Entry {\n readonly columns: ReadonlyArray<Column>;\n readonly columnCount: number;\n /** Все пункты панели одним списком: подсветка раздела и сведение маркера. */\n readonly panelItems: ReadonlyArray<Entry>;\n /** Группы всех колонок подряд: на узком экране колонок нет, а группы есть. */\n readonly panelGroups: ReadonlyArray<Group>;\n }\n}\n\n/** Пункты панели одним списком — колонки и группы для этого раскрываются. */\nexport function panelItemsOf(item: IRtPageHeader.Item): ReadonlyArray<IRtPageHeader.Item> {\n return (item.columns ?? []).flatMap((column: IRtPageHeader.Column): ReadonlyArray<IRtPageHeader.Item> =>\n column.groups.flatMap((group: IRtPageHeader.Group): ReadonlyArray<IRtPageHeader.Item> => group.items)\n );\n}\n\n/**\n * Маркер раздела. Пункты панели свёрнуты, и непросмотренное внутри видно только\n * по точке у самого раздела.\n */\nexport function unreadOf(item: IRtPageHeader.Item): boolean {\n return item.unread === true || panelItemsOf(item).some((entry: IRtPageHeader.Item): boolean => entry.unread === true);\n}\n\nexport function entryKindOf(item: IRtPageHeader.Item): ERtPageHeaderEntry {\n if (panelItemsOf(item).length > 0) {\n return ERtPageHeaderEntry.Panel;\n }\n if ((item.route ?? '') !== '' && !item.disabled) {\n return ERtPageHeaderEntry.Link;\n }\n\n return ERtPageHeaderEntry.Button;\n}\n\nexport function toEntry(item: IRtPageHeader.Item): IRtPageHeaderView.Entry {\n return {\n id: item.id,\n label: item.label,\n icon: item.icon ?? null,\n route: item.route ?? '',\n routerLinkActiveExact: item.routerLinkActiveExact === true,\n disabled: item.disabled === true,\n unread: item.unread === true,\n kind: entryKindOf(item),\n };\n}\n\nfunction toGroup(group: IRtPageHeader.Group): IRtPageHeaderView.Group {\n return {\n id: group.id,\n label: group.label ?? '',\n icon: group.icon ?? null,\n items: group.items.map(toEntry),\n };\n}\n\nfunction toColumn(column: IRtPageHeader.Column): IRtPageHeaderView.Column {\n return {\n id: column.id,\n groups: column.groups.map(toGroup),\n };\n}\n\n/** Группы всех колонок одним списком — узкий экран раскладывает панель без колонок. */\nexport function panelGroupsOf(columns: ReadonlyArray<IRtPageHeaderView.Column>): ReadonlyArray<IRtPageHeaderView.Group> {\n return columns.flatMap((column: IRtPageHeaderView.Column): ReadonlyArray<IRtPageHeaderView.Group> => column.groups);\n}\n\n/** Разделы верхнего ряда вместе с раскладкой их панелей. */\nexport function toSections(items: ReadonlyArray<IRtPageHeader.Item>): ReadonlyArray<IRtPageHeaderView.Section> {\n return items.map((item: IRtPageHeader.Item): IRtPageHeaderView.Section => {\n const columns: ReadonlyArray<IRtPageHeaderView.Column> = (item.columns ?? []).map(toColumn);\n\n return {\n ...toEntry(item),\n unread: unreadOf(item),\n columns,\n columnCount: columns.length,\n panelItems: panelItemsOf(item).map(toEntry),\n panelGroups: panelGroupsOf(columns),\n };\n });\n}\n\n/** Адрес без строки запроса и якоря — подсветка считается по пути. */\nexport function pathOf(url: string): string {\n return url.split(/[?#]/)[0] ?? '';\n}\n\nexport function isEntryActive(entry: IRtPageHeaderView.Entry, path: string): boolean {\n if (entry.kind !== ERtPageHeaderEntry.Link) {\n return false;\n }\n\n return entry.routerLinkActiveExact ? path === entry.route : path.startsWith(entry.route);\n}\n\n/**\n * Разделы, у которых активен хоть один пункт панели. Обход идёт по раскрытому\n * списку пунктов: своего адреса у раздела с панелью нет, и подсветить его больше\n * нечем.\n */\n/**\n * Разделы для кругов сжатой полосы: первые `count` из тех, у кого есть иконка. Раздел без\n * иконки в круг не попадает — показать в нём нечего, и он остаётся под кнопкой «ещё».\n */\nexport function compactSectionsOf(\n sections: ReadonlyArray<IRtPageHeaderView.Section>,\n count: number\n): ReadonlyArray<IRtPageHeaderView.Section> {\n return sections.filter((section: IRtPageHeaderView.Section): boolean => section.icon !== null).slice(0, Math.max(0, count));\n}\n\n/**\n * Прилипла ли шапка: липкий узел стоит на пиксель выше края прокрутки и, прилипнув, теряет этот\n * пиксель из видимой области — наблюдатель пересечения отдаёт долю меньше единицы. Узел, ушедший\n * из области целиком, прилипшим не считается: его не видно вовсе.\n */\nexport function isStuck(intersectionRatio: number, isIntersecting: boolean): boolean {\n return isIntersecting && intersectionRatio < 1;\n}\n\nexport function activeSectionIds(sections: ReadonlyArray<IRtPageHeaderView.Section>, url: string): ReadonlySet<string> {\n const path: string = pathOf(url);\n const ids: Set<string> = new Set<string>();\n for (const section of sections) {\n if (section.panelItems.some((entry: IRtPageHeaderView.Entry): boolean => isEntryActive(entry, path))) {\n ids.add(section.id);\n }\n }\n\n return ids;\n}\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n afterNextRender,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n TemplateRef,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Event as RouterEvent, NavigationEnd, Router, RouterLink, RouterLinkActive } from '@angular/router';\n\nimport { filter, map } from 'rxjs';\n\nimport { BlockDirective, ElemDirective, ModDirective, WINDOW } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, RT_KIT_TRANSLATOR, RtKitLabelPipe, TRtKitLabelMap, TRtKitTranslator, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { BreakpointsService } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { activeSectionIds, compactSectionsOf, ERtPageHeaderEntry, IRtPageHeaderView, isStuck, toSections } from './rt-page-header.logic';\nimport { IRtPageHeader } from './rt-page-header.model';\n\nconst BEM_BLOCK: string = 'rt-page-header';\n\n/**\n * Верхняя горизонтальная плашка-навигация для первого уровня доменных страниц.\n *\n * Контракт:\n * - `items` — `Item[]`. Анкор для пунктов с `route`; `<button>` для недоступных\n * и для тех, кто обрабатывается снаружи (`itemClick`). Пункт с `columns` —\n * кнопка-триггер: панель второго уровня открывается наведением ([rtPopover]).\n * - `user` — необязательный блок справа. Если задан `userMenu` (TemplateRef) —\n * блок становится hover-триггером попапа с этим контентом (клик — touch-fallback,\n * панель прижата к правому краю); иначе по клику emit'ит `userClick`.\n *\n * Active state — через `RouterLinkActive` с классом `rt-page-header__link--is-active`;\n * для раздела с панелью — вычисляется по текущему URL (своего route у него нет).\n */\n@Component({\n selector: 'rt-page-header',\n templateUrl: './rt-page-header.component.html',\n // Панель второго уровня и панель узкого экрана рисуются в CDK Overlay, вне\n // хоста, поэтому это отдельные корневые блоки — и отдельные файлы: бюджет\n // стилей компонента считается на каждый файл, и одним они его перебирают.\n styleUrls: [\n './rt-page-header.component.scss',\n './rt-page-header-submenu.scss',\n './rt-page-header-mobile.scss',\n './rt-page-header-compact.scss',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n RtKitLabelPipe,\n // Angular\n RouterLink,\n RouterLinkActive,\n\n // standalone components / directives\n RtIconComponent,\n RtPopoverDirective,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-page-header--sticky]': 'stickyCompact()',\n '[class.rt-page-header--is-compact]': 'compact()',\n },\n})\nexport class RtPageHeaderComponent {\n readonly #router: Router = inject(Router);\n\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n readonly #host: ElementRef<HTMLElement> = inject<ElementRef<HTMLElement>>(ElementRef);\n\n // Конструктор наблюдателя пересечения объявлен на globalThis, а не на интерфейсе Window —\n // токен отдаёт тот же объект, тип лишь уточняется.\n readonly #window: Window & typeof globalThis = inject(WINDOW) as Window & typeof globalThis;\n\n /**\n * Прилипла ли шапка к краю прокрутки. Считается наблюдателем пересечения, а не смещением\n * окна: страница у потребителя прокручивается и внутри контейнера, и окно об этом не знает.\n */\n readonly #stuck: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #t_uiMainNav: Signal<string> = rtKitLabel('uiMainNav');\n\n /* Реактивный URL для подсветки раздела: у раздела с панелью нет своего\n route, поэтому RouterLinkActive не применим — сравниваем по факту навигации. */\n readonly #currentUrl: Signal<string> = toSignal(\n this.#router.events.pipe(\n filter((e: RouterEvent): e is NavigationEnd => e instanceof NavigationEnd),\n map((): string => this.#router.url)\n ),\n { initialValue: this.#router.url }\n );\n\n readonly #breakpoints: BreakpointsService = inject(BreakpointsService);\n\n readonly #translate: Signal<TRtKitTranslator> = inject(RT_KIT_TRANSLATOR);\n\n /** Переводчик для чистого пайпа подписи: шаблон отдаёт его вторым доводом. */\n protected readonly translate: Signal<TRtKitTranslator> = this.#translate;\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly mobileNavPopoverRef: Signal<RtPopoverDirective | undefined> = viewChild('mobileNavPopover', {\n read: RtPopoverDirective,\n });\n\n /** Кнопка «ещё» сжатой полосы открывает ту же панель, что и бургер, своим поповером. */\n protected readonly compactNavPopoverRef: Signal<RtPopoverDirective | undefined> = viewChild('compactNavPopover', {\n read: RtPopoverDirective,\n });\n\n /** Сжатое состояние: шапка липкая и прилипла к верху. */\n protected readonly compact: Signal<boolean> = computed((): boolean => this.stickyCompact() && this.#stuck());\n\n /** Разделы в кругах сжатой полосы: первые с иконкой, число — по входу. */\n protected readonly compactSections: Signal<ReadonlyArray<IRtPageHeaderView.Section>> = computed(\n (): ReadonlyArray<IRtPageHeaderView.Section> => compactSectionsOf(this.sections(), this.compactVisibleCount())\n );\n\n /** Форма пункта решается один раз здесь, а не ветвлениями в шаблоне. */\n protected readonly sections: Signal<ReadonlyArray<IRtPageHeaderView.Section>> = computed((): ReadonlyArray<IRtPageHeaderView.Section> =>\n toSections(this.items())\n );\n\n /**\n * id разделов с активным вложенным адресом — для O(1) lookup в шаблоне.\n * Зависит от #currentUrl + items (сигналы) → подсветка реактивна на навигацию.\n */\n protected readonly activeSectionIds: Signal<ReadonlySet<string>> = computed((): ReadonlySet<string> =>\n activeSectionIds(this.sections(), this.#currentUrl())\n );\n\n protected readonly userAvatar: Signal<string> = computed((): string => {\n const u: IRtPageHeader.User | null = this.user();\n if (!u) {\n return '';\n }\n if (u.avatar && u.avatar.length > 0) {\n return u.avatar.charAt(0).toUpperCase();\n }\n return u.name.charAt(0).toUpperCase();\n });\n\n /** Узкий вьюпорт (≤1080px): инлайн-навигация прячется, показывается гамбургер. */\n protected readonly isNarrow: Signal<boolean> = this.#breakpoints.narrow;\n\n /**\n * id раскрытых разделов-аккордеонов в мобильной панели. Ключ — только раздел:\n * группы внутри раскрытого раздела показаны сразу, и совпасть идентификаторам\n * раздела и группы в этом множестве негде.\n */\n protected readonly expandedSectionIds: WritableSignal<ReadonlySet<string>> = signal<ReadonlySet<string>>(new Set<string>());\n\n protected readonly EntryKind: typeof ERtPageHeaderEntry = ERtPageHeaderEntry;\n\n public readonly items: InputSignal<ReadonlyArray<IRtPageHeader.Item>> = input<ReadonlyArray<IRtPageHeader.Item>>([]);\n\n public readonly user: InputSignal<IRtPageHeader.User | null> = input<IRtPageHeader.User | null>(null);\n\n public readonly userTitle: InputSignal<string> = input<string>('');\n\n public readonly userMenu: InputSignal<TemplateRef<unknown> | null> = input<TemplateRef<unknown> | null>(null);\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly ariaLabel: InputSignal<string> = input<string>('');\n\n /**\n * Шапка липнет к верху окна и, прилипнув, сжимается в полосу: круги первых разделов,\n * кнопка «ещё» и три слота потребителя. Выключено — поведение прежнее.\n */\n public readonly stickyCompact: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Сколько разделов с иконкой показывать кругами в сжатой полосе; остальные — под «ещё». */\n public readonly compactVisibleCount: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(2, {\n transform: numberAttribute,\n });\n\n /** Своё имя навигации важнее умолчания */\n public readonly navAriaLabel: Signal<string> = computed((): string => this.ariaLabel() || this.#t_uiMainNav());\n\n public readonly itemClick: OutputEmitterRef<string> = output<string>();\n\n public readonly userClick: OutputEmitterRef<void> = output<void>();\n\n constructor() {\n // Ресайз обратно в десктоп — гамбургер скрывается CSS'ом; открытую\n // мобильную панель закрываем, иначе overlay зависнет без якоря.\n effect((): void => {\n if (!this.isNarrow()) {\n this.mobileNavPopoverRef()?.close();\n }\n });\n\n afterNextRender((): void => this.#observeStuck());\n }\n\n /**\n * Липкая шапка стоит на пиксель выше края прокрутки и, прилипнув, теряет его из видимой\n * области: наблюдатель пересечения с порогом в единицу ловит ровно этот момент — и в окне,\n * и внутри прокручиваемого контейнера, о котором окно не знает.\n */\n #observeStuck(): void {\n const observer: IntersectionObserver = new this.#window.IntersectionObserver(\n (entries: IntersectionObserverEntry[]): void => {\n const entry: IntersectionObserverEntry | undefined = entries.at(-1);\n if (entry !== undefined) {\n this.#stuck.set(isStuck(entry.intersectionRatio, entry.isIntersecting));\n }\n },\n { threshold: [0, 1] }\n );\n observer.observe(this.#host.nativeElement);\n this.#destroyRef.onDestroy((): void => observer.disconnect());\n }\n\n /** Панель разделов открывают и бургер, и кнопка «ещё»: закрываются обе. */\n protected closeNavPanels(): void {\n this.mobileNavPopoverRef()?.close();\n this.compactNavPopoverRef()?.close();\n }\n\n /** Круг раздела без адреса: раздел с панелью открывает общую панель, прочий — сообщает наружу. */\n protected onCompactSectionClick(section: IRtPageHeaderView.Section): void {\n if (section.kind === ERtPageHeaderEntry.Panel) {\n this.compactNavPopoverRef()?.open();\n return;\n }\n this.itemClick.emit(section.id);\n }\n\n protected onItemClick(id: string): void {\n this.itemClick.emit(id);\n }\n\n protected onUserClick(): void {\n this.userClick.emit();\n }\n\n /** Аккордеон мобильной панели: тумблер раскрытия раздела по его id. */\n protected toggleSection(id: string): void {\n this.expandedSectionIds.update((prev: ReadonlySet<string>): ReadonlySet<string> => {\n const next: Set<string> = new Set<string>(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }\n\n /** Клик по плоскому пункту мобильной панели: emit + закрыть панель. */\n protected onMobileItemClick(id: string): void {\n this.itemClick.emit(id);\n this.closeNavPanels();\n }\n}\n","<ng-container rtBlock=\"rt-page-header\">\n <nav rtElem=\"nav\" [attr.aria-label]=\"navAriaLabel()\">\n <ul rtElem=\"list\" role=\"list\">\n @for (section of sections(); track section.id) {\n <li rtElem=\"item\" qa-dataid=\"header-nav-item\" [attr.data-id]=\"section.id\">\n @switch (section.kind) {\n @case (EntryKind.Panel) {\n <button\n rtElem=\"link\"\n type=\"button\"\n qa-dataid=\"header-nav-trigger\"\n #groupPopover=\"rtPopover\"\n rtPopoverTrigger=\"hover\"\n rtPopoverFitViewport\n rtPopoverOffsetY=\"14\"\n [rtMod]=\"{\n isActive: activeSectionIds().has(section.id),\n isOpen: groupPopover.isOpen(),\n }\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"groupPopover.isOpen()\"\n [rtPopover]=\"submenuTpl\"\n (click)=\"groupPopover.open()\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n <span rtElem=\"caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n <ng-template #submenuTpl>\n <div rtBlock=\"rt-page-header-submenu\" role=\"menu\" [style.--rt-nav-panel-columns]=\"section.columnCount\">\n @for (column of section.columns; track column.id) {\n <div rtElem=\"column\" qa-dataid=\"header-nav-column\" [attr.data-id]=\"column.id\">\n @for (group of column.groups; track group.id) {\n <div rtElem=\"group\" role=\"group\" [attr.aria-label]=\"group.label || null\">\n @if (group.label) {\n <div rtElem=\"group-title\" qa-dataid=\"header-nav-group\" [attr.data-id]=\"group.id\">\n @if (group.icon) {\n <rt-icon rtElem=\"group-icon\" size=\"xs\" [name]=\"group.icon\" />\n }\n <span rtElem=\"group-label\">{{ group.label }}</span>\n </div>\n }\n @for (entry of group.items; track entry.id) {\n @if (entry.kind === EntryKind.Link) {\n <a\n rtElem=\"link\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-subitem\"\n routerLinkActive=\"rt-page-header-submenu__link--is-active\"\n [attr.data-id]=\"entry.id\"\n [routerLink]=\"entry.route\"\n [routerLinkActiveOptions]=\"{ exact: entry.routerLinkActiveExact }\"\n (click)=\"groupPopover.close()\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n } @else if (entry.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"\n 'uiSectionInProgress' | rtKitLabel: translate() : { label: entry.label }\n \">\n <button\n rtElem=\"link\"\n role=\"menuitem\"\n type=\"button\"\n qa-dataid=\"header-nav-subitem\"\n [rtMod]=\"{ disabled: true }\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-disabled]=\"true\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n </button>\n </span>\n } @else {\n <button\n rtElem=\"link\"\n role=\"menuitem\"\n type=\"button\"\n qa-dataid=\"header-nav-subitem\"\n [attr.data-id]=\"entry.id\"\n (click)=\"onItemClick(entry.id)\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n }\n @case (EntryKind.Link) {\n <a\n rtElem=\"link\"\n routerLinkActive=\"rt-page-header__link--is-active\"\n [routerLink]=\"section.route\"\n [routerLinkActiveOptions]=\"{ exact: section.routerLinkActiveExact }\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n }\n @default {\n @if (section.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"'uiSectionInProgress' | rtKitLabel: translate() : { label: section.label }\">\n <button rtElem=\"link\" type=\"button\" [rtMod]=\"{ disabled: true }\" [attr.aria-disabled]=\"true\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n </button>\n </span>\n } @else {\n <button rtElem=\"link\" type=\"button\" (click)=\"onItemClick(section.id)\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n }\n </li>\n }\n </ul>\n </nav>\n\n <button\n rtElem=\"burger\"\n type=\"button\"\n qa-dataid=\"header-nav-burger\"\n #mobileNavPopover=\"rtPopover\"\n rtPopoverFitViewport\n rtPopoverOffsetY=\"14\"\n [attr.aria-label]=\"t().uiNavMenu\"\n [rtMod]=\"{ isOpen: mobileNavPopover.isOpen() }\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"mobileNavPopover.isOpen()\"\n [rtPopover]=\"mobileNavTpl\">\n <rt-icon rtElem=\"burger-icon\" name=\"bars\" size=\"md\" />\n </button>\n\n <!--\n Сжатая полоса стоит в разметке всегда, как и узкая: показывает её модификатор хоста.\n Слева стопка кругов — «ещё» поверх остальных, — дальше три слота потребителя.\n -->\n <div rtElem=\"compact\" qa-dataid=\"header-compact\">\n <div rtElem=\"compact-stack\">\n <button\n rtElem=\"compact-circle\"\n type=\"button\"\n qa-dataid=\"header-compact-more\"\n #compactNavPopover=\"rtPopover\"\n rtPopoverFitViewport\n rtPopoverOffsetY=\"10\"\n [rtMod]=\"{ more: true, isOpen: compactNavPopover.isOpen() }\"\n [attr.aria-label]=\"t().uiNavMenu\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"compactNavPopover.isOpen()\"\n [rtPopover]=\"mobileNavTpl\">\n <rt-icon name=\"ellipsis-h\" size=\"sm\" />\n </button>\n @for (section of compactSections(); track section.id; let index = $index) {\n @if (section.kind === EntryKind.Link) {\n <a\n rtElem=\"compact-circle\"\n qa-dataid=\"header-compact-section\"\n routerLinkActive=\"rt-page-header__compact-circle--is-active\"\n [style.--rt-nav-compact-index]=\"index + 1\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"section.label\"\n [routerLink]=\"section.route\"\n [routerLinkActiveOptions]=\"{ exact: section.routerLinkActiveExact }\"\n [rtTooltip]=\"section.label\">\n @if (section.icon; as icon) {\n <rt-icon size=\"sm\" [name]=\"icon\" />\n }\n @if (section.unread) {\n <span rtElem=\"compact-marker\" role=\"img\" [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n } @else {\n <button\n rtElem=\"compact-circle\"\n type=\"button\"\n qa-dataid=\"header-compact-section\"\n [rtMod]=\"{ isActive: activeSectionIds().has(section.id), disabled: section.disabled }\"\n [style.--rt-nav-compact-index]=\"index + 1\"\n [disabled]=\"section.disabled\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"section.label\"\n [rtTooltip]=\"section.label\"\n (click)=\"onCompactSectionClick(section)\">\n @if (section.icon; as icon) {\n <rt-icon size=\"sm\" [name]=\"icon\" />\n }\n @if (section.unread) {\n <span rtElem=\"compact-marker\" role=\"img\" [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n </div>\n <div rtElem=\"compact-slot\" [rtMod]=\"{ left: true }\"><ng-content select=\"[rtCompactLeft]\" /></div>\n <div rtElem=\"compact-slot\" [rtMod]=\"{ center: true }\"><ng-content select=\"[rtCompactCenter]\" /></div>\n <div rtElem=\"compact-slot\" [rtMod]=\"{ right: true }\"><ng-content select=\"[rtCompactRight]\" /></div>\n </div>\n\n <ng-template #mobileNavTpl>\n <div rtBlock=\"rt-page-header-mobile\" role=\"menu\">\n @for (section of sections(); track section.id) {\n @switch (section.kind) {\n @case (EntryKind.Panel) {\n <button\n rtElem=\"section\"\n type=\"button\"\n qa-dataid=\"header-nav-mobile-trigger\"\n [rtMod]=\"{\n isExpanded: expandedSectionIds().has(section.id),\n isActive: activeSectionIds().has(section.id),\n }\"\n [attr.data-id]=\"section.id\"\n [attr.aria-expanded]=\"expandedSectionIds().has(section.id)\"\n (click)=\"toggleSection(section.id)\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n <span rtElem=\"caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n @if (expandedSectionIds().has(section.id)) {\n <div rtElem=\"children\">\n @for (group of section.panelGroups; track group.id) {\n <div rtElem=\"group\" role=\"group\" [attr.aria-label]=\"group.label || null\">\n @if (group.label) {\n <div rtElem=\"group-title\" qa-dataid=\"header-nav-mobile-group\" [attr.data-id]=\"group.id\">\n @if (group.icon) {\n <rt-icon rtElem=\"group-icon\" size=\"xs\" [name]=\"group.icon\" />\n }\n <span rtElem=\"group-label\">{{ group.label }}</span>\n </div>\n }\n @for (entry of group.items; track entry.id) {\n @if (entry.kind === EntryKind.Link) {\n <a\n rtElem=\"link\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n routerLinkActive=\"rt-page-header-mobile__link--is-active\"\n [rtMod]=\"{ child: true }\"\n [attr.data-id]=\"entry.id\"\n [routerLink]=\"entry.route\"\n [routerLinkActiveOptions]=\"{ exact: entry.routerLinkActiveExact }\"\n (click)=\"closeNavPanels()\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n } @else if (entry.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"'uiSectionInProgress' | rtKitLabel: translate() : { label: entry.label }\">\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [rtMod]=\"{ child: true, disabled: true }\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-disabled]=\"true\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n </button>\n </span>\n } @else {\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [rtMod]=\"{ child: true }\"\n [attr.data-id]=\"entry.id\"\n (click)=\"onMobileItemClick(entry.id)\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n </div>\n }\n </div>\n }\n }\n @case (EntryKind.Link) {\n <a\n rtElem=\"link\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n routerLinkActive=\"rt-page-header-mobile__link--is-active\"\n [attr.data-id]=\"section.id\"\n [routerLink]=\"section.route\"\n [routerLinkActiveOptions]=\"{ exact: section.routerLinkActiveExact }\"\n (click)=\"closeNavPanels()\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n }\n @default {\n @if (section.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"'uiSectionInProgress' | rtKitLabel: translate() : { label: section.label }\">\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [rtMod]=\"{ disabled: true }\"\n [attr.data-id]=\"section.id\"\n [attr.aria-disabled]=\"true\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n </button>\n </span>\n } @else {\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [attr.data-id]=\"section.id\"\n (click)=\"onMobileItemClick(section.id)\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n }\n }\n </div>\n </ng-template>\n\n <ng-content select=\"[rtHeaderBell]\" />\n\n @if (user(); as u) {\n @if (userMenu(); as menuTpl) {\n <!--\n Меню профиля открывается наведением, как и разделы: весь верхний\n ряд ведёт себя одинаково. Нажатие остаётся запасным путём для\n касания, а переход курсора на список языков панель переживает —\n вложенный оверлей за уход наружу не считается.\n -->\n <button\n rtElem=\"user\"\n type=\"button\"\n qa-dataid=\"header-user-menu\"\n #userPopover=\"rtPopover\"\n rtPopoverTrigger=\"hover\"\n rtPopoverAlign=\"end\"\n rtPopoverOffsetY=\"14\"\n [rtMod]=\"{ isOpen: userPopover.isOpen() }\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"userPopover.isOpen()\"\n [rtPopover]=\"menuTpl\"\n (click)=\"userPopover.open()\">\n <span rtElem=\"user-avatar\" aria-hidden=\"true\">{{ userAvatar() }}</span>\n <span rtElem=\"user-name\" qa-dataid=\"header-user-name\">{{ u.name }}</span>\n <span rtElem=\"user-caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n } @else {\n <button rtElem=\"user\" type=\"button\" (click)=\"onUserClick()\">\n <span rtElem=\"user-avatar\" aria-hidden=\"true\">{{ userAvatar() }}</span>\n <span rtElem=\"user-name\" qa-dataid=\"header-user-name\">{{ u.name }}</span>\n <span rtElem=\"user-caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n }\n }\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, booleanAttribute, output, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { BlockDirective, ElemDirective } from '@rt-tools/core';
4
+ import { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';
5
+
6
+ const BEM_BLOCK = 'rt-prompt-suggestion';
7
+ /**
8
+ * Карточка готового вопроса на пустом экране ассистента: подпись слева, стрелка справа на
9
+ * одинаковом отступе. Нажатие сообщает текст подсказки наружу — что с ним делать, решает
10
+ * приложение.
11
+ */
12
+ class RtPromptSuggestionComponent {
13
+ constructor() {
14
+ /** Текст вопроса: он и на карточке, и в выходе. */
15
+ this.label = input.required(/* @ts-ignore */
16
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
17
+ this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
18
+ /** Карточку нажали; значение — текст вопроса. */
19
+ this.picked = output();
20
+ }
21
+ onClick() {
22
+ this.picked.emit(this.label());
23
+ }
24
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtPromptSuggestionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: RtPromptSuggestionComponent, isStandalone: true, selector: "rt-prompt-suggestion", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { picked: "picked" }, host: { classAttribute: "rt-prompt-suggestion" }, ngImport: i0, template: "<button rtBlock=\"rt-prompt-suggestion\" type=\"button\" qa-dataid=\"prompt-suggestion\" [disabled]=\"disabled()\" (click)=\"onClick()\">\n <span rtElem=\"label\" qa-dataid=\"prompt-suggestion-label\">{{ label() }}</span>\n <rt-icon rtElem=\"arrow\" name=\"arrow-right\" size=\"sm\" aria-hidden=\"true\" />\n</button>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-prompt-suggestion{display:block}rt-prompt-suggestion .rt-prompt-suggestion{--rt-prompt-suggestion-radius: var(--rt-radius-lg);--rt-prompt-suggestion-focus-shadow: var(--rt-shadow-focus-ring);--rt-prompt-suggestion-transition-duration: var(--rt-duration-fast);display:flex;box-sizing:border-box;align-items:center;justify-content:space-between;padding:var(--rt-space-sm) var(--rt-space-md);border:0;border-radius:var(--rt-prompt-suggestion-radius);margin:0;background:var(--rt-color-bg-hover);color:var(--rt-color-text-primary);cursor:pointer;font:inherit;font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-medium);gap:var(--rt-space-sm);inline-size:100%;line-height:var(--rt-leading-snug);text-align:start;transition:background-color var(--rt-prompt-suggestion-transition-duration) ease}rt-prompt-suggestion .rt-prompt-suggestion:hover:not(:disabled){background:var(--rt-color-bg-subtle)}rt-prompt-suggestion .rt-prompt-suggestion:focus-visible{box-shadow:var(--rt-prompt-suggestion-focus-shadow);outline:2px solid transparent;outline-offset:2px}rt-prompt-suggestion .rt-prompt-suggestion:disabled{color:var(--rt-color-text-disabled);cursor:default}rt-prompt-suggestion .rt-prompt-suggestion__label{min-inline-size:0}rt-prompt-suggestion .rt-prompt-suggestion__arrow{flex:none;color:var(--rt-color-text-muted)}}\n"], dependencies: [{ kind: "directive", type:
26
+ // standalone components / directives
27
+ BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "component", type: RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "glyphStrategy", "size", "color", "fill", "spin", "rotate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtPromptSuggestionComponent, decorators: [{
30
+ type: Component,
31
+ args: [{ selector: 'rt-prompt-suggestion', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
32
+ // standalone components / directives
33
+ BlockDirective,
34
+ ElemDirective,
35
+ RtIconComponent,
36
+ ], host: {
37
+ class: BEM_BLOCK,
38
+ }, template: "<button rtBlock=\"rt-prompt-suggestion\" type=\"button\" qa-dataid=\"prompt-suggestion\" [disabled]=\"disabled()\" (click)=\"onClick()\">\n <span rtElem=\"label\" qa-dataid=\"prompt-suggestion-label\">{{ label() }}</span>\n <rt-icon rtElem=\"arrow\" name=\"arrow-right\" size=\"sm\" aria-hidden=\"true\" />\n</button>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-prompt-suggestion{display:block}rt-prompt-suggestion .rt-prompt-suggestion{--rt-prompt-suggestion-radius: var(--rt-radius-lg);--rt-prompt-suggestion-focus-shadow: var(--rt-shadow-focus-ring);--rt-prompt-suggestion-transition-duration: var(--rt-duration-fast);display:flex;box-sizing:border-box;align-items:center;justify-content:space-between;padding:var(--rt-space-sm) var(--rt-space-md);border:0;border-radius:var(--rt-prompt-suggestion-radius);margin:0;background:var(--rt-color-bg-hover);color:var(--rt-color-text-primary);cursor:pointer;font:inherit;font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-medium);gap:var(--rt-space-sm);inline-size:100%;line-height:var(--rt-leading-snug);text-align:start;transition:background-color var(--rt-prompt-suggestion-transition-duration) ease}rt-prompt-suggestion .rt-prompt-suggestion:hover:not(:disabled){background:var(--rt-color-bg-subtle)}rt-prompt-suggestion .rt-prompt-suggestion:focus-visible{box-shadow:var(--rt-prompt-suggestion-focus-shadow);outline:2px solid transparent;outline-offset:2px}rt-prompt-suggestion .rt-prompt-suggestion:disabled{color:var(--rt-color-text-disabled);cursor:default}rt-prompt-suggestion .rt-prompt-suggestion__label{min-inline-size:0}rt-prompt-suggestion .rt-prompt-suggestion__arrow{flex:none;color:var(--rt-color-text-muted)}}\n"] }]
39
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], picked: [{ type: i0.Output, args: ["picked"] }] } });
40
+
41
+ /**
42
+ * Generated bundle index. Do not edit.
43
+ */
44
+
45
+ export { RtPromptSuggestionComponent };
46
+ //# sourceMappingURL=rt-tools-ui-kit-v2-prompt-suggestion.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-prompt-suggestion.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/prompt-suggestion/rt-prompt-suggestion.component.ts","../../../projects/ui-kit-v2/src/lib/components/prompt-suggestion/rt-prompt-suggestion.component.html","../../../projects/ui-kit-v2/src/lib/components/prompt-suggestion/rt-tools-ui-kit-v2-prompt-suggestion.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\n\nconst BEM_BLOCK: string = 'rt-prompt-suggestion';\n\n/**\n * Карточка готового вопроса на пустом экране ассистента: подпись слева, стрелка справа на\n * одинаковом отступе. Нажатие сообщает текст подсказки наружу — что с ним делать, решает\n * приложение.\n */\n@Component({\n selector: 'rt-prompt-suggestion',\n templateUrl: './rt-prompt-suggestion.component.html',\n styleUrl: './rt-prompt-suggestion.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n RtIconComponent,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtPromptSuggestionComponent {\n /** Текст вопроса: он и на карточке, и в выходе. */\n public readonly label: InputSignal<string> = input.required<string>();\n\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Карточку нажали; значение — текст вопроса. */\n public readonly picked: OutputEmitterRef<string> = output<string>();\n\n protected onClick(): void {\n this.picked.emit(this.label());\n }\n}\n","<button rtBlock=\"rt-prompt-suggestion\" type=\"button\" qa-dataid=\"prompt-suggestion\" [disabled]=\"disabled()\" (click)=\"onClick()\">\n <span rtElem=\"label\" qa-dataid=\"prompt-suggestion-label\">{{ label() }}</span>\n <rt-icon rtElem=\"arrow\" name=\"arrow-right\" size=\"sm\" aria-hidden=\"true\" />\n</button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAiBA,MAAM,SAAS,GAAW,sBAAsB;AAEhD;;;;AAIG;MAiBU,2BAA2B,CAAA;AAhBxC,IAAA,WAAA,GAAA;;QAkBoB,IAAA,CAAA,KAAK,GAAwB,KAAK,CAAC,QAAQ;kFAAU;QAErD,IAAA,CAAA,QAAQ,GAAoD,KAAK,CAAwB,KAAK,gFAC1G,SAAS,EAAE,gBAAgB,EAAA,CAC7B;;QAGc,IAAA,CAAA,MAAM,GAA6B,MAAM,EAAU;AAKtE,IAAA;IAHa,OAAO,GAAA;QACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAClC;8GAbS,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,qaCxCxC,uUAIA,EAAA,MAAA,EAAA,CAAA,41CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA;;gBD4BQ,cAAc,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,eAAe,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAMV,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAhBvC,SAAS;+BACI,sBAAsB,EAAA,eAAA,EAGf,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;;wBAEL,cAAc;wBACd,aAAa;wBACb,eAAe;qBAClB,EAAA,IAAA,EACK;AACF,wBAAA,KAAK,EAAE,SAAS;AACnB,qBAAA,EAAA,QAAA,EAAA,uUAAA,EAAA,MAAA,EAAA,CAAA,41CAAA,CAAA,EAAA;;;AEtCL;;AAEG;;;;"}