@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-tabs.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tab.directive.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs-control.directive.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs.component.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs.component.html","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tools-ui-kit-v2-tabs.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n Directive,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n TemplateRef,\n} from '@angular/core';\n\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { IRtTabs } from './rt-tabs.model';\n\n/**\n * Декларирует одну вкладку `<rt-tabs>`. Ставится на `<ng-template>`: контент\n * шаблона становится телом панели и рендерится только когда вкладка активна.\n *\n * Метаданные (label, icon, disabled, badge, invalid) — signal-inputs, поэтому\n * шапка вкладки реагирует на их изменение без ручной перерегистрации. Сам\n * список вкладок `rt-tabs` собирает через `contentChildren`.\n */\n@Directive({\n selector: '[rtTab]',\n})\nexport class RtTabDirective {\n readonly #t_uiTabInvalid: Signal<string> = rtKitLabel('uiTabInvalid');\n\n /** Шаблон тела панели — рендерится в области контента при активной вкладке. */\n public readonly templateRef: TemplateRef<unknown> = inject<TemplateRef<unknown>>(TemplateRef);\n\n /** Стабильный идентификатор вкладки (значение атрибута `rtTab`). */\n public readonly id: InputSignal<IRtTabs.Id> = input<IRtTabs.Id>('', { alias: 'rtTab' });\n\n /** Текстовый заголовок. Игнорируется, если задан `titleTemplate`. */\n public readonly label: InputSignal<string> = input<string>('');\n\n /** Кастомный шаблон заголовка — замещает `label`. */\n public readonly titleTemplate: InputSignal<TemplateRef<unknown> | null> = input<TemplateRef<unknown> | null>(null);\n\n /** Иконка слева от заголовка. */\n public readonly icon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Семантический цвет иконки заголовка. */\n public readonly iconColor: InputSignal<IRtTabs.TitleColor> = input<IRtTabs.TitleColor>('current');\n\n /** Значение бейджа справа от заголовка (число/строка). `null` — без бейджа. */\n public readonly badge: InputSignal<string | number | null> = input<string | number | null>(null);\n\n /**\n * Подсказка при наведении на бейдж. Подсказка самой кнопки занята неверной вкладкой,\n * поэтому у бейджа своя. Пусто — подсказки нет.\n */\n public readonly badgeTitle: InputSignal<string> = input<string>('');\n\n /**\n * Подпись бейджа для чтения с экрана: точка или число сами по себе не говорят, что значат.\n * Пусто — атрибут не ставится, и озвучивается значение бейджа как есть.\n */\n public readonly badgeAriaLabel: InputSignal<string> = input<string>('');\n\n /** Заблокированная вкладка: не выбирается и не получает фокус. */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Скрытая вкладка: не рендерится ни в шапке, ни в контенте. */\n public readonly hidden: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Вкладка с ошибками: подсвечивается danger-цветом. */\n public readonly invalid: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Подсказка для невалидной вкладки. Пусто — берётся переведённое умолчание. */\n public readonly invalidMessage: InputSignal<string> = input<string>('');\n\n /** Готовый текст подсказки: своя формулировка важнее умолчания. */\n public readonly invalidTitle: Signal<string> = computed((): string => this.invalidMessage() || this.#t_uiTabInvalid());\n}\n","import { Directive, inject, input, InputSignalWithTransform, TemplateRef } from '@angular/core';\n\nimport { IRtTabs } from './rt-tabs.model';\n\n/**\n * Декларирует header-контрол `<rt-tabs>` — произвольный шаблон (кнопка, фильтр),\n * который рендерится слева или справа от полосы вкладок. Ставится на\n * `<ng-template>`; `rt-tabs` собирает контролы через `contentChildren` и\n * раскладывает по сторонам согласно `side`.\n */\n@Directive({\n selector: '[rtTabsControl]',\n})\nexport class RtTabsControlDirective {\n /** Шаблон контрола, выводимый в header-слоте. */\n public readonly templateRef: TemplateRef<unknown> = inject<TemplateRef<unknown>>(TemplateRef);\n\n /**\n * Сторона размещения относительно полосы вкладок.\n *\n * Пустое значение приводится к правой стороне: `<ng-template rtTabsControl>` без значения\n * задаёт входу пустую строку, а не умолчание, и такой контрол не попадал ни в левый слот,\n * ни в правый — он пропадал из шапки вовсе.\n */\n public readonly side: InputSignalWithTransform<IRtTabs.ControlSide, IRtTabs.ControlSide | ''> = input<\n IRtTabs.ControlSide,\n IRtTabs.ControlSide | ''\n >('right', {\n alias: 'rtTabsControl',\n transform: (value: IRtTabs.ControlSide | ''): IRtTabs.ControlSide => (value === '' ? 'right' : value),\n });\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n DestroyRef,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { debounceTime, fromEvent } from 'rxjs';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { RtTabDirective } from './rt-tab.directive';\nimport { RtTabsControlDirective } from './rt-tabs-control.directive';\nimport { IRtTabs } from './rt-tabs.model';\n\n/** Шаг ручной прокрутки полосы вкладок за один тик удержания стрелки (px). */\nconst SCROLL_STEP: number = 12;\n\n/** Интервал тика прокрутки при зажатой стрелке (мс). */\nconst SCROLL_TICK_MS: number = 15;\n\n/** Дебаунс пересчёта видимости стрелок прокрутки на resize/scroll (мс). */\nconst REST_DEBOUNCE_MS: number = 50;\n\nconst BEM_BLOCK: string = 'rt-tabs';\n\ntype TScrollDirection = 'before' | 'after';\n\n/**\n * Полоса вкладок с проекцией контента. Вкладки декларируются через\n * `<ng-template rtTab=\"id\" label=\"…\">…</ng-template>` (см. {@link RtTabDirective}),\n * собираются `contentChildren` и рендерятся как header-кнопки + активная панель.\n * Опциональные header-контролы — через `[rtTabsControl]`.\n *\n * Компонент \"controlled-ish\": активная вкладка берётся из `activeId` (если\n * задан), иначе — из внутреннего выбора, иначе — первая доступная. Клик/клавиша\n * эмиттят `activeIdChange`; синхронизацию `activeId` оставляем потребителю.\n *\n * Горизонтальная полоса при переполнении прячет вкладки под скролл и показывает\n * стрелки-«хвосты» (`__rest`) с прокруткой по удержанию. Вертикальная ориентация\n * раскладывает вкладки в колонку без стрелок.\n *\n * Доступность: `role=\"tablist\"`/`role=\"tab\"`/`role=\"tabpanel\"`, `aria-selected`,\n * roving `tabindex`, навигация стрелками + Home/End.\n */\n@Component({\n selector: 'rt-tabs',\n templateUrl: './rt-tabs.component.html',\n styleUrl: './rt-tabs.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // angular\n NgTemplateOutlet,\n\n // standalone components / directives\n RtIconComponent,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-tabs--direction--horizontal]': \"direction() === 'horizontal'\",\n '[class.rt-tabs--direction--vertical]': \"direction() === 'vertical'\",\n },\n})\nexport class RtTabsComponent {\n /** `Window` через `DOCUMENT` (SSR-safe: `defaultView` может быть `null`). */\n readonly #win: Window | null = inject(DOCUMENT).defaultView;\n\n /** Все задекларированные вкладки (включая скрытые). */\n protected readonly tabs: Signal<readonly RtTabDirective[]> = contentChildren(RtTabDirective);\n\n /** Все header-контролы. */\n protected readonly controls: Signal<readonly RtTabsControlDirective[]> = contentChildren(RtTabsControlDirective);\n\n /** Видимые вкладки (без `hidden`). */\n protected readonly visibleTabs: Signal<readonly RtTabDirective[]> = computed((): readonly RtTabDirective[] =>\n this.tabs().filter((tab: RtTabDirective): boolean => !tab.hidden())\n );\n\n protected readonly leftControls: Signal<readonly RtTabsControlDirective[]> = computed((): readonly RtTabsControlDirective[] =>\n this.controls().filter((c: RtTabsControlDirective): boolean => c.side() === 'left')\n );\n\n protected readonly rightControls: Signal<readonly RtTabsControlDirective[]> = computed((): readonly RtTabsControlDirective[] =>\n this.controls().filter((c: RtTabsControlDirective): boolean => c.side() === 'right')\n );\n\n /**\n * Эффективный id активной вкладки. Приоритет: контролируемый `activeId` →\n * внутренний выбор → первая доступная. Кандидат валидируется по множеству\n * видимых незаблокированных вкладок, поэтому корректно реагирует на\n * асинхронную загрузку/смену набора вкладок.\n */\n protected readonly selectedId: Signal<IRtTabs.Id | null> = computed((): IRtTabs.Id | null => {\n const enabled: readonly RtTabDirective[] = this.visibleTabs().filter((tab: RtTabDirective): boolean => !tab.disabled());\n const candidate: IRtTabs.Id | null = this.activeId() ?? this.#internalId();\n const candidateValid: boolean = candidate !== null && enabled.some((tab: RtTabDirective): boolean => tab.id() === candidate);\n\n let result: IRtTabs.Id | null;\n if (candidateValid) {\n result = candidate;\n } else if (enabled.length) {\n result = enabled[0].id();\n } else {\n result = null;\n }\n\n return result;\n });\n\n /** Активная вкладка целиком (для рендера панели). */\n protected readonly activeTab: Signal<RtTabDirective | null> = computed(\n (): RtTabDirective | null => this.visibleTabs().find((tab: RtTabDirective): boolean => tab.id() === this.selectedId()) ?? null\n );\n\n /** Видны ли стрелки прокрутки слева/справа (только горизонтальная полоса). */\n protected readonly restBeforeVisible: WritableSignal<boolean> = signal(false);\n protected readonly restAfterVisible: WritableSignal<boolean> = signal(false);\n\n protected readonly tabListRef: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('tabList');\n\n /** Контролируемый активный id. `null` — компонент сам выбирает первую вкладку. */\n public readonly activeId: InputSignal<IRtTabs.Id | null> = input<IRtTabs.Id | null>(null);\n\n /** Ориентация полосы. */\n public readonly direction: InputSignal<IRtTabs.Direction> = input<IRtTabs.Direction>('horizontal');\n\n /** Растягивать вкладки на всю ширину полосы. */\n public readonly stretch: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Скроллить область контента при переполнении. */\n public readonly contentScrollable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /** Эмиттит id вкладки при её выборе (клик/клавиатура). */\n public readonly activeIdChange: OutputEmitterRef<IRtTabs.Id> = output<IRtTabs.Id>();\n\n /** Внутренний выбор (uncontrolled-ветка). */\n readonly #internalId: WritableSignal<IRtTabs.Id | null> = signal<IRtTabs.Id | null>(null);\n\n /** Хэндл интервала прокрутки по удержанию стрелки. */\n #scrollIntervalId: number | null = null;\n\n constructor() {\n if (this.#win) {\n fromEvent(this.#win, 'resize')\n .pipe(debounceTime(REST_DEBOUNCE_MS), takeUntilDestroyed())\n .subscribe((): void => this.#updateRestVisibility());\n }\n\n afterNextRender((): void => this.#updateRestVisibility());\n\n // Снимаем hold-scroll интервал при уничтожении: если компонент разрушить\n // с зажатой стрелкой (pointerdown без pointerup), интервал остался бы жив.\n inject(DestroyRef).onDestroy((): void => this.#clearScrollInterval());\n }\n\n protected selectTab(id: IRtTabs.Id): void {\n const target: RtTabDirective | undefined = this.visibleTabs().find((tab: RtTabDirective): boolean => tab.id() === id);\n\n if (!target || target.disabled()) {\n return;\n }\n\n this.#internalId.set(id);\n this.activeIdChange.emit(id);\n this.#scrollTabIntoView(id);\n }\n\n /** Навигация по вкладкам с клавиатуры (automatic activation). */\n protected onTabKeydown(event: KeyboardEvent): void {\n const enabled: readonly RtTabDirective[] = this.visibleTabs().filter((tab: RtTabDirective): boolean => !tab.disabled());\n\n if (!enabled.length) {\n return;\n }\n\n const isVertical: boolean = this.direction() === 'vertical';\n const nextKey: string = isVertical ? 'ArrowDown' : 'ArrowRight';\n const prevKey: string = isVertical ? 'ArrowUp' : 'ArrowLeft';\n const currentIndex: number = enabled.findIndex((tab: RtTabDirective): boolean => tab.id() === this.selectedId());\n\n // Карта клавиша → целевой индекс (без if/else-if цепочки).\n const moveByKey: ReadonlyMap<string, number> = new Map<string, number>([\n [nextKey, (currentIndex + 1) % enabled.length],\n [prevKey, (currentIndex - 1 + enabled.length) % enabled.length],\n ['Home', 0],\n ['End', enabled.length - 1],\n ]);\n\n const targetIndex: number | undefined = moveByKey.get(event.key);\n\n if (targetIndex === undefined) {\n return;\n }\n\n event.preventDefault();\n const targetId: IRtTabs.Id = enabled[targetIndex].id();\n this.selectTab(targetId);\n this.#focusTab(targetId);\n }\n\n /** Старт прокрутки полосы по удержанию ЛКМ на стрелке. */\n protected onRestPointerDown(direction: TScrollDirection, event: MouseEvent): void {\n if (event.button !== 0 || this.#scrollIntervalId !== null || !this.#win) {\n return;\n }\n\n this.#scrollIntervalId = this.#win.setInterval((): void => {\n this.#scrollStep(direction);\n this.#updateRestVisibility();\n }, SCROLL_TICK_MS);\n }\n\n protected onRestPointerUp(): void {\n this.#clearScrollInterval();\n }\n\n protected onTabListScroll(): void {\n this.#updateRestVisibility();\n }\n\n #clearScrollInterval(): void {\n if (this.#win && this.#scrollIntervalId !== null) {\n this.#win.clearInterval(this.#scrollIntervalId);\n this.#scrollIntervalId = null;\n }\n }\n\n #scrollStep(direction: TScrollDirection): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n if (!list) {\n return;\n }\n\n const scrolledLeft: number = list.scrollLeft;\n const scrolledRight: number = list.scrollWidth - list.scrollLeft - list.clientWidth;\n const remaining: number = direction === 'before' ? scrolledLeft : scrolledRight;\n\n if (remaining > 0) {\n list.scrollBy(direction === 'before' ? -SCROLL_STEP : SCROLL_STEP, 0);\n }\n\n if (remaining - SCROLL_STEP <= 0) {\n this.#clearScrollInterval();\n }\n }\n\n #updateRestVisibility(): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n\n if (!list || this.direction() !== 'horizontal') {\n this.restBeforeVisible.set(false);\n this.restAfterVisible.set(false);\n return;\n }\n\n const scrolledRight: number = list.scrollWidth - list.scrollLeft - list.clientWidth;\n\n this.restBeforeVisible.set(list.scrollLeft > 0);\n // 1px — погрешность субпиксельного scrollWidth\n this.restAfterVisible.set(scrolledRight > 1);\n }\n\n #scrollTabIntoView(id: IRtTabs.Id): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n const tab: HTMLElement | null | undefined = list?.querySelector<HTMLElement>(`[data-tabid=\"${id}\"]`);\n\n if (!list || !tab) {\n return;\n }\n\n const viewLeft: number = list.scrollLeft;\n const viewRight: number = list.scrollLeft + list.clientWidth;\n\n if (tab.offsetLeft < viewLeft) {\n list.scrollTo({ left: tab.offsetLeft });\n } else if (tab.offsetLeft + tab.offsetWidth > viewRight) {\n list.scrollTo({ left: tab.offsetLeft + tab.offsetWidth - list.clientWidth });\n } else {\n // вкладка целиком в зоне видимости — прокрутка не нужна\n }\n }\n\n #focusTab(id: IRtTabs.Id): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n list?.querySelector<HTMLElement>(`[data-tabid=\"${id}\"]`)?.focus();\n }\n}\n","<ng-container rtBlock=\"rt-tabs\">\n <div rtElem=\"header\">\n @if (leftControls().length) {\n <div rtElem=\"controls\" [rtMod]=\"{ before: true }\">\n @for (control of leftControls(); track $index) {\n <ng-container [ngTemplateOutlet]=\"control.templateRef\" />\n }\n </div>\n }\n\n <div rtElem=\"tab-list-wrapper\">\n <div\n rtElem=\"rest\"\n qa-dataid=\"tabs-scroll-prev\"\n [rtMod]=\"{ before: true, visible: restBeforeVisible() }\"\n (mousedown)=\"onRestPointerDown('before', $event)\"\n (mouseup)=\"onRestPointerUp()\"\n (mouseleave)=\"onRestPointerUp()\">\n <rt-icon name=\"chevron-left\" color=\"current\" size=\"sm\" />\n </div>\n\n <div\n #tabList\n rtElem=\"tab-list\"\n qa-dataid=\"tabs-tab-list\"\n role=\"tablist\"\n [rtMod]=\"{ stretch: stretch(), direction: direction() }\"\n [attr.aria-orientation]=\"direction()\"\n (scroll)=\"onTabListScroll()\">\n @for (tab of visibleTabs(); track tab.id()) {\n <button\n rtBlock=\"rt-tab-item\"\n qa-dataid=\"tabs-tab\"\n type=\"button\"\n role=\"tab\"\n [rtMod]=\"{\n selected: tab.id() === selectedId(),\n disabled: tab.disabled(),\n invalid: tab.invalid(),\n stretch: stretch(),\n }\"\n [id]=\"'rt-tab-' + tab.id()\"\n [disabled]=\"tab.disabled()\"\n [attr.data-tabid]=\"tab.id()\"\n [attr.aria-selected]=\"tab.id() === selectedId()\"\n [attr.aria-controls]=\"'rt-tabpanel-' + tab.id()\"\n [attr.tabindex]=\"tab.id() === selectedId() ? 0 : -1\"\n [rtTooltip]=\"tab.invalid() ? tab.invalidTitle() : ''\"\n (click)=\"selectTab(tab.id())\"\n (keydown)=\"onTabKeydown($event)\">\n @if (tab.icon(); as icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"icon\" [color]=\"tab.iconColor()\" />\n }\n\n @if (tab.titleTemplate(); as titleTpl) {\n <ng-container [ngTemplateOutlet]=\"titleTpl\" />\n } @else {\n <span rtElem=\"title\">{{ tab.label() }}</span>\n }\n\n @if (tab.badge() !== null) {\n <!-- В одну строку: перенос внутри добавил бы пробел в текст кнопки. -->\n <!-- prettier-ignore -->\n <span rtElem=\"badge\" [rtTooltip]=\"tab.badgeTitle()\" [attr.aria-label]=\"tab.badgeAriaLabel() || null\">{{ tab.badge() }}</span>\n }\n </button>\n }\n </div>\n\n <div\n rtElem=\"rest\"\n qa-dataid=\"tabs-scroll-next\"\n [rtMod]=\"{ after: true, visible: restAfterVisible() }\"\n (mousedown)=\"onRestPointerDown('after', $event)\"\n (mouseup)=\"onRestPointerUp()\"\n (mouseleave)=\"onRestPointerUp()\">\n <rt-icon name=\"chevron-right\" color=\"current\" size=\"sm\" />\n </div>\n </div>\n\n @if (rightControls().length) {\n <div rtElem=\"controls\" [rtMod]=\"{ after: true }\">\n @for (control of rightControls(); track $index) {\n <ng-container [ngTemplateOutlet]=\"control.templateRef\" />\n }\n </div>\n }\n </div>\n\n @if (activeTab(); as tab) {\n <div\n rtElem=\"content\"\n qa-dataid=\"tabs-panel\"\n role=\"tabpanel\"\n tabindex=\"0\"\n [rtMod]=\"{ scrollable: contentScrollable() }\"\n [id]=\"'rt-tabpanel-' + tab.id()\"\n [attr.aria-labelledby]=\"'rt-tab-' + tab.id()\">\n <ng-container [ngTemplateOutlet]=\"tab.templateRef\" />\n </div>\n }\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-tabs.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tab.directive.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs-control.directive.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs.component.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs.component.html"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n Directive,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n TemplateRef,\n} from '@angular/core';\n\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { IRtTabs } from './rt-tabs.model';\n\n/**\n * Декларирует одну вкладку `<rt-tabs>`. Ставится на `<ng-template>`: контент\n * шаблона становится телом панели и рендерится только когда вкладка активна.\n *\n * Метаданные (label, icon, disabled, badge, invalid) — signal-inputs, поэтому\n * шапка вкладки реагирует на их изменение без ручной перерегистрации. Сам\n * список вкладок `rt-tabs` собирает через `contentChildren`.\n */\n@Directive({\n selector: '[rtTab]',\n})\nexport class RtTabDirective {\n readonly #t_uiTabInvalid: Signal<string> = rtKitLabel('uiTabInvalid');\n\n /** Шаблон тела панели — рендерится в области контента при активной вкладке. */\n public readonly templateRef: TemplateRef<unknown> = inject<TemplateRef<unknown>>(TemplateRef);\n\n /** Стабильный идентификатор вкладки (значение атрибута `rtTab`). */\n public readonly id: InputSignal<IRtTabs.Id> = input<IRtTabs.Id>('', { alias: 'rtTab' });\n\n /** Текстовый заголовок. Игнорируется, если задан `titleTemplate`. */\n public readonly label: InputSignal<string> = input<string>('');\n\n /** Кастомный шаблон заголовка — замещает `label`. */\n public readonly titleTemplate: InputSignal<TemplateRef<unknown> | null> = input<TemplateRef<unknown> | null>(null);\n\n /** Иконка слева от заголовка. */\n public readonly icon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Семантический цвет иконки заголовка. */\n public readonly iconColor: InputSignal<IRtTabs.TitleColor> = input<IRtTabs.TitleColor>('current');\n\n /** Значение бейджа справа от заголовка (число/строка). `null` — без бейджа. */\n public readonly badge: InputSignal<string | number | null> = input<string | number | null>(null);\n\n /**\n * Подсказка при наведении на бейдж. Подсказка самой кнопки занята неверной вкладкой,\n * поэтому у бейджа своя. Пусто — подсказки нет.\n */\n public readonly badgeTitle: InputSignal<string> = input<string>('');\n\n /**\n * Подпись бейджа для чтения с экрана: точка или число сами по себе не говорят, что значат.\n * Пусто — атрибут не ставится, и озвучивается значение бейджа как есть.\n */\n public readonly badgeAriaLabel: InputSignal<string> = input<string>('');\n\n /** Заблокированная вкладка: не выбирается и не получает фокус. */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Скрытая вкладка: не рендерится ни в шапке, ни в контенте. */\n public readonly hidden: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Вкладка с ошибками: подсвечивается danger-цветом. */\n public readonly invalid: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Подсказка для невалидной вкладки. Пусто — берётся переведённое умолчание. */\n public readonly invalidMessage: InputSignal<string> = input<string>('');\n\n /** Готовый текст подсказки: своя формулировка важнее умолчания. */\n public readonly invalidTitle: Signal<string> = computed((): string => this.invalidMessage() || this.#t_uiTabInvalid());\n}\n","import { Directive, inject, input, InputSignalWithTransform, TemplateRef } from '@angular/core';\n\nimport { IRtTabs } from './rt-tabs.model';\n\n/**\n * Декларирует header-контрол `<rt-tabs>` — произвольный шаблон (кнопка, фильтр),\n * который рендерится слева или справа от полосы вкладок. Ставится на\n * `<ng-template>`; `rt-tabs` собирает контролы через `contentChildren` и\n * раскладывает по сторонам согласно `side`.\n */\n@Directive({\n selector: '[rtTabsControl]',\n})\nexport class RtTabsControlDirective {\n /** Шаблон контрола, выводимый в header-слоте. */\n public readonly templateRef: TemplateRef<unknown> = inject<TemplateRef<unknown>>(TemplateRef);\n\n /**\n * Сторона размещения относительно полосы вкладок.\n *\n * Пустое значение приводится к правой стороне: `<ng-template rtTabsControl>` без значения\n * задаёт входу пустую строку, а не умолчание, и такой контрол не попадал ни в левый слот,\n * ни в правый — он пропадал из шапки вовсе.\n */\n public readonly side: InputSignalWithTransform<IRtTabs.ControlSide, IRtTabs.ControlSide | ''> = input<\n IRtTabs.ControlSide,\n IRtTabs.ControlSide | ''\n >('right', {\n alias: 'rtTabsControl',\n transform: (value: IRtTabs.ControlSide | ''): IRtTabs.ControlSide => (value === '' ? 'right' : value),\n });\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n DestroyRef,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { debounceTime, fromEvent } from 'rxjs';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { RtTabDirective } from './rt-tab.directive';\nimport { RtTabsControlDirective } from './rt-tabs-control.directive';\nimport { IRtTabs } from './rt-tabs.model';\n\n/** Шаг ручной прокрутки полосы вкладок за один тик удержания стрелки (px). */\nconst SCROLL_STEP: number = 12;\n\n/** Интервал тика прокрутки при зажатой стрелке (мс). */\nconst SCROLL_TICK_MS: number = 15;\n\n/** Дебаунс пересчёта видимости стрелок прокрутки на resize/scroll (мс). */\nconst REST_DEBOUNCE_MS: number = 50;\n\nconst BEM_BLOCK: string = 'rt-tabs';\n\ntype TScrollDirection = 'before' | 'after';\n\n/**\n * Полоса вкладок с проекцией контента. Вкладки декларируются через\n * `<ng-template rtTab=\"id\" label=\"…\">…</ng-template>` (см. {@link RtTabDirective}),\n * собираются `contentChildren` и рендерятся как header-кнопки + активная панель.\n * Опциональные header-контролы — через `[rtTabsControl]`.\n *\n * Компонент \"controlled-ish\": активная вкладка берётся из `activeId` (если\n * задан), иначе — из внутреннего выбора, иначе — первая доступная. Клик/клавиша\n * эмиттят `activeIdChange`; синхронизацию `activeId` оставляем потребителю.\n *\n * Горизонтальная полоса при переполнении прячет вкладки под скролл и показывает\n * стрелки-«хвосты» (`__rest`) с прокруткой по удержанию. Вертикальная ориентация\n * раскладывает вкладки в колонку без стрелок.\n *\n * Доступность: `role=\"tablist\"`/`role=\"tab\"`/`role=\"tabpanel\"`, `aria-selected`,\n * roving `tabindex`, навигация стрелками + Home/End.\n */\n@Component({\n selector: 'rt-tabs',\n templateUrl: './rt-tabs.component.html',\n styleUrl: './rt-tabs.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // angular\n NgTemplateOutlet,\n\n // standalone components / directives\n RtIconComponent,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-tabs--direction--horizontal]': \"direction() === 'horizontal'\",\n '[class.rt-tabs--direction--vertical]': \"direction() === 'vertical'\",\n },\n})\nexport class RtTabsComponent {\n /** `Window` через `DOCUMENT` (SSR-safe: `defaultView` может быть `null`). */\n readonly #win: Window | null = inject(DOCUMENT).defaultView;\n\n /** Все задекларированные вкладки (включая скрытые). */\n protected readonly tabs: Signal<readonly RtTabDirective[]> = contentChildren(RtTabDirective);\n\n /** Все header-контролы. */\n protected readonly controls: Signal<readonly RtTabsControlDirective[]> = contentChildren(RtTabsControlDirective);\n\n /** Видимые вкладки (без `hidden`). */\n protected readonly visibleTabs: Signal<readonly RtTabDirective[]> = computed((): readonly RtTabDirective[] =>\n this.tabs().filter((tab: RtTabDirective): boolean => !tab.hidden())\n );\n\n protected readonly leftControls: Signal<readonly RtTabsControlDirective[]> = computed((): readonly RtTabsControlDirective[] =>\n this.controls().filter((c: RtTabsControlDirective): boolean => c.side() === 'left')\n );\n\n protected readonly rightControls: Signal<readonly RtTabsControlDirective[]> = computed((): readonly RtTabsControlDirective[] =>\n this.controls().filter((c: RtTabsControlDirective): boolean => c.side() === 'right')\n );\n\n /**\n * Эффективный id активной вкладки. Приоритет: контролируемый `activeId` →\n * внутренний выбор → первая доступная. Кандидат валидируется по множеству\n * видимых незаблокированных вкладок, поэтому корректно реагирует на\n * асинхронную загрузку/смену набора вкладок.\n */\n protected readonly selectedId: Signal<IRtTabs.Id | null> = computed((): IRtTabs.Id | null => {\n const enabled: readonly RtTabDirective[] = this.visibleTabs().filter((tab: RtTabDirective): boolean => !tab.disabled());\n const candidate: IRtTabs.Id | null = this.activeId() ?? this.#internalId();\n const candidateValid: boolean = candidate !== null && enabled.some((tab: RtTabDirective): boolean => tab.id() === candidate);\n\n let result: IRtTabs.Id | null;\n if (candidateValid) {\n result = candidate;\n } else if (enabled.length) {\n result = enabled[0].id();\n } else {\n result = null;\n }\n\n return result;\n });\n\n /** Активная вкладка целиком (для рендера панели). */\n protected readonly activeTab: Signal<RtTabDirective | null> = computed(\n (): RtTabDirective | null => this.visibleTabs().find((tab: RtTabDirective): boolean => tab.id() === this.selectedId()) ?? null\n );\n\n /** Видны ли стрелки прокрутки слева/справа (только горизонтальная полоса). */\n protected readonly restBeforeVisible: WritableSignal<boolean> = signal(false);\n protected readonly restAfterVisible: WritableSignal<boolean> = signal(false);\n\n protected readonly tabListRef: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('tabList');\n\n /** Контролируемый активный id. `null` — компонент сам выбирает первую вкладку. */\n public readonly activeId: InputSignal<IRtTabs.Id | null> = input<IRtTabs.Id | null>(null);\n\n /** Ориентация полосы. */\n public readonly direction: InputSignal<IRtTabs.Direction> = input<IRtTabs.Direction>('horizontal');\n\n /** Растягивать вкладки на всю ширину полосы. */\n public readonly stretch: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Скроллить область контента при переполнении. */\n public readonly contentScrollable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /** Эмиттит id вкладки при её выборе (клик/клавиатура). */\n public readonly activeIdChange: OutputEmitterRef<IRtTabs.Id> = output<IRtTabs.Id>();\n\n /** Внутренний выбор (uncontrolled-ветка). */\n readonly #internalId: WritableSignal<IRtTabs.Id | null> = signal<IRtTabs.Id | null>(null);\n\n /** Хэндл интервала прокрутки по удержанию стрелки. */\n #scrollIntervalId: number | null = null;\n\n constructor() {\n if (this.#win) {\n fromEvent(this.#win, 'resize')\n .pipe(debounceTime(REST_DEBOUNCE_MS), takeUntilDestroyed())\n .subscribe((): void => this.#updateRestVisibility());\n }\n\n afterNextRender((): void => this.#updateRestVisibility());\n\n // Снимаем hold-scroll интервал при уничтожении: если компонент разрушить\n // с зажатой стрелкой (pointerdown без pointerup), интервал остался бы жив.\n inject(DestroyRef).onDestroy((): void => this.#clearScrollInterval());\n }\n\n protected selectTab(id: IRtTabs.Id): void {\n const target: RtTabDirective | undefined = this.visibleTabs().find((tab: RtTabDirective): boolean => tab.id() === id);\n\n if (!target || target.disabled()) {\n return;\n }\n\n this.#internalId.set(id);\n this.activeIdChange.emit(id);\n this.#scrollTabIntoView(id);\n }\n\n /** Навигация по вкладкам с клавиатуры (automatic activation). */\n protected onTabKeydown(event: KeyboardEvent): void {\n const enabled: readonly RtTabDirective[] = this.visibleTabs().filter((tab: RtTabDirective): boolean => !tab.disabled());\n\n if (!enabled.length) {\n return;\n }\n\n const isVertical: boolean = this.direction() === 'vertical';\n const nextKey: string = isVertical ? 'ArrowDown' : 'ArrowRight';\n const prevKey: string = isVertical ? 'ArrowUp' : 'ArrowLeft';\n const currentIndex: number = enabled.findIndex((tab: RtTabDirective): boolean => tab.id() === this.selectedId());\n\n // Карта клавиша → целевой индекс (без if/else-if цепочки).\n const moveByKey: ReadonlyMap<string, number> = new Map<string, number>([\n [nextKey, (currentIndex + 1) % enabled.length],\n [prevKey, (currentIndex - 1 + enabled.length) % enabled.length],\n ['Home', 0],\n ['End', enabled.length - 1],\n ]);\n\n const targetIndex: number | undefined = moveByKey.get(event.key);\n\n if (targetIndex === undefined) {\n return;\n }\n\n event.preventDefault();\n const targetId: IRtTabs.Id = enabled[targetIndex].id();\n this.selectTab(targetId);\n this.#focusTab(targetId);\n }\n\n /** Старт прокрутки полосы по удержанию ЛКМ на стрелке. */\n protected onRestPointerDown(direction: TScrollDirection, event: MouseEvent): void {\n if (event.button !== 0 || this.#scrollIntervalId !== null || !this.#win) {\n return;\n }\n\n this.#scrollIntervalId = this.#win.setInterval((): void => {\n this.#scrollStep(direction);\n this.#updateRestVisibility();\n }, SCROLL_TICK_MS);\n }\n\n protected onRestPointerUp(): void {\n this.#clearScrollInterval();\n }\n\n protected onTabListScroll(): void {\n this.#updateRestVisibility();\n }\n\n #clearScrollInterval(): void {\n if (this.#win && this.#scrollIntervalId !== null) {\n this.#win.clearInterval(this.#scrollIntervalId);\n this.#scrollIntervalId = null;\n }\n }\n\n #scrollStep(direction: TScrollDirection): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n if (!list) {\n return;\n }\n\n const scrolledLeft: number = list.scrollLeft;\n const scrolledRight: number = list.scrollWidth - list.scrollLeft - list.clientWidth;\n const remaining: number = direction === 'before' ? scrolledLeft : scrolledRight;\n\n if (remaining > 0) {\n list.scrollBy(direction === 'before' ? -SCROLL_STEP : SCROLL_STEP, 0);\n }\n\n if (remaining - SCROLL_STEP <= 0) {\n this.#clearScrollInterval();\n }\n }\n\n #updateRestVisibility(): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n\n if (!list || this.direction() !== 'horizontal') {\n this.restBeforeVisible.set(false);\n this.restAfterVisible.set(false);\n return;\n }\n\n const scrolledRight: number = list.scrollWidth - list.scrollLeft - list.clientWidth;\n\n this.restBeforeVisible.set(list.scrollLeft > 0);\n // 1px — погрешность субпиксельного scrollWidth\n this.restAfterVisible.set(scrolledRight > 1);\n }\n\n #scrollTabIntoView(id: IRtTabs.Id): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n const tab: HTMLElement | null | undefined = list?.querySelector<HTMLElement>(`[data-tabid=\"${id}\"]`);\n\n if (!list || !tab) {\n return;\n }\n\n const viewLeft: number = list.scrollLeft;\n const viewRight: number = list.scrollLeft + list.clientWidth;\n\n if (tab.offsetLeft < viewLeft) {\n list.scrollTo({ left: tab.offsetLeft });\n } else if (tab.offsetLeft + tab.offsetWidth > viewRight) {\n list.scrollTo({ left: tab.offsetLeft + tab.offsetWidth - list.clientWidth });\n } else {\n // вкладка целиком в зоне видимости — прокрутка не нужна\n }\n }\n\n #focusTab(id: IRtTabs.Id): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n list?.querySelector<HTMLElement>(`[data-tabid=\"${id}\"]`)?.focus();\n }\n}\n","<ng-container rtBlock=\"rt-tabs\">\n <div rtElem=\"header\">\n @if (leftControls().length) {\n <div rtElem=\"controls\" [rtMod]=\"{ before: true }\">\n @for (control of leftControls(); track $index) {\n <ng-container [ngTemplateOutlet]=\"control.templateRef\" />\n }\n </div>\n }\n\n <div rtElem=\"tab-list-wrapper\">\n <div\n rtElem=\"rest\"\n qa-dataid=\"tabs-scroll-prev\"\n [rtMod]=\"{ before: true, visible: restBeforeVisible() }\"\n (mousedown)=\"onRestPointerDown('before', $event)\"\n (mouseup)=\"onRestPointerUp()\"\n (mouseleave)=\"onRestPointerUp()\">\n <rt-icon name=\"chevron-left\" color=\"current\" size=\"sm\" />\n </div>\n\n <div\n #tabList\n rtElem=\"tab-list\"\n qa-dataid=\"tabs-tab-list\"\n role=\"tablist\"\n [rtMod]=\"{ stretch: stretch(), direction: direction() }\"\n [attr.aria-orientation]=\"direction()\"\n (scroll)=\"onTabListScroll()\">\n @for (tab of visibleTabs(); track tab.id()) {\n <button\n rtBlock=\"rt-tab-item\"\n qa-dataid=\"tabs-tab\"\n type=\"button\"\n role=\"tab\"\n [rtMod]=\"{\n selected: tab.id() === selectedId(),\n disabled: tab.disabled(),\n invalid: tab.invalid(),\n stretch: stretch(),\n }\"\n [id]=\"'rt-tab-' + tab.id()\"\n [disabled]=\"tab.disabled()\"\n [attr.data-tabid]=\"tab.id()\"\n [attr.aria-selected]=\"tab.id() === selectedId()\"\n [attr.aria-controls]=\"'rt-tabpanel-' + tab.id()\"\n [attr.tabindex]=\"tab.id() === selectedId() ? 0 : -1\"\n [rtTooltip]=\"tab.invalid() ? tab.invalidTitle() : ''\"\n (click)=\"selectTab(tab.id())\"\n (keydown)=\"onTabKeydown($event)\">\n @if (tab.icon(); as icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"icon\" [color]=\"tab.iconColor()\" />\n }\n\n @if (tab.titleTemplate(); as titleTpl) {\n <ng-container [ngTemplateOutlet]=\"titleTpl\" />\n } @else {\n <span rtElem=\"title\">{{ tab.label() }}</span>\n }\n\n @if (tab.badge() !== null) {\n <!-- В одну строку: перенос внутри добавил бы пробел в текст кнопки. -->\n <!-- prettier-ignore -->\n <span rtElem=\"badge\" [rtTooltip]=\"tab.badgeTitle()\" [attr.aria-label]=\"tab.badgeAriaLabel() || null\">{{ tab.badge() }}</span>\n }\n </button>\n }\n </div>\n\n <div\n rtElem=\"rest\"\n qa-dataid=\"tabs-scroll-next\"\n [rtMod]=\"{ after: true, visible: restAfterVisible() }\"\n (mousedown)=\"onRestPointerDown('after', $event)\"\n (mouseup)=\"onRestPointerUp()\"\n (mouseleave)=\"onRestPointerUp()\">\n <rt-icon name=\"chevron-right\" color=\"current\" size=\"sm\" />\n </div>\n </div>\n\n @if (rightControls().length) {\n <div rtElem=\"controls\" [rtMod]=\"{ after: true }\">\n @for (control of rightControls(); track $index) {\n <ng-container [ngTemplateOutlet]=\"control.templateRef\" />\n }\n </div>\n }\n </div>\n\n @if (activeTab(); as tab) {\n <div\n rtElem=\"content\"\n qa-dataid=\"tabs-panel\"\n role=\"tabpanel\"\n tabindex=\"0\"\n [rtMod]=\"{ scrollable: contentScrollable() }\"\n [id]=\"'rt-tabpanel-' + tab.id()\"\n [attr.aria-labelledby]=\"'rt-tab-' + tab.id()\">\n <ng-container [ngTemplateOutlet]=\"tab.templateRef\" />\n </div>\n }\n</ng-container>\n"],"mappings":"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"}