@rt-tools/ui-kit-v2 0.17.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 (276) hide show
  1. package/README.md +18 -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-ripple.mjs +118 -0
  125. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs.map +1 -0
  126. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +290 -0
  127. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -0
  128. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +37 -0
  129. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -0
  130. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +495 -0
  131. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -0
  132. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +1493 -0
  133. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -0
  134. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs +49 -0
  135. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs.map +1 -0
  136. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs +123 -0
  137. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs.map +1 -0
  138. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs +70 -0
  139. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs.map +1 -0
  140. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs +92 -0
  141. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs.map +1 -0
  142. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +147 -0
  143. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -0
  144. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +117 -0
  145. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -0
  146. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +1636 -0
  147. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -0
  148. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +350 -0
  149. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -0
  150. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +122 -0
  151. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -0
  152. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +85 -0
  153. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -0
  154. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +73 -0
  155. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -0
  156. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +196 -0
  157. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -0
  158. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs +39 -0
  159. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs.map +1 -0
  160. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +338 -0
  161. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -0
  162. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +132 -0
  163. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -0
  164. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +162 -0
  165. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -0
  166. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +135 -0
  167. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -0
  168. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +214 -0
  169. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -0
  170. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs +64 -0
  171. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs.map +1 -0
  172. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +263 -0
  173. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -0
  174. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +296 -0
  175. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -0
  176. package/fesm2022/rt-tools-ui-kit-v2.mjs +91 -23819
  177. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  178. package/package.json +349 -1
  179. package/rt-tools-ui-kit-v2-0.18.0.tgz +0 -0
  180. package/src/lib/components/dot-field/CONTEXT.md +31 -0
  181. package/src/lib/components/dot-field/rt-dot-field.component.scss +20 -0
  182. package/src/lib/components/dot-field/stories/component/CONTEXT.md +14 -0
  183. package/src/lib/components/dot-field/stories/component/test-dot-field.component.scss +31 -0
  184. package/src/lib/components/field/CONTEXT.md +18 -2
  185. package/src/lib/components/select/rt-select.component.scss +4 -0
  186. package/src/styles/_semantic.scss +1 -1
  187. package/styles/tokens.css +8 -8
  188. package/types/rt-tools-ui-kit-v2-accordion.d.ts +30 -0
  189. package/types/rt-tools-ui-kit-v2-action-bar.d.ts +140 -0
  190. package/types/rt-tools-ui-kit-v2-aside-section.d.ts +25 -0
  191. package/types/rt-tools-ui-kit-v2-aside.d.ts +436 -0
  192. package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +78 -0
  193. package/types/rt-tools-ui-kit-v2-bar-list.d.ts +41 -0
  194. package/types/rt-tools-ui-kit-v2-bottom-sheet.d.ts +20 -0
  195. package/types/rt-tools-ui-kit-v2-button.d.ts +76 -0
  196. package/types/rt-tools-ui-kit-v2-calendar.d.ts +96 -0
  197. package/types/rt-tools-ui-kit-v2-card.d.ts +38 -0
  198. package/types/rt-tools-ui-kit-v2-checkbox.d.ts +46 -0
  199. package/types/rt-tools-ui-kit-v2-collapsible-text.d.ts +20 -0
  200. package/types/rt-tools-ui-kit-v2-confirm-popover.d.ts +85 -0
  201. package/types/rt-tools-ui-kit-v2-container.d.ts +425 -0
  202. package/types/rt-tools-ui-kit-v2-core.d.ts +1222 -0
  203. package/types/rt-tools-ui-kit-v2-counter-row.d.ts +22 -0
  204. package/types/rt-tools-ui-kit-v2-counter.d.ts +70 -0
  205. package/types/rt-tools-ui-kit-v2-data-list.d.ts +334 -0
  206. package/types/rt-tools-ui-kit-v2-data-table.d.ts +494 -0
  207. package/types/rt-tools-ui-kit-v2-date-picker.d.ts +181 -0
  208. package/types/rt-tools-ui-kit-v2-date-range.d.ts +98 -0
  209. package/types/rt-tools-ui-kit-v2-delta-view.d.ts +20 -0
  210. package/types/rt-tools-ui-kit-v2-detail-list.d.ts +33 -0
  211. package/types/rt-tools-ui-kit-v2-dialog.d.ts +287 -0
  212. package/types/rt-tools-ui-kit-v2-dot-field.d.ts +17 -0
  213. package/types/rt-tools-ui-kit-v2-download-link.d.ts +17 -0
  214. package/types/rt-tools-ui-kit-v2-dynamic-list.d.ts +139 -0
  215. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +384 -0
  216. package/types/rt-tools-ui-kit-v2-empty-state.d.ts +29 -0
  217. package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +57 -0
  218. package/types/rt-tools-ui-kit-v2-field.d.ts +82 -0
  219. package/types/rt-tools-ui-kit-v2-file-card.d.ts +114 -0
  220. package/types/rt-tools-ui-kit-v2-file-drop.d.ts +75 -0
  221. package/types/rt-tools-ui-kit-v2-file-input.d.ts +48 -0
  222. package/types/rt-tools-ui-kit-v2-file-list.d.ts +13 -0
  223. package/types/rt-tools-ui-kit-v2-filter-control.d.ts +72 -0
  224. package/types/rt-tools-ui-kit-v2-form-control.d.ts +74 -0
  225. package/types/rt-tools-ui-kit-v2-header.d.ts +40 -0
  226. package/types/rt-tools-ui-kit-v2-icon-button.d.ts +113 -0
  227. package/types/rt-tools-ui-kit-v2-icon.d.ts +238 -0
  228. package/types/rt-tools-ui-kit-v2-image-cropper.d.ts +168 -0
  229. package/types/rt-tools-ui-kit-v2-image-upload.d.ts +102 -0
  230. package/types/rt-tools-ui-kit-v2-info-item.d.ts +13 -0
  231. package/types/rt-tools-ui-kit-v2-input-number.d.ts +67 -0
  232. package/types/rt-tools-ui-kit-v2-input.d.ts +54 -0
  233. package/types/rt-tools-ui-kit-v2-live-badge.d.ts +23 -0
  234. package/types/rt-tools-ui-kit-v2-logo.d.ts +58 -0
  235. package/types/rt-tools-ui-kit-v2-markdown-text.d.ts +30 -0
  236. package/types/rt-tools-ui-kit-v2-menu.d.ts +217 -0
  237. package/types/rt-tools-ui-kit-v2-message.d.ts +56 -0
  238. package/types/rt-tools-ui-kit-v2-money-list.d.ts +34 -0
  239. package/types/rt-tools-ui-kit-v2-multiselect.d.ts +93 -0
  240. package/types/rt-tools-ui-kit-v2-night-grid.d.ts +39 -0
  241. package/types/rt-tools-ui-kit-v2-note.d.ts +21 -0
  242. package/types/rt-tools-ui-kit-v2-notifications-bell.d.ts +23 -0
  243. package/types/rt-tools-ui-kit-v2-page-header.d.ts +173 -0
  244. package/types/rt-tools-ui-kit-v2-pagination.d.ts +64 -0
  245. package/types/rt-tools-ui-kit-v2-photo-viewer.d.ts +98 -0
  246. package/types/rt-tools-ui-kit-v2-popover.d.ts +79 -0
  247. package/types/rt-tools-ui-kit-v2-radio-button.d.ts +61 -0
  248. package/types/rt-tools-ui-kit-v2-radius.d.ts +37 -0
  249. package/types/rt-tools-ui-kit-v2-ripple.d.ts +39 -0
  250. package/types/rt-tools-ui-kit-v2-scroll-area.d.ts +91 -0
  251. package/types/rt-tools-ui-kit-v2-section-nav.d.ts +23 -0
  252. package/types/rt-tools-ui-kit-v2-select.d.ts +215 -0
  253. package/types/rt-tools-ui-kit-v2-side-menu.d.ts +483 -0
  254. package/types/rt-tools-ui-kit-v2-skeleton-wrapper.d.ts +32 -0
  255. package/types/rt-tools-ui-kit-v2-skeleton.d.ts +41 -0
  256. package/types/rt-tools-ui-kit-v2-spinner.d.ts +56 -0
  257. package/types/rt-tools-ui-kit-v2-split-button.d.ts +72 -0
  258. package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +81 -0
  259. package/types/rt-tools-ui-kit-v2-stepper.d.ts +51 -0
  260. package/types/rt-tools-ui-kit-v2-table.d.ts +739 -0
  261. package/types/rt-tools-ui-kit-v2-tabs.d.ts +153 -0
  262. package/types/rt-tools-ui-kit-v2-tag.d.ts +70 -0
  263. package/types/rt-tools-ui-kit-v2-textarea.d.ts +36 -0
  264. package/types/rt-tools-ui-kit-v2-theme-toggle.d.ts +43 -0
  265. package/types/rt-tools-ui-kit-v2-thread-list.d.ts +111 -0
  266. package/types/rt-tools-ui-kit-v2-timeline.d.ts +35 -0
  267. package/types/rt-tools-ui-kit-v2-toast.d.ts +103 -0
  268. package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +109 -0
  269. package/types/rt-tools-ui-kit-v2-toggle-switch.d.ts +85 -0
  270. package/types/rt-tools-ui-kit-v2-toolbar.d.ts +66 -0
  271. package/types/rt-tools-ui-kit-v2-tooltip.d.ts +74 -0
  272. package/types/rt-tools-ui-kit-v2-welcome-dialog.d.ts +33 -0
  273. package/types/rt-tools-ui-kit-v2-workspace-details.d.ts +128 -0
  274. package/types/rt-tools-ui-kit-v2-workspace.d.ts +84 -0
  275. package/types/rt-tools-ui-kit-v2.d.ts +87 -9599
  276. package/rt-tools-ui-kit-v2-0.17.0.tgz +0 -0
@@ -0,0 +1,174 @@
1
+ import * as i0 from '@angular/core';
2
+ import { booleanAttribute, inject, Injector, DestroyRef, signal, computed, input, output, forwardRef, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
+ import { NgControl, NG_VALUE_ACCESSOR } from '@angular/forms';
5
+ import { Subject, distinctUntilChanged, switchMap, EMPTY } from 'rxjs';
6
+ import { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';
7
+ import * as i1 from '@rt-tools/ui-kit-v2/radius';
8
+ import { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';
9
+
10
+ const BEM_BLOCK = 'rt-radio-button';
11
+ /** Вход выбранности: не заданный вход — `null`, и тогда выбранность решает форма. */
12
+ function checkedAttribute(value) {
13
+ return value === null || value === undefined ? null : booleanAttribute(value);
14
+ }
15
+ /**
16
+ * Радиокнопка: `role="radio"` с `aria-checked` и `aria-disabled`, выбор нажатием, пробелом и Enter.
17
+ *
18
+ * Выбор приходит двумя путями. Форма пишет модель через `ControlValueAccessor`, и радиокнопка
19
+ * выбрана, когда её значение — сама модель, а не равное ей. Без формы выбранность ставится входом
20
+ * `checked`, а выбор сообщается выходом `checkedChange`: так строку отмечает таблица. Заданный вход
21
+ * решает раньше модели формы.
22
+ *
23
+ * Нажатие на выбранную выбор не снимает — радиокнопку покидают только выбором другой. Каждое
24
+ * нажатие сообщается наружу `clickAction` и дальше обёртки не идёт: строка таблицы под кружком не
25
+ * открывается. Выбор клавишей наружу нажатием не сообщается.
26
+ *
27
+ * Отключение складывается из входа `disabled` и слова формы: форма зовёт `setDisabledState`
28
+ * раньше первого обновления вида, и один общий signal затёр бы её слово.
29
+ *
30
+ * Каждая радиокнопка — свой `ControlValueAccessor`, и значение, отданное одной, форма соседям на
31
+ * том же контроле не пишет: поэтому модель берётся и у самого контрола.
32
+ */
33
+ class RtRadioButtonComponent {
34
+ #injector;
35
+ #destroyRef;
36
+ #onChange;
37
+ #onTouched;
38
+ /**
39
+ * Контрол, к которому радиокнопка привязана сейчас. Директива формы меняет его, не пересоздавая
40
+ * себя: `[formControl]` получил другой контрол, `[formGroup]` — другую группу. Слушать надо
41
+ * только нынешний — прежний, оставшись под подпиской, зажёг бы точку из мёртвой формы, и
42
+ * нажатие по ней уже не дошло бы до живой.
43
+ */
44
+ #controlSource;
45
+ /** Модель, записанная формой. */
46
+ #model;
47
+ /** Отключение, назначенное формой через `setDisabledState`. */
48
+ #disabledByForm;
49
+ constructor() {
50
+ this.#injector = inject(Injector);
51
+ this.#destroyRef = inject(DestroyRef);
52
+ this.#onChange = () => undefined;
53
+ this.#onTouched = () => undefined;
54
+ /**
55
+ * Контрол, к которому радиокнопка привязана сейчас. Директива формы меняет его, не пересоздавая
56
+ * себя: `[formControl]` получил другой контрол, `[formGroup]` — другую группу. Слушать надо
57
+ * только нынешний — прежний, оставшись под подпиской, зажёг бы точку из мёртвой формы, и
58
+ * нажатие по ней уже не дошло бы до живой.
59
+ */
60
+ this.#controlSource = new Subject();
61
+ /** Модель, записанная формой. */
62
+ this.#model = signal(null, /* @ts-ignore */
63
+ ...(ngDevMode ? [{ debugName: "#model" }] : /* istanbul ignore next */ []));
64
+ /** Отключение, назначенное формой через `setDisabledState`. */
65
+ this.#disabledByForm = signal(false, /* @ts-ignore */
66
+ ...(ngDevMode ? [{ debugName: "#disabledByForm" }] : /* istanbul ignore next */ []));
67
+ this.isChecked = computed(() => this.checked() ?? this.value() === this.#model(), /* @ts-ignore */
68
+ ...(ngDevMode ? [{ debugName: "isChecked" }] : /* istanbul ignore next */ []));
69
+ this.isDisabled = computed(() => this.disabled() || this.#disabledByForm(), /* @ts-ignore */
70
+ ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
71
+ /** Значение радиокнопки: выбрана та, чьё значение — модель формы. */
72
+ this.value = input.required(/* @ts-ignore */
73
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
74
+ /** Выбранность без формы; не заданный вход оставляет решение форме. */
75
+ this.checked = input(null, { ...(ngDevMode ? { debugName: "checked" } : /* istanbul ignore next */ {}), transform: checkedAttribute });
76
+ this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
77
+ /** Вид «карточка»: рамка, содержимое слева, кружок справа. */
78
+ this.card = input(false, { ...(ngDevMode ? { debugName: "card" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
79
+ this.label = input('', /* @ts-ignore */
80
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
81
+ this.description = input('', /* @ts-ignore */
82
+ ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
83
+ /** Имя для вспомогательных средств, когда видимой подписи нет — кружок в строке таблицы. */
84
+ this.ariaLabel = input(null, /* @ts-ignore */
85
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
86
+ /** Каждое нажатие указателем, сменило оно выбор или нет. */
87
+ this.clickAction = output();
88
+ /** Радиокнопка стала выбранной. */
89
+ this.checkedChange = output();
90
+ // Значение, отданное соседкой, форма этой радиокнопке не пишет — модель берётся у самого
91
+ // контрола, иначе точка осталась бы у двух сразу. Подписка идёт за сменой контрола и
92
+ // бросает прежний.
93
+ this.#controlSource
94
+ .pipe(distinctUntilChanged(), switchMap((control) => control?.valueChanges ?? EMPTY), takeUntilDestroyed(this.#destroyRef))
95
+ .subscribe((value) => this.#model.set(value));
96
+ }
97
+ writeValue(value) {
98
+ this.#model.set(value);
99
+ }
100
+ /**
101
+ * Директива формы зовёт это при каждой привязке к контролу — и первой, и после смены контрола,
102
+ * — уже поставив новый контрол себе. Здесь радиокнопка и узнаёт, кого слушать. Спросить
103
+ * директиву в конструкторе нельзя: она берёт радиокнопку своим accessor, и это круговая
104
+ * зависимость.
105
+ */
106
+ registerOnChange(fn) {
107
+ this.#onChange = fn;
108
+ this.#controlSource.next(this.#injector.get(NgControl, null, { self: true, optional: true })?.control ?? null);
109
+ }
110
+ registerOnTouched(fn) {
111
+ this.#onTouched = fn;
112
+ }
113
+ setDisabledState(disabled) {
114
+ this.#disabledByForm.set(disabled);
115
+ }
116
+ onClick(event) {
117
+ this.#select();
118
+ this.clickAction.emit(event);
119
+ event.stopPropagation();
120
+ event.preventDefault();
121
+ }
122
+ onKeydown(event) {
123
+ if (event.key !== ' ' && event.key !== 'Enter') {
124
+ return;
125
+ }
126
+ event.preventDefault();
127
+ this.#select();
128
+ }
129
+ #select() {
130
+ if (this.isDisabled()) {
131
+ return;
132
+ }
133
+ if (!this.isChecked()) {
134
+ this.#model.set(this.value());
135
+ this.#onChange(this.value());
136
+ this.checkedChange.emit(true);
137
+ }
138
+ this.#onTouched();
139
+ }
140
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtRadioButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
141
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtRadioButtonComponent, isStandalone: true, selector: "rt-radio-button", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, card: { classPropertyName: "card", publicName: "card", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clickAction: "clickAction", checkedChange: "checkedChange" }, host: { classAttribute: "rt-radio-button" }, providers: [
142
+ {
143
+ provide: NG_VALUE_ACCESSOR,
144
+ useExisting: forwardRef(() => RtRadioButtonComponent),
145
+ multi: true,
146
+ },
147
+ ], hostDirectives: [{ directive: i1.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<div\n rtBlock=\"rt-radio-button\"\n qa-dataid=\"radio-button-control\"\n role=\"radio\"\n tabindex=\"0\"\n [rtMod]=\"{ checked: isChecked(), disabled: isDisabled(), card: card() }\"\n [attr.aria-checked]=\"isChecked()\"\n [attr.aria-disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n (keydown)=\"onKeydown($event)\">\n <span rtElem=\"indicator\">\n @if (isChecked()) {\n <span rtElem=\"dot\"></span>\n }\n </span>\n\n @if (label() || description()) {\n <span rtElem=\"content\">\n @if (label()) {\n <span rtElem=\"label\" qa-dataid=\"radio-button-label\">{{ label() }}</span>\n }\n @if (description()) {\n <span rtElem=\"description\" qa-dataid=\"radio-button-description\">{{ description() }}</span>\n }\n </span>\n }\n</div>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-radio-button{display:inline-block}rt-radio-button[data-rt-radius=none]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-none)}rt-radio-button[data-rt-radius=xs]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-xs)}rt-radio-button[data-rt-radius=sm]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-sm)}rt-radio-button[data-rt-radius=ms]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-ms)}rt-radio-button[data-rt-radius=md]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-md)}rt-radio-button[data-rt-radius=lg]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-lg)}rt-radio-button[data-rt-radius=xl]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-xl)}rt-radio-button[data-rt-radius=\"2xl\"]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-2xl)}rt-radio-button[data-rt-radius=full]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-full)}rt-radio-button .rt-radio-button{--rt-radio-button-size: var(--rt-size-4);--rt-radio-button-dot-size: var(--rt-size-2);--rt-radio-button-rim-width: var(--rt-border-width-medium);--rt-radio-button-round: var(--rt-radius-full);--rt-radio-button-focus-radius: var(--rt-radius-sm);--rt-radio-button-focus-shadow: var(--rt-shadow-focus-ring);--rt-radio-button-card-radius: var(--rt-radius-md);--rt-radio-button-card-border-width: var(--rt-border-width-thin);--rt-radio-button-transition-duration: var(--rt-duration-fast);display:flex;align-items:center;cursor:pointer;gap:var(--rt-space-sm);text-align:start}rt-radio-button .rt-radio-button:focus-visible{border-radius:var(--rt-radio-button-focus-radius);box-shadow:var(--rt-radio-button-focus-shadow);outline:2px solid transparent;outline-offset:2px}rt-radio-button .rt-radio-button__indicator{display:inline-flex;width:var(--rt-radio-button-size);height:var(--rt-radio-button-size);flex-shrink:0;align-items:center;justify-content:center;border:var(--rt-radio-button-rim-width) solid var(--rt-color-border-strong);border-radius:var(--rt-radio-button-round);transition:border-color var(--rt-radio-button-transition-duration) ease}rt-radio-button .rt-radio-button__dot{width:var(--rt-radio-button-dot-size);height:var(--rt-radio-button-dot-size);border-radius:var(--rt-radio-button-round);background:var(--rt-color-action-primary)}rt-radio-button .rt-radio-button__content{display:flex;min-width:0;flex:1;flex-direction:column;gap:var(--rt-space-xs)}rt-radio-button .rt-radio-button__label{color:var(--rt-color-text-primary);font-size:var(--rt-text-sm);-webkit-user-select:none;user-select:none}rt-radio-button .rt-radio-button__description{color:var(--rt-color-text-muted);font-size:var(--rt-text-xs)}rt-radio-button .rt-radio-button--checked .rt-radio-button__indicator{border-color:var(--rt-color-action-primary)}rt-radio-button .rt-radio-button--card{flex-direction:row-reverse;align-items:flex-start;justify-content:space-between;padding:var(--rt-space-sm) var(--rt-space-md);border:var(--rt-radio-button-card-border-width) solid var(--rt-color-border-subtle);border-radius:var(--rt-radio-button-card-radius);transition:border-color var(--rt-radio-button-transition-duration) ease}rt-radio-button .rt-radio-button--card .rt-radio-button__label{font-weight:var(--rt-font-weight-medium)}rt-radio-button .rt-radio-button--card.rt-radio-button--checked{border-color:var(--rt-color-action-primary)}rt-radio-button .rt-radio-button--disabled{cursor:not-allowed;opacity:var(--rt-opacity-disabled);pointer-events:none}}\n"], dependencies: [{ kind: "directive", type:
148
+ // standalone directives
149
+ BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
150
+ }
151
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtRadioButtonComponent, decorators: [{
152
+ type: Component,
153
+ args: [{ selector: 'rt-radio-button', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
154
+ // standalone directives
155
+ BlockDirective,
156
+ ElemDirective,
157
+ ModDirective,
158
+ ], providers: [
159
+ {
160
+ provide: NG_VALUE_ACCESSOR,
161
+ useExisting: forwardRef(() => RtRadioButtonComponent),
162
+ multi: true,
163
+ },
164
+ ], hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }], host: {
165
+ class: BEM_BLOCK,
166
+ }, template: "<div\n rtBlock=\"rt-radio-button\"\n qa-dataid=\"radio-button-control\"\n role=\"radio\"\n tabindex=\"0\"\n [rtMod]=\"{ checked: isChecked(), disabled: isDisabled(), card: card() }\"\n [attr.aria-checked]=\"isChecked()\"\n [attr.aria-disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n (keydown)=\"onKeydown($event)\">\n <span rtElem=\"indicator\">\n @if (isChecked()) {\n <span rtElem=\"dot\"></span>\n }\n </span>\n\n @if (label() || description()) {\n <span rtElem=\"content\">\n @if (label()) {\n <span rtElem=\"label\" qa-dataid=\"radio-button-label\">{{ label() }}</span>\n }\n @if (description()) {\n <span rtElem=\"description\" qa-dataid=\"radio-button-description\">{{ description() }}</span>\n }\n </span>\n }\n</div>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-radio-button{display:inline-block}rt-radio-button[data-rt-radius=none]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-none)}rt-radio-button[data-rt-radius=xs]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-xs)}rt-radio-button[data-rt-radius=sm]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-sm)}rt-radio-button[data-rt-radius=ms]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-ms)}rt-radio-button[data-rt-radius=md]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-md)}rt-radio-button[data-rt-radius=lg]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-lg)}rt-radio-button[data-rt-radius=xl]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-xl)}rt-radio-button[data-rt-radius=\"2xl\"]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-2xl)}rt-radio-button[data-rt-radius=full]>.rt-radio-button{--rt-radio-button-card-radius: var(--rt-radius-full)}rt-radio-button .rt-radio-button{--rt-radio-button-size: var(--rt-size-4);--rt-radio-button-dot-size: var(--rt-size-2);--rt-radio-button-rim-width: var(--rt-border-width-medium);--rt-radio-button-round: var(--rt-radius-full);--rt-radio-button-focus-radius: var(--rt-radius-sm);--rt-radio-button-focus-shadow: var(--rt-shadow-focus-ring);--rt-radio-button-card-radius: var(--rt-radius-md);--rt-radio-button-card-border-width: var(--rt-border-width-thin);--rt-radio-button-transition-duration: var(--rt-duration-fast);display:flex;align-items:center;cursor:pointer;gap:var(--rt-space-sm);text-align:start}rt-radio-button .rt-radio-button:focus-visible{border-radius:var(--rt-radio-button-focus-radius);box-shadow:var(--rt-radio-button-focus-shadow);outline:2px solid transparent;outline-offset:2px}rt-radio-button .rt-radio-button__indicator{display:inline-flex;width:var(--rt-radio-button-size);height:var(--rt-radio-button-size);flex-shrink:0;align-items:center;justify-content:center;border:var(--rt-radio-button-rim-width) solid var(--rt-color-border-strong);border-radius:var(--rt-radio-button-round);transition:border-color var(--rt-radio-button-transition-duration) ease}rt-radio-button .rt-radio-button__dot{width:var(--rt-radio-button-dot-size);height:var(--rt-radio-button-dot-size);border-radius:var(--rt-radio-button-round);background:var(--rt-color-action-primary)}rt-radio-button .rt-radio-button__content{display:flex;min-width:0;flex:1;flex-direction:column;gap:var(--rt-space-xs)}rt-radio-button .rt-radio-button__label{color:var(--rt-color-text-primary);font-size:var(--rt-text-sm);-webkit-user-select:none;user-select:none}rt-radio-button .rt-radio-button__description{color:var(--rt-color-text-muted);font-size:var(--rt-text-xs)}rt-radio-button .rt-radio-button--checked .rt-radio-button__indicator{border-color:var(--rt-color-action-primary)}rt-radio-button .rt-radio-button--card{flex-direction:row-reverse;align-items:flex-start;justify-content:space-between;padding:var(--rt-space-sm) var(--rt-space-md);border:var(--rt-radio-button-card-border-width) solid var(--rt-color-border-subtle);border-radius:var(--rt-radio-button-card-radius);transition:border-color var(--rt-radio-button-transition-duration) ease}rt-radio-button .rt-radio-button--card .rt-radio-button__label{font-weight:var(--rt-font-weight-medium)}rt-radio-button .rt-radio-button--card.rt-radio-button--checked{border-color:var(--rt-color-action-primary)}rt-radio-button .rt-radio-button--disabled{cursor:not-allowed;opacity:var(--rt-opacity-disabled);pointer-events:none}}\n"] }]
167
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], card: [{ type: i0.Input, args: [{ isSignal: true, alias: "card", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], clickAction: [{ type: i0.Output, args: ["clickAction"] }], checkedChange: [{ type: i0.Output, args: ["checkedChange"] }] } });
168
+
169
+ /**
170
+ * Generated bundle index. Do not edit.
171
+ */
172
+
173
+ export { RtRadioButtonComponent };
174
+ //# sourceMappingURL=rt-tools-ui-kit-v2-radio-button.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-radio-button.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/radio-button/rt-radio-button.component.ts","../../../projects/ui-kit-v2/src/lib/components/radio-button/rt-radio-button.component.html","../../../projects/ui-kit-v2/src/lib/components/radio-button/rt-tools-ui-kit-v2-radio-button.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n forwardRef,\n inject,\n Injector,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AbstractControl, ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl } from '@angular/forms';\nimport { distinctUntilChanged, EMPTY, Observable, Subject, switchMap } from 'rxjs';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\n\nconst BEM_BLOCK: string = 'rt-radio-button';\n\n/** Вход выбранности: не заданный вход — `null`, и тогда выбранность решает форма. */\nfunction checkedAttribute(value: BooleanInput | null | undefined): boolean | null {\n return value === null || value === undefined ? null : booleanAttribute(value);\n}\n\n/**\n * Радиокнопка: `role=\"radio\"` с `aria-checked` и `aria-disabled`, выбор нажатием, пробелом и Enter.\n *\n * Выбор приходит двумя путями. Форма пишет модель через `ControlValueAccessor`, и радиокнопка\n * выбрана, когда её значение — сама модель, а не равное ей. Без формы выбранность ставится входом\n * `checked`, а выбор сообщается выходом `checkedChange`: так строку отмечает таблица. Заданный вход\n * решает раньше модели формы.\n *\n * Нажатие на выбранную выбор не снимает — радиокнопку покидают только выбором другой. Каждое\n * нажатие сообщается наружу `clickAction` и дальше обёртки не идёт: строка таблицы под кружком не\n * открывается. Выбор клавишей наружу нажатием не сообщается.\n *\n * Отключение складывается из входа `disabled` и слова формы: форма зовёт `setDisabledState`\n * раньше первого обновления вида, и один общий signal затёр бы её слово.\n *\n * Каждая радиокнопка — свой `ControlValueAccessor`, и значение, отданное одной, форма соседям на\n * том же контроле не пишет: поэтому модель берётся и у самого контрола.\n */\n@Component({\n selector: 'rt-radio-button',\n templateUrl: './rt-radio-button.component.html',\n styleUrl: './rt-radio-button.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef((): typeof RtRadioButtonComponent => RtRadioButtonComponent),\n multi: true,\n },\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtRadioButtonComponent implements ControlValueAccessor {\n readonly #injector: Injector = inject(Injector);\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n #onChange: (value: unknown) => void = (): void => undefined;\n #onTouched: () => void = (): void => undefined;\n\n /**\n * Контрол, к которому радиокнопка привязана сейчас. Директива формы меняет его, не пересоздавая\n * себя: `[formControl]` получил другой контрол, `[formGroup]` — другую группу. Слушать надо\n * только нынешний — прежний, оставшись под подпиской, зажёг бы точку из мёртвой формы, и\n * нажатие по ней уже не дошло бы до живой.\n */\n readonly #controlSource: Subject<AbstractControl | null> = new Subject<AbstractControl | null>();\n\n /** Модель, записанная формой. */\n readonly #model: WritableSignal<unknown> = signal<unknown>(null);\n\n /** Отключение, назначенное формой через `setDisabledState`. */\n readonly #disabledByForm: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly isChecked: Signal<boolean> = computed((): boolean => this.checked() ?? this.value() === this.#model());\n protected readonly isDisabled: Signal<boolean> = computed((): boolean => this.disabled() || this.#disabledByForm());\n\n /** Значение радиокнопки: выбрана та, чьё значение — модель формы. */\n public readonly value: InputSignal<unknown> = input.required<unknown>();\n\n /** Выбранность без формы; не заданный вход оставляет решение форме. */\n public readonly checked: InputSignalWithTransform<boolean | null, BooleanInput | null | undefined> = input<\n boolean | null,\n BooleanInput | null | undefined\n >(null, { transform: checkedAttribute });\n\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Вид «карточка»: рамка, содержимое слева, кружок справа. */\n public readonly card: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly label: InputSignal<string> = input<string>('');\n public readonly description: InputSignal<string> = input<string>('');\n\n /** Имя для вспомогательных средств, когда видимой подписи нет — кружок в строке таблицы. */\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n /** Каждое нажатие указателем, сменило оно выбор или нет. */\n public readonly clickAction: OutputEmitterRef<MouseEvent> = output<MouseEvent>();\n\n /** Радиокнопка стала выбранной. */\n public readonly checkedChange: OutputEmitterRef<boolean> = output<boolean>();\n\n constructor() {\n // Значение, отданное соседкой, форма этой радиокнопке не пишет — модель берётся у самого\n // контрола, иначе точка осталась бы у двух сразу. Подписка идёт за сменой контрола и\n // бросает прежний.\n this.#controlSource\n .pipe(\n distinctUntilChanged(),\n switchMap((control: AbstractControl | null): Observable<unknown> => control?.valueChanges ?? EMPTY),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe((value: unknown): void => this.#model.set(value));\n }\n\n public writeValue(value: unknown): void {\n this.#model.set(value);\n }\n\n /**\n * Директива формы зовёт это при каждой привязке к контролу — и первой, и после смены контрола,\n * — уже поставив новый контрол себе. Здесь радиокнопка и узнаёт, кого слушать. Спросить\n * директиву в конструкторе нельзя: она берёт радиокнопку своим accessor, и это круговая\n * зависимость.\n */\n public registerOnChange(fn: (value: unknown) => void): void {\n this.#onChange = fn;\n this.#controlSource.next(this.#injector.get(NgControl, null, { self: true, optional: true })?.control ?? null);\n }\n\n public registerOnTouched(fn: () => void): void {\n this.#onTouched = fn;\n }\n\n public setDisabledState(disabled: boolean): void {\n this.#disabledByForm.set(disabled);\n }\n\n protected onClick(event: MouseEvent): void {\n this.#select();\n this.clickAction.emit(event);\n event.stopPropagation();\n event.preventDefault();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key !== ' ' && event.key !== 'Enter') {\n return;\n }\n event.preventDefault();\n this.#select();\n }\n\n #select(): void {\n if (this.isDisabled()) {\n return;\n }\n if (!this.isChecked()) {\n this.#model.set(this.value());\n this.#onChange(this.value());\n this.checkedChange.emit(true);\n }\n this.#onTouched();\n }\n}\n","<div\n rtBlock=\"rt-radio-button\"\n qa-dataid=\"radio-button-control\"\n role=\"radio\"\n tabindex=\"0\"\n [rtMod]=\"{ checked: isChecked(), disabled: isDisabled(), card: card() }\"\n [attr.aria-checked]=\"isChecked()\"\n [attr.aria-disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n (keydown)=\"onKeydown($event)\">\n <span rtElem=\"indicator\">\n @if (isChecked()) {\n <span rtElem=\"dot\"></span>\n }\n </span>\n\n @if (label() || description()) {\n <span rtElem=\"content\">\n @if (label()) {\n <span rtElem=\"label\" qa-dataid=\"radio-button-label\">{{ label() }}</span>\n }\n @if (description()) {\n <span rtElem=\"description\" qa-dataid=\"radio-button-description\">{{ description() }}</span>\n }\n </span>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;AA4BA,MAAM,SAAS,GAAW,iBAAiB;AAE3C;AACA,SAAS,gBAAgB,CAAC,KAAsC,EAAA;AAC5D,IAAA,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,GAAG,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC;AACjF;AAEA;;;;;;;;;;;;;;;;;AAiBG;MAyBU,sBAAsB,CAAA;AACtB,IAAA,SAAS;AACT,IAAA,WAAW;AAEpB,IAAA,SAAS;AACT,IAAA,UAAU;AAEV;;;;;AAKG;AACM,IAAA,cAAc;;AAGd,IAAA,MAAM;;AAGN,IAAA,eAAe;AAmCxB,IAAA,WAAA,GAAA;AArDS,QAAA,IAAA,CAAA,SAAS,GAAa,MAAM,CAAC,QAAQ,CAAC;AACtC,QAAA,IAAA,CAAA,WAAW,GAAe,MAAM,CAAC,UAAU,CAAC;AAErD,QAAA,IAAA,CAAA,SAAS,GAA6B,MAAY,SAAS;AAC3D,QAAA,IAAA,CAAA,UAAU,GAAe,MAAY,SAAS;AAE9C;;;;;AAKG;AACM,QAAA,IAAA,CAAA,cAAc,GAAoC,IAAI,OAAO,EAA0B;;QAGvF,IAAA,CAAA,MAAM,GAA4B,MAAM,CAAU,IAAI;mFAAC;;QAGvD,IAAA,CAAA,eAAe,GAA4B,MAAM,CAAU,KAAK;4FAAC;AAEvD,QAAA,IAAA,CAAA,SAAS,GAAoB,QAAQ,CAAC,MAAe,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,MAAM,EAAE;sFAAC;AACtG,QAAA,IAAA,CAAA,UAAU,GAAoB,QAAQ,CAAC,MAAe,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE;uFAAC;;QAGnG,IAAA,CAAA,KAAK,GAAyB,KAAK,CAAC,QAAQ;kFAAW;;QAGvD,IAAA,CAAA,OAAO,GAA8E,KAAK,CAGxG,IAAI,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;QAExB,IAAA,CAAA,QAAQ,GAAoD,KAAK,CAAwB,KAAK,gFAC1G,SAAS,EAAE,gBAAgB,EAAA,CAC7B;;QAGc,IAAA,CAAA,IAAI,GAAoD,KAAK,CAAwB,KAAK,4EACtG,SAAS,EAAE,gBAAgB,EAAA,CAC7B;QAEc,IAAA,CAAA,KAAK,GAAwB,KAAK,CAAS,EAAE;kFAAC;QAC9C,IAAA,CAAA,WAAW,GAAwB,KAAK,CAAS,EAAE;wFAAC;;QAGpD,IAAA,CAAA,SAAS,GAA+B,KAAK,CAAgB,IAAI;sFAAC;;QAGlE,IAAA,CAAA,WAAW,GAAiC,MAAM,EAAc;;QAGhE,IAAA,CAAA,aAAa,GAA8B,MAAM,EAAW;;;;AAMxE,QAAA,IAAI,CAAC;aACA,IAAI,CACD,oBAAoB,EAAE,EACtB,SAAS,CAAC,CAAC,OAA+B,KAA0B,OAAO,EAAE,YAAY,IAAI,KAAK,CAAC,EACnG,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;AAEvC,aAAA,SAAS,CAAC,CAAC,KAAc,KAAW,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpE;AAEO,IAAA,UAAU,CAAC,KAAc,EAAA;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;AAEA;;;;;AAKG;AACI,IAAA,gBAAgB,CAAC,EAA4B,EAAA;AAChD,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC;IAClH;AAEO,IAAA,iBAAiB,CAAC,EAAc,EAAA;AACnC,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACxB;AAEO,IAAA,gBAAgB,CAAC,QAAiB,EAAA;AACrC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtC;AAEU,IAAA,OAAO,CAAC,KAAiB,EAAA;QAC/B,IAAI,CAAC,OAAO,EAAE;AACd,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B,KAAK,CAAC,eAAe,EAAE;QACvB,KAAK,CAAC,cAAc,EAAE;IAC1B;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;AACpC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YAC5C;QACJ;QACA,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,OAAO,EAAE;IAClB;IAEA,OAAO,GAAA;AACH,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACnB;QACJ;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YACnB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AAC5B,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QACjC;QACA,IAAI,CAAC,UAAU,EAAE;IACrB;8GAnHS,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,EAAA,SAAA,EAZpB;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAqC,sBAAsB,CAAC;AACpF,gBAAA,KAAK,EAAE,IAAI;AACd,aAAA;AACJ,SAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvEL,k6BA4BA,EAAA,MAAA,EAAA,CAAA,mgHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA;;gBDiCQ,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,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,YAAY,EAAA,QAAA,EAAA,SAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAcP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAxBlC,SAAS;+BACI,iBAAiB,EAAA,eAAA,EAGV,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;;wBAEL,cAAc;wBACd,aAAa;wBACb,YAAY;qBACf,EAAA,SAAA,EACU;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,4BAA2D,CAAC;AACpF,4BAAA,KAAK,EAAE,IAAI;AACd,yBAAA;AACJ,qBAAA,EAAA,cAAA,EACe,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAA,IAAA,EAChE;AACF,wBAAA,KAAK,EAAE,SAAS;AACnB,qBAAA,EAAA,QAAA,EAAA,k6BAAA,EAAA,MAAA,EAAA,CAAA,mgHAAA,CAAA,EAAA;;;AE3EL;;AAEG;;;;"}
@@ -0,0 +1,56 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, input, computed, Directive } from '@angular/core';
3
+ import { RT_RADIUS_DEFAULT } from '@rt-tools/ui-kit-v2/core';
4
+
5
+ /**
6
+ * Вход скругления, один на весь кит. Компонент с поверхностью берёт его
7
+ * хост-директивой, и у всех он называется одинаково — `radius`.
8
+ *
9
+ * Шаг ложится на хост атрибутом `data-rt-radius`, а не наследуемым свойством:
10
+ * свойство протекло бы в каждый вложенный компонент, и скруглённая карточка
11
+ * скруглила бы все кнопки в себе. Атрибут читают только правила своего хоста.
12
+ *
13
+ * Пустой вход атрибута не пишет: компонент остаётся со своим скруглением по
14
+ * умолчанию из собственных стилей.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * @Component({
19
+ * selector: 'rt-card',
20
+ * hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],
21
+ * })
22
+ * ```
23
+ * ```html
24
+ * <rt-card radius="none">…</rt-card>
25
+ * ```
26
+ */
27
+ class RtRadiusDirective {
28
+ constructor() {
29
+ this.#fallback = inject(RT_RADIUS_DEFAULT, { optional: true }) ?? null;
30
+ /** Шаг шкалы. Пусто — скругление компонента по умолчанию. */
31
+ this.radius = input(null, /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "radius" }] : /* istanbul ignore next */ []));
33
+ /** Шаг на хосте: названный входом, иначе умолчание хоста, если оно задано. */
34
+ this.step = computed(() => this.radius() ?? this.#fallback, /* @ts-ignore */
35
+ ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
36
+ }
37
+ #fallback;
38
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtRadiusDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
39
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: RtRadiusDirective, isStandalone: true, selector: "[rtRadius]", inputs: { radius: { classPropertyName: "radius", publicName: "radius", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-rt-radius": "step()" } }, ngImport: i0 }); }
40
+ }
41
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtRadiusDirective, decorators: [{
42
+ type: Directive,
43
+ args: [{
44
+ selector: '[rtRadius]',
45
+ host: {
46
+ '[attr.data-rt-radius]': 'step()',
47
+ },
48
+ }]
49
+ }], propDecorators: { radius: [{ type: i0.Input, args: [{ isSignal: true, alias: "radius", required: false }] }] } });
50
+
51
+ /**
52
+ * Generated bundle index. Do not edit.
53
+ */
54
+
55
+ export { RtRadiusDirective };
56
+ //# sourceMappingURL=rt-tools-ui-kit-v2-radius.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-radius.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/radius/rt-radius.directive.ts","../../../projects/ui-kit-v2/src/lib/components/radius/rt-tools-ui-kit-v2-radius.ts"],"sourcesContent":["import { computed, Directive, inject, input, InputSignal, Signal } from '@angular/core';\n\nimport { RT_RADIUS_DEFAULT, TRtRadius } from '@rt-tools/ui-kit-v2/core';\n\n/**\n * Вход скругления, один на весь кит. Компонент с поверхностью берёт его\n * хост-директивой, и у всех он называется одинаково — `radius`.\n *\n * Шаг ложится на хост атрибутом `data-rt-radius`, а не наследуемым свойством:\n * свойство протекло бы в каждый вложенный компонент, и скруглённая карточка\n * скруглила бы все кнопки в себе. Атрибут читают только правила своего хоста.\n *\n * Пустой вход атрибута не пишет: компонент остаётся со своим скруглением по\n * умолчанию из собственных стилей.\n *\n * @example\n * ```ts\n * @Component({\n * selector: 'rt-card',\n * hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n * })\n * ```\n * ```html\n * <rt-card radius=\"none\">…</rt-card>\n * ```\n */\n@Directive({\n selector: '[rtRadius]',\n host: {\n '[attr.data-rt-radius]': 'step()',\n },\n})\nexport class RtRadiusDirective {\n readonly #fallback: TRtRadius | null = inject(RT_RADIUS_DEFAULT, { optional: true }) ?? null;\n\n /** Шаг шкалы. Пусто — скругление компонента по умолчанию. */\n public readonly radius: InputSignal<TRtRadius | null | undefined> = input<TRtRadius | null | undefined>(null);\n\n /** Шаг на хосте: названный входом, иначе умолчание хоста, если оно задано. */\n public readonly step: Signal<TRtRadius | null> = computed((): TRtRadius | null => this.radius() ?? this.#fallback);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAIA;;;;;;;;;;;;;;;;;;;;;AAqBG;MAOU,iBAAiB,CAAA;AAN9B,IAAA,WAAA,GAAA;AAOa,QAAA,IAAA,CAAA,SAAS,GAAqB,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI;;QAG5E,IAAA,CAAA,MAAM,GAA8C,KAAK,CAA+B,IAAI;mFAAC;;AAG7F,QAAA,IAAA,CAAA,IAAI,GAA6B,QAAQ,CAAC,MAAwB,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS;iFAAC;AACrH,IAAA;AAPY,IAAA,SAAS;8GADT,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,IAAI,EAAE;AACF,wBAAA,uBAAuB,EAAE,QAAQ;AACpC,qBAAA;AACJ,iBAAA;;;AC/BD;;AAEG;;;;"}
@@ -0,0 +1,118 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, ElementRef, Renderer2, DestroyRef, input, booleanAttribute, Directive } from '@angular/core';
3
+
4
+ const BEM_BLOCK = 'rt-ripple';
5
+ /** Сколько живёт один слой волны. Совпадает с длительностью в стилях блока. */
6
+ const RIPPLE_LIFETIME_MS = 550;
7
+ /**
8
+ * Волна нажатия. Ставится на элемент, который нажимают, и рисует расходящийся
9
+ * от точки касания круг.
10
+ *
11
+ * Волна живёт в своём обрезающем слое внутри элемента, а не прямо в нём:
12
+ * `overflow: hidden` на самой кнопке срезал бы всё, что торчит за её край, —
13
+ * у кнопки-значка так стоит метка, вынесенная на два пикселя наружу.
14
+ *
15
+ * @example
16
+ * ```html
17
+ * <button rtRipple>Сохранить</button>
18
+ * <button rtRipple [rippleDisabled]="loading()">Сохранить</button>
19
+ * ```
20
+ */
21
+ class RtRippleDirective {
22
+ #el;
23
+ #renderer;
24
+ #destroyRef;
25
+ /** Слои, которые ещё гаснут: снимаются, если элемент умрёт раньше их. */
26
+ #live;
27
+ /** Обрезающий слой заводится при первом нажатии: у кнопки, которую не нажали, его нет. */
28
+ #area;
29
+ /** Гасит незакончившиеся волны: иначе таймер трогает снятый из дерева узел. */
30
+ constructor() {
31
+ this.#el = inject(ElementRef);
32
+ this.#renderer = inject(Renderer2);
33
+ this.#destroyRef = inject(DestroyRef);
34
+ /** Слои, которые ещё гаснут: снимаются, если элемент умрёт раньше их. */
35
+ this.#live = new Set();
36
+ /** Обрезающий слой заводится при первом нажатии: у кнопки, которую не нажали, его нет. */
37
+ this.#area = null;
38
+ /**
39
+ * Отключает волну, не трогая остальное поведение элемента.
40
+ * Отключённая и загружающаяся кнопка волны не даёт.
41
+ */
42
+ this.rippleDisabled = input(false, { ...(ngDevMode ? { debugName: "rippleDisabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
43
+ this.#destroyRef.onDestroy(() => {
44
+ for (const timer of this.#live) {
45
+ clearTimeout(timer);
46
+ }
47
+ this.#live.clear();
48
+ });
49
+ }
50
+ /**
51
+ * Ставит один слой волны от точки нажатия и снимает его, когда тот отгорит.
52
+ *
53
+ * Радиус считается по дальнему углу элемента: волна из угла должна накрыть
54
+ * противоположный, иначе на широкой кнопке она обрывается на полпути.
55
+ */
56
+ launch(event) {
57
+ const host = this.#el.nativeElement;
58
+ if (this.rippleDisabled() || host.disabled) {
59
+ return;
60
+ }
61
+ const box = host.getBoundingClientRect();
62
+ const x = event.clientX - box.left;
63
+ const y = event.clientY - box.top;
64
+ const radius = Math.hypot(Math.max(x, box.width - x), Math.max(y, box.height - y));
65
+ const area = this.#ensureArea(host);
66
+ const layer = this.#renderer.createElement('span');
67
+ this.#renderer.addClass(layer, `${BEM_BLOCK}__wave`);
68
+ this.#renderer.setStyle(layer, 'left', `${x - radius}px`);
69
+ this.#renderer.setStyle(layer, 'top', `${y - radius}px`);
70
+ this.#renderer.setStyle(layer, 'width', `${radius * 2}px`);
71
+ this.#renderer.setStyle(layer, 'height', `${radius * 2}px`);
72
+ this.#renderer.appendChild(area, layer);
73
+ const timer = setTimeout(() => {
74
+ this.#live.delete(timer);
75
+ if (layer.parentNode) {
76
+ this.#renderer.removeChild(area, layer);
77
+ }
78
+ }, RIPPLE_LIFETIME_MS);
79
+ this.#live.add(timer);
80
+ }
81
+ /** Обрезающий слой один на элемент: он повторяет его скругление и не ловит указатель. */
82
+ #ensureArea(host) {
83
+ if (this.#area?.parentNode) {
84
+ return this.#area;
85
+ }
86
+ /* Обрезающий слой стоит absolute, и ему нужен позиционированный предок. Позиция
87
+ ставится здесь, а не правилом блока: правило висело бы на каждой кнопке кита и
88
+ меняло растеризацию кадров витрины, ничего не двигая в раскладке. */
89
+ if (getComputedStyle(host).position === 'static') {
90
+ this.#renderer.setStyle(host, 'position', 'relative');
91
+ }
92
+ const area = this.#renderer.createElement('span');
93
+ this.#renderer.addClass(area, `${BEM_BLOCK}__area`);
94
+ this.#renderer.setAttribute(area, 'aria-hidden', 'true');
95
+ this.#renderer.appendChild(host, area);
96
+ this.#area = area;
97
+ return area;
98
+ }
99
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtRippleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
100
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: RtRippleDirective, isStandalone: true, selector: "[rtRipple]", inputs: { rippleDisabled: { classPropertyName: "rippleDisabled", publicName: "rippleDisabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "pointerdown": "launch($event)" }, classAttribute: "rt-ripple" }, ngImport: i0 }); }
101
+ }
102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtRippleDirective, decorators: [{
103
+ type: Directive,
104
+ args: [{
105
+ selector: '[rtRipple]',
106
+ host: {
107
+ class: BEM_BLOCK,
108
+ '(pointerdown)': 'launch($event)',
109
+ },
110
+ }]
111
+ }], ctorParameters: () => [], propDecorators: { rippleDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "rippleDisabled", required: false }] }] } });
112
+
113
+ /**
114
+ * Generated bundle index. Do not edit.
115
+ */
116
+
117
+ export { RtRippleDirective };
118
+ //# sourceMappingURL=rt-tools-ui-kit-v2-ripple.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-ripple.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/ripple/rt-ripple.directive.ts","../../../projects/ui-kit-v2/src/lib/components/ripple/rt-tools-ui-kit-v2-ripple.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, DestroyRef, Directive, ElementRef, inject, input, InputSignalWithTransform, Renderer2 } from '@angular/core';\n\nconst BEM_BLOCK: string = 'rt-ripple';\n\n/** Сколько живёт один слой волны. Совпадает с длительностью в стилях блока. */\nconst RIPPLE_LIFETIME_MS: number = 550;\n\n/**\n * Волна нажатия. Ставится на элемент, который нажимают, и рисует расходящийся\n * от точки касания круг.\n *\n * Волна живёт в своём обрезающем слое внутри элемента, а не прямо в нём:\n * `overflow: hidden` на самой кнопке срезал бы всё, что торчит за её край, —\n * у кнопки-значка так стоит метка, вынесенная на два пикселя наружу.\n *\n * @example\n * ```html\n * <button rtRipple>Сохранить</button>\n * <button rtRipple [rippleDisabled]=\"loading()\">Сохранить</button>\n * ```\n */\n@Directive({\n selector: '[rtRipple]',\n host: {\n class: BEM_BLOCK,\n '(pointerdown)': 'launch($event)',\n },\n})\nexport class RtRippleDirective {\n readonly #el: ElementRef<HTMLElement> = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly #renderer: Renderer2 = inject(Renderer2);\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n /** Слои, которые ещё гаснут: снимаются, если элемент умрёт раньше их. */\n readonly #live: Set<ReturnType<typeof setTimeout>> = new Set<ReturnType<typeof setTimeout>>();\n\n /** Обрезающий слой заводится при первом нажатии: у кнопки, которую не нажали, его нет. */\n #area: HTMLElement | null = null;\n\n /**\n * Отключает волну, не трогая остальное поведение элемента.\n * Отключённая и загружающаяся кнопка волны не даёт.\n */\n public readonly rippleDisabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Гасит незакончившиеся волны: иначе таймер трогает снятый из дерева узел. */\n constructor() {\n this.#destroyRef.onDestroy((): void => {\n for (const timer of this.#live) {\n clearTimeout(timer);\n }\n this.#live.clear();\n });\n }\n\n /**\n * Ставит один слой волны от точки нажатия и снимает его, когда тот отгорит.\n *\n * Радиус считается по дальнему углу элемента: волна из угла должна накрыть\n * противоположный, иначе на широкой кнопке она обрывается на полпути.\n */\n public launch(event: PointerEvent): void {\n const host: HTMLElement = this.#el.nativeElement;\n if (this.rippleDisabled() || (host as HTMLButtonElement).disabled) {\n return;\n }\n\n const box: DOMRect = host.getBoundingClientRect();\n const x: number = event.clientX - box.left;\n const y: number = event.clientY - box.top;\n const radius: number = Math.hypot(Math.max(x, box.width - x), Math.max(y, box.height - y));\n\n const area: HTMLElement = this.#ensureArea(host);\n const layer: HTMLElement = this.#renderer.createElement('span');\n this.#renderer.addClass(layer, `${BEM_BLOCK}__wave`);\n this.#renderer.setStyle(layer, 'left', `${x - radius}px`);\n this.#renderer.setStyle(layer, 'top', `${y - radius}px`);\n this.#renderer.setStyle(layer, 'width', `${radius * 2}px`);\n this.#renderer.setStyle(layer, 'height', `${radius * 2}px`);\n this.#renderer.appendChild(area, layer);\n\n const timer: ReturnType<typeof setTimeout> = setTimeout((): void => {\n this.#live.delete(timer);\n if (layer.parentNode) {\n this.#renderer.removeChild(area, layer);\n }\n }, RIPPLE_LIFETIME_MS);\n this.#live.add(timer);\n }\n\n /** Обрезающий слой один на элемент: он повторяет его скругление и не ловит указатель. */\n #ensureArea(host: HTMLElement): HTMLElement {\n if (this.#area?.parentNode) {\n return this.#area;\n }\n\n /* Обрезающий слой стоит absolute, и ему нужен позиционированный предок. Позиция\n ставится здесь, а не правилом блока: правило висело бы на каждой кнопке кита и\n меняло растеризацию кадров витрины, ничего не двигая в раскладке. */\n if (getComputedStyle(host).position === 'static') {\n this.#renderer.setStyle(host, 'position', 'relative');\n }\n\n const area: HTMLElement = this.#renderer.createElement('span');\n this.#renderer.addClass(area, `${BEM_BLOCK}__area`);\n this.#renderer.setAttribute(area, 'aria-hidden', 'true');\n this.#renderer.appendChild(host, area);\n this.#area = area;\n\n return area;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}