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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) 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 +2321 -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-profile-menu.mjs +295 -0
  138. package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs.map +1 -0
  139. package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs +135 -45
  140. package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs.map +1 -1
  141. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +293 -171
  142. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -1
  143. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs +62 -55
  144. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs.map +1 -1
  145. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +3379 -1466
  146. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  147. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs +114 -116
  148. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs.map +1 -1
  149. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +406 -299
  150. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
  151. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +137 -36
  152. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -1
  153. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +687 -468
  154. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
  155. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +2195 -1569
  156. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
  157. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs +187 -48
  158. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs.map +1 -1
  159. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs +242 -122
  160. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs.map +1 -1
  161. package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs +439 -0
  162. package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs.map +1 -0
  163. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs +218 -69
  164. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs.map +1 -1
  165. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs +292 -91
  166. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs.map +1 -1
  167. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +225 -138
  168. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -1
  169. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +150 -116
  170. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -1
  171. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +2462 -1583
  172. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
  173. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +647 -346
  174. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
  175. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +335 -121
  176. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
  177. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +217 -84
  178. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -1
  179. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +151 -72
  180. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -1
  181. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +697 -226
  182. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
  183. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs +92 -38
  184. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs.map +1 -1
  185. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +752 -338
  186. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
  187. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +310 -129
  188. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
  189. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +286 -158
  190. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -1
  191. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +270 -134
  192. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
  193. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +322 -202
  194. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -1
  195. package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs +908 -0
  196. package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs.map +1 -0
  197. package/fesm2022/rt-tools-ui-kit-v2-tree.mjs +785 -0
  198. package/fesm2022/rt-tools-ui-kit-v2-tree.mjs.map +1 -0
  199. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs +118 -63
  200. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs.map +1 -1
  201. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +783 -262
  202. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
  203. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +633 -294
  204. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -1
  205. package/fesm2022/rt-tools-ui-kit-v2.mjs +100 -103
  206. package/package.json +45 -1
  207. package/src/assets/icons/collapse-all.svg +9 -0
  208. package/src/assets/icons/expand-all.svg +9 -0
  209. package/src/assets/icons-material/collapse-all.fill.svg +5 -0
  210. package/src/assets/icons-material/collapse-all.svg +5 -0
  211. package/src/assets/icons-material/expand-all.fill.svg +5 -0
  212. package/src/assets/icons-material/expand-all.svg +5 -0
  213. package/src/assets/icons-material/undo.fill.svg +5 -0
  214. package/src/assets/icons-material/undo.svg +5 -0
  215. package/src/lib/components/bottom-sheet/CONTEXT.md +20 -2
  216. package/src/lib/components/bottom-sheet/rt-bottom-sheet.component.scss +36 -1
  217. package/src/lib/components/breadcrumbs/CONTEXT.md +37 -0
  218. package/src/lib/components/breadcrumbs/rt-breadcrumbs.component.scss +205 -0
  219. package/src/lib/components/carousel/CONTEXT.md +42 -0
  220. package/src/lib/components/carousel/rt-carousel.component.scss +117 -0
  221. package/src/lib/components/checkbox/CONTEXT.md +3 -0
  222. package/src/lib/components/checkbox/rt-checkbox.component.scss +9 -3
  223. package/src/lib/components/color-palette/CONTEXT.md +49 -0
  224. package/src/lib/components/color-palette/picker/rt-color-picker.component.scss +161 -0
  225. package/src/lib/components/color-palette/rt-color-palette.component.scss +132 -0
  226. package/src/lib/components/draggable-tree/CONTEXT.md +54 -0
  227. package/src/lib/components/draggable-tree/rt-draggable-tree.component.scss +219 -0
  228. package/src/lib/components/hybrid-tree/CONTEXT.md +31 -0
  229. package/src/lib/components/hybrid-tree-selector/CONTEXT.md +25 -0
  230. package/src/lib/components/icon-button/CONTEXT.md +3 -0
  231. package/src/lib/components/inline-edit/CONTEXT.md +41 -0
  232. package/src/lib/components/inline-edit/rt-inline-edit.component.scss +274 -0
  233. package/src/lib/components/popover/CONTEXT.md +3 -0
  234. package/src/lib/components/profile-menu/CONTEXT.md +32 -0
  235. package/src/lib/components/profile-menu/rt-profile-menu.component.scss +104 -0
  236. package/src/lib/components/speed-menu/CONTEXT.md +34 -0
  237. package/src/lib/components/speed-menu/rt-speed-menu.component.scss +118 -0
  238. package/src/lib/components/tag/rt-tag.component.scss +12 -0
  239. package/src/lib/components/thread-list/CONTEXT.md +1 -0
  240. package/src/lib/components/thread-list/rt-thread-list.component.scss +2 -1
  241. package/src/lib/components/toolbar/CONTEXT.md +9 -4
  242. package/src/lib/components/toolbar/rt-toolbar.component.scss +10 -2
  243. package/src/lib/components/tooltip/CONTEXT.md +8 -1
  244. package/src/lib/components/tree/CONTEXT.md +66 -0
  245. package/src/lib/components/tree/rt-tree.component.scss +313 -0
  246. package/src/lib/components/tree-selector/CONTEXT.md +47 -0
  247. package/src/lib/components/tree-selector/rt-tree-selector.component.scss +121 -0
  248. package/src/styles/_primitives.scss +4 -0
  249. package/src/styles/_semantic.scss +5 -0
  250. package/styles/tokens.css +43 -0
  251. package/types/rt-tools-ui-kit-v2-accordion.d.ts +31 -24
  252. package/types/rt-tools-ui-kit-v2-action-bar.d.ts +112 -91
  253. package/types/rt-tools-ui-kit-v2-ai-run-status.d.ts +64 -40
  254. package/types/rt-tools-ui-kit-v2-aside-section.d.ts +13 -10
  255. package/types/rt-tools-ui-kit-v2-aside.d.ts +268 -206
  256. package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +102 -61
  257. package/types/rt-tools-ui-kit-v2-bar-list.d.ts +39 -27
  258. package/types/rt-tools-ui-kit-v2-bottom-sheet.d.ts +31 -20
  259. package/types/rt-tools-ui-kit-v2-breadcrumbs.d.ts +89 -0
  260. package/types/rt-tools-ui-kit-v2-button.d.ts +119 -59
  261. package/types/rt-tools-ui-kit-v2-calendar.d.ts +151 -86
  262. package/types/rt-tools-ui-kit-v2-card.d.ts +42 -21
  263. package/types/rt-tools-ui-kit-v2-carousel.d.ts +76 -0
  264. package/types/rt-tools-ui-kit-v2-checkbox.d.ts +48 -24
  265. package/types/rt-tools-ui-kit-v2-collapsible-text.d.ts +28 -20
  266. package/types/rt-tools-ui-kit-v2-color-palette.d.ts +208 -0
  267. package/types/rt-tools-ui-kit-v2-confirm-popover.d.ts +104 -47
  268. package/types/rt-tools-ui-kit-v2-container.d.ts +278 -221
  269. package/types/rt-tools-ui-kit-v2-copy-value.d.ts +39 -24
  270. package/types/rt-tools-ui-kit-v2-core.d.ts +862 -865
  271. package/types/rt-tools-ui-kit-v2-counter-row.d.ts +20 -12
  272. package/types/rt-tools-ui-kit-v2-counter.d.ts +70 -38
  273. package/types/rt-tools-ui-kit-v2-data-list.d.ts +429 -264
  274. package/types/rt-tools-ui-kit-v2-data-table.d.ts +500 -351
  275. package/types/rt-tools-ui-kit-v2-date-picker.d.ts +164 -138
  276. package/types/rt-tools-ui-kit-v2-date-range.d.ts +102 -84
  277. package/types/rt-tools-ui-kit-v2-delta-view.d.ts +16 -13
  278. package/types/rt-tools-ui-kit-v2-detail-list.d.ts +23 -16
  279. package/types/rt-tools-ui-kit-v2-dialog.d.ts +130 -101
  280. package/types/rt-tools-ui-kit-v2-dot-field.d.ts +10 -13
  281. package/types/rt-tools-ui-kit-v2-download-link.d.ts +22 -17
  282. package/types/rt-tools-ui-kit-v2-draggable-tree.d.ts +132 -0
  283. package/types/rt-tools-ui-kit-v2-dynamic-list.d.ts +185 -96
  284. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +904 -404
  285. package/types/rt-tools-ui-kit-v2-empty-state.d.ts +48 -19
  286. package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +67 -39
  287. package/types/rt-tools-ui-kit-v2-field.d.ts +90 -49
  288. package/types/rt-tools-ui-kit-v2-file-card.d.ts +115 -75
  289. package/types/rt-tools-ui-kit-v2-file-drop.d.ts +75 -48
  290. package/types/rt-tools-ui-kit-v2-file-input.d.ts +53 -36
  291. package/types/rt-tools-ui-kit-v2-file-list.d.ts +5 -8
  292. package/types/rt-tools-ui-kit-v2-filter-control.d.ts +83 -49
  293. package/types/rt-tools-ui-kit-v2-form-control.d.ts +102 -74
  294. package/types/rt-tools-ui-kit-v2-header.d.ts +40 -22
  295. package/types/rt-tools-ui-kit-v2-hybrid-tree-selector.d.ts +14 -0
  296. package/types/rt-tools-ui-kit-v2-hybrid-tree.d.ts +72 -0
  297. package/types/rt-tools-ui-kit-v2-icon-button.d.ts +190 -90
  298. package/types/rt-tools-ui-kit-v2-icon.d.ts +160 -129
  299. package/types/rt-tools-ui-kit-v2-image-cropper.d.ts +151 -111
  300. package/types/rt-tools-ui-kit-v2-image-upload.d.ts +159 -85
  301. package/types/rt-tools-ui-kit-v2-info-item.d.ts +26 -13
  302. package/types/rt-tools-ui-kit-v2-inline-edit.d.ts +194 -0
  303. package/types/rt-tools-ui-kit-v2-input-number.d.ts +102 -53
  304. package/types/rt-tools-ui-kit-v2-input.d.ts +82 -43
  305. package/types/rt-tools-ui-kit-v2-live-badge.d.ts +30 -17
  306. package/types/rt-tools-ui-kit-v2-logo.d.ts +49 -32
  307. package/types/rt-tools-ui-kit-v2-markdown-text.d.ts +26 -17
  308. package/types/rt-tools-ui-kit-v2-menu.d.ts +272 -155
  309. package/types/rt-tools-ui-kit-v2-message.d.ts +59 -33
  310. package/types/rt-tools-ui-kit-v2-money-list.d.ts +36 -18
  311. package/types/rt-tools-ui-kit-v2-multiselect.d.ts +114 -80
  312. package/types/rt-tools-ui-kit-v2-night-grid.d.ts +34 -25
  313. package/types/rt-tools-ui-kit-v2-note.d.ts +12 -9
  314. package/types/rt-tools-ui-kit-v2-notifications-bell.d.ts +37 -16
  315. package/types/rt-tools-ui-kit-v2-page-header.d.ts +218 -150
  316. package/types/rt-tools-ui-kit-v2-pagination.d.ts +99 -63
  317. package/types/rt-tools-ui-kit-v2-photo-viewer.d.ts +61 -66
  318. package/types/rt-tools-ui-kit-v2-popover.d.ts +116 -55
  319. package/types/rt-tools-ui-kit-v2-profile-menu.d.ts +103 -0
  320. package/types/rt-tools-ui-kit-v2-prompt-suggestion.d.ts +26 -16
  321. package/types/rt-tools-ui-kit-v2-radio-button.d.ts +85 -43
  322. package/types/rt-tools-ui-kit-v2-radius.d.ts +18 -15
  323. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +931 -590
  324. package/types/rt-tools-ui-kit-v2-ripple.d.ts +28 -25
  325. package/types/rt-tools-ui-kit-v2-scroll-area.d.ts +60 -58
  326. package/types/rt-tools-ui-kit-v2-section-nav.d.ts +32 -22
  327. package/types/rt-tools-ui-kit-v2-select.d.ts +182 -139
  328. package/types/rt-tools-ui-kit-v2-side-menu.d.ts +452 -349
  329. package/types/rt-tools-ui-kit-v2-skeleton-wrapper.d.ts +53 -20
  330. package/types/rt-tools-ui-kit-v2-skeleton.d.ts +55 -26
  331. package/types/rt-tools-ui-kit-v2-speed-menu.d.ts +131 -0
  332. package/types/rt-tools-ui-kit-v2-spinner.d.ts +56 -28
  333. package/types/rt-tools-ui-kit-v2-split-button.d.ts +96 -55
  334. package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +88 -60
  335. package/types/rt-tools-ui-kit-v2-stepper.d.ts +50 -37
  336. package/types/rt-tools-ui-kit-v2-table.d.ts +631 -480
  337. package/types/rt-tools-ui-kit-v2-tabs.d.ts +198 -113
  338. package/types/rt-tools-ui-kit-v2-tag.d.ts +106 -53
  339. package/types/rt-tools-ui-kit-v2-textarea.d.ts +48 -25
  340. package/types/rt-tools-ui-kit-v2-theme-toggle.d.ts +28 -26
  341. package/types/rt-tools-ui-kit-v2-thread-list.d.ts +154 -94
  342. package/types/rt-tools-ui-kit-v2-timeline.d.ts +30 -28
  343. package/types/rt-tools-ui-kit-v2-toast.d.ts +174 -98
  344. package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +132 -86
  345. package/types/rt-tools-ui-kit-v2-toggle-switch.d.ts +88 -50
  346. package/types/rt-tools-ui-kit-v2-toolbar.d.ts +30 -27
  347. package/types/rt-tools-ui-kit-v2-tooltip.d.ts +65 -41
  348. package/types/rt-tools-ui-kit-v2-tree-selector.d.ts +257 -0
  349. package/types/rt-tools-ui-kit-v2-tree.d.ts +282 -0
  350. package/types/rt-tools-ui-kit-v2-welcome-dialog.d.ts +21 -24
  351. package/types/rt-tools-ui-kit-v2-workspace-details.d.ts +195 -124
  352. package/types/rt-tools-ui-kit-v2-workspace.d.ts +122 -79
  353. package/types/rt-tools-ui-kit-v2.d.ts +100 -90
  354. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"rt-tools-ui-kit-v2-dialog.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog.component.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog.component.html","../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog-ref.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog.tokens.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog.service.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/header/rt-dialog-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/header/rt-dialog-header.component.html","../../../projects/ui-kit-v2/src/lib/components/dialog/footer/rt-dialog-footer.component.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/footer/rt-dialog-footer.component.html","../../../projects/ui-kit-v2/src/lib/components/dialog/content/rt-dialog-content.component.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/content/rt-dialog-content.component.html","../../../projects/ui-kit-v2/src/lib/components/dialog/rt-tools-ui-kit-v2-dialog.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input, InputSignal, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\n\nconst BEM_BLOCK: string = 'rt-dialog';\n\nexport type TRtDialogSize = 'sm' | 'md' | 'lg';\n\n/**\n * Презентационный styled-frame для модалки поверх CDK Overlay.\n *\n * Видимость / backdrop / scroll-block / ESC / фокус — НЕ внутренняя\n * ответственность компонента. Это обеспечивает `RtDialogService.open()`: оверлей CDK, а\n * ловушку и первый фокус — по флагам `trapFocus`, `restoreFocus` и `autoFocus` (по\n * умолчанию выключены). Рамка несёт `tabindex=\"-1\"`, чтобы `autoFocus: 'dialog'` мог её взять. rt-dialog здесь — стилизованная \"рамка\"\n * (padding-free контейнер) с size-вариантами + ng-content слотом.\n *\n * Композиция:\n * \\`\\`\\`html\n * <rt-dialog size=\"md\">\n * <rt-dialog-header title=\"Создание записи\" />\n * <div style=\"padding: var(--rt-space-lg);\">body...</div>\n * <rt-dialog-footer>\n * <button rtButton (click)=\"cancel()\">Отмена</button>\n * <button rtButton (click)=\"save()\">Сохранить</button>\n * </rt-dialog-footer>\n * </rt-dialog>\n * \\`\\`\\`\n *\n * Открытие — через `RtDialogService.open(MyModalComponent, { data })` →\n * получаешь `RtDialogRef<T>` с `.close(result)` + `.afterClosed()`.\n *\n * `ViewEncapsulation.None` — стили префиксованы `.rt-dialog`, чтобы\n * rt-dialog-header / rt-dialog-footer subscriptions работали с одним\n * BEM-классом без cross-encapsulation хака.\n */\n@Component({\n selector: 'rt-dialog',\n templateUrl: './rt-dialog.component.html',\n styleUrl: './rt-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [BlockDirective, ModDirective],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[style.--rt-dialog-width]': 'width()',\n },\n})\nexport class RtDialogComponent {\n /**\n * Размер модалки:\n * - `sm` — 460px (`--rt-dialog-width-sm`)\n * - `md` — 660px (`--rt-dialog-width-md`, дефолт)\n * - `lg` — 860px (`--rt-dialog-width-lg`)\n */\n public readonly size: InputSignal<TRtDialogSize> = input<TRtDialogSize>('md');\n\n /** Override ширины через CSS-property `--rt-dialog-width`. Имеет приоритет над `size`. */\n public readonly width: InputSignal<string | null> = input<string | null>(null);\n\n /** ARIA-label для dialog-обёртки (если нет видимого заголовка). */\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n}\n","<div\n rtBlock=\"rt-dialog\"\n qa-dataid=\"dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n tabindex=\"-1\"\n [rtMod]=\"{ size: size() }\"\n [style.--rt-dialog-width]=\"width()\"\n [attr.aria-label]=\"ariaLabel()\">\n <ng-content />\n</div>\n","import { OverlayRef } from '@angular/cdk/overlay';\nimport { signal, WritableSignal } from '@angular/core';\n\nimport { Observable, Subject, take } from 'rxjs';\n\n/**\n * Хэндл к программно открытой модалке (через `RtDialogService.open()`).\n *\n * Контент-компонент инжектит `RtDialogRef` и закрывает модалку через `.close(result?)`.\n * Родитель, открывший модалку, ждёт результата через `.afterClosed()`.\n *\n * Слой, снятый без `close()` — переходом по адресу или уничтожением хозяина, — тоже завершает\n * `afterClosed()`: подписчик получает `undefined`. Иначе он ждал бы ответа, которого не будет.\n *\n * Generic `<T>` — тип результата `close(result)`. Дефолт `unknown` — если результат\n * не нужен, оставляй generic пустым.\n *\n * @example\n * \\`\\`\\`ts\n * // в контент-компоненте\n * private readonly dialogRef = inject(RtDialogRef);\n * close(): void { this.dialogRef.close({ confirmed: true }); }\n *\n * // в родителе\n * dialogService.open(MyDialogComponent).afterClosed().subscribe((result) => {...});\n * \\`\\`\\`\n */\nexport class RtDialogRef<T = unknown> {\n /**\n * Runtime-флаг, блокирующий close() через ESC / backdrop click.\n *\n * Default `false`. Включай (`dialogRef.disableClose.set(true)`) на\n * время in-flight submit'а, чтобы юзер не потерял введённые в форму\n * данные на случайном ESC. После next/error subscribe ставь обратно\n * в `false`. Не влияет на программный `close(result)` — он всегда\n * закрывает overlay.\n *\n * Статические config-флаги `closeOnEscape` / `closeOnBackdropClick`\n * (см. `IRtDialogConfig`) определяют, подписан ли вообще handler на\n * соответствующее событие; `disableClose` — это runtime-override,\n * который гейтит dispatch внутри уже-подписанного handler'а.\n */\n public readonly disableClose: WritableSignal<boolean> = signal(false);\n\n readonly #overlayRef: OverlayRef;\n readonly #afterClosedSource: Subject<T | undefined> = new Subject<T | undefined>();\n\n #isClosed: boolean = false;\n\n constructor(overlayRef: OverlayRef) {\n this.#overlayRef = overlayRef;\n this.#overlayRef\n .detachments()\n .pipe(take(1))\n .subscribe((): void => this.#finish(undefined));\n }\n\n /** Закрывает overlay; опционально передаёт результат подписчикам `afterClosed()`. */\n public close(result?: T): void {\n if (this.#isClosed) {\n return;\n }\n // Флаг до dispose: снятие слоя само отзовётся в detachments(), а результат отдаёт close().\n this.#isClosed = true;\n this.#overlayRef.dispose();\n this.#afterClosedSource.next(result);\n this.#afterClosedSource.complete();\n }\n\n /** Эмиттит один раз — результат `close(result)` или `undefined` при снятом слое — и завершается. */\n public afterClosed(): Observable<T | undefined> {\n return this.#afterClosedSource.asObservable();\n }\n\n #finish(result: T | undefined): void {\n if (this.#isClosed) {\n return;\n }\n this.#isClosed = true;\n this.#afterClosedSource.next(result);\n this.#afterClosedSource.complete();\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Injection token для передачи данных в модалку, открытую через `RtDialogService.open()`.\n *\n * Пользовательский компонент-контент модалки инжектит токен и получает данные,\n * переданные в `DialogConfig.data`. Тип значения задаётся generic'ом — `inject(RT_DIALOG_DATA)`\n * вернёт `unknown`, прокастуй через `inject(RT_DIALOG_DATA) as MyDataType` ИЛИ\n * объяви токен с конкретным generic'ом в feature-либе.\n *\n * @example\n * \\`\\`\\`ts\n * @Component({...})\n * export class WelcomeModalComponent {\n * readonly data = inject(RT_DIALOG_DATA) as { userName: string };\n * }\n *\n * // parent\n * dialogService.open(WelcomeModalComponent, { data: { userName: \"Иван\" } });\n * \\`\\`\\`\n */\nexport const RT_DIALOG_DATA: InjectionToken<unknown> = new InjectionToken<unknown>('RT_DIALOG_DATA');\n","import { FocusTrap, FocusTrapFactory } from '@angular/cdk/a11y';\nimport { ComponentType, Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport { afterNextRender, inject, Injectable, Injector, Signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { EMPTY, map, merge, mergeMap, Observable, Subject, take, takeUntil } from 'rxjs';\n\nimport { carryThemeScopeOfFocus, materialPresetClassesOfFocus } from '@rt-tools/ui-kit-v2/core';\nimport { RtDialogRef } from './rt-dialog-ref';\nimport { RT_DIALOG_DATA } from './rt-dialog.tokens';\n\n/**\n * Конфигурация открытия модалки через `RtDialogService.open()`.\n */\nexport interface IRtDialogConfig<TData = unknown> {\n /** Данные, доступные внутри модалки через `inject(RT_DIALOG_DATA)`. */\n data?: TData;\n\n /** Дополнительный CSS-класс для backdrop (поверх стандартного `rt-dialog-backdrop`). */\n backdropClass?: string | string[];\n\n /** Дополнительный CSS-класс для panel-обёртки overlay (поверх `rt-dialog-overlay`). */\n panelClass?: string | string[];\n\n /** Закрывать модалку по клику на backdrop. По дефолту `true`. */\n closeOnBackdropClick?: boolean;\n\n /** Закрывать модалку по ESC. По дефолту `true`. */\n closeOnEscape?: boolean;\n\n /** Держать Tab внутри модалки, пока она открыта. По дефолту `false` — как было. */\n trapFocus?: boolean;\n\n /** После закрытия вернуть фокус туда, где он стоял при открытии. По дефолту `false`. */\n restoreFocus?: boolean;\n\n /**\n * Куда поставить фокус при открытии: `'dialog'` — на рамку окна, `'first-tabbable'` — на первый\n * элемент, до которого доходит Tab. По дефолту `false` — фокус не трогается.\n */\n autoFocus?: TRtDialogAutoFocus;\n}\n\n/** Куда диалог ставит фокус при открытии; `false` — никуда. */\nexport type TRtDialogAutoFocus = 'dialog' | 'first-tabbable' | false;\n\n/**\n * Фокус одного открытия: ловушка ставится после того, как содержимое прикреплено, а вернуть\n * фокус надо при уходе оверлея, поэтому поля пишутся по ходу открытия.\n */\ninterface IRtDialogFocusState {\n trap: FocusTrap | null;\n restoreTo: HTMLElement | null;\n}\n\n/**\n * Контекст одного открытия модалки — payload для per-open close-подписок в конструкторном\n * стриме. `dialogRef` сужен до используемых handler'ами членов (`RtDialogRef<T>` инвариантен\n * по `T`, целиком в generic-agnostic контекст не влезает).\n */\ninterface IRtDialogOpenContext {\n overlayRef: OverlayRef;\n dialogRef: {\n disableClose: Signal<boolean>;\n close: () => void;\n };\n closeOnBackdropClick: boolean;\n closeOnEscape: boolean;\n focus: IRtDialogFocusState;\n}\n\n/**\n * Программный API для открытия модалок поверх CDK Overlay.\n *\n * Устройство сервиса:\n * - `Overlay.position().global().centerHorizontally().centerVertically()` — центрирование.\n * - `scrollStrategies.block()` — фиксирует background-scroll.\n * - `hasBackdrop: true` + кастомный класс — затемнение.\n * - `ComponentPortal` + custom `Injector` подкидывает `RtDialogRef` + `RT_DIALOG_DATA` в DI\n * контент-компонента.\n *\n * Альтернатива: legacy inline `<rt-dialog [visible]>` форма продолжает работать через\n * native `<dialog>.showModal()`. Новые экраны — на программный API.\n *\n * @example\n * \\`\\`\\`ts\n * // открытие\n * private readonly dialogService = inject(RtDialogService);\n *\n * openConfirm(): void {\n * const ref = this.dialogService.open<ConfirmDialogComponent, { question: string }, boolean>(\n * ConfirmDialogComponent,\n * { data: { question: \"Удалить?\" } }\n * );\n * ref.afterClosed().subscribe((confirmed) => {\n * if (confirmed) this.delete();\n * });\n * }\n *\n * // контент-компонент\n * @Component({\n * selector: \"rt-confirm-dialog\",\n * template: \\`\n * <rt-dialog size=\"sm\">\n * <rt-dialog-header [title]=\"data.question\" />\n * <div>Действие необратимо.</div>\n * <rt-dialog-footer>\n * <button rtButton (click)=\"close(false)\">Отмена</button>\n * <button rtButton theme=\"danger\" (click)=\"close(true)\">Удалить</button>\n * </rt-dialog-footer>\n * </rt-dialog>\n * \\`,\n * })\n * export class ConfirmDialogComponent {\n * readonly data = inject(RT_DIALOG_DATA) as { question: string };\n * readonly #ref = inject(RtDialogRef<boolean>);\n * close(result: boolean): void { this.#ref.close(result); }\n * }\n * \\`\\`\\`\n */\n@Injectable({ providedIn: 'root' })\nexport class RtDialogService {\n readonly #overlay: Overlay = inject(Overlay);\n readonly #injector: Injector = inject(Injector);\n readonly #document: Document = inject(DOCUMENT);\n readonly #focusTrapFactory: FocusTrapFactory = inject(FocusTrapFactory);\n\n readonly #openSource: Subject<IRtDialogOpenContext> = new Subject<IRtDialogOpenContext>();\n\n constructor() {\n // Per-open close-подписки (backdrop / ESC) живут в одном постоянном\n // конструкторном стриме: open() эмитит контекст открытия, mergeMap\n // подписывает event-стримы конкретного OverlayRef. `detachments()`\n // терминирует внутренний поток при overlay.dispose() (дёргается из\n // RtDialogRef.close()). mergeMap, а не switchMap — одновременно может\n // быть открыто несколько модалок (стек).\n //\n // Внутри обоих handler'ов — runtime-guard через `dialogRef.disableClose()`:\n // если контент-компонент выставил `disableClose.set(true)` (например, на\n // время in-flight submit'а), ESC / backdrop НЕ закрывают overlay.\n // Программный `dialogRef.close(result)` гейтом не задет — он всегда работает.\n this.#openSource\n .pipe(\n mergeMap((openContext: IRtDialogOpenContext): Observable<() => void> => {\n const backdropClose$: Observable<() => void> = openContext.closeOnBackdropClick\n ? openContext.overlayRef.backdropClick().pipe(\n map((): (() => void) => (): void => {\n if (openContext.dialogRef.disableClose()) {\n return;\n }\n openContext.dialogRef.close();\n })\n )\n : EMPTY;\n const escapeClose$: Observable<() => void> = openContext.closeOnEscape\n ? openContext.overlayRef.keydownEvents().pipe(\n map((event: KeyboardEvent): (() => void) => (): void => {\n if (event.key !== 'Escape') {\n return;\n }\n event.preventDefault();\n if (openContext.dialogRef.disableClose()) {\n return;\n }\n openContext.dialogRef.close();\n })\n )\n : EMPTY;\n // Уход оверлея снимает ловушку фокуса и возвращает фокус. Отдельно от закрывающих\n // потоков: те обрываются тем же уходом и до него не доживают.\n const releaseFocus$: Observable<() => void> = openContext.overlayRef.detachments().pipe(\n take(1),\n map((): (() => void) => (): void => this.#releaseFocus(openContext.focus))\n );\n return merge(merge(backdropClose$, escapeClose$).pipe(takeUntil(openContext.overlayRef.detachments())), releaseFocus$);\n }),\n takeUntilDestroyed()\n )\n .subscribe((handleCloseIntent: () => void): void => handleCloseIntent());\n }\n\n public open<TComponent, TData = unknown, TResult = unknown>(\n component: ComponentType<TComponent>,\n config?: IRtDialogConfig<TData>\n ): RtDialogRef<TResult> {\n const overlayRef: OverlayRef = this.#overlay.create({\n positionStrategy: this.#overlay.position().global().centerHorizontally().centerVertically(),\n scrollStrategy: this.#overlay.scrollStrategies.block(),\n hasBackdrop: true,\n backdropClass: config?.backdropClass ?? 'rt-dialog-backdrop',\n panelClass: [config?.panelClass ?? 'rt-dialog-overlay', materialPresetClassesOfFocus(this.#document)].flat(),\n disposeOnNavigation: true,\n });\n // До attach: содержимое диалога может забрать фокус, и кусок темы у кнопки будет потерян.\n carryThemeScopeOfFocus(overlayRef.overlayElement, this.#document);\n\n const dialogRef: RtDialogRef<TResult> = new RtDialogRef<TResult>(overlayRef);\n const focus: IRtDialogFocusState = {\n trap: null,\n restoreTo: config?.restoreFocus === true ? this.#focusedElement() : null,\n };\n\n // Сами close-подписки объявлены один раз в конструкторе — здесь только\n // эмит контекста открытия (см. #openSource-стрим).\n this.#openSource.next({\n overlayRef,\n dialogRef,\n focus,\n closeOnBackdropClick: config?.closeOnBackdropClick !== false,\n closeOnEscape: config?.closeOnEscape !== false,\n });\n\n const injector: Injector = Injector.create({\n parent: this.#injector,\n providers: [\n { provide: RtDialogRef, useValue: dialogRef },\n { provide: RT_DIALOG_DATA, useValue: config?.data ?? null },\n ],\n });\n\n const portal: ComponentPortal<TComponent> = new ComponentPortal<TComponent>(component, null, injector);\n overlayRef.attach(portal);\n this.#holdFocus(overlayRef.overlayElement, focus, config?.trapFocus === true, config?.autoFocus ?? false);\n\n return dialogRef;\n }\n\n /**\n * Ловушка и первый фокус ставятся после отрисовки содержимого: до неё в оверлее нет ни рамки,\n * ни кнопок, и ловушке не на что опереться.\n */\n #holdFocus(pane: HTMLElement, focus: IRtDialogFocusState, trapFocus: boolean, autoFocus: TRtDialogAutoFocus): void {\n if (!trapFocus && autoFocus === false) {\n return;\n }\n afterNextRender(\n (): void => {\n if (trapFocus) {\n focus.trap = this.#focusTrapFactory.create(pane);\n }\n switch (autoFocus) {\n case 'dialog':\n pane.querySelector<HTMLElement>('[role=\"dialog\"]')?.focus();\n break;\n case 'first-tabbable':\n this.#focusFirstTabbable(pane, focus.trap);\n break;\n default:\n break;\n }\n },\n { injector: this.#injector }\n );\n }\n\n /** Без ловушки первый элемент ищет временная ловушка: обход по Tab у неё уже есть. */\n #focusFirstTabbable(pane: HTMLElement, trap: FocusTrap | null): void {\n if (trap) {\n trap.focusFirstTabbableElement();\n return;\n }\n const lookup: FocusTrap = this.#focusTrapFactory.create(pane);\n lookup.focusFirstTabbableElement();\n lookup.destroy();\n }\n\n #releaseFocus(focus: IRtDialogFocusState): void {\n focus.trap?.destroy();\n focus.trap = null;\n if (focus.restoreTo?.isConnected) {\n focus.restoreTo.focus();\n }\n }\n\n #focusedElement(): HTMLElement | null {\n const active: Element | null = this.#document.activeElement;\n return active instanceof HTMLElement && active !== this.#document.body ? active : null;\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n inject,\n input,\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtDialogRef } from '../rt-dialog-ref';\n\nconst BEM_BLOCK: string = 'rt-dialog-header';\n\n/**\n * Заголовок модалки для композиции внутри `<rt-dialog>`.\n *\n * Если компонент рендерится внутри overlay-портала, открытого через `RtDialogService.open()`,\n * кнопка закрытия дёргает `inject(RtDialogRef).close()` автоматически. В legacy-режиме\n * (внутри inline `<rt-dialog [visible]>`) `RtDialogRef` не зарегистрирован — клик\n * по close-кнопке эмитит output `(closeAction)`, который должен повесить родитель.\n *\n * Перед заголовком — место для значка или другого элемента: узел с атрибутом\n * `rtDialogHeaderLead` проецируется туда. Пустое место ничего не занимает.\n *\n * `ViewEncapsulation.None` — для единообразия с rt-dialog (стили префиксованы `.rt-dialog-header`).\n *\n * @example\n * \\`\\`\\`html\n * <rt-dialog size=\"md\">\n * <rt-dialog-header title=\"Создание записи\" />\n * <div>...форма...</div>\n * <rt-dialog-footer>\n * <button rtButton (click)=\"cancel()\">Отмена</button>\n * <button rtButton theme=\"primary\" (click)=\"save()\">Сохранить</button>\n * </rt-dialog-footer>\n * </rt-dialog>\n * \\`\\`\\`\n */\n@Component({\n selector: 'rt-dialog-header',\n templateUrl: './rt-dialog-header.component.html',\n styleUrl: './rt-dialog-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtDialogHeaderComponent {\n readonly #dialogRef: RtDialogRef | null = inject(RtDialogRef, { optional: true });\n\n /** Текст заголовка — рендерится в `<h2>`. */\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n public readonly title: InputSignal<string> = input.required<string>();\n\n /** Показывать кнопку закрытия в углу заголовка. Дефолт `true`. */\n public readonly closable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n protected onClose(): void {\n // Programmatic mode — закрываем через DialogRef.\n this.#dialogRef?.close();\n }\n}\n","<header rtBlock=\"rt-dialog-header\" qa-dataid=\"dialog-header\">\n <span rtElem=\"lead\" qa-dataid=\"dialog-header-lead\"><ng-content select=\"[rtDialogHeaderLead]\" /></span>\n <h2 rtElem=\"title\" qa-dataid=\"dialog-title\">{{ title() }}</h2>\n @if (closable()) {\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"dialog-close\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n [ariaLabel]=\"t().uiClose\"\n (clicked)=\"onClose()\" />\n }\n</header>\n","import { ChangeDetectionStrategy, Component, input, InputSignal, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ModDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-dialog-footer';\n\n/** Как подвал раскладывает содержимое: к началу, по центру, к концу или по обоим краям. */\nexport type TRtDialogFooterAlign = 'start' | 'center' | 'end' | 'between';\n\n/**\n * Footer-слот для композиции внутри `<rt-dialog>`. Принимает любой проектированный\n * контент (action-кнопки, статусные сообщения и т.п.), оборачивает в footer с\n * top-border и flex-раскладкой; вход `align` прижимает содержимое к концу (по умолчанию),\n * к началу, к центру или разводит по краям (`between`).\n *\n * `ViewEncapsulation.None` — для единообразия с rt-dialog.\n *\n * @example\n * \\`\\`\\`html\n * <rt-dialog-footer>\n * <button rtButton (click)=\"cancel()\">Отмена</button>\n * <button rtButton theme=\"primary\" (click)=\"save()\">Сохранить</button>\n * </rt-dialog-footer>\n * \\`\\`\\`\n */\n@Component({\n selector: 'rt-dialog-footer',\n templateUrl: './rt-dialog-footer.component.html',\n styleUrl: './rt-dialog-footer.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [BlockDirective, ModDirective],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtDialogFooterComponent {\n public readonly align: InputSignal<TRtDialogFooterAlign> = input<TRtDialogFooterAlign>('end');\n}\n","<footer rtBlock=\"rt-dialog-footer\" qa-dataid=\"dialog-footer\" [rtMod]=\"{ align: align() }\">\n <ng-content />\n</footer>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-dialog-content';\n\n/**\n * Тело модалки для композиции внутри `<rt-dialog>` между шапкой и подвалом. Даёт отступ и\n * прокрутку: длинное содержимое прокручивается внутри тела, а шапка и подвал стоят на месте.\n * Отступ задаёт `--rt-dialog-content-padding`, потолок высоты — `--rt-dialog-content-max-height`.\n *\n * Часть необязательная: окно со своей обёрткой тела выглядит как прежде.\n *\n * @example\n * \\`\\`\\`html\n * <rt-dialog size=\"md\">\n * <rt-dialog-header title=\"Создание записи\" />\n * <rt-dialog-content>...форма...</rt-dialog-content>\n * <rt-dialog-footer>...</rt-dialog-footer>\n * </rt-dialog>\n * \\`\\`\\`\n */\n@Component({\n selector: 'rt-dialog-content',\n templateUrl: './rt-dialog-content.component.html',\n styleUrl: './rt-dialog-content.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [BlockDirective],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtDialogContentComponent {}\n","<div rtBlock=\"rt-dialog-content\" qa-dataid=\"dialog-content\">\n <ng-content />\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["BEM_BLOCK"],"mappings":"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"}
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-dialog.mjs","names":["BEM_BLOCK","BEM_BLOCK","BEM_BLOCK"],"sources":["../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog.component.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog.component.html","../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog-ref.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog.tokens.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog.service.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/header/rt-dialog-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/header/rt-dialog-header.component.html","../../../projects/ui-kit-v2/src/lib/components/dialog/footer/rt-dialog-footer.component.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/footer/rt-dialog-footer.component.html","../../../projects/ui-kit-v2/src/lib/components/dialog/content/rt-dialog-content.component.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/content/rt-dialog-content.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input, InputSignal, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\n\nconst BEM_BLOCK: string = 'rt-dialog';\n\nexport type TRtDialogSize = 'sm' | 'md' | 'lg';\n\n/**\n * Презентационный styled-frame для модалки поверх CDK Overlay.\n *\n * Видимость / backdrop / scroll-block / ESC / фокус — НЕ внутренняя\n * ответственность компонента. Это обеспечивает `RtDialogService.open()`: оверлей CDK, а\n * ловушку и первый фокус — по флагам `trapFocus`, `restoreFocus` и `autoFocus` (по\n * умолчанию выключены). Рамка несёт `tabindex=\"-1\"`, чтобы `autoFocus: 'dialog'` мог её взять. rt-dialog здесь — стилизованная \"рамка\"\n * (padding-free контейнер) с size-вариантами + ng-content слотом.\n *\n * Композиция:\n * \\`\\`\\`html\n * <rt-dialog size=\"md\">\n * <rt-dialog-header title=\"Создание записи\" />\n * <div style=\"padding: var(--rt-space-lg);\">body...</div>\n * <rt-dialog-footer>\n * <button rtButton (click)=\"cancel()\">Отмена</button>\n * <button rtButton (click)=\"save()\">Сохранить</button>\n * </rt-dialog-footer>\n * </rt-dialog>\n * \\`\\`\\`\n *\n * Открытие — через `RtDialogService.open(MyModalComponent, { data })` →\n * получаешь `RtDialogRef<T>` с `.close(result)` + `.afterClosed()`.\n *\n * `ViewEncapsulation.None` — стили префиксованы `.rt-dialog`, чтобы\n * rt-dialog-header / rt-dialog-footer subscriptions работали с одним\n * BEM-классом без cross-encapsulation хака.\n */\n@Component({\n selector: 'rt-dialog',\n templateUrl: './rt-dialog.component.html',\n styleUrl: './rt-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [BlockDirective, ModDirective],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[style.--rt-dialog-width]': 'width()',\n },\n})\nexport class RtDialogComponent {\n /**\n * Размер модалки:\n * - `sm` — 460px (`--rt-dialog-width-sm`)\n * - `md` — 660px (`--rt-dialog-width-md`, дефолт)\n * - `lg` — 860px (`--rt-dialog-width-lg`)\n */\n public readonly size: InputSignal<TRtDialogSize> = input<TRtDialogSize>('md');\n\n /** Override ширины через CSS-property `--rt-dialog-width`. Имеет приоритет над `size`. */\n public readonly width: InputSignal<string | null> = input<string | null>(null);\n\n /** ARIA-label для dialog-обёртки (если нет видимого заголовка). */\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n}\n","<div\n rtBlock=\"rt-dialog\"\n qa-dataid=\"dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n tabindex=\"-1\"\n [rtMod]=\"{ size: size() }\"\n [style.--rt-dialog-width]=\"width()\"\n [attr.aria-label]=\"ariaLabel()\">\n <ng-content />\n</div>\n","import { OverlayRef } from '@angular/cdk/overlay';\nimport { signal, WritableSignal } from '@angular/core';\n\nimport { Observable, Subject, take } from 'rxjs';\n\n/**\n * Хэндл к программно открытой модалке (через `RtDialogService.open()`).\n *\n * Контент-компонент инжектит `RtDialogRef` и закрывает модалку через `.close(result?)`.\n * Родитель, открывший модалку, ждёт результата через `.afterClosed()`.\n *\n * Слой, снятый без `close()` — переходом по адресу или уничтожением хозяина, — тоже завершает\n * `afterClosed()`: подписчик получает `undefined`. Иначе он ждал бы ответа, которого не будет.\n *\n * Generic `<T>` — тип результата `close(result)`. Дефолт `unknown` — если результат\n * не нужен, оставляй generic пустым.\n *\n * @example\n * \\`\\`\\`ts\n * // в контент-компоненте\n * private readonly dialogRef = inject(RtDialogRef);\n * close(): void { this.dialogRef.close({ confirmed: true }); }\n *\n * // в родителе\n * dialogService.open(MyDialogComponent).afterClosed().subscribe((result) => {...});\n * \\`\\`\\`\n */\nexport class RtDialogRef<T = unknown> {\n /**\n * Runtime-флаг, блокирующий close() через ESC / backdrop click.\n *\n * Default `false`. Включай (`dialogRef.disableClose.set(true)`) на\n * время in-flight submit'а, чтобы юзер не потерял введённые в форму\n * данные на случайном ESC. После next/error subscribe ставь обратно\n * в `false`. Не влияет на программный `close(result)` — он всегда\n * закрывает overlay.\n *\n * Статические config-флаги `closeOnEscape` / `closeOnBackdropClick`\n * (см. `IRtDialogConfig`) определяют, подписан ли вообще handler на\n * соответствующее событие; `disableClose` — это runtime-override,\n * который гейтит dispatch внутри уже-подписанного handler'а.\n */\n public readonly disableClose: WritableSignal<boolean> = signal(false);\n\n readonly #overlayRef: OverlayRef;\n readonly #afterClosedSource: Subject<T | undefined> = new Subject<T | undefined>();\n\n #isClosed: boolean = false;\n\n constructor(overlayRef: OverlayRef) {\n this.#overlayRef = overlayRef;\n this.#overlayRef\n .detachments()\n .pipe(take(1))\n .subscribe((): void => this.#finish(undefined));\n }\n\n /** Закрывает overlay; опционально передаёт результат подписчикам `afterClosed()`. */\n public close(result?: T): void {\n if (this.#isClosed) {\n return;\n }\n // Флаг до dispose: снятие слоя само отзовётся в detachments(), а результат отдаёт close().\n this.#isClosed = true;\n this.#overlayRef.dispose();\n this.#afterClosedSource.next(result);\n this.#afterClosedSource.complete();\n }\n\n /** Эмиттит один раз — результат `close(result)` или `undefined` при снятом слое — и завершается. */\n public afterClosed(): Observable<T | undefined> {\n return this.#afterClosedSource.asObservable();\n }\n\n #finish(result: T | undefined): void {\n if (this.#isClosed) {\n return;\n }\n this.#isClosed = true;\n this.#afterClosedSource.next(result);\n this.#afterClosedSource.complete();\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Injection token для передачи данных в модалку, открытую через `RtDialogService.open()`.\n *\n * Пользовательский компонент-контент модалки инжектит токен и получает данные,\n * переданные в `DialogConfig.data`. Тип значения задаётся generic'ом — `inject(RT_DIALOG_DATA)`\n * вернёт `unknown`, прокастуй через `inject(RT_DIALOG_DATA) as MyDataType` ИЛИ\n * объяви токен с конкретным generic'ом в feature-либе.\n *\n * @example\n * \\`\\`\\`ts\n * @Component({...})\n * export class WelcomeModalComponent {\n * readonly data = inject(RT_DIALOG_DATA) as { userName: string };\n * }\n *\n * // parent\n * dialogService.open(WelcomeModalComponent, { data: { userName: \"Иван\" } });\n * \\`\\`\\`\n */\nexport const RT_DIALOG_DATA: InjectionToken<unknown> = new InjectionToken<unknown>('RT_DIALOG_DATA');\n","import { FocusTrap, FocusTrapFactory } from '@angular/cdk/a11y';\nimport { ComponentType, Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport { afterNextRender, inject, Injectable, Injector, Signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { EMPTY, map, merge, mergeMap, Observable, Subject, take, takeUntil } from 'rxjs';\n\nimport { carryThemeScopeOfFocus, materialPresetClassesOfFocus } from '@rt-tools/ui-kit-v2/core';\nimport { RtDialogRef } from './rt-dialog-ref';\nimport { RT_DIALOG_DATA } from './rt-dialog.tokens';\n\n/**\n * Конфигурация открытия модалки через `RtDialogService.open()`.\n */\nexport interface IRtDialogConfig<TData = unknown> {\n /** Данные, доступные внутри модалки через `inject(RT_DIALOG_DATA)`. */\n data?: TData;\n\n /** Дополнительный CSS-класс для backdrop (поверх стандартного `rt-dialog-backdrop`). */\n backdropClass?: string | string[];\n\n /** Дополнительный CSS-класс для panel-обёртки overlay (поверх `rt-dialog-overlay`). */\n panelClass?: string | string[];\n\n /** Закрывать модалку по клику на backdrop. По дефолту `true`. */\n closeOnBackdropClick?: boolean;\n\n /** Закрывать модалку по ESC. По дефолту `true`. */\n closeOnEscape?: boolean;\n\n /** Держать Tab внутри модалки, пока она открыта. По дефолту `false` — как было. */\n trapFocus?: boolean;\n\n /** После закрытия вернуть фокус туда, где он стоял при открытии. По дефолту `false`. */\n restoreFocus?: boolean;\n\n /**\n * Куда поставить фокус при открытии: `'dialog'` — на рамку окна, `'first-tabbable'` — на первый\n * элемент, до которого доходит Tab. По дефолту `false` — фокус не трогается.\n */\n autoFocus?: TRtDialogAutoFocus;\n}\n\n/** Куда диалог ставит фокус при открытии; `false` — никуда. */\nexport type TRtDialogAutoFocus = 'dialog' | 'first-tabbable' | false;\n\n/**\n * Фокус одного открытия: ловушка ставится после того, как содержимое прикреплено, а вернуть\n * фокус надо при уходе оверлея, поэтому поля пишутся по ходу открытия.\n */\ninterface IRtDialogFocusState {\n trap: FocusTrap | null;\n restoreTo: HTMLElement | null;\n}\n\n/**\n * Контекст одного открытия модалки — payload для per-open close-подписок в конструкторном\n * стриме. `dialogRef` сужен до используемых handler'ами членов (`RtDialogRef<T>` инвариантен\n * по `T`, целиком в generic-agnostic контекст не влезает).\n */\ninterface IRtDialogOpenContext {\n overlayRef: OverlayRef;\n dialogRef: {\n disableClose: Signal<boolean>;\n close: () => void;\n };\n closeOnBackdropClick: boolean;\n closeOnEscape: boolean;\n focus: IRtDialogFocusState;\n}\n\n/**\n * Программный API для открытия модалок поверх CDK Overlay.\n *\n * Устройство сервиса:\n * - `Overlay.position().global().centerHorizontally().centerVertically()` — центрирование.\n * - `scrollStrategies.block()` — фиксирует background-scroll.\n * - `hasBackdrop: true` + кастомный класс — затемнение.\n * - `ComponentPortal` + custom `Injector` подкидывает `RtDialogRef` + `RT_DIALOG_DATA` в DI\n * контент-компонента.\n *\n * Альтернатива: legacy inline `<rt-dialog [visible]>` форма продолжает работать через\n * native `<dialog>.showModal()`. Новые экраны — на программный API.\n *\n * @example\n * \\`\\`\\`ts\n * // открытие\n * private readonly dialogService = inject(RtDialogService);\n *\n * openConfirm(): void {\n * const ref = this.dialogService.open<ConfirmDialogComponent, { question: string }, boolean>(\n * ConfirmDialogComponent,\n * { data: { question: \"Удалить?\" } }\n * );\n * ref.afterClosed().subscribe((confirmed) => {\n * if (confirmed) this.delete();\n * });\n * }\n *\n * // контент-компонент\n * @Component({\n * selector: \"rt-confirm-dialog\",\n * template: \\`\n * <rt-dialog size=\"sm\">\n * <rt-dialog-header [title]=\"data.question\" />\n * <div>Действие необратимо.</div>\n * <rt-dialog-footer>\n * <button rtButton (click)=\"close(false)\">Отмена</button>\n * <button rtButton theme=\"danger\" (click)=\"close(true)\">Удалить</button>\n * </rt-dialog-footer>\n * </rt-dialog>\n * \\`,\n * })\n * export class ConfirmDialogComponent {\n * readonly data = inject(RT_DIALOG_DATA) as { question: string };\n * readonly #ref = inject(RtDialogRef<boolean>);\n * close(result: boolean): void { this.#ref.close(result); }\n * }\n * \\`\\`\\`\n */\n@Injectable({ providedIn: 'root' })\nexport class RtDialogService {\n readonly #overlay: Overlay = inject(Overlay);\n readonly #injector: Injector = inject(Injector);\n readonly #document: Document = inject(DOCUMENT);\n readonly #focusTrapFactory: FocusTrapFactory = inject(FocusTrapFactory);\n\n readonly #openSource: Subject<IRtDialogOpenContext> = new Subject<IRtDialogOpenContext>();\n\n constructor() {\n // Per-open close-подписки (backdrop / ESC) живут в одном постоянном\n // конструкторном стриме: open() эмитит контекст открытия, mergeMap\n // подписывает event-стримы конкретного OverlayRef. `detachments()`\n // терминирует внутренний поток при overlay.dispose() (дёргается из\n // RtDialogRef.close()). mergeMap, а не switchMap — одновременно может\n // быть открыто несколько модалок (стек).\n //\n // Внутри обоих handler'ов — runtime-guard через `dialogRef.disableClose()`:\n // если контент-компонент выставил `disableClose.set(true)` (например, на\n // время in-flight submit'а), ESC / backdrop НЕ закрывают overlay.\n // Программный `dialogRef.close(result)` гейтом не задет — он всегда работает.\n this.#openSource\n .pipe(\n mergeMap((openContext: IRtDialogOpenContext): Observable<() => void> => {\n const backdropClose$: Observable<() => void> = openContext.closeOnBackdropClick\n ? openContext.overlayRef.backdropClick().pipe(\n map((): (() => void) => (): void => {\n if (openContext.dialogRef.disableClose()) {\n return;\n }\n openContext.dialogRef.close();\n })\n )\n : EMPTY;\n const escapeClose$: Observable<() => void> = openContext.closeOnEscape\n ? openContext.overlayRef.keydownEvents().pipe(\n map((event: KeyboardEvent): (() => void) => (): void => {\n if (event.key !== 'Escape') {\n return;\n }\n event.preventDefault();\n if (openContext.dialogRef.disableClose()) {\n return;\n }\n openContext.dialogRef.close();\n })\n )\n : EMPTY;\n // Уход оверлея снимает ловушку фокуса и возвращает фокус. Отдельно от закрывающих\n // потоков: те обрываются тем же уходом и до него не доживают.\n const releaseFocus$: Observable<() => void> = openContext.overlayRef.detachments().pipe(\n take(1),\n map((): (() => void) => (): void => this.#releaseFocus(openContext.focus))\n );\n return merge(merge(backdropClose$, escapeClose$).pipe(takeUntil(openContext.overlayRef.detachments())), releaseFocus$);\n }),\n takeUntilDestroyed()\n )\n .subscribe((handleCloseIntent: () => void): void => handleCloseIntent());\n }\n\n public open<TComponent, TData = unknown, TResult = unknown>(\n component: ComponentType<TComponent>,\n config?: IRtDialogConfig<TData>\n ): RtDialogRef<TResult> {\n const overlayRef: OverlayRef = this.#overlay.create({\n positionStrategy: this.#overlay.position().global().centerHorizontally().centerVertically(),\n scrollStrategy: this.#overlay.scrollStrategies.block(),\n hasBackdrop: true,\n backdropClass: config?.backdropClass ?? 'rt-dialog-backdrop',\n panelClass: [config?.panelClass ?? 'rt-dialog-overlay', materialPresetClassesOfFocus(this.#document)].flat(),\n disposeOnNavigation: true,\n });\n // До attach: содержимое диалога может забрать фокус, и кусок темы у кнопки будет потерян.\n carryThemeScopeOfFocus(overlayRef.overlayElement, this.#document);\n\n const dialogRef: RtDialogRef<TResult> = new RtDialogRef<TResult>(overlayRef);\n const focus: IRtDialogFocusState = {\n trap: null,\n restoreTo: config?.restoreFocus === true ? this.#focusedElement() : null,\n };\n\n // Сами close-подписки объявлены один раз в конструкторе — здесь только\n // эмит контекста открытия (см. #openSource-стрим).\n this.#openSource.next({\n overlayRef,\n dialogRef,\n focus,\n closeOnBackdropClick: config?.closeOnBackdropClick !== false,\n closeOnEscape: config?.closeOnEscape !== false,\n });\n\n const injector: Injector = Injector.create({\n parent: this.#injector,\n providers: [\n { provide: RtDialogRef, useValue: dialogRef },\n { provide: RT_DIALOG_DATA, useValue: config?.data ?? null },\n ],\n });\n\n const portal: ComponentPortal<TComponent> = new ComponentPortal<TComponent>(component, null, injector);\n overlayRef.attach(portal);\n this.#holdFocus(overlayRef.overlayElement, focus, config?.trapFocus === true, config?.autoFocus ?? false);\n\n return dialogRef;\n }\n\n /**\n * Ловушка и первый фокус ставятся после отрисовки содержимого: до неё в оверлее нет ни рамки,\n * ни кнопок, и ловушке не на что опереться.\n */\n #holdFocus(pane: HTMLElement, focus: IRtDialogFocusState, trapFocus: boolean, autoFocus: TRtDialogAutoFocus): void {\n if (!trapFocus && autoFocus === false) {\n return;\n }\n afterNextRender(\n (): void => {\n if (trapFocus) {\n focus.trap = this.#focusTrapFactory.create(pane);\n }\n switch (autoFocus) {\n case 'dialog':\n pane.querySelector<HTMLElement>('[role=\"dialog\"]')?.focus();\n break;\n case 'first-tabbable':\n this.#focusFirstTabbable(pane, focus.trap);\n break;\n default:\n break;\n }\n },\n { injector: this.#injector }\n );\n }\n\n /** Без ловушки первый элемент ищет временная ловушка: обход по Tab у неё уже есть. */\n #focusFirstTabbable(pane: HTMLElement, trap: FocusTrap | null): void {\n if (trap) {\n trap.focusFirstTabbableElement();\n return;\n }\n const lookup: FocusTrap = this.#focusTrapFactory.create(pane);\n lookup.focusFirstTabbableElement();\n lookup.destroy();\n }\n\n #releaseFocus(focus: IRtDialogFocusState): void {\n focus.trap?.destroy();\n focus.trap = null;\n if (focus.restoreTo?.isConnected) {\n focus.restoreTo.focus();\n }\n }\n\n #focusedElement(): HTMLElement | null {\n const active: Element | null = this.#document.activeElement;\n return active instanceof HTMLElement && active !== this.#document.body ? active : null;\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n inject,\n input,\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtDialogRef } from '../rt-dialog-ref';\n\nconst BEM_BLOCK: string = 'rt-dialog-header';\n\n/**\n * Заголовок модалки для композиции внутри `<rt-dialog>`.\n *\n * Если компонент рендерится внутри overlay-портала, открытого через `RtDialogService.open()`,\n * кнопка закрытия дёргает `inject(RtDialogRef).close()` автоматически. В legacy-режиме\n * (внутри inline `<rt-dialog [visible]>`) `RtDialogRef` не зарегистрирован — клик\n * по close-кнопке эмитит output `(closeAction)`, который должен повесить родитель.\n *\n * Перед заголовком — место для значка или другого элемента: узел с атрибутом\n * `rtDialogHeaderLead` проецируется туда. Пустое место ничего не занимает.\n *\n * `ViewEncapsulation.None` — для единообразия с rt-dialog (стили префиксованы `.rt-dialog-header`).\n *\n * @example\n * \\`\\`\\`html\n * <rt-dialog size=\"md\">\n * <rt-dialog-header title=\"Создание записи\" />\n * <div>...форма...</div>\n * <rt-dialog-footer>\n * <button rtButton (click)=\"cancel()\">Отмена</button>\n * <button rtButton theme=\"primary\" (click)=\"save()\">Сохранить</button>\n * </rt-dialog-footer>\n * </rt-dialog>\n * \\`\\`\\`\n */\n@Component({\n selector: 'rt-dialog-header',\n templateUrl: './rt-dialog-header.component.html',\n styleUrl: './rt-dialog-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtDialogHeaderComponent {\n readonly #dialogRef: RtDialogRef | null = inject(RtDialogRef, { optional: true });\n\n /** Текст заголовка — рендерится в `<h2>`. */\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n public readonly title: InputSignal<string> = input.required<string>();\n\n /** Показывать кнопку закрытия в углу заголовка. Дефолт `true`. */\n public readonly closable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n protected onClose(): void {\n // Programmatic mode — закрываем через DialogRef.\n this.#dialogRef?.close();\n }\n}\n","<header rtBlock=\"rt-dialog-header\" qa-dataid=\"dialog-header\">\n <span rtElem=\"lead\" qa-dataid=\"dialog-header-lead\"><ng-content select=\"[rtDialogHeaderLead]\" /></span>\n <h2 rtElem=\"title\" qa-dataid=\"dialog-title\">{{ title() }}</h2>\n @if (closable()) {\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"dialog-close\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n [ariaLabel]=\"t().uiClose\"\n (clicked)=\"onClose()\" />\n }\n</header>\n","import { ChangeDetectionStrategy, Component, input, InputSignal, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ModDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-dialog-footer';\n\n/** Как подвал раскладывает содержимое: к началу, по центру, к концу или по обоим краям. */\nexport type TRtDialogFooterAlign = 'start' | 'center' | 'end' | 'between';\n\n/**\n * Footer-слот для композиции внутри `<rt-dialog>`. Принимает любой проектированный\n * контент (action-кнопки, статусные сообщения и т.п.), оборачивает в footer с\n * top-border и flex-раскладкой; вход `align` прижимает содержимое к концу (по умолчанию),\n * к началу, к центру или разводит по краям (`between`).\n *\n * `ViewEncapsulation.None` — для единообразия с rt-dialog.\n *\n * @example\n * \\`\\`\\`html\n * <rt-dialog-footer>\n * <button rtButton (click)=\"cancel()\">Отмена</button>\n * <button rtButton theme=\"primary\" (click)=\"save()\">Сохранить</button>\n * </rt-dialog-footer>\n * \\`\\`\\`\n */\n@Component({\n selector: 'rt-dialog-footer',\n templateUrl: './rt-dialog-footer.component.html',\n styleUrl: './rt-dialog-footer.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [BlockDirective, ModDirective],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtDialogFooterComponent {\n public readonly align: InputSignal<TRtDialogFooterAlign> = input<TRtDialogFooterAlign>('end');\n}\n","<footer rtBlock=\"rt-dialog-footer\" qa-dataid=\"dialog-footer\" [rtMod]=\"{ align: align() }\">\n <ng-content />\n</footer>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-dialog-content';\n\n/**\n * Тело модалки для композиции внутри `<rt-dialog>` между шапкой и подвалом. Даёт отступ и\n * прокрутку: длинное содержимое прокручивается внутри тела, а шапка и подвал стоят на месте.\n * Отступ задаёт `--rt-dialog-content-padding`, потолок высоты — `--rt-dialog-content-max-height`.\n *\n * Часть необязательная: окно со своей обёрткой тела выглядит как прежде.\n *\n * @example\n * \\`\\`\\`html\n * <rt-dialog size=\"md\">\n * <rt-dialog-header title=\"Создание записи\" />\n * <rt-dialog-content>...форма...</rt-dialog-content>\n * <rt-dialog-footer>...</rt-dialog-footer>\n * </rt-dialog>\n * \\`\\`\\`\n */\n@Component({\n selector: 'rt-dialog-content',\n templateUrl: './rt-dialog-content.component.html',\n styleUrl: './rt-dialog-content.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [BlockDirective],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtDialogContentComponent {}\n","<div rtBlock=\"rt-dialog-content\" qa-dataid=\"dialog-content\">\n <ng-content />\n</div>\n"],"mappings":"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"}
@@ -1,183 +1,200 @@
1
- import * as i0 from '@angular/core';
2
- import { inject, DestroyRef, viewChild, afterNextRender, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import { WINDOW, BlockDirective, ElemDirective } from '@rt-tools/core';
4
-
5
- /** Сторона клетки сетки в пикселях. */
6
- const DOT_FIELD_CELL = 10;
7
- /** Сторона точки в центре клетки. */
8
- const DOT_FIELD_DOT = 3;
9
- /** Кадр рисуется раз в столько миллисекунд: ступенчатое движение — часть облика. */
10
- const DOT_FIELD_FRAME_MS = 90;
11
- /** На столько сдвигается время шума за кадр. */
12
- const DOT_FIELD_TIME_STEP = 0.035;
13
- const NOISE_SCALE = 0.075;
14
- const THRESHOLD = 0.64;
15
- const DITHER_SPREAD = 0.3;
16
- const BAYER_4X4 = [0, 8, 2, 10, 12, 4, 14, 6, 3, 11, 1, 9, 15, 7, 13, 5].map((value) => value / 16);
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, DestroyRef, ViewEncapsulation, afterNextRender, inject, viewChild } from "@angular/core";
3
+ import { BlockDirective, ElemDirective, WINDOW } from "@rt-tools/core";
4
+ const DOT_FIELD_TIME_STEP = .035;
5
+ const NOISE_SCALE = .075;
6
+ const THRESHOLD = .64;
7
+ const DITHER_SPREAD = .3;
8
+ const BAYER_4X4 = [
9
+ 0,
10
+ 8,
11
+ 2,
12
+ 10,
13
+ 12,
14
+ 4,
15
+ 14,
16
+ 6,
17
+ 3,
18
+ 11,
19
+ 1,
20
+ 9,
21
+ 15,
22
+ 7,
23
+ 13,
24
+ 5
25
+ ].map((value) => value / 16);
17
26
  function hash(x, y) {
18
- const value = Math.sin(x * 127.1 + y * 311.7) * 43758.5453;
19
- return value - Math.floor(value);
27
+ const value = Math.sin(x * 127.1 + y * 311.7) * 43758.5453;
28
+ return value - Math.floor(value);
20
29
  }
21
30
  function fade(value) {
22
- return value * value * (3 - 2 * value);
31
+ return value * value * (3 - 2 * value);
23
32
  }
24
33
  function lerp(from, to, amount) {
25
- return from + (to - from) * amount;
34
+ return from + (to - from) * amount;
26
35
  }
27
36
  function smoothstep(edge0, edge1, value) {
28
- const amount = Math.min(1, Math.max(0, (value - edge0) / (edge1 - edge0)));
29
- return amount * amount * (3 - 2 * amount);
37
+ const amount = Math.min(1, Math.max(0, (value - edge0) / (edge1 - edge0)));
38
+ return amount * amount * (3 - 2 * amount);
30
39
  }
31
- /** Шум значений: гладкая случайная поверхность от 0 до 1. */
32
40
  function noise(x, y) {
33
- const x0 = Math.floor(x);
34
- const y0 = Math.floor(y);
35
- const fx = fade(x - x0);
36
- const fy = fade(y - y0);
37
- const top = lerp(hash(x0, y0), hash(x0 + 1, y0), fx);
38
- const bottom = lerp(hash(x0, y0 + 1), hash(x0 + 1, y0 + 1), fx);
39
- return lerp(top, bottom, fy);
41
+ const x0 = Math.floor(x);
42
+ const y0 = Math.floor(y);
43
+ const fx = fade(x - x0);
44
+ const fy = fade(y - y0);
45
+ return lerp(lerp(hash(x0, y0), hash(x0 + 1, y0), fx), lerp(hash(x0, y0 + 1), hash(x0 + 1, y0 + 1), fx), fy);
40
46
  }
41
- /**
42
- * Плотность поля в клетке: два слоя шума, сдвинутые временем, и поляна в центре, где точки редеют.
43
- *
44
- * @returns Число от 0 до 1.
45
- */
46
47
  function dotDensity(column, row, columns, rows, time) {
47
- const x = column * NOISE_SCALE;
48
- const y = row * NOISE_SCALE;
49
- const broad = noise(x + time * 0.6, y + time * 0.25);
50
- const detail = noise(x * 2.3 - time * 0.4, y * 2.3 + time * 0.35);
51
- const field = broad * 0.72 + detail * 0.28;
52
- const dx = column / columns - 0.5;
53
- const dy = row / rows - 0.5;
54
- const clearing = smoothstep(0.12, 0.42, Math.sqrt(dx * dx + dy * dy));
55
- return field * (0.6 + 0.4 * clearing);
48
+ const x = column * NOISE_SCALE;
49
+ const y = row * NOISE_SCALE;
50
+ const broad = noise(x + time * .6, y + time * .25);
51
+ const detail = noise(x * 2.3 - time * .4, y * 2.3 + time * .35);
52
+ const field = broad * .72 + detail * .28;
53
+ const dx = column / columns - .5;
54
+ const dy = row / rows - .5;
55
+ return field * (.6 + .4 * smoothstep(.12, .42, Math.sqrt(dx * dx + dy * dy)));
56
56
  }
57
- /**
58
- * Горит ли клетка: плотность сравнивается с порогом, который матрица Байера 4x4 сдвигает по
59
- * клеткам. Так края облаков выходят рваными, а не гладкими.
60
- */
61
57
  function isDotLit(density, column, row) {
62
- const dither = BAYER_4X4[(row % 4) * 4 + (column % 4)];
63
- return density > THRESHOLD + (dither - 0.5) * DITHER_SPREAD;
64
- }
65
-
66
- /**
67
- * Рисует поле точек на canvas и ведёт его кадры. Окно приходит параметром: класс создаёт
68
- * компонент, а у этого файла нет внедрения зависимостей.
69
- */
70
- class RtDotFieldPainter {
71
- #canvas;
72
- #window;
73
- #context;
74
- #frameId = null;
75
- #lastFrameAt = 0;
76
- #time = 0;
77
- #width = 0;
78
- #height = 0;
79
- constructor(canvas, windowRef) {
80
- this.#canvas = canvas;
81
- this.#window = windowRef;
82
- this.#context = canvas.getContext('2d');
83
- }
84
- /** Без 2D-контекста ничего не рисуется; при просьбе о меньшем движении — один кадр. */
85
- start() {
86
- if (!this.#context) {
87
- return;
88
- }
89
- if (this.#window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
90
- this.#draw(this.#context);
91
- return;
92
- }
93
- this.#frameId = this.#window.requestAnimationFrame((now) => this.#tick(now));
94
- }
95
- stop() {
96
- if (this.#frameId === null) {
97
- return;
98
- }
99
- this.#window.cancelAnimationFrame(this.#frameId);
100
- this.#frameId = null;
101
- }
102
- #tick(now) {
103
- if (this.#context && now - this.#lastFrameAt >= DOT_FIELD_FRAME_MS) {
104
- this.#lastFrameAt = now;
105
- this.#time += DOT_FIELD_TIME_STEP;
106
- this.#draw(this.#context);
107
- }
108
- this.#frameId = this.#window.requestAnimationFrame((next) => this.#tick(next));
109
- }
110
- #draw(context) {
111
- this.#resize(context);
112
- context.clearRect(0, 0, this.#width, this.#height);
113
- // Цвет — вычисленный `color` поля: тема меняет назначение, а canvas принимает только готовый цвет.
114
- context.fillStyle = this.#window.getComputedStyle(this.#canvas).color;
115
- const columns = Math.ceil(this.#width / DOT_FIELD_CELL);
116
- const rows = Math.ceil(this.#height / DOT_FIELD_CELL);
117
- const offset = (DOT_FIELD_CELL - DOT_FIELD_DOT) / 2;
118
- for (let row = 0; row < rows; row++) {
119
- for (let column = 0; column < columns; column++) {
120
- if (isDotLit(dotDensity(column, row, columns, rows, this.#time), column, row)) {
121
- context.fillRect(column * DOT_FIELD_CELL + offset, row * DOT_FIELD_CELL + offset, DOT_FIELD_DOT, DOT_FIELD_DOT);
122
- }
123
- }
124
- }
125
- }
126
- /** Холст следует размеру родителя и плотности точек экрана. */
127
- #resize(context) {
128
- const width = this.#canvas.clientWidth;
129
- const height = this.#canvas.clientHeight;
130
- if (width === this.#width && height === this.#height) {
131
- return;
132
- }
133
- const ratio = this.#window.devicePixelRatio || 1;
134
- this.#width = width;
135
- this.#height = height;
136
- this.#canvas.width = Math.round(width * ratio);
137
- this.#canvas.height = Math.round(height * ratio);
138
- context.setTransform(ratio, 0, 0, ratio, 0, 0);
139
- }
140
- }
141
-
142
- const BEM_BLOCK = 'rt-dot-field';
143
- /**
144
- * Фон из квадратных точек, которые медленно плывут облаками. Заполняет позиционированного
145
- * родителя и стоит под его содержимым; в центре точки редеют. Цвет — CSS-свойство `color` хоста.
146
- */
147
- class RtDotFieldComponent {
148
- #window;
149
- #destroyRef;
150
- constructor() {
151
- this.#window = inject(WINDOW);
152
- this.#destroyRef = inject(DestroyRef);
153
- /** `viewChild` не принимает поле с решёткой. */
154
- this.canvas = viewChild.required('canvas', /* @ts-ignore */
155
- ...(ngDevMode ? [{ debugName: "canvas" }] : /* istanbul ignore next */ []));
156
- afterNextRender(() => {
157
- const painter = new RtDotFieldPainter(this.canvas().nativeElement, this.#window);
158
- painter.start();
159
- this.#destroyRef.onDestroy(() => painter.stop());
160
- });
161
- }
162
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDotFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
163
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.6", type: RtDotFieldComponent, isStandalone: true, selector: "rt-dot-field", host: { classAttribute: "rt-dot-field" }, viewQueries: [{ propertyName: "canvas", first: true, predicate: ["canvas"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container rtBlock=\"rt-dot-field\">\n <canvas #canvas rtElem=\"canvas\" aria-hidden=\"true\" qa-dataid=\"rt-dot-field-canvas\"></canvas>\n</ng-container>\n", styles: ["@layer rt-kit.components{.rt-dot-field{--rt-dot-field-color: var(--rt-color-action-primary);--rt-dot-field-opacity: .85;position:absolute;z-index:var(--rt-z-base);display:block;color:var(--rt-dot-field-color);inset:0;opacity:var(--rt-dot-field-opacity);pointer-events:none}.rt-dot-field__canvas{display:block;width:100%;height:100%}}\n"], dependencies: [{ kind: "directive", type:
164
- // standalone components / directives
165
- BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
58
+ const dither = BAYER_4X4[row % 4 * 4 + column % 4];
59
+ return density > THRESHOLD + (dither - .5) * DITHER_SPREAD;
166
60
  }
167
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDotFieldComponent, decorators: [{
168
- type: Component,
169
- args: [{ selector: 'rt-dot-field', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
170
- // standalone components / directives
171
- BlockDirective,
172
- ElemDirective,
173
- ], host: {
174
- class: BEM_BLOCK,
175
- }, template: "<ng-container rtBlock=\"rt-dot-field\">\n <canvas #canvas rtElem=\"canvas\" aria-hidden=\"true\" qa-dataid=\"rt-dot-field-canvas\"></canvas>\n</ng-container>\n", styles: ["@layer rt-kit.components{.rt-dot-field{--rt-dot-field-color: var(--rt-color-action-primary);--rt-dot-field-opacity: .85;position:absolute;z-index:var(--rt-z-base);display:block;color:var(--rt-dot-field-color);inset:0;opacity:var(--rt-dot-field-opacity);pointer-events:none}.rt-dot-field__canvas{display:block;width:100%;height:100%}}\n"] }]
176
- }], ctorParameters: () => [], propDecorators: { canvas: [{ type: i0.ViewChild, args: ['canvas', { isSignal: true }] }] } });
177
-
178
- /**
179
- * Generated bundle index. Do not edit.
180
- */
181
-
61
+ var RtDotFieldPainter = class {
62
+ #canvas;
63
+ #window;
64
+ #context;
65
+ #frameId = null;
66
+ #lastFrameAt = 0;
67
+ #time = 0;
68
+ #width = 0;
69
+ #height = 0;
70
+ constructor(canvas, windowRef) {
71
+ this.#canvas = canvas;
72
+ this.#window = windowRef;
73
+ this.#context = canvas.getContext("2d");
74
+ }
75
+ start() {
76
+ if (!this.#context) return;
77
+ if (this.#window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
78
+ this.#draw(this.#context);
79
+ return;
80
+ }
81
+ this.#frameId = this.#window.requestAnimationFrame((now) => this.#tick(now));
82
+ }
83
+ stop() {
84
+ if (this.#frameId === null) return;
85
+ this.#window.cancelAnimationFrame(this.#frameId);
86
+ this.#frameId = null;
87
+ }
88
+ #tick(now) {
89
+ if (this.#context && now - this.#lastFrameAt >= 90) {
90
+ this.#lastFrameAt = now;
91
+ this.#time += DOT_FIELD_TIME_STEP;
92
+ this.#draw(this.#context);
93
+ }
94
+ this.#frameId = this.#window.requestAnimationFrame((next) => this.#tick(next));
95
+ }
96
+ #draw(context) {
97
+ this.#resize(context);
98
+ context.clearRect(0, 0, this.#width, this.#height);
99
+ context.fillStyle = this.#window.getComputedStyle(this.#canvas).color;
100
+ const columns = Math.ceil(this.#width / 10);
101
+ const rows = Math.ceil(this.#height / 10);
102
+ const offset = 7 / 2;
103
+ for (let row = 0; row < rows; row++) for (let column = 0; column < columns; column++) if (isDotLit(dotDensity(column, row, columns, rows, this.#time), column, row)) context.fillRect(column * 10 + offset, row * 10 + offset, 3, 3);
104
+ }
105
+ #resize(context) {
106
+ const width = this.#canvas.clientWidth;
107
+ const height = this.#canvas.clientHeight;
108
+ if (width === this.#width && height === this.#height) return;
109
+ const ratio = this.#window.devicePixelRatio || 1;
110
+ this.#width = width;
111
+ this.#height = height;
112
+ this.#canvas.width = Math.round(width * ratio);
113
+ this.#canvas.height = Math.round(height * ratio);
114
+ context.setTransform(ratio, 0, 0, ratio, 0, 0);
115
+ }
116
+ };
117
+ const BEM_BLOCK = "rt-dot-field";
118
+ var RtDotFieldComponent = class RtDotFieldComponent {
119
+ #window;
120
+ #destroyRef;
121
+ constructor() {
122
+ this.#window = inject(WINDOW);
123
+ this.#destroyRef = inject(DestroyRef);
124
+ this.canvas = viewChild.required("canvas", ...ngDevMode ? [{ debugName: "canvas" }] : /* istanbul ignore next */ []);
125
+ afterNextRender(() => {
126
+ const painter = new RtDotFieldPainter(this.canvas().nativeElement, this.#window);
127
+ painter.start();
128
+ this.#destroyRef.onDestroy(() => painter.stop());
129
+ });
130
+ }
131
+ static {
132
+ this.ɵfac = i0.ɵɵngDeclareFactory({
133
+ minVersion: "12.0.0",
134
+ version: "22.2.2",
135
+ ngImport: i0,
136
+ type: RtDotFieldComponent,
137
+ deps: [],
138
+ target: i0.ɵɵFactoryTarget.Component
139
+ });
140
+ }
141
+ static {
142
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
143
+ minVersion: "17.2.0",
144
+ version: "22.2.2",
145
+ type: RtDotFieldComponent,
146
+ isStandalone: true,
147
+ selector: "rt-dot-field",
148
+ host: { classAttribute: "rt-dot-field" },
149
+ viewQueries: [{
150
+ propertyName: "canvas",
151
+ first: true,
152
+ predicate: ["canvas"],
153
+ descendants: true,
154
+ isSignal: true
155
+ }],
156
+ ngImport: i0,
157
+ template: "<ng-container rtBlock=\"rt-dot-field\">\n <canvas #canvas rtElem=\"canvas\" aria-hidden=\"true\" qa-dataid=\"rt-dot-field-canvas\"></canvas>\n</ng-container>\n",
158
+ styles: ["@layer rt-kit.components{.rt-dot-field{--rt-dot-field-color: var(--rt-color-action-primary);--rt-dot-field-opacity: .85;position:absolute;z-index:var(--rt-z-base);display:block;color:var(--rt-dot-field-color);inset:0;opacity:var(--rt-dot-field-opacity);pointer-events:none}.rt-dot-field__canvas{display:block;width:100%;height:100%}}\n"],
159
+ dependencies: [{
160
+ kind: "directive",
161
+ type: BlockDirective,
162
+ selector: "[rtBlock]",
163
+ inputs: ["rtMod"]
164
+ }, {
165
+ kind: "directive",
166
+ type: ElemDirective,
167
+ selector: "[rtElem]",
168
+ inputs: ["rtMod"]
169
+ }],
170
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
171
+ encapsulation: i0.ViewEncapsulation.None
172
+ });
173
+ }
174
+ };
175
+ i0.ɵɵngDeclareClassMetadata({
176
+ minVersion: "12.0.0",
177
+ version: "22.2.2",
178
+ ngImport: i0,
179
+ type: RtDotFieldComponent,
180
+ decorators: [{
181
+ type: Component,
182
+ args: [{
183
+ selector: "rt-dot-field",
184
+ changeDetection: ChangeDetectionStrategy.OnPush,
185
+ encapsulation: ViewEncapsulation.None,
186
+ imports: [BlockDirective, ElemDirective],
187
+ host: { class: BEM_BLOCK },
188
+ template: "<ng-container rtBlock=\"rt-dot-field\">\n <canvas #canvas rtElem=\"canvas\" aria-hidden=\"true\" qa-dataid=\"rt-dot-field-canvas\"></canvas>\n</ng-container>\n",
189
+ styles: ["@layer rt-kit.components{.rt-dot-field{--rt-dot-field-color: var(--rt-color-action-primary);--rt-dot-field-opacity: .85;position:absolute;z-index:var(--rt-z-base);display:block;color:var(--rt-dot-field-color);inset:0;opacity:var(--rt-dot-field-opacity);pointer-events:none}.rt-dot-field__canvas{display:block;width:100%;height:100%}}\n"]
190
+ }]
191
+ }],
192
+ ctorParameters: () => [],
193
+ propDecorators: { canvas: [{
194
+ type: i0.ViewChild,
195
+ args: ["canvas", { isSignal: true }]
196
+ }] }
197
+ });
182
198
  export { RtDotFieldComponent };
183
- //# sourceMappingURL=rt-tools-ui-kit-v2-dot-field.mjs.map
199
+
200
+ //# sourceMappingURL=rt-tools-ui-kit-v2-dot-field.mjs.map