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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/README.md +25 -0
  2. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs +79 -0
  3. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs.map +1 -0
  4. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +227 -0
  5. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -0
  6. package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs +47 -0
  7. package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs.map +1 -0
  8. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +702 -0
  9. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -0
  10. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +214 -0
  11. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -0
  12. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +53 -0
  13. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -0
  14. package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs +88 -0
  15. package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs.map +1 -0
  16. package/fesm2022/rt-tools-ui-kit-v2-button.mjs +365 -0
  17. package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -0
  18. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +152 -0
  19. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -0
  20. package/fesm2022/rt-tools-ui-kit-v2-card.mjs +72 -0
  21. package/fesm2022/rt-tools-ui-kit-v2-card.mjs.map +1 -0
  22. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +111 -0
  23. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -0
  24. package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs +76 -0
  25. package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs.map +1 -0
  26. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs +255 -0
  27. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs.map +1 -0
  28. package/fesm2022/rt-tools-ui-kit-v2-container.mjs +1326 -0
  29. package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -0
  30. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +2590 -0
  31. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -0
  32. package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs +45 -0
  33. package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs.map +1 -0
  34. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs +158 -0
  35. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs.map +1 -0
  36. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +894 -0
  37. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -0
  38. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +1217 -0
  39. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -0
  40. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +779 -0
  41. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -0
  42. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +573 -0
  43. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -0
  44. package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs +141 -0
  45. package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs.map +1 -0
  46. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs +68 -0
  47. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs.map +1 -0
  48. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs +478 -0
  49. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs.map +1 -0
  50. package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs +183 -0
  51. package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs.map +1 -0
  52. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +44 -0
  53. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -0
  54. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +260 -0
  55. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -0
  56. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +937 -0
  57. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -0
  58. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +56 -0
  59. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -0
  60. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +107 -0
  61. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -0
  62. package/fesm2022/rt-tools-ui-kit-v2-field.mjs +183 -0
  63. package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -0
  64. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +219 -0
  65. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -0
  66. package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs +214 -0
  67. package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs.map +1 -0
  68. package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs +117 -0
  69. package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs.map +1 -0
  70. package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs +32 -0
  71. package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs.map +1 -0
  72. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +91 -0
  73. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -0
  74. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +220 -0
  75. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -0
  76. package/fesm2022/rt-tools-ui-kit-v2-header.mjs +72 -0
  77. package/fesm2022/rt-tools-ui-kit-v2-header.mjs.map +1 -0
  78. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +163 -0
  79. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -0
  80. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +674 -0
  81. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -0
  82. package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs +540 -0
  83. package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs.map +1 -0
  84. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +227 -0
  85. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -0
  86. package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs +37 -0
  87. package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs.map +1 -0
  88. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +361 -0
  89. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -0
  90. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +143 -0
  91. package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -0
  92. package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs +49 -0
  93. package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs.map +1 -0
  94. package/fesm2022/rt-tools-ui-kit-v2-logo.mjs +97 -0
  95. package/fesm2022/rt-tools-ui-kit-v2-logo.mjs.map +1 -0
  96. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs +57 -0
  97. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs.map +1 -0
  98. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +537 -0
  99. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -0
  100. package/fesm2022/rt-tools-ui-kit-v2-message.mjs +105 -0
  101. package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -0
  102. package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs +71 -0
  103. package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs.map +1 -0
  104. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +315 -0
  105. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -0
  106. package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs +51 -0
  107. package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs.map +1 -0
  108. package/fesm2022/rt-tools-ui-kit-v2-note.mjs +44 -0
  109. package/fesm2022/rt-tools-ui-kit-v2-note.mjs.map +1 -0
  110. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +54 -0
  111. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -0
  112. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +339 -0
  113. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -0
  114. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +187 -0
  115. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -0
  116. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs +170 -0
  117. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs.map +1 -0
  118. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs +312 -0
  119. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs.map +1 -0
  120. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +174 -0
  121. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -0
  122. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs +56 -0
  123. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs.map +1 -0
  124. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +96 -41
  125. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  126. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs +118 -0
  127. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs.map +1 -0
  128. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +290 -0
  129. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -0
  130. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +37 -0
  131. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -0
  132. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +495 -0
  133. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -0
  134. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +1493 -0
  135. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -0
  136. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs +49 -0
  137. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs.map +1 -0
  138. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs +123 -0
  139. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs.map +1 -0
  140. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs +70 -0
  141. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs.map +1 -0
  142. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs +92 -0
  143. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs.map +1 -0
  144. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +147 -0
  145. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -0
  146. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +117 -0
  147. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -0
  148. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +1636 -0
  149. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -0
  150. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +350 -0
  151. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -0
  152. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +122 -0
  153. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -0
  154. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +85 -0
  155. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -0
  156. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +73 -0
  157. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -0
  158. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +196 -0
  159. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -0
  160. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs +39 -0
  161. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs.map +1 -0
  162. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +338 -0
  163. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -0
  164. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +132 -0
  165. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -0
  166. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +162 -0
  167. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -0
  168. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +135 -0
  169. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -0
  170. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +214 -0
  171. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -0
  172. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs +64 -0
  173. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs.map +1 -0
  174. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +263 -0
  175. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -0
  176. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +296 -0
  177. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -0
  178. package/fesm2022/rt-tools-ui-kit-v2.mjs +91 -23164
  179. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  180. package/package.json +349 -1
  181. package/rt-tools-ui-kit-v2-0.18.0.tgz +0 -0
  182. package/src/lib/components/action-bar/CONTEXT.md +5 -0
  183. package/src/lib/components/action-bar/rt-action-bar.component.scss +30 -16
  184. package/src/lib/components/aside/CONTEXT.md +9 -1
  185. package/src/lib/components/aside/footer/rt-aside-footer.component.scss +7 -8
  186. package/src/lib/components/aside/header/rt-aside-header.component.scss +16 -1
  187. package/src/lib/components/aside/rt-aside.component.scss +17 -1
  188. package/src/lib/components/button/CONTEXT.md +12 -11
  189. package/src/lib/components/button/rt-button.directive.scss +36 -0
  190. package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +2 -2
  191. package/src/lib/components/data-table/cell/rt-data-table-cell.component.scss +1 -1
  192. package/src/lib/components/data-table/filter-cell/rt-data-table-filter-cell.component.scss +1 -1
  193. package/src/lib/components/data-table/rt-data-table.component.scss +1 -1
  194. package/src/lib/components/dialog/CONTEXT.md +9 -0
  195. package/src/lib/components/dialog/content/rt-dialog-content.component.scss +20 -0
  196. package/src/lib/components/dialog/footer/rt-dialog-footer.component.scss +18 -2
  197. package/src/lib/components/dialog/header/rt-dialog-header.component.scss +21 -3
  198. package/src/lib/components/dialog/rt-dialog.component.scss +9 -3
  199. package/src/lib/components/dot-field/CONTEXT.md +31 -0
  200. package/src/lib/components/dot-field/rt-dot-field.component.scss +20 -0
  201. package/src/lib/components/dot-field/stories/component/CONTEXT.md +14 -0
  202. package/src/lib/components/dot-field/stories/component/test-dot-field.component.scss +31 -0
  203. package/src/lib/components/dynamic-selector/CONTEXT.md +6 -0
  204. package/src/lib/components/field/CONTEXT.md +18 -2
  205. package/src/lib/components/header/CONTEXT.md +2 -2
  206. package/src/lib/components/icon/CONTEXT.md +11 -7
  207. package/src/lib/components/icon/rt-icon.component.scss +47 -0
  208. package/src/lib/components/icon-button/CONTEXT.md +27 -20
  209. package/src/lib/components/icon-button/rt-icon-button.component.scss +51 -25
  210. package/src/lib/components/image-upload/CONTEXT.md +20 -15
  211. package/src/lib/components/image-upload/rt-image-upload.component.scss +14 -2
  212. package/src/lib/components/pagination/rt-pagination.component.scss +1 -1
  213. package/src/lib/components/scroll-area/CONTEXT.md +2 -0
  214. package/src/lib/components/scroll-area/rt-scroll-area.component.scss +20 -3
  215. package/src/lib/components/select/rt-select.component.scss +4 -0
  216. package/src/lib/components/side-menu/CONTEXT.md +7 -2
  217. package/src/lib/components/spinner/CONTEXT.md +15 -8
  218. package/src/lib/components/spinner/rt-spinner.component.scss +108 -9
  219. package/src/lib/components/tag/rt-tag.component.scss +43 -23
  220. package/src/lib/components/toast/CONTEXT.md +8 -0
  221. package/src/lib/components/toast/rt-toast.component.scss +74 -15
  222. package/src/lib/components/toast/rt-toaster.component.scss +5 -1
  223. package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +35 -37
  224. package/src/lib/components/toggle-switch/CONTEXT.md +11 -3
  225. package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +53 -14
  226. package/src/lib/components/toolbar/rt-toolbar.component.scss +15 -4
  227. package/src/lib/components/tooltip/CONTEXT.md +5 -5
  228. package/src/rich-editor/lib/components/chat/CONTEXT.md +7 -2
  229. package/src/rich-editor/lib/components/chat/rt-chat.component.scss +25 -0
  230. package/src/styles/_semantic.scss +1 -1
  231. package/styles/tokens.css +43 -8
  232. package/types/rt-tools-ui-kit-v2-accordion.d.ts +30 -0
  233. package/types/rt-tools-ui-kit-v2-action-bar.d.ts +140 -0
  234. package/types/rt-tools-ui-kit-v2-aside-section.d.ts +25 -0
  235. package/types/rt-tools-ui-kit-v2-aside.d.ts +436 -0
  236. package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +78 -0
  237. package/types/rt-tools-ui-kit-v2-bar-list.d.ts +41 -0
  238. package/types/rt-tools-ui-kit-v2-bottom-sheet.d.ts +20 -0
  239. package/types/rt-tools-ui-kit-v2-button.d.ts +76 -0
  240. package/types/rt-tools-ui-kit-v2-calendar.d.ts +96 -0
  241. package/types/rt-tools-ui-kit-v2-card.d.ts +38 -0
  242. package/types/rt-tools-ui-kit-v2-checkbox.d.ts +46 -0
  243. package/types/rt-tools-ui-kit-v2-collapsible-text.d.ts +20 -0
  244. package/types/rt-tools-ui-kit-v2-confirm-popover.d.ts +85 -0
  245. package/types/rt-tools-ui-kit-v2-container.d.ts +425 -0
  246. package/types/rt-tools-ui-kit-v2-core.d.ts +1222 -0
  247. package/types/rt-tools-ui-kit-v2-counter-row.d.ts +22 -0
  248. package/types/rt-tools-ui-kit-v2-counter.d.ts +70 -0
  249. package/types/rt-tools-ui-kit-v2-data-list.d.ts +334 -0
  250. package/types/rt-tools-ui-kit-v2-data-table.d.ts +494 -0
  251. package/types/rt-tools-ui-kit-v2-date-picker.d.ts +181 -0
  252. package/types/rt-tools-ui-kit-v2-date-range.d.ts +98 -0
  253. package/types/rt-tools-ui-kit-v2-delta-view.d.ts +20 -0
  254. package/types/rt-tools-ui-kit-v2-detail-list.d.ts +33 -0
  255. package/types/rt-tools-ui-kit-v2-dialog.d.ts +287 -0
  256. package/types/rt-tools-ui-kit-v2-dot-field.d.ts +17 -0
  257. package/types/rt-tools-ui-kit-v2-download-link.d.ts +17 -0
  258. package/types/rt-tools-ui-kit-v2-dynamic-list.d.ts +139 -0
  259. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +384 -0
  260. package/types/rt-tools-ui-kit-v2-empty-state.d.ts +29 -0
  261. package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +57 -0
  262. package/types/rt-tools-ui-kit-v2-field.d.ts +82 -0
  263. package/types/rt-tools-ui-kit-v2-file-card.d.ts +114 -0
  264. package/types/rt-tools-ui-kit-v2-file-drop.d.ts +75 -0
  265. package/types/rt-tools-ui-kit-v2-file-input.d.ts +48 -0
  266. package/types/rt-tools-ui-kit-v2-file-list.d.ts +13 -0
  267. package/types/rt-tools-ui-kit-v2-filter-control.d.ts +72 -0
  268. package/types/rt-tools-ui-kit-v2-form-control.d.ts +74 -0
  269. package/types/rt-tools-ui-kit-v2-header.d.ts +40 -0
  270. package/types/rt-tools-ui-kit-v2-icon-button.d.ts +113 -0
  271. package/types/rt-tools-ui-kit-v2-icon.d.ts +238 -0
  272. package/types/rt-tools-ui-kit-v2-image-cropper.d.ts +168 -0
  273. package/types/rt-tools-ui-kit-v2-image-upload.d.ts +102 -0
  274. package/types/rt-tools-ui-kit-v2-info-item.d.ts +13 -0
  275. package/types/rt-tools-ui-kit-v2-input-number.d.ts +67 -0
  276. package/types/rt-tools-ui-kit-v2-input.d.ts +54 -0
  277. package/types/rt-tools-ui-kit-v2-live-badge.d.ts +23 -0
  278. package/types/rt-tools-ui-kit-v2-logo.d.ts +58 -0
  279. package/types/rt-tools-ui-kit-v2-markdown-text.d.ts +30 -0
  280. package/types/rt-tools-ui-kit-v2-menu.d.ts +217 -0
  281. package/types/rt-tools-ui-kit-v2-message.d.ts +56 -0
  282. package/types/rt-tools-ui-kit-v2-money-list.d.ts +34 -0
  283. package/types/rt-tools-ui-kit-v2-multiselect.d.ts +93 -0
  284. package/types/rt-tools-ui-kit-v2-night-grid.d.ts +39 -0
  285. package/types/rt-tools-ui-kit-v2-note.d.ts +21 -0
  286. package/types/rt-tools-ui-kit-v2-notifications-bell.d.ts +23 -0
  287. package/types/rt-tools-ui-kit-v2-page-header.d.ts +173 -0
  288. package/types/rt-tools-ui-kit-v2-pagination.d.ts +64 -0
  289. package/types/rt-tools-ui-kit-v2-photo-viewer.d.ts +98 -0
  290. package/types/rt-tools-ui-kit-v2-popover.d.ts +79 -0
  291. package/types/rt-tools-ui-kit-v2-radio-button.d.ts +61 -0
  292. package/types/rt-tools-ui-kit-v2-radius.d.ts +37 -0
  293. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +16 -20
  294. package/types/rt-tools-ui-kit-v2-ripple.d.ts +39 -0
  295. package/types/rt-tools-ui-kit-v2-scroll-area.d.ts +91 -0
  296. package/types/rt-tools-ui-kit-v2-section-nav.d.ts +23 -0
  297. package/types/rt-tools-ui-kit-v2-select.d.ts +215 -0
  298. package/types/rt-tools-ui-kit-v2-side-menu.d.ts +483 -0
  299. package/types/rt-tools-ui-kit-v2-skeleton-wrapper.d.ts +32 -0
  300. package/types/rt-tools-ui-kit-v2-skeleton.d.ts +41 -0
  301. package/types/rt-tools-ui-kit-v2-spinner.d.ts +56 -0
  302. package/types/rt-tools-ui-kit-v2-split-button.d.ts +72 -0
  303. package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +81 -0
  304. package/types/rt-tools-ui-kit-v2-stepper.d.ts +51 -0
  305. package/types/rt-tools-ui-kit-v2-table.d.ts +739 -0
  306. package/types/rt-tools-ui-kit-v2-tabs.d.ts +153 -0
  307. package/types/rt-tools-ui-kit-v2-tag.d.ts +70 -0
  308. package/types/rt-tools-ui-kit-v2-textarea.d.ts +36 -0
  309. package/types/rt-tools-ui-kit-v2-theme-toggle.d.ts +43 -0
  310. package/types/rt-tools-ui-kit-v2-thread-list.d.ts +111 -0
  311. package/types/rt-tools-ui-kit-v2-timeline.d.ts +35 -0
  312. package/types/rt-tools-ui-kit-v2-toast.d.ts +103 -0
  313. package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +109 -0
  314. package/types/rt-tools-ui-kit-v2-toggle-switch.d.ts +85 -0
  315. package/types/rt-tools-ui-kit-v2-toolbar.d.ts +66 -0
  316. package/types/rt-tools-ui-kit-v2-tooltip.d.ts +74 -0
  317. package/types/rt-tools-ui-kit-v2-welcome-dialog.d.ts +33 -0
  318. package/types/rt-tools-ui-kit-v2-workspace-details.d.ts +128 -0
  319. package/types/rt-tools-ui-kit-v2-workspace.d.ts +84 -0
  320. package/types/rt-tools-ui-kit-v2.d.ts +87 -9290
  321. package/rt-tools-ui-kit-v2-0.16.0.tgz +0 -0
@@ -0,0 +1,183 @@
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);
17
+ function hash(x, y) {
18
+ const value = Math.sin(x * 127.1 + y * 311.7) * 43758.5453;
19
+ return value - Math.floor(value);
20
+ }
21
+ function fade(value) {
22
+ return value * value * (3 - 2 * value);
23
+ }
24
+ function lerp(from, to, amount) {
25
+ return from + (to - from) * amount;
26
+ }
27
+ 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);
30
+ }
31
+ /** Шум значений: гладкая случайная поверхность от 0 до 1. */
32
+ 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);
40
+ }
41
+ /**
42
+ * Плотность поля в клетке: два слоя шума, сдвинутые временем, и поляна в центре, где точки редеют.
43
+ *
44
+ * @returns Число от 0 до 1.
45
+ */
46
+ 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);
56
+ }
57
+ /**
58
+ * Горит ли клетка: плотность сравнивается с порогом, который матрица Байера 4x4 сдвигает по
59
+ * клеткам. Так края облаков выходят рваными, а не гладкими.
60
+ */
61
+ 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 }); }
166
+ }
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
+
182
+ export { RtDotFieldComponent };
183
+ //# sourceMappingURL=rt-tools-ui-kit-v2-dot-field.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-dot-field.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/dot-field/rt-dot-field.logic.ts","../../../projects/ui-kit-v2/src/lib/components/dot-field/rt-dot-field.painter.ts","../../../projects/ui-kit-v2/src/lib/components/dot-field/rt-dot-field.component.ts","../../../projects/ui-kit-v2/src/lib/components/dot-field/rt-dot-field.component.html","../../../projects/ui-kit-v2/src/lib/components/dot-field/rt-tools-ui-kit-v2-dot-field.ts"],"sourcesContent":["/** Сторона клетки сетки в пикселях. */\nexport const DOT_FIELD_CELL: number = 10;\n\n/** Сторона точки в центре клетки. */\nexport const DOT_FIELD_DOT: number = 3;\n\n/** Кадр рисуется раз в столько миллисекунд: ступенчатое движение — часть облика. */\nexport const DOT_FIELD_FRAME_MS: number = 90;\n\n/** На столько сдвигается время шума за кадр. */\nexport const DOT_FIELD_TIME_STEP: number = 0.035;\n\nconst NOISE_SCALE: number = 0.075;\nconst THRESHOLD: number = 0.64;\nconst DITHER_SPREAD: number = 0.3;\nconst BAYER_4X4: readonly number[] = [0, 8, 2, 10, 12, 4, 14, 6, 3, 11, 1, 9, 15, 7, 13, 5].map((value: number): number => value / 16);\n\nfunction hash(x: number, y: number): number {\n const value: number = Math.sin(x * 127.1 + y * 311.7) * 43758.5453;\n return value - Math.floor(value);\n}\n\nfunction fade(value: number): number {\n return value * value * (3 - 2 * value);\n}\n\nfunction lerp(from: number, to: number, amount: number): number {\n return from + (to - from) * amount;\n}\n\nfunction smoothstep(edge0: number, edge1: number, value: number): number {\n const amount: number = Math.min(1, Math.max(0, (value - edge0) / (edge1 - edge0)));\n return amount * amount * (3 - 2 * amount);\n}\n\n/** Шум значений: гладкая случайная поверхность от 0 до 1. */\nfunction noise(x: number, y: number): number {\n const x0: number = Math.floor(x);\n const y0: number = Math.floor(y);\n const fx: number = fade(x - x0);\n const fy: number = fade(y - y0);\n\n const top: number = lerp(hash(x0, y0), hash(x0 + 1, y0), fx);\n const bottom: number = lerp(hash(x0, y0 + 1), hash(x0 + 1, y0 + 1), fx);\n\n return lerp(top, bottom, fy);\n}\n\n/**\n * Плотность поля в клетке: два слоя шума, сдвинутые временем, и поляна в центре, где точки редеют.\n *\n * @returns Число от 0 до 1.\n */\nexport function dotDensity(column: number, row: number, columns: number, rows: number, time: number): number {\n const x: number = column * NOISE_SCALE;\n const y: number = row * NOISE_SCALE;\n\n const broad: number = noise(x + time * 0.6, y + time * 0.25);\n const detail: number = noise(x * 2.3 - time * 0.4, y * 2.3 + time * 0.35);\n const field: number = broad * 0.72 + detail * 0.28;\n\n const dx: number = column / columns - 0.5;\n const dy: number = row / rows - 0.5;\n const clearing: number = smoothstep(0.12, 0.42, Math.sqrt(dx * dx + dy * dy));\n\n return field * (0.6 + 0.4 * clearing);\n}\n\n/**\n * Горит ли клетка: плотность сравнивается с порогом, который матрица Байера 4x4 сдвигает по\n * клеткам. Так края облаков выходят рваными, а не гладкими.\n */\nexport function isDotLit(density: number, column: number, row: number): boolean {\n const dither: number = BAYER_4X4[(row % 4) * 4 + (column % 4)];\n\n return density > THRESHOLD + (dither - 0.5) * DITHER_SPREAD;\n}\n","import { DOT_FIELD_CELL, DOT_FIELD_DOT, DOT_FIELD_FRAME_MS, DOT_FIELD_TIME_STEP, dotDensity, isDotLit } from './rt-dot-field.logic';\n\n/**\n * Рисует поле точек на canvas и ведёт его кадры. Окно приходит параметром: класс создаёт\n * компонент, а у этого файла нет внедрения зависимостей.\n */\nexport class RtDotFieldPainter {\n readonly #canvas: HTMLCanvasElement;\n readonly #window: Window;\n readonly #context: CanvasRenderingContext2D | null;\n\n #frameId: number | null = null;\n #lastFrameAt: number = 0;\n #time: number = 0;\n #width: number = 0;\n #height: number = 0;\n\n constructor(canvas: HTMLCanvasElement, windowRef: Window) {\n this.#canvas = canvas;\n this.#window = windowRef;\n this.#context = canvas.getContext('2d');\n }\n\n /** Без 2D-контекста ничего не рисуется; при просьбе о меньшем движении — один кадр. */\n public start(): void {\n if (!this.#context) {\n return;\n }\n\n if (this.#window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n this.#draw(this.#context);\n return;\n }\n\n this.#frameId = this.#window.requestAnimationFrame((now: number): void => this.#tick(now));\n }\n\n public stop(): void {\n if (this.#frameId === null) {\n return;\n }\n\n this.#window.cancelAnimationFrame(this.#frameId);\n this.#frameId = null;\n }\n\n #tick(now: number): void {\n if (this.#context && now - this.#lastFrameAt >= DOT_FIELD_FRAME_MS) {\n this.#lastFrameAt = now;\n this.#time += DOT_FIELD_TIME_STEP;\n this.#draw(this.#context);\n }\n\n this.#frameId = this.#window.requestAnimationFrame((next: number): void => this.#tick(next));\n }\n\n #draw(context: CanvasRenderingContext2D): void {\n this.#resize(context);\n\n context.clearRect(0, 0, this.#width, this.#height);\n // Цвет — вычисленный `color` поля: тема меняет назначение, а canvas принимает только готовый цвет.\n context.fillStyle = this.#window.getComputedStyle(this.#canvas).color;\n\n const columns: number = Math.ceil(this.#width / DOT_FIELD_CELL);\n const rows: number = Math.ceil(this.#height / DOT_FIELD_CELL);\n const offset: number = (DOT_FIELD_CELL - DOT_FIELD_DOT) / 2;\n\n for (let row: number = 0; row < rows; row++) {\n for (let column: number = 0; column < columns; column++) {\n if (isDotLit(dotDensity(column, row, columns, rows, this.#time), column, row)) {\n context.fillRect(column * DOT_FIELD_CELL + offset, row * DOT_FIELD_CELL + offset, DOT_FIELD_DOT, DOT_FIELD_DOT);\n }\n }\n }\n }\n\n /** Холст следует размеру родителя и плотности точек экрана. */\n #resize(context: CanvasRenderingContext2D): void {\n const width: number = this.#canvas.clientWidth;\n const height: number = this.#canvas.clientHeight;\n if (width === this.#width && height === this.#height) {\n return;\n }\n\n const ratio: number = this.#window.devicePixelRatio || 1;\n this.#width = width;\n this.#height = height;\n this.#canvas.width = Math.round(width * ratio);\n this.#canvas.height = Math.round(height * ratio);\n context.setTransform(ratio, 0, 0, ratio, 0, 0);\n }\n}\n","import {\n afterNextRender,\n inject,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, WINDOW } from '@rt-tools/core';\n\nimport { RtDotFieldPainter } from './rt-dot-field.painter';\n\nconst BEM_BLOCK: string = 'rt-dot-field';\n\n/**\n * Фон из квадратных точек, которые медленно плывут облаками. Заполняет позиционированного\n * родителя и стоит под его содержимым; в центре точки редеют. Цвет — CSS-свойство `color` хоста.\n */\n@Component({\n selector: 'rt-dot-field',\n templateUrl: './rt-dot-field.component.html',\n styleUrl: './rt-dot-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtDotFieldComponent {\n readonly #window: Window = inject(WINDOW);\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n /** `viewChild` не принимает поле с решёткой. */\n protected readonly canvas: Signal<ElementRef<HTMLCanvasElement>> = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\n\n constructor() {\n afterNextRender((): void => {\n const painter: RtDotFieldPainter = new RtDotFieldPainter(this.canvas().nativeElement, this.#window);\n painter.start();\n this.#destroyRef.onDestroy((): void => painter.stop());\n });\n }\n}\n","<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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import * as i0 from '@angular/core';
2
+ import { computed, input, output, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { BlockDirective, ElemDirective } from '@rt-tools/core';
4
+ import { rtKitLabel } from '@rt-tools/ui-kit-v2/core';
5
+ import { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';
6
+
7
+ const BEM_BLOCK = 'rt-download-link';
8
+ class RtDownloadLinkComponent {
9
+ constructor() {
10
+ /**
11
+ * Подпись для скринридера: имя файла подставляется в неё, поэтому карты
12
+ * подписей ей мало — параметр приходит из входа.
13
+ */
14
+ this.downloadAriaLabel = rtKitLabel('uiDownloadFile', computed(() => ({ name: this.label() })));
15
+ this.label = input.required(/* @ts-ignore */
16
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
17
+ this.downloadClick = output();
18
+ }
19
+ onClick() {
20
+ this.downloadClick.emit();
21
+ }
22
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDownloadLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: RtDownloadLinkComponent, isStandalone: true, selector: "rt-download-link", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { downloadClick: "downloadClick" }, host: { classAttribute: "rt-download-link" }, ngImport: i0, template: "<ng-container rtBlock=\"rt-download-link\">\n <button rtElem=\"button\" qa-dataid=\"download-link-button\" type=\"button\" [attr.aria-label]=\"downloadAriaLabel()\" (click)=\"onClick()\">\n <rt-icon rtElem=\"icon\" name=\"ico-download\" size=\"md\" />\n <span rtElem=\"label\" qa-dataid=\"download-link-label\">{{ label() }}</span>\n </button>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-download-link{--rt-download-link-focus-radius: var(--rt-radius-sm);--rt-download-link-focus-shadow: var(--rt-shadow-focus-ring);display:inline-flex}.rt-download-link__button{display:inline-flex;align-items:center;padding:0;border:0;background:transparent;color:var(--rt-color-text-link);cursor:pointer;font-family:var(--rt-font-family-sans);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-medium);gap:var(--rt-space-sm);line-height:var(--rt-leading-snug)}.rt-download-link__button:hover{text-decoration:underline}.rt-download-link__button:focus-visible{border-radius:var(--rt-download-link-focus-radius);box-shadow:var(--rt-download-link-focus-shadow);outline:none}.rt-download-link__icon{color:var(--rt-color-text-link)}}\n"], dependencies: [{ kind: "component", type:
24
+ // standalone components / directives
25
+ RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "size", "color", "fill", "spin", "rotate"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
26
+ }
27
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDownloadLinkComponent, decorators: [{
28
+ type: Component,
29
+ args: [{ selector: 'rt-download-link', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
30
+ // standalone components / directives
31
+ RtIconComponent,
32
+ BlockDirective,
33
+ ElemDirective,
34
+ ], host: {
35
+ class: BEM_BLOCK,
36
+ }, template: "<ng-container rtBlock=\"rt-download-link\">\n <button rtElem=\"button\" qa-dataid=\"download-link-button\" type=\"button\" [attr.aria-label]=\"downloadAriaLabel()\" (click)=\"onClick()\">\n <rt-icon rtElem=\"icon\" name=\"ico-download\" size=\"md\" />\n <span rtElem=\"label\" qa-dataid=\"download-link-label\">{{ label() }}</span>\n </button>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-download-link{--rt-download-link-focus-radius: var(--rt-radius-sm);--rt-download-link-focus-shadow: var(--rt-shadow-focus-ring);display:inline-flex}.rt-download-link__button{display:inline-flex;align-items:center;padding:0;border:0;background:transparent;color:var(--rt-color-text-link);cursor:pointer;font-family:var(--rt-font-family-sans);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-medium);gap:var(--rt-space-sm);line-height:var(--rt-leading-snug)}.rt-download-link__button:hover{text-decoration:underline}.rt-download-link__button:focus-visible{border-radius:var(--rt-download-link-focus-radius);box-shadow:var(--rt-download-link-focus-shadow);outline:none}.rt-download-link__icon{color:var(--rt-color-text-link)}}\n"] }]
37
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], downloadClick: [{ type: i0.Output, args: ["downloadClick"] }] } });
38
+
39
+ /**
40
+ * Generated bundle index. Do not edit.
41
+ */
42
+
43
+ export { RtDownloadLinkComponent };
44
+ //# sourceMappingURL=rt-tools-ui-kit-v2-download-link.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-download-link.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/download-link/rt-download-link.component.ts","../../../projects/ui-kit-v2/src/lib/components/download-link/rt-download-link.component.html","../../../projects/ui-kit-v2/src/lib/components/download-link/rt-tools-ui-kit-v2-download-link.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n output,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { TRtKitLabelParams, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\n\nconst BEM_BLOCK: string = 'rt-download-link';\n\n@Component({\n selector: 'rt-download-link',\n templateUrl: './rt-download-link.component.html',\n styleUrl: './rt-download-link.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtDownloadLinkComponent {\n /**\n * Подпись для скринридера: имя файла подставляется в неё, поэтому карты\n * подписей ей мало — параметр приходит из входа.\n */\n protected readonly downloadAriaLabel: Signal<string> = rtKitLabel(\n 'uiDownloadFile',\n computed((): TRtKitLabelParams => ({ name: this.label() }))\n );\n\n public readonly label: InputSignal<string> = input.required<string>();\n\n public readonly downloadClick: OutputEmitterRef<void> = output<void>();\n\n protected onClick(): void {\n this.downloadClick.emit();\n }\n}\n","<ng-container rtBlock=\"rt-download-link\">\n <button rtElem=\"button\" qa-dataid=\"download-link-button\" type=\"button\" [attr.aria-label]=\"downloadAriaLabel()\" (click)=\"onClick()\">\n <rt-icon rtElem=\"icon\" name=\"ico-download\" size=\"md\" />\n <span rtElem=\"label\" qa-dataid=\"download-link-label\">{{ label() }}</span>\n </button>\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAiBA,MAAM,SAAS,GAAW,kBAAkB;MAkB/B,uBAAuB,CAAA;AAhBpC,IAAA,WAAA,GAAA;AAiBI;;;AAGG;QACgB,IAAA,CAAA,iBAAiB,GAAmB,UAAU,CAC7D,gBAAgB,EAChB,QAAQ,CAAC,OAA0B,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAC9D;QAEe,IAAA,CAAA,KAAK,GAAwB,KAAK,CAAC,QAAQ;kFAAU;QAErD,IAAA,CAAA,aAAa,GAA2B,MAAM,EAAQ;AAKzE,IAAA;IAHa,OAAO,GAAA;AACb,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;IAC7B;8GAhBS,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,0SCnCpC,gYAMA,EAAA,MAAA,EAAA,CAAA,mxBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA;;gBDqBQ,eAAe,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,cAAc,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAMR,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAhBnC,SAAS;+BACI,kBAAkB,EAAA,eAAA,EAGX,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;;wBAEL,eAAe;wBACf,cAAc;wBACd,aAAa;qBAChB,EAAA,IAAA,EACK;AACF,wBAAA,KAAK,EAAE,SAAS;AACnB,qBAAA,EAAA,QAAA,EAAA,gYAAA,EAAA,MAAA,EAAA,CAAA,mxBAAA,CAAA,EAAA;;;AEjCL;;AAEG;;;;"}
@@ -0,0 +1,260 @@
1
+ import { NgTemplateOutlet } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, TemplateRef, Directive, DestroyRef, contentChild, computed, input, booleanAttribute, numberAttribute, output, effect, untracked, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
4
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
+ import * as i1 from '@angular/forms';
6
+ import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
7
+ import { map, filter } from 'rxjs';
8
+ import { BlockDirective, ElemDirective } from '@rt-tools/core';
9
+ import { RT_KIT_LABELS, rtKitLabel, searchDebounce } from '@rt-tools/ui-kit-v2/core';
10
+ import { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';
11
+ import { RtCheckboxComponent } from '@rt-tools/ui-kit-v2/checkbox';
12
+ import { RtEmptyStateComponent } from '@rt-tools/ui-kit-v2/empty-state';
13
+ import { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';
14
+ import { RtInputComponent } from '@rt-tools/ui-kit-v2/input';
15
+ import { RtPaginationComponent } from '@rt-tools/ui-kit-v2/pagination';
16
+ import { RtSpinnerComponent } from '@rt-tools/ui-kit-v2/spinner';
17
+
18
+ /**
19
+ * Маркеры частей панели инструментов — своим файлом, как у соседних семей.
20
+ *
21
+ * В имени класса стоит слово «Toolbar», хотя в разметке его нет: имя `RtDynamicListSelectorsDirective`
22
+ * в дереве уже занято первым китом, и там оно означает другое — проводку состояния списка, а не
23
+ * маркер стороны полосы. Два одинаковых имени в двух китах проверка дерева не пропускает.
24
+ *
25
+ * Каждый маркер держит свой шаблон и о списке не знает ничего: список читает маркеры среди своего
26
+ * содержимого и берёт у них шаблон. Часть, которую потребитель не объявил, для списка просто
27
+ * отсутствует.
28
+ */
29
+ /**
30
+ * Левая сторона панели: то, чем человек отбирает записи.
31
+ *
32
+ * @example
33
+ * ```html
34
+ * <rt-dynamic-list>
35
+ * <ng-container *rtDynamicListSelectors>
36
+ * <rt-select [options]="stages()" />
37
+ * </ng-container>
38
+ * </rt-dynamic-list>
39
+ * ```
40
+ */
41
+ class RtDynamicListToolbarSelectorsDirective {
42
+ constructor() {
43
+ this.templateRef = inject(TemplateRef);
44
+ }
45
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDynamicListToolbarSelectorsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
46
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: RtDynamicListToolbarSelectorsDirective, isStandalone: true, selector: "[rtDynamicListSelectors]", ngImport: i0 }); }
47
+ }
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDynamicListToolbarSelectorsDirective, decorators: [{
49
+ type: Directive,
50
+ args: [{
51
+ selector: '[rtDynamicListSelectors]',
52
+ }]
53
+ }] });
54
+ /** Правая сторона панели: действия над разделом. Поле поиска стоит после них и остаётся за семьёй. */
55
+ class RtDynamicListToolbarActionsDirective {
56
+ constructor() {
57
+ this.templateRef = inject(TemplateRef);
58
+ }
59
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDynamicListToolbarActionsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
60
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: RtDynamicListToolbarActionsDirective, isStandalone: true, selector: "[rtDynamicListActions]", ngImport: i0 }); }
61
+ }
62
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDynamicListToolbarActionsDirective, decorators: [{
63
+ type: Directive,
64
+ args: [{
65
+ selector: '[rtDynamicListActions]',
66
+ }]
67
+ }] });
68
+
69
+ const BEM_BLOCK = 'rt-dynamic-list';
70
+ /**
71
+ * Размеры страницы, которые предлагает полоса страниц. Семья передаёт их полосе сама: по наименьшему
72
+ * из них она решает, рисовать ли полосу, и то же решение принимает полоса у себя.
73
+ */
74
+ const PER_PAGE_OPTIONS = [20, 50, 100];
75
+ /**
76
+ * Список записей со своей панелью инструментов.
77
+ *
78
+ * Полосу панели семья раскладывает сама, а не зовёт `rt-toolbar`: у того стороны объявлены
79
+ * нешринкующимися, и на хозяине уже́ содержимого полоса раздаётся шире него и уезжает за край.
80
+ * Семья кладёт в полосу готовые части кита — поле, кнопки, флажок, — а строит её сама.
81
+ *
82
+ * Семья ничего не рисует сама: поиск — поле кита, действия — его кнопки со значком, пустое место —
83
+ * его пустое состояние, страницы — его нумерация. Сами записи проецируются: таблица между панелью
84
+ * и страницами — потребителя, с его колонками, ячейками и действиями строки.
85
+ *
86
+ * Договорённость — `docs/specs/ui-kit-v2/dynamic-list/`.
87
+ */
88
+ class RtDynamicListComponent {
89
+ #destroyRef;
90
+ /**
91
+ * Последнее, что знают и потребитель, и поле: отправленное потребителю или поставленное им самим.
92
+ * Одно и то же дважды не спрашивается, а поставленное потребителем не возвращается ему эхом.
93
+ */
94
+ #lastSearch;
95
+ constructor() {
96
+ this.#destroyRef = inject(DestroyRef);
97
+ /**
98
+ * Последнее, что знают и потребитель, и поле: отправленное потребителю или поставленное им самим.
99
+ * Одно и то же дважды не спрашивается, а поставленное потребителем не возвращается ему эхом.
100
+ */
101
+ this.#lastSearch = '';
102
+ this.t = inject(RT_KIT_LABELS);
103
+ this.searchControl = new FormControl('', { nonNullable: true });
104
+ this.perPageOptions = PER_PAGE_OPTIONS;
105
+ this.selectorsTpl = contentChild(RtDynamicListToolbarSelectorsDirective, /* @ts-ignore */
106
+ ...(ngDevMode ? [{ debugName: "selectorsTpl" }] : /* istanbul ignore next */ []));
107
+ this.actionsTpl = contentChild(RtDynamicListToolbarActionsDirective, /* @ts-ignore */
108
+ ...(ngDevMode ? [{ debugName: "actionsTpl" }] : /* istanbul ignore next */ []));
109
+ /** «Выбрано: N» — подпись с подстановкой, потому её берут не из карты, а вызовом. */
110
+ this.selectedLabel = rtKitLabel('uiSelectedCount', computed(() => ({ count: this.selectedCount() })));
111
+ /** Отчего пусто. Отбор стоит — значит, записи убрал он, и человеку показывают дорогу назад. */
112
+ this.emptyReason = computed(() => this.filtered() ? 'filter' : 'section', /* @ts-ignore */
113
+ ...(ngDevMode ? [{ debugName: "emptyReason" }] : /* istanbul ignore next */ []));
114
+ /** Значок пустого места: под отбором — лупа, у пустого раздела — лоток. */
115
+ this.emptyIcon = computed(() => this.emptyReason() === 'filter' ? 'search' : 'inbox', /* @ts-ignore */
116
+ ...(ngDevMode ? [{ debugName: "emptyIcon" }] : /* istanbul ignore next */ []));
117
+ /** Подпись пустого места. Своя подпись потребителя сильнее обеих подписей кита. */
118
+ this.emptyTitleText = computed(() => {
119
+ if (this.emptyTitle()) {
120
+ return this.emptyTitle();
121
+ }
122
+ return this.emptyReason() === 'filter' ? this.t().uiNothingFound : this.t().uiNoRows;
123
+ }, /* @ts-ignore */
124
+ ...(ngDevMode ? [{ debugName: "emptyTitleText" }] : /* istanbul ignore next */ []));
125
+ /**
126
+ * Полоса страниц рисуется, пока записей больше наименьшего размера страницы — то же правило, что у
127
+ * самой полосы. Число страниц при нынешнем размере тут не решает: выбравший крупный размер, при
128
+ * котором всё легло на одну страницу, иначе терял вместе с полосой и дорогу к размеру поменьше.
129
+ */
130
+ this.isPaginationShown = computed(() => {
131
+ const page = this.pageModel();
132
+ if (!page || this.empty()) {
133
+ return false;
134
+ }
135
+ return page.totalCount > Math.min(...PER_PAGE_OPTIONS);
136
+ }, /* @ts-ignore */
137
+ ...(ngDevMode ? [{ debugName: "isPaginationShown" }] : /* istanbul ignore next */ []));
138
+ /**
139
+ * Есть ли в панели хоть что-нибудь. Полоса без единой части — это отступ над записями, и
140
+ * место она забирает у них.
141
+ */
142
+ this.isToolbarShown = computed(() => [
143
+ this.showSearch(),
144
+ this.showRefresh(),
145
+ this.showClearFilters(),
146
+ this.showColumnSettings(),
147
+ this.selectable(),
148
+ !!this.selectorsTpl(),
149
+ !!this.actionsTpl(),
150
+ ].some((part) => part), /* @ts-ignore */
151
+ ...(ngDevMode ? [{ debugName: "isToolbarShown" }] : /* istanbul ignore next */ []));
152
+ /** Записи проецируются, и о числе страниц семья узнаёт только из модели страницы. */
153
+ this.pageModel = input(null, /* @ts-ignore */
154
+ ...(ngDevMode ? [{ debugName: "pageModel" }] : /* istanbul ignore next */ []));
155
+ /** Первая загрузка: вместо всего содержимого стоит вертушка. */
156
+ this.loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
157
+ /** Подгрузка поверх нарисованного: записи остаются на месте, вертушка стоит над ними. */
158
+ this.fetching = input(false, { ...(ngDevMode ? { debugName: "fetching" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
159
+ /** Записей нет вовсе. От пустого ответа под отбором отличается входом `filtered`. */
160
+ this.empty = input(false, { ...(ngDevMode ? { debugName: "empty" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
161
+ /** Отбор стоит. Вместе с `empty` даёт вторую причину пустоты — ту, у которой есть дорога назад. */
162
+ this.filtered = input(false, { ...(ngDevMode ? { debugName: "filtered" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
163
+ /** Кнопка сброса отбора: показана у раздела с отбором, выключена, пока сбрасывать нечего. */
164
+ this.showClearFilters = input(false, { ...(ngDevMode ? { debugName: "showClearFilters" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
165
+ this.showRefresh = input(false, { ...(ngDevMode ? { debugName: "showRefresh" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
166
+ this.showColumnSettings = input(false, { ...(ngDevMode ? { debugName: "showColumnSettings" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
167
+ this.showSearch = input(true, { ...(ngDevMode ? { debugName: "showSearch" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
168
+ /** Выбор записей: флажок «выбрать все» и счётчик выбранного на левой стороне панели. */
169
+ this.selectable = input(false, { ...(ngDevMode ? { debugName: "selectable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
170
+ this.allSelected = input(false, { ...(ngDevMode ? { debugName: "allSelected" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
171
+ this.someSelected = input(false, { ...(ngDevMode ? { debugName: "someSelected" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
172
+ this.selectAllDisabled = input(false, { ...(ngDevMode ? { debugName: "selectAllDisabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
173
+ this.selectedCount = input(0, { ...(ngDevMode ? { debugName: "selectedCount" } : /* istanbul ignore next */ {}), transform: numberAttribute });
174
+ this.emptyTitle = input('', /* @ts-ignore */
175
+ ...(ngDevMode ? [{ debugName: "emptyTitle" }] : /* istanbul ignore next */ []));
176
+ this.emptyDescription = input(null, /* @ts-ignore */
177
+ ...(ngDevMode ? [{ debugName: "emptyDescription" }] : /* istanbul ignore next */ []));
178
+ /** Поиск потребителя: поле следует за ним при каждой смене и потребителю его не возвращает. */
179
+ this.searchTerm = input('', /* @ts-ignore */
180
+ ...(ngDevMode ? [{ debugName: "searchTerm" }] : /* istanbul ignore next */ []));
181
+ this.searchChange = output();
182
+ this.refreshed = output();
183
+ this.filtersCleared = output();
184
+ this.columnSettingsOpened = output();
185
+ this.pageChange = output();
186
+ this.perPageChange = output();
187
+ this.allSelectedChange = output();
188
+ // Поиск потребителя ставится в поле, только когда он отличается от последнего, что список
189
+ // отправил или поставил сам. Эхо отправленного — даже запоздалое, когда человек уже дописал
190
+ // дальше, — поле не трогает: иначе оно стирало бы набранное и сбивало каретку.
191
+ effect(() => {
192
+ const term = this.searchTerm() ?? '';
193
+ untracked(() => {
194
+ if (term.trim() === this.#lastSearch) {
195
+ return;
196
+ }
197
+ this.#lastSearch = term.trim();
198
+ this.searchControl.setValue(term, { emitEvent: false });
199
+ });
200
+ });
201
+ }
202
+ ngOnInit() {
203
+ // Дебаунс непустого ввода; очистка крестиком применяется сразу — так же, как в списке
204
+ // переписок: оператор один на кит, и два разных ожидания разошлись бы молча.
205
+ this.searchControl.valueChanges
206
+ .pipe(map((value) => value.trim()), searchDebounce(),
207
+ // Набранное, которое потребитель или сброс отбора успели заменить, уже не в поле.
208
+ filter((value) => value === this.searchControl.value.trim()), filter((value) => value !== this.#lastSearch), takeUntilDestroyed(this.#destroyRef))
209
+ .subscribe((value) => {
210
+ this.#lastSearch = value;
211
+ this.searchChange.emit(value);
212
+ });
213
+ }
214
+ onSelectAll(checked) {
215
+ this.allSelectedChange.emit(checked);
216
+ }
217
+ /**
218
+ * Сброс отбора снимает и поиск: пустой ответ под поиском — тоже ответ под отбором, и дорога назад
219
+ * без очистки поля вела бы к тому же пустому ответу. Поле очищается молча: `filtersCleared`
220
+ * уже значит «и поиск снят», и отдельный пустой `searchChange` заставил бы потребителя
221
+ * запрашивать список дважды.
222
+ */
223
+ onClearFilters() {
224
+ this.#lastSearch = '';
225
+ this.searchControl.setValue('', { emitEvent: false });
226
+ this.filtersCleared.emit();
227
+ }
228
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDynamicListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
229
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtDynamicListComponent, isStandalone: true, selector: "rt-dynamic-list", inputs: { pageModel: { classPropertyName: "pageModel", publicName: "pageModel", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, fetching: { classPropertyName: "fetching", publicName: "fetching", isSignal: true, isRequired: false, transformFunction: null }, empty: { classPropertyName: "empty", publicName: "empty", isSignal: true, isRequired: false, transformFunction: null }, filtered: { classPropertyName: "filtered", publicName: "filtered", isSignal: true, isRequired: false, transformFunction: null }, showClearFilters: { classPropertyName: "showClearFilters", publicName: "showClearFilters", isSignal: true, isRequired: false, transformFunction: null }, showRefresh: { classPropertyName: "showRefresh", publicName: "showRefresh", isSignal: true, isRequired: false, transformFunction: null }, showColumnSettings: { classPropertyName: "showColumnSettings", publicName: "showColumnSettings", isSignal: true, isRequired: false, transformFunction: null }, showSearch: { classPropertyName: "showSearch", publicName: "showSearch", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, allSelected: { classPropertyName: "allSelected", publicName: "allSelected", isSignal: true, isRequired: false, transformFunction: null }, someSelected: { classPropertyName: "someSelected", publicName: "someSelected", isSignal: true, isRequired: false, transformFunction: null }, selectAllDisabled: { classPropertyName: "selectAllDisabled", publicName: "selectAllDisabled", isSignal: true, isRequired: false, transformFunction: null }, selectedCount: { classPropertyName: "selectedCount", publicName: "selectedCount", isSignal: true, isRequired: false, transformFunction: null }, emptyTitle: { classPropertyName: "emptyTitle", publicName: "emptyTitle", isSignal: true, isRequired: false, transformFunction: null }, emptyDescription: { classPropertyName: "emptyDescription", publicName: "emptyDescription", isSignal: true, isRequired: false, transformFunction: null }, searchTerm: { classPropertyName: "searchTerm", publicName: "searchTerm", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { searchChange: "searchChange", refreshed: "refreshed", filtersCleared: "filtersCleared", columnSettingsOpened: "columnSettingsOpened", pageChange: "pageChange", perPageChange: "perPageChange", allSelectedChange: "allSelectedChange" }, host: { classAttribute: "rt-dynamic-list" }, queries: [{ propertyName: "selectorsTpl", first: true, predicate: RtDynamicListToolbarSelectorsDirective, descendants: true, isSignal: true }, { propertyName: "actionsTpl", first: true, predicate: RtDynamicListToolbarActionsDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container rtBlock=\"rt-dynamic-list\">\n @if (loading()) {\n <div rtElem=\"loader\" qa-dataid=\"dynamic-list-loader\">\n <rt-spinner />\n </div>\n } @else {\n @if (fetching()) {\n <div rtElem=\"veil\" qa-dataid=\"dynamic-list-veil\">\n <rt-spinner />\n </div>\n }\n\n @if (isToolbarShown()) {\n <div rtElem=\"toolbar\" qa-dataid=\"dynamic-list-toolbar\">\n @if (selectable() || selectorsTpl()) {\n <div rtElem=\"selectors\" qa-dataid=\"dynamic-list-selectors\">\n @if (selectable()) {\n <rt-checkbox\n qa-dataid=\"dynamic-list-select-all\"\n [ariaLabel]=\"t().uiSelectAll\"\n [ngModel]=\"allSelected()\"\n [indeterminate]=\"!allSelected() && someSelected()\"\n [disabled]=\"selectAllDisabled()\"\n (ngModelChange)=\"onSelectAll($event)\" />\n\n @if (selectedCount()) {\n <span rtElem=\"counter\" qa-dataid=\"dynamic-list-selected-count\">\n {{ selectedLabel() }}\n </span>\n }\n }\n\n @if (selectorsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n </div>\n }\n\n <div rtElem=\"right\" qa-dataid=\"dynamic-list-right\">\n <div rtElem=\"actions\">\n @if (actionsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n\n @if (showClearFilters()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-clear-filters\"\n icon=\"filter-slash\"\n size=\"sm\"\n [ariaLabel]=\"t().uiClearFilters\"\n [tooltip]=\"t().uiClearFilters\"\n [disabled]=\"!filtered()\"\n (clicked)=\"onClearFilters()\" />\n }\n\n @if (showRefresh()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-refresh\"\n icon=\"refresh\"\n size=\"sm\"\n [ariaLabel]=\"t().uiRefresh\"\n [tooltip]=\"t().uiRefresh\"\n (clicked)=\"refreshed.emit()\" />\n }\n\n @if (showColumnSettings()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-column-settings\"\n icon=\"sliders-v\"\n size=\"sm\"\n [ariaLabel]=\"t().uiColumnSettings\"\n [tooltip]=\"t().uiColumnSettings\"\n (clicked)=\"columnSettingsOpened.emit()\" />\n }\n </div>\n\n @if (showSearch()) {\n <div rtElem=\"search\">\n <rt-input\n qa-dataid=\"dynamic-list-search\"\n iconLeft=\"search\"\n [placeholder]=\"t().uiSearch\"\n [formControl]=\"searchControl\" />\n </div>\n }\n </div>\n </div>\n }\n\n @if (empty()) {\n <rt-empty-state\n rtElem=\"empty\"\n qa-dataid=\"dynamic-list-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyTitleText()\"\n [description]=\"emptyDescription()\">\n @if (emptyReason() === 'filter') {\n <button\n rtButton\n qa-dataid=\"dynamic-list-empty-clear\"\n type=\"button\"\n icon=\"filter-slash\"\n appearance=\"outlined\"\n size=\"sm\"\n [label]=\"t().uiClearFilters\"\n [attr.aria-label]=\"t().uiClearFilters\"\n (click)=\"onClearFilters()\"></button>\n }\n </rt-empty-state>\n } @else {\n <div rtElem=\"content\" qa-dataid=\"dynamic-list-content\">\n <ng-content />\n </div>\n\n @if (isPaginationShown()) {\n <rt-pagination\n rtElem=\"pagination\"\n qa-dataid=\"dynamic-list-pagination\"\n [pageModel]=\"pageModel()!\"\n [perPageOptions]=\"perPageOptions\"\n [loading]=\"fetching()\"\n (pageChange)=\"pageChange.emit($event)\"\n (perPageChange)=\"perPageChange.emit($event)\" />\n }\n }\n }\n</ng-container>\n", styles: ["@layer rt-kit.components{.rt-dynamic-list{--rt-dynamic-list-gap: var(--rt-space-4);--rt-dynamic-list-search-width: var(--rt-size-64);--rt-dynamic-list-veil-bg: var(--rt-color-bg-surface);position:relative;display:flex;flex-direction:column;block-size:100%;gap:var(--rt-dynamic-list-gap);inline-size:100%;min-block-size:0}.rt-dynamic-list__loader{display:flex;flex:1 1 auto;align-items:center;justify-content:center;padding:var(--rt-space-8)}.rt-dynamic-list__veil{position:absolute;z-index:1;display:flex;align-items:center;justify-content:center;background-color:color-mix(in srgb,var(--rt-dynamic-list-veil-bg) 60%,transparent);inset:0}.rt-dynamic-list__toolbar{display:flex;flex:0 0 auto;flex-wrap:wrap;align-items:center;gap:var(--rt-space-2);min-inline-size:0}.rt-dynamic-list__selectors{display:flex;flex:0 1 auto;align-items:center;gap:var(--rt-space-2);min-inline-size:0}.rt-dynamic-list__counter{color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-dynamic-list__right{display:flex;flex:1 1 auto;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:var(--rt-space-2);min-inline-size:0}.rt-dynamic-list__actions{display:flex;flex:0 0 auto;align-items:center;gap:var(--rt-space-1)}.rt-dynamic-list__search{flex:1 1 auto;max-inline-size:var(--rt-dynamic-list-search-width);min-inline-size:0}.rt-dynamic-list__content{display:flex;overflow:auto;flex:1 1 auto;flex-direction:column;isolation:isolate;min-block-size:0}.rt-dynamic-list__empty{flex:1 1 auto}.rt-dynamic-list__pagination{flex:0 0 auto}@media(width<=1080px){.rt-dynamic-list__right{flex-wrap:wrap}.rt-dynamic-list__search{max-inline-size:none}}}\n"], dependencies: [{ kind: "directive", type:
230
+ // Angular
231
+ NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type:
232
+ // standalone components / directives
233
+ RtButtonDirective, selector: "button[rtButton], a[rtButton]", inputs: ["label", "icon", "iconPos", "theme", "appearance", "size", "loading", "loadingIcon", "loadingLabel", "pressed"] }, { kind: "component", type: RtCheckboxComponent, selector: "rt-checkbox", inputs: ["inputId", "ariaLabel", "disabled", "indeterminate"] }, { kind: "component", type: RtEmptyStateComponent, selector: "rt-empty-state", inputs: ["icon", "glyph", "title", "description", "framed"] }, { kind: "component", type: RtIconButtonComponent, selector: "rt-icon-button", inputs: ["icon", "glyph", "ariaLabel", "variant", "iconColor", "iconFill", "size", "iconSize", "type", "tooltip", "tabIndex", "loading", "disabled", "active", "indicator"], outputs: ["clicked"] }, { kind: "component", type: RtInputComponent, selector: "rt-input", inputs: ["appearance", "type", "placeholder", "iconLeft", "iconRight", "passwordToggle", "autocomplete"] }, { kind: "component", type: RtPaginationComponent, selector: "rt-pagination", inputs: ["pageModel", "perPageOptions", "prevIcon", "nextIcon", "numbering", "loading"], outputs: ["pageChange", "perPageChange"] }, { kind: "component", type: RtSpinnerComponent, selector: "rt-spinner", inputs: ["diameter", "color", "appearance", "overlay", "backdrop", "plate"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
234
+ }
235
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDynamicListComponent, decorators: [{
236
+ type: Component,
237
+ args: [{ selector: 'rt-dynamic-list', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
238
+ // Angular
239
+ NgTemplateOutlet,
240
+ FormsModule,
241
+ ReactiveFormsModule,
242
+ // standalone components / directives
243
+ RtButtonDirective,
244
+ RtCheckboxComponent,
245
+ RtEmptyStateComponent,
246
+ RtIconButtonComponent,
247
+ RtInputComponent,
248
+ RtPaginationComponent,
249
+ RtSpinnerComponent,
250
+ BlockDirective,
251
+ ElemDirective,
252
+ ], host: { class: BEM_BLOCK }, template: "<ng-container rtBlock=\"rt-dynamic-list\">\n @if (loading()) {\n <div rtElem=\"loader\" qa-dataid=\"dynamic-list-loader\">\n <rt-spinner />\n </div>\n } @else {\n @if (fetching()) {\n <div rtElem=\"veil\" qa-dataid=\"dynamic-list-veil\">\n <rt-spinner />\n </div>\n }\n\n @if (isToolbarShown()) {\n <div rtElem=\"toolbar\" qa-dataid=\"dynamic-list-toolbar\">\n @if (selectable() || selectorsTpl()) {\n <div rtElem=\"selectors\" qa-dataid=\"dynamic-list-selectors\">\n @if (selectable()) {\n <rt-checkbox\n qa-dataid=\"dynamic-list-select-all\"\n [ariaLabel]=\"t().uiSelectAll\"\n [ngModel]=\"allSelected()\"\n [indeterminate]=\"!allSelected() && someSelected()\"\n [disabled]=\"selectAllDisabled()\"\n (ngModelChange)=\"onSelectAll($event)\" />\n\n @if (selectedCount()) {\n <span rtElem=\"counter\" qa-dataid=\"dynamic-list-selected-count\">\n {{ selectedLabel() }}\n </span>\n }\n }\n\n @if (selectorsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n </div>\n }\n\n <div rtElem=\"right\" qa-dataid=\"dynamic-list-right\">\n <div rtElem=\"actions\">\n @if (actionsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n\n @if (showClearFilters()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-clear-filters\"\n icon=\"filter-slash\"\n size=\"sm\"\n [ariaLabel]=\"t().uiClearFilters\"\n [tooltip]=\"t().uiClearFilters\"\n [disabled]=\"!filtered()\"\n (clicked)=\"onClearFilters()\" />\n }\n\n @if (showRefresh()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-refresh\"\n icon=\"refresh\"\n size=\"sm\"\n [ariaLabel]=\"t().uiRefresh\"\n [tooltip]=\"t().uiRefresh\"\n (clicked)=\"refreshed.emit()\" />\n }\n\n @if (showColumnSettings()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-column-settings\"\n icon=\"sliders-v\"\n size=\"sm\"\n [ariaLabel]=\"t().uiColumnSettings\"\n [tooltip]=\"t().uiColumnSettings\"\n (clicked)=\"columnSettingsOpened.emit()\" />\n }\n </div>\n\n @if (showSearch()) {\n <div rtElem=\"search\">\n <rt-input\n qa-dataid=\"dynamic-list-search\"\n iconLeft=\"search\"\n [placeholder]=\"t().uiSearch\"\n [formControl]=\"searchControl\" />\n </div>\n }\n </div>\n </div>\n }\n\n @if (empty()) {\n <rt-empty-state\n rtElem=\"empty\"\n qa-dataid=\"dynamic-list-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyTitleText()\"\n [description]=\"emptyDescription()\">\n @if (emptyReason() === 'filter') {\n <button\n rtButton\n qa-dataid=\"dynamic-list-empty-clear\"\n type=\"button\"\n icon=\"filter-slash\"\n appearance=\"outlined\"\n size=\"sm\"\n [label]=\"t().uiClearFilters\"\n [attr.aria-label]=\"t().uiClearFilters\"\n (click)=\"onClearFilters()\"></button>\n }\n </rt-empty-state>\n } @else {\n <div rtElem=\"content\" qa-dataid=\"dynamic-list-content\">\n <ng-content />\n </div>\n\n @if (isPaginationShown()) {\n <rt-pagination\n rtElem=\"pagination\"\n qa-dataid=\"dynamic-list-pagination\"\n [pageModel]=\"pageModel()!\"\n [perPageOptions]=\"perPageOptions\"\n [loading]=\"fetching()\"\n (pageChange)=\"pageChange.emit($event)\"\n (perPageChange)=\"perPageChange.emit($event)\" />\n }\n }\n }\n</ng-container>\n", styles: ["@layer rt-kit.components{.rt-dynamic-list{--rt-dynamic-list-gap: var(--rt-space-4);--rt-dynamic-list-search-width: var(--rt-size-64);--rt-dynamic-list-veil-bg: var(--rt-color-bg-surface);position:relative;display:flex;flex-direction:column;block-size:100%;gap:var(--rt-dynamic-list-gap);inline-size:100%;min-block-size:0}.rt-dynamic-list__loader{display:flex;flex:1 1 auto;align-items:center;justify-content:center;padding:var(--rt-space-8)}.rt-dynamic-list__veil{position:absolute;z-index:1;display:flex;align-items:center;justify-content:center;background-color:color-mix(in srgb,var(--rt-dynamic-list-veil-bg) 60%,transparent);inset:0}.rt-dynamic-list__toolbar{display:flex;flex:0 0 auto;flex-wrap:wrap;align-items:center;gap:var(--rt-space-2);min-inline-size:0}.rt-dynamic-list__selectors{display:flex;flex:0 1 auto;align-items:center;gap:var(--rt-space-2);min-inline-size:0}.rt-dynamic-list__counter{color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-dynamic-list__right{display:flex;flex:1 1 auto;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:var(--rt-space-2);min-inline-size:0}.rt-dynamic-list__actions{display:flex;flex:0 0 auto;align-items:center;gap:var(--rt-space-1)}.rt-dynamic-list__search{flex:1 1 auto;max-inline-size:var(--rt-dynamic-list-search-width);min-inline-size:0}.rt-dynamic-list__content{display:flex;overflow:auto;flex:1 1 auto;flex-direction:column;isolation:isolate;min-block-size:0}.rt-dynamic-list__empty{flex:1 1 auto}.rt-dynamic-list__pagination{flex:0 0 auto}@media(width<=1080px){.rt-dynamic-list__right{flex-wrap:wrap}.rt-dynamic-list__search{max-inline-size:none}}}\n"] }]
253
+ }], ctorParameters: () => [], propDecorators: { selectorsTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtDynamicListToolbarSelectorsDirective), { isSignal: true }] }], actionsTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtDynamicListToolbarActionsDirective), { isSignal: true }] }], pageModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageModel", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], fetching: [{ type: i0.Input, args: [{ isSignal: true, alias: "fetching", required: false }] }], empty: [{ type: i0.Input, args: [{ isSignal: true, alias: "empty", required: false }] }], filtered: [{ type: i0.Input, args: [{ isSignal: true, alias: "filtered", required: false }] }], showClearFilters: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClearFilters", required: false }] }], showRefresh: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRefresh", required: false }] }], showColumnSettings: [{ type: i0.Input, args: [{ isSignal: true, alias: "showColumnSettings", required: false }] }], showSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSearch", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], allSelected: [{ type: i0.Input, args: [{ isSignal: true, alias: "allSelected", required: false }] }], someSelected: [{ type: i0.Input, args: [{ isSignal: true, alias: "someSelected", required: false }] }], selectAllDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllDisabled", required: false }] }], selectedCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedCount", required: false }] }], emptyTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyTitle", required: false }] }], emptyDescription: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyDescription", required: false }] }], searchTerm: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchTerm", required: false }] }], searchChange: [{ type: i0.Output, args: ["searchChange"] }], refreshed: [{ type: i0.Output, args: ["refreshed"] }], filtersCleared: [{ type: i0.Output, args: ["filtersCleared"] }], columnSettingsOpened: [{ type: i0.Output, args: ["columnSettingsOpened"] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }], perPageChange: [{ type: i0.Output, args: ["perPageChange"] }], allSelectedChange: [{ type: i0.Output, args: ["allSelectedChange"] }] } });
254
+
255
+ /**
256
+ * Generated bundle index. Do not edit.
257
+ */
258
+
259
+ export { RtDynamicListComponent, RtDynamicListToolbarActionsDirective, RtDynamicListToolbarSelectorsDirective };
260
+ //# sourceMappingURL=rt-tools-ui-kit-v2-dynamic-list.mjs.map