@rt-tools/ui-kit-v2 0.16.0 → 0.18.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 (321) hide show
  1. package/README.md +25 -0
  2. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs +79 -0
  3. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs.map +1 -0
  4. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +227 -0
  5. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -0
  6. package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs +47 -0
  7. package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs.map +1 -0
  8. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +702 -0
  9. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -0
  10. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +214 -0
  11. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -0
  12. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +53 -0
  13. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -0
  14. package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs +88 -0
  15. package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs.map +1 -0
  16. package/fesm2022/rt-tools-ui-kit-v2-button.mjs +365 -0
  17. package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -0
  18. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +152 -0
  19. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -0
  20. package/fesm2022/rt-tools-ui-kit-v2-card.mjs +72 -0
  21. package/fesm2022/rt-tools-ui-kit-v2-card.mjs.map +1 -0
  22. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +111 -0
  23. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -0
  24. package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs +76 -0
  25. package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs.map +1 -0
  26. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs +255 -0
  27. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs.map +1 -0
  28. package/fesm2022/rt-tools-ui-kit-v2-container.mjs +1326 -0
  29. package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -0
  30. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +2590 -0
  31. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -0
  32. package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs +45 -0
  33. package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs.map +1 -0
  34. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs +158 -0
  35. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs.map +1 -0
  36. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +894 -0
  37. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -0
  38. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +1217 -0
  39. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -0
  40. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +779 -0
  41. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -0
  42. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +573 -0
  43. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -0
  44. package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs +141 -0
  45. package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs.map +1 -0
  46. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs +68 -0
  47. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs.map +1 -0
  48. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs +478 -0
  49. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs.map +1 -0
  50. package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs +183 -0
  51. package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs.map +1 -0
  52. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +44 -0
  53. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -0
  54. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +260 -0
  55. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -0
  56. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +937 -0
  57. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -0
  58. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +56 -0
  59. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -0
  60. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +107 -0
  61. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -0
  62. package/fesm2022/rt-tools-ui-kit-v2-field.mjs +183 -0
  63. package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -0
  64. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +219 -0
  65. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -0
  66. package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs +214 -0
  67. package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs.map +1 -0
  68. package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs +117 -0
  69. package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs.map +1 -0
  70. package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs +32 -0
  71. package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs.map +1 -0
  72. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +91 -0
  73. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -0
  74. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +220 -0
  75. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -0
  76. package/fesm2022/rt-tools-ui-kit-v2-header.mjs +72 -0
  77. package/fesm2022/rt-tools-ui-kit-v2-header.mjs.map +1 -0
  78. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +163 -0
  79. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -0
  80. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +674 -0
  81. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -0
  82. package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs +540 -0
  83. package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs.map +1 -0
  84. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +227 -0
  85. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -0
  86. package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs +37 -0
  87. package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs.map +1 -0
  88. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +361 -0
  89. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -0
  90. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +143 -0
  91. package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -0
  92. package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs +49 -0
  93. package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs.map +1 -0
  94. package/fesm2022/rt-tools-ui-kit-v2-logo.mjs +97 -0
  95. package/fesm2022/rt-tools-ui-kit-v2-logo.mjs.map +1 -0
  96. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs +57 -0
  97. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs.map +1 -0
  98. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +537 -0
  99. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -0
  100. package/fesm2022/rt-tools-ui-kit-v2-message.mjs +105 -0
  101. package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -0
  102. package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs +71 -0
  103. package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs.map +1 -0
  104. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +315 -0
  105. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -0
  106. package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs +51 -0
  107. package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs.map +1 -0
  108. package/fesm2022/rt-tools-ui-kit-v2-note.mjs +44 -0
  109. package/fesm2022/rt-tools-ui-kit-v2-note.mjs.map +1 -0
  110. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +54 -0
  111. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -0
  112. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +339 -0
  113. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -0
  114. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +187 -0
  115. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -0
  116. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs +170 -0
  117. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs.map +1 -0
  118. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs +312 -0
  119. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs.map +1 -0
  120. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +174 -0
  121. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -0
  122. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs +56 -0
  123. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs.map +1 -0
  124. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +96 -41
  125. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  126. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs +118 -0
  127. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs.map +1 -0
  128. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +290 -0
  129. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -0
  130. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +37 -0
  131. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -0
  132. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +495 -0
  133. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -0
  134. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +1493 -0
  135. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -0
  136. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs +49 -0
  137. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs.map +1 -0
  138. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs +123 -0
  139. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs.map +1 -0
  140. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs +70 -0
  141. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs.map +1 -0
  142. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs +92 -0
  143. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs.map +1 -0
  144. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +147 -0
  145. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -0
  146. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +117 -0
  147. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -0
  148. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +1636 -0
  149. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -0
  150. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +350 -0
  151. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -0
  152. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +122 -0
  153. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -0
  154. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +85 -0
  155. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -0
  156. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +73 -0
  157. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -0
  158. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +196 -0
  159. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -0
  160. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs +39 -0
  161. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs.map +1 -0
  162. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +338 -0
  163. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -0
  164. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +132 -0
  165. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -0
  166. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +162 -0
  167. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -0
  168. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +135 -0
  169. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -0
  170. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +214 -0
  171. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -0
  172. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs +64 -0
  173. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs.map +1 -0
  174. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +263 -0
  175. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -0
  176. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +296 -0
  177. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -0
  178. package/fesm2022/rt-tools-ui-kit-v2.mjs +91 -23164
  179. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  180. package/package.json +349 -1
  181. package/rt-tools-ui-kit-v2-0.18.0.tgz +0 -0
  182. package/src/lib/components/action-bar/CONTEXT.md +5 -0
  183. package/src/lib/components/action-bar/rt-action-bar.component.scss +30 -16
  184. package/src/lib/components/aside/CONTEXT.md +9 -1
  185. package/src/lib/components/aside/footer/rt-aside-footer.component.scss +7 -8
  186. package/src/lib/components/aside/header/rt-aside-header.component.scss +16 -1
  187. package/src/lib/components/aside/rt-aside.component.scss +17 -1
  188. package/src/lib/components/button/CONTEXT.md +12 -11
  189. package/src/lib/components/button/rt-button.directive.scss +36 -0
  190. package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +2 -2
  191. package/src/lib/components/data-table/cell/rt-data-table-cell.component.scss +1 -1
  192. package/src/lib/components/data-table/filter-cell/rt-data-table-filter-cell.component.scss +1 -1
  193. package/src/lib/components/data-table/rt-data-table.component.scss +1 -1
  194. package/src/lib/components/dialog/CONTEXT.md +9 -0
  195. package/src/lib/components/dialog/content/rt-dialog-content.component.scss +20 -0
  196. package/src/lib/components/dialog/footer/rt-dialog-footer.component.scss +18 -2
  197. package/src/lib/components/dialog/header/rt-dialog-header.component.scss +21 -3
  198. package/src/lib/components/dialog/rt-dialog.component.scss +9 -3
  199. package/src/lib/components/dot-field/CONTEXT.md +31 -0
  200. package/src/lib/components/dot-field/rt-dot-field.component.scss +20 -0
  201. package/src/lib/components/dot-field/stories/component/CONTEXT.md +14 -0
  202. package/src/lib/components/dot-field/stories/component/test-dot-field.component.scss +31 -0
  203. package/src/lib/components/dynamic-selector/CONTEXT.md +6 -0
  204. package/src/lib/components/field/CONTEXT.md +18 -2
  205. package/src/lib/components/header/CONTEXT.md +2 -2
  206. package/src/lib/components/icon/CONTEXT.md +11 -7
  207. package/src/lib/components/icon/rt-icon.component.scss +47 -0
  208. package/src/lib/components/icon-button/CONTEXT.md +27 -20
  209. package/src/lib/components/icon-button/rt-icon-button.component.scss +51 -25
  210. package/src/lib/components/image-upload/CONTEXT.md +20 -15
  211. package/src/lib/components/image-upload/rt-image-upload.component.scss +14 -2
  212. package/src/lib/components/pagination/rt-pagination.component.scss +1 -1
  213. package/src/lib/components/scroll-area/CONTEXT.md +2 -0
  214. package/src/lib/components/scroll-area/rt-scroll-area.component.scss +20 -3
  215. package/src/lib/components/select/rt-select.component.scss +4 -0
  216. package/src/lib/components/side-menu/CONTEXT.md +7 -2
  217. package/src/lib/components/spinner/CONTEXT.md +15 -8
  218. package/src/lib/components/spinner/rt-spinner.component.scss +108 -9
  219. package/src/lib/components/tag/rt-tag.component.scss +43 -23
  220. package/src/lib/components/toast/CONTEXT.md +8 -0
  221. package/src/lib/components/toast/rt-toast.component.scss +74 -15
  222. package/src/lib/components/toast/rt-toaster.component.scss +5 -1
  223. package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +35 -37
  224. package/src/lib/components/toggle-switch/CONTEXT.md +11 -3
  225. package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +53 -14
  226. package/src/lib/components/toolbar/rt-toolbar.component.scss +15 -4
  227. package/src/lib/components/tooltip/CONTEXT.md +5 -5
  228. package/src/rich-editor/lib/components/chat/CONTEXT.md +7 -2
  229. package/src/rich-editor/lib/components/chat/rt-chat.component.scss +25 -0
  230. package/src/styles/_semantic.scss +1 -1
  231. package/styles/tokens.css +43 -8
  232. package/types/rt-tools-ui-kit-v2-accordion.d.ts +30 -0
  233. package/types/rt-tools-ui-kit-v2-action-bar.d.ts +140 -0
  234. package/types/rt-tools-ui-kit-v2-aside-section.d.ts +25 -0
  235. package/types/rt-tools-ui-kit-v2-aside.d.ts +436 -0
  236. package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +78 -0
  237. package/types/rt-tools-ui-kit-v2-bar-list.d.ts +41 -0
  238. package/types/rt-tools-ui-kit-v2-bottom-sheet.d.ts +20 -0
  239. package/types/rt-tools-ui-kit-v2-button.d.ts +76 -0
  240. package/types/rt-tools-ui-kit-v2-calendar.d.ts +96 -0
  241. package/types/rt-tools-ui-kit-v2-card.d.ts +38 -0
  242. package/types/rt-tools-ui-kit-v2-checkbox.d.ts +46 -0
  243. package/types/rt-tools-ui-kit-v2-collapsible-text.d.ts +20 -0
  244. package/types/rt-tools-ui-kit-v2-confirm-popover.d.ts +85 -0
  245. package/types/rt-tools-ui-kit-v2-container.d.ts +425 -0
  246. package/types/rt-tools-ui-kit-v2-core.d.ts +1222 -0
  247. package/types/rt-tools-ui-kit-v2-counter-row.d.ts +22 -0
  248. package/types/rt-tools-ui-kit-v2-counter.d.ts +70 -0
  249. package/types/rt-tools-ui-kit-v2-data-list.d.ts +334 -0
  250. package/types/rt-tools-ui-kit-v2-data-table.d.ts +494 -0
  251. package/types/rt-tools-ui-kit-v2-date-picker.d.ts +181 -0
  252. package/types/rt-tools-ui-kit-v2-date-range.d.ts +98 -0
  253. package/types/rt-tools-ui-kit-v2-delta-view.d.ts +20 -0
  254. package/types/rt-tools-ui-kit-v2-detail-list.d.ts +33 -0
  255. package/types/rt-tools-ui-kit-v2-dialog.d.ts +287 -0
  256. package/types/rt-tools-ui-kit-v2-dot-field.d.ts +17 -0
  257. package/types/rt-tools-ui-kit-v2-download-link.d.ts +17 -0
  258. package/types/rt-tools-ui-kit-v2-dynamic-list.d.ts +139 -0
  259. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +384 -0
  260. package/types/rt-tools-ui-kit-v2-empty-state.d.ts +29 -0
  261. package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +57 -0
  262. package/types/rt-tools-ui-kit-v2-field.d.ts +82 -0
  263. package/types/rt-tools-ui-kit-v2-file-card.d.ts +114 -0
  264. package/types/rt-tools-ui-kit-v2-file-drop.d.ts +75 -0
  265. package/types/rt-tools-ui-kit-v2-file-input.d.ts +48 -0
  266. package/types/rt-tools-ui-kit-v2-file-list.d.ts +13 -0
  267. package/types/rt-tools-ui-kit-v2-filter-control.d.ts +72 -0
  268. package/types/rt-tools-ui-kit-v2-form-control.d.ts +74 -0
  269. package/types/rt-tools-ui-kit-v2-header.d.ts +40 -0
  270. package/types/rt-tools-ui-kit-v2-icon-button.d.ts +113 -0
  271. package/types/rt-tools-ui-kit-v2-icon.d.ts +238 -0
  272. package/types/rt-tools-ui-kit-v2-image-cropper.d.ts +168 -0
  273. package/types/rt-tools-ui-kit-v2-image-upload.d.ts +102 -0
  274. package/types/rt-tools-ui-kit-v2-info-item.d.ts +13 -0
  275. package/types/rt-tools-ui-kit-v2-input-number.d.ts +67 -0
  276. package/types/rt-tools-ui-kit-v2-input.d.ts +54 -0
  277. package/types/rt-tools-ui-kit-v2-live-badge.d.ts +23 -0
  278. package/types/rt-tools-ui-kit-v2-logo.d.ts +58 -0
  279. package/types/rt-tools-ui-kit-v2-markdown-text.d.ts +30 -0
  280. package/types/rt-tools-ui-kit-v2-menu.d.ts +217 -0
  281. package/types/rt-tools-ui-kit-v2-message.d.ts +56 -0
  282. package/types/rt-tools-ui-kit-v2-money-list.d.ts +34 -0
  283. package/types/rt-tools-ui-kit-v2-multiselect.d.ts +93 -0
  284. package/types/rt-tools-ui-kit-v2-night-grid.d.ts +39 -0
  285. package/types/rt-tools-ui-kit-v2-note.d.ts +21 -0
  286. package/types/rt-tools-ui-kit-v2-notifications-bell.d.ts +23 -0
  287. package/types/rt-tools-ui-kit-v2-page-header.d.ts +173 -0
  288. package/types/rt-tools-ui-kit-v2-pagination.d.ts +64 -0
  289. package/types/rt-tools-ui-kit-v2-photo-viewer.d.ts +98 -0
  290. package/types/rt-tools-ui-kit-v2-popover.d.ts +79 -0
  291. package/types/rt-tools-ui-kit-v2-radio-button.d.ts +61 -0
  292. package/types/rt-tools-ui-kit-v2-radius.d.ts +37 -0
  293. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +16 -20
  294. package/types/rt-tools-ui-kit-v2-ripple.d.ts +39 -0
  295. package/types/rt-tools-ui-kit-v2-scroll-area.d.ts +91 -0
  296. package/types/rt-tools-ui-kit-v2-section-nav.d.ts +23 -0
  297. package/types/rt-tools-ui-kit-v2-select.d.ts +215 -0
  298. package/types/rt-tools-ui-kit-v2-side-menu.d.ts +483 -0
  299. package/types/rt-tools-ui-kit-v2-skeleton-wrapper.d.ts +32 -0
  300. package/types/rt-tools-ui-kit-v2-skeleton.d.ts +41 -0
  301. package/types/rt-tools-ui-kit-v2-spinner.d.ts +56 -0
  302. package/types/rt-tools-ui-kit-v2-split-button.d.ts +72 -0
  303. package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +81 -0
  304. package/types/rt-tools-ui-kit-v2-stepper.d.ts +51 -0
  305. package/types/rt-tools-ui-kit-v2-table.d.ts +739 -0
  306. package/types/rt-tools-ui-kit-v2-tabs.d.ts +153 -0
  307. package/types/rt-tools-ui-kit-v2-tag.d.ts +70 -0
  308. package/types/rt-tools-ui-kit-v2-textarea.d.ts +36 -0
  309. package/types/rt-tools-ui-kit-v2-theme-toggle.d.ts +43 -0
  310. package/types/rt-tools-ui-kit-v2-thread-list.d.ts +111 -0
  311. package/types/rt-tools-ui-kit-v2-timeline.d.ts +35 -0
  312. package/types/rt-tools-ui-kit-v2-toast.d.ts +103 -0
  313. package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +109 -0
  314. package/types/rt-tools-ui-kit-v2-toggle-switch.d.ts +85 -0
  315. package/types/rt-tools-ui-kit-v2-toolbar.d.ts +66 -0
  316. package/types/rt-tools-ui-kit-v2-tooltip.d.ts +74 -0
  317. package/types/rt-tools-ui-kit-v2-welcome-dialog.d.ts +33 -0
  318. package/types/rt-tools-ui-kit-v2-workspace-details.d.ts +128 -0
  319. package/types/rt-tools-ui-kit-v2-workspace.d.ts +84 -0
  320. package/types/rt-tools-ui-kit-v2.d.ts +87 -9290
  321. package/rt-tools-ui-kit-v2-0.16.0.tgz +0 -0
@@ -0,0 +1,537 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, TemplateRef, Directive, ViewEncapsulation, ChangeDetectionStrategy, Component, ElementRef, DestroyRef, contentChild, computed, input, booleanAttribute, output, isDevMode, effect, viewChild, signal } from '@angular/core';
3
+ import { NgTemplateOutlet } from '@angular/common';
4
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
+ import { RouterLink } from '@angular/router';
6
+ import { Subject, mergeMap } from 'rxjs';
7
+ import { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';
8
+ import { RT_KIT_LABELS, rtKitLabel, carryThemeScope, materialPresetClassesOf } from '@rt-tools/ui-kit-v2/core';
9
+ import { RT_DIALOG_DATA, RtDialogRef, RtDialogComponent, RtDialogService } from '@rt-tools/ui-kit-v2/dialog';
10
+ import { materialPairOf, RtIconComponent } from '@rt-tools/ui-kit-v2/icon';
11
+ import * as i2 from '@rt-tools/ui-kit-v2/radius';
12
+ import { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';
13
+ import * as i1 from '@rt-tools/ui-kit-v2/tooltip';
14
+ import { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';
15
+ import { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';
16
+ import { FocusKeyManager } from '@angular/cdk/a11y';
17
+ import * as i1$1 from '@angular/cdk/overlay';
18
+ import { CdkConnectedOverlay, CdkOverlayOrigin, OverlayModule } from '@angular/cdk/overlay';
19
+ import { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';
20
+
21
+ /**
22
+ * Помечает `<ng-template>` своего значка пункта меню. Кит ставит содержимое на место значка
23
+ * `rt-menu-item__icon` его размером и цветом тона пункта — так приложение рисует значок, которого
24
+ * нет ни в наборе кита, ни в перечне имён Material. Свой значок сильнее `icon` и `glyph`.
25
+ *
26
+ * ```html
27
+ * <rt-menu-item label="Сделать активным">
28
+ * <ng-template rtMenuItemIcon><svg viewBox="0 0 24 24">…</svg></ng-template>
29
+ * </rt-menu-item>
30
+ * ```
31
+ */
32
+ class RtMenuItemIconDirective {
33
+ constructor() {
34
+ this.templateRef = inject(TemplateRef);
35
+ }
36
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtMenuItemIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
37
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: RtMenuItemIconDirective, isStandalone: true, selector: "ng-template[rtMenuItemIcon]", ngImport: i0 }); }
38
+ }
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtMenuItemIconDirective, decorators: [{
40
+ type: Directive,
41
+ args: [{
42
+ selector: 'ng-template[rtMenuItemIcon]',
43
+ }]
44
+ }] });
45
+
46
+ const BEM_BLOCK$2 = 'rt-menu-confirm-dialog';
47
+ /**
48
+ * Confirm-модалка деструктивного пункта `rt-menu-item`. Открывается через
49
+ * `RtDialogService` (центрированный overlay поверх меню), возвращает `true`
50
+ * при подтверждении и `false`/`undefined` при отмене.
51
+ *
52
+ * Модалка (а не popover-под-пунктом) нужна потому, что панель `rt-menu` сама
53
+ * живёт в CDK Overlay: вложенный popover-overlay конфликтовал бы с её
54
+ * backdrop/закрытием. Внутренний компонент — не экспортируется из `components`, это
55
+ * деталь реализации confirm-флоу пункта меню.
56
+ */
57
+ class RtMenuConfirmDialogComponent {
58
+ constructor() {
59
+ this.t = inject(RT_KIT_LABELS);
60
+ this.data = inject(RT_DIALOG_DATA);
61
+ this.#dialogRef = inject(RtDialogRef);
62
+ }
63
+ #dialogRef;
64
+ onConfirm() {
65
+ this.#dialogRef.close(true);
66
+ }
67
+ onCancel() {
68
+ this.#dialogRef.close(false);
69
+ }
70
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtMenuConfirmDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
71
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtMenuConfirmDialogComponent, isStandalone: true, selector: "rt-menu-confirm-dialog", host: { classAttribute: "rt-menu-confirm-dialog" }, ngImport: i0, template: "<rt-dialog width=\"360px\" [ariaLabel]=\"t().uiConfirmAction\">\n <div rtBlock=\"rt-menu-confirm-dialog\">\n <div rtElem=\"text\">\n @if (data.title; as title) {\n <h2 rtElem=\"title\" qa-dataid=\"menu-confirm-title\">{{ title }}</h2>\n }\n <p rtElem=\"message\" qa-dataid=\"menu-confirm-message\">{{ data.message }}</p>\n </div>\n <div rtElem=\"footer\">\n <!-- eslint-disable-next-line @angular-eslint/template/elements-content -->\n <button\n rtButton\n qa-dataid=\"menu-confirm-cancel\"\n type=\"button\"\n appearance=\"text\"\n theme=\"secondary\"\n [label]=\"data.cancelLabel\"\n (click)=\"onCancel()\"></button>\n <!-- eslint-disable-next-line @angular-eslint/template/elements-content -->\n <button\n rtButton\n qa-dataid=\"menu-confirm-accept\"\n type=\"button\"\n appearance=\"filled\"\n [label]=\"data.confirmLabel\"\n [theme]=\"data.tone\"\n (click)=\"onConfirm()\"></button>\n </div>\n </div>\n</rt-dialog>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-menu-confirm-dialog{display:flex;box-sizing:border-box;flex-direction:column;padding:var(--rt-space-xl);gap:var(--rt-space-lg)}.rt-menu-confirm-dialog__text{display:flex;flex-direction:column;gap:var(--rt-space-sm)}.rt-menu-confirm-dialog__title{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-md);font-weight:var(--rt-font-weight-bold)}.rt-menu-confirm-dialog__message{margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-menu-confirm-dialog__footer{display:flex;justify-content:flex-end;gap:var(--rt-space-sm)}}\n"], dependencies: [{ kind: "directive", type:
72
+ // standalone components / directives
73
+ RtButtonDirective, selector: "button[rtButton], a[rtButton]", inputs: ["label", "icon", "iconPos", "theme", "appearance", "size", "loading", "loadingIcon", "loadingLabel", "pressed"] }, { kind: "component", type: RtDialogComponent, selector: "rt-dialog", inputs: ["size", "width", "ariaLabel"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
74
+ }
75
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtMenuConfirmDialogComponent, decorators: [{
76
+ type: Component,
77
+ args: [{ selector: 'rt-menu-confirm-dialog', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
78
+ // standalone components / directives
79
+ RtButtonDirective,
80
+ RtDialogComponent,
81
+ BlockDirective,
82
+ ElemDirective,
83
+ ], host: {
84
+ class: BEM_BLOCK$2,
85
+ }, template: "<rt-dialog width=\"360px\" [ariaLabel]=\"t().uiConfirmAction\">\n <div rtBlock=\"rt-menu-confirm-dialog\">\n <div rtElem=\"text\">\n @if (data.title; as title) {\n <h2 rtElem=\"title\" qa-dataid=\"menu-confirm-title\">{{ title }}</h2>\n }\n <p rtElem=\"message\" qa-dataid=\"menu-confirm-message\">{{ data.message }}</p>\n </div>\n <div rtElem=\"footer\">\n <!-- eslint-disable-next-line @angular-eslint/template/elements-content -->\n <button\n rtButton\n qa-dataid=\"menu-confirm-cancel\"\n type=\"button\"\n appearance=\"text\"\n theme=\"secondary\"\n [label]=\"data.cancelLabel\"\n (click)=\"onCancel()\"></button>\n <!-- eslint-disable-next-line @angular-eslint/template/elements-content -->\n <button\n rtButton\n qa-dataid=\"menu-confirm-accept\"\n type=\"button\"\n appearance=\"filled\"\n [label]=\"data.confirmLabel\"\n [theme]=\"data.tone\"\n (click)=\"onConfirm()\"></button>\n </div>\n </div>\n</rt-dialog>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-menu-confirm-dialog{display:flex;box-sizing:border-box;flex-direction:column;padding:var(--rt-space-xl);gap:var(--rt-space-lg)}.rt-menu-confirm-dialog__text{display:flex;flex-direction:column;gap:var(--rt-space-sm)}.rt-menu-confirm-dialog__title{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-md);font-weight:var(--rt-font-weight-bold)}.rt-menu-confirm-dialog__message{margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-menu-confirm-dialog__footer{display:flex;justify-content:flex-end;gap:var(--rt-space-sm)}}\n"] }]
86
+ }] });
87
+
88
+ /** Значок пункта: свой `icon`, а без него — пара имени Material из перечня кита. */
89
+ function menuItemIconName(icon, glyph) {
90
+ if (icon !== null) {
91
+ return icon;
92
+ }
93
+ return materialPairOf(glyph);
94
+ }
95
+ /**
96
+ * Имя Material, о котором пункт должен предупредить: у него нет пары в перечне кита, а ни `icon`,
97
+ * ни своего значка нет. Тогда пункт рисуется без значка, и без предупреждения пропуск не заметен.
98
+ * `null` — предупреждать не о чем.
99
+ */
100
+ function unpairedGlyph(icon, glyph, hasOwnIcon) {
101
+ if (!glyph || hasOwnIcon || menuItemIconName(icon, glyph) !== null) {
102
+ return null;
103
+ }
104
+ return glyph;
105
+ }
106
+
107
+ /**
108
+ * Имя DOM-события, которое `rt-menu-item` всплывающе диспатчит при выборе пункта.
109
+ * `rt-menu` слушает его на панели и закрывается. DOM-событие (а не DI/output)
110
+ * нужно потому, что пункты проецируются в overlay-панель — всплытие через DOM
111
+ * переживает границы content-projection и overlay-контейнера.
112
+ */
113
+ const RT_MENU_SELECT_EVENT = 'rtMenuSelect';
114
+
115
+ const BEM_BLOCK$1 = 'rt-menu-item';
116
+ /**
117
+ * Пункт меню `rt-menu`: иконка (опц.) + лейбл. Кликабелен и активируется с
118
+ * клавиатуры (Enter/Space). Выбор пункта эмитит `(selected)` для потребителя
119
+ * и всплывающе диспатчит DOM-событие `rtMenuSelect`, по которому `rt-menu`
120
+ * закрывается. `disabled` блокирует и `(selected)`, и закрытие.
121
+ *
122
+ * Tooltip — через host-директиву `RtTooltipDirective` (`tooltip` маппится в
123
+ * `rtTooltip`): полезно показать причину недоступности на `disabled`-пункте.
124
+ *
125
+ * Деструктивный пункт может требовать подтверждения: задайте `confirmMessage`
126
+ * (опц. `confirmTitle` / `confirmLabel` / `confirmTone`) — тогда по выбору
127
+ * сперва открывается центрированная confirm-модалка, и `(selected)` эмитится
128
+ * только после подтверждения. Модалка (а не popover) нужна потому, что панель
129
+ * `rt-menu` сама в CDK Overlay; меню остаётся открытым под backdrop'ом, пока
130
+ * пользователь решает.
131
+ *
132
+ * `ViewEncapsulation.None`; стили префиксованы `.rt-menu-item`. Host несёт
133
+ * BEM-класс блока (template-`<ng-container rtBlock>` даёт контекст для `rtElem`,
134
+ * но класс на comment-node не вешает — см. host-class паттерн rt-icon-button).
135
+ */
136
+ class RtMenuItemComponent {
137
+ #elementRef;
138
+ #dialogService;
139
+ #destroyRef;
140
+ #confirmRequestSource;
141
+ #t_uiConfirm;
142
+ #t_uiCancel;
143
+ constructor() {
144
+ this.#elementRef = inject(ElementRef);
145
+ this.#dialogService = inject(RtDialogService);
146
+ this.#destroyRef = inject(DestroyRef);
147
+ this.#confirmRequestSource = new Subject();
148
+ this.#t_uiConfirm = rtKitLabel('uiConfirm');
149
+ this.#t_uiCancel = rtKitLabel('uiCancel');
150
+ /** Свой значок приложения — `<ng-template rtMenuItemIcon>` внутри пункта. */
151
+ this.ownIcon = contentChild(RtMenuItemIconDirective, /* @ts-ignore */
152
+ ...(ngDevMode ? [{ debugName: "ownIcon" }] : /* istanbul ignore next */ []));
153
+ /** Значок пункта: свой `icon`, а без него — пара имени Material из перечня кита. */
154
+ this.iconName = computed(() => menuItemIconName(this.icon(), this.glyph()), /* @ts-ignore */
155
+ ...(ngDevMode ? [{ debugName: "iconName" }] : /* istanbul ignore next */ []));
156
+ /** Пункт — ссылка: задан `link`. Роль пункта меню и фокус тогда несёт ссылка внутри. */
157
+ this.isLink = computed(() => this.link() !== null, /* @ts-ignore */
158
+ ...(ngDevMode ? [{ debugName: "isLink" }] : /* istanbul ignore next */ []));
159
+ /** Адрес для ссылки: у недоступного пункта его нет, и ссылка не переходит. */
160
+ this.linkTarget = computed(() => this.disabled() ? null : this.link(), /* @ts-ignore */
161
+ ...(ngDevMode ? [{ debugName: "linkTarget" }] : /* istanbul ignore next */ []));
162
+ /** Иконка слева от лейбла. `null` — без иконки. */
163
+ this.icon = input(null, /* @ts-ignore */
164
+ ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
165
+ /** Текст пункта. */
166
+ this.label = input('', /* @ts-ignore */
167
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
168
+ /** Деструктивный пункт (например «Удалить») — красный текст/иконка. */
169
+ this.danger = input(false, { ...(ngDevMode ? { debugName: "danger" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
170
+ /** Пункт-согласие (например «Принять») — зелёный текст и иконка, как тон `success` пунктов первого кита. */
171
+ this.success = input(false, { ...(ngDevMode ? { debugName: "success" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
172
+ /**
173
+ * Имя значка Material, как его пишет пункт меню первого кита (`check_circle`). Рисует его набор
174
+ * кита через перечень соответствий; `icon` сильнее, а имя без пары рисует пункт без значка.
175
+ */
176
+ this.glyph = input(null, /* @ts-ignore */
177
+ ...(ngDevMode ? [{ debugName: "glyph" }] : /* istanbul ignore next */ []));
178
+ /**
179
+ * Залитый значок вместо контурного — как значки пунктов меню первого кита. Уходит в `fill`
180
+ * значка: действует в материальном наборе, свой набор рисует значок одним рисунком. Свой
181
+ * значок `rtMenuItemIcon` приложение рисует само, и заливка его не касается.
182
+ */
183
+ this.fill = input(false, { ...(ngDevMode ? { debugName: "fill" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
184
+ /** Пункт — нынешнее значение выбора, который открыл меню: подсвечен фоном и объявлен скринридеру. */
185
+ this.current = input(false, { ...(ngDevMode ? { debugName: "current" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
186
+ /** Недоступный пункт — приглушён, не эмитит `(selected)` и не закрывает меню. */
187
+ this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
188
+ /**
189
+ * Текст confirm-модалки. Непустое значение включает подтверждение: по выбору
190
+ * пункта открывается модалка, и `(selected)` эмитится только после согласия.
191
+ */
192
+ this.confirmMessage = input('', /* @ts-ignore */
193
+ ...(ngDevMode ? [{ debugName: "confirmMessage" }] : /* istanbul ignore next */ []));
194
+ /** Заголовок confirm-модалки (опц.). */
195
+ this.confirmTitle = input(null, /* @ts-ignore */
196
+ ...(ngDevMode ? [{ debugName: "confirmTitle" }] : /* istanbul ignore next */ []));
197
+ /** Лейбл подтверждающей кнопки в модалке. */
198
+ /** Пусто — берётся переведённая подпись по умолчанию */
199
+ this.confirmLabel = input('', /* @ts-ignore */
200
+ ...(ngDevMode ? [{ debugName: "confirmLabel" }] : /* istanbul ignore next */ []));
201
+ /** Лейбл кнопки отмены в модалке. */
202
+ this.confirmCancelLabel = input('', /* @ts-ignore */
203
+ ...(ngDevMode ? [{ debugName: "confirmCancelLabel" }] : /* istanbul ignore next */ []));
204
+ /** Тон подтверждающей кнопки в модалке. */
205
+ this.confirmTone = input('danger', /* @ts-ignore */
206
+ ...(ngDevMode ? [{ debugName: "confirmTone" }] : /* istanbul ignore next */ []));
207
+ /**
208
+ * Команды маршрута приложения, как у `routerLink`. Задан — пункт рисует ссылку с `href`: Enter и
209
+ * клик переходят по ней, а Ctrl/Cmd-click, Shift-click и средняя кнопка открывают новую вкладку
210
+ * или окно силами браузера. Меню закрывается во всех этих случаях; подтверждение не спрашивается.
211
+ */
212
+ this.link = input(null, /* @ts-ignore */
213
+ ...(ngDevMode ? [{ debugName: "link" }] : /* istanbul ignore next */ []));
214
+ /** Пункт выбран (клик/Enter/Space и не `disabled`; после подтверждения, если задано). */
215
+ this.selected = output();
216
+ // Имя Material без пары рисует пункт без значка, и пропуск без предупреждения не заметен.
217
+ if (isDevMode()) {
218
+ effect(() => {
219
+ const glyph = unpairedGlyph(this.icon(), this.glyph(), this.ownIcon() !== undefined);
220
+ if (glyph !== null) {
221
+ // eslint-disable-next-line no-console -- предупреждение разработчику приложения: другого канала у кита нет
222
+ console.warn(`rt-menu-item «${this.label()}»: у значка Material «${glyph}» нет пары в перечне кита. ` +
223
+ 'Задайте icon или свой значок через <ng-template rtMenuItemIcon>.');
224
+ }
225
+ });
226
+ }
227
+ // Подписка на результат confirm-модалки объявлена один раз: #openConfirm
228
+ // эмитит данные модалки, mergeMap открывает её и ждёт afterClosed()
229
+ // (одноразовый стрим — комплитится при закрытии модалки).
230
+ this.#confirmRequestSource
231
+ .pipe(mergeMap((data) => this.#dialogService
232
+ .open(RtMenuConfirmDialogComponent, { data })
233
+ .afterClosed()), takeUntilDestroyed(this.#destroyRef))
234
+ .subscribe((confirmed = false) => {
235
+ if (confirmed === true) {
236
+ this.#commitSelection();
237
+ }
238
+ });
239
+ }
240
+ onActivate(event) {
241
+ if (this.disabled()) {
242
+ // Гасим, чтобы клик по disabled-пункту не «протёк» наружу.
243
+ event.stopPropagation();
244
+ event.preventDefault();
245
+ return;
246
+ }
247
+ const message = this.confirmMessage().trim();
248
+ if (message !== '' && !this.isLink()) {
249
+ // Не закрываем меню сразу: оно остаётся открытым под backdrop'ом
250
+ // модалки, чтобы пункт пережил решение пользователя (отмена → меню
251
+ // снова видно). Подтверждение коммитит выбор.
252
+ this.#openConfirm(message);
253
+ return;
254
+ }
255
+ this.#commitSelection();
256
+ }
257
+ onKey(event) {
258
+ if (this.isLink()) {
259
+ this.#onLinkKey(event);
260
+ return;
261
+ }
262
+ // Space иначе проскроллит страницу — гасим дефолт перед активацией.
263
+ event.preventDefault();
264
+ this.onActivate(event);
265
+ }
266
+ /** Средняя кнопка не даёт `click`: вкладку открывает браузер, а меню закрываем сами. */
267
+ onAuxClick(event) {
268
+ if (this.isLink() && event.button === 1 && !this.disabled()) {
269
+ this.#commitSelection();
270
+ }
271
+ }
272
+ /**
273
+ * Enter на ссылке браузер сам превращает в `click`, и переход делает `routerLink`. Пробел ссылка
274
+ * не нажимает — его переводим в тот же `click`, погасив прокрутку страницы.
275
+ */
276
+ #onLinkKey(event) {
277
+ if (event instanceof KeyboardEvent && event.key === ' ') {
278
+ event.preventDefault();
279
+ this.#elementRef.nativeElement.querySelector('a')?.click();
280
+ }
281
+ }
282
+ #openConfirm(message) {
283
+ const data = {
284
+ message,
285
+ title: this.confirmTitle(),
286
+ confirmLabel: this.confirmLabel() || this.#t_uiConfirm(),
287
+ cancelLabel: this.confirmCancelLabel() || this.#t_uiCancel(),
288
+ tone: this.confirmTone(),
289
+ };
290
+ // Открытие модалки и подписка на результат — в конструкторном стриме
291
+ // (см. #confirmRequestSource); здесь только эмит данных модалки.
292
+ this.#confirmRequestSource.next(data);
293
+ }
294
+ #commitSelection() {
295
+ this.selected.emit();
296
+ // Закрыть родительское меню: событие всплывает к панели rt-menu в overlay.
297
+ this.#elementRef.nativeElement.dispatchEvent(new CustomEvent(RT_MENU_SELECT_EVENT, { bubbles: true }));
298
+ }
299
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtMenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
300
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtMenuItemComponent, isStandalone: true, selector: "rt-menu-item", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, danger: { classPropertyName: "danger", publicName: "danger", isSignal: true, isRequired: false, transformFunction: null }, success: { classPropertyName: "success", publicName: "success", isSignal: true, isRequired: false, transformFunction: null }, glyph: { classPropertyName: "glyph", publicName: "glyph", isSignal: true, isRequired: false, transformFunction: null }, fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null }, current: { classPropertyName: "current", publicName: "current", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, confirmMessage: { classPropertyName: "confirmMessage", publicName: "confirmMessage", isSignal: true, isRequired: false, transformFunction: null }, confirmTitle: { classPropertyName: "confirmTitle", publicName: "confirmTitle", isSignal: true, isRequired: false, transformFunction: null }, confirmLabel: { classPropertyName: "confirmLabel", publicName: "confirmLabel", isSignal: true, isRequired: false, transformFunction: null }, confirmCancelLabel: { classPropertyName: "confirmCancelLabel", publicName: "confirmCancelLabel", isSignal: true, isRequired: false, transformFunction: null }, confirmTone: { classPropertyName: "confirmTone", publicName: "confirmTone", isSignal: true, isRequired: false, transformFunction: null }, link: { classPropertyName: "link", publicName: "link", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selected" }, host: { listeners: { "click": "onActivate($event)", "auxclick": "onAuxClick($event)", "keydown.enter": "onKey($event)", "keydown.space": "onKey($event)" }, properties: { "attr.role": "isLink() ? 'none' : 'menuitem'", "class.rt-menu-item--danger": "danger()", "class.rt-menu-item--success": "success()", "class.rt-menu-item--disabled": "disabled()", "class.rt-menu-item--current": "current()", "class.rt-menu-item--link": "isLink()", "attr.aria-current": "current() && !isLink() ? 'true' : null", "attr.aria-disabled": "disabled() && !isLink() ? 'true' : null", "attr.tabindex": "disabled() || isLink() ? null : 0" }, classAttribute: "rt-menu-item" }, queries: [{ propertyName: "ownIcon", first: true, predicate: RtMenuItemIconDirective, descendants: true, isSignal: true }], hostDirectives: [{ directive: i1.RtTooltipDirective, inputs: ["rtTooltip", "tooltip"] }, { directive: i2.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<ng-container rtBlock=\"rt-menu-item\">\n @if (isLink()) {\n <a\n rtElem=\"link\"\n role=\"menuitem\"\n qa-dataid=\"menu-item-link\"\n [routerLink]=\"linkTarget()\"\n [attr.aria-current]=\"current() ? 'true' : null\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\"\n [attr.tabindex]=\"disabled() ? null : 0\">\n <ng-container [ngTemplateOutlet]=\"content\" />\n </a>\n } @else {\n <ng-container [ngTemplateOutlet]=\"content\" />\n }\n\n <ng-template #content>\n @if (ownIcon(); as own) {\n <span rtElem=\"icon\" qa-dataid=\"menu-item-own-icon\" aria-hidden=\"true\" [rtMod]=\"{ own: true }\">\n <ng-container [ngTemplateOutlet]=\"own.templateRef\" />\n </span>\n } @else if (iconName(); as name) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"name\" [fill]=\"fill()\" />\n }\n\n <span rtElem=\"label\" qa-dataid=\"menu-item-label\">{{ label() }}</span>\n </ng-template>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-menu-item{--rt-menu-item-radius: var(--rt-radius-sm);--rt-menu-item-transition-duration: var(--rt-duration-fast);--rt-menu-item-weight: var(--rt-overlay-menu-item-weight);--rt-menu-item-danger-color: var(--rt-overlay-menu-danger-color);--rt-menu-item-current-bg: var(--rt-overlay-menu-current-bg);--rt-menu-item-min-height: var(--rt-overlay-menu-item-min-height);--rt-menu-item-padding-y: var(--rt-overlay-menu-item-padding-y);--rt-menu-item-padding-x: var(--rt-overlay-menu-item-padding-x);--rt-menu-item-icon-size: var(--rt-overlay-menu-item-icon-size);--rt-menu-item-danger-label-color: var(--rt-overlay-menu-danger-label-color);--rt-menu-item-success-color: var(--rt-color-state-success-text);display:flex;width:100%;min-height:var(--rt-menu-item-min-height);box-sizing:border-box;align-items:center;padding:var(--rt-menu-item-padding-y) var(--rt-menu-item-padding-x);border-radius:var(--rt-menu-item-radius);color:var(--rt-color-text-primary);cursor:pointer;font-size:var(--rt-text-sm);font-weight:var(--rt-menu-item-weight);gap:var(--rt-space-sm);text-align:start;transition:background-color var(--rt-menu-item-transition-duration) ease}.rt-menu-item:hover{background:var(--rt-color-bg-hover)}.rt-menu-item:focus-visible{background:var(--rt-color-bg-hover);outline:none}.rt-menu-item__icon{min-width:var(--rt-menu-item-icon-size);max-width:var(--rt-menu-item-icon-size);min-height:var(--rt-menu-item-icon-size);max-height:var(--rt-menu-item-icon-size);flex-shrink:0;color:var(--rt-color-text-muted)}.rt-menu-item__icon--own{display:inline-flex;width:var(--rt-menu-item-icon-size);height:var(--rt-menu-item-icon-size);align-items:center;justify-content:center;font-size:var(--rt-menu-item-icon-size);line-height:1}.rt-menu-item__icon--own>*{max-width:100%;max-height:100%}.rt-menu-item__label{flex:1 1 auto;white-space:nowrap}.rt-menu-item--link{padding:0}.rt-menu-item__link{display:flex;min-width:0;min-height:var(--rt-menu-item-min-height);box-sizing:border-box;flex:1 1 auto;align-items:center;padding:var(--rt-menu-item-padding-y) var(--rt-menu-item-padding-x);border-radius:var(--rt-menu-item-radius);color:inherit;gap:var(--rt-space-sm);text-decoration:none}.rt-menu-item__link:focus-visible{background:var(--rt-color-bg-hover);outline:none}.rt-menu-item--current{background:var(--rt-menu-item-current-bg)}.rt-menu-item--danger{color:var(--rt-menu-item-danger-label-color)}.rt-menu-item--danger .rt-menu-item__icon{color:var(--rt-menu-item-danger-color)}.rt-menu-item--success,.rt-menu-item--success .rt-menu-item__icon{color:var(--rt-menu-item-success-color)}.rt-menu-item--disabled{color:var(--rt-color-text-muted);cursor:default;opacity:.5}.rt-menu-item--disabled:hover{background:transparent}.rt-menu-item[data-rt-radius=none]{--rt-menu-item-radius: var(--rt-radius-none)}.rt-menu-item[data-rt-radius=xs]{--rt-menu-item-radius: var(--rt-radius-xs)}.rt-menu-item[data-rt-radius=sm]{--rt-menu-item-radius: var(--rt-radius-sm)}.rt-menu-item[data-rt-radius=ms]{--rt-menu-item-radius: var(--rt-radius-ms)}.rt-menu-item[data-rt-radius=md]{--rt-menu-item-radius: var(--rt-radius-md)}.rt-menu-item[data-rt-radius=lg]{--rt-menu-item-radius: var(--rt-radius-lg)}.rt-menu-item[data-rt-radius=xl]{--rt-menu-item-radius: var(--rt-radius-xl)}.rt-menu-item[data-rt-radius=\"2xl\"]{--rt-menu-item-radius: var(--rt-radius-2xl)}.rt-menu-item[data-rt-radius=full]{--rt-menu-item-radius: var(--rt-radius-full)}}\n"], dependencies: [{ kind: "component", type:
301
+ // standalone components / directives
302
+ RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "size", "color", "fill", "spin", "rotate"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
303
+ }
304
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtMenuItemComponent, decorators: [{
305
+ type: Component,
306
+ args: [{ selector: 'rt-menu-item', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
307
+ // standalone components / directives
308
+ RtIconComponent,
309
+ BlockDirective,
310
+ ElemDirective,
311
+ ModDirective,
312
+ NgTemplateOutlet,
313
+ RouterLink,
314
+ ], hostDirectives: [
315
+ {
316
+ directive: RtTooltipDirective,
317
+ inputs: ['rtTooltip: tooltip'],
318
+ },
319
+ { directive: RtRadiusDirective, inputs: ['radius'] },
320
+ ], host: {
321
+ class: BEM_BLOCK$1,
322
+ '[attr.role]': "isLink() ? 'none' : 'menuitem'",
323
+ '[class.rt-menu-item--danger]': 'danger()',
324
+ '[class.rt-menu-item--success]': 'success()',
325
+ '[class.rt-menu-item--disabled]': 'disabled()',
326
+ '[class.rt-menu-item--current]': 'current()',
327
+ '[class.rt-menu-item--link]': 'isLink()',
328
+ '[attr.aria-current]': "current() && !isLink() ? 'true' : null",
329
+ '[attr.aria-disabled]': "disabled() && !isLink() ? 'true' : null",
330
+ '[attr.tabindex]': 'disabled() || isLink() ? null : 0',
331
+ '(click)': 'onActivate($event)',
332
+ '(auxclick)': 'onAuxClick($event)',
333
+ '(keydown.enter)': 'onKey($event)',
334
+ '(keydown.space)': 'onKey($event)',
335
+ }, template: "<ng-container rtBlock=\"rt-menu-item\">\n @if (isLink()) {\n <a\n rtElem=\"link\"\n role=\"menuitem\"\n qa-dataid=\"menu-item-link\"\n [routerLink]=\"linkTarget()\"\n [attr.aria-current]=\"current() ? 'true' : null\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\"\n [attr.tabindex]=\"disabled() ? null : 0\">\n <ng-container [ngTemplateOutlet]=\"content\" />\n </a>\n } @else {\n <ng-container [ngTemplateOutlet]=\"content\" />\n }\n\n <ng-template #content>\n @if (ownIcon(); as own) {\n <span rtElem=\"icon\" qa-dataid=\"menu-item-own-icon\" aria-hidden=\"true\" [rtMod]=\"{ own: true }\">\n <ng-container [ngTemplateOutlet]=\"own.templateRef\" />\n </span>\n } @else if (iconName(); as name) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"name\" [fill]=\"fill()\" />\n }\n\n <span rtElem=\"label\" qa-dataid=\"menu-item-label\">{{ label() }}</span>\n </ng-template>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-menu-item{--rt-menu-item-radius: var(--rt-radius-sm);--rt-menu-item-transition-duration: var(--rt-duration-fast);--rt-menu-item-weight: var(--rt-overlay-menu-item-weight);--rt-menu-item-danger-color: var(--rt-overlay-menu-danger-color);--rt-menu-item-current-bg: var(--rt-overlay-menu-current-bg);--rt-menu-item-min-height: var(--rt-overlay-menu-item-min-height);--rt-menu-item-padding-y: var(--rt-overlay-menu-item-padding-y);--rt-menu-item-padding-x: var(--rt-overlay-menu-item-padding-x);--rt-menu-item-icon-size: var(--rt-overlay-menu-item-icon-size);--rt-menu-item-danger-label-color: var(--rt-overlay-menu-danger-label-color);--rt-menu-item-success-color: var(--rt-color-state-success-text);display:flex;width:100%;min-height:var(--rt-menu-item-min-height);box-sizing:border-box;align-items:center;padding:var(--rt-menu-item-padding-y) var(--rt-menu-item-padding-x);border-radius:var(--rt-menu-item-radius);color:var(--rt-color-text-primary);cursor:pointer;font-size:var(--rt-text-sm);font-weight:var(--rt-menu-item-weight);gap:var(--rt-space-sm);text-align:start;transition:background-color var(--rt-menu-item-transition-duration) ease}.rt-menu-item:hover{background:var(--rt-color-bg-hover)}.rt-menu-item:focus-visible{background:var(--rt-color-bg-hover);outline:none}.rt-menu-item__icon{min-width:var(--rt-menu-item-icon-size);max-width:var(--rt-menu-item-icon-size);min-height:var(--rt-menu-item-icon-size);max-height:var(--rt-menu-item-icon-size);flex-shrink:0;color:var(--rt-color-text-muted)}.rt-menu-item__icon--own{display:inline-flex;width:var(--rt-menu-item-icon-size);height:var(--rt-menu-item-icon-size);align-items:center;justify-content:center;font-size:var(--rt-menu-item-icon-size);line-height:1}.rt-menu-item__icon--own>*{max-width:100%;max-height:100%}.rt-menu-item__label{flex:1 1 auto;white-space:nowrap}.rt-menu-item--link{padding:0}.rt-menu-item__link{display:flex;min-width:0;min-height:var(--rt-menu-item-min-height);box-sizing:border-box;flex:1 1 auto;align-items:center;padding:var(--rt-menu-item-padding-y) var(--rt-menu-item-padding-x);border-radius:var(--rt-menu-item-radius);color:inherit;gap:var(--rt-space-sm);text-decoration:none}.rt-menu-item__link:focus-visible{background:var(--rt-color-bg-hover);outline:none}.rt-menu-item--current{background:var(--rt-menu-item-current-bg)}.rt-menu-item--danger{color:var(--rt-menu-item-danger-label-color)}.rt-menu-item--danger .rt-menu-item__icon{color:var(--rt-menu-item-danger-color)}.rt-menu-item--success,.rt-menu-item--success .rt-menu-item__icon{color:var(--rt-menu-item-success-color)}.rt-menu-item--disabled{color:var(--rt-color-text-muted);cursor:default;opacity:.5}.rt-menu-item--disabled:hover{background:transparent}.rt-menu-item[data-rt-radius=none]{--rt-menu-item-radius: var(--rt-radius-none)}.rt-menu-item[data-rt-radius=xs]{--rt-menu-item-radius: var(--rt-radius-xs)}.rt-menu-item[data-rt-radius=sm]{--rt-menu-item-radius: var(--rt-radius-sm)}.rt-menu-item[data-rt-radius=ms]{--rt-menu-item-radius: var(--rt-radius-ms)}.rt-menu-item[data-rt-radius=md]{--rt-menu-item-radius: var(--rt-radius-md)}.rt-menu-item[data-rt-radius=lg]{--rt-menu-item-radius: var(--rt-radius-lg)}.rt-menu-item[data-rt-radius=xl]{--rt-menu-item-radius: var(--rt-radius-xl)}.rt-menu-item[data-rt-radius=\"2xl\"]{--rt-menu-item-radius: var(--rt-radius-2xl)}.rt-menu-item[data-rt-radius=full]{--rt-menu-item-radius: var(--rt-radius-full)}}\n"] }]
336
+ }], ctorParameters: () => [], propDecorators: { ownIcon: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtMenuItemIconDirective), { isSignal: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], danger: [{ type: i0.Input, args: [{ isSignal: true, alias: "danger", required: false }] }], success: [{ type: i0.Input, args: [{ isSignal: true, alias: "success", required: false }] }], glyph: [{ type: i0.Input, args: [{ isSignal: true, alias: "glyph", required: false }] }], fill: [{ type: i0.Input, args: [{ isSignal: true, alias: "fill", required: false }] }], current: [{ type: i0.Input, args: [{ isSignal: true, alias: "current", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], confirmMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmMessage", required: false }] }], confirmTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmTitle", required: false }] }], confirmLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmLabel", required: false }] }], confirmCancelLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmCancelLabel", required: false }] }], confirmTone: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmTone", required: false }] }], link: [{ type: i0.Input, args: [{ isSignal: true, alias: "link", required: false }] }], selected: [{ type: i0.Output, args: ["selected"] }] } });
337
+
338
+ const BEM_BLOCK = 'rt-menu';
339
+ const POSITION_BELOW_END = {
340
+ originX: 'end',
341
+ originY: 'bottom',
342
+ overlayX: 'end',
343
+ overlayY: 'top',
344
+ offsetY: 4,
345
+ };
346
+ const POSITION_ABOVE_END = {
347
+ originX: 'end',
348
+ originY: 'top',
349
+ overlayX: 'end',
350
+ overlayY: 'bottom',
351
+ offsetY: -4,
352
+ };
353
+ const POSITION_BELOW_START = {
354
+ originX: 'start',
355
+ originY: 'bottom',
356
+ overlayX: 'start',
357
+ overlayY: 'top',
358
+ offsetY: 4,
359
+ };
360
+ const POSITION_ABOVE_START = {
361
+ originX: 'start',
362
+ originY: 'top',
363
+ overlayX: 'start',
364
+ overlayY: 'bottom',
365
+ offsetY: -4,
366
+ };
367
+ /**
368
+ * Dropdown-меню действий: icon-only триггер «…» + плавающая панель с пунктами
369
+ * `rt-menu-item`, спроецированными через `<ng-content>`. Типовое применение —
370
+ * per-row действия в конце строки `rt-table` (см. `[showRowActions]`).
371
+ *
372
+ * Движок — CDK `cdkConnectedOverlay` с прозрачным backdrop: авто-flip у края
373
+ * viewport (4 fallback-позиции), backdrop-click и `(detach)` закрывают, Escape
374
+ * закрывает через `(overlayKeydown)`. Панель не режется `overflow: hidden`
375
+ * предками (таблицы, карточки), т.к. рендерится в overlay-контейнере.
376
+ *
377
+ * Выбор пункта закрывает меню: `rt-menu-item` всплывающе диспатчит DOM-событие
378
+ * `rtMenuSelect`, которое панель ловит, — это переживает content-projection.
379
+ *
380
+ * @example
381
+ * ```html
382
+ * <rt-menu ariaLabel="Действия">
383
+ * <rt-menu-item icon="ico-edit" label="Редактировать" (selected)="edit()" />
384
+ * <rt-menu-item icon="ico-trash" label="Удалить" danger (selected)="remove()" />
385
+ * </rt-menu>
386
+ * ```
387
+ */
388
+ class RtMenuComponent {
389
+ constructor() {
390
+ this.#host = inject(ElementRef);
391
+ this.#t_uiActions = rtKitLabel('uiActions');
392
+ /** Ход стрелками по пунктам открытой панели; у закрытой его нет. */
393
+ this.#keyManager = null;
394
+ this.overlay = viewChild.required(CdkConnectedOverlay, /* @ts-ignore */
395
+ ...(ngDevMode ? [{ debugName: "overlay" }] : /* istanbul ignore next */ []));
396
+ this.trigger = viewChild.required(CdkOverlayOrigin, /* @ts-ignore */
397
+ ...(ngDevMode ? [{ debugName: "trigger" }] : /* istanbul ignore next */ []));
398
+ this.isOpen = signal(false, /* @ts-ignore */
399
+ ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
400
+ /** Класс набора, найденный над меню при открытии: панель лежит вне контейнера с признаком. */
401
+ this.presetClasses = signal([], /* @ts-ignore */
402
+ ...(ngDevMode ? [{ debugName: "presetClasses" }] : /* istanbul ignore next */ []));
403
+ /** Классы панели: заданные входом и класс набора. */
404
+ this.panelClasses = computed(() => {
405
+ const own = this.panelClass();
406
+ return [...(Array.isArray(own) ? own : own.split(/\s+/).filter(Boolean)), ...this.presetClasses()];
407
+ }, /* @ts-ignore */
408
+ ...(ngDevMode ? [{ debugName: "panelClasses" }] : /* istanbul ignore next */ []));
409
+ this.ariaText = computed(() => this.ariaLabel() || this.#t_uiActions(), /* @ts-ignore */
410
+ ...(ngDevMode ? [{ debugName: "ariaText" }] : /* istanbul ignore next */ []));
411
+ /** Fallback-цепочка позиций панели: первой идёт сторона по `align`. */
412
+ this.overlayPositions = computed(() => this.align() === 'end'
413
+ ? [POSITION_BELOW_END, POSITION_ABOVE_END, POSITION_BELOW_START, POSITION_ABOVE_START]
414
+ : [POSITION_BELOW_START, POSITION_ABOVE_START, POSITION_BELOW_END, POSITION_ABOVE_END], /* @ts-ignore */
415
+ ...(ngDevMode ? [{ debugName: "overlayPositions" }] : /* istanbul ignore next */ []));
416
+ /** Иконка триггера. Default `ellipsis-h` («…» — три точки в конце строки). */
417
+ this.icon = input('ellipsis-h', /* @ts-ignore */
418
+ ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
419
+ /** ARIA-метка триггера (icon-only кнопка) + текст tooltip'а. */
420
+ /** Пусто — берётся переведённая подпись по умолчанию */
421
+ this.ariaLabel = input('', /* @ts-ignore */
422
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
423
+ /** Сторона раскрытия панели относительно триггера. */
424
+ this.align = input('end', /* @ts-ignore */
425
+ ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
426
+ /**
427
+ * Классы панели. Панель живёт поверх страницы, вне хоста меню, и признаки вида над хостом до неё
428
+ * не доходят: семья, нарисованная своим набором, отдаёт его панели этим входом.
429
+ */
430
+ this.panelClass = input([], /* @ts-ignore */
431
+ ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
432
+ /** Размер панели: компактная — у меню действий строки таблицы. */
433
+ this.size = input('md', /* @ts-ignore */
434
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
435
+ /** Триггер отключён — меню не открыть. */
436
+ this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
437
+ /** Панель открылась (`true`) или закрылась (`false`); повтор того же состояния не приходит. */
438
+ this.openedChange = output();
439
+ }
440
+ #host;
441
+ #t_uiActions;
442
+ /** Ход стрелками по пунктам открытой панели; у закрытой его нет. */
443
+ #keyManager;
444
+ toggle(event) {
445
+ // Клик по триггеру не должен активировать строку таблицы под ним.
446
+ event.stopPropagation();
447
+ this.#setOpen(!this.isOpen());
448
+ }
449
+ close() {
450
+ this.#setOpen(false);
451
+ }
452
+ /**
453
+ * Панель легла на страницу — фокус уходит на первый пункт, как у меню Material. Пункты берутся
454
+ * из разметки панели, а не запросом компонентов: таблица кладёт их шаблоном приложения, и
455
+ * запрос содержимого меню их не видит.
456
+ */
457
+ onAttach() {
458
+ const pane = this.overlay().overlayRef.overlayElement;
459
+ // Тема куска `rtTheme` вокруг меню едет на коробку панели, как у поповера и подсказки:
460
+ // панель лежит в конце страницы, и без этого меню из тёмной карточки рисовалось темой
461
+ // страницы. Зовётся на каждом открытии — кусок вокруг кнопки мог смениться.
462
+ carryThemeScope(pane, this.trigger().elementRef.nativeElement);
463
+ const nodes = Array.from(pane.querySelectorAll('[role="menuitem"]'));
464
+ const focusables = nodes.map((node) => ({
465
+ disabled: node.getAttribute('aria-disabled') === 'true',
466
+ focus: () => node.focus(),
467
+ }));
468
+ this.#keyManager = new FocusKeyManager(focusables).withWrap().withHomeAndEnd();
469
+ this.#keyManager.setFirstItemActive();
470
+ }
471
+ /** Выбранный пункт закрывает панель и возвращает фокус кнопке, откуда меню открыли. */
472
+ onSelect() {
473
+ this.close();
474
+ this.#focusTrigger();
475
+ }
476
+ onKeydown(event) {
477
+ if (event.key === 'Escape') {
478
+ this.close();
479
+ this.#focusTrigger();
480
+ return;
481
+ }
482
+ if (event.key === 'Tab') {
483
+ // Tab уводит фокус дальше по порядку — панель за ним не остаётся. Панель лежит в конце
484
+ // страницы, и без возврата Tab ушёл бы с неё в никуда: фокус ставится на кнопку, а
485
+ // умолчание клавиши не отменяется — браузер ведёт его от кнопки к следующему, как у
486
+ // меню Material.
487
+ this.close();
488
+ this.#focusTrigger();
489
+ return;
490
+ }
491
+ this.#keyManager?.onKeydown(event);
492
+ }
493
+ #focusTrigger() {
494
+ this.trigger().elementRef.nativeElement.querySelector('button')?.focus();
495
+ }
496
+ #setOpen(open) {
497
+ if (open !== this.isOpen()) {
498
+ if (!open) {
499
+ this.#keyManager?.destroy();
500
+ this.#keyManager = null;
501
+ }
502
+ if (open) {
503
+ this.presetClasses.set(materialPresetClassesOf(this.#host.nativeElement));
504
+ }
505
+ this.isOpen.set(open);
506
+ this.openedChange.emit(open);
507
+ }
508
+ }
509
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
510
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.6", type: RtMenuComponent, isStandalone: true, selector: "rt-menu", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openedChange: "openedChange" }, host: { properties: { "class.rt-menu--open": "isOpen()" }, classAttribute: "rt-menu" }, viewQueries: [{ propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }, { propertyName: "trigger", first: true, predicate: CdkOverlayOrigin, descendants: true, isSignal: true }], ngImport: i0, template: "<rt-icon-button\n cdkOverlayOrigin\n qa-dataid=\"menu-trigger\"\n #trigger=\"cdkOverlayOrigin\"\n variant=\"ghost\"\n [icon]=\"icon()\"\n [ariaLabel]=\"ariaText()\"\n [tooltip]=\"ariaText()\"\n [disabled]=\"disabled()\"\n (clicked)=\"toggle($event)\" />\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions()\"\n [cdkConnectedOverlayPanelClass]=\"panelClasses()\"\n (backdropClick)=\"close()\"\n (attach)=\"onAttach()\"\n (detach)=\"close()\"\n (overlayKeydown)=\"onKeydown($event)\">\n <ng-container rtBlock=\"rt-menu\">\n <div rtElem=\"panel\" qa-dataid=\"menu-panel\" role=\"menu\" [rtMod]=\"{ size: size() }\" (rtMenuSelect)=\"onSelect()\">\n <ng-content />\n </div>\n </ng-container>\n</ng-template>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-menu{display:inline-flex;align-items:center;justify-content:center}.rt-menu__panel{--rt-menu-panel-radius: var(--rt-overlay-menu-radius);--rt-menu-panel-border-width: var(--rt-border-width-thin);--rt-menu-panel-shadow: var(--rt-overlay-menu-shadow);--rt-menu-panel-bg: var(--rt-overlay-menu-bg);--rt-menu-panel-padding-y: var(--rt-overlay-menu-padding-y);--rt-menu-panel-min-width: var(--rt-overlay-menu-min-width);display:flex;min-width:var(--rt-menu-panel-min-width);flex-direction:column;padding:var(--rt-menu-panel-padding-y) var(--rt-space-xs);border:var(--rt-menu-panel-border-width) solid var(--rt-color-border-subtle);border-radius:var(--rt-menu-panel-radius);background:var(--rt-menu-panel-bg);box-shadow:var(--rt-menu-panel-shadow)}.rt-menu__panel--size--sm{--rt-overlay-menu-item-min-height: var(--rt-overlay-menu-sm-item-min-height);--rt-overlay-menu-item-icon-size: var(--rt-overlay-menu-sm-item-icon-size)}}\n"], dependencies: [{ kind: "ngmodule", type:
511
+ // @angular/cdk
512
+ OverlayModule }, { kind: "directive", type: i1$1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type:
513
+ // standalone components / directives
514
+ RtIconButtonComponent, selector: "rt-icon-button", inputs: ["icon", "glyph", "ariaLabel", "variant", "iconColor", "iconFill", "size", "iconSize", "type", "tooltip", "tabIndex", "loading", "disabled", "active", "indicator"], outputs: ["clicked"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
515
+ }
516
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtMenuComponent, decorators: [{
517
+ type: Component,
518
+ args: [{ selector: 'rt-menu', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
519
+ // @angular/cdk
520
+ OverlayModule,
521
+ // standalone components / directives
522
+ RtIconButtonComponent,
523
+ BlockDirective,
524
+ ElemDirective,
525
+ ModDirective,
526
+ ], host: {
527
+ class: BEM_BLOCK,
528
+ '[class.rt-menu--open]': 'isOpen()',
529
+ }, template: "<rt-icon-button\n cdkOverlayOrigin\n qa-dataid=\"menu-trigger\"\n #trigger=\"cdkOverlayOrigin\"\n variant=\"ghost\"\n [icon]=\"icon()\"\n [ariaLabel]=\"ariaText()\"\n [tooltip]=\"ariaText()\"\n [disabled]=\"disabled()\"\n (clicked)=\"toggle($event)\" />\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions()\"\n [cdkConnectedOverlayPanelClass]=\"panelClasses()\"\n (backdropClick)=\"close()\"\n (attach)=\"onAttach()\"\n (detach)=\"close()\"\n (overlayKeydown)=\"onKeydown($event)\">\n <ng-container rtBlock=\"rt-menu\">\n <div rtElem=\"panel\" qa-dataid=\"menu-panel\" role=\"menu\" [rtMod]=\"{ size: size() }\" (rtMenuSelect)=\"onSelect()\">\n <ng-content />\n </div>\n </ng-container>\n</ng-template>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-menu{display:inline-flex;align-items:center;justify-content:center}.rt-menu__panel{--rt-menu-panel-radius: var(--rt-overlay-menu-radius);--rt-menu-panel-border-width: var(--rt-border-width-thin);--rt-menu-panel-shadow: var(--rt-overlay-menu-shadow);--rt-menu-panel-bg: var(--rt-overlay-menu-bg);--rt-menu-panel-padding-y: var(--rt-overlay-menu-padding-y);--rt-menu-panel-min-width: var(--rt-overlay-menu-min-width);display:flex;min-width:var(--rt-menu-panel-min-width);flex-direction:column;padding:var(--rt-menu-panel-padding-y) var(--rt-space-xs);border:var(--rt-menu-panel-border-width) solid var(--rt-color-border-subtle);border-radius:var(--rt-menu-panel-radius);background:var(--rt-menu-panel-bg);box-shadow:var(--rt-menu-panel-shadow)}.rt-menu__panel--size--sm{--rt-overlay-menu-item-min-height: var(--rt-overlay-menu-sm-item-min-height);--rt-overlay-menu-item-icon-size: var(--rt-overlay-menu-sm-item-icon-size)}}\n"] }]
530
+ }], propDecorators: { overlay: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkConnectedOverlay), { isSignal: true }] }], trigger: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkOverlayOrigin), { isSignal: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], openedChange: [{ type: i0.Output, args: ["openedChange"] }] } });
531
+
532
+ /**
533
+ * Generated bundle index. Do not edit.
534
+ */
535
+
536
+ export { RT_MENU_SELECT_EVENT, RtMenuComponent, RtMenuItemComponent, RtMenuItemIconDirective };
537
+ //# sourceMappingURL=rt-tools-ui-kit-v2-menu.mjs.map