@rt-tools/ui-kit-v2 0.23.3 → 0.23.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs +142 -71
  2. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs.map +1 -1
  3. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +467 -231
  4. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -1
  5. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +260 -91
  6. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -1
  7. package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs +80 -46
  8. package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs.map +1 -1
  9. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +984 -697
  10. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +452 -210
  12. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
  13. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +143 -52
  14. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -1
  15. package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs +158 -83
  16. package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs.map +1 -1
  17. package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs +335 -0
  18. package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs.map +1 -0
  19. package/fesm2022/rt-tools-ui-kit-v2-button.mjs +437 -363
  20. package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -1
  21. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +430 -149
  22. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -1
  23. package/fesm2022/rt-tools-ui-kit-v2-card.mjs +155 -71
  24. package/fesm2022/rt-tools-ui-kit-v2-card.mjs.map +1 -1
  25. package/fesm2022/rt-tools-ui-kit-v2-carousel.mjs +155 -0
  26. package/fesm2022/rt-tools-ui-kit-v2-carousel.mjs.map +1 -0
  27. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +215 -110
  28. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
  29. package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs +158 -75
  30. package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs.map +1 -1
  31. package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs +769 -0
  32. package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs.map +1 -0
  33. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs +462 -253
  34. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs.map +1 -1
  35. package/fesm2022/rt-tools-ui-kit-v2-container.mjs +1276 -1316
  36. package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -1
  37. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +185 -80
  38. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -1
  39. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +2309 -2619
  40. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  41. package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs +100 -44
  42. package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs.map +1 -1
  43. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs +290 -155
  44. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs.map +1 -1
  45. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +2097 -858
  46. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
  47. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +2247 -1176
  48. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
  49. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +1043 -705
  50. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
  51. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +810 -525
  52. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
  53. package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs +158 -138
  54. package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs.map +1 -1
  55. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs +177 -67
  56. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs.map +1 -1
  57. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs +550 -477
  58. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs.map +1 -1
  59. package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs +185 -168
  60. package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs.map +1 -1
  61. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +116 -43
  62. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -1
  63. package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs +585 -0
  64. package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs.map +1 -0
  65. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +755 -259
  66. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -1
  67. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +3266 -1115
  68. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
  69. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +190 -55
  70. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -1
  71. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +283 -103
  72. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
  73. package/fesm2022/rt-tools-ui-kit-v2-field.mjs +393 -177
  74. package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
  75. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +399 -207
  76. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
  77. package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs +288 -212
  78. package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs.map +1 -1
  79. package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs +262 -116
  80. package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs.map +1 -1
  81. package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs +57 -31
  82. package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs.map +1 -1
  83. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +258 -90
  84. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -1
  85. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +249 -215
  86. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -1
  87. package/fesm2022/rt-tools-ui-kit-v2-header.mjs +199 -71
  88. package/fesm2022/rt-tools-ui-kit-v2-header.mjs.map +1 -1
  89. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs +231 -0
  90. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs.map +1 -0
  91. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs +336 -0
  92. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs.map +1 -0
  93. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +451 -162
  94. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
  95. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +931 -686
  96. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -1
  97. package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs +664 -491
  98. package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs.map +1 -1
  99. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +574 -222
  100. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -1
  101. package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs +150 -36
  102. package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs.map +1 -1
  103. package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs +606 -0
  104. package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs.map +1 -0
  105. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +461 -355
  106. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
  107. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +338 -143
  108. package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
  109. package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs +135 -48
  110. package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs.map +1 -1
  111. package/fesm2022/rt-tools-ui-kit-v2-logo.mjs +166 -92
  112. package/fesm2022/rt-tools-ui-kit-v2-logo.mjs.map +1 -1
  113. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs +118 -56
  114. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs.map +1 -1
  115. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1054 -527
  116. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
  117. package/fesm2022/rt-tools-ui-kit-v2-message.mjs +230 -104
  118. package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -1
  119. package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs +210 -70
  120. package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs.map +1 -1
  121. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +532 -311
  122. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
  123. package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs +125 -50
  124. package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs.map +1 -1
  125. package/fesm2022/rt-tools-ui-kit-v2-note.mjs +73 -43
  126. package/fesm2022/rt-tools-ui-kit-v2-note.mjs.map +1 -1
  127. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +161 -53
  128. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -1
  129. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +491 -310
  130. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
  131. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +374 -174
  132. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -1
  133. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs +202 -159
  134. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs.map +1 -1
  135. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs +438 -309
  136. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs.map +1 -1
  137. package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs +135 -45
  138. package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs.map +1 -1
  139. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +293 -171
  140. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -1
  141. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs +62 -55
  142. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs.map +1 -1
  143. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +3379 -1466
  144. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  145. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs +114 -116
  146. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs.map +1 -1
  147. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +406 -299
  148. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
  149. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +137 -36
  150. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -1
  151. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +687 -468
  152. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
  153. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +2195 -1569
  154. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
  155. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs +187 -48
  156. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs.map +1 -1
  157. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs +242 -122
  158. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs.map +1 -1
  159. package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs +439 -0
  160. package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs.map +1 -0
  161. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs +218 -69
  162. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs.map +1 -1
  163. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs +292 -91
  164. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs.map +1 -1
  165. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +225 -138
  166. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -1
  167. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +150 -116
  168. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -1
  169. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +2462 -1583
  170. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
  171. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +647 -346
  172. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
  173. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +335 -121
  174. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
  175. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +217 -84
  176. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -1
  177. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +151 -72
  178. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -1
  179. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +697 -226
  180. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
  181. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs +92 -38
  182. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs.map +1 -1
  183. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +752 -338
  184. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
  185. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +310 -129
  186. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
  187. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +286 -158
  188. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -1
  189. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +270 -134
  190. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
  191. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +322 -202
  192. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -1
  193. package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs +908 -0
  194. package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs.map +1 -0
  195. package/fesm2022/rt-tools-ui-kit-v2-tree.mjs +785 -0
  196. package/fesm2022/rt-tools-ui-kit-v2-tree.mjs.map +1 -0
  197. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs +118 -63
  198. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs.map +1 -1
  199. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +783 -262
  200. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
  201. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +633 -294
  202. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -1
  203. package/fesm2022/rt-tools-ui-kit-v2.mjs +100 -103
  204. package/package.json +41 -1
  205. package/src/assets/icons/collapse-all.svg +9 -0
  206. package/src/assets/icons/expand-all.svg +9 -0
  207. package/src/assets/icons-material/collapse-all.fill.svg +5 -0
  208. package/src/assets/icons-material/collapse-all.svg +5 -0
  209. package/src/assets/icons-material/expand-all.fill.svg +5 -0
  210. package/src/assets/icons-material/expand-all.svg +5 -0
  211. package/src/assets/icons-material/undo.fill.svg +5 -0
  212. package/src/assets/icons-material/undo.svg +5 -0
  213. package/src/lib/components/bottom-sheet/CONTEXT.md +20 -2
  214. package/src/lib/components/bottom-sheet/rt-bottom-sheet.component.scss +35 -1
  215. package/src/lib/components/breadcrumbs/CONTEXT.md +37 -0
  216. package/src/lib/components/breadcrumbs/rt-breadcrumbs.component.scss +205 -0
  217. package/src/lib/components/carousel/CONTEXT.md +42 -0
  218. package/src/lib/components/carousel/rt-carousel.component.scss +117 -0
  219. package/src/lib/components/checkbox/CONTEXT.md +3 -0
  220. package/src/lib/components/checkbox/rt-checkbox.component.scss +9 -3
  221. package/src/lib/components/color-palette/CONTEXT.md +49 -0
  222. package/src/lib/components/color-palette/picker/rt-color-picker.component.scss +161 -0
  223. package/src/lib/components/color-palette/rt-color-palette.component.scss +132 -0
  224. package/src/lib/components/draggable-tree/CONTEXT.md +54 -0
  225. package/src/lib/components/draggable-tree/rt-draggable-tree.component.scss +219 -0
  226. package/src/lib/components/hybrid-tree/CONTEXT.md +31 -0
  227. package/src/lib/components/hybrid-tree-selector/CONTEXT.md +25 -0
  228. package/src/lib/components/icon-button/CONTEXT.md +3 -0
  229. package/src/lib/components/inline-edit/CONTEXT.md +41 -0
  230. package/src/lib/components/inline-edit/rt-inline-edit.component.scss +274 -0
  231. package/src/lib/components/popover/CONTEXT.md +3 -0
  232. package/src/lib/components/speed-menu/CONTEXT.md +34 -0
  233. package/src/lib/components/speed-menu/rt-speed-menu.component.scss +118 -0
  234. package/src/lib/components/tag/rt-tag.component.scss +12 -0
  235. package/src/lib/components/thread-list/CONTEXT.md +1 -0
  236. package/src/lib/components/thread-list/rt-thread-list.component.scss +2 -1
  237. package/src/lib/components/toolbar/CONTEXT.md +9 -4
  238. package/src/lib/components/toolbar/rt-toolbar.component.scss +10 -2
  239. package/src/lib/components/tooltip/CONTEXT.md +8 -1
  240. package/src/lib/components/tree/CONTEXT.md +66 -0
  241. package/src/lib/components/tree/rt-tree.component.scss +313 -0
  242. package/src/lib/components/tree-selector/CONTEXT.md +47 -0
  243. package/src/lib/components/tree-selector/rt-tree-selector.component.scss +121 -0
  244. package/src/styles/_primitives.scss +4 -0
  245. package/styles/tokens.css +3 -0
  246. package/types/rt-tools-ui-kit-v2-accordion.d.ts +31 -24
  247. package/types/rt-tools-ui-kit-v2-action-bar.d.ts +112 -91
  248. package/types/rt-tools-ui-kit-v2-ai-run-status.d.ts +64 -40
  249. package/types/rt-tools-ui-kit-v2-aside-section.d.ts +13 -10
  250. package/types/rt-tools-ui-kit-v2-aside.d.ts +268 -206
  251. package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +102 -61
  252. package/types/rt-tools-ui-kit-v2-bar-list.d.ts +39 -27
  253. package/types/rt-tools-ui-kit-v2-bottom-sheet.d.ts +31 -20
  254. package/types/rt-tools-ui-kit-v2-breadcrumbs.d.ts +89 -0
  255. package/types/rt-tools-ui-kit-v2-button.d.ts +119 -59
  256. package/types/rt-tools-ui-kit-v2-calendar.d.ts +151 -86
  257. package/types/rt-tools-ui-kit-v2-card.d.ts +42 -21
  258. package/types/rt-tools-ui-kit-v2-carousel.d.ts +76 -0
  259. package/types/rt-tools-ui-kit-v2-checkbox.d.ts +48 -24
  260. package/types/rt-tools-ui-kit-v2-collapsible-text.d.ts +28 -20
  261. package/types/rt-tools-ui-kit-v2-color-palette.d.ts +208 -0
  262. package/types/rt-tools-ui-kit-v2-confirm-popover.d.ts +104 -47
  263. package/types/rt-tools-ui-kit-v2-container.d.ts +278 -221
  264. package/types/rt-tools-ui-kit-v2-copy-value.d.ts +39 -24
  265. package/types/rt-tools-ui-kit-v2-core.d.ts +856 -865
  266. package/types/rt-tools-ui-kit-v2-counter-row.d.ts +20 -12
  267. package/types/rt-tools-ui-kit-v2-counter.d.ts +70 -38
  268. package/types/rt-tools-ui-kit-v2-data-list.d.ts +429 -264
  269. package/types/rt-tools-ui-kit-v2-data-table.d.ts +500 -351
  270. package/types/rt-tools-ui-kit-v2-date-picker.d.ts +164 -138
  271. package/types/rt-tools-ui-kit-v2-date-range.d.ts +102 -84
  272. package/types/rt-tools-ui-kit-v2-delta-view.d.ts +16 -13
  273. package/types/rt-tools-ui-kit-v2-detail-list.d.ts +23 -16
  274. package/types/rt-tools-ui-kit-v2-dialog.d.ts +130 -101
  275. package/types/rt-tools-ui-kit-v2-dot-field.d.ts +10 -13
  276. package/types/rt-tools-ui-kit-v2-download-link.d.ts +22 -17
  277. package/types/rt-tools-ui-kit-v2-draggable-tree.d.ts +132 -0
  278. package/types/rt-tools-ui-kit-v2-dynamic-list.d.ts +185 -96
  279. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +904 -404
  280. package/types/rt-tools-ui-kit-v2-empty-state.d.ts +48 -19
  281. package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +67 -39
  282. package/types/rt-tools-ui-kit-v2-field.d.ts +90 -49
  283. package/types/rt-tools-ui-kit-v2-file-card.d.ts +115 -75
  284. package/types/rt-tools-ui-kit-v2-file-drop.d.ts +75 -48
  285. package/types/rt-tools-ui-kit-v2-file-input.d.ts +53 -36
  286. package/types/rt-tools-ui-kit-v2-file-list.d.ts +5 -8
  287. package/types/rt-tools-ui-kit-v2-filter-control.d.ts +83 -49
  288. package/types/rt-tools-ui-kit-v2-form-control.d.ts +102 -74
  289. package/types/rt-tools-ui-kit-v2-header.d.ts +40 -22
  290. package/types/rt-tools-ui-kit-v2-hybrid-tree-selector.d.ts +14 -0
  291. package/types/rt-tools-ui-kit-v2-hybrid-tree.d.ts +72 -0
  292. package/types/rt-tools-ui-kit-v2-icon-button.d.ts +190 -90
  293. package/types/rt-tools-ui-kit-v2-icon.d.ts +160 -129
  294. package/types/rt-tools-ui-kit-v2-image-cropper.d.ts +151 -111
  295. package/types/rt-tools-ui-kit-v2-image-upload.d.ts +159 -85
  296. package/types/rt-tools-ui-kit-v2-info-item.d.ts +26 -13
  297. package/types/rt-tools-ui-kit-v2-inline-edit.d.ts +194 -0
  298. package/types/rt-tools-ui-kit-v2-input-number.d.ts +102 -53
  299. package/types/rt-tools-ui-kit-v2-input.d.ts +82 -43
  300. package/types/rt-tools-ui-kit-v2-live-badge.d.ts +30 -17
  301. package/types/rt-tools-ui-kit-v2-logo.d.ts +49 -32
  302. package/types/rt-tools-ui-kit-v2-markdown-text.d.ts +26 -17
  303. package/types/rt-tools-ui-kit-v2-menu.d.ts +272 -155
  304. package/types/rt-tools-ui-kit-v2-message.d.ts +59 -33
  305. package/types/rt-tools-ui-kit-v2-money-list.d.ts +36 -18
  306. package/types/rt-tools-ui-kit-v2-multiselect.d.ts +114 -80
  307. package/types/rt-tools-ui-kit-v2-night-grid.d.ts +34 -25
  308. package/types/rt-tools-ui-kit-v2-note.d.ts +12 -9
  309. package/types/rt-tools-ui-kit-v2-notifications-bell.d.ts +37 -16
  310. package/types/rt-tools-ui-kit-v2-page-header.d.ts +218 -150
  311. package/types/rt-tools-ui-kit-v2-pagination.d.ts +99 -63
  312. package/types/rt-tools-ui-kit-v2-photo-viewer.d.ts +61 -66
  313. package/types/rt-tools-ui-kit-v2-popover.d.ts +116 -55
  314. package/types/rt-tools-ui-kit-v2-prompt-suggestion.d.ts +26 -16
  315. package/types/rt-tools-ui-kit-v2-radio-button.d.ts +85 -43
  316. package/types/rt-tools-ui-kit-v2-radius.d.ts +18 -15
  317. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +931 -590
  318. package/types/rt-tools-ui-kit-v2-ripple.d.ts +28 -25
  319. package/types/rt-tools-ui-kit-v2-scroll-area.d.ts +60 -58
  320. package/types/rt-tools-ui-kit-v2-section-nav.d.ts +32 -22
  321. package/types/rt-tools-ui-kit-v2-select.d.ts +182 -139
  322. package/types/rt-tools-ui-kit-v2-side-menu.d.ts +452 -349
  323. package/types/rt-tools-ui-kit-v2-skeleton-wrapper.d.ts +53 -20
  324. package/types/rt-tools-ui-kit-v2-skeleton.d.ts +55 -26
  325. package/types/rt-tools-ui-kit-v2-speed-menu.d.ts +131 -0
  326. package/types/rt-tools-ui-kit-v2-spinner.d.ts +56 -28
  327. package/types/rt-tools-ui-kit-v2-split-button.d.ts +96 -55
  328. package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +88 -60
  329. package/types/rt-tools-ui-kit-v2-stepper.d.ts +50 -37
  330. package/types/rt-tools-ui-kit-v2-table.d.ts +631 -480
  331. package/types/rt-tools-ui-kit-v2-tabs.d.ts +198 -113
  332. package/types/rt-tools-ui-kit-v2-tag.d.ts +106 -53
  333. package/types/rt-tools-ui-kit-v2-textarea.d.ts +48 -25
  334. package/types/rt-tools-ui-kit-v2-theme-toggle.d.ts +28 -26
  335. package/types/rt-tools-ui-kit-v2-thread-list.d.ts +154 -94
  336. package/types/rt-tools-ui-kit-v2-timeline.d.ts +30 -28
  337. package/types/rt-tools-ui-kit-v2-toast.d.ts +174 -98
  338. package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +132 -86
  339. package/types/rt-tools-ui-kit-v2-toggle-switch.d.ts +88 -50
  340. package/types/rt-tools-ui-kit-v2-toolbar.d.ts +30 -27
  341. package/types/rt-tools-ui-kit-v2-tooltip.d.ts +65 -41
  342. package/types/rt-tools-ui-kit-v2-tree-selector.d.ts +257 -0
  343. package/types/rt-tools-ui-kit-v2-tree.d.ts +282 -0
  344. package/types/rt-tools-ui-kit-v2-welcome-dialog.d.ts +21 -24
  345. package/types/rt-tools-ui-kit-v2-workspace-details.d.ts +195 -124
  346. package/types/rt-tools-ui-kit-v2-workspace.d.ts +122 -79
  347. package/types/rt-tools-ui-kit-v2.d.ts +100 -90
  348. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +0 -1
@@ -1,709 +1,996 @@
1
- import { FocusTrapFactory } from '@angular/cdk/a11y';
2
- import { DOCUMENT } from '@angular/common';
3
- import * as i0 from '@angular/core';
4
- import { inject, DestroyRef, signal, computed, input, ViewEncapsulation, ChangeDetectionStrategy, Component, viewChild, booleanAttribute, afterRenderEffect, untracked, InjectionToken, Injector, RendererFactory2, Injectable, output } from '@angular/core';
5
- import { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';
6
- import { RtSpinnerComponent } from '@rt-tools/ui-kit-v2/spinner';
7
- import { Clipboard } from '@angular/cdk/clipboard';
8
- import { rtKitLabel, rtKitDefault, materialPresetClassesOfFocus, carryThemeScopeOfFocus, RT_KIT_LABELS } from '@rt-tools/ui-kit-v2/core';
9
- import { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';
10
- import { Overlay } from '@angular/cdk/overlay';
11
- import { ComponentPortal } from '@angular/cdk/portal';
12
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
13
- import { Subject, take, mergeMap, map, merge, takeUntil, EMPTY, Observable } from 'rxjs';
14
- import { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';
15
- import { RtSkeletonWrapperComponent } from '@rt-tools/ui-kit-v2/skeleton-wrapper';
16
- import { RtTagComponent } from '@rt-tools/ui-kit-v2/tag';
17
- import { RtDialogRef, RtDialogComponent } from '@rt-tools/ui-kit-v2/dialog';
18
-
1
+ import { FocusTrapFactory } from "@angular/cdk/a11y";
2
+ import { DOCUMENT } from "@angular/common";
3
+ import * as i0 from "@angular/core";
4
+ import { ChangeDetectionStrategy, Component, DestroyRef, Injectable, InjectionToken, Injector, RendererFactory2, ViewEncapsulation, afterRenderEffect, booleanAttribute, computed, inject, input, output, signal, untracked, viewChild } from "@angular/core";
5
+ import { BlockDirective, ElemDirective, ModDirective } from "@rt-tools/core";
6
+ import { RtSpinnerComponent } from "@rt-tools/ui-kit-v2/spinner";
7
+ import { Clipboard } from "@angular/cdk/clipboard";
8
+ import { RT_KIT_LABELS, carryThemeScopeOfFocus, materialPresetClassesOfFocus, rtKitDefault, rtKitLabel } from "@rt-tools/ui-kit-v2/core";
9
+ import { RtButtonDirective } from "@rt-tools/ui-kit-v2/button";
10
+ import { Overlay } from "@angular/cdk/overlay";
11
+ import { ComponentPortal } from "@angular/cdk/portal";
12
+ import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
13
+ import { EMPTY, Observable, Subject, map, merge, mergeMap, take, takeUntil } from "rxjs";
14
+ import { RtIconButtonComponent } from "@rt-tools/ui-kit-v2/icon-button";
15
+ import { RtSkeletonWrapperComponent } from "@rt-tools/ui-kit-v2/skeleton-wrapper";
16
+ import { RtTagComponent } from "@rt-tools/ui-kit-v2/tag";
17
+ import { RtDialogComponent, RtDialogRef } from "@rt-tools/ui-kit-v2/dialog";
19
18
  function errorAsText(error) {
20
- try {
21
- return JSON.stringify(error) ?? String(error);
22
- }
23
- catch {
24
- return String(error);
25
- }
19
+ try {
20
+ return JSON.stringify(error) ?? String(error);
21
+ } catch {
22
+ return String(error);
23
+ }
26
24
  }
27
- /**
28
- * Текст, который кнопка блока ошибки кладёт в буфер обмена.
29
- *
30
- * Вид повторяет первый кит — `Error time: <дата>_<время>;Error info: <JSON>`: кто разбирал такие
31
- * копии раньше, читает их так же. Ошибку с петлёй внутри `JSON.stringify` не пишет и бросает —
32
- * тогда в копию идёт её строковый вид, и нажатие не падает.
33
- */
34
25
  function rtAsideErrorCopyText(error, now) {
35
- return `Error time: ${now.toDateString()}_${now.toTimeString()};Error info: ${errorAsText(error)}`;
36
- }
37
-
38
- const BEM_BLOCK$4 = 'rt-aside-error-box';
39
- /** Сколько кнопка держит «скопировано» — секунда, как у первого кита. */
40
- const CONFIRM_DELAY_MS = 1000;
41
- /**
42
- * Блок ошибки запроса боковой панели: надпись и кнопка, которая кладёт в буфер обмена время и
43
- * ошибку. Перенос `rtui-aside-error-box` первого кита без Material.
44
- *
45
- * Обычно его рисует сама панель по входу `requestError`; отдельно он нужен приложению, которое
46
- * показывает ошибку в другом месте.
47
- */
48
- class RtAsideErrorBoxComponent {
49
- #clipboard;
50
- #destroyRef;
51
- #confirmTimer;
52
- #copyLabel;
53
- #copiedLabel;
54
- constructor() {
55
- this.#clipboard = inject(Clipboard);
56
- this.#destroyRef = inject(DestroyRef);
57
- this.#confirmTimer = null;
58
- this.#copyLabel = rtKitLabel('asideCopyErrorInfo');
59
- this.#copiedLabel = rtKitLabel('uiCopied');
60
- this.title = rtKitLabel('asideRequestError');
61
- this.copied = signal(false, /* @ts-ignore */
62
- ...(ngDevMode ? [{ debugName: "copied" }] : /* istanbul ignore next */ []));
63
- this.buttonLabel = computed(() => (this.copied() ? this.#copiedLabel() : this.#copyLabel()), /* @ts-ignore */
64
- ...(ngDevMode ? [{ debugName: "buttonLabel" }] : /* istanbul ignore next */ []));
65
- this.buttonIcon = computed(() => (this.copied() ? 'check' : null), /* @ts-ignore */
66
- ...(ngDevMode ? [{ debugName: "buttonIcon" }] : /* istanbul ignore next */ []));
67
- /** Ошибка, пришедшая от неудавшегося запроса: уходит в копию как JSON. */
68
- this.error = input.required(/* @ts-ignore */
69
- ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
70
- this.#destroyRef.onDestroy(() => this.#clearTimer());
71
- }
72
- onCopy() {
73
- this.#clipboard.copy(rtAsideErrorCopyText(this.error(), new Date()));
74
- this.copied.set(true);
75
- this.#clearTimer();
76
- this.#confirmTimer = setTimeout(() => this.copied.set(false), CONFIRM_DELAY_MS);
77
- }
78
- #clearTimer() {
79
- if (this.#confirmTimer !== null) {
80
- clearTimeout(this.#confirmTimer);
81
- this.#confirmTimer = null;
82
- }
83
- }
84
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtAsideErrorBoxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
85
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: RtAsideErrorBoxComponent, isStandalone: true, selector: "rt-aside-error-box", inputs: { error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "rt-aside-error-box" }, ngImport: i0, template: "<ng-container rtBlock=\"rt-aside-error-box\">\n <div rtElem=\"frame\" qa-dataid=\"aside-error-box\">\n <span rtElem=\"title\" qa-dataid=\"aside-error-title\">{{ title() }}</span>\n\n <button\n rtButton\n rtElem=\"copy\"\n qa-dataid=\"aside-error-copy\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n [label]=\"buttonLabel()\"\n [icon]=\"buttonIcon()\"\n [attr.aria-label]=\"buttonLabel()\"\n (click)=\"onCopy()\"></button>\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-error-box{--rt-aside-error-box-min-height: 2rem;--rt-aside-error-box-border-width: 1px;--rt-aside-error-box-radius: var(--rt-radius-md);display:block;min-width:0}.rt-aside-error-box__frame{display:flex;min-width:0;min-height:var(--rt-aside-error-box-min-height);align-items:center;justify-content:space-between;padding:var(--rt-space-2);border:var(--rt-aside-error-box-border-width) solid var(--rt-color-state-danger);border-radius:var(--rt-aside-error-box-radius);gap:var(--rt-space-2)}.rt-aside-error-box__title{min-width:0;color:var(--rt-color-state-danger);font-size:var(--rt-text-md);overflow-wrap:anywhere}.rt-aside-error-box__copy{flex-shrink:0}}\n"], dependencies: [{ kind: "directive", type: RtButtonDirective, selector: "button[rtButton], a[rtButton]", inputs: ["label", "icon", "iconPos", "theme", "appearance", "size", "loading", "loadingIcon", "loadingLabel", "pressed"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
86
- }
87
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtAsideErrorBoxComponent, decorators: [{
88
- type: Component,
89
- args: [{ selector: 'rt-aside-error-box', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [RtButtonDirective, BlockDirective, ElemDirective], host: {
90
- class: BEM_BLOCK$4,
91
- }, template: "<ng-container rtBlock=\"rt-aside-error-box\">\n <div rtElem=\"frame\" qa-dataid=\"aside-error-box\">\n <span rtElem=\"title\" qa-dataid=\"aside-error-title\">{{ title() }}</span>\n\n <button\n rtButton\n rtElem=\"copy\"\n qa-dataid=\"aside-error-copy\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n [label]=\"buttonLabel()\"\n [icon]=\"buttonIcon()\"\n [attr.aria-label]=\"buttonLabel()\"\n (click)=\"onCopy()\"></button>\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-error-box{--rt-aside-error-box-min-height: 2rem;--rt-aside-error-box-border-width: 1px;--rt-aside-error-box-radius: var(--rt-radius-md);display:block;min-width:0}.rt-aside-error-box__frame{display:flex;min-width:0;min-height:var(--rt-aside-error-box-min-height);align-items:center;justify-content:space-between;padding:var(--rt-space-2);border:var(--rt-aside-error-box-border-width) solid var(--rt-color-state-danger);border-radius:var(--rt-aside-error-box-radius);gap:var(--rt-space-2)}.rt-aside-error-box__title{min-width:0;color:var(--rt-color-state-danger);font-size:var(--rt-text-md);overflow-wrap:anywhere}.rt-aside-error-box__copy{flex-shrink:0}}\n"] }]
92
- }], ctorParameters: () => [], propDecorators: { error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: true }] }] } });
93
-
94
- const BEM_BLOCK$3 = 'rt-aside';
95
- /**
96
- * Презентационный styled-frame для side-sheet.
97
- *
98
- * Видимость / backdrop / scroll-block / ESC / slide-in анимация — НЕ внутренняя
99
- * ответственность компонента. Это обеспечивает CDK Overlay через
100
- * `RtAsideService.open()`. rt-aside здесь — стилизованная "рамка" с size-вариантами
101
- * и тремя слотами: `rt-aside-header`, содержимое и `rt-aside-footer`.
102
- *
103
- * Содержимое лежит в одной зоне `.rt-aside__content` — она и держит инсет панели,
104
- * и прокручивается. Пока зоны не было, каждый корневой узел содержимого получал
105
- * инсет и прокрутку сам по себе: разделы делили высоту панели между собой, а
106
- * обводка фокуса поля срезалась краем такого мини-скроллера.
107
- *
108
- * Семантика — `role="complementary"` (mirror rt-dialog имеет `role="dialog"`,
109
- * aside — другая роль, side-sheet не обязательно блокирующий).
110
- *
111
- * `ViewEncapsulation.None` — стили префиксованы `.rt-aside`, чтобы соседние
112
- * rt-aside-header / rt-aside-footer работали с одним BEM-блоком без
113
- * cross-encapsulation хака.
114
- */
115
- class RtAsideComponent {
116
- #focusTrapFactory;
117
- #document;
118
- #focusTrap;
119
- #restoreFocusTo;
120
- constructor() {
121
- this.#focusTrapFactory = inject(FocusTrapFactory);
122
- this.#document = inject(DOCUMENT);
123
- this.#focusTrap = null;
124
- this.#restoreFocusTo = null;
125
- this.frame = viewChild.required('frame', /* @ts-ignore */
126
- ...(ngDevMode ? [{ debugName: "frame" }] : /* istanbul ignore next */ []));
127
- this.hasRequestError = computed(() => this.requestError() !== null && this.requestError() !== undefined, /* @ts-ignore */
128
- ...(ngDevMode ? [{ debugName: "hasRequestError" }] : /* istanbul ignore next */ []));
129
- this.size = input('md', /* @ts-ignore */
130
- ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
131
- this.contentLayout = input('default', /* @ts-ignore */
132
- ...(ngDevMode ? [{ debugName: "contentLayout" }] : /* istanbul ignore next */ []));
133
- this.width = input(null, /* @ts-ignore */
134
- ...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
135
- this.ariaLabel = input(null, /* @ts-ignore */
136
- ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
137
- /**
138
- * Ошибка неудавшегося запроса. Пока она есть, между шапкой и содержимым стоит блок ошибки с
139
- * кнопкой копирования; `null` и `undefined` — ошибки нет, любое другое значение её показывает.
140
- */
141
- this.requestError = input(null, /* @ts-ignore */
142
- ...(ngDevMode ? [{ debugName: "requestError" }] : /* istanbul ignore next */ []));
143
- /**
144
- * Держать Tab внутри панели. При включении фокус уходит на `[cdkFocusInitial]` или первый
145
- * элемент под Tab, а когда панель уходит или вход гаснет, возвращается туда, где стоял.
146
- */
147
- this.trapFocus = input(false, { ...(ngDevMode ? { debugName: "trapFocus" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
148
- /** Идёт запрос: панель накрыта слоем с крутилкой и помечена занятой. */
149
- this.pending = input(false, { ...(ngDevMode ? { debugName: "pending" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
150
- // После отрисовки: до неё у рамки нет ни полей, ни кнопок, и ловить фокус не на чем.
151
- afterRenderEffect(() => {
152
- const enabled = this.trapFocus();
153
- const frame = this.frame().nativeElement;
154
- untracked(() => (enabled ? this.#holdFocus(frame) : this.#releaseFocus()));
155
- });
156
- inject(DestroyRef).onDestroy(() => this.#releaseFocus());
157
- }
158
- #holdFocus(frame) {
159
- if (this.#focusTrap !== null) {
160
- return;
161
- }
162
- const focused = this.#document.activeElement;
163
- this.#restoreFocusTo = focused instanceof HTMLElement ? focused : null;
164
- this.#focusTrap = this.#focusTrapFactory.create(frame);
165
- void this.#focusTrap.focusInitialElementWhenReady();
166
- }
167
- #releaseFocus() {
168
- if (this.#focusTrap === null) {
169
- return;
170
- }
171
- this.#focusTrap.destroy();
172
- this.#focusTrap = null;
173
- const restoreTo = this.#restoreFocusTo;
174
- this.#restoreFocusTo = null;
175
- if (restoreTo?.isConnected === true) {
176
- restoreTo.focus();
177
- }
178
- }
179
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtAsideComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
180
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtAsideComponent, isStandalone: true, selector: "rt-aside", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, contentLayout: { classPropertyName: "contentLayout", publicName: "contentLayout", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, requestError: { classPropertyName: "requestError", publicName: "requestError", isSignal: true, isRequired: false, transformFunction: null }, trapFocus: { classPropertyName: "trapFocus", publicName: "trapFocus", isSignal: true, isRequired: false, transformFunction: null }, pending: { classPropertyName: "pending", publicName: "pending", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "rt-aside" }, viewQueries: [{ propertyName: "frame", first: true, predicate: ["frame"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #frame\n rtBlock=\"rt-aside\"\n qa-dataid=\"aside\"\n role=\"complementary\"\n [rtMod]=\"{ size: size(), content: contentLayout() }\"\n [style.--rt-aside-width]=\"width()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-busy]=\"pending() || null\">\n <ng-content select=\"rt-aside-header\" />\n\n @if (hasRequestError()) {\n <rt-aside-error-box rtElem=\"error\" [error]=\"requestError()\" />\n }\n\n <div rtElem=\"content\" qa-dataid=\"aside-content\">\n <ng-content />\n </div>\n\n <ng-content select=\"rt-aside-footer\" />\n\n @if (pending()) {\n <div rtElem=\"pending\" qa-dataid=\"aside-pending\">\n <rt-spinner />\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{:root{--rt-aside-animation-duration: .2s;--rt-aside-backdrop-bg: var(--rt-color-bg-overlay);--rt-aside-backdrop-blur: 5px}.cdk-overlay-backdrop.rt-aside-backdrop{-webkit-backdrop-filter:blur(var(--rt-aside-backdrop-blur));backdrop-filter:blur(var(--rt-aside-backdrop-blur));background:var(--rt-aside-backdrop-bg);transition:opacity var(--rt-aside-animation-duration) ease}:is(.rt-preset-material,[data-preset=material]).cdk-overlay-backdrop.rt-aside-backdrop,[data-preset=material] .cdk-overlay-backdrop.rt-aside-backdrop{--rt-aside-backdrop-bg: var(--rt-color-bg-overlay);--rt-aside-backdrop-blur: 0}.rt-aside-overlay{height:100dvh;transition:transform var(--rt-aside-animation-duration) ease}.rt-aside-overlay.rt-aside-overlay--entering{transition:none}.rt-aside-overlay--position-right.rt-aside-overlay--entering,.rt-aside-overlay--position-right.rt-aside-overlay--leaving{transform:translate(100%)}.rt-aside-overlay--position-left.rt-aside-overlay--entering,.rt-aside-overlay--position-left.rt-aside-overlay--leaving{transform:translate(-100%)}.rt-aside-overlay--position-right.rt-aside-overlay--open,.rt-aside-overlay--position-left.rt-aside-overlay--open{transform:translate(0)}@media(width<=768px){.rt-aside-overlay{overflow:hidden;width:100dvw;max-width:100dvw}}@media(prefers-reduced-motion:reduce){.rt-aside-overlay{transition:none}}}.cdk-overlay-backdrop.rt-aside-backdrop{opacity:0;pointer-events:none}.cdk-overlay-backdrop.rt-aside-backdrop.rt-aside-backdrop--visible{opacity:1;pointer-events:auto}.rt-aside-overlay:not(.rt-aside-overlay--open){pointer-events:none}@layer rt-kit.components{:root{--rt-aside-width-sm: 400px;--rt-aside-width-md: 540px;--rt-aside-width-lg: 720px;--rt-aside-inset: var(--rt-space-lg);--rt-aside-content-gap: var(--rt-space-md);--rt-aside-narrow-width: 100dvw}rt-aside{display:contents}rt-aside .rt-aside{position:relative;display:flex;width:var(--rt-aside-width, var(--rt-aside-width-md));min-width:0;max-width:100%;height:100%;flex-direction:column;padding:0;border:none;background:var(--rt-aside-bg, var(--rt-color-bg-surface));color:var(--rt-color-text-primary)}rt-aside .rt-aside>rt-aside-header,rt-aside .rt-aside>rt-aside-footer{min-width:0;flex-shrink:0}rt-aside .rt-aside__error{min-width:0;flex-shrink:0;margin-block:var(--rt-aside-error-margin-block, 0);padding-inline:var(--rt-aside-inset)}rt-aside .rt-aside__content{display:flex;min-width:0;min-height:0;flex:1 1 auto;flex-direction:column;padding:var(--rt-aside-content-inset, var(--rt-aside-inset));gap:var(--rt-aside-content-gap);overflow-y:auto;overscroll-behavior:contain}rt-aside .rt-aside__pending{position:absolute;z-index:var(--rt-z-sticky);display:flex;align-items:center;justify-content:center;background-color:color-mix(in srgb,var(--rt-color-bg-surface) 60%,transparent);inset:0}rt-aside .rt-aside--size--sm{width:var(--rt-aside-width, var(--rt-aside-width-sm))}rt-aside .rt-aside--size--md{width:var(--rt-aside-width, var(--rt-aside-width-md))}rt-aside .rt-aside--size--lg{width:var(--rt-aside-width, var(--rt-aside-width-lg))}rt-aside .rt-aside--content--tabs .rt-aside__content{overflow:hidden;padding-block-end:0}rt-aside .rt-aside--content--tabs rt-tabs{min-height:0;flex:1 1 auto;margin-inline:calc(-1 * var(--rt-aside-inset))}rt-aside .rt-aside--content--tabs .rt-tabs__header{padding-inline:var(--rt-aside-inset)}rt-aside .rt-aside--content--tabs .rt-tabs__content{padding-bottom:var(--rt-aside-inset);padding-inline:var(--rt-aside-inset)}@media(width<=768px){rt-aside .rt-aside,rt-aside .rt-aside--size--sm,rt-aside .rt-aside--size--md,rt-aside .rt-aside--size--lg{width:var(--rt-aside-narrow-width);max-width:var(--rt-aside-narrow-width)}}}\n"], dependencies: [{ kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }, { kind: "component", type: RtAsideErrorBoxComponent, selector: "rt-aside-error-box", inputs: ["error"] }, { kind: "component", type: RtSpinnerComponent, selector: "rt-spinner", inputs: ["diameter", "color", "appearance", "overlay", "backdrop", "plate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
26
+ return `Error time: ${now.toDateString()}_${now.toTimeString()};Error info: ${errorAsText(error)}`;
181
27
  }
182
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtAsideComponent, decorators: [{
183
- type: Component,
184
- args: [{ selector: 'rt-aside', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [BlockDirective, ElemDirective, ModDirective, RtAsideErrorBoxComponent, RtSpinnerComponent], host: {
185
- class: BEM_BLOCK$3,
186
- }, template: "<div\n #frame\n rtBlock=\"rt-aside\"\n qa-dataid=\"aside\"\n role=\"complementary\"\n [rtMod]=\"{ size: size(), content: contentLayout() }\"\n [style.--rt-aside-width]=\"width()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-busy]=\"pending() || null\">\n <ng-content select=\"rt-aside-header\" />\n\n @if (hasRequestError()) {\n <rt-aside-error-box rtElem=\"error\" [error]=\"requestError()\" />\n }\n\n <div rtElem=\"content\" qa-dataid=\"aside-content\">\n <ng-content />\n </div>\n\n <ng-content select=\"rt-aside-footer\" />\n\n @if (pending()) {\n <div rtElem=\"pending\" qa-dataid=\"aside-pending\">\n <rt-spinner />\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{:root{--rt-aside-animation-duration: .2s;--rt-aside-backdrop-bg: var(--rt-color-bg-overlay);--rt-aside-backdrop-blur: 5px}.cdk-overlay-backdrop.rt-aside-backdrop{-webkit-backdrop-filter:blur(var(--rt-aside-backdrop-blur));backdrop-filter:blur(var(--rt-aside-backdrop-blur));background:var(--rt-aside-backdrop-bg);transition:opacity var(--rt-aside-animation-duration) ease}:is(.rt-preset-material,[data-preset=material]).cdk-overlay-backdrop.rt-aside-backdrop,[data-preset=material] .cdk-overlay-backdrop.rt-aside-backdrop{--rt-aside-backdrop-bg: var(--rt-color-bg-overlay);--rt-aside-backdrop-blur: 0}.rt-aside-overlay{height:100dvh;transition:transform var(--rt-aside-animation-duration) ease}.rt-aside-overlay.rt-aside-overlay--entering{transition:none}.rt-aside-overlay--position-right.rt-aside-overlay--entering,.rt-aside-overlay--position-right.rt-aside-overlay--leaving{transform:translate(100%)}.rt-aside-overlay--position-left.rt-aside-overlay--entering,.rt-aside-overlay--position-left.rt-aside-overlay--leaving{transform:translate(-100%)}.rt-aside-overlay--position-right.rt-aside-overlay--open,.rt-aside-overlay--position-left.rt-aside-overlay--open{transform:translate(0)}@media(width<=768px){.rt-aside-overlay{overflow:hidden;width:100dvw;max-width:100dvw}}@media(prefers-reduced-motion:reduce){.rt-aside-overlay{transition:none}}}.cdk-overlay-backdrop.rt-aside-backdrop{opacity:0;pointer-events:none}.cdk-overlay-backdrop.rt-aside-backdrop.rt-aside-backdrop--visible{opacity:1;pointer-events:auto}.rt-aside-overlay:not(.rt-aside-overlay--open){pointer-events:none}@layer rt-kit.components{:root{--rt-aside-width-sm: 400px;--rt-aside-width-md: 540px;--rt-aside-width-lg: 720px;--rt-aside-inset: var(--rt-space-lg);--rt-aside-content-gap: var(--rt-space-md);--rt-aside-narrow-width: 100dvw}rt-aside{display:contents}rt-aside .rt-aside{position:relative;display:flex;width:var(--rt-aside-width, var(--rt-aside-width-md));min-width:0;max-width:100%;height:100%;flex-direction:column;padding:0;border:none;background:var(--rt-aside-bg, var(--rt-color-bg-surface));color:var(--rt-color-text-primary)}rt-aside .rt-aside>rt-aside-header,rt-aside .rt-aside>rt-aside-footer{min-width:0;flex-shrink:0}rt-aside .rt-aside__error{min-width:0;flex-shrink:0;margin-block:var(--rt-aside-error-margin-block, 0);padding-inline:var(--rt-aside-inset)}rt-aside .rt-aside__content{display:flex;min-width:0;min-height:0;flex:1 1 auto;flex-direction:column;padding:var(--rt-aside-content-inset, var(--rt-aside-inset));gap:var(--rt-aside-content-gap);overflow-y:auto;overscroll-behavior:contain}rt-aside .rt-aside__pending{position:absolute;z-index:var(--rt-z-sticky);display:flex;align-items:center;justify-content:center;background-color:color-mix(in srgb,var(--rt-color-bg-surface) 60%,transparent);inset:0}rt-aside .rt-aside--size--sm{width:var(--rt-aside-width, var(--rt-aside-width-sm))}rt-aside .rt-aside--size--md{width:var(--rt-aside-width, var(--rt-aside-width-md))}rt-aside .rt-aside--size--lg{width:var(--rt-aside-width, var(--rt-aside-width-lg))}rt-aside .rt-aside--content--tabs .rt-aside__content{overflow:hidden;padding-block-end:0}rt-aside .rt-aside--content--tabs rt-tabs{min-height:0;flex:1 1 auto;margin-inline:calc(-1 * var(--rt-aside-inset))}rt-aside .rt-aside--content--tabs .rt-tabs__header{padding-inline:var(--rt-aside-inset)}rt-aside .rt-aside--content--tabs .rt-tabs__content{padding-bottom:var(--rt-aside-inset);padding-inline:var(--rt-aside-inset)}@media(width<=768px){rt-aside .rt-aside,rt-aside .rt-aside--size--sm,rt-aside .rt-aside--size--md,rt-aside .rt-aside--size--lg{width:var(--rt-aside-narrow-width);max-width:var(--rt-aside-narrow-width)}}}\n"] }]
187
- }], ctorParameters: () => [], propDecorators: { frame: [{ type: i0.ViewChild, args: ['frame', { isSignal: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], contentLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentLayout", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], requestError: [{ type: i0.Input, args: [{ isSignal: true, alias: "requestError", required: false }] }], trapFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "trapFocus", required: false }] }], pending: [{ type: i0.Input, args: [{ isSignal: true, alias: "pending", required: false }] }] } });
188
-
189
- /** Длительность slide-out анимации; синхронизирована с `--rt-aside-animation-duration` в SCSS. */
28
+ const BEM_BLOCK$4 = "rt-aside-error-box";
29
+ const CONFIRM_DELAY_MS = 1e3;
30
+ var RtAsideErrorBoxComponent = class RtAsideErrorBoxComponent {
31
+ #clipboard;
32
+ #destroyRef;
33
+ #confirmTimer;
34
+ #copyLabel;
35
+ #copiedLabel;
36
+ constructor() {
37
+ this.#clipboard = inject(Clipboard);
38
+ this.#destroyRef = inject(DestroyRef);
39
+ this.#confirmTimer = null;
40
+ this.#copyLabel = rtKitLabel("asideCopyErrorInfo");
41
+ this.#copiedLabel = rtKitLabel("uiCopied");
42
+ this.title = rtKitLabel("asideRequestError");
43
+ this.copied = signal(false, ...ngDevMode ? [{ debugName: "copied" }] : /* istanbul ignore next */ []);
44
+ this.buttonLabel = computed(() => this.copied() ? this.#copiedLabel() : this.#copyLabel(), ...ngDevMode ? [{ debugName: "buttonLabel" }] : /* istanbul ignore next */ []);
45
+ this.buttonIcon = computed(() => this.copied() ? "check" : null, ...ngDevMode ? [{ debugName: "buttonIcon" }] : /* istanbul ignore next */ []);
46
+ this.error = input.required(...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
47
+ this.#destroyRef.onDestroy(() => this.#clearTimer());
48
+ }
49
+ onCopy() {
50
+ this.#clipboard.copy(rtAsideErrorCopyText(this.error(), /* @__PURE__ */ new Date()));
51
+ this.copied.set(true);
52
+ this.#clearTimer();
53
+ this.#confirmTimer = setTimeout(() => this.copied.set(false), CONFIRM_DELAY_MS);
54
+ }
55
+ #clearTimer() {
56
+ if (this.#confirmTimer !== null) {
57
+ clearTimeout(this.#confirmTimer);
58
+ this.#confirmTimer = null;
59
+ }
60
+ }
61
+ static {
62
+ this.ɵfac = i0.ɵɵngDeclareFactory({
63
+ minVersion: "12.0.0",
64
+ version: "22.2.2",
65
+ ngImport: i0,
66
+ type: RtAsideErrorBoxComponent,
67
+ deps: [],
68
+ target: i0.ɵɵFactoryTarget.Component
69
+ });
70
+ }
71
+ static {
72
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
73
+ minVersion: "17.1.0",
74
+ version: "22.2.2",
75
+ type: RtAsideErrorBoxComponent,
76
+ isStandalone: true,
77
+ selector: "rt-aside-error-box",
78
+ inputs: { error: {
79
+ classPropertyName: "error",
80
+ publicName: "error",
81
+ isSignal: true,
82
+ isRequired: true,
83
+ transformFunction: null
84
+ } },
85
+ host: { classAttribute: "rt-aside-error-box" },
86
+ ngImport: i0,
87
+ template: "<ng-container rtBlock=\"rt-aside-error-box\">\n <div rtElem=\"frame\" qa-dataid=\"aside-error-box\">\n <span rtElem=\"title\" qa-dataid=\"aside-error-title\">{{ title() }}</span>\n\n <button\n rtButton\n rtElem=\"copy\"\n qa-dataid=\"aside-error-copy\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n [label]=\"buttonLabel()\"\n [icon]=\"buttonIcon()\"\n [attr.aria-label]=\"buttonLabel()\"\n (click)=\"onCopy()\"></button>\n </div>\n</ng-container>\n",
88
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-error-box{--rt-aside-error-box-min-height: 2rem;--rt-aside-error-box-border-width: 1px;--rt-aside-error-box-radius: var(--rt-radius-md);display:block;min-width:0}.rt-aside-error-box__frame{display:flex;min-width:0;min-height:var(--rt-aside-error-box-min-height);align-items:center;justify-content:space-between;padding:var(--rt-space-2);border:var(--rt-aside-error-box-border-width) solid var(--rt-color-state-danger);border-radius:var(--rt-aside-error-box-radius);gap:var(--rt-space-2)}.rt-aside-error-box__title{min-width:0;color:var(--rt-color-state-danger);font-size:var(--rt-text-md);overflow-wrap:anywhere}.rt-aside-error-box__copy{flex-shrink:0}}\n"],
89
+ dependencies: [
90
+ {
91
+ kind: "directive",
92
+ type: RtButtonDirective,
93
+ selector: "button[rtButton], a[rtButton]",
94
+ inputs: [
95
+ "label",
96
+ "icon",
97
+ "iconPos",
98
+ "theme",
99
+ "appearance",
100
+ "size",
101
+ "loading",
102
+ "loadingIcon",
103
+ "loadingLabel",
104
+ "pressed"
105
+ ]
106
+ },
107
+ {
108
+ kind: "directive",
109
+ type: BlockDirective,
110
+ selector: "[rtBlock]",
111
+ inputs: ["rtMod"]
112
+ },
113
+ {
114
+ kind: "directive",
115
+ type: ElemDirective,
116
+ selector: "[rtElem]",
117
+ inputs: ["rtMod"]
118
+ }
119
+ ],
120
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
121
+ encapsulation: i0.ViewEncapsulation.None
122
+ });
123
+ }
124
+ };
125
+ i0.ɵɵngDeclareClassMetadata({
126
+ minVersion: "12.0.0",
127
+ version: "22.2.2",
128
+ ngImport: i0,
129
+ type: RtAsideErrorBoxComponent,
130
+ decorators: [{
131
+ type: Component,
132
+ args: [{
133
+ selector: "rt-aside-error-box",
134
+ changeDetection: ChangeDetectionStrategy.OnPush,
135
+ encapsulation: ViewEncapsulation.None,
136
+ imports: [
137
+ RtButtonDirective,
138
+ BlockDirective,
139
+ ElemDirective
140
+ ],
141
+ host: { class: BEM_BLOCK$4 },
142
+ template: "<ng-container rtBlock=\"rt-aside-error-box\">\n <div rtElem=\"frame\" qa-dataid=\"aside-error-box\">\n <span rtElem=\"title\" qa-dataid=\"aside-error-title\">{{ title() }}</span>\n\n <button\n rtButton\n rtElem=\"copy\"\n qa-dataid=\"aside-error-copy\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n [label]=\"buttonLabel()\"\n [icon]=\"buttonIcon()\"\n [attr.aria-label]=\"buttonLabel()\"\n (click)=\"onCopy()\"></button>\n </div>\n</ng-container>\n",
143
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-error-box{--rt-aside-error-box-min-height: 2rem;--rt-aside-error-box-border-width: 1px;--rt-aside-error-box-radius: var(--rt-radius-md);display:block;min-width:0}.rt-aside-error-box__frame{display:flex;min-width:0;min-height:var(--rt-aside-error-box-min-height);align-items:center;justify-content:space-between;padding:var(--rt-space-2);border:var(--rt-aside-error-box-border-width) solid var(--rt-color-state-danger);border-radius:var(--rt-aside-error-box-radius);gap:var(--rt-space-2)}.rt-aside-error-box__title{min-width:0;color:var(--rt-color-state-danger);font-size:var(--rt-text-md);overflow-wrap:anywhere}.rt-aside-error-box__copy{flex-shrink:0}}\n"]
144
+ }]
145
+ }],
146
+ ctorParameters: () => [],
147
+ propDecorators: { error: [{
148
+ type: i0.Input,
149
+ args: [{
150
+ isSignal: true,
151
+ alias: "error",
152
+ required: true
153
+ }]
154
+ }] }
155
+ });
156
+ const BEM_BLOCK$3 = "rt-aside";
157
+ var RtAsideComponent = class RtAsideComponent {
158
+ #focusTrapFactory;
159
+ #document;
160
+ #focusTrap;
161
+ #restoreFocusTo;
162
+ constructor() {
163
+ this.#focusTrapFactory = inject(FocusTrapFactory);
164
+ this.#document = inject(DOCUMENT);
165
+ this.#focusTrap = null;
166
+ this.#restoreFocusTo = null;
167
+ this.frame = viewChild.required("frame", ...ngDevMode ? [{ debugName: "frame" }] : /* istanbul ignore next */ []);
168
+ this.hasRequestError = computed(() => this.requestError() !== null && this.requestError() !== void 0, ...ngDevMode ? [{ debugName: "hasRequestError" }] : /* istanbul ignore next */ []);
169
+ this.size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
170
+ this.contentLayout = input("default", ...ngDevMode ? [{ debugName: "contentLayout" }] : /* istanbul ignore next */ []);
171
+ this.width = input(null, ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
172
+ this.ariaLabel = input(null, ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
173
+ this.requestError = input(null, ...ngDevMode ? [{ debugName: "requestError" }] : /* istanbul ignore next */ []);
174
+ this.trapFocus = input(false, {
175
+ ...ngDevMode ? { debugName: "trapFocus" } : /* istanbul ignore next */ {},
176
+ transform: booleanAttribute
177
+ });
178
+ this.pending = input(false, {
179
+ ...ngDevMode ? { debugName: "pending" } : /* istanbul ignore next */ {},
180
+ transform: booleanAttribute
181
+ });
182
+ afterRenderEffect(() => {
183
+ const enabled = this.trapFocus();
184
+ const frame = this.frame().nativeElement;
185
+ untracked(() => enabled ? this.#holdFocus(frame) : this.#releaseFocus());
186
+ });
187
+ inject(DestroyRef).onDestroy(() => this.#releaseFocus());
188
+ }
189
+ #holdFocus(frame) {
190
+ if (this.#focusTrap !== null) return;
191
+ const focused = this.#document.activeElement;
192
+ this.#restoreFocusTo = focused instanceof HTMLElement ? focused : null;
193
+ this.#focusTrap = this.#focusTrapFactory.create(frame);
194
+ this.#focusTrap.focusInitialElementWhenReady();
195
+ }
196
+ #releaseFocus() {
197
+ if (this.#focusTrap === null) return;
198
+ this.#focusTrap.destroy();
199
+ this.#focusTrap = null;
200
+ const restoreTo = this.#restoreFocusTo;
201
+ this.#restoreFocusTo = null;
202
+ if (restoreTo?.isConnected === true) restoreTo.focus();
203
+ }
204
+ static {
205
+ this.ɵfac = i0.ɵɵngDeclareFactory({
206
+ minVersion: "12.0.0",
207
+ version: "22.2.2",
208
+ ngImport: i0,
209
+ type: RtAsideComponent,
210
+ deps: [],
211
+ target: i0.ɵɵFactoryTarget.Component
212
+ });
213
+ }
214
+ static {
215
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
216
+ minVersion: "17.0.0",
217
+ version: "22.2.2",
218
+ type: RtAsideComponent,
219
+ isStandalone: true,
220
+ selector: "rt-aside",
221
+ inputs: {
222
+ size: {
223
+ classPropertyName: "size",
224
+ publicName: "size",
225
+ isSignal: true,
226
+ isRequired: false,
227
+ transformFunction: null
228
+ },
229
+ contentLayout: {
230
+ classPropertyName: "contentLayout",
231
+ publicName: "contentLayout",
232
+ isSignal: true,
233
+ isRequired: false,
234
+ transformFunction: null
235
+ },
236
+ width: {
237
+ classPropertyName: "width",
238
+ publicName: "width",
239
+ isSignal: true,
240
+ isRequired: false,
241
+ transformFunction: null
242
+ },
243
+ ariaLabel: {
244
+ classPropertyName: "ariaLabel",
245
+ publicName: "ariaLabel",
246
+ isSignal: true,
247
+ isRequired: false,
248
+ transformFunction: null
249
+ },
250
+ requestError: {
251
+ classPropertyName: "requestError",
252
+ publicName: "requestError",
253
+ isSignal: true,
254
+ isRequired: false,
255
+ transformFunction: null
256
+ },
257
+ trapFocus: {
258
+ classPropertyName: "trapFocus",
259
+ publicName: "trapFocus",
260
+ isSignal: true,
261
+ isRequired: false,
262
+ transformFunction: null
263
+ },
264
+ pending: {
265
+ classPropertyName: "pending",
266
+ publicName: "pending",
267
+ isSignal: true,
268
+ isRequired: false,
269
+ transformFunction: null
270
+ }
271
+ },
272
+ host: { classAttribute: "rt-aside" },
273
+ viewQueries: [{
274
+ propertyName: "frame",
275
+ first: true,
276
+ predicate: ["frame"],
277
+ descendants: true,
278
+ isSignal: true
279
+ }],
280
+ ngImport: i0,
281
+ template: "<div\n #frame\n rtBlock=\"rt-aside\"\n qa-dataid=\"aside\"\n role=\"complementary\"\n [rtMod]=\"{ size: size(), content: contentLayout() }\"\n [style.--rt-aside-width]=\"width()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-busy]=\"pending() || null\">\n <ng-content select=\"rt-aside-header\" />\n\n @if (hasRequestError()) {\n <rt-aside-error-box rtElem=\"error\" [error]=\"requestError()\" />\n }\n\n <div rtElem=\"content\" qa-dataid=\"aside-content\">\n <ng-content />\n </div>\n\n <ng-content select=\"rt-aside-footer\" />\n\n @if (pending()) {\n <div rtElem=\"pending\" qa-dataid=\"aside-pending\">\n <rt-spinner />\n </div>\n }\n</div>\n",
282
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{:root{--rt-aside-animation-duration: .2s;--rt-aside-backdrop-bg: var(--rt-color-bg-overlay);--rt-aside-backdrop-blur: 5px}.cdk-overlay-backdrop.rt-aside-backdrop{-webkit-backdrop-filter:blur(var(--rt-aside-backdrop-blur));backdrop-filter:blur(var(--rt-aside-backdrop-blur));background:var(--rt-aside-backdrop-bg);transition:opacity var(--rt-aside-animation-duration) ease}:is(.rt-preset-material,[data-preset=material]).cdk-overlay-backdrop.rt-aside-backdrop,[data-preset=material] .cdk-overlay-backdrop.rt-aside-backdrop{--rt-aside-backdrop-bg: var(--rt-color-bg-overlay);--rt-aside-backdrop-blur: 0}.rt-aside-overlay{height:100dvh;transition:transform var(--rt-aside-animation-duration) ease}.rt-aside-overlay.rt-aside-overlay--entering{transition:none}.rt-aside-overlay--position-right.rt-aside-overlay--entering,.rt-aside-overlay--position-right.rt-aside-overlay--leaving{transform:translate(100%)}.rt-aside-overlay--position-left.rt-aside-overlay--entering,.rt-aside-overlay--position-left.rt-aside-overlay--leaving{transform:translate(-100%)}.rt-aside-overlay--position-right.rt-aside-overlay--open,.rt-aside-overlay--position-left.rt-aside-overlay--open{transform:translate(0)}@media(width<=768px){.rt-aside-overlay{overflow:hidden;width:100dvw;max-width:100dvw}}@media(prefers-reduced-motion:reduce){.rt-aside-overlay{transition:none}}}.cdk-overlay-backdrop.rt-aside-backdrop{opacity:0;pointer-events:none}.cdk-overlay-backdrop.rt-aside-backdrop.rt-aside-backdrop--visible{opacity:1;pointer-events:auto}.rt-aside-overlay:not(.rt-aside-overlay--open){pointer-events:none}@layer rt-kit.components{:root{--rt-aside-width-sm: 400px;--rt-aside-width-md: 540px;--rt-aside-width-lg: 720px;--rt-aside-inset: var(--rt-space-lg);--rt-aside-content-gap: var(--rt-space-md);--rt-aside-narrow-width: 100dvw}rt-aside{display:contents}rt-aside .rt-aside{position:relative;display:flex;width:var(--rt-aside-width, var(--rt-aside-width-md));min-width:0;max-width:100%;height:100%;flex-direction:column;padding:0;border:none;background:var(--rt-aside-bg, var(--rt-color-bg-surface));color:var(--rt-color-text-primary)}rt-aside .rt-aside>rt-aside-header,rt-aside .rt-aside>rt-aside-footer{min-width:0;flex-shrink:0}rt-aside .rt-aside__error{min-width:0;flex-shrink:0;margin-block:var(--rt-aside-error-margin-block, 0);padding-inline:var(--rt-aside-inset)}rt-aside .rt-aside__content{display:flex;min-width:0;min-height:0;flex:1 1 auto;flex-direction:column;padding:var(--rt-aside-content-inset, var(--rt-aside-inset));gap:var(--rt-aside-content-gap);overflow-y:auto;overscroll-behavior:contain}rt-aside .rt-aside__pending{position:absolute;z-index:var(--rt-z-sticky);display:flex;align-items:center;justify-content:center;background-color:color-mix(in srgb,var(--rt-color-bg-surface) 60%,transparent);inset:0}rt-aside .rt-aside--size--sm{width:var(--rt-aside-width, var(--rt-aside-width-sm))}rt-aside .rt-aside--size--md{width:var(--rt-aside-width, var(--rt-aside-width-md))}rt-aside .rt-aside--size--lg{width:var(--rt-aside-width, var(--rt-aside-width-lg))}rt-aside .rt-aside--content--tabs .rt-aside__content{overflow:hidden;padding-block-end:0}rt-aside .rt-aside--content--tabs rt-tabs{min-height:0;flex:1 1 auto;margin-inline:calc(-1 * var(--rt-aside-inset))}rt-aside .rt-aside--content--tabs .rt-tabs__header{padding-inline:var(--rt-aside-inset)}rt-aside .rt-aside--content--tabs .rt-tabs__content{padding-bottom:var(--rt-aside-inset);padding-inline:var(--rt-aside-inset)}@media(width<=768px){rt-aside .rt-aside,rt-aside .rt-aside--size--sm,rt-aside .rt-aside--size--md,rt-aside .rt-aside--size--lg{width:var(--rt-aside-narrow-width);max-width:var(--rt-aside-narrow-width)}}}\n"],
283
+ dependencies: [
284
+ {
285
+ kind: "directive",
286
+ type: BlockDirective,
287
+ selector: "[rtBlock]",
288
+ inputs: ["rtMod"]
289
+ },
290
+ {
291
+ kind: "directive",
292
+ type: ElemDirective,
293
+ selector: "[rtElem]",
294
+ inputs: ["rtMod"]
295
+ },
296
+ {
297
+ kind: "directive",
298
+ type: ModDirective,
299
+ selector: "[rtMod]"
300
+ },
301
+ {
302
+ kind: "component",
303
+ type: RtAsideErrorBoxComponent,
304
+ selector: "rt-aside-error-box",
305
+ inputs: ["error"]
306
+ },
307
+ {
308
+ kind: "component",
309
+ type: RtSpinnerComponent,
310
+ selector: "rt-spinner",
311
+ inputs: [
312
+ "diameter",
313
+ "color",
314
+ "appearance",
315
+ "overlay",
316
+ "backdrop",
317
+ "plate"
318
+ ]
319
+ }
320
+ ],
321
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
322
+ encapsulation: i0.ViewEncapsulation.None
323
+ });
324
+ }
325
+ };
326
+ i0.ɵɵngDeclareClassMetadata({
327
+ minVersion: "12.0.0",
328
+ version: "22.2.2",
329
+ ngImport: i0,
330
+ type: RtAsideComponent,
331
+ decorators: [{
332
+ type: Component,
333
+ args: [{
334
+ selector: "rt-aside",
335
+ changeDetection: ChangeDetectionStrategy.OnPush,
336
+ encapsulation: ViewEncapsulation.None,
337
+ imports: [
338
+ BlockDirective,
339
+ ElemDirective,
340
+ ModDirective,
341
+ RtAsideErrorBoxComponent,
342
+ RtSpinnerComponent
343
+ ],
344
+ host: { class: BEM_BLOCK$3 },
345
+ template: "<div\n #frame\n rtBlock=\"rt-aside\"\n qa-dataid=\"aside\"\n role=\"complementary\"\n [rtMod]=\"{ size: size(), content: contentLayout() }\"\n [style.--rt-aside-width]=\"width()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-busy]=\"pending() || null\">\n <ng-content select=\"rt-aside-header\" />\n\n @if (hasRequestError()) {\n <rt-aside-error-box rtElem=\"error\" [error]=\"requestError()\" />\n }\n\n <div rtElem=\"content\" qa-dataid=\"aside-content\">\n <ng-content />\n </div>\n\n <ng-content select=\"rt-aside-footer\" />\n\n @if (pending()) {\n <div rtElem=\"pending\" qa-dataid=\"aside-pending\">\n <rt-spinner />\n </div>\n }\n</div>\n",
346
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{:root{--rt-aside-animation-duration: .2s;--rt-aside-backdrop-bg: var(--rt-color-bg-overlay);--rt-aside-backdrop-blur: 5px}.cdk-overlay-backdrop.rt-aside-backdrop{-webkit-backdrop-filter:blur(var(--rt-aside-backdrop-blur));backdrop-filter:blur(var(--rt-aside-backdrop-blur));background:var(--rt-aside-backdrop-bg);transition:opacity var(--rt-aside-animation-duration) ease}:is(.rt-preset-material,[data-preset=material]).cdk-overlay-backdrop.rt-aside-backdrop,[data-preset=material] .cdk-overlay-backdrop.rt-aside-backdrop{--rt-aside-backdrop-bg: var(--rt-color-bg-overlay);--rt-aside-backdrop-blur: 0}.rt-aside-overlay{height:100dvh;transition:transform var(--rt-aside-animation-duration) ease}.rt-aside-overlay.rt-aside-overlay--entering{transition:none}.rt-aside-overlay--position-right.rt-aside-overlay--entering,.rt-aside-overlay--position-right.rt-aside-overlay--leaving{transform:translate(100%)}.rt-aside-overlay--position-left.rt-aside-overlay--entering,.rt-aside-overlay--position-left.rt-aside-overlay--leaving{transform:translate(-100%)}.rt-aside-overlay--position-right.rt-aside-overlay--open,.rt-aside-overlay--position-left.rt-aside-overlay--open{transform:translate(0)}@media(width<=768px){.rt-aside-overlay{overflow:hidden;width:100dvw;max-width:100dvw}}@media(prefers-reduced-motion:reduce){.rt-aside-overlay{transition:none}}}.cdk-overlay-backdrop.rt-aside-backdrop{opacity:0;pointer-events:none}.cdk-overlay-backdrop.rt-aside-backdrop.rt-aside-backdrop--visible{opacity:1;pointer-events:auto}.rt-aside-overlay:not(.rt-aside-overlay--open){pointer-events:none}@layer rt-kit.components{:root{--rt-aside-width-sm: 400px;--rt-aside-width-md: 540px;--rt-aside-width-lg: 720px;--rt-aside-inset: var(--rt-space-lg);--rt-aside-content-gap: var(--rt-space-md);--rt-aside-narrow-width: 100dvw}rt-aside{display:contents}rt-aside .rt-aside{position:relative;display:flex;width:var(--rt-aside-width, var(--rt-aside-width-md));min-width:0;max-width:100%;height:100%;flex-direction:column;padding:0;border:none;background:var(--rt-aside-bg, var(--rt-color-bg-surface));color:var(--rt-color-text-primary)}rt-aside .rt-aside>rt-aside-header,rt-aside .rt-aside>rt-aside-footer{min-width:0;flex-shrink:0}rt-aside .rt-aside__error{min-width:0;flex-shrink:0;margin-block:var(--rt-aside-error-margin-block, 0);padding-inline:var(--rt-aside-inset)}rt-aside .rt-aside__content{display:flex;min-width:0;min-height:0;flex:1 1 auto;flex-direction:column;padding:var(--rt-aside-content-inset, var(--rt-aside-inset));gap:var(--rt-aside-content-gap);overflow-y:auto;overscroll-behavior:contain}rt-aside .rt-aside__pending{position:absolute;z-index:var(--rt-z-sticky);display:flex;align-items:center;justify-content:center;background-color:color-mix(in srgb,var(--rt-color-bg-surface) 60%,transparent);inset:0}rt-aside .rt-aside--size--sm{width:var(--rt-aside-width, var(--rt-aside-width-sm))}rt-aside .rt-aside--size--md{width:var(--rt-aside-width, var(--rt-aside-width-md))}rt-aside .rt-aside--size--lg{width:var(--rt-aside-width, var(--rt-aside-width-lg))}rt-aside .rt-aside--content--tabs .rt-aside__content{overflow:hidden;padding-block-end:0}rt-aside .rt-aside--content--tabs rt-tabs{min-height:0;flex:1 1 auto;margin-inline:calc(-1 * var(--rt-aside-inset))}rt-aside .rt-aside--content--tabs .rt-tabs__header{padding-inline:var(--rt-aside-inset)}rt-aside .rt-aside--content--tabs .rt-tabs__content{padding-bottom:var(--rt-aside-inset);padding-inline:var(--rt-aside-inset)}@media(width<=768px){rt-aside .rt-aside,rt-aside .rt-aside--size--sm,rt-aside .rt-aside--size--md,rt-aside .rt-aside--size--lg{width:var(--rt-aside-narrow-width);max-width:var(--rt-aside-narrow-width)}}}\n"]
347
+ }]
348
+ }],
349
+ ctorParameters: () => [],
350
+ propDecorators: {
351
+ frame: [{
352
+ type: i0.ViewChild,
353
+ args: ["frame", { isSignal: true }]
354
+ }],
355
+ size: [{
356
+ type: i0.Input,
357
+ args: [{
358
+ isSignal: true,
359
+ alias: "size",
360
+ required: false
361
+ }]
362
+ }],
363
+ contentLayout: [{
364
+ type: i0.Input,
365
+ args: [{
366
+ isSignal: true,
367
+ alias: "contentLayout",
368
+ required: false
369
+ }]
370
+ }],
371
+ width: [{
372
+ type: i0.Input,
373
+ args: [{
374
+ isSignal: true,
375
+ alias: "width",
376
+ required: false
377
+ }]
378
+ }],
379
+ ariaLabel: [{
380
+ type: i0.Input,
381
+ args: [{
382
+ isSignal: true,
383
+ alias: "ariaLabel",
384
+ required: false
385
+ }]
386
+ }],
387
+ requestError: [{
388
+ type: i0.Input,
389
+ args: [{
390
+ isSignal: true,
391
+ alias: "requestError",
392
+ required: false
393
+ }]
394
+ }],
395
+ trapFocus: [{
396
+ type: i0.Input,
397
+ args: [{
398
+ isSignal: true,
399
+ alias: "trapFocus",
400
+ required: false
401
+ }]
402
+ }],
403
+ pending: [{
404
+ type: i0.Input,
405
+ args: [{
406
+ isSignal: true,
407
+ alias: "pending",
408
+ required: false
409
+ }]
410
+ }]
411
+ }
412
+ });
190
413
  const LEAVE_ANIMATION_DURATION_MS = 200;
191
- /**
192
- * Хэндл к программно открытой side-sheet (через `RtAsideService.open()`).
193
- *
194
- * Контент-компонент инжектит `RtAsideRef` и закрывает aside через `.close(result?)`.
195
- * Родитель ждёт результата через `.afterClosed()`.
196
- *
197
- * Generic `<T>` — тип результата `close(result)`. Дефолт `unknown` — если результат
198
- * не нужен, оставляй generic пустым.
199
- *
200
- * Lifecycle close():
201
- * 1. Race-guard `#isClosing` гарантирует один эмит даже при двойном вызове.
202
- * 2. Снимает `rt-aside-overlay--open` и ставит `rt-aside-overlay--leaving` на host —
203
- * CSS-transition (200ms) играет slide-out.
204
- * 3. Эмиттит result в `afterClosed()` СРАЗУ (consumer не ждёт анимацию).
205
- * 4. Через `setTimeout(200ms)` зовёт `overlayRef.dispose()` — overlay убран после анимации.
206
- *
207
- * Слой, снятый без `close()` — переходом по адресу (`disposeOnNavigation`) или уничтожением
208
- * хозяина, — тоже завершает `afterClosed()`: подписчик получает `undefined`.
209
- *
210
- * @example
211
- * \`\`\`ts
212
- * // в контент-компоненте
213
- * private readonly asideRef = inject(RtAsideRef<{ saved: boolean }>);
214
- * onSave(): void { this.asideRef.close({ saved: true }); }
215
- *
216
- * // в родителе
217
- * asideService.open(EditAsideComponent).afterClosed().subscribe(result => {...});
218
- * \`\`\`
219
- */
220
- class RtAsideRef {
221
- #overlayRef;
222
- #renderer;
223
- #afterClosedSource;
224
- #closeRequestsSource;
225
- #isClosing;
226
- /**
227
- * `closeRequestsSource` наполняет служба: она слушает жесты и знает, отказала ли в них панель.
228
- * Хэндл только завершает поток вместе с панелью.
229
- */
230
- constructor(overlayRef, renderer, closeRequestsSource = new Subject()) {
231
- /**
232
- * Runtime-флаг, блокирующий close() через ESC / backdrop click.
233
- *
234
- * Default `false`. Включай (`asideRef.disableClose.set(true)`) на время
235
- * in-flight submit'а, чтобы юзер не потерял введённые в форму данные.
236
- * Программный `close(result)` гейтом не задет — он всегда закрывает.
237
- */
238
- this.disableClose = signal(false, /* @ts-ignore */
239
- ...(ngDevMode ? [{ debugName: "disableClose" }] : /* istanbul ignore next */ []));
240
- this.#afterClosedSource = new Subject();
241
- this.#isClosing = false;
242
- this.#overlayRef = overlayRef;
243
- this.#renderer = renderer;
244
- this.#closeRequestsSource = closeRequestsSource;
245
- this.#overlayRef
246
- .detachments()
247
- .pipe(take(1))
248
- .subscribe(() => this.#finish(undefined));
249
- }
250
- /** Закрывает overlay со slide-out анимацией; эмиттит result в `afterClosed()` синхронно. */
251
- close(result) {
252
- if (this.#isClosing) {
253
- return;
254
- }
255
- this.#isClosing = true;
256
- this.#renderer.removeClass(this.#overlayRef.overlayElement, 'rt-aside-overlay--open');
257
- this.#renderer.addClass(this.#overlayRef.overlayElement, 'rt-aside-overlay--leaving');
258
- // Эмитим результат сразу — consumer не ждёт slide-out.
259
- this.#emit(result);
260
- // Дефер dispose'а на длительность анимации — overlay остаётся в DOM,
261
- // пока CSS-transition не отыграет slide-out.
262
- setTimeout(() => {
263
- this.#overlayRef.dispose();
264
- }, LEAVE_ANIMATION_DURATION_MS);
265
- }
266
- /** Эмиттит один раз — результат `close(result)` или `undefined` при снятом слое — и завершается. */
267
- afterClosed() {
268
- return this.#afterClosedSource.asObservable();
269
- }
270
- /**
271
- * Жесты закрытия, в которых панель отказала: `Escape` и нажатие по подложке под
272
- * `disableClose()` или выключенные настройкой. Завершается вместе с панелью.
273
- */
274
- closeRequests() {
275
- return this.#closeRequestsSource.asObservable();
276
- }
277
- /** Слой снят без `close()`: анимации играть не на чем, остаётся отдать результат. */
278
- #finish(result) {
279
- if (this.#isClosing) {
280
- return;
281
- }
282
- this.#isClosing = true;
283
- this.#emit(result);
284
- }
285
- #emit(result) {
286
- this.#afterClosedSource.next(result);
287
- this.#afterClosedSource.complete();
288
- this.#closeRequestsSource.complete();
289
- }
290
- }
291
-
292
- /**
293
- * Injection token для передачи данных в side-sheet, открытую через `RtAsideService.open()`.
294
- *
295
- * Пользовательский компонент-контент aside'а инжектит токен и получает данные,
296
- * переданные в `IRtAsideConfig.data`. Тип значения задаётся generic'ом — `inject(RT_ASIDE_DATA)`
297
- * вернёт `unknown`, прокастуй через `inject(RT_ASIDE_DATA) as MyDataType` ИЛИ
298
- * объяви токен с конкретным generic'ом в feature-либе.
299
- *
300
- * Намеренно отдельный токен от `RT_DIALOG_DATA`, чтобы type-checker не путал контексты
301
- * (rt-dialog vs rt-aside) — оба сервиса могут существовать в одном DI-дереве.
302
- *
303
- * @example
304
- * \`\`\`ts
305
- * @Component({...})
306
- * export class GuestProfileAsideComponent {
307
- * readonly data = inject(RT_ASIDE_DATA) as { userId: number };
308
- * }
309
- *
310
- * // parent
311
- * asideService.open(GuestProfileAsideComponent, { data: { userId: 42 } });
312
- * \`\`\`
313
- */
314
- const RT_ASIDE_DATA = new InjectionToken('RT_ASIDE_DATA');
315
-
316
- /**
317
- * Программный API для открытия side-sheet поверх CDK Overlay.
318
- *
319
- * Архитектурно зеркалит `RtDialogService`, отличаясь только positionStrategy
320
- * (edge-anchored: `right('0')` / `left('0')` + `top('0')`) и slide-in анимацией,
321
- * которая триггерится через CSS-классы на overlay host (`Renderer2` инжектится
322
- * через `RendererFactory2`, потому что в service нет ComponentRef).
323
- *
324
- * Lifecycle:
325
- * 1. `overlay.create({ panelClass: [..., '--entering'] })` — host получает initial
326
- * CSS-стейт (translateX(±100%)).
327
- * 2. `overlayRef.attach(portal)` — контент-компонент монтируется в host.
328
- * 3. На следующий paint (`requestAnimationFrame`) сервис снимает `--entering` и
329
- * добавляет `--open` — CSS-transition сделает slide-in.
330
- * 4. На `ref.close(result)` ref добавляет `--leaving`, эмиттит result синхронно,
331
- * deferred `dispose()` через 200ms (длительность анимации).
332
- *
333
- * Альтернатива rt-dialog — для длинных форм / мастеров / side-panels, где
334
- * центрированная модалка ощущается тесной. Не предназначено для подтверждений
335
- * или коротких диалогов (для этого — `RtDialogService`).
336
- *
337
- * @example
338
- * \`\`\`ts
339
- * private readonly asideService = inject(RtAsideService);
340
- *
341
- * openProfile(userId: number): void {
342
- * const ref = this.asideService.open<GuestProfileAsideComponent, { userId: number }, void>(
343
- * GuestProfileAsideComponent,
344
- * { data: { userId }, position: "right" }
345
- * );
346
- * ref.afterClosed().subscribe(() => this.reloadList());
347
- * }
348
- *
349
- * // контент-компонент
350
- * @Component({ ... })
351
- * export class GuestProfileAsideComponent {
352
- * readonly data = inject(RT_ASIDE_DATA) as { userId: number };
353
- * readonly #ref = inject(RtAsideRef);
354
- * close(): void { this.#ref.close(); }
355
- * }
356
- * \`\`\`
357
- */
358
- class RtAsideService {
359
- #overlay = inject(Overlay);
360
- #injector = inject(Injector);
361
- #document = inject(DOCUMENT);
362
- // Renderer2 нужен для манипуляции CSS-классами на overlay.hostElement.
363
- // В service нет ComponentRef, поэтому Renderer2 берём через factory.
364
- #renderer = inject(RendererFactory2).createRenderer(null, null);
365
- #openSource = new Subject();
366
- /* Закрывает ли `Escape` штору, когда вызов об этом промолчал. Умолчание кита — закрывает;
367
- приложению, которому это мешает, иначе пришлось бы писать отказ на каждом вызове, и
368
- забытый вызов отличался бы от остальных. */
369
- #closeOnEscape = rtKitDefault('aside', (it) => it.closeOnEscape, true);
370
- constructor() {
371
- // Per-open close-подписки (backdrop / ESC) живут в одном постоянном
372
- // конструкторном стриме: open() эмитит контекст открытия, mergeMap
373
- // подписывает event-стримы конкретного OverlayRef до его dispose
374
- // (`detachments()` терминирует внутренний поток). mergeMap, а не
375
- // switchMap — одновременно может быть открыто несколько aside'ов.
376
- //
377
- // Runtime-guard через asideRef.disableClose() — те же правила, что в
378
- // rt-dialog: ESC / backdrop НЕ закрывают overlay, если disableClose=true;
379
- // программный ref.close() гейтом не задет.
380
- this.#openSource
381
- .pipe(mergeMap((openContext) => {
382
- // Оба жеста слушаются всегда: отказ в закрытии — тоже ответ, и он уходит в
383
- // `closeRequests()` хэндла, будь то `disableClose` или выключенный жест.
384
- const backdropClose$ = openContext.overlayRef.backdropClick().pipe(map(() => () => {
385
- this.#answerCloseGesture(openContext, 'backdrop', openContext.closeOnBackdropClick);
386
- }));
387
- const escapeClose$ = openContext.overlayRef.keydownEvents().pipe(map((event) => () => {
388
- if (event.key !== 'Escape') {
389
- return;
390
- }
391
- if (openContext.closeOnEscape) {
392
- event.preventDefault();
393
- }
394
- this.#answerCloseGesture(openContext, 'escape', openContext.closeOnEscape);
395
- }));
396
- const ownerClose$ = this.#destroyed(openContext.ownerDestroyRef).pipe(map(() => () => openContext.asideRef.close()));
397
- return merge(backdropClose$, escapeClose$, ownerClose$).pipe(takeUntil(openContext.overlayRef.detachments()));
398
- }), takeUntilDestroyed())
399
- .subscribe((handleCloseIntent) => handleCloseIntent());
400
- }
401
- open(component, config) {
402
- const position = config?.position ?? 'right';
403
- const positionStrategy = position === 'right'
404
- ? this.#overlay.position().global().right('0').top('0')
405
- : this.#overlay.position().global().left('0').top('0');
406
- const panelClasses = [
407
- 'rt-aside-overlay',
408
- `rt-aside-overlay--position-${position}`,
409
- 'rt-aside-overlay--entering',
410
- ...materialPresetClassesOfFocus(this.#document),
411
- ];
412
- const overlayConfig = {
413
- positionStrategy,
414
- scrollStrategy: this.#overlay.scrollStrategies.block(),
415
- hasBackdrop: true,
416
- backdropClass: config?.backdropClass ?? 'rt-aside-backdrop',
417
- panelClass: config?.panelClass !== undefined ? [...panelClasses, ...this.#toArray(config.panelClass)] : panelClasses,
418
- disposeOnNavigation: config?.disposeOnNavigation ?? true,
419
- };
420
- const overlayRef = this.#overlay.create(overlayConfig);
421
- // До attach: содержимое панели может забрать фокус, и кусок темы у кнопки будет потерян.
422
- carryThemeScopeOfFocus(overlayRef.overlayElement, this.#document);
423
- const closeRequests = new Subject();
424
- const asideRef = new RtAsideRef(overlayRef, this.#renderer, closeRequests);
425
- // Сами close-подписки объявлены один раз в конструкторе — здесь только
426
- // эмит контекста открытия (см. #openSource-стрим).
427
- this.#openSource.next({
428
- overlayRef,
429
- asideRef,
430
- closeRequests,
431
- ownerDestroyRef: config?.injector?.get(DestroyRef, null) ?? null,
432
- closeOnBackdropClick: config?.closeOnBackdropClick !== false,
433
- closeOnEscape: config?.closeOnEscape ?? this.#closeOnEscape,
434
- });
435
- const injector = Injector.create({
436
- parent: config?.injector ?? this.#injector,
437
- providers: [
438
- { provide: RtAsideRef, useValue: asideRef },
439
- { provide: RT_ASIDE_DATA, useValue: config?.data ?? null },
440
- ],
441
- });
442
- const portal = new ComponentPortal(component, null, injector);
443
- overlayRef.attach(portal);
444
- // Slide-in: на следующий paint снимаем --entering и добавляем --open.
445
- // CSS transition (см. rt-aside.component.scss) сделает анимацию.
446
- // Backdrop default hidden — toggle --visible одновременно со слайдом.
447
- // Панель могли снять до кадра — `close()`, переходом или уничтожением хозяина в том же такте.
448
- requestAnimationFrame(() => {
449
- if (!overlayRef.hasAttached()) {
450
- return;
451
- }
452
- this.#renderer.removeClass(overlayRef.overlayElement, 'rt-aside-overlay--entering');
453
- this.#renderer.addClass(overlayRef.overlayElement, 'rt-aside-overlay--open');
454
- const backdropEl = overlayRef.backdropElement;
455
- if (backdropEl !== null) {
456
- this.#renderer.addClass(backdropEl, 'rt-aside-backdrop--visible');
457
- }
458
- });
459
- return asideRef;
460
- }
461
- /** Жест закрытия: закрывает панель, если жест включён и не держит `disableClose`, иначе сообщает об отказе. */
462
- #answerCloseGesture(openContext, gesture, enabled) {
463
- if (enabled && !openContext.asideRef.disableClose()) {
464
- openContext.asideRef.close();
465
- return;
466
- }
467
- openContext.closeRequests.next(gesture);
468
- }
469
- /**
470
- * Уничтожение хозяина как поток. Отписка — уход панели — снимает слушателя с хозяина, и его
471
- * позднее уничтожение панель уже не трогает.
472
- */
473
- #destroyed(ownerDestroyRef) {
474
- if (ownerDestroyRef === null) {
475
- return EMPTY;
476
- }
477
- return new Observable((subscriber) => ownerDestroyRef.onDestroy(() => subscriber.next()));
478
- }
479
- /** Нормализует `string | string[]` к массиву (panelClass поддерживает оба формата). */
480
- #toArray(value) {
481
- return Array.isArray(value) ? value : [value];
482
- }
483
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtAsideService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
484
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtAsideService, providedIn: 'root' }); }
485
- }
486
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtAsideService, decorators: [{
487
- type: Injectable,
488
- args: [{ providedIn: 'root' }]
489
- }], ctorParameters: () => [] });
490
-
491
- const BEM_BLOCK$2 = 'rt-aside-header';
492
- /**
493
- * Заголовок side-sheet'а; работает в двух modes:
494
- *
495
- * 1. **Programmatic** (через `RtAsideService.open()`) — `RtAsideRef` провайдится
496
- * оверлей-инжектором; стрелка «назад» дёргает `asideRef.close()` напрямую,
497
- * consumer подписан на `afterClosed()`.
498
- * 2. **Route-driven** (через `[rtContainerRightSidenavPanel]` driver в
499
- * rt-container'е) — `RtAsideRef` НЕ провайдится (overlay принадлежит
500
- * rt-container'у, не RtAsideService). Consumer слушает `(dismiss)` output и
501
- * сам зовёт `panel.close()`.
502
- *
503
- * Оба пути живут одновременно: `onDismiss()` сперва эмитит output, затем (если
504
- * есть) дёргает optional `asideRef.close()`.
505
- *
506
- * Доменные действия (отклонить / удалить / снять с публикации и т.п.)
507
- * проецируются в слот `[asideActions]` как ряд `rt-icon-button` справа от title.
508
- *
509
- * Слот `[asideHeaderContent]` — строка под заголовком на всю ширину шапки: поиск, вкладки,
510
- * сводка. Пустой слот места не занимает.
511
- *
512
- * Слот `[asideHeadingContent]` — содержимое в колонке заголовка, под подписью и бэйджами, по её
513
- * левому краю. Пустой слот ничего не рисует.
514
- *
515
- * `ViewEncapsulation.None` — для единообразия с rt-dialog-header (стили
516
- * префиксованы `.rt-aside-header`).
517
- *
518
- * @example
519
- * ```html
520
- * <rt-aside-header title="Профиль пользователя" />
521
- * <rt-aside-header title="Создание записи" [closable]="false" />
522
- * <rt-aside-header title="Детали" (dismiss)="onClose()">
523
- * <rt-icon-button asideActions icon="ico-error" variant="danger"
524
- * ariaLabel="Отклонить" (clicked)="reject()" />
525
- * </rt-aside-header>
526
- * ```
527
- */
528
- class RtAsideHeaderComponent {
529
- constructor() {
530
- this.#asideRef = inject(RtAsideRef, { optional: true });
531
- /** Текст заголовка — рендерится в `<h2>`. Null/пустая строка вместе с
532
- * `[loading]=true` показывают skeleton вместо title. */
533
- this.t = inject(RT_KIT_LABELS);
534
- this.title = input(null, /* @ts-ignore */
535
- ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
536
- /**
537
- * Мелкий приглушённый надзаголовок НАД основным title (контекст действия:
538
- * «Создание записи», «Запись № 6»). Null (дефолт) — обычный
539
- * однострочный хедер. Overline не участвует в skeleton-режиме — это
540
- * статичный текст, известный до загрузки данных.
541
- */
542
- this.overline = input(null, /* @ts-ignore */
543
- ...(ngDevMode ? [{ debugName: "overline" }] : /* istanbul ignore next */ []));
544
- /**
545
- * Приглушённая подпись ПОД заголовком: что делается в панели. Null (дефолт) —
546
- * строки нет. Как надзаголовок, в skeleton-режиме не участвует.
547
- */
548
- this.subtitle = input(null, /* @ts-ignore */
549
- ...(ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []));
550
- /**
551
- * Ряд бэйджей (`rt-tag`) под заголовком — контекст сущности (статус, метка
552
- * записи и т.п.). Пустой массив (дефолт) — ряд не рендерится. Async-данные:
553
- * потребитель отдаёт `[]` пока сущность не зарезолвилась.
554
- */
555
- this.badges = input([], /* @ts-ignore */
556
- ...(ngDevMode ? [{ debugName: "badges" }] : /* istanbul ignore next */ []));
557
- /** Показывать кнопку закрытия в углу заголовка. Дефолт `true`. */
558
- this.closable = input(true, { ...(ngDevMode ? { debugName: "closable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
559
- /** Показывать skeleton вместо title (loading-state aside'а пока данные
560
- * резолвятся через async fasade). Дефолт `false`. */
561
- this.loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
562
- /**
563
- * Эмитится при клике по стрелке «назад» — намерение пользователя закрыть
564
- * aside (intent, не «закрыто»). Route-driven consumer слушает этот output и
565
- * дёргает `panel.close()` сам. Имя `dismiss` вместо `close` — ESLint
566
- * `@angular-eslint/no-output-native` блокирует output с именем стандартного
567
- * DOM-события (`close`).
568
- */
569
- this.dismiss = output();
570
- }
571
- #asideRef;
572
- onDismiss() {
573
- // Сначала output — route-driven consumer обработает intent.
574
- this.dismiss.emit();
575
- // Затем (если есть) AsideRef — programmatic mode через RtAsideService.
576
- this.#asideRef?.close();
577
- }
578
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtAsideHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
579
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtAsideHeaderComponent, isStandalone: true, selector: "rt-aside-header", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, overline: { classPropertyName: "overline", publicName: "overline", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, badges: { classPropertyName: "badges", publicName: "badges", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dismiss: "dismiss" }, host: { classAttribute: "rt-aside-header" }, ngImport: i0, template: "<ng-container rtBlock=\"rt-aside-header\">\n <header rtElem=\"content\" qa-dataid=\"aside-header\">\n @if (closable()) {\n <rt-icon-button\n rtElem=\"back\"\n qa-dataid=\"aside-back\"\n icon=\"arrow-left\"\n size=\"sm\"\n variant=\"ghost\"\n [ariaLabel]=\"t().uiBack\"\n [tooltip]=\"t().uiBack\"\n (clicked)=\"onDismiss()\" />\n }\n\n <div rtElem=\"heading\">\n @if (overline(); as overlineText) {\n <p rtElem=\"overline\" qa-dataid=\"aside-overline\">{{ overlineText }}</p>\n }\n <h2 rtElem=\"title\" qa-dataid=\"aside-title\">\n <rt-skeleton-wrapper width=\"180px\" height=\"20px\" [isLoading]=\"loading()\">\n {{ title() }}\n </rt-skeleton-wrapper>\n </h2>\n\n @if (subtitle(); as subtitleText) {\n <p rtElem=\"subtitle\" qa-dataid=\"aside-subtitle\">{{ subtitleText }}</p>\n }\n\n @if (badges().length > 0) {\n <div rtElem=\"badges\">\n @for (badge of badges(); track badge.value) {\n @if (badge.href; as href) {\n <a rtElem=\"badge-link\" qa-dataid=\"aside-badge-link\" target=\"_blank\" rel=\"noopener\" [href]=\"href\">\n <rt-tag\n iconEnd=\"external-link\"\n [value]=\"badge.value\"\n [severity]=\"badge.severity ?? 'neutral'\"\n [appearance]=\"badge.appearance ?? 'solid'\"\n [radius]=\"badge.radius ?? 'md'\"\n [icon]=\"badge.icon ?? null\" />\n </a>\n } @else {\n <rt-tag\n [value]=\"badge.value\"\n [severity]=\"badge.severity ?? 'neutral'\"\n [appearance]=\"badge.appearance ?? 'solid'\"\n [radius]=\"badge.radius ?? 'md'\"\n [icon]=\"badge.icon ?? null\" />\n }\n }\n </div>\n }\n\n <ng-content select=\"[asideHeadingContent]\" />\n </div>\n\n <div rtElem=\"actions\" qa-dataid=\"aside-actions\">\n <ng-content select=\"[asideActions]\" />\n </div>\n </header>\n\n <div rtElem=\"row\" qa-dataid=\"aside-header-row\">\n <ng-content select=\"[asideHeaderContent]\" />\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-header{--rt-aside-header-title-size-default: var(--rt-text-xl);--rt-aside-header-title-weight-default: var(--rt-font-weight-bold);--rt-aside-header-subtitle-size-default: var(--rt-text-sm);--rt-aside-header-gap-default: var(--rt-space-sm);--rt-aside-header-min-height-default: auto;padding:var(--rt-aside-header-inset, var(--rt-aside-inset))}.rt-aside-header__content{display:flex;min-width:0;min-height:var(--rt-aside-header-min-height, var(--rt-aside-header-min-height-default));align-items:center;gap:var(--rt-aside-header-gap, var(--rt-aside-header-gap-default))}.rt-aside-header__back{--rt-icon-step-sm: var(--rt-aside-header-back-icon-size, var(--rt-size-4));flex-shrink:0}.rt-aside-header .rt-aside-header__back .rt-icon-button{--rt-icon-button-size-step: var(--rt-aside-header-back-size, var(--rt-control-height-sm))}.rt-aside-header__heading{display:flex;min-width:0;flex:1 1 auto;flex-direction:column;gap:var(--rt-space-0-5)}.rt-aside-header__overline{overflow:hidden;margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);line-height:var(--rt-leading-snug);text-overflow:ellipsis;white-space:nowrap}.rt-aside-header__title{overflow:hidden;min-width:0;margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-aside-header-title-size, var(--rt-aside-header-title-size-default));font-weight:var(--rt-aside-header-title-weight, var(--rt-aside-header-title-weight-default));line-height:var(--rt-aside-header-title-leading, inherit)}.rt-aside-header__title>rt-skeleton-wrapper{display:block;overflow:hidden;min-width:0;text-overflow:ellipsis;white-space:nowrap}.rt-aside-header__subtitle{margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-aside-header-subtitle-size, var(--rt-aside-header-subtitle-size-default));line-height:var(--rt-leading-snug)}.rt-aside-header__badges{display:flex;flex-wrap:wrap;margin-top:var(--rt-space-1);gap:var(--rt-space-xs)}.rt-aside-header__badge-link{display:inline-flex;cursor:pointer;text-decoration:none}.rt-aside-header__badge-link:hover{opacity:.85}.rt-aside-header__row{min-width:0;margin-top:var(--rt-aside-header-gap, var(--rt-aside-header-gap-default))}.rt-aside-header__row:empty{display:none}.rt-aside-header__actions{display:flex;flex-shrink:0;align-items:center;gap:var(--rt-space-xs)}.rt-aside-header__actions:empty{display:none}}\n"], dependencies: [{ kind: "component", type:
580
- // standalone components / directives
581
- RtIconButtonComponent, selector: "rt-icon-button", inputs: ["icon", "glyph", "ariaLabel", "variant", "iconColor", "iconFill", "size", "iconSize", "type", "tooltip", "tabIndex", "loading", "disabled", "active", "indicator"], outputs: ["clicked"] }, { kind: "component", type: RtSkeletonWrapperComponent, selector: "rt-skeleton-wrapper", inputs: ["width", "height", "shape", "size", "radius", "animation", "isLoading"] }, { kind: "component", type: RtTagComponent, selector: "rt-tag", inputs: ["value", "severity", "size", "appearance", "icon", "iconEnd", "closable"], outputs: ["closed"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
582
- }
583
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtAsideHeaderComponent, decorators: [{
584
- type: Component,
585
- args: [{ selector: 'rt-aside-header', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
586
- // standalone components / directives
587
- RtIconButtonComponent,
588
- RtSkeletonWrapperComponent,
589
- RtTagComponent,
590
- BlockDirective,
591
- ElemDirective,
592
- ], host: {
593
- class: BEM_BLOCK$2,
594
- }, template: "<ng-container rtBlock=\"rt-aside-header\">\n <header rtElem=\"content\" qa-dataid=\"aside-header\">\n @if (closable()) {\n <rt-icon-button\n rtElem=\"back\"\n qa-dataid=\"aside-back\"\n icon=\"arrow-left\"\n size=\"sm\"\n variant=\"ghost\"\n [ariaLabel]=\"t().uiBack\"\n [tooltip]=\"t().uiBack\"\n (clicked)=\"onDismiss()\" />\n }\n\n <div rtElem=\"heading\">\n @if (overline(); as overlineText) {\n <p rtElem=\"overline\" qa-dataid=\"aside-overline\">{{ overlineText }}</p>\n }\n <h2 rtElem=\"title\" qa-dataid=\"aside-title\">\n <rt-skeleton-wrapper width=\"180px\" height=\"20px\" [isLoading]=\"loading()\">\n {{ title() }}\n </rt-skeleton-wrapper>\n </h2>\n\n @if (subtitle(); as subtitleText) {\n <p rtElem=\"subtitle\" qa-dataid=\"aside-subtitle\">{{ subtitleText }}</p>\n }\n\n @if (badges().length > 0) {\n <div rtElem=\"badges\">\n @for (badge of badges(); track badge.value) {\n @if (badge.href; as href) {\n <a rtElem=\"badge-link\" qa-dataid=\"aside-badge-link\" target=\"_blank\" rel=\"noopener\" [href]=\"href\">\n <rt-tag\n iconEnd=\"external-link\"\n [value]=\"badge.value\"\n [severity]=\"badge.severity ?? 'neutral'\"\n [appearance]=\"badge.appearance ?? 'solid'\"\n [radius]=\"badge.radius ?? 'md'\"\n [icon]=\"badge.icon ?? null\" />\n </a>\n } @else {\n <rt-tag\n [value]=\"badge.value\"\n [severity]=\"badge.severity ?? 'neutral'\"\n [appearance]=\"badge.appearance ?? 'solid'\"\n [radius]=\"badge.radius ?? 'md'\"\n [icon]=\"badge.icon ?? null\" />\n }\n }\n </div>\n }\n\n <ng-content select=\"[asideHeadingContent]\" />\n </div>\n\n <div rtElem=\"actions\" qa-dataid=\"aside-actions\">\n <ng-content select=\"[asideActions]\" />\n </div>\n </header>\n\n <div rtElem=\"row\" qa-dataid=\"aside-header-row\">\n <ng-content select=\"[asideHeaderContent]\" />\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-header{--rt-aside-header-title-size-default: var(--rt-text-xl);--rt-aside-header-title-weight-default: var(--rt-font-weight-bold);--rt-aside-header-subtitle-size-default: var(--rt-text-sm);--rt-aside-header-gap-default: var(--rt-space-sm);--rt-aside-header-min-height-default: auto;padding:var(--rt-aside-header-inset, var(--rt-aside-inset))}.rt-aside-header__content{display:flex;min-width:0;min-height:var(--rt-aside-header-min-height, var(--rt-aside-header-min-height-default));align-items:center;gap:var(--rt-aside-header-gap, var(--rt-aside-header-gap-default))}.rt-aside-header__back{--rt-icon-step-sm: var(--rt-aside-header-back-icon-size, var(--rt-size-4));flex-shrink:0}.rt-aside-header .rt-aside-header__back .rt-icon-button{--rt-icon-button-size-step: var(--rt-aside-header-back-size, var(--rt-control-height-sm))}.rt-aside-header__heading{display:flex;min-width:0;flex:1 1 auto;flex-direction:column;gap:var(--rt-space-0-5)}.rt-aside-header__overline{overflow:hidden;margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);line-height:var(--rt-leading-snug);text-overflow:ellipsis;white-space:nowrap}.rt-aside-header__title{overflow:hidden;min-width:0;margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-aside-header-title-size, var(--rt-aside-header-title-size-default));font-weight:var(--rt-aside-header-title-weight, var(--rt-aside-header-title-weight-default));line-height:var(--rt-aside-header-title-leading, inherit)}.rt-aside-header__title>rt-skeleton-wrapper{display:block;overflow:hidden;min-width:0;text-overflow:ellipsis;white-space:nowrap}.rt-aside-header__subtitle{margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-aside-header-subtitle-size, var(--rt-aside-header-subtitle-size-default));line-height:var(--rt-leading-snug)}.rt-aside-header__badges{display:flex;flex-wrap:wrap;margin-top:var(--rt-space-1);gap:var(--rt-space-xs)}.rt-aside-header__badge-link{display:inline-flex;cursor:pointer;text-decoration:none}.rt-aside-header__badge-link:hover{opacity:.85}.rt-aside-header__row{min-width:0;margin-top:var(--rt-aside-header-gap, var(--rt-aside-header-gap-default))}.rt-aside-header__row:empty{display:none}.rt-aside-header__actions{display:flex;flex-shrink:0;align-items:center;gap:var(--rt-space-xs)}.rt-aside-header__actions:empty{display:none}}\n"] }]
595
- }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], overline: [{ type: i0.Input, args: [{ isSignal: true, alias: "overline", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], badges: [{ type: i0.Input, args: [{ isSignal: true, alias: "badges", required: false }] }], closable: [{ type: i0.Input, args: [{ isSignal: true, alias: "closable", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], dismiss: [{ type: i0.Output, args: ["dismiss"] }] } });
596
-
597
- const BEM_BLOCK$1 = 'rt-aside-footer';
598
- /**
599
- * Footer-слот для композиции внутри `<rt-aside>`. Две зоны через именованные
600
- * слоты: `[asideDismiss]` (слева — «Закрыть», `appearance="text"`, всегда) и
601
- * `[asidePrimary]` (справа — единственный позитивный глагол: Сохранить /
602
- * Отправить / Опубликовать, если есть). Раскладка `justify-content:
603
- * space-between`. Доменные/деструктивные действия в футер не кладём — они
604
- * проецируются иконками в `<rt-aside-header>` слот `[asideActions]`.
605
- *
606
- * Только две именованные зоны — безатрибутный контент НЕ проецируется (контент
607
- * без `asideDismiss`/`asidePrimary` не отрендерится).
608
- *
609
- * `ViewEncapsulation.None` — для единообразия с rt-aside.
610
- *
611
- * @example
612
- * \`\`\`html
613
- * <rt-aside-footer>
614
- * <button rtButton asideDismiss appearance="text" (click)="onClose()">Закрыть</button>
615
- * <button rtButton asidePrimary theme="primary" (click)="save()">Сохранить</button>
616
- * </rt-aside-footer>
617
- * \`\`\`
618
- */
619
- class RtAsideFooterComponent {
620
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtAsideFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
621
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.6", type: RtAsideFooterComponent, isStandalone: true, selector: "rt-aside-footer", host: { classAttribute: "rt-aside-footer" }, ngImport: i0, template: "<ng-container rtBlock=\"rt-aside-footer\">\n <footer rtElem=\"content\" qa-dataid=\"aside-footer\">\n <ng-content select=\"[asideDismiss]\" />\n <ng-content select=\"[asidePrimary]\" />\n </footer>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-footer{--rt-aside-footer-border-width: var(--rt-border-width-thin);padding:var(--rt-aside-footer-inset, var(--rt-aside-inset) 0 0);margin:var(--rt-aside-footer-margin, var(--rt-aside-inset));border-block-start:var(--rt-aside-footer-border-width) solid var(--rt-color-border-subtle)}.rt-aside-footer__content{display:flex;flex-wrap:wrap;justify-content:var(--rt-aside-footer-justify, space-between);gap:var(--rt-aside-footer-gap, var(--rt-space-sm))}.rt-aside-footer:empty{display:none}}\n"], dependencies: [{ kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
622
- }
623
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtAsideFooterComponent, decorators: [{
624
- type: Component,
625
- args: [{ selector: 'rt-aside-footer', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [BlockDirective, ElemDirective], host: {
626
- class: BEM_BLOCK$1,
627
- }, template: "<ng-container rtBlock=\"rt-aside-footer\">\n <footer rtElem=\"content\" qa-dataid=\"aside-footer\">\n <ng-content select=\"[asideDismiss]\" />\n <ng-content select=\"[asidePrimary]\" />\n </footer>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-footer{--rt-aside-footer-border-width: var(--rt-border-width-thin);padding:var(--rt-aside-footer-inset, var(--rt-aside-inset) 0 0);margin:var(--rt-aside-footer-margin, var(--rt-aside-inset));border-block-start:var(--rt-aside-footer-border-width) solid var(--rt-color-border-subtle)}.rt-aside-footer__content{display:flex;flex-wrap:wrap;justify-content:var(--rt-aside-footer-justify, space-between);gap:var(--rt-aside-footer-gap, var(--rt-space-sm))}.rt-aside-footer:empty{display:none}}\n"] }]
628
- }] });
629
-
630
- /** Что делает панель, когда её просят закрыться. */
414
+ var RtAsideRef = class {
415
+ #overlayRef;
416
+ #renderer;
417
+ #afterClosedSource;
418
+ #closeRequestsSource;
419
+ #isClosing;
420
+ constructor(overlayRef, renderer, closeRequestsSource = new Subject()) {
421
+ this.disableClose = signal(false, ...ngDevMode ? [{ debugName: "disableClose" }] : /* istanbul ignore next */ []);
422
+ this.#afterClosedSource = new Subject();
423
+ this.#isClosing = false;
424
+ this.#overlayRef = overlayRef;
425
+ this.#renderer = renderer;
426
+ this.#closeRequestsSource = closeRequestsSource;
427
+ this.#overlayRef.detachments().pipe(take(1)).subscribe(() => this.#finish(void 0));
428
+ }
429
+ close(result) {
430
+ if (this.#isClosing) return;
431
+ this.#isClosing = true;
432
+ this.#renderer.removeClass(this.#overlayRef.overlayElement, "rt-aside-overlay--open");
433
+ this.#renderer.addClass(this.#overlayRef.overlayElement, "rt-aside-overlay--leaving");
434
+ this.#emit(result);
435
+ setTimeout(() => {
436
+ this.#overlayRef.dispose();
437
+ }, LEAVE_ANIMATION_DURATION_MS);
438
+ }
439
+ afterClosed() {
440
+ return this.#afterClosedSource.asObservable();
441
+ }
442
+ closeRequests() {
443
+ return this.#closeRequestsSource.asObservable();
444
+ }
445
+ #finish(result) {
446
+ if (this.#isClosing) return;
447
+ this.#isClosing = true;
448
+ this.#emit(result);
449
+ }
450
+ #emit(result) {
451
+ this.#afterClosedSource.next(result);
452
+ this.#afterClosedSource.complete();
453
+ this.#closeRequestsSource.complete();
454
+ }
455
+ };
456
+ const RT_ASIDE_DATA = new InjectionToken("RT_ASIDE_DATA");
457
+ var RtAsideService = class RtAsideService {
458
+ #overlay = inject(Overlay);
459
+ #injector = inject(Injector);
460
+ #document = inject(DOCUMENT);
461
+ #renderer = inject(RendererFactory2).createRenderer(null, null);
462
+ #openSource = new Subject();
463
+ #closeOnEscape = rtKitDefault("aside", (it) => it.closeOnEscape, true);
464
+ constructor() {
465
+ this.#openSource.pipe(mergeMap((openContext) => {
466
+ const backdropClose$ = openContext.overlayRef.backdropClick().pipe(map(() => () => {
467
+ this.#answerCloseGesture(openContext, "backdrop", openContext.closeOnBackdropClick);
468
+ }));
469
+ const escapeClose$ = openContext.overlayRef.keydownEvents().pipe(map((event) => () => {
470
+ if (event.key !== "Escape") return;
471
+ if (openContext.closeOnEscape) event.preventDefault();
472
+ this.#answerCloseGesture(openContext, "escape", openContext.closeOnEscape);
473
+ }));
474
+ const ownerClose$ = this.#destroyed(openContext.ownerDestroyRef).pipe(map(() => () => openContext.asideRef.close()));
475
+ return merge(backdropClose$, escapeClose$, ownerClose$).pipe(takeUntil(openContext.overlayRef.detachments()));
476
+ }), takeUntilDestroyed()).subscribe((handleCloseIntent) => handleCloseIntent());
477
+ }
478
+ open(component, config) {
479
+ const position = config?.position ?? "right";
480
+ const positionStrategy = position === "right" ? this.#overlay.position().global().right("0").top("0") : this.#overlay.position().global().left("0").top("0");
481
+ const panelClasses = [
482
+ "rt-aside-overlay",
483
+ `rt-aside-overlay--position-${position}`,
484
+ "rt-aside-overlay--entering",
485
+ ...materialPresetClassesOfFocus(this.#document)
486
+ ];
487
+ const overlayConfig = {
488
+ positionStrategy,
489
+ scrollStrategy: this.#overlay.scrollStrategies.block(),
490
+ hasBackdrop: true,
491
+ backdropClass: config?.backdropClass ?? "rt-aside-backdrop",
492
+ panelClass: config?.panelClass !== void 0 ? [...panelClasses, ...this.#toArray(config.panelClass)] : panelClasses,
493
+ disposeOnNavigation: config?.disposeOnNavigation ?? true
494
+ };
495
+ const overlayRef = this.#overlay.create(overlayConfig);
496
+ carryThemeScopeOfFocus(overlayRef.overlayElement, this.#document);
497
+ const closeRequests = new Subject();
498
+ const asideRef = new RtAsideRef(overlayRef, this.#renderer, closeRequests);
499
+ this.#openSource.next({
500
+ overlayRef,
501
+ asideRef,
502
+ closeRequests,
503
+ ownerDestroyRef: config?.injector?.get(DestroyRef, null) ?? null,
504
+ closeOnBackdropClick: config?.closeOnBackdropClick !== false,
505
+ closeOnEscape: config?.closeOnEscape ?? this.#closeOnEscape
506
+ });
507
+ const injector = Injector.create({
508
+ parent: config?.injector ?? this.#injector,
509
+ providers: [{
510
+ provide: RtAsideRef,
511
+ useValue: asideRef
512
+ }, {
513
+ provide: RT_ASIDE_DATA,
514
+ useValue: config?.data ?? null
515
+ }]
516
+ });
517
+ const portal = new ComponentPortal(component, null, injector);
518
+ overlayRef.attach(portal);
519
+ requestAnimationFrame(() => {
520
+ if (!overlayRef.hasAttached()) return;
521
+ this.#renderer.removeClass(overlayRef.overlayElement, "rt-aside-overlay--entering");
522
+ this.#renderer.addClass(overlayRef.overlayElement, "rt-aside-overlay--open");
523
+ const backdropEl = overlayRef.backdropElement;
524
+ if (backdropEl !== null) this.#renderer.addClass(backdropEl, "rt-aside-backdrop--visible");
525
+ });
526
+ return asideRef;
527
+ }
528
+ #answerCloseGesture(openContext, gesture, enabled) {
529
+ if (enabled && !openContext.asideRef.disableClose()) {
530
+ openContext.asideRef.close();
531
+ return;
532
+ }
533
+ openContext.closeRequests.next(gesture);
534
+ }
535
+ #destroyed(ownerDestroyRef) {
536
+ if (ownerDestroyRef === null) return EMPTY;
537
+ return new Observable((subscriber) => ownerDestroyRef.onDestroy(() => subscriber.next()));
538
+ }
539
+ #toArray(value) {
540
+ return Array.isArray(value) ? value : [value];
541
+ }
542
+ static {
543
+ this.ɵfac = i0.ɵɵngDeclareFactory({
544
+ minVersion: "12.0.0",
545
+ version: "22.2.2",
546
+ ngImport: i0,
547
+ type: RtAsideService,
548
+ deps: [],
549
+ target: i0.ɵɵFactoryTarget.Injectable
550
+ });
551
+ }
552
+ static {
553
+ this.ɵprov = i0.ɵɵngDeclareInjectable({
554
+ minVersion: "12.0.0",
555
+ version: "22.2.2",
556
+ ngImport: i0,
557
+ type: RtAsideService,
558
+ providedIn: "root"
559
+ });
560
+ }
561
+ };
562
+ i0.ɵɵngDeclareClassMetadata({
563
+ minVersion: "12.0.0",
564
+ version: "22.2.2",
565
+ ngImport: i0,
566
+ type: RtAsideService,
567
+ decorators: [{
568
+ type: Injectable,
569
+ args: [{ providedIn: "root" }]
570
+ }],
571
+ ctorParameters: () => []
572
+ });
573
+ const BEM_BLOCK$2 = "rt-aside-header";
574
+ var RtAsideHeaderComponent = class RtAsideHeaderComponent {
575
+ constructor() {
576
+ this.#asideRef = inject(RtAsideRef, { optional: true });
577
+ this.t = inject(RT_KIT_LABELS);
578
+ this.title = input(null, ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
579
+ this.overline = input(null, ...ngDevMode ? [{ debugName: "overline" }] : /* istanbul ignore next */ []);
580
+ this.subtitle = input(null, ...ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []);
581
+ this.badges = input([], ...ngDevMode ? [{ debugName: "badges" }] : /* istanbul ignore next */ []);
582
+ this.closable = input(true, {
583
+ ...ngDevMode ? { debugName: "closable" } : /* istanbul ignore next */ {},
584
+ transform: booleanAttribute
585
+ });
586
+ this.loading = input(false, {
587
+ ...ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {},
588
+ transform: booleanAttribute
589
+ });
590
+ this.dismiss = output();
591
+ }
592
+ #asideRef;
593
+ onDismiss() {
594
+ this.dismiss.emit();
595
+ this.#asideRef?.close();
596
+ }
597
+ static {
598
+ this.ɵfac = i0.ɵɵngDeclareFactory({
599
+ minVersion: "12.0.0",
600
+ version: "22.2.2",
601
+ ngImport: i0,
602
+ type: RtAsideHeaderComponent,
603
+ deps: [],
604
+ target: i0.ɵɵFactoryTarget.Component
605
+ });
606
+ }
607
+ static {
608
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
609
+ minVersion: "17.0.0",
610
+ version: "22.2.2",
611
+ type: RtAsideHeaderComponent,
612
+ isStandalone: true,
613
+ selector: "rt-aside-header",
614
+ inputs: {
615
+ title: {
616
+ classPropertyName: "title",
617
+ publicName: "title",
618
+ isSignal: true,
619
+ isRequired: false,
620
+ transformFunction: null
621
+ },
622
+ overline: {
623
+ classPropertyName: "overline",
624
+ publicName: "overline",
625
+ isSignal: true,
626
+ isRequired: false,
627
+ transformFunction: null
628
+ },
629
+ subtitle: {
630
+ classPropertyName: "subtitle",
631
+ publicName: "subtitle",
632
+ isSignal: true,
633
+ isRequired: false,
634
+ transformFunction: null
635
+ },
636
+ badges: {
637
+ classPropertyName: "badges",
638
+ publicName: "badges",
639
+ isSignal: true,
640
+ isRequired: false,
641
+ transformFunction: null
642
+ },
643
+ closable: {
644
+ classPropertyName: "closable",
645
+ publicName: "closable",
646
+ isSignal: true,
647
+ isRequired: false,
648
+ transformFunction: null
649
+ },
650
+ loading: {
651
+ classPropertyName: "loading",
652
+ publicName: "loading",
653
+ isSignal: true,
654
+ isRequired: false,
655
+ transformFunction: null
656
+ }
657
+ },
658
+ outputs: { dismiss: "dismiss" },
659
+ host: { classAttribute: "rt-aside-header" },
660
+ ngImport: i0,
661
+ template: "<ng-container rtBlock=\"rt-aside-header\">\n <header rtElem=\"content\" qa-dataid=\"aside-header\">\n @if (closable()) {\n <rt-icon-button\n rtElem=\"back\"\n qa-dataid=\"aside-back\"\n icon=\"arrow-left\"\n size=\"sm\"\n variant=\"ghost\"\n [ariaLabel]=\"t().uiBack\"\n [tooltip]=\"t().uiBack\"\n (clicked)=\"onDismiss()\" />\n }\n\n <div rtElem=\"heading\">\n @if (overline(); as overlineText) {\n <p rtElem=\"overline\" qa-dataid=\"aside-overline\">{{ overlineText }}</p>\n }\n <h2 rtElem=\"title\" qa-dataid=\"aside-title\">\n <rt-skeleton-wrapper width=\"180px\" height=\"20px\" [isLoading]=\"loading()\">\n {{ title() }}\n </rt-skeleton-wrapper>\n </h2>\n\n @if (subtitle(); as subtitleText) {\n <p rtElem=\"subtitle\" qa-dataid=\"aside-subtitle\">{{ subtitleText }}</p>\n }\n\n @if (badges().length > 0) {\n <div rtElem=\"badges\">\n @for (badge of badges(); track badge.value) {\n @if (badge.href; as href) {\n <a rtElem=\"badge-link\" qa-dataid=\"aside-badge-link\" target=\"_blank\" rel=\"noopener\" [href]=\"href\">\n <rt-tag\n iconEnd=\"external-link\"\n [value]=\"badge.value\"\n [severity]=\"badge.severity ?? 'neutral'\"\n [appearance]=\"badge.appearance ?? 'solid'\"\n [radius]=\"badge.radius ?? 'md'\"\n [icon]=\"badge.icon ?? null\" />\n </a>\n } @else {\n <rt-tag\n [value]=\"badge.value\"\n [severity]=\"badge.severity ?? 'neutral'\"\n [appearance]=\"badge.appearance ?? 'solid'\"\n [radius]=\"badge.radius ?? 'md'\"\n [icon]=\"badge.icon ?? null\" />\n }\n }\n </div>\n }\n\n <ng-content select=\"[asideHeadingContent]\" />\n </div>\n\n <div rtElem=\"actions\" qa-dataid=\"aside-actions\">\n <ng-content select=\"[asideActions]\" />\n </div>\n </header>\n\n <div rtElem=\"row\" qa-dataid=\"aside-header-row\">\n <ng-content select=\"[asideHeaderContent]\" />\n </div>\n</ng-container>\n",
662
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-header{--rt-aside-header-title-size-default: var(--rt-text-xl);--rt-aside-header-title-weight-default: var(--rt-font-weight-bold);--rt-aside-header-subtitle-size-default: var(--rt-text-sm);--rt-aside-header-gap-default: var(--rt-space-sm);--rt-aside-header-min-height-default: auto;padding:var(--rt-aside-header-inset, var(--rt-aside-inset))}.rt-aside-header__content{display:flex;min-width:0;min-height:var(--rt-aside-header-min-height, var(--rt-aside-header-min-height-default));align-items:center;gap:var(--rt-aside-header-gap, var(--rt-aside-header-gap-default))}.rt-aside-header__back{--rt-icon-step-sm: var(--rt-aside-header-back-icon-size, var(--rt-size-4));flex-shrink:0}.rt-aside-header .rt-aside-header__back .rt-icon-button{--rt-icon-button-size-step: var(--rt-aside-header-back-size, var(--rt-control-height-sm))}.rt-aside-header__heading{display:flex;min-width:0;flex:1 1 auto;flex-direction:column;gap:var(--rt-space-0-5)}.rt-aside-header__overline{overflow:hidden;margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);line-height:var(--rt-leading-snug);text-overflow:ellipsis;white-space:nowrap}.rt-aside-header__title{overflow:hidden;min-width:0;margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-aside-header-title-size, var(--rt-aside-header-title-size-default));font-weight:var(--rt-aside-header-title-weight, var(--rt-aside-header-title-weight-default));line-height:var(--rt-aside-header-title-leading, inherit)}.rt-aside-header__title>rt-skeleton-wrapper{display:block;overflow:hidden;min-width:0;text-overflow:ellipsis;white-space:nowrap}.rt-aside-header__subtitle{margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-aside-header-subtitle-size, var(--rt-aside-header-subtitle-size-default));line-height:var(--rt-leading-snug)}.rt-aside-header__badges{display:flex;flex-wrap:wrap;margin-top:var(--rt-space-1);gap:var(--rt-space-xs)}.rt-aside-header__badge-link{display:inline-flex;cursor:pointer;text-decoration:none}.rt-aside-header__badge-link:hover{opacity:.85}.rt-aside-header__row{min-width:0;margin-top:var(--rt-aside-header-gap, var(--rt-aside-header-gap-default))}.rt-aside-header__row:empty{display:none}.rt-aside-header__actions{display:flex;flex-shrink:0;align-items:center;gap:var(--rt-space-xs)}.rt-aside-header__actions:empty{display:none}}\n"],
663
+ dependencies: [
664
+ {
665
+ kind: "component",
666
+ type: RtIconButtonComponent,
667
+ selector: "rt-icon-button",
668
+ inputs: [
669
+ "icon",
670
+ "glyph",
671
+ "ariaLabel",
672
+ "variant",
673
+ "iconColor",
674
+ "iconFill",
675
+ "size",
676
+ "iconSize",
677
+ "type",
678
+ "tooltip",
679
+ "tooltipHideOnClick",
680
+ "tabIndex",
681
+ "loading",
682
+ "disabled",
683
+ "active",
684
+ "expanded",
685
+ "indicator"
686
+ ],
687
+ outputs: ["clicked"]
688
+ },
689
+ {
690
+ kind: "component",
691
+ type: RtSkeletonWrapperComponent,
692
+ selector: "rt-skeleton-wrapper",
693
+ inputs: [
694
+ "width",
695
+ "height",
696
+ "shape",
697
+ "size",
698
+ "radius",
699
+ "animation",
700
+ "isLoading"
701
+ ]
702
+ },
703
+ {
704
+ kind: "component",
705
+ type: RtTagComponent,
706
+ selector: "rt-tag",
707
+ inputs: [
708
+ "value",
709
+ "highlight",
710
+ "severity",
711
+ "size",
712
+ "appearance",
713
+ "icon",
714
+ "iconEnd",
715
+ "closable"
716
+ ],
717
+ outputs: ["closed"]
718
+ },
719
+ {
720
+ kind: "directive",
721
+ type: BlockDirective,
722
+ selector: "[rtBlock]",
723
+ inputs: ["rtMod"]
724
+ },
725
+ {
726
+ kind: "directive",
727
+ type: ElemDirective,
728
+ selector: "[rtElem]",
729
+ inputs: ["rtMod"]
730
+ }
731
+ ],
732
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
733
+ encapsulation: i0.ViewEncapsulation.None
734
+ });
735
+ }
736
+ };
737
+ i0.ɵɵngDeclareClassMetadata({
738
+ minVersion: "12.0.0",
739
+ version: "22.2.2",
740
+ ngImport: i0,
741
+ type: RtAsideHeaderComponent,
742
+ decorators: [{
743
+ type: Component,
744
+ args: [{
745
+ selector: "rt-aside-header",
746
+ changeDetection: ChangeDetectionStrategy.OnPush,
747
+ encapsulation: ViewEncapsulation.None,
748
+ imports: [
749
+ RtIconButtonComponent,
750
+ RtSkeletonWrapperComponent,
751
+ RtTagComponent,
752
+ BlockDirective,
753
+ ElemDirective
754
+ ],
755
+ host: { class: BEM_BLOCK$2 },
756
+ template: "<ng-container rtBlock=\"rt-aside-header\">\n <header rtElem=\"content\" qa-dataid=\"aside-header\">\n @if (closable()) {\n <rt-icon-button\n rtElem=\"back\"\n qa-dataid=\"aside-back\"\n icon=\"arrow-left\"\n size=\"sm\"\n variant=\"ghost\"\n [ariaLabel]=\"t().uiBack\"\n [tooltip]=\"t().uiBack\"\n (clicked)=\"onDismiss()\" />\n }\n\n <div rtElem=\"heading\">\n @if (overline(); as overlineText) {\n <p rtElem=\"overline\" qa-dataid=\"aside-overline\">{{ overlineText }}</p>\n }\n <h2 rtElem=\"title\" qa-dataid=\"aside-title\">\n <rt-skeleton-wrapper width=\"180px\" height=\"20px\" [isLoading]=\"loading()\">\n {{ title() }}\n </rt-skeleton-wrapper>\n </h2>\n\n @if (subtitle(); as subtitleText) {\n <p rtElem=\"subtitle\" qa-dataid=\"aside-subtitle\">{{ subtitleText }}</p>\n }\n\n @if (badges().length > 0) {\n <div rtElem=\"badges\">\n @for (badge of badges(); track badge.value) {\n @if (badge.href; as href) {\n <a rtElem=\"badge-link\" qa-dataid=\"aside-badge-link\" target=\"_blank\" rel=\"noopener\" [href]=\"href\">\n <rt-tag\n iconEnd=\"external-link\"\n [value]=\"badge.value\"\n [severity]=\"badge.severity ?? 'neutral'\"\n [appearance]=\"badge.appearance ?? 'solid'\"\n [radius]=\"badge.radius ?? 'md'\"\n [icon]=\"badge.icon ?? null\" />\n </a>\n } @else {\n <rt-tag\n [value]=\"badge.value\"\n [severity]=\"badge.severity ?? 'neutral'\"\n [appearance]=\"badge.appearance ?? 'solid'\"\n [radius]=\"badge.radius ?? 'md'\"\n [icon]=\"badge.icon ?? null\" />\n }\n }\n </div>\n }\n\n <ng-content select=\"[asideHeadingContent]\" />\n </div>\n\n <div rtElem=\"actions\" qa-dataid=\"aside-actions\">\n <ng-content select=\"[asideActions]\" />\n </div>\n </header>\n\n <div rtElem=\"row\" qa-dataid=\"aside-header-row\">\n <ng-content select=\"[asideHeaderContent]\" />\n </div>\n</ng-container>\n",
757
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-header{--rt-aside-header-title-size-default: var(--rt-text-xl);--rt-aside-header-title-weight-default: var(--rt-font-weight-bold);--rt-aside-header-subtitle-size-default: var(--rt-text-sm);--rt-aside-header-gap-default: var(--rt-space-sm);--rt-aside-header-min-height-default: auto;padding:var(--rt-aside-header-inset, var(--rt-aside-inset))}.rt-aside-header__content{display:flex;min-width:0;min-height:var(--rt-aside-header-min-height, var(--rt-aside-header-min-height-default));align-items:center;gap:var(--rt-aside-header-gap, var(--rt-aside-header-gap-default))}.rt-aside-header__back{--rt-icon-step-sm: var(--rt-aside-header-back-icon-size, var(--rt-size-4));flex-shrink:0}.rt-aside-header .rt-aside-header__back .rt-icon-button{--rt-icon-button-size-step: var(--rt-aside-header-back-size, var(--rt-control-height-sm))}.rt-aside-header__heading{display:flex;min-width:0;flex:1 1 auto;flex-direction:column;gap:var(--rt-space-0-5)}.rt-aside-header__overline{overflow:hidden;margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);line-height:var(--rt-leading-snug);text-overflow:ellipsis;white-space:nowrap}.rt-aside-header__title{overflow:hidden;min-width:0;margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-aside-header-title-size, var(--rt-aside-header-title-size-default));font-weight:var(--rt-aside-header-title-weight, var(--rt-aside-header-title-weight-default));line-height:var(--rt-aside-header-title-leading, inherit)}.rt-aside-header__title>rt-skeleton-wrapper{display:block;overflow:hidden;min-width:0;text-overflow:ellipsis;white-space:nowrap}.rt-aside-header__subtitle{margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-aside-header-subtitle-size, var(--rt-aside-header-subtitle-size-default));line-height:var(--rt-leading-snug)}.rt-aside-header__badges{display:flex;flex-wrap:wrap;margin-top:var(--rt-space-1);gap:var(--rt-space-xs)}.rt-aside-header__badge-link{display:inline-flex;cursor:pointer;text-decoration:none}.rt-aside-header__badge-link:hover{opacity:.85}.rt-aside-header__row{min-width:0;margin-top:var(--rt-aside-header-gap, var(--rt-aside-header-gap-default))}.rt-aside-header__row:empty{display:none}.rt-aside-header__actions{display:flex;flex-shrink:0;align-items:center;gap:var(--rt-space-xs)}.rt-aside-header__actions:empty{display:none}}\n"]
758
+ }]
759
+ }],
760
+ propDecorators: {
761
+ title: [{
762
+ type: i0.Input,
763
+ args: [{
764
+ isSignal: true,
765
+ alias: "title",
766
+ required: false
767
+ }]
768
+ }],
769
+ overline: [{
770
+ type: i0.Input,
771
+ args: [{
772
+ isSignal: true,
773
+ alias: "overline",
774
+ required: false
775
+ }]
776
+ }],
777
+ subtitle: [{
778
+ type: i0.Input,
779
+ args: [{
780
+ isSignal: true,
781
+ alias: "subtitle",
782
+ required: false
783
+ }]
784
+ }],
785
+ badges: [{
786
+ type: i0.Input,
787
+ args: [{
788
+ isSignal: true,
789
+ alias: "badges",
790
+ required: false
791
+ }]
792
+ }],
793
+ closable: [{
794
+ type: i0.Input,
795
+ args: [{
796
+ isSignal: true,
797
+ alias: "closable",
798
+ required: false
799
+ }]
800
+ }],
801
+ loading: [{
802
+ type: i0.Input,
803
+ args: [{
804
+ isSignal: true,
805
+ alias: "loading",
806
+ required: false
807
+ }]
808
+ }],
809
+ dismiss: [{
810
+ type: i0.Output,
811
+ args: ["dismiss"]
812
+ }]
813
+ }
814
+ });
815
+ const BEM_BLOCK$1 = "rt-aside-footer";
816
+ var RtAsideFooterComponent = class RtAsideFooterComponent {
817
+ static {
818
+ this.ɵfac = i0.ɵɵngDeclareFactory({
819
+ minVersion: "12.0.0",
820
+ version: "22.2.2",
821
+ ngImport: i0,
822
+ type: RtAsideFooterComponent,
823
+ deps: [],
824
+ target: i0.ɵɵFactoryTarget.Component
825
+ });
826
+ }
827
+ static {
828
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
829
+ minVersion: "14.0.0",
830
+ version: "22.2.2",
831
+ type: RtAsideFooterComponent,
832
+ isStandalone: true,
833
+ selector: "rt-aside-footer",
834
+ host: { classAttribute: "rt-aside-footer" },
835
+ ngImport: i0,
836
+ template: "<ng-container rtBlock=\"rt-aside-footer\">\n <footer rtElem=\"content\" qa-dataid=\"aside-footer\">\n <ng-content select=\"[asideDismiss]\" />\n <ng-content select=\"[asidePrimary]\" />\n </footer>\n</ng-container>\n",
837
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-footer{--rt-aside-footer-border-width: var(--rt-border-width-thin);padding:var(--rt-aside-footer-inset, var(--rt-aside-inset) 0 0);margin:var(--rt-aside-footer-margin, var(--rt-aside-inset));border-block-start:var(--rt-aside-footer-border-width) solid var(--rt-color-border-subtle)}.rt-aside-footer__content{display:flex;flex-wrap:wrap;justify-content:var(--rt-aside-footer-justify, space-between);gap:var(--rt-aside-footer-gap, var(--rt-space-sm))}.rt-aside-footer:empty{display:none}}\n"],
838
+ dependencies: [{
839
+ kind: "directive",
840
+ type: BlockDirective,
841
+ selector: "[rtBlock]",
842
+ inputs: ["rtMod"]
843
+ }, {
844
+ kind: "directive",
845
+ type: ElemDirective,
846
+ selector: "[rtElem]",
847
+ inputs: ["rtMod"]
848
+ }],
849
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
850
+ encapsulation: i0.ViewEncapsulation.None
851
+ });
852
+ }
853
+ };
854
+ i0.ɵɵngDeclareClassMetadata({
855
+ minVersion: "12.0.0",
856
+ version: "22.2.2",
857
+ ngImport: i0,
858
+ type: RtAsideFooterComponent,
859
+ decorators: [{
860
+ type: Component,
861
+ args: [{
862
+ selector: "rt-aside-footer",
863
+ changeDetection: ChangeDetectionStrategy.OnPush,
864
+ encapsulation: ViewEncapsulation.None,
865
+ imports: [BlockDirective, ElemDirective],
866
+ host: { class: BEM_BLOCK$1 },
867
+ template: "<ng-container rtBlock=\"rt-aside-footer\">\n <footer rtElem=\"content\" qa-dataid=\"aside-footer\">\n <ng-content select=\"[asideDismiss]\" />\n <ng-content select=\"[asidePrimary]\" />\n </footer>\n</ng-container>\n",
868
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-footer{--rt-aside-footer-border-width: var(--rt-border-width-thin);padding:var(--rt-aside-footer-inset, var(--rt-aside-inset) 0 0);margin:var(--rt-aside-footer-margin, var(--rt-aside-inset));border-block-start:var(--rt-aside-footer-border-width) solid var(--rt-color-border-subtle)}.rt-aside-footer__content{display:flex;flex-wrap:wrap;justify-content:var(--rt-aside-footer-justify, space-between);gap:var(--rt-aside-footer-gap, var(--rt-space-sm))}.rt-aside-footer:empty{display:none}}\n"]
869
+ }]
870
+ }]
871
+ });
631
872
  var ERtAsideCloseIntent;
632
- (function (ERtAsideCloseIntent) {
633
- /** Ничего: идёт запись, и закрытие посреди неё потеряло бы её результат. */
634
- ERtAsideCloseIntent["Ignore"] = "ignore";
635
- /** Закрыться сразу: терять нечего. */
636
- ERtAsideCloseIntent["Close"] = "close";
637
- /** Спросить, что сделать с несохранёнными правками. */
638
- ERtAsideCloseIntent["Ask"] = "ask";
873
+ (function(ERtAsideCloseIntent) {
874
+ ERtAsideCloseIntent["Ignore"] = "ignore";
875
+ ERtAsideCloseIntent["Close"] = "close";
876
+ ERtAsideCloseIntent["Ask"] = "ask";
639
877
  })(ERtAsideCloseIntent || (ERtAsideCloseIntent = {}));
640
- /** Исход окна с несохранёнными правками. */
641
878
  var ERtAsideUnsavedOutcome;
642
- (function (ERtAsideUnsavedOutcome) {
643
- /** Закрыть без сохранения. */
644
- ERtAsideUnsavedOutcome["Discard"] = "discard";
645
- /** Закрыть с сохранением. */
646
- ERtAsideUnsavedOutcome["Save"] = "save";
647
- /** Остаться в панели. */
648
- ERtAsideUnsavedOutcome["Stay"] = "stay";
879
+ (function(ERtAsideUnsavedOutcome) {
880
+ ERtAsideUnsavedOutcome["Discard"] = "discard";
881
+ ERtAsideUnsavedOutcome["Save"] = "save";
882
+ ERtAsideUnsavedOutcome["Stay"] = "stay";
649
883
  })(ERtAsideUnsavedOutcome || (ERtAsideUnsavedOutcome = {}));
650
- /**
651
- * Решение по намерению закрыть панель. Одно на все четыре пути закрытия: кнопку
652
- * в шапке, кнопку в футере, нажатие мимо панели и клавишу Esc — иначе Esc обошёл
653
- * бы то, что ловит кнопка.
654
- */
655
884
  function resolveCloseIntent(state) {
656
- if (state.submitting) {
657
- return ERtAsideCloseIntent.Ignore;
658
- }
659
- return state.guarded && !state.pristine ? ERtAsideCloseIntent.Ask : ERtAsideCloseIntent.Close;
885
+ if (state.submitting) return ERtAsideCloseIntent.Ignore;
886
+ return state.guarded && !state.pristine ? ERtAsideCloseIntent.Ask : ERtAsideCloseIntent.Close;
660
887
  }
661
-
662
- const BEM_BLOCK = 'rt-aside-unsaved-dialog';
663
- /**
664
- * Окно, которое видит пользователь, закрывая панель с несохранёнными правками. Три
665
- * исхода: закрыть без сохранения, закрыть с сохранением, остаться. Открывает его
666
- * общая основа асайда, поэтому наружу компонент не экспортируется.
667
- *
668
- * Отказ от правок подан красной кнопкой: это единственный исход, после которого
669
- * введённое не вернуть.
670
- */
671
- class RtAsideUnsavedDialogComponent {
672
- constructor() {
673
- this.#dialogRef = inject(RtDialogRef);
674
- this.t = inject(RT_KIT_LABELS);
675
- }
676
- #dialogRef;
677
- onDiscard() {
678
- this.#dialogRef.close(ERtAsideUnsavedOutcome.Discard);
679
- }
680
- onSave() {
681
- this.#dialogRef.close(ERtAsideUnsavedOutcome.Save);
682
- }
683
- onStay() {
684
- this.#dialogRef.close(ERtAsideUnsavedOutcome.Stay);
685
- }
686
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtAsideUnsavedDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
687
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.6", type: RtAsideUnsavedDialogComponent, isStandalone: true, selector: "rt-aside-unsaved-dialog", host: { classAttribute: "rt-aside-unsaved-dialog" }, ngImport: i0, template: "<rt-dialog width=\"440px\" qa-dataid=\"aside-unsaved-dialog\" [ariaLabel]=\"t().uiUnsavedTitle\">\n <div rtBlock=\"rt-aside-unsaved-dialog\">\n <div rtElem=\"text\">\n <h2 rtElem=\"title\" qa-dataid=\"aside-unsaved-title\">{{ t().uiUnsavedTitle }}</h2>\n <p rtElem=\"message\" qa-dataid=\"aside-unsaved-message\">{{ t().uiUnsavedMessage }}</p>\n </div>\n\n <div rtElem=\"footer\">\n <button\n rtButton\n qa-dataid=\"aside-unsaved-discard\"\n type=\"button\"\n theme=\"danger\"\n appearance=\"outlined\"\n [label]=\"t().uiUnsavedDiscard\"\n [attr.aria-label]=\"t().uiUnsavedDiscard\"\n (click)=\"onDiscard()\"></button>\n <button\n rtButton\n qa-dataid=\"aside-unsaved-stay\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n [label]=\"t().uiUnsavedStay\"\n [attr.aria-label]=\"t().uiUnsavedStay\"\n (click)=\"onStay()\"></button>\n <button\n rtButton\n qa-dataid=\"aside-unsaved-save\"\n type=\"button\"\n appearance=\"filled\"\n [label]=\"t().uiUnsavedSave\"\n [attr.aria-label]=\"t().uiUnsavedSave\"\n (click)=\"onSave()\"></button>\n </div>\n </div>\n</rt-dialog>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-unsaved-dialog{display:flex;box-sizing:border-box;flex-direction:column;padding:var(--rt-space-xl);gap:var(--rt-space-lg)}.rt-aside-unsaved-dialog__text{display:flex;flex-direction:column;gap:var(--rt-space-sm)}.rt-aside-unsaved-dialog__title{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-md);font-weight:var(--rt-font-weight-bold)}.rt-aside-unsaved-dialog__message{margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-aside-unsaved-dialog__footer{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--rt-space-sm)}}\n"], dependencies: [{ kind: "directive", type:
688
- // standalone components / directives
689
- 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 }); }
690
- }
691
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtAsideUnsavedDialogComponent, decorators: [{
692
- type: Component,
693
- args: [{ selector: 'rt-aside-unsaved-dialog', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
694
- // standalone components / directives
695
- RtButtonDirective,
696
- RtDialogComponent,
697
- BlockDirective,
698
- ElemDirective,
699
- ], host: {
700
- class: BEM_BLOCK,
701
- }, template: "<rt-dialog width=\"440px\" qa-dataid=\"aside-unsaved-dialog\" [ariaLabel]=\"t().uiUnsavedTitle\">\n <div rtBlock=\"rt-aside-unsaved-dialog\">\n <div rtElem=\"text\">\n <h2 rtElem=\"title\" qa-dataid=\"aside-unsaved-title\">{{ t().uiUnsavedTitle }}</h2>\n <p rtElem=\"message\" qa-dataid=\"aside-unsaved-message\">{{ t().uiUnsavedMessage }}</p>\n </div>\n\n <div rtElem=\"footer\">\n <button\n rtButton\n qa-dataid=\"aside-unsaved-discard\"\n type=\"button\"\n theme=\"danger\"\n appearance=\"outlined\"\n [label]=\"t().uiUnsavedDiscard\"\n [attr.aria-label]=\"t().uiUnsavedDiscard\"\n (click)=\"onDiscard()\"></button>\n <button\n rtButton\n qa-dataid=\"aside-unsaved-stay\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n [label]=\"t().uiUnsavedStay\"\n [attr.aria-label]=\"t().uiUnsavedStay\"\n (click)=\"onStay()\"></button>\n <button\n rtButton\n qa-dataid=\"aside-unsaved-save\"\n type=\"button\"\n appearance=\"filled\"\n [label]=\"t().uiUnsavedSave\"\n [attr.aria-label]=\"t().uiUnsavedSave\"\n (click)=\"onSave()\"></button>\n </div>\n </div>\n</rt-dialog>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-unsaved-dialog{display:flex;box-sizing:border-box;flex-direction:column;padding:var(--rt-space-xl);gap:var(--rt-space-lg)}.rt-aside-unsaved-dialog__text{display:flex;flex-direction:column;gap:var(--rt-space-sm)}.rt-aside-unsaved-dialog__title{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-md);font-weight:var(--rt-font-weight-bold)}.rt-aside-unsaved-dialog__message{margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-aside-unsaved-dialog__footer{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--rt-space-sm)}}\n"] }]
702
- }] });
703
-
704
- /**
705
- * Generated bundle index. Do not edit.
706
- */
707
-
888
+ const BEM_BLOCK = "rt-aside-unsaved-dialog";
889
+ var RtAsideUnsavedDialogComponent = class RtAsideUnsavedDialogComponent {
890
+ constructor() {
891
+ this.#dialogRef = inject(RtDialogRef);
892
+ this.t = inject(RT_KIT_LABELS);
893
+ }
894
+ #dialogRef;
895
+ onDiscard() {
896
+ this.#dialogRef.close(ERtAsideUnsavedOutcome.Discard);
897
+ }
898
+ onSave() {
899
+ this.#dialogRef.close(ERtAsideUnsavedOutcome.Save);
900
+ }
901
+ onStay() {
902
+ this.#dialogRef.close(ERtAsideUnsavedOutcome.Stay);
903
+ }
904
+ static {
905
+ this.ɵfac = i0.ɵɵngDeclareFactory({
906
+ minVersion: "12.0.0",
907
+ version: "22.2.2",
908
+ ngImport: i0,
909
+ type: RtAsideUnsavedDialogComponent,
910
+ deps: [],
911
+ target: i0.ɵɵFactoryTarget.Component
912
+ });
913
+ }
914
+ static {
915
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
916
+ minVersion: "14.0.0",
917
+ version: "22.2.2",
918
+ type: RtAsideUnsavedDialogComponent,
919
+ isStandalone: true,
920
+ selector: "rt-aside-unsaved-dialog",
921
+ host: { classAttribute: "rt-aside-unsaved-dialog" },
922
+ ngImport: i0,
923
+ template: "<rt-dialog width=\"440px\" qa-dataid=\"aside-unsaved-dialog\" [ariaLabel]=\"t().uiUnsavedTitle\">\n <div rtBlock=\"rt-aside-unsaved-dialog\">\n <div rtElem=\"text\">\n <h2 rtElem=\"title\" qa-dataid=\"aside-unsaved-title\">{{ t().uiUnsavedTitle }}</h2>\n <p rtElem=\"message\" qa-dataid=\"aside-unsaved-message\">{{ t().uiUnsavedMessage }}</p>\n </div>\n\n <div rtElem=\"footer\">\n <button\n rtButton\n qa-dataid=\"aside-unsaved-discard\"\n type=\"button\"\n theme=\"danger\"\n appearance=\"outlined\"\n [label]=\"t().uiUnsavedDiscard\"\n [attr.aria-label]=\"t().uiUnsavedDiscard\"\n (click)=\"onDiscard()\"></button>\n <button\n rtButton\n qa-dataid=\"aside-unsaved-stay\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n [label]=\"t().uiUnsavedStay\"\n [attr.aria-label]=\"t().uiUnsavedStay\"\n (click)=\"onStay()\"></button>\n <button\n rtButton\n qa-dataid=\"aside-unsaved-save\"\n type=\"button\"\n appearance=\"filled\"\n [label]=\"t().uiUnsavedSave\"\n [attr.aria-label]=\"t().uiUnsavedSave\"\n (click)=\"onSave()\"></button>\n </div>\n </div>\n</rt-dialog>\n",
924
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-unsaved-dialog{display:flex;box-sizing:border-box;flex-direction:column;padding:var(--rt-space-xl);gap:var(--rt-space-lg)}.rt-aside-unsaved-dialog__text{display:flex;flex-direction:column;gap:var(--rt-space-sm)}.rt-aside-unsaved-dialog__title{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-md);font-weight:var(--rt-font-weight-bold)}.rt-aside-unsaved-dialog__message{margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-aside-unsaved-dialog__footer{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--rt-space-sm)}}\n"],
925
+ dependencies: [
926
+ {
927
+ kind: "directive",
928
+ type: RtButtonDirective,
929
+ selector: "button[rtButton], a[rtButton]",
930
+ inputs: [
931
+ "label",
932
+ "icon",
933
+ "iconPos",
934
+ "theme",
935
+ "appearance",
936
+ "size",
937
+ "loading",
938
+ "loadingIcon",
939
+ "loadingLabel",
940
+ "pressed"
941
+ ]
942
+ },
943
+ {
944
+ kind: "component",
945
+ type: RtDialogComponent,
946
+ selector: "rt-dialog",
947
+ inputs: [
948
+ "size",
949
+ "width",
950
+ "ariaLabel"
951
+ ]
952
+ },
953
+ {
954
+ kind: "directive",
955
+ type: BlockDirective,
956
+ selector: "[rtBlock]",
957
+ inputs: ["rtMod"]
958
+ },
959
+ {
960
+ kind: "directive",
961
+ type: ElemDirective,
962
+ selector: "[rtElem]",
963
+ inputs: ["rtMod"]
964
+ }
965
+ ],
966
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
967
+ encapsulation: i0.ViewEncapsulation.None
968
+ });
969
+ }
970
+ };
971
+ i0.ɵɵngDeclareClassMetadata({
972
+ minVersion: "12.0.0",
973
+ version: "22.2.2",
974
+ ngImport: i0,
975
+ type: RtAsideUnsavedDialogComponent,
976
+ decorators: [{
977
+ type: Component,
978
+ args: [{
979
+ selector: "rt-aside-unsaved-dialog",
980
+ changeDetection: ChangeDetectionStrategy.OnPush,
981
+ encapsulation: ViewEncapsulation.None,
982
+ imports: [
983
+ RtButtonDirective,
984
+ RtDialogComponent,
985
+ BlockDirective,
986
+ ElemDirective
987
+ ],
988
+ host: { class: BEM_BLOCK },
989
+ template: "<rt-dialog width=\"440px\" qa-dataid=\"aside-unsaved-dialog\" [ariaLabel]=\"t().uiUnsavedTitle\">\n <div rtBlock=\"rt-aside-unsaved-dialog\">\n <div rtElem=\"text\">\n <h2 rtElem=\"title\" qa-dataid=\"aside-unsaved-title\">{{ t().uiUnsavedTitle }}</h2>\n <p rtElem=\"message\" qa-dataid=\"aside-unsaved-message\">{{ t().uiUnsavedMessage }}</p>\n </div>\n\n <div rtElem=\"footer\">\n <button\n rtButton\n qa-dataid=\"aside-unsaved-discard\"\n type=\"button\"\n theme=\"danger\"\n appearance=\"outlined\"\n [label]=\"t().uiUnsavedDiscard\"\n [attr.aria-label]=\"t().uiUnsavedDiscard\"\n (click)=\"onDiscard()\"></button>\n <button\n rtButton\n qa-dataid=\"aside-unsaved-stay\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n [label]=\"t().uiUnsavedStay\"\n [attr.aria-label]=\"t().uiUnsavedStay\"\n (click)=\"onStay()\"></button>\n <button\n rtButton\n qa-dataid=\"aside-unsaved-save\"\n type=\"button\"\n appearance=\"filled\"\n [label]=\"t().uiUnsavedSave\"\n [attr.aria-label]=\"t().uiUnsavedSave\"\n (click)=\"onSave()\"></button>\n </div>\n </div>\n</rt-dialog>\n",
990
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-aside-unsaved-dialog{display:flex;box-sizing:border-box;flex-direction:column;padding:var(--rt-space-xl);gap:var(--rt-space-lg)}.rt-aside-unsaved-dialog__text{display:flex;flex-direction:column;gap:var(--rt-space-sm)}.rt-aside-unsaved-dialog__title{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-md);font-weight:var(--rt-font-weight-bold)}.rt-aside-unsaved-dialog__message{margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-aside-unsaved-dialog__footer{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--rt-space-sm)}}\n"]
991
+ }]
992
+ }]
993
+ });
708
994
  export { ERtAsideCloseIntent, ERtAsideUnsavedOutcome, RT_ASIDE_DATA, RtAsideComponent, RtAsideErrorBoxComponent, RtAsideFooterComponent, RtAsideHeaderComponent, RtAsideRef, RtAsideService, RtAsideUnsavedDialogComponent, resolveCloseIntent };
709
- //# sourceMappingURL=rt-tools-ui-kit-v2-aside.mjs.map
995
+
996
+ //# sourceMappingURL=rt-tools-ui-kit-v2-aside.mjs.map