@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,143 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, viewChild, signal, computed, input, booleanAttribute, forwardRef, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';
4
+ import { RT_KIT_LABELS } from '@rt-tools/ui-kit-v2/core';
5
+ import { RtFormControlBase } from '@rt-tools/ui-kit-v2/form-control';
6
+ import { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';
7
+ import { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';
8
+ import * as i1 from '@rt-tools/ui-kit-v2/radius';
9
+ import { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';
10
+
11
+ const BEM_BLOCK = 'rt-input';
12
+ /**
13
+ * Шеренный input common/ui. Поддерживает:
14
+ * - интеграцию с Reactive Forms через общий `RtFormControlBase` (CVA-ядро,
15
+ * авто-подсветка invalid, `clearable`);
16
+ * - левую и правую иконочные «слоты» (`iconLeft`, `iconRight`);
17
+ * - встроенный password-toggle (`passwordToggle=true` + `type="password"`);
18
+ * - кнопку очистки (крестик) при наличии значения; на password-полях крестик
19
+ * не показывается (postfix занят toggle'ом).
20
+ *
21
+ * Все размеры/цвета — через `--rt-input-*` semantic-токены.
22
+ */
23
+ class RtInputComponent extends RtFormControlBase {
24
+ constructor() {
25
+ super(...arguments);
26
+ this.t = inject(RT_KIT_LABELS);
27
+ this.fieldEl = viewChild('fieldEl', /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "fieldEl" }] : /* istanbul ignore next */ []));
29
+ this.isPasswordVisible = signal(false, /* @ts-ignore */
30
+ ...(ngDevMode ? [{ debugName: "isPasswordVisible" }] : /* istanbul ignore next */ []));
31
+ this.hasValue = computed(() => this.value() !== '', /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "hasValue" }] : /* istanbul ignore next */ []));
33
+ this.effectiveType = computed(() => {
34
+ const t = this.type();
35
+ if (t === 'password' && this.passwordToggle() && this.isPasswordVisible()) {
36
+ return 'text';
37
+ }
38
+ return t;
39
+ }, /* @ts-ignore */
40
+ ...(ngDevMode ? [{ debugName: "effectiveType" }] : /* istanbul ignore next */ []));
41
+ this.showPasswordToggle = computed(() => this.passwordToggle() && this.type() === 'password', /* @ts-ignore */
42
+ ...(ngDevMode ? [{ debugName: "showPasswordToggle" }] : /* istanbul ignore next */ []));
43
+ this.hasIconRight = computed(() => !!this.iconRight() || this.showPasswordToggle(), /* @ts-ignore */
44
+ ...(ngDevMode ? [{ debugName: "hasIconRight" }] : /* istanbul ignore next */ []));
45
+ this.passwordToggleIcon = computed(() => this.isPasswordVisible() ? 'ico-eyeClose' : 'ico-eye', /* @ts-ignore */
46
+ ...(ngDevMode ? [{ debugName: "passwordToggleIcon" }] : /* istanbul ignore next */ []));
47
+ /** Вид рамки: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. */
48
+ this.appearance = input('outline', /* @ts-ignore */
49
+ ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
50
+ this.displayText = computed(() => this.value(), /* @ts-ignore */
51
+ ...(ngDevMode ? [{ debugName: "displayText" }] : /* istanbul ignore next */ []));
52
+ this.type = input('text', /* @ts-ignore */
53
+ ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
54
+ this.placeholder = input('', /* @ts-ignore */
55
+ ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
56
+ this.iconLeft = input(null, /* @ts-ignore */
57
+ ...(ngDevMode ? [{ debugName: "iconLeft" }] : /* istanbul ignore next */ []));
58
+ this.iconRight = input(null, /* @ts-ignore */
59
+ ...(ngDevMode ? [{ debugName: "iconRight" }] : /* istanbul ignore next */ []));
60
+ this.passwordToggle = input(false, { ...(ngDevMode ? { debugName: "passwordToggle" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
61
+ this.autocomplete = input(null, /* @ts-ignore */
62
+ ...(ngDevMode ? [{ debugName: "autocomplete" }] : /* istanbul ignore next */ []));
63
+ }
64
+ getEmptyValue() {
65
+ return '';
66
+ }
67
+ focusAfterClear() {
68
+ this.fieldEl()?.nativeElement.focus();
69
+ }
70
+ /**
71
+ * Падинг/гэп рамки принадлежат host-контейнеру, а не `<input>`, поэтому клик
72
+ * по этой зоне сам по себе не фокусирует поле. Перехватываем mousedown и
73
+ * переводим фокус в input — но только если клик не пришёлся на само поле
74
+ * (там нужно нативное позиционирование курсора) и не на интерактивный
75
+ * постфикс (крестик/таггл со своими обработчиками).
76
+ */
77
+ onHostMousedown(event) {
78
+ if (this.isDisabled()) {
79
+ return;
80
+ }
81
+ const field = this.fieldEl()?.nativeElement;
82
+ const target = event.target;
83
+ if (!field || target === field || target.closest('button, rt-icon-button')) {
84
+ return;
85
+ }
86
+ event.preventDefault();
87
+ field.focus();
88
+ }
89
+ onInput(event) {
90
+ const target = event.target;
91
+ const next = target.value;
92
+ this.value.set(next);
93
+ this.emitChange(next);
94
+ }
95
+ onBlur() {
96
+ this.markTouched();
97
+ }
98
+ togglePassword() {
99
+ this.isPasswordVisible.update((v) => !v);
100
+ }
101
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
102
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtInputComponent, isStandalone: true, selector: "rt-input", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, iconLeft: { classPropertyName: "iconLeft", publicName: "iconLeft", isSignal: true, isRequired: false, transformFunction: null }, iconRight: { classPropertyName: "iconRight", publicName: "iconRight", isSignal: true, isRequired: false, transformFunction: null }, passwordToggle: { classPropertyName: "passwordToggle", publicName: "passwordToggle", isSignal: true, isRequired: false, transformFunction: null }, autocomplete: { classPropertyName: "autocomplete", publicName: "autocomplete", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "mousedown": "onHostMousedown($event)" }, properties: { "class.rt-input--disabled": "isDisabled()", "class.rt-input--invalid": "isInvalid()", "class.rt-input--readonly": "isReadonly()", "class.rt-input--borderless": "!bordered()", "class.rt-input--appearance--fill": "appearance() === 'fill'", "class.rt-input--size--sm": "size() === 'sm'", "class.rt-input--size--lg": "size() === 'lg'", "class.rt-input--with-icon-left": "!!iconLeft()", "class.rt-input--with-icon-right": "hasIconRight()" }, classAttribute: "rt-input" }, providers: [
103
+ // Алиас базового токена — чтобы rt-field мог найти контрол через
104
+ // contentChild(RtFormControlBase) (query по абстрактному классу).
105
+ { provide: RtFormControlBase, useExisting: forwardRef(() => RtInputComponent) },
106
+ ], viewQueries: [{ propertyName: "fieldEl", first: true, predicate: ["fieldEl"], descendants: true, isSignal: true }], usesInheritance: true, hostDirectives: [{ directive: i1.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<ng-container rtBlock=\"rt-input\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" qa-dataid=\"input-readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '\u2014' }}</span>\n } @else {\n @if (iconLeft(); as left) {\n <rt-icon rtElem=\"icon-left\" size=\"sm\" color=\"muted\" [name]=\"left\" />\n }\n <input\n #fieldEl\n rtElem=\"field\"\n qa-dataid=\"input-control\"\n [type]=\"effectiveType()\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\" />\n @if (showClearButton() && !showPasswordToggle()) {\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"input-clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"t().uiClear\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n @if (showPasswordToggle()) {\n <button\n rtElem=\"toggle\"\n qa-dataid=\"input-password-toggle\"\n type=\"button\"\n [attr.aria-label]=\"isPasswordVisible() ? t().uiHidePassword : t().uiShowPassword\"\n [tabIndex]=\"-1\"\n (click)=\"togglePassword()\">\n <rt-icon size=\"sm\" color=\"muted\" [name]=\"passwordToggleIcon()\" />\n </button>\n } @else if (iconRight(); as right) {\n <rt-icon rtElem=\"icon-right\" size=\"sm\" color=\"muted\" [name]=\"right\" />\n }\n }\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-input{--rt-input-box-radius: var(--rt-input-radius);--rt-input-fill-radius: var(--rt-radius-sm);--rt-input-toggle-radius: var(--rt-radius-sm);position:relative;display:inline-flex;width:100%;min-height:var(--rt-input-height);box-sizing:border-box;align-items:center;padding:var(--rt-input-padding-y) var(--rt-input-padding-x);border:var(--rt-input-border-width) solid var(--rt-input-color-border);border-radius:var(--rt-input-box-radius);background-color:var(--rt-input-color-bg);color:var(--rt-input-color-text);cursor:text;font-size:var(--rt-input-font-size);gap:var(--rt-input-gap);line-height:var(--rt-input-line-height);transition:var(--rt-input-transition)}.rt-input:focus-within{border-color:var(--rt-input-color-border-focus);box-shadow:var(--rt-input-focus-shadow);outline:2px solid transparent;outline-offset:var(--rt-input-focus-outline-offset)}.rt-input--borderless{border-color:transparent}.rt-input--appearance--fill{border-color:transparent;border-radius:var(--rt-input-fill-radius) var(--rt-input-fill-radius) 0 0;border-bottom-color:var(--rt-color-field-fill-underline);background-color:var(--rt-color-bg-surface-subtle-2)}.rt-input--invalid{border-color:var(--rt-input-color-border-error)}.rt-input--invalid:focus-within{box-shadow:var(--rt-input-focus-shadow-error)}.rt-input--disabled{cursor:not-allowed;opacity:var(--rt-input-disabled-opacity)}.rt-input--size--sm{min-height:var(--rt-input-height-sm)}.rt-input--size--lg{min-height:var(--rt-input-height-lg)}.rt-input--readonly{padding-right:0;padding-left:0;border-color:transparent;background-color:transparent;cursor:default}.rt-input__readonly{color:var(--rt-field-value-color);font-size:var(--rt-field-value-font-size)}.rt-input__readonly--empty{color:var(--rt-field-value-empty-color)}.rt-input__field{min-width:0;flex:1 1 auto;padding:0;border:none;background:transparent;color:inherit;font:inherit;outline:none}.rt-input__field::placeholder{color:var(--rt-input-color-text-placeholder);opacity:1}.rt-input__field:disabled{cursor:not-allowed}.rt-input__icon-left,.rt-input__icon-right,.rt-input__clear{flex-shrink:0}.rt-input__icon-left,.rt-input__icon-right{--rt-icon-color-muted: var(--rt-input-icon-color);min-width:var(--rt-input-icon-size);min-height:var(--rt-input-icon-size)}.rt-input__toggle{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;padding:var(--rt-space-1);border:none;border-radius:var(--rt-input-toggle-radius);margin:0;background:transparent;color:inherit;cursor:pointer}.rt-input__toggle:hover{background-color:var(--rt-input-color-bg-hover)}.rt-input__toggle:focus-visible{outline:var(--rt-input-border-width) solid var(--rt-input-color-border-focus);outline-offset:var(--rt-input-focus-outline-offset)}.rt-input[data-rt-radius=none]{--rt-input-box-radius: var(--rt-radius-none)}.rt-input[data-rt-radius=xs]{--rt-input-box-radius: var(--rt-radius-xs)}.rt-input[data-rt-radius=sm]{--rt-input-box-radius: var(--rt-radius-sm)}.rt-input[data-rt-radius=ms]{--rt-input-box-radius: var(--rt-radius-ms)}.rt-input[data-rt-radius=md]{--rt-input-box-radius: var(--rt-radius-md)}.rt-input[data-rt-radius=lg]{--rt-input-box-radius: var(--rt-radius-lg)}.rt-input[data-rt-radius=xl]{--rt-input-box-radius: var(--rt-radius-xl)}.rt-input[data-rt-radius=\"2xl\"]{--rt-input-box-radius: var(--rt-radius-2xl)}.rt-input[data-rt-radius=full]{--rt-input-box-radius: var(--rt-radius-full)}}\n"], dependencies: [{ kind: "component", type:
107
+ // standalone components / directives
108
+ 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: 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"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
109
+ }
110
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtInputComponent, decorators: [{
111
+ type: Component,
112
+ args: [{ selector: 'rt-input', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
113
+ // standalone components / directives
114
+ RtIconButtonComponent,
115
+ RtIconComponent,
116
+ BlockDirective,
117
+ ElemDirective,
118
+ ModDirective,
119
+ ], providers: [
120
+ // Алиас базового токена — чтобы rt-field мог найти контрол через
121
+ // contentChild(RtFormControlBase) (query по абстрактному классу).
122
+ { provide: RtFormControlBase, useExisting: forwardRef(() => RtInputComponent) },
123
+ ], hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }], host: {
124
+ class: BEM_BLOCK,
125
+ '[class.rt-input--disabled]': 'isDisabled()',
126
+ '[class.rt-input--invalid]': 'isInvalid()',
127
+ '[class.rt-input--readonly]': 'isReadonly()',
128
+ '[class.rt-input--borderless]': '!bordered()',
129
+ '[class.rt-input--appearance--fill]': "appearance() === 'fill'",
130
+ '[class.rt-input--size--sm]': "size() === 'sm'",
131
+ '[class.rt-input--size--lg]': "size() === 'lg'",
132
+ '[class.rt-input--with-icon-left]': '!!iconLeft()',
133
+ '[class.rt-input--with-icon-right]': 'hasIconRight()',
134
+ '(mousedown)': 'onHostMousedown($event)',
135
+ }, template: "<ng-container rtBlock=\"rt-input\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" qa-dataid=\"input-readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '\u2014' }}</span>\n } @else {\n @if (iconLeft(); as left) {\n <rt-icon rtElem=\"icon-left\" size=\"sm\" color=\"muted\" [name]=\"left\" />\n }\n <input\n #fieldEl\n rtElem=\"field\"\n qa-dataid=\"input-control\"\n [type]=\"effectiveType()\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\" />\n @if (showClearButton() && !showPasswordToggle()) {\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"input-clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"t().uiClear\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n @if (showPasswordToggle()) {\n <button\n rtElem=\"toggle\"\n qa-dataid=\"input-password-toggle\"\n type=\"button\"\n [attr.aria-label]=\"isPasswordVisible() ? t().uiHidePassword : t().uiShowPassword\"\n [tabIndex]=\"-1\"\n (click)=\"togglePassword()\">\n <rt-icon size=\"sm\" color=\"muted\" [name]=\"passwordToggleIcon()\" />\n </button>\n } @else if (iconRight(); as right) {\n <rt-icon rtElem=\"icon-right\" size=\"sm\" color=\"muted\" [name]=\"right\" />\n }\n }\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-input{--rt-input-box-radius: var(--rt-input-radius);--rt-input-fill-radius: var(--rt-radius-sm);--rt-input-toggle-radius: var(--rt-radius-sm);position:relative;display:inline-flex;width:100%;min-height:var(--rt-input-height);box-sizing:border-box;align-items:center;padding:var(--rt-input-padding-y) var(--rt-input-padding-x);border:var(--rt-input-border-width) solid var(--rt-input-color-border);border-radius:var(--rt-input-box-radius);background-color:var(--rt-input-color-bg);color:var(--rt-input-color-text);cursor:text;font-size:var(--rt-input-font-size);gap:var(--rt-input-gap);line-height:var(--rt-input-line-height);transition:var(--rt-input-transition)}.rt-input:focus-within{border-color:var(--rt-input-color-border-focus);box-shadow:var(--rt-input-focus-shadow);outline:2px solid transparent;outline-offset:var(--rt-input-focus-outline-offset)}.rt-input--borderless{border-color:transparent}.rt-input--appearance--fill{border-color:transparent;border-radius:var(--rt-input-fill-radius) var(--rt-input-fill-radius) 0 0;border-bottom-color:var(--rt-color-field-fill-underline);background-color:var(--rt-color-bg-surface-subtle-2)}.rt-input--invalid{border-color:var(--rt-input-color-border-error)}.rt-input--invalid:focus-within{box-shadow:var(--rt-input-focus-shadow-error)}.rt-input--disabled{cursor:not-allowed;opacity:var(--rt-input-disabled-opacity)}.rt-input--size--sm{min-height:var(--rt-input-height-sm)}.rt-input--size--lg{min-height:var(--rt-input-height-lg)}.rt-input--readonly{padding-right:0;padding-left:0;border-color:transparent;background-color:transparent;cursor:default}.rt-input__readonly{color:var(--rt-field-value-color);font-size:var(--rt-field-value-font-size)}.rt-input__readonly--empty{color:var(--rt-field-value-empty-color)}.rt-input__field{min-width:0;flex:1 1 auto;padding:0;border:none;background:transparent;color:inherit;font:inherit;outline:none}.rt-input__field::placeholder{color:var(--rt-input-color-text-placeholder);opacity:1}.rt-input__field:disabled{cursor:not-allowed}.rt-input__icon-left,.rt-input__icon-right,.rt-input__clear{flex-shrink:0}.rt-input__icon-left,.rt-input__icon-right{--rt-icon-color-muted: var(--rt-input-icon-color);min-width:var(--rt-input-icon-size);min-height:var(--rt-input-icon-size)}.rt-input__toggle{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;padding:var(--rt-space-1);border:none;border-radius:var(--rt-input-toggle-radius);margin:0;background:transparent;color:inherit;cursor:pointer}.rt-input__toggle:hover{background-color:var(--rt-input-color-bg-hover)}.rt-input__toggle:focus-visible{outline:var(--rt-input-border-width) solid var(--rt-input-color-border-focus);outline-offset:var(--rt-input-focus-outline-offset)}.rt-input[data-rt-radius=none]{--rt-input-box-radius: var(--rt-radius-none)}.rt-input[data-rt-radius=xs]{--rt-input-box-radius: var(--rt-radius-xs)}.rt-input[data-rt-radius=sm]{--rt-input-box-radius: var(--rt-radius-sm)}.rt-input[data-rt-radius=ms]{--rt-input-box-radius: var(--rt-radius-ms)}.rt-input[data-rt-radius=md]{--rt-input-box-radius: var(--rt-radius-md)}.rt-input[data-rt-radius=lg]{--rt-input-box-radius: var(--rt-radius-lg)}.rt-input[data-rt-radius=xl]{--rt-input-box-radius: var(--rt-radius-xl)}.rt-input[data-rt-radius=\"2xl\"]{--rt-input-box-radius: var(--rt-radius-2xl)}.rt-input[data-rt-radius=full]{--rt-input-box-radius: var(--rt-radius-full)}}\n"] }]
136
+ }], propDecorators: { fieldEl: [{ type: i0.ViewChild, args: ['fieldEl', { isSignal: true }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], iconLeft: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconLeft", required: false }] }], iconRight: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconRight", required: false }] }], passwordToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "passwordToggle", required: false }] }], autocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "autocomplete", required: false }] }] } });
137
+
138
+ /**
139
+ * Generated bundle index. Do not edit.
140
+ */
141
+
142
+ export { RtInputComponent };
143
+ //# sourceMappingURL=rt-tools-ui-kit-v2-input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-input.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/input/rt-input.component.ts","../../../projects/ui-kit-v2/src/lib/components/input/rt-input.component.html","../../../projects/ui-kit-v2/src/lib/components/input/rt-tools-ui-kit-v2-input.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { RtFormControlBase } from '@rt-tools/ui-kit-v2/form-control';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { IRtInput } from '@rt-tools/ui-kit-v2/core';\n\nconst BEM_BLOCK: string = 'rt-input';\n\n/**\n * Шеренный input common/ui. Поддерживает:\n * - интеграцию с Reactive Forms через общий `RtFormControlBase` (CVA-ядро,\n * авто-подсветка invalid, `clearable`);\n * - левую и правую иконочные «слоты» (`iconLeft`, `iconRight`);\n * - встроенный password-toggle (`passwordToggle=true` + `type=\"password\"`);\n * - кнопку очистки (крестик) при наличии значения; на password-полях крестик\n * не показывается (postfix занят toggle'ом).\n *\n * Все размеры/цвета — через `--rt-input-*` semantic-токены.\n */\n@Component({\n selector: 'rt-input',\n templateUrl: './rt-input.component.html',\n styleUrls: ['./rt-input.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n providers: [\n // Алиас базового токена — чтобы rt-field мог найти контрол через\n // contentChild(RtFormControlBase) (query по абстрактному классу).\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtInputComponent) },\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[class.rt-input--disabled]': 'isDisabled()',\n '[class.rt-input--invalid]': 'isInvalid()',\n '[class.rt-input--readonly]': 'isReadonly()',\n '[class.rt-input--borderless]': '!bordered()',\n '[class.rt-input--appearance--fill]': \"appearance() === 'fill'\",\n '[class.rt-input--size--sm]': \"size() === 'sm'\",\n '[class.rt-input--size--lg]': \"size() === 'lg'\",\n '[class.rt-input--with-icon-left]': '!!iconLeft()',\n '[class.rt-input--with-icon-right]': 'hasIconRight()',\n '(mousedown)': 'onHostMousedown($event)',\n },\n})\nexport class RtInputComponent extends RtFormControlBase<string> {\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly fieldEl: Signal<ElementRef<HTMLInputElement> | undefined> = viewChild<ElementRef<HTMLInputElement>>('fieldEl');\n\n protected readonly isPasswordVisible: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly hasValue: Signal<boolean> = computed((): boolean => this.value() !== '');\n\n protected readonly effectiveType: Signal<string> = computed((): string => {\n const t: IRtInput.Type = this.type();\n if (t === 'password' && this.passwordToggle() && this.isPasswordVisible()) {\n return 'text';\n }\n return t;\n });\n\n protected readonly showPasswordToggle: Signal<boolean> = computed((): boolean => this.passwordToggle() && this.type() === 'password');\n\n protected readonly hasIconRight: Signal<boolean> = computed((): boolean => !!this.iconRight() || this.showPasswordToggle());\n\n protected readonly passwordToggleIcon: Signal<IRtIcon.Name> = computed((): IRtIcon.Name =>\n this.isPasswordVisible() ? 'ico-eyeClose' : 'ico-eye'\n );\n\n /** Вид рамки: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. */\n public readonly appearance: InputSignal<IRtInput.Appearance> = input<IRtInput.Appearance>('outline');\n\n public readonly displayText: Signal<string> = computed((): string => this.value());\n\n public readonly type: InputSignal<IRtInput.Type> = input<IRtInput.Type>('text');\n public readonly placeholder: InputSignal<string> = input<string>('');\n public readonly iconLeft: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n public readonly iconRight: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n public readonly passwordToggle: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n public readonly autocomplete: InputSignal<string | null> = input<string | null>(null);\n\n protected getEmptyValue(): string {\n return '';\n }\n\n protected focusAfterClear(): void {\n this.fieldEl()?.nativeElement.focus();\n }\n\n /**\n * Падинг/гэп рамки принадлежат host-контейнеру, а не `<input>`, поэтому клик\n * по этой зоне сам по себе не фокусирует поле. Перехватываем mousedown и\n * переводим фокус в input — но только если клик не пришёлся на само поле\n * (там нужно нативное позиционирование курсора) и не на интерактивный\n * постфикс (крестик/таггл со своими обработчиками).\n */\n protected onHostMousedown(event: MouseEvent): void {\n if (this.isDisabled()) {\n return;\n }\n const field: HTMLInputElement | undefined = this.fieldEl()?.nativeElement;\n const target: HTMLElement = event.target as HTMLElement;\n if (!field || target === field || target.closest('button, rt-icon-button')) {\n return;\n }\n event.preventDefault();\n field.focus();\n }\n\n protected onInput(event: Event): void {\n const target: HTMLInputElement = event.target as HTMLInputElement;\n const next: string = target.value;\n this.value.set(next);\n this.emitChange(next);\n }\n\n protected onBlur(): void {\n this.markTouched();\n }\n\n protected togglePassword(): void {\n this.isPasswordVisible.update((v: boolean): boolean => !v);\n }\n}\n","<ng-container rtBlock=\"rt-input\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" qa-dataid=\"input-readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '—' }}</span>\n } @else {\n @if (iconLeft(); as left) {\n <rt-icon rtElem=\"icon-left\" size=\"sm\" color=\"muted\" [name]=\"left\" />\n }\n <input\n #fieldEl\n rtElem=\"field\"\n qa-dataid=\"input-control\"\n [type]=\"effectiveType()\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\" />\n @if (showClearButton() && !showPasswordToggle()) {\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"input-clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"t().uiClear\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n @if (showPasswordToggle()) {\n <button\n rtElem=\"toggle\"\n qa-dataid=\"input-password-toggle\"\n type=\"button\"\n [attr.aria-label]=\"isPasswordVisible() ? t().uiHidePassword : t().uiShowPassword\"\n [tabIndex]=\"-1\"\n (click)=\"togglePassword()\">\n <rt-icon size=\"sm\" color=\"muted\" [name]=\"passwordToggleIcon()\" />\n </button>\n } @else if (iconRight(); as right) {\n <rt-icon rtElem=\"icon-right\" size=\"sm\" color=\"muted\" [name]=\"right\" />\n }\n }\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,49 @@
1
+ import * as i0 from '@angular/core';
2
+ import { computed, input, booleanAttribute, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';
4
+ import { rtKitLabel } from '@rt-tools/ui-kit-v2/core';
5
+
6
+ const BEM_BLOCK = 'rt-live-badge';
7
+ /**
8
+ * Пилюля живого счётчика: точка состояния, подпись и число. `active` означает
9
+ * «поток жив», а не «счётчик больше нуля»: ноль посетителей при живом потоке —
10
+ * это данные, а оборванный поток — отсутствие данных, и выглядеть они должны
11
+ * по-разному.
12
+ */
13
+ class RtLiveBadgeComponent {
14
+ constructor() {
15
+ this.#t_uiLiveOnSite = rtKitLabel('uiLiveOnSite');
16
+ this.labelText = computed(() => this.label() || this.#t_uiLiveOnSite(), /* @ts-ignore */
17
+ ...(ngDevMode ? [{ debugName: "labelText" }] : /* istanbul ignore next */ []));
18
+ /** Пусто — берётся переведённая подпись по умолчанию */
19
+ this.label = input('', /* @ts-ignore */
20
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
21
+ /** `null` — данных ещё нет, рисуется прочерк. */
22
+ this.count = input(null, /* @ts-ignore */
23
+ ...(ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []));
24
+ this.active = input(false, { ...(ngDevMode ? { debugName: "active" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
25
+ }
26
+ #t_uiLiveOnSite;
27
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtLiveBadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: RtLiveBadgeComponent, isStandalone: true, selector: "rt-live-badge", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, count: { classPropertyName: "count", publicName: "count", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "rt-live-badge" }, ngImport: i0, template: "<span rtBlock=\"rt-live-badge\" qa-dataid=\"live-badge\" [attr.data-active]=\"active()\" [rtMod]=\"{ active: active() }\">\n <span rtElem=\"dot\"></span>\n <span rtElem=\"label\" qa-dataid=\"live-badge-label\">{{ labelText() }}</span>\n <span rtElem=\"count\" qa-dataid=\"live-badge-count\">{{ count() ?? '\u2014' }}</span>\n</span>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-live-badge{display:inline-flex}rt-live-badge .rt-live-badge{--rt-live-badge-dot-radius: var(--rt-radius-full);display:inline-flex;align-items:center;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm);gap:var(--rt-space-1)}rt-live-badge .rt-live-badge--active .rt-live-badge__dot{background:var(--rt-color-state-success)}rt-live-badge .rt-live-badge__dot{width:8px;height:8px;border-radius:var(--rt-live-badge-dot-radius);background:var(--rt-color-border-subtle)}rt-live-badge .rt-live-badge__count{color:var(--rt-color-text-primary)}}\n"], dependencies: [{ kind: "directive", type:
29
+ // standalone components / directives
30
+ 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 }); }
31
+ }
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtLiveBadgeComponent, decorators: [{
33
+ type: Component,
34
+ args: [{ selector: 'rt-live-badge', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
35
+ // standalone components / directives
36
+ BlockDirective,
37
+ ElemDirective,
38
+ ModDirective,
39
+ ], host: {
40
+ class: BEM_BLOCK,
41
+ }, template: "<span rtBlock=\"rt-live-badge\" qa-dataid=\"live-badge\" [attr.data-active]=\"active()\" [rtMod]=\"{ active: active() }\">\n <span rtElem=\"dot\"></span>\n <span rtElem=\"label\" qa-dataid=\"live-badge-label\">{{ labelText() }}</span>\n <span rtElem=\"count\" qa-dataid=\"live-badge-count\">{{ count() ?? '\u2014' }}</span>\n</span>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-live-badge{display:inline-flex}rt-live-badge .rt-live-badge{--rt-live-badge-dot-radius: var(--rt-radius-full);display:inline-flex;align-items:center;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm);gap:var(--rt-space-1)}rt-live-badge .rt-live-badge--active .rt-live-badge__dot{background:var(--rt-color-state-success)}rt-live-badge .rt-live-badge__dot{width:8px;height:8px;border-radius:var(--rt-live-badge-dot-radius);background:var(--rt-color-border-subtle)}rt-live-badge .rt-live-badge__count{color:var(--rt-color-text-primary)}}\n"] }]
42
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], count: [{ type: i0.Input, args: [{ isSignal: true, alias: "count", required: false }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }] } });
43
+
44
+ /**
45
+ * Generated bundle index. Do not edit.
46
+ */
47
+
48
+ export { RtLiveBadgeComponent };
49
+ //# sourceMappingURL=rt-tools-ui-kit-v2-live-badge.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-live-badge.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/live-badge/rt-live-badge.component.ts","../../../projects/ui-kit-v2/src/lib/components/live-badge/rt-live-badge.component.html","../../../projects/ui-kit-v2/src/lib/components/live-badge/rt-tools-ui-kit-v2-live-badge.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\n\nconst BEM_BLOCK: string = 'rt-live-badge';\n\n/**\n * Пилюля живого счётчика: точка состояния, подпись и число. `active` означает\n * «поток жив», а не «счётчик больше нуля»: ноль посетителей при живом потоке —\n * это данные, а оборванный поток — отсутствие данных, и выглядеть они должны\n * по-разному.\n */\n@Component({\n selector: 'rt-live-badge',\n templateUrl: './rt-live-badge.component.html',\n styleUrl: './rt-live-badge.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtLiveBadgeComponent {\n readonly #t_uiLiveOnSite: Signal<string> = rtKitLabel('uiLiveOnSite');\n\n protected readonly labelText: Signal<string> = computed((): string => this.label() || this.#t_uiLiveOnSite());\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly label: InputSignal<string> = input<string>('');\n\n /** `null` — данных ещё нет, рисуется прочерк. */\n public readonly count: InputSignal<number | null> = input<number | null>(null);\n\n public readonly active: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n}\n","<span rtBlock=\"rt-live-badge\" qa-dataid=\"live-badge\" [attr.data-active]=\"active()\" [rtMod]=\"{ active: active() }\">\n <span rtElem=\"dot\"></span>\n <span rtElem=\"label\" qa-dataid=\"live-badge-label\">{{ labelText() }}</span>\n <span rtElem=\"count\" qa-dataid=\"live-badge-count\">{{ count() ?? '—' }}</span>\n</span>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAiBA,MAAM,SAAS,GAAW,eAAe;AAEzC;;;;;AAKG;MAiBU,oBAAoB,CAAA;AAhBjC,IAAA,WAAA,GAAA;AAiBa,QAAA,IAAA,CAAA,eAAe,GAAmB,UAAU,CAAC,cAAc,CAAC;AAElD,QAAA,IAAA,CAAA,SAAS,GAAmB,QAAQ,CAAC,MAAc,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE;sFAAC;;QAG7F,IAAA,CAAA,KAAK,GAAwB,KAAK,CAAS,EAAE;kFAAC;;QAG9C,IAAA,CAAA,KAAK,GAA+B,KAAK,CAAgB,IAAI;kFAAC;QAE9D,IAAA,CAAA,MAAM,GAAoD,KAAK,CAAwB,KAAK,8EACxG,SAAS,EAAE,gBAAgB,EAAA,CAC7B;AACL,IAAA;AAbY,IAAA,eAAe;8GADf,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,2eCzCjC,yVAKA,EAAA,MAAA,EAAA,CAAA,mlBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA;;gBD4BQ,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;;2FAMP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAhBhC,SAAS;+BACI,eAAe,EAAA,eAAA,EAGR,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;;wBAEL,cAAc;wBACd,aAAa;wBACb,YAAY;qBACf,EAAA,IAAA,EACK;AACF,wBAAA,KAAK,EAAE,SAAS;AACnB,qBAAA,EAAA,QAAA,EAAA,yVAAA,EAAA,MAAA,EAAA,CAAA,mlBAAA,CAAA,EAAA;;;AEvCL;;AAEG;;;;"}
@@ -0,0 +1,97 @@
1
+ import * as i0 from '@angular/core';
2
+ import { computed, input, numberAttribute, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { BlockDirective, ElemDirective } from '@rt-tools/core';
4
+
5
+ /**
6
+ * Высота в px, с которой рисуется вариант, если её не задали явно. `0`
7
+ * означает «брать умолчание варианта».
8
+ */
9
+ const DEFAULT_HEIGHT = Object.freeze({
10
+ wordmark: 51,
11
+ lockup: 75,
12
+ });
13
+ /** Отношение ширины к высоте, с которым рисуется вариант без явного `aspect`. */
14
+ const DEFAULT_ASPECT = Object.freeze({
15
+ wordmark: 5.4,
16
+ lockup: 3.6,
17
+ });
18
+ const BEM_BLOCK = 'rt-logo';
19
+ /**
20
+ * Логотип приложения: начертание названия и, в варианте `lockup`, слоган под ним.
21
+ *
22
+ * Сами начертания кит не везёт — их даёт приложение, задав на любом предке
23
+ * четыре свойства оформления: `--rt-logo-wordmark`, `--rt-logo-tagline` и их
24
+ * пару `--rt-logo-wordmark-dark`, `--rt-logo-tagline-dark` для тёмной темы.
25
+ * Пока свойства не заданы, компонент занимает место, но ничего не рисует.
26
+ *
27
+ * ```css
28
+ * :root {
29
+ * --rt-logo-wordmark: url('/logo/wordmark.svg');
30
+ * --rt-logo-wordmark-dark: url('/logo/wordmark-inverse.svg');
31
+ * }
32
+ * ```
33
+ *
34
+ * Начертания лежат фоном, а не в `<img>`: у тёмной темы своя пара файлов, и
35
+ * подмена `background-image` — единственный способ переключить их одним правилом.
36
+ */
37
+ class RtLogoComponent {
38
+ constructor() {
39
+ /** Реальная высота: явно заданная или умолчание варианта. */
40
+ this.effectiveHeight = computed(() => {
41
+ const explicit = this.height();
42
+ return explicit > 0 ? explicit : DEFAULT_HEIGHT[this.variant()];
43
+ }, /* @ts-ignore */
44
+ ...(ngDevMode ? [{ debugName: "effectiveHeight" }] : /* istanbul ignore next */ []));
45
+ /** Ширина host'а: высота, растянутая по отношению сторон начертания. */
46
+ this.effectiveWidth = computed(() => {
47
+ const explicit = this.aspect();
48
+ const ratio = explicit > 0 ? explicit : DEFAULT_ASPECT[this.variant()];
49
+ return Math.round(this.effectiveHeight() * ratio);
50
+ }, /* @ts-ignore */
51
+ ...(ngDevMode ? [{ debugName: "effectiveWidth" }] : /* istanbul ignore next */ []));
52
+ /** Показывать ли слоган под начертанием. */
53
+ this.showTagline = computed(() => this.variant() === 'lockup', /* @ts-ignore */
54
+ ...(ngDevMode ? [{ debugName: "showTagline" }] : /* istanbul ignore next */ []));
55
+ this.variant = input('lockup', /* @ts-ignore */
56
+ ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
57
+ /**
58
+ * Высота логотипа в пикселях. `0` означает «использовать умолчание варианта».
59
+ * Принимает строку или число (чтобы писалось как `height="75"`).
60
+ */
61
+ this.height = input(0, { ...(ngDevMode ? { debugName: "height" } : /* istanbul ignore next */ {}), transform: numberAttribute });
62
+ /**
63
+ * Отношение ширины к высоте своего начертания. `0` — умолчание варианта.
64
+ * Без него узкий или широкий логотип обрежется или обрастёт пустотой:
65
+ * ширину host'а кит считает сам, а пропорций чужого файла он не знает.
66
+ */
67
+ this.aspect = input(0, { ...(ngDevMode ? { debugName: "aspect" } : /* istanbul ignore next */ {}), transform: numberAttribute });
68
+ /** Подпись для скринридера: обычно название продукта. */
69
+ this.ariaLabel = input('', /* @ts-ignore */
70
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
71
+ }
72
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
73
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtLogoComponent, isStandalone: true, selector: "rt-logo", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, aspect: { classPropertyName: "aspect", publicName: "aspect", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.height.px": "effectiveHeight()", "style.width.px": "effectiveWidth()", "attr.role": "'img'", "attr.aria-label": "ariaLabel()" }, classAttribute: "rt-logo" }, ngImport: i0, template: "<ng-container rtBlock=\"rt-logo\">\n <span rtElem=\"wordmark\" qa-dataid=\"logo-wordmark\"></span>\n\n @if (showTagline()) {\n <span rtElem=\"tagline\" qa-dataid=\"logo-tagline\"></span>\n }\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-logo{display:inline-block;line-height:0}.rt-logo__wordmark,.rt-logo__tagline{display:block;width:100%;background-position:left center;background-repeat:no-repeat;background-size:contain}.rt-logo__wordmark{height:100%;background-image:var(--rt-logo-wordmark, none)}.rt-logo__tagline{background-image:var(--rt-logo-tagline, none)}[data-theme=dark] .rt-logo__wordmark{background-image:var(--rt-logo-wordmark-dark, var(--rt-logo-wordmark, none))}[data-theme=dark] .rt-logo__tagline{background-image:var(--rt-logo-tagline-dark, var(--rt-logo-tagline, none))}.rt-logo:has(.rt-logo__tagline){display:flex;flex-direction:column;align-items:stretch;justify-content:space-between}.rt-logo:has(.rt-logo__tagline) .rt-logo__wordmark{height:66.7%}.rt-logo:has(.rt-logo__tagline) .rt-logo__tagline{height:22.1%}}\n"], dependencies: [{ kind: "directive", type:
74
+ // standalone components / directives
75
+ BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
76
+ }
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtLogoComponent, decorators: [{
78
+ type: Component,
79
+ args: [{ selector: 'rt-logo', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
80
+ // standalone components / directives
81
+ BlockDirective,
82
+ ElemDirective,
83
+ ], host: {
84
+ class: BEM_BLOCK,
85
+ '[style.height.px]': 'effectiveHeight()',
86
+ '[style.width.px]': 'effectiveWidth()',
87
+ '[attr.role]': "'img'",
88
+ '[attr.aria-label]': 'ariaLabel()',
89
+ }, template: "<ng-container rtBlock=\"rt-logo\">\n <span rtElem=\"wordmark\" qa-dataid=\"logo-wordmark\"></span>\n\n @if (showTagline()) {\n <span rtElem=\"tagline\" qa-dataid=\"logo-tagline\"></span>\n }\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-logo{display:inline-block;line-height:0}.rt-logo__wordmark,.rt-logo__tagline{display:block;width:100%;background-position:left center;background-repeat:no-repeat;background-size:contain}.rt-logo__wordmark{height:100%;background-image:var(--rt-logo-wordmark, none)}.rt-logo__tagline{background-image:var(--rt-logo-tagline, none)}[data-theme=dark] .rt-logo__wordmark{background-image:var(--rt-logo-wordmark-dark, var(--rt-logo-wordmark, none))}[data-theme=dark] .rt-logo__tagline{background-image:var(--rt-logo-tagline-dark, var(--rt-logo-tagline, none))}.rt-logo:has(.rt-logo__tagline){display:flex;flex-direction:column;align-items:stretch;justify-content:space-between}.rt-logo:has(.rt-logo__tagline) .rt-logo__wordmark{height:66.7%}.rt-logo:has(.rt-logo__tagline) .rt-logo__tagline{height:22.1%}}\n"] }]
90
+ }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], aspect: [{ type: i0.Input, args: [{ isSignal: true, alias: "aspect", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
91
+
92
+ /**
93
+ * Generated bundle index. Do not edit.
94
+ */
95
+
96
+ export { RtLogoComponent };
97
+ //# sourceMappingURL=rt-tools-ui-kit-v2-logo.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-logo.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/logo/rt-logo.component.ts","../../../projects/ui-kit-v2/src/lib/components/logo/rt-logo.component.html","../../../projects/ui-kit-v2/src/lib/components/logo/rt-tools-ui-kit-v2-logo.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { IRtLogo } from './rt-logo.model';\n\n/**\n * Высота в px, с которой рисуется вариант, если её не задали явно. `0`\n * означает «брать умолчание варианта».\n */\nconst DEFAULT_HEIGHT: Readonly<Record<IRtLogo.Variant, number>> = Object.freeze({\n wordmark: 51,\n lockup: 75,\n});\n\n/** Отношение ширины к высоте, с которым рисуется вариант без явного `aspect`. */\nconst DEFAULT_ASPECT: Readonly<Record<IRtLogo.Variant, number>> = Object.freeze({\n wordmark: 5.4,\n lockup: 3.6,\n});\n\nconst BEM_BLOCK: string = 'rt-logo';\n\n/**\n * Логотип приложения: начертание названия и, в варианте `lockup`, слоган под ним.\n *\n * Сами начертания кит не везёт — их даёт приложение, задав на любом предке\n * четыре свойства оформления: `--rt-logo-wordmark`, `--rt-logo-tagline` и их\n * пару `--rt-logo-wordmark-dark`, `--rt-logo-tagline-dark` для тёмной темы.\n * Пока свойства не заданы, компонент занимает место, но ничего не рисует.\n *\n * ```css\n * :root {\n * --rt-logo-wordmark: url('/logo/wordmark.svg');\n * --rt-logo-wordmark-dark: url('/logo/wordmark-inverse.svg');\n * }\n * ```\n *\n * Начертания лежат фоном, а не в `<img>`: у тёмной темы своя пара файлов, и\n * подмена `background-image` — единственный способ переключить их одним правилом.\n */\n@Component({\n selector: 'rt-logo',\n templateUrl: './rt-logo.component.html',\n styleUrls: ['./rt-logo.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 '[style.height.px]': 'effectiveHeight()',\n '[style.width.px]': 'effectiveWidth()',\n '[attr.role]': \"'img'\",\n '[attr.aria-label]': 'ariaLabel()',\n },\n})\nexport class RtLogoComponent {\n /** Реальная высота: явно заданная или умолчание варианта. */\n protected readonly effectiveHeight: Signal<number> = computed((): number => {\n const explicit: number = this.height();\n return explicit > 0 ? explicit : DEFAULT_HEIGHT[this.variant()];\n });\n\n /** Ширина host'а: высота, растянутая по отношению сторон начертания. */\n protected readonly effectiveWidth: Signal<number> = computed((): number => {\n const explicit: number = this.aspect();\n const ratio: number = explicit > 0 ? explicit : DEFAULT_ASPECT[this.variant()];\n return Math.round(this.effectiveHeight() * ratio);\n });\n\n /** Показывать ли слоган под начертанием. */\n protected readonly showTagline: Signal<boolean> = computed((): boolean => this.variant() === 'lockup');\n\n public readonly variant: InputSignal<IRtLogo.Variant> = input<IRtLogo.Variant>('lockup');\n\n /**\n * Высота логотипа в пикселях. `0` означает «использовать умолчание варианта».\n * Принимает строку или число (чтобы писалось как `height=\"75\"`).\n */\n public readonly height: InputSignalWithTransform<number, number | string> = input<number, number | string>(0, {\n transform: numberAttribute,\n });\n\n /**\n * Отношение ширины к высоте своего начертания. `0` — умолчание варианта.\n * Без него узкий или широкий логотип обрежется или обрастёт пустотой:\n * ширину host'а кит считает сам, а пропорций чужого файла он не знает.\n */\n public readonly aspect: InputSignalWithTransform<number, number | string> = input<number, number | string>(0, {\n transform: numberAttribute,\n });\n\n /** Подпись для скринридера: обычно название продукта. */\n public readonly ariaLabel: InputSignal<string> = input<string>('');\n}\n","<ng-container rtBlock=\"rt-logo\">\n <span rtElem=\"wordmark\" qa-dataid=\"logo-wordmark\"></span>\n\n @if (showTagline()) {\n <span rtElem=\"tagline\" qa-dataid=\"logo-tagline\"></span>\n }\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAgBA;;;AAGG;AACH,MAAM,cAAc,GAA8C,MAAM,CAAC,MAAM,CAAC;AAC5E,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,MAAM,EAAE,EAAE;AACb,CAAA,CAAC;AAEF;AACA,MAAM,cAAc,GAA8C,MAAM,CAAC,MAAM,CAAC;AAC5E,IAAA,QAAQ,EAAE,GAAG;AACb,IAAA,MAAM,EAAE,GAAG;AACd,CAAA,CAAC;AAEF,MAAM,SAAS,GAAW,SAAS;AAEnC;;;;;;;;;;;;;;;;;AAiBG;MAoBU,eAAe,CAAA;AAnB5B,IAAA,WAAA,GAAA;;AAqBuB,QAAA,IAAA,CAAA,eAAe,GAAmB,QAAQ,CAAC,MAAa;AACvE,YAAA,MAAM,QAAQ,GAAW,IAAI,CAAC,MAAM,EAAE;AACtC,YAAA,OAAO,QAAQ,GAAG,CAAC,GAAG,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACnE,CAAC;4FAAC;;AAGiB,QAAA,IAAA,CAAA,cAAc,GAAmB,QAAQ,CAAC,MAAa;AACtE,YAAA,MAAM,QAAQ,GAAW,IAAI,CAAC,MAAM,EAAE;AACtC,YAAA,MAAM,KAAK,GAAW,QAAQ,GAAG,CAAC,GAAG,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9E,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,KAAK,CAAC;QACrD,CAAC;2FAAC;;QAGiB,IAAA,CAAA,WAAW,GAAoB,QAAQ,CAAC,MAAe,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ;wFAAC;QAEtF,IAAA,CAAA,OAAO,GAAiC,KAAK,CAAkB,QAAQ;oFAAC;AAExF;;;AAGG;QACa,IAAA,CAAA,MAAM,GAAsD,KAAK,CAA0B,CAAC,8EACxG,SAAS,EAAE,eAAe,EAAA,CAC5B;AAEF;;;;AAIG;QACa,IAAA,CAAA,MAAM,GAAsD,KAAK,CAA0B,CAAC,8EACxG,SAAS,EAAE,eAAe,EAAA,CAC5B;;QAGc,IAAA,CAAA,SAAS,GAAwB,KAAK,CAAS,EAAE;sFAAC;AACrE,IAAA;8GAtCY,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,kwBCtE5B,mOAOA,EAAA,MAAA,EAAA,CAAA,k1BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA;;ADoDQ,gBAAA,cAAc,yEACd,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;;2FAUR,eAAe,EAAA,UAAA,EAAA,CAAA;kBAnB3B,SAAS;+BACI,SAAS,EAAA,eAAA,EAGF,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;;wBAEL,cAAc;wBACd,aAAa;qBAChB,EAAA,IAAA,EACK;AACF,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,mBAAmB,EAAE,mBAAmB;AACxC,wBAAA,kBAAkB,EAAE,kBAAkB;AACtC,wBAAA,aAAa,EAAE,OAAO;AACtB,wBAAA,mBAAmB,EAAE,aAAa;AACrC,qBAAA,EAAA,QAAA,EAAA,mOAAA,EAAA,MAAA,EAAA,CAAA,k1BAAA,CAAA,EAAA;;;AEpEL;;AAEG;;;;"}
@@ -0,0 +1,57 @@
1
+ import { NgTemplateOutlet } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { computed, input, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
4
+ import { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';
5
+ import { ERtMarkdownBlock, ERtMarkdownInline, parseMarkdown } from '@rt-tools/ui-kit-v2/core';
6
+ import * as i1 from '@rt-tools/ui-kit-v2/radius';
7
+ import { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';
8
+
9
+ const BEM_BLOCK = 'rt-markdown-text';
10
+ /**
11
+ * Текст, написанный разметкой, показанный узлами.
12
+ *
13
+ * Перечень разметки зашит в разборщике и входом не задаётся: вход у компонента один — сам
14
+ * текст. Настраивать нечего, значит нечем и ослабить.
15
+ *
16
+ * Присланная строка в страницу не отдаётся ни разу: компонент рисует дерево узлов, которое
17
+ * вернул разбор, и другого пути у текста внутрь страницы нет. Поэтому сырой HTML, картинки и
18
+ * адреса чужих схем показываются видимым текстом — узла для них разборщик не строит.
19
+ *
20
+ * Таблица рисуется своей разметкой, а не таблицей кита: та объявляет колонки заранее
21
+ * директивами, а число столбцов здесь приходит из текста и заранее не известно никому.
22
+ */
23
+ class RtMarkdownTextComponent {
24
+ constructor() {
25
+ /** Роды блоков в шаблоне: сравнение идёт со значением перечисления, а не со строкой. */
26
+ this.blockKind = ERtMarkdownBlock;
27
+ /** Роды кусков строки в шаблоне. */
28
+ this.inlineKind = ERtMarkdownInline;
29
+ this.blocks = computed(() => parseMarkdown(this.text()), /* @ts-ignore */
30
+ ...(ngDevMode ? [{ debugName: "blocks" }] : /* istanbul ignore next */ []));
31
+ this.text = input.required(/* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
33
+ }
34
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtMarkdownTextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtMarkdownTextComponent, isStandalone: true, selector: "rt-markdown-text", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "rt-markdown-text" }, hostDirectives: [{ directive: i1.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<ng-container rtBlock=\"rt-markdown-text\">\n @for (item of blocks(); track $index) {\n <ng-container *ngTemplateOutlet=\"blockTpl; context: { $implicit: item }\" />\n }\n\n <ng-template #blockTpl let-item>\n @switch (item.kind) {\n @case (blockKind.Heading) {\n <div\n rtElem=\"heading\"\n qa-dataid=\"markdown-heading\"\n role=\"heading\"\n [attr.aria-level]=\"item.level\"\n [rtMod]=\"{ level: item.levelName }\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: item.content }\" />\n </div>\n }\n @case (blockKind.List) {\n @if (item.ordered) {\n <ol rtElem=\"list\" qa-dataid=\"markdown-list\" [rtMod]=\"{ ordered: true }\">\n <ng-container *ngTemplateOutlet=\"itemsTpl; context: { $implicit: item.items }\" />\n </ol>\n } @else {\n <ul rtElem=\"list\" qa-dataid=\"markdown-list\">\n <ng-container *ngTemplateOutlet=\"itemsTpl; context: { $implicit: item.items }\" />\n </ul>\n }\n }\n @case (blockKind.Quote) {\n <blockquote rtElem=\"quote\" qa-dataid=\"markdown-quote\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: item.content }\" />\n </blockquote>\n }\n @case (blockKind.Code) {\n <pre rtElem=\"code\" qa-dataid=\"markdown-code\"><code>{{ item.code }}</code></pre>\n }\n @case (blockKind.Table) {\n <ng-container *ngTemplateOutlet=\"tableTpl; context: { $implicit: item }\" />\n }\n @default {\n <p rtElem=\"paragraph\" qa-dataid=\"markdown-paragraph\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: item.content }\" />\n </p>\n }\n }\n </ng-template>\n\n <ng-template #itemsTpl let-items>\n @for (point of items; track $index) {\n <li rtElem=\"item\" qa-dataid=\"markdown-item\" [rtMod]=\"{ level: point.levelName }\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: point.content }\" />\n </li>\n }\n </ng-template>\n\n <ng-template #tableTpl let-item>\n <div rtElem=\"table-scroll\" qa-dataid=\"markdown-table-scroll\">\n <table rtElem=\"table\" qa-dataid=\"markdown-table\">\n <thead>\n <tr>\n @for (cell of item.head; track $index) {\n <th rtElem=\"head-cell\" qa-dataid=\"markdown-head-cell\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: cell }\" />\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of item.rows; track $index) {\n <tr>\n @for (cell of row; track $index) {\n <td rtElem=\"cell\" qa-dataid=\"markdown-cell\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: cell }\" />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </ng-template>\n\n <!--\n \u0412\u0435\u0442\u043A\u0438 \u0448\u0430\u0431\u043B\u043E\u043D\u0430 \u043A\u0443\u0441\u043A\u043E\u0432 \u043F\u0438\u0448\u0443\u0442\u0441\u044F \u0431\u0435\u0437 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u043E\u0432, \u0430 \u0444\u043E\u0440\u043C\u0430\u0442\u0442\u0435\u0440 \u043E\u0442\u043A\u043B\u044E\u0447\u0451\u043D \u0434\u043B\u044F \u043D\u0438\u0445 \u043D\u0430\u0440\u043E\u0447\u043D\u043E: \u043F\u0435\u0440\u0435\u043D\u043E\u0441\n \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0435 \u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0441\u044F \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u043C, \u0438 \u0440\u0430\u0437\u043C\u0435\u0447\u0435\u043D\u043D\u044B\u0439 \u043A\u0443\u0441\u043E\u043A \u043E\u0442\u044A\u0435\u0437\u0436\u0430\u0435\u0442 \u043E\u0442 \u0441\u043E\u0441\u0435\u0434\u043D\u0435\u0433\u043E \u0437\u043D\u0430\u043A\u0430 \u2014\n \u00AB\u0436\u0438\u0440\u043D\u043E , \u0430 \u0440\u044F\u0434\u043E\u043C\u00BB.\n -->\n <!-- prettier-ignore -->\n <ng-template #inlineTpl let-nodes>@for (node of nodes; track $index) {@switch (node.kind) {@case (inlineKind.Strong) {<strong rtElem=\"strong\"><ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: node.children }\" /></strong>}@case (inlineKind.Emphasis) {<em rtElem=\"emphasis\"><ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: node.children }\" /></em>}@case (inlineKind.Strike) {<s rtElem=\"strike\"><ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: node.children }\" /></s>}@case (inlineKind.Code) {<code rtElem=\"code-inline\" qa-dataid=\"markdown-code-inline\">{{ node.text }}</code>}@case (inlineKind.Link) {<a rtElem=\"link\" qa-dataid=\"markdown-link\" rel=\"noopener noreferrer\" target=\"_blank\" [href]=\"node.href\"><ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: node.children }\" /></a>}@case (inlineKind.Break) {<br />}@default {{{ node.text }}}}}</ng-template>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-markdown-text{--rt-markdown-text-radius: var(--rt-radius-sm);--rt-markdown-text-border-width: var(--rt-border-width-thin);display:flex;min-width:0;max-width:100%;flex-direction:column;color:var(--rt-color-text-primary);font-family:var(--rt-font-family-sans);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-regular);gap:var(--rt-space-sm);letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-snug)}.rt-markdown-text__heading{margin:0;color:var(--rt-color-text-primary);font-weight:var(--rt-font-weight-semibold)}.rt-markdown-text__heading--level--1{font-size:var(--rt-text-lg)}.rt-markdown-text__heading--level--2{font-size:var(--rt-text-md)}.rt-markdown-text__heading--level--3,.rt-markdown-text__heading--level--4,.rt-markdown-text__heading--level--5,.rt-markdown-text__heading--level--6{font-size:var(--rt-text-sm)}.rt-markdown-text__paragraph{margin:0}.rt-markdown-text__list{padding-left:var(--rt-space-md);margin:0;list-style:disc}.rt-markdown-text__list--ordered{list-style:decimal}.rt-markdown-text__item--level--1{margin-left:var(--rt-space-md)}.rt-markdown-text__item--level--2{margin-left:var(--rt-space-lg)}.rt-markdown-text__quote{padding-left:var(--rt-space-sm);border-left:var(--rt-markdown-text-border-width) solid var(--rt-color-border-default);margin:0;color:var(--rt-color-text-muted)}.rt-markdown-text__code{max-width:100%;padding:var(--rt-space-sm);border-radius:var(--rt-markdown-text-radius);margin:0;background:var(--rt-color-bg-subtle);color:var(--rt-color-text-primary);font-family:var(--rt-font-family-mono);font-size:var(--rt-text-2xs);line-height:var(--rt-leading-snug);overflow-x:auto}.rt-markdown-text__code-inline{padding:0 var(--rt-space-2xs);border-radius:var(--rt-markdown-text-radius);background:var(--rt-color-bg-subtle);font-family:var(--rt-font-family-mono);font-size:var(--rt-text-2xs)}.rt-markdown-text__table-scroll{max-width:100%;overflow-x:auto}.rt-markdown-text__table{width:100%;border-collapse:collapse}.rt-markdown-text__head-cell,.rt-markdown-text__cell{padding:var(--rt-space-2xs) var(--rt-space-sm);border:var(--rt-markdown-text-border-width) solid var(--rt-color-border-default);text-align:left}.rt-markdown-text__head-cell{color:var(--rt-color-text-muted);font-weight:var(--rt-font-weight-semibold)}.rt-markdown-text__strong{font-weight:var(--rt-font-weight-semibold)}.rt-markdown-text__emphasis{font-style:italic}.rt-markdown-text__strike{text-decoration:line-through}.rt-markdown-text__link{color:var(--rt-color-text-link);text-decoration:underline}.rt-markdown-text[data-rt-radius=none]{--rt-markdown-text-radius: var(--rt-radius-none)}.rt-markdown-text[data-rt-radius=xs]{--rt-markdown-text-radius: var(--rt-radius-xs)}.rt-markdown-text[data-rt-radius=sm]{--rt-markdown-text-radius: var(--rt-radius-sm)}.rt-markdown-text[data-rt-radius=ms]{--rt-markdown-text-radius: var(--rt-radius-ms)}.rt-markdown-text[data-rt-radius=md]{--rt-markdown-text-radius: var(--rt-radius-md)}.rt-markdown-text[data-rt-radius=lg]{--rt-markdown-text-radius: var(--rt-radius-lg)}.rt-markdown-text[data-rt-radius=xl]{--rt-markdown-text-radius: var(--rt-radius-xl)}.rt-markdown-text[data-rt-radius=\"2xl\"]{--rt-markdown-text-radius: var(--rt-radius-2xl)}.rt-markdown-text[data-rt-radius=full]{--rt-markdown-text-radius: var(--rt-radius-full)}}\n"], dependencies: [{ kind: "directive", type:
36
+ // standalone components / directives
37
+ BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
38
+ }
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtMarkdownTextComponent, decorators: [{
40
+ type: Component,
41
+ args: [{ selector: 'rt-markdown-text', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
42
+ // standalone components / directives
43
+ BlockDirective,
44
+ ElemDirective,
45
+ ModDirective,
46
+ NgTemplateOutlet,
47
+ ], hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }], host: {
48
+ class: BEM_BLOCK,
49
+ }, template: "<ng-container rtBlock=\"rt-markdown-text\">\n @for (item of blocks(); track $index) {\n <ng-container *ngTemplateOutlet=\"blockTpl; context: { $implicit: item }\" />\n }\n\n <ng-template #blockTpl let-item>\n @switch (item.kind) {\n @case (blockKind.Heading) {\n <div\n rtElem=\"heading\"\n qa-dataid=\"markdown-heading\"\n role=\"heading\"\n [attr.aria-level]=\"item.level\"\n [rtMod]=\"{ level: item.levelName }\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: item.content }\" />\n </div>\n }\n @case (blockKind.List) {\n @if (item.ordered) {\n <ol rtElem=\"list\" qa-dataid=\"markdown-list\" [rtMod]=\"{ ordered: true }\">\n <ng-container *ngTemplateOutlet=\"itemsTpl; context: { $implicit: item.items }\" />\n </ol>\n } @else {\n <ul rtElem=\"list\" qa-dataid=\"markdown-list\">\n <ng-container *ngTemplateOutlet=\"itemsTpl; context: { $implicit: item.items }\" />\n </ul>\n }\n }\n @case (blockKind.Quote) {\n <blockquote rtElem=\"quote\" qa-dataid=\"markdown-quote\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: item.content }\" />\n </blockquote>\n }\n @case (blockKind.Code) {\n <pre rtElem=\"code\" qa-dataid=\"markdown-code\"><code>{{ item.code }}</code></pre>\n }\n @case (blockKind.Table) {\n <ng-container *ngTemplateOutlet=\"tableTpl; context: { $implicit: item }\" />\n }\n @default {\n <p rtElem=\"paragraph\" qa-dataid=\"markdown-paragraph\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: item.content }\" />\n </p>\n }\n }\n </ng-template>\n\n <ng-template #itemsTpl let-items>\n @for (point of items; track $index) {\n <li rtElem=\"item\" qa-dataid=\"markdown-item\" [rtMod]=\"{ level: point.levelName }\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: point.content }\" />\n </li>\n }\n </ng-template>\n\n <ng-template #tableTpl let-item>\n <div rtElem=\"table-scroll\" qa-dataid=\"markdown-table-scroll\">\n <table rtElem=\"table\" qa-dataid=\"markdown-table\">\n <thead>\n <tr>\n @for (cell of item.head; track $index) {\n <th rtElem=\"head-cell\" qa-dataid=\"markdown-head-cell\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: cell }\" />\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of item.rows; track $index) {\n <tr>\n @for (cell of row; track $index) {\n <td rtElem=\"cell\" qa-dataid=\"markdown-cell\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: cell }\" />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </ng-template>\n\n <!--\n \u0412\u0435\u0442\u043A\u0438 \u0448\u0430\u0431\u043B\u043E\u043D\u0430 \u043A\u0443\u0441\u043A\u043E\u0432 \u043F\u0438\u0448\u0443\u0442\u0441\u044F \u0431\u0435\u0437 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u043E\u0432, \u0430 \u0444\u043E\u0440\u043C\u0430\u0442\u0442\u0435\u0440 \u043E\u0442\u043A\u043B\u044E\u0447\u0451\u043D \u0434\u043B\u044F \u043D\u0438\u0445 \u043D\u0430\u0440\u043E\u0447\u043D\u043E: \u043F\u0435\u0440\u0435\u043D\u043E\u0441\n \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0435 \u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0441\u044F \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u043C, \u0438 \u0440\u0430\u0437\u043C\u0435\u0447\u0435\u043D\u043D\u044B\u0439 \u043A\u0443\u0441\u043E\u043A \u043E\u0442\u044A\u0435\u0437\u0436\u0430\u0435\u0442 \u043E\u0442 \u0441\u043E\u0441\u0435\u0434\u043D\u0435\u0433\u043E \u0437\u043D\u0430\u043A\u0430 \u2014\n \u00AB\u0436\u0438\u0440\u043D\u043E , \u0430 \u0440\u044F\u0434\u043E\u043C\u00BB.\n -->\n <!-- prettier-ignore -->\n <ng-template #inlineTpl let-nodes>@for (node of nodes; track $index) {@switch (node.kind) {@case (inlineKind.Strong) {<strong rtElem=\"strong\"><ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: node.children }\" /></strong>}@case (inlineKind.Emphasis) {<em rtElem=\"emphasis\"><ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: node.children }\" /></em>}@case (inlineKind.Strike) {<s rtElem=\"strike\"><ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: node.children }\" /></s>}@case (inlineKind.Code) {<code rtElem=\"code-inline\" qa-dataid=\"markdown-code-inline\">{{ node.text }}</code>}@case (inlineKind.Link) {<a rtElem=\"link\" qa-dataid=\"markdown-link\" rel=\"noopener noreferrer\" target=\"_blank\" [href]=\"node.href\"><ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: node.children }\" /></a>}@case (inlineKind.Break) {<br />}@default {{{ node.text }}}}}</ng-template>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-markdown-text{--rt-markdown-text-radius: var(--rt-radius-sm);--rt-markdown-text-border-width: var(--rt-border-width-thin);display:flex;min-width:0;max-width:100%;flex-direction:column;color:var(--rt-color-text-primary);font-family:var(--rt-font-family-sans);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-regular);gap:var(--rt-space-sm);letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-snug)}.rt-markdown-text__heading{margin:0;color:var(--rt-color-text-primary);font-weight:var(--rt-font-weight-semibold)}.rt-markdown-text__heading--level--1{font-size:var(--rt-text-lg)}.rt-markdown-text__heading--level--2{font-size:var(--rt-text-md)}.rt-markdown-text__heading--level--3,.rt-markdown-text__heading--level--4,.rt-markdown-text__heading--level--5,.rt-markdown-text__heading--level--6{font-size:var(--rt-text-sm)}.rt-markdown-text__paragraph{margin:0}.rt-markdown-text__list{padding-left:var(--rt-space-md);margin:0;list-style:disc}.rt-markdown-text__list--ordered{list-style:decimal}.rt-markdown-text__item--level--1{margin-left:var(--rt-space-md)}.rt-markdown-text__item--level--2{margin-left:var(--rt-space-lg)}.rt-markdown-text__quote{padding-left:var(--rt-space-sm);border-left:var(--rt-markdown-text-border-width) solid var(--rt-color-border-default);margin:0;color:var(--rt-color-text-muted)}.rt-markdown-text__code{max-width:100%;padding:var(--rt-space-sm);border-radius:var(--rt-markdown-text-radius);margin:0;background:var(--rt-color-bg-subtle);color:var(--rt-color-text-primary);font-family:var(--rt-font-family-mono);font-size:var(--rt-text-2xs);line-height:var(--rt-leading-snug);overflow-x:auto}.rt-markdown-text__code-inline{padding:0 var(--rt-space-2xs);border-radius:var(--rt-markdown-text-radius);background:var(--rt-color-bg-subtle);font-family:var(--rt-font-family-mono);font-size:var(--rt-text-2xs)}.rt-markdown-text__table-scroll{max-width:100%;overflow-x:auto}.rt-markdown-text__table{width:100%;border-collapse:collapse}.rt-markdown-text__head-cell,.rt-markdown-text__cell{padding:var(--rt-space-2xs) var(--rt-space-sm);border:var(--rt-markdown-text-border-width) solid var(--rt-color-border-default);text-align:left}.rt-markdown-text__head-cell{color:var(--rt-color-text-muted);font-weight:var(--rt-font-weight-semibold)}.rt-markdown-text__strong{font-weight:var(--rt-font-weight-semibold)}.rt-markdown-text__emphasis{font-style:italic}.rt-markdown-text__strike{text-decoration:line-through}.rt-markdown-text__link{color:var(--rt-color-text-link);text-decoration:underline}.rt-markdown-text[data-rt-radius=none]{--rt-markdown-text-radius: var(--rt-radius-none)}.rt-markdown-text[data-rt-radius=xs]{--rt-markdown-text-radius: var(--rt-radius-xs)}.rt-markdown-text[data-rt-radius=sm]{--rt-markdown-text-radius: var(--rt-radius-sm)}.rt-markdown-text[data-rt-radius=ms]{--rt-markdown-text-radius: var(--rt-radius-ms)}.rt-markdown-text[data-rt-radius=md]{--rt-markdown-text-radius: var(--rt-radius-md)}.rt-markdown-text[data-rt-radius=lg]{--rt-markdown-text-radius: var(--rt-radius-lg)}.rt-markdown-text[data-rt-radius=xl]{--rt-markdown-text-radius: var(--rt-radius-xl)}.rt-markdown-text[data-rt-radius=\"2xl\"]{--rt-markdown-text-radius: var(--rt-radius-2xl)}.rt-markdown-text[data-rt-radius=full]{--rt-markdown-text-radius: var(--rt-radius-full)}}\n"] }]
50
+ }], propDecorators: { text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: true }] }] } });
51
+
52
+ /**
53
+ * Generated bundle index. Do not edit.
54
+ */
55
+
56
+ export { RtMarkdownTextComponent };
57
+ //# sourceMappingURL=rt-tools-ui-kit-v2-markdown-text.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-markdown-text.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/markdown-text/rt-markdown-text.component.ts","../../../projects/ui-kit-v2/src/lib/components/markdown-text/rt-markdown-text.component.html","../../../projects/ui-kit-v2/src/lib/components/markdown-text/rt-tools-ui-kit-v2-markdown-text.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { computed, input, ChangeDetectionStrategy, Component, InputSignal, Signal, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { parseMarkdown } from '@rt-tools/ui-kit-v2/core';\nimport { ERtMarkdownBlock, ERtMarkdownInline, IRtMarkdownBlockNode } from '@rt-tools/ui-kit-v2/core';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\n\nconst BEM_BLOCK: string = 'rt-markdown-text';\n\n/**\n * Текст, написанный разметкой, показанный узлами.\n *\n * Перечень разметки зашит в разборщике и входом не задаётся: вход у компонента один — сам\n * текст. Настраивать нечего, значит нечем и ослабить.\n *\n * Присланная строка в страницу не отдаётся ни разу: компонент рисует дерево узлов, которое\n * вернул разбор, и другого пути у текста внутрь страницы нет. Поэтому сырой HTML, картинки и\n * адреса чужих схем показываются видимым текстом — узла для них разборщик не строит.\n *\n * Таблица рисуется своей разметкой, а не таблицей кита: та объявляет колонки заранее\n * директивами, а число столбцов здесь приходит из текста и заранее не известно никому.\n */\n@Component({\n selector: 'rt-markdown-text',\n templateUrl: './rt-markdown-text.component.html',\n styleUrl: './rt-markdown-text.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n NgTemplateOutlet,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtMarkdownTextComponent {\n /** Роды блоков в шаблоне: сравнение идёт со значением перечисления, а не со строкой. */\n protected readonly blockKind: typeof ERtMarkdownBlock = ERtMarkdownBlock;\n\n /** Роды кусков строки в шаблоне. */\n protected readonly inlineKind: typeof ERtMarkdownInline = ERtMarkdownInline;\n\n protected readonly blocks: Signal<readonly IRtMarkdownBlockNode[]> = computed((): readonly IRtMarkdownBlockNode[] =>\n parseMarkdown(this.text())\n );\n\n public readonly text: InputSignal<string | null> = input.required<string | null>();\n}\n","<ng-container rtBlock=\"rt-markdown-text\">\n @for (item of blocks(); track $index) {\n <ng-container *ngTemplateOutlet=\"blockTpl; context: { $implicit: item }\" />\n }\n\n <ng-template #blockTpl let-item>\n @switch (item.kind) {\n @case (blockKind.Heading) {\n <div\n rtElem=\"heading\"\n qa-dataid=\"markdown-heading\"\n role=\"heading\"\n [attr.aria-level]=\"item.level\"\n [rtMod]=\"{ level: item.levelName }\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: item.content }\" />\n </div>\n }\n @case (blockKind.List) {\n @if (item.ordered) {\n <ol rtElem=\"list\" qa-dataid=\"markdown-list\" [rtMod]=\"{ ordered: true }\">\n <ng-container *ngTemplateOutlet=\"itemsTpl; context: { $implicit: item.items }\" />\n </ol>\n } @else {\n <ul rtElem=\"list\" qa-dataid=\"markdown-list\">\n <ng-container *ngTemplateOutlet=\"itemsTpl; context: { $implicit: item.items }\" />\n </ul>\n }\n }\n @case (blockKind.Quote) {\n <blockquote rtElem=\"quote\" qa-dataid=\"markdown-quote\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: item.content }\" />\n </blockquote>\n }\n @case (blockKind.Code) {\n <pre rtElem=\"code\" qa-dataid=\"markdown-code\"><code>{{ item.code }}</code></pre>\n }\n @case (blockKind.Table) {\n <ng-container *ngTemplateOutlet=\"tableTpl; context: { $implicit: item }\" />\n }\n @default {\n <p rtElem=\"paragraph\" qa-dataid=\"markdown-paragraph\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: item.content }\" />\n </p>\n }\n }\n </ng-template>\n\n <ng-template #itemsTpl let-items>\n @for (point of items; track $index) {\n <li rtElem=\"item\" qa-dataid=\"markdown-item\" [rtMod]=\"{ level: point.levelName }\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: point.content }\" />\n </li>\n }\n </ng-template>\n\n <ng-template #tableTpl let-item>\n <div rtElem=\"table-scroll\" qa-dataid=\"markdown-table-scroll\">\n <table rtElem=\"table\" qa-dataid=\"markdown-table\">\n <thead>\n <tr>\n @for (cell of item.head; track $index) {\n <th rtElem=\"head-cell\" qa-dataid=\"markdown-head-cell\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: cell }\" />\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of item.rows; track $index) {\n <tr>\n @for (cell of row; track $index) {\n <td rtElem=\"cell\" qa-dataid=\"markdown-cell\">\n <ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: cell }\" />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </ng-template>\n\n <!--\n Ветки шаблона кусков пишутся без переносов, а форматтер отключён для них нарочно: перенос\n строки в разметке становится пробелом, и размеченный кусок отъезжает от соседнего знака —\n «жирно , а рядом».\n -->\n <!-- prettier-ignore -->\n <ng-template #inlineTpl let-nodes>@for (node of nodes; track $index) {@switch (node.kind) {@case (inlineKind.Strong) {<strong rtElem=\"strong\"><ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: node.children }\" /></strong>}@case (inlineKind.Emphasis) {<em rtElem=\"emphasis\"><ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: node.children }\" /></em>}@case (inlineKind.Strike) {<s rtElem=\"strike\"><ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: node.children }\" /></s>}@case (inlineKind.Code) {<code rtElem=\"code-inline\" qa-dataid=\"markdown-code-inline\">{{ node.text }}</code>}@case (inlineKind.Link) {<a rtElem=\"link\" qa-dataid=\"markdown-link\" rel=\"noopener noreferrer\" target=\"_blank\" [href]=\"node.href\"><ng-container *ngTemplateOutlet=\"inlineTpl; context: { $implicit: node.children }\" /></a>}@case (inlineKind.Break) {<br />}@default {{{ node.text }}}}}</ng-template>\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AASA,MAAM,SAAS,GAAW,kBAAkB;AAE5C;;;;;;;;;;;;AAYG;MAmBU,uBAAuB,CAAA;AAlBpC,IAAA,WAAA,GAAA;;QAoBuB,IAAA,CAAA,SAAS,GAA4B,gBAAgB;;QAGrD,IAAA,CAAA,UAAU,GAA6B,iBAAiB;AAExD,QAAA,IAAA,CAAA,MAAM,GAA4C,QAAQ,CAAC,MAC1E,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;mFAC7B;QAEe,IAAA,CAAA,IAAI,GAA+B,KAAK,CAAC,QAAQ;iFAAiB;AACrF,IAAA;8GAZY,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,+UC1CpC,knLA0FA,EAAA,MAAA,EAAA,CAAA,gyGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA;;AD1DQ,gBAAA,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,oDACZ,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAOX,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAlBnC,SAAS;+BACI,kBAAkB,EAAA,eAAA,EAGX,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;;wBAEL,cAAc;wBACd,aAAa;wBACb,YAAY;wBACZ,gBAAgB;AACnB,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,knLAAA,EAAA,MAAA,EAAA,CAAA,gyGAAA,CAAA,EAAA;;;AExCL;;AAEG;;;;"}