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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/README.md +25 -0
  2. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs +79 -0
  3. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs.map +1 -0
  4. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +227 -0
  5. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -0
  6. package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs +47 -0
  7. package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs.map +1 -0
  8. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +702 -0
  9. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -0
  10. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +214 -0
  11. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -0
  12. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +53 -0
  13. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -0
  14. package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs +88 -0
  15. package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs.map +1 -0
  16. package/fesm2022/rt-tools-ui-kit-v2-button.mjs +365 -0
  17. package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -0
  18. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +152 -0
  19. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -0
  20. package/fesm2022/rt-tools-ui-kit-v2-card.mjs +72 -0
  21. package/fesm2022/rt-tools-ui-kit-v2-card.mjs.map +1 -0
  22. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +111 -0
  23. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -0
  24. package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs +76 -0
  25. package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs.map +1 -0
  26. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs +255 -0
  27. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs.map +1 -0
  28. package/fesm2022/rt-tools-ui-kit-v2-container.mjs +1326 -0
  29. package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -0
  30. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +2590 -0
  31. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -0
  32. package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs +45 -0
  33. package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs.map +1 -0
  34. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs +158 -0
  35. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs.map +1 -0
  36. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +894 -0
  37. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -0
  38. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +1217 -0
  39. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -0
  40. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +779 -0
  41. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -0
  42. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +573 -0
  43. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -0
  44. package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs +141 -0
  45. package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs.map +1 -0
  46. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs +68 -0
  47. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs.map +1 -0
  48. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs +478 -0
  49. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs.map +1 -0
  50. package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs +183 -0
  51. package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs.map +1 -0
  52. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +44 -0
  53. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -0
  54. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +260 -0
  55. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -0
  56. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +937 -0
  57. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -0
  58. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +56 -0
  59. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -0
  60. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +107 -0
  61. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -0
  62. package/fesm2022/rt-tools-ui-kit-v2-field.mjs +183 -0
  63. package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -0
  64. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +219 -0
  65. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -0
  66. package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs +214 -0
  67. package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs.map +1 -0
  68. package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs +117 -0
  69. package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs.map +1 -0
  70. package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs +32 -0
  71. package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs.map +1 -0
  72. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +91 -0
  73. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -0
  74. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +220 -0
  75. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -0
  76. package/fesm2022/rt-tools-ui-kit-v2-header.mjs +72 -0
  77. package/fesm2022/rt-tools-ui-kit-v2-header.mjs.map +1 -0
  78. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +163 -0
  79. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -0
  80. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +674 -0
  81. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -0
  82. package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs +540 -0
  83. package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs.map +1 -0
  84. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +227 -0
  85. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -0
  86. package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs +37 -0
  87. package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs.map +1 -0
  88. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +361 -0
  89. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -0
  90. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +143 -0
  91. package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -0
  92. package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs +49 -0
  93. package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs.map +1 -0
  94. package/fesm2022/rt-tools-ui-kit-v2-logo.mjs +97 -0
  95. package/fesm2022/rt-tools-ui-kit-v2-logo.mjs.map +1 -0
  96. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs +57 -0
  97. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs.map +1 -0
  98. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +537 -0
  99. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -0
  100. package/fesm2022/rt-tools-ui-kit-v2-message.mjs +105 -0
  101. package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -0
  102. package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs +71 -0
  103. package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs.map +1 -0
  104. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +315 -0
  105. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -0
  106. package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs +51 -0
  107. package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs.map +1 -0
  108. package/fesm2022/rt-tools-ui-kit-v2-note.mjs +44 -0
  109. package/fesm2022/rt-tools-ui-kit-v2-note.mjs.map +1 -0
  110. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +54 -0
  111. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -0
  112. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +339 -0
  113. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -0
  114. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +187 -0
  115. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -0
  116. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs +170 -0
  117. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs.map +1 -0
  118. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs +312 -0
  119. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs.map +1 -0
  120. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +174 -0
  121. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -0
  122. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs +56 -0
  123. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs.map +1 -0
  124. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +96 -41
  125. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  126. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs +118 -0
  127. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs.map +1 -0
  128. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +290 -0
  129. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -0
  130. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +37 -0
  131. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -0
  132. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +495 -0
  133. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -0
  134. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +1493 -0
  135. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -0
  136. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs +49 -0
  137. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs.map +1 -0
  138. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs +123 -0
  139. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs.map +1 -0
  140. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs +70 -0
  141. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs.map +1 -0
  142. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs +92 -0
  143. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs.map +1 -0
  144. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +147 -0
  145. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -0
  146. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +117 -0
  147. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -0
  148. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +1636 -0
  149. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -0
  150. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +350 -0
  151. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -0
  152. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +122 -0
  153. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -0
  154. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +85 -0
  155. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -0
  156. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +73 -0
  157. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -0
  158. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +196 -0
  159. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -0
  160. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs +39 -0
  161. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs.map +1 -0
  162. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +338 -0
  163. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -0
  164. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +132 -0
  165. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -0
  166. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +162 -0
  167. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -0
  168. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +135 -0
  169. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -0
  170. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +214 -0
  171. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -0
  172. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs +64 -0
  173. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs.map +1 -0
  174. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +263 -0
  175. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -0
  176. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +296 -0
  177. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -0
  178. package/fesm2022/rt-tools-ui-kit-v2.mjs +91 -23164
  179. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  180. package/package.json +349 -1
  181. package/rt-tools-ui-kit-v2-0.18.0.tgz +0 -0
  182. package/src/lib/components/action-bar/CONTEXT.md +5 -0
  183. package/src/lib/components/action-bar/rt-action-bar.component.scss +30 -16
  184. package/src/lib/components/aside/CONTEXT.md +9 -1
  185. package/src/lib/components/aside/footer/rt-aside-footer.component.scss +7 -8
  186. package/src/lib/components/aside/header/rt-aside-header.component.scss +16 -1
  187. package/src/lib/components/aside/rt-aside.component.scss +17 -1
  188. package/src/lib/components/button/CONTEXT.md +12 -11
  189. package/src/lib/components/button/rt-button.directive.scss +36 -0
  190. package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +2 -2
  191. package/src/lib/components/data-table/cell/rt-data-table-cell.component.scss +1 -1
  192. package/src/lib/components/data-table/filter-cell/rt-data-table-filter-cell.component.scss +1 -1
  193. package/src/lib/components/data-table/rt-data-table.component.scss +1 -1
  194. package/src/lib/components/dialog/CONTEXT.md +9 -0
  195. package/src/lib/components/dialog/content/rt-dialog-content.component.scss +20 -0
  196. package/src/lib/components/dialog/footer/rt-dialog-footer.component.scss +18 -2
  197. package/src/lib/components/dialog/header/rt-dialog-header.component.scss +21 -3
  198. package/src/lib/components/dialog/rt-dialog.component.scss +9 -3
  199. package/src/lib/components/dot-field/CONTEXT.md +31 -0
  200. package/src/lib/components/dot-field/rt-dot-field.component.scss +20 -0
  201. package/src/lib/components/dot-field/stories/component/CONTEXT.md +14 -0
  202. package/src/lib/components/dot-field/stories/component/test-dot-field.component.scss +31 -0
  203. package/src/lib/components/dynamic-selector/CONTEXT.md +6 -0
  204. package/src/lib/components/field/CONTEXT.md +18 -2
  205. package/src/lib/components/header/CONTEXT.md +2 -2
  206. package/src/lib/components/icon/CONTEXT.md +11 -7
  207. package/src/lib/components/icon/rt-icon.component.scss +47 -0
  208. package/src/lib/components/icon-button/CONTEXT.md +27 -20
  209. package/src/lib/components/icon-button/rt-icon-button.component.scss +51 -25
  210. package/src/lib/components/image-upload/CONTEXT.md +20 -15
  211. package/src/lib/components/image-upload/rt-image-upload.component.scss +14 -2
  212. package/src/lib/components/pagination/rt-pagination.component.scss +1 -1
  213. package/src/lib/components/scroll-area/CONTEXT.md +2 -0
  214. package/src/lib/components/scroll-area/rt-scroll-area.component.scss +20 -3
  215. package/src/lib/components/select/rt-select.component.scss +4 -0
  216. package/src/lib/components/side-menu/CONTEXT.md +7 -2
  217. package/src/lib/components/spinner/CONTEXT.md +15 -8
  218. package/src/lib/components/spinner/rt-spinner.component.scss +108 -9
  219. package/src/lib/components/tag/rt-tag.component.scss +43 -23
  220. package/src/lib/components/toast/CONTEXT.md +8 -0
  221. package/src/lib/components/toast/rt-toast.component.scss +74 -15
  222. package/src/lib/components/toast/rt-toaster.component.scss +5 -1
  223. package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +35 -37
  224. package/src/lib/components/toggle-switch/CONTEXT.md +11 -3
  225. package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +53 -14
  226. package/src/lib/components/toolbar/rt-toolbar.component.scss +15 -4
  227. package/src/lib/components/tooltip/CONTEXT.md +5 -5
  228. package/src/rich-editor/lib/components/chat/CONTEXT.md +7 -2
  229. package/src/rich-editor/lib/components/chat/rt-chat.component.scss +25 -0
  230. package/src/styles/_semantic.scss +1 -1
  231. package/styles/tokens.css +43 -8
  232. package/types/rt-tools-ui-kit-v2-accordion.d.ts +30 -0
  233. package/types/rt-tools-ui-kit-v2-action-bar.d.ts +140 -0
  234. package/types/rt-tools-ui-kit-v2-aside-section.d.ts +25 -0
  235. package/types/rt-tools-ui-kit-v2-aside.d.ts +436 -0
  236. package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +78 -0
  237. package/types/rt-tools-ui-kit-v2-bar-list.d.ts +41 -0
  238. package/types/rt-tools-ui-kit-v2-bottom-sheet.d.ts +20 -0
  239. package/types/rt-tools-ui-kit-v2-button.d.ts +76 -0
  240. package/types/rt-tools-ui-kit-v2-calendar.d.ts +96 -0
  241. package/types/rt-tools-ui-kit-v2-card.d.ts +38 -0
  242. package/types/rt-tools-ui-kit-v2-checkbox.d.ts +46 -0
  243. package/types/rt-tools-ui-kit-v2-collapsible-text.d.ts +20 -0
  244. package/types/rt-tools-ui-kit-v2-confirm-popover.d.ts +85 -0
  245. package/types/rt-tools-ui-kit-v2-container.d.ts +425 -0
  246. package/types/rt-tools-ui-kit-v2-core.d.ts +1222 -0
  247. package/types/rt-tools-ui-kit-v2-counter-row.d.ts +22 -0
  248. package/types/rt-tools-ui-kit-v2-counter.d.ts +70 -0
  249. package/types/rt-tools-ui-kit-v2-data-list.d.ts +334 -0
  250. package/types/rt-tools-ui-kit-v2-data-table.d.ts +494 -0
  251. package/types/rt-tools-ui-kit-v2-date-picker.d.ts +181 -0
  252. package/types/rt-tools-ui-kit-v2-date-range.d.ts +98 -0
  253. package/types/rt-tools-ui-kit-v2-delta-view.d.ts +20 -0
  254. package/types/rt-tools-ui-kit-v2-detail-list.d.ts +33 -0
  255. package/types/rt-tools-ui-kit-v2-dialog.d.ts +287 -0
  256. package/types/rt-tools-ui-kit-v2-dot-field.d.ts +17 -0
  257. package/types/rt-tools-ui-kit-v2-download-link.d.ts +17 -0
  258. package/types/rt-tools-ui-kit-v2-dynamic-list.d.ts +139 -0
  259. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +384 -0
  260. package/types/rt-tools-ui-kit-v2-empty-state.d.ts +29 -0
  261. package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +57 -0
  262. package/types/rt-tools-ui-kit-v2-field.d.ts +82 -0
  263. package/types/rt-tools-ui-kit-v2-file-card.d.ts +114 -0
  264. package/types/rt-tools-ui-kit-v2-file-drop.d.ts +75 -0
  265. package/types/rt-tools-ui-kit-v2-file-input.d.ts +48 -0
  266. package/types/rt-tools-ui-kit-v2-file-list.d.ts +13 -0
  267. package/types/rt-tools-ui-kit-v2-filter-control.d.ts +72 -0
  268. package/types/rt-tools-ui-kit-v2-form-control.d.ts +74 -0
  269. package/types/rt-tools-ui-kit-v2-header.d.ts +40 -0
  270. package/types/rt-tools-ui-kit-v2-icon-button.d.ts +113 -0
  271. package/types/rt-tools-ui-kit-v2-icon.d.ts +238 -0
  272. package/types/rt-tools-ui-kit-v2-image-cropper.d.ts +168 -0
  273. package/types/rt-tools-ui-kit-v2-image-upload.d.ts +102 -0
  274. package/types/rt-tools-ui-kit-v2-info-item.d.ts +13 -0
  275. package/types/rt-tools-ui-kit-v2-input-number.d.ts +67 -0
  276. package/types/rt-tools-ui-kit-v2-input.d.ts +54 -0
  277. package/types/rt-tools-ui-kit-v2-live-badge.d.ts +23 -0
  278. package/types/rt-tools-ui-kit-v2-logo.d.ts +58 -0
  279. package/types/rt-tools-ui-kit-v2-markdown-text.d.ts +30 -0
  280. package/types/rt-tools-ui-kit-v2-menu.d.ts +217 -0
  281. package/types/rt-tools-ui-kit-v2-message.d.ts +56 -0
  282. package/types/rt-tools-ui-kit-v2-money-list.d.ts +34 -0
  283. package/types/rt-tools-ui-kit-v2-multiselect.d.ts +93 -0
  284. package/types/rt-tools-ui-kit-v2-night-grid.d.ts +39 -0
  285. package/types/rt-tools-ui-kit-v2-note.d.ts +21 -0
  286. package/types/rt-tools-ui-kit-v2-notifications-bell.d.ts +23 -0
  287. package/types/rt-tools-ui-kit-v2-page-header.d.ts +173 -0
  288. package/types/rt-tools-ui-kit-v2-pagination.d.ts +64 -0
  289. package/types/rt-tools-ui-kit-v2-photo-viewer.d.ts +98 -0
  290. package/types/rt-tools-ui-kit-v2-popover.d.ts +79 -0
  291. package/types/rt-tools-ui-kit-v2-radio-button.d.ts +61 -0
  292. package/types/rt-tools-ui-kit-v2-radius.d.ts +37 -0
  293. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +16 -20
  294. package/types/rt-tools-ui-kit-v2-ripple.d.ts +39 -0
  295. package/types/rt-tools-ui-kit-v2-scroll-area.d.ts +91 -0
  296. package/types/rt-tools-ui-kit-v2-section-nav.d.ts +23 -0
  297. package/types/rt-tools-ui-kit-v2-select.d.ts +215 -0
  298. package/types/rt-tools-ui-kit-v2-side-menu.d.ts +483 -0
  299. package/types/rt-tools-ui-kit-v2-skeleton-wrapper.d.ts +32 -0
  300. package/types/rt-tools-ui-kit-v2-skeleton.d.ts +41 -0
  301. package/types/rt-tools-ui-kit-v2-spinner.d.ts +56 -0
  302. package/types/rt-tools-ui-kit-v2-split-button.d.ts +72 -0
  303. package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +81 -0
  304. package/types/rt-tools-ui-kit-v2-stepper.d.ts +51 -0
  305. package/types/rt-tools-ui-kit-v2-table.d.ts +739 -0
  306. package/types/rt-tools-ui-kit-v2-tabs.d.ts +153 -0
  307. package/types/rt-tools-ui-kit-v2-tag.d.ts +70 -0
  308. package/types/rt-tools-ui-kit-v2-textarea.d.ts +36 -0
  309. package/types/rt-tools-ui-kit-v2-theme-toggle.d.ts +43 -0
  310. package/types/rt-tools-ui-kit-v2-thread-list.d.ts +111 -0
  311. package/types/rt-tools-ui-kit-v2-timeline.d.ts +35 -0
  312. package/types/rt-tools-ui-kit-v2-toast.d.ts +103 -0
  313. package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +109 -0
  314. package/types/rt-tools-ui-kit-v2-toggle-switch.d.ts +85 -0
  315. package/types/rt-tools-ui-kit-v2-toolbar.d.ts +66 -0
  316. package/types/rt-tools-ui-kit-v2-tooltip.d.ts +74 -0
  317. package/types/rt-tools-ui-kit-v2-welcome-dialog.d.ts +33 -0
  318. package/types/rt-tools-ui-kit-v2-workspace-details.d.ts +128 -0
  319. package/types/rt-tools-ui-kit-v2-workspace.d.ts +84 -0
  320. package/types/rt-tools-ui-kit-v2.d.ts +87 -9290
  321. package/rt-tools-ui-kit-v2-0.16.0.tgz +0 -0
@@ -0,0 +1,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":"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"}
@@ -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;;;;"}