@rt-tools/ui-kit-v2 0.17.0 → 0.19.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 (328) hide show
  1. package/README.md +21 -2
  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 +233 -0
  5. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -0
  6. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +97 -0
  7. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -0
  8. package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs +47 -0
  9. package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs.map +1 -0
  10. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +709 -0
  11. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -0
  12. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +214 -0
  13. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -0
  14. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +53 -0
  15. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -0
  16. package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs +88 -0
  17. package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs.map +1 -0
  18. package/fesm2022/rt-tools-ui-kit-v2-button.mjs +365 -0
  19. package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -0
  20. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +152 -0
  21. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -0
  22. package/fesm2022/rt-tools-ui-kit-v2-card.mjs +72 -0
  23. package/fesm2022/rt-tools-ui-kit-v2-card.mjs.map +1 -0
  24. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +111 -0
  25. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -0
  26. package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs +76 -0
  27. package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs.map +1 -0
  28. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs +255 -0
  29. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs.map +1 -0
  30. package/fesm2022/rt-tools-ui-kit-v2-container.mjs +1326 -0
  31. package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -0
  32. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +81 -0
  33. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -0
  34. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +2688 -0
  35. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -0
  36. package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs +45 -0
  37. package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs.map +1 -0
  38. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs +158 -0
  39. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs.map +1 -0
  40. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +894 -0
  41. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -0
  42. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +1217 -0
  43. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -0
  44. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +779 -0
  45. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -0
  46. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +573 -0
  47. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -0
  48. package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs +141 -0
  49. package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs.map +1 -0
  50. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs +68 -0
  51. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs.map +1 -0
  52. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs +478 -0
  53. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs.map +1 -0
  54. package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs +183 -0
  55. package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs.map +1 -0
  56. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +44 -0
  57. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -0
  58. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +260 -0
  59. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -0
  60. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +1036 -0
  61. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -0
  62. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +56 -0
  63. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -0
  64. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +107 -0
  65. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -0
  66. package/fesm2022/rt-tools-ui-kit-v2-field.mjs +183 -0
  67. package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -0
  68. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +219 -0
  69. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -0
  70. package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs +214 -0
  71. package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs.map +1 -0
  72. package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs +117 -0
  73. package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs.map +1 -0
  74. package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs +32 -0
  75. package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs.map +1 -0
  76. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +91 -0
  77. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -0
  78. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +220 -0
  79. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -0
  80. package/fesm2022/rt-tools-ui-kit-v2-header.mjs +72 -0
  81. package/fesm2022/rt-tools-ui-kit-v2-header.mjs.map +1 -0
  82. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +163 -0
  83. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -0
  84. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +711 -0
  85. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -0
  86. package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs +540 -0
  87. package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs.map +1 -0
  88. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +227 -0
  89. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -0
  90. package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs +37 -0
  91. package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs.map +1 -0
  92. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +361 -0
  93. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -0
  94. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +143 -0
  95. package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -0
  96. package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs +49 -0
  97. package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs.map +1 -0
  98. package/fesm2022/rt-tools-ui-kit-v2-logo.mjs +97 -0
  99. package/fesm2022/rt-tools-ui-kit-v2-logo.mjs.map +1 -0
  100. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs +57 -0
  101. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs.map +1 -0
  102. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +537 -0
  103. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -0
  104. package/fesm2022/rt-tools-ui-kit-v2-message.mjs +105 -0
  105. package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -0
  106. package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs +71 -0
  107. package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs.map +1 -0
  108. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +315 -0
  109. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -0
  110. package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs +51 -0
  111. package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs.map +1 -0
  112. package/fesm2022/rt-tools-ui-kit-v2-note.mjs +44 -0
  113. package/fesm2022/rt-tools-ui-kit-v2-note.mjs.map +1 -0
  114. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +54 -0
  115. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -0
  116. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +339 -0
  117. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -0
  118. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +187 -0
  119. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -0
  120. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs +170 -0
  121. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs.map +1 -0
  122. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs +312 -0
  123. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs.map +1 -0
  124. package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs +46 -0
  125. package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs.map +1 -0
  126. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +174 -0
  127. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -0
  128. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs +56 -0
  129. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs.map +1 -0
  130. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +336 -12
  131. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  132. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs +118 -0
  133. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs.map +1 -0
  134. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +290 -0
  135. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -0
  136. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +37 -0
  137. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -0
  138. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +495 -0
  139. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -0
  140. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +1493 -0
  141. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -0
  142. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs +49 -0
  143. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs.map +1 -0
  144. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs +123 -0
  145. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs.map +1 -0
  146. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs +70 -0
  147. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs.map +1 -0
  148. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs +92 -0
  149. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs.map +1 -0
  150. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +147 -0
  151. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -0
  152. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +117 -0
  153. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -0
  154. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +1636 -0
  155. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -0
  156. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +350 -0
  157. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -0
  158. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +122 -0
  159. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -0
  160. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +85 -0
  161. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -0
  162. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +73 -0
  163. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -0
  164. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +222 -0
  165. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -0
  166. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs +39 -0
  167. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs.map +1 -0
  168. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +338 -0
  169. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -0
  170. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +132 -0
  171. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -0
  172. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +162 -0
  173. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -0
  174. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +135 -0
  175. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -0
  176. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +214 -0
  177. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -0
  178. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs +64 -0
  179. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs.map +1 -0
  180. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +263 -0
  181. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -0
  182. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +296 -0
  183. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -0
  184. package/fesm2022/rt-tools-ui-kit-v2.mjs +94 -23819
  185. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  186. package/package.json +361 -1
  187. package/rt-tools-ui-kit-v2-0.19.0.tgz +0 -0
  188. package/src/assets/icons/sparkle.svg +9 -0
  189. package/src/assets/icons/thumb-down.svg +10 -0
  190. package/src/assets/icons/thumb-up.svg +9 -0
  191. package/src/assets/icons/trash-x.svg +7 -0
  192. package/src/assets/icons-material/sparkle.fill.svg +5 -0
  193. package/src/assets/icons-material/sparkle.svg +5 -0
  194. package/src/assets/icons-material/thumb-down.fill.svg +5 -0
  195. package/src/assets/icons-material/thumb-down.svg +5 -0
  196. package/src/assets/icons-material/thumb-up.fill.svg +5 -0
  197. package/src/assets/icons-material/thumb-up.svg +5 -0
  198. package/src/assets/icons-material/trash-x.fill.svg +5 -0
  199. package/src/assets/icons-material/trash-x.svg +5 -0
  200. package/src/lib/components/action-bar/CONTEXT.md +8 -2
  201. package/src/lib/components/action-bar/rt-action-bar-holder.component.scss +10 -7
  202. package/src/lib/components/action-bar/rt-action-bar.component.scss +82 -34
  203. package/src/lib/components/ai-run-status/CONTEXT.md +36 -0
  204. package/src/lib/components/ai-run-status/rt-ai-run-status.component.scss +119 -0
  205. package/src/lib/components/aside/CONTEXT.md +1 -0
  206. package/src/lib/components/aside/header/rt-aside-header.component.scss +27 -11
  207. package/src/lib/components/copy-value/CONTEXT.md +31 -0
  208. package/src/lib/components/copy-value/rt-copy-value.component.scss +39 -0
  209. package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +5 -5
  210. package/src/lib/components/dot-field/CONTEXT.md +31 -0
  211. package/src/lib/components/dot-field/rt-dot-field.component.scss +20 -0
  212. package/src/lib/components/dot-field/stories/component/CONTEXT.md +14 -0
  213. package/src/lib/components/dot-field/stories/component/test-dot-field.component.scss +31 -0
  214. package/src/lib/components/dynamic-selector/CONTEXT.md +18 -0
  215. package/src/lib/components/dynamic-selector/list/rt-dynamic-selector-list.component.scss +29 -1
  216. package/src/lib/components/dynamic-selector/popup/rt-dynamic-selector-popup.component.scss +84 -25
  217. package/src/lib/components/empty-state/CONTEXT.md +2 -1
  218. package/src/lib/components/empty-state/rt-empty-state.component.scss +4 -2
  219. package/src/lib/components/field/CONTEXT.md +18 -2
  220. package/src/lib/components/icon/CONTEXT.md +16 -12
  221. package/src/lib/components/icon/rt-icon.component.scss +13 -3
  222. package/src/lib/components/prompt-suggestion/CONTEXT.md +29 -0
  223. package/src/lib/components/prompt-suggestion/rt-prompt-suggestion.component.scss +58 -0
  224. package/src/lib/components/select/rt-select.component.scss +4 -0
  225. package/src/lib/components/thread-list/CONTEXT.md +4 -0
  226. package/src/lib/components/thread-list/rt-thread-list.component.scss +29 -0
  227. package/src/lib/components/toolbar/CONTEXT.md +4 -0
  228. package/src/lib/components/toolbar/rt-toolbar.component.scss +7 -0
  229. package/src/rich-editor/lib/components/ai-chat/CONTEXT.md +58 -0
  230. package/src/rich-editor/lib/components/ai-chat/answer/rt-ai-chat-answer.component.scss +12 -0
  231. package/src/rich-editor/lib/components/ai-chat/rt-ai-chat.component.scss +222 -0
  232. package/src/rich-editor/lib/components/rich-editor/rt-rich-editor.component.scss +3 -0
  233. package/src/styles/_scrollbar.scss +9 -0
  234. package/src/styles/_semantic.scss +1 -1
  235. package/styles/tokens.css +11 -8
  236. package/types/rt-tools-ui-kit-v2-accordion.d.ts +30 -0
  237. package/types/rt-tools-ui-kit-v2-action-bar.d.ts +149 -0
  238. package/types/rt-tools-ui-kit-v2-ai-run-status.d.ts +49 -0
  239. package/types/rt-tools-ui-kit-v2-aside-section.d.ts +25 -0
  240. package/types/rt-tools-ui-kit-v2-aside.d.ts +444 -0
  241. package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +78 -0
  242. package/types/rt-tools-ui-kit-v2-bar-list.d.ts +41 -0
  243. package/types/rt-tools-ui-kit-v2-bottom-sheet.d.ts +20 -0
  244. package/types/rt-tools-ui-kit-v2-button.d.ts +76 -0
  245. package/types/rt-tools-ui-kit-v2-calendar.d.ts +96 -0
  246. package/types/rt-tools-ui-kit-v2-card.d.ts +38 -0
  247. package/types/rt-tools-ui-kit-v2-checkbox.d.ts +46 -0
  248. package/types/rt-tools-ui-kit-v2-collapsible-text.d.ts +20 -0
  249. package/types/rt-tools-ui-kit-v2-confirm-popover.d.ts +85 -0
  250. package/types/rt-tools-ui-kit-v2-container.d.ts +425 -0
  251. package/types/rt-tools-ui-kit-v2-copy-value.d.ts +29 -0
  252. package/types/rt-tools-ui-kit-v2-core.d.ts +1262 -0
  253. package/types/rt-tools-ui-kit-v2-counter-row.d.ts +22 -0
  254. package/types/rt-tools-ui-kit-v2-counter.d.ts +70 -0
  255. package/types/rt-tools-ui-kit-v2-data-list.d.ts +334 -0
  256. package/types/rt-tools-ui-kit-v2-data-table.d.ts +494 -0
  257. package/types/rt-tools-ui-kit-v2-date-picker.d.ts +181 -0
  258. package/types/rt-tools-ui-kit-v2-date-range.d.ts +98 -0
  259. package/types/rt-tools-ui-kit-v2-delta-view.d.ts +20 -0
  260. package/types/rt-tools-ui-kit-v2-detail-list.d.ts +33 -0
  261. package/types/rt-tools-ui-kit-v2-dialog.d.ts +287 -0
  262. package/types/rt-tools-ui-kit-v2-dot-field.d.ts +17 -0
  263. package/types/rt-tools-ui-kit-v2-download-link.d.ts +17 -0
  264. package/types/rt-tools-ui-kit-v2-dynamic-list.d.ts +139 -0
  265. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +423 -0
  266. package/types/rt-tools-ui-kit-v2-empty-state.d.ts +29 -0
  267. package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +57 -0
  268. package/types/rt-tools-ui-kit-v2-field.d.ts +82 -0
  269. package/types/rt-tools-ui-kit-v2-file-card.d.ts +114 -0
  270. package/types/rt-tools-ui-kit-v2-file-drop.d.ts +75 -0
  271. package/types/rt-tools-ui-kit-v2-file-input.d.ts +48 -0
  272. package/types/rt-tools-ui-kit-v2-file-list.d.ts +13 -0
  273. package/types/rt-tools-ui-kit-v2-filter-control.d.ts +72 -0
  274. package/types/rt-tools-ui-kit-v2-form-control.d.ts +74 -0
  275. package/types/rt-tools-ui-kit-v2-header.d.ts +40 -0
  276. package/types/rt-tools-ui-kit-v2-icon-button.d.ts +113 -0
  277. package/types/rt-tools-ui-kit-v2-icon.d.ts +246 -0
  278. package/types/rt-tools-ui-kit-v2-image-cropper.d.ts +168 -0
  279. package/types/rt-tools-ui-kit-v2-image-upload.d.ts +102 -0
  280. package/types/rt-tools-ui-kit-v2-info-item.d.ts +13 -0
  281. package/types/rt-tools-ui-kit-v2-input-number.d.ts +67 -0
  282. package/types/rt-tools-ui-kit-v2-input.d.ts +54 -0
  283. package/types/rt-tools-ui-kit-v2-live-badge.d.ts +23 -0
  284. package/types/rt-tools-ui-kit-v2-logo.d.ts +58 -0
  285. package/types/rt-tools-ui-kit-v2-markdown-text.d.ts +30 -0
  286. package/types/rt-tools-ui-kit-v2-menu.d.ts +217 -0
  287. package/types/rt-tools-ui-kit-v2-message.d.ts +56 -0
  288. package/types/rt-tools-ui-kit-v2-money-list.d.ts +34 -0
  289. package/types/rt-tools-ui-kit-v2-multiselect.d.ts +93 -0
  290. package/types/rt-tools-ui-kit-v2-night-grid.d.ts +39 -0
  291. package/types/rt-tools-ui-kit-v2-note.d.ts +21 -0
  292. package/types/rt-tools-ui-kit-v2-notifications-bell.d.ts +23 -0
  293. package/types/rt-tools-ui-kit-v2-page-header.d.ts +173 -0
  294. package/types/rt-tools-ui-kit-v2-pagination.d.ts +64 -0
  295. package/types/rt-tools-ui-kit-v2-photo-viewer.d.ts +98 -0
  296. package/types/rt-tools-ui-kit-v2-popover.d.ts +79 -0
  297. package/types/rt-tools-ui-kit-v2-prompt-suggestion.d.ts +21 -0
  298. package/types/rt-tools-ui-kit-v2-radio-button.d.ts +61 -0
  299. package/types/rt-tools-ui-kit-v2-radius.d.ts +37 -0
  300. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +186 -2
  301. package/types/rt-tools-ui-kit-v2-ripple.d.ts +39 -0
  302. package/types/rt-tools-ui-kit-v2-scroll-area.d.ts +91 -0
  303. package/types/rt-tools-ui-kit-v2-section-nav.d.ts +23 -0
  304. package/types/rt-tools-ui-kit-v2-select.d.ts +215 -0
  305. package/types/rt-tools-ui-kit-v2-side-menu.d.ts +483 -0
  306. package/types/rt-tools-ui-kit-v2-skeleton-wrapper.d.ts +32 -0
  307. package/types/rt-tools-ui-kit-v2-skeleton.d.ts +41 -0
  308. package/types/rt-tools-ui-kit-v2-spinner.d.ts +56 -0
  309. package/types/rt-tools-ui-kit-v2-split-button.d.ts +72 -0
  310. package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +81 -0
  311. package/types/rt-tools-ui-kit-v2-stepper.d.ts +51 -0
  312. package/types/rt-tools-ui-kit-v2-table.d.ts +739 -0
  313. package/types/rt-tools-ui-kit-v2-tabs.d.ts +153 -0
  314. package/types/rt-tools-ui-kit-v2-tag.d.ts +70 -0
  315. package/types/rt-tools-ui-kit-v2-textarea.d.ts +36 -0
  316. package/types/rt-tools-ui-kit-v2-theme-toggle.d.ts +43 -0
  317. package/types/rt-tools-ui-kit-v2-thread-list.d.ts +124 -0
  318. package/types/rt-tools-ui-kit-v2-timeline.d.ts +35 -0
  319. package/types/rt-tools-ui-kit-v2-toast.d.ts +103 -0
  320. package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +109 -0
  321. package/types/rt-tools-ui-kit-v2-toggle-switch.d.ts +85 -0
  322. package/types/rt-tools-ui-kit-v2-toolbar.d.ts +66 -0
  323. package/types/rt-tools-ui-kit-v2-tooltip.d.ts +74 -0
  324. package/types/rt-tools-ui-kit-v2-welcome-dialog.d.ts +33 -0
  325. package/types/rt-tools-ui-kit-v2-workspace-details.d.ts +128 -0
  326. package/types/rt-tools-ui-kit-v2-workspace.d.ts +84 -0
  327. package/types/rt-tools-ui-kit-v2.d.ts +90 -9599
  328. package/rt-tools-ui-kit-v2-0.17.0.tgz +0 -0
@@ -0,0 +1,107 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, TemplateRef, Directive, contentChild, computed, model, input, booleanAttribute, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { NgTemplateOutlet } from '@angular/common';
4
+ import { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';
5
+ import { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';
6
+
7
+ /**
8
+ * Тело `rt-expansion-panel`, собираемое лениво: ставится на `<ng-template>` внутри панели, и его
9
+ * содержимое создаётся при раскрытии и уходит после сворачивания. Сворачивание при этом доигрывает
10
+ * движение до конца: тело уходит вместе со своим содержимым, а не пустым.
11
+ */
12
+ class RtExpansionPanelContentDirective {
13
+ constructor() {
14
+ this.templateRef = inject(TemplateRef);
15
+ }
16
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtExpansionPanelContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
17
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: RtExpansionPanelContentDirective, isStandalone: true, selector: "ng-template[rtExpansionPanelContent]", ngImport: i0 }); }
18
+ }
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtExpansionPanelContentDirective, decorators: [{
20
+ type: Directive,
21
+ args: [{
22
+ selector: 'ng-template[rtExpansionPanelContent]',
23
+ }]
24
+ }] });
25
+
26
+ const BEM_BLOCK = 'rt-expansion-panel';
27
+ let expansionPanelIdSeed = 0;
28
+ function nextExpansionPanelId() {
29
+ expansionPanelIdSeed += 1;
30
+ return expansionPanelIdSeed;
31
+ }
32
+ /**
33
+ * Раскрывающаяся панель: заголовок-кнопка во всю ширину с шевроном у правого края и тело под ним.
34
+ * Нажатие на заголовок раскрывает и сворачивает тело, раскрытие и сворачивание идут с движением.
35
+ * Заменяет во втором ките панель раскрытия Material первого кита.
36
+ *
37
+ * Заголовок — содержимое панели без отметки. Тело — узел с `rtExpansionPanelBody`, созданный сразу,
38
+ * или `<ng-template rtExpansionPanelContent>`, созданный при раскрытии.
39
+ *
40
+ * Состояние раскрытия — `expanded`, двусторонняя привязка: панель пишет в него сама, а владелец
41
+ * может держать его в своём сигнале и менять извне.
42
+ */
43
+ class RtExpansionPanelComponent {
44
+ constructor() {
45
+ /** Основа id: две панели на одной странице не ссылаются на чужое тело. */
46
+ this.#idBase = `rt-expansion-panel-${nextExpansionPanelId()}`;
47
+ /** Ленивое тело: шаблон создаётся при раскрытии. */
48
+ this.lazyContent = contentChild(RtExpansionPanelContentDirective, /* @ts-ignore */
49
+ ...(ngDevMode ? [{ debugName: "lazyContent" }] : /* istanbul ignore next */ []));
50
+ this.bodyId = `${this.#idBase}-body`;
51
+ this.headerDomId = computed(() => this.headerId() ?? `${this.#idBase}-header`, /* @ts-ignore */
52
+ ...(ngDevMode ? [{ debugName: "headerDomId" }] : /* istanbul ignore next */ []));
53
+ /** Тело раскрыто. Двусторонняя привязка: нажатие на заголовок пишет сюда. */
54
+ this.expanded = model(false, /* @ts-ignore */
55
+ ...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
56
+ /** Заголовок не нажимается, тело остаётся как было. */
57
+ this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
58
+ /** Шеврона нет: раскрытие читается по содержимому или его нечего раскрывать. */
59
+ this.hideToggle = input(false, { ...(ngDevMode ? { debugName: "hideToggle" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
60
+ this.appearance = input('card', /* @ts-ignore */
61
+ ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
62
+ /** Id кнопки заголовка. Нужен владельцу, который ищет заголовок по своему номеру; иначе — свой. */
63
+ this.headerId = input(null, /* @ts-ignore */
64
+ ...(ngDevMode ? [{ debugName: "headerId" }] : /* istanbul ignore next */ []));
65
+ /** Имя кнопки заголовка для вспомогательных средств, когда видимой подписи мало. */
66
+ this.ariaLabel = input(null, /* @ts-ignore */
67
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
68
+ }
69
+ /** Основа id: две панели на одной странице не ссылаются на чужое тело. */
70
+ #idBase;
71
+ /** Нажатие на заголовок: раскрывает свёрнутую панель и сворачивает раскрытую. */
72
+ toggle() {
73
+ if (!this.disabled()) {
74
+ this.expanded.set(!this.expanded());
75
+ }
76
+ }
77
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtExpansionPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
78
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtExpansionPanelComponent, isStandalone: true, selector: "rt-expansion-panel", inputs: { expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hideToggle: { classPropertyName: "hideToggle", publicName: "hideToggle", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, headerId: { classPropertyName: "headerId", publicName: "headerId", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expanded: "expandedChange" }, host: { properties: { "class.rt-expansion-panel--plain": "appearance() === \"plain\"", "class.rt-expansion-panel--expanded": "expanded()", "class.rt-expansion-panel--disabled": "disabled()" }, classAttribute: "rt-expansion-panel" }, queries: [{ propertyName: "lazyContent", first: true, predicate: RtExpansionPanelContentDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container rtBlock=\"rt-expansion-panel\">\n <button\n type=\"button\"\n rtElem=\"header\"\n qa-dataid=\"expansion-panel-header\"\n [id]=\"headerDomId()\"\n [disabled]=\"disabled()\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-controls]=\"expanded() ? bodyId : null\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"toggle()\">\n <ng-content />\n\n @if (!hideToggle()) {\n <!-- \u0428\u0435\u0432\u0440\u043E\u043D \u2014 \u0432 \u043E\u0431\u0451\u0440\u0442\u043A\u0435: \u0448\u0438\u0440\u0438\u043D\u0443 \u0441\u0442\u043E\u043B\u0431\u0446\u0430 \u0434\u0435\u0440\u0436\u0438\u0442 \u043E\u043D\u0430, \u0437\u043D\u0430\u0447\u043E\u043A \u0441\u0432\u043E\u044E \u0448\u0438\u0440\u0438\u043D\u0443 \u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u0430\u043C. -->\n <span rtElem=\"chevron\" aria-hidden=\"true\" [rtMod]=\"{ open: expanded() }\"><rt-icon size=\"sm\" name=\"chevron-down\" /></span>\n }\n </button>\n\n @if (expanded()) {\n <!-- \u0421\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u0434\u043E\u0438\u0433\u0440\u044B\u0432\u0430\u0435\u0442 \u0434\u0432\u0438\u0436\u0435\u043D\u0438\u0435: \u043A\u043B\u0430\u0441\u0441 \u0443\u0445\u043E\u0434\u0430 \u0441\u0432\u043E\u0434\u0438\u0442 \u0432\u044B\u0441\u043E\u0442\u0443 \u043A \u043D\u0443\u043B\u044E, \u0438 \u0442\u0435\u043B\u043E \u0443\u0445\u043E\u0434\u0438\u0442 \u043F\u043E\u0441\u043B\u0435. -->\n <div\n rtElem=\"body\"\n role=\"region\"\n qa-dataid=\"expansion-panel-body\"\n animate.leave=\"rt-expansion-panel__body--leaving\"\n [id]=\"bodyId\"\n [attr.aria-labelledby]=\"headerDomId()\">\n <ng-content select=\"[rtExpansionPanelBody]\" />\n\n @if (lazyContent(); as content) {\n <ng-container [ngTemplateOutlet]=\"content.templateRef\" />\n }\n </div>\n }\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-expansion-panel{--rt-expansion-panel-radius: var(--rt-radius-md);--rt-expansion-panel-shadow: var(--rt-shadow-sm);--rt-expansion-panel-duration: var(--rt-duration-base);--rt-expansion-panel-bg: var(--rt-color-bg-surface);--rt-expansion-panel-header-min-height: var(--rt-control-height-lg);--rt-expansion-panel-header-padding-block: var(--rt-space-sm);--rt-expansion-panel-header-padding-start: var(--rt-space-lg);--rt-expansion-panel-header-padding-end: var(--rt-space-md);--rt-expansion-panel-header-gap: var(--rt-space-sm);--rt-expansion-panel-header-radius: var(--rt-radius-md);--rt-expansion-panel-header-bg: transparent;--rt-expansion-panel-header-hover-bg: var(--rt-color-bg-hover);--rt-expansion-panel-header-color: var(--rt-color-text-primary);--rt-expansion-panel-header-font-size: var(--rt-text-md);--rt-expansion-panel-header-font-weight: var(--rt-font-weight-medium);--rt-expansion-panel-chevron-size: var(--rt-control-height-sm);--rt-expansion-panel-chevron-color: var(--rt-color-text-muted);--rt-expansion-panel-body-padding-inline: var(--rt-space-lg);--rt-expansion-panel-body-padding-end: var(--rt-space-md);display:block;width:100%;box-sizing:border-box;border-radius:var(--rt-expansion-panel-radius);background:var(--rt-expansion-panel-bg);box-shadow:var(--rt-expansion-panel-shadow);color:var(--rt-color-text-primary)}.rt-expansion-panel--plain{--rt-expansion-panel-radius: var(--rt-radius-none);--rt-expansion-panel-shadow: var(--rt-shadow-none);--rt-expansion-panel-bg: transparent;--rt-expansion-panel-header-min-height: var(--rt-control-height-md);--rt-expansion-panel-header-padding-start: var(--rt-space-0);--rt-expansion-panel-header-padding-end: var(--rt-space-0);--rt-expansion-panel-header-font-size: var(--rt-text-sm);--rt-expansion-panel-header-font-weight: var(--rt-font-weight-regular);--rt-expansion-panel-body-padding-inline: var(--rt-space-0);--rt-expansion-panel-body-padding-end: var(--rt-space-0)}.rt-expansion-panel__header{display:flex;width:100%;min-height:var(--rt-expansion-panel-header-min-height);box-sizing:border-box;align-items:center;border:0;border-radius:var(--rt-expansion-panel-header-radius);background:var(--rt-expansion-panel-header-bg);color:var(--rt-expansion-panel-header-color);cursor:pointer;font:inherit;font-size:var(--rt-expansion-panel-header-font-size);font-weight:var(--rt-expansion-panel-header-font-weight);gap:var(--rt-expansion-panel-header-gap);padding-block:var(--rt-expansion-panel-header-padding-block);padding-inline:var(--rt-expansion-panel-header-padding-start) var(--rt-expansion-panel-header-padding-end);text-align:start;transition:background-color var(--rt-expansion-panel-duration) ease}.rt-expansion-panel__header:hover:not(:disabled){background:var(--rt-expansion-panel-header-hover-bg)}.rt-expansion-panel__header:focus-visible{outline:var(--rt-focus-ring-width) solid var(--rt-focus-ring-color);outline-offset:calc(var(--rt-focus-ring-width) * -1)}.rt-expansion-panel__header:disabled{color:var(--rt-color-text-disabled);cursor:default}.rt-expansion-panel__chevron{display:inline-flex;flex-shrink:0;justify-content:center;color:var(--rt-expansion-panel-chevron-color);inline-size:var(--rt-expansion-panel-chevron-size);margin-inline-start:auto;transition:transform var(--rt-expansion-panel-duration) ease}.rt-expansion-panel__chevron--open{transform:rotate(180deg)}.rt-expansion-panel__body{overflow:hidden;height:auto;interpolate-size:allow-keywords;padding-block-end:var(--rt-expansion-panel-body-padding-end);padding-inline:var(--rt-expansion-panel-body-padding-inline);transition:height var(--rt-expansion-panel-duration) ease,padding-block-end var(--rt-expansion-panel-duration) ease}@starting-style{.rt-expansion-panel__body{height:0;padding-block-end:0}}.rt-expansion-panel__body--leaving{height:0;padding-block-end:0}@media(prefers-reduced-motion:reduce){.rt-expansion-panel__body{transition:none}}.rt-expansion-panel--disabled .rt-expansion-panel__chevron{color:var(--rt-color-text-disabled)}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type:
79
+ // directives
80
+ BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }, { kind: "component", type:
81
+ // components
82
+ RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "glyphStrategy", "size", "color", "fill", "spin", "rotate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
83
+ }
84
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtExpansionPanelComponent, decorators: [{
85
+ type: Component,
86
+ args: [{ selector: 'rt-expansion-panel', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
87
+ NgTemplateOutlet,
88
+ // directives
89
+ BlockDirective,
90
+ ElemDirective,
91
+ ModDirective,
92
+ // components
93
+ RtIconComponent,
94
+ ], host: {
95
+ class: BEM_BLOCK,
96
+ '[class.rt-expansion-panel--plain]': 'appearance() === "plain"',
97
+ '[class.rt-expansion-panel--expanded]': 'expanded()',
98
+ '[class.rt-expansion-panel--disabled]': 'disabled()',
99
+ }, template: "<ng-container rtBlock=\"rt-expansion-panel\">\n <button\n type=\"button\"\n rtElem=\"header\"\n qa-dataid=\"expansion-panel-header\"\n [id]=\"headerDomId()\"\n [disabled]=\"disabled()\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-controls]=\"expanded() ? bodyId : null\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"toggle()\">\n <ng-content />\n\n @if (!hideToggle()) {\n <!-- \u0428\u0435\u0432\u0440\u043E\u043D \u2014 \u0432 \u043E\u0431\u0451\u0440\u0442\u043A\u0435: \u0448\u0438\u0440\u0438\u043D\u0443 \u0441\u0442\u043E\u043B\u0431\u0446\u0430 \u0434\u0435\u0440\u0436\u0438\u0442 \u043E\u043D\u0430, \u0437\u043D\u0430\u0447\u043E\u043A \u0441\u0432\u043E\u044E \u0448\u0438\u0440\u0438\u043D\u0443 \u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u0430\u043C. -->\n <span rtElem=\"chevron\" aria-hidden=\"true\" [rtMod]=\"{ open: expanded() }\"><rt-icon size=\"sm\" name=\"chevron-down\" /></span>\n }\n </button>\n\n @if (expanded()) {\n <!-- \u0421\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u0434\u043E\u0438\u0433\u0440\u044B\u0432\u0430\u0435\u0442 \u0434\u0432\u0438\u0436\u0435\u043D\u0438\u0435: \u043A\u043B\u0430\u0441\u0441 \u0443\u0445\u043E\u0434\u0430 \u0441\u0432\u043E\u0434\u0438\u0442 \u0432\u044B\u0441\u043E\u0442\u0443 \u043A \u043D\u0443\u043B\u044E, \u0438 \u0442\u0435\u043B\u043E \u0443\u0445\u043E\u0434\u0438\u0442 \u043F\u043E\u0441\u043B\u0435. -->\n <div\n rtElem=\"body\"\n role=\"region\"\n qa-dataid=\"expansion-panel-body\"\n animate.leave=\"rt-expansion-panel__body--leaving\"\n [id]=\"bodyId\"\n [attr.aria-labelledby]=\"headerDomId()\">\n <ng-content select=\"[rtExpansionPanelBody]\" />\n\n @if (lazyContent(); as content) {\n <ng-container [ngTemplateOutlet]=\"content.templateRef\" />\n }\n </div>\n }\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-expansion-panel{--rt-expansion-panel-radius: var(--rt-radius-md);--rt-expansion-panel-shadow: var(--rt-shadow-sm);--rt-expansion-panel-duration: var(--rt-duration-base);--rt-expansion-panel-bg: var(--rt-color-bg-surface);--rt-expansion-panel-header-min-height: var(--rt-control-height-lg);--rt-expansion-panel-header-padding-block: var(--rt-space-sm);--rt-expansion-panel-header-padding-start: var(--rt-space-lg);--rt-expansion-panel-header-padding-end: var(--rt-space-md);--rt-expansion-panel-header-gap: var(--rt-space-sm);--rt-expansion-panel-header-radius: var(--rt-radius-md);--rt-expansion-panel-header-bg: transparent;--rt-expansion-panel-header-hover-bg: var(--rt-color-bg-hover);--rt-expansion-panel-header-color: var(--rt-color-text-primary);--rt-expansion-panel-header-font-size: var(--rt-text-md);--rt-expansion-panel-header-font-weight: var(--rt-font-weight-medium);--rt-expansion-panel-chevron-size: var(--rt-control-height-sm);--rt-expansion-panel-chevron-color: var(--rt-color-text-muted);--rt-expansion-panel-body-padding-inline: var(--rt-space-lg);--rt-expansion-panel-body-padding-end: var(--rt-space-md);display:block;width:100%;box-sizing:border-box;border-radius:var(--rt-expansion-panel-radius);background:var(--rt-expansion-panel-bg);box-shadow:var(--rt-expansion-panel-shadow);color:var(--rt-color-text-primary)}.rt-expansion-panel--plain{--rt-expansion-panel-radius: var(--rt-radius-none);--rt-expansion-panel-shadow: var(--rt-shadow-none);--rt-expansion-panel-bg: transparent;--rt-expansion-panel-header-min-height: var(--rt-control-height-md);--rt-expansion-panel-header-padding-start: var(--rt-space-0);--rt-expansion-panel-header-padding-end: var(--rt-space-0);--rt-expansion-panel-header-font-size: var(--rt-text-sm);--rt-expansion-panel-header-font-weight: var(--rt-font-weight-regular);--rt-expansion-panel-body-padding-inline: var(--rt-space-0);--rt-expansion-panel-body-padding-end: var(--rt-space-0)}.rt-expansion-panel__header{display:flex;width:100%;min-height:var(--rt-expansion-panel-header-min-height);box-sizing:border-box;align-items:center;border:0;border-radius:var(--rt-expansion-panel-header-radius);background:var(--rt-expansion-panel-header-bg);color:var(--rt-expansion-panel-header-color);cursor:pointer;font:inherit;font-size:var(--rt-expansion-panel-header-font-size);font-weight:var(--rt-expansion-panel-header-font-weight);gap:var(--rt-expansion-panel-header-gap);padding-block:var(--rt-expansion-panel-header-padding-block);padding-inline:var(--rt-expansion-panel-header-padding-start) var(--rt-expansion-panel-header-padding-end);text-align:start;transition:background-color var(--rt-expansion-panel-duration) ease}.rt-expansion-panel__header:hover:not(:disabled){background:var(--rt-expansion-panel-header-hover-bg)}.rt-expansion-panel__header:focus-visible{outline:var(--rt-focus-ring-width) solid var(--rt-focus-ring-color);outline-offset:calc(var(--rt-focus-ring-width) * -1)}.rt-expansion-panel__header:disabled{color:var(--rt-color-text-disabled);cursor:default}.rt-expansion-panel__chevron{display:inline-flex;flex-shrink:0;justify-content:center;color:var(--rt-expansion-panel-chevron-color);inline-size:var(--rt-expansion-panel-chevron-size);margin-inline-start:auto;transition:transform var(--rt-expansion-panel-duration) ease}.rt-expansion-panel__chevron--open{transform:rotate(180deg)}.rt-expansion-panel__body{overflow:hidden;height:auto;interpolate-size:allow-keywords;padding-block-end:var(--rt-expansion-panel-body-padding-end);padding-inline:var(--rt-expansion-panel-body-padding-inline);transition:height var(--rt-expansion-panel-duration) ease,padding-block-end var(--rt-expansion-panel-duration) ease}@starting-style{.rt-expansion-panel__body{height:0;padding-block-end:0}}.rt-expansion-panel__body--leaving{height:0;padding-block-end:0}@media(prefers-reduced-motion:reduce){.rt-expansion-panel__body{transition:none}}.rt-expansion-panel--disabled .rt-expansion-panel__chevron{color:var(--rt-color-text-disabled)}}\n"] }]
100
+ }], propDecorators: { lazyContent: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtExpansionPanelContentDirective), { isSignal: true }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }, { type: i0.Output, args: ["expandedChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], hideToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideToggle", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], headerId: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerId", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
101
+
102
+ /**
103
+ * Generated bundle index. Do not edit.
104
+ */
105
+
106
+ export { RtExpansionPanelComponent, RtExpansionPanelContentDirective };
107
+ //# sourceMappingURL=rt-tools-ui-kit-v2-expansion-panel.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-expansion-panel.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/expansion-panel/rt-expansion-panel-content.directive.ts","../../../projects/ui-kit-v2/src/lib/components/expansion-panel/rt-expansion-panel.component.ts","../../../projects/ui-kit-v2/src/lib/components/expansion-panel/rt-expansion-panel.component.html","../../../projects/ui-kit-v2/src/lib/components/expansion-panel/rt-tools-ui-kit-v2-expansion-panel.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Тело `rt-expansion-panel`, собираемое лениво: ставится на `<ng-template>` внутри панели, и его\n * содержимое создаётся при раскрытии и уходит после сворачивания. Сворачивание при этом доигрывает\n * движение до конца: тело уходит вместе со своим содержимым, а не пустым.\n */\n@Directive({\n selector: 'ng-template[rtExpansionPanelContent]',\n})\nexport class RtExpansionPanelContentDirective {\n public readonly templateRef: TemplateRef<unknown> = inject<TemplateRef<unknown>>(TemplateRef);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n input,\n InputSignal,\n InputSignalWithTransform,\n model,\n ModelSignal,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtExpansionPanelContentDirective } from './rt-expansion-panel-content.directive';\nimport { IRtExpansionPanel } from './rt-expansion-panel.model';\n\nconst BEM_BLOCK: string = 'rt-expansion-panel';\n\nlet expansionPanelIdSeed: number = 0;\n\nfunction nextExpansionPanelId(): number {\n expansionPanelIdSeed += 1;\n return expansionPanelIdSeed;\n}\n\n/**\n * Раскрывающаяся панель: заголовок-кнопка во всю ширину с шевроном у правого края и тело под ним.\n * Нажатие на заголовок раскрывает и сворачивает тело, раскрытие и сворачивание идут с движением.\n * Заменяет во втором ките панель раскрытия Material первого кита.\n *\n * Заголовок — содержимое панели без отметки. Тело — узел с `rtExpansionPanelBody`, созданный сразу,\n * или `<ng-template rtExpansionPanelContent>`, созданный при раскрытии.\n *\n * Состояние раскрытия — `expanded`, двусторонняя привязка: панель пишет в него сама, а владелец\n * может держать его в своём сигнале и менять извне.\n */\n@Component({\n selector: 'rt-expansion-panel',\n templateUrl: './rt-expansion-panel.component.html',\n styleUrl: './rt-expansion-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgTemplateOutlet,\n\n // directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n\n // components\n RtIconComponent,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-expansion-panel--plain]': 'appearance() === \"plain\"',\n '[class.rt-expansion-panel--expanded]': 'expanded()',\n '[class.rt-expansion-panel--disabled]': 'disabled()',\n },\n})\nexport class RtExpansionPanelComponent {\n /** Основа id: две панели на одной странице не ссылаются на чужое тело. */\n readonly #idBase: string = `rt-expansion-panel-${nextExpansionPanelId()}`;\n\n /** Ленивое тело: шаблон создаётся при раскрытии. */\n protected readonly lazyContent: Signal<RtExpansionPanelContentDirective | undefined> = contentChild(RtExpansionPanelContentDirective);\n protected readonly bodyId: string = `${this.#idBase}-body`;\n protected readonly headerDomId: Signal<string> = computed((): string => this.headerId() ?? `${this.#idBase}-header`);\n\n /** Тело раскрыто. Двусторонняя привязка: нажатие на заголовок пишет сюда. */\n public readonly expanded: ModelSignal<boolean> = model<boolean>(false);\n\n /** Заголовок не нажимается, тело остаётся как было. */\n public readonly disabled: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n\n /** Шеврона нет: раскрытие читается по содержимому или его нечего раскрывать. */\n public readonly hideToggle: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n\n public readonly appearance: InputSignal<IRtExpansionPanel.Appearance> = input<IRtExpansionPanel.Appearance>('card');\n\n /** Id кнопки заголовка. Нужен владельцу, который ищет заголовок по своему номеру; иначе — свой. */\n public readonly headerId: InputSignal<string | null> = input<string | null>(null);\n\n /** Имя кнопки заголовка для вспомогательных средств, когда видимой подписи мало. */\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n /** Нажатие на заголовок: раскрывает свёрнутую панель и сворачивает раскрытую. */\n public toggle(): void {\n if (!this.disabled()) {\n this.expanded.set(!this.expanded());\n }\n }\n}\n","<ng-container rtBlock=\"rt-expansion-panel\">\n <button\n type=\"button\"\n rtElem=\"header\"\n qa-dataid=\"expansion-panel-header\"\n [id]=\"headerDomId()\"\n [disabled]=\"disabled()\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-controls]=\"expanded() ? bodyId : null\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"toggle()\">\n <ng-content />\n\n @if (!hideToggle()) {\n <!-- Шеврон — в обёртке: ширину столбца держит она, значок свою ширину ставит сам. -->\n <span rtElem=\"chevron\" aria-hidden=\"true\" [rtMod]=\"{ open: expanded() }\"><rt-icon size=\"sm\" name=\"chevron-down\" /></span>\n }\n </button>\n\n @if (expanded()) {\n <!-- Сворачивание доигрывает движение: класс ухода сводит высоту к нулю, и тело уходит после. -->\n <div\n rtElem=\"body\"\n role=\"region\"\n qa-dataid=\"expansion-panel-body\"\n animate.leave=\"rt-expansion-panel__body--leaving\"\n [id]=\"bodyId\"\n [attr.aria-labelledby]=\"headerDomId()\">\n <ng-content select=\"[rtExpansionPanelBody]\" />\n\n @if (lazyContent(); as content) {\n <ng-container [ngTemplateOutlet]=\"content.templateRef\" />\n }\n </div>\n }\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,183 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Directive, inject, contentChild, computed, input, booleanAttribute, effect, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';
4
+ import { RT_KIT_LABELS, rtKitLabel } 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 { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';
8
+ import { RtSkeletonWrapperComponent } from '@rt-tools/ui-kit-v2/skeleton-wrapper';
9
+
10
+ /**
11
+ * Маркер проецируемого hint'а для rt-field. Нужен, когда подсказке требуется
12
+ * разметка (`<strong>`, интерполяция значений), которую плоский string-input
13
+ * `[hint]` передать не может. Если проецируемый hint присутствует — rt-field
14
+ * рендерит его вместо строкового `[hint]` (тот остаётся fallback'ом).
15
+ */
16
+ class RtFieldHintDirective {
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtFieldHintDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
18
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: RtFieldHintDirective, isStandalone: true, selector: "[rtFieldHint]", ngImport: i0 }); }
19
+ }
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtFieldHintDirective, decorators: [{
21
+ type: Directive,
22
+ args: [{
23
+ selector: '[rtFieldHint]',
24
+ }]
25
+ }] });
26
+
27
+ /**
28
+ * Ключи сообщений об ошибках по имени валидатора (перекрываются input'ом
29
+ * [errors] поштучно, уже готовым текстом).
30
+ *
31
+ * Здесь ключи, а не переводы: карта собирается при загрузке модуля, когда язык
32
+ * страницы ещё неизвестен, и готовый текст остался бы на языке по умолчанию
33
+ * даже под переведённой подписью поля. Переводит сам компонент поля.
34
+ */
35
+ const RT_FIELD_DEFAULT_ERROR_KEYS = {
36
+ required: 'fieldErrorRequired',
37
+ email: 'fieldErrorEmail',
38
+ minlength: 'fieldErrorMinLength',
39
+ maxlength: 'fieldErrorMaxLength',
40
+ min: 'fieldErrorMin',
41
+ max: 'fieldErrorMax',
42
+ pattern: 'fieldErrorPattern',
43
+ };
44
+ /** Текст-плейсхолдер read-only поля без значения. */
45
+ const RT_FIELD_EMPTY_VALUE = '—';
46
+
47
+ const BEM_BLOCK = 'rt-field';
48
+ /** Счётчик для авто-id (связка label[for] ↔ controlId спроецированного контрола). */
49
+ let uidSeed = 0;
50
+ function nextAutoId() {
51
+ uidSeed += 1;
52
+ return `rt-field-${uidSeed}`;
53
+ }
54
+ /**
55
+ * Обёртка единой анатомии поля: label (+ опц. help-иконка с popover, + авто «*»
56
+ * для required) сверху, спроецированный rt-контрол посередине, hint/error снизу.
57
+ * `required` объявляет поле обязательным там, где валидатора на контроле нет (шаблонная форма).
58
+ * `hideRequiredMark` глушит авто-«*» — для форм, где все поля обязательны и
59
+ * маркер лишний (логин).
60
+ * `reserveHintSpace` держит под контролом строку высотой в одно сообщение даже
61
+ * когда ни ошибки, ни hint нет — чтобы появление ошибки не сдвигало форму вниз
62
+ * (нужно для полей без постоянного hint, напр. логин).
63
+ *
64
+ * Читает контрол через contentChild(RtFormControlBase): авто-связывает label[for],
65
+ * прокидывает read-only режим, показывает текст ошибки/required-маркер. На loading
66
+ * оборачивает зону контрола в rt-skeleton-wrapper (label/hint остаются видимыми) —
67
+ * нужно для route-aside, где поля рендерятся до прихода данных.
68
+ */
69
+ class RtFieldComponent {
70
+ #autoId;
71
+ /** Имя первого сработавшего валидатора: сообщений показываем по одному */
72
+ #failedValidator;
73
+ /**
74
+ * Умолчание переводится по ключу.
75
+ *
76
+ * Ключ передаётся сигналом, а не строкой: так подпись пересчитывается и при
77
+ * смене валидатора, и при смене языка — пользователь переключает его
78
+ * на лету, и текст ошибки обязан переключиться вместе с формой.
79
+ */
80
+ #defaultErrorText;
81
+ constructor() {
82
+ // contentChild нельзя объявлять на ES-private (#) поле — Angular это запрещает,
83
+ // поэтому проекция контрола живёт в protected-поле.
84
+ this.t = inject(RT_KIT_LABELS);
85
+ this.projectedControl = contentChild(RtFormControlBase, /* @ts-ignore */
86
+ ...(ngDevMode ? [{ debugName: "projectedControl" }] : /* istanbul ignore next */ []));
87
+ // Проецируемый hint (с разметкой) — если присутствует, рендерится вместо
88
+ // строкового [hint].
89
+ this.projectedHint = contentChild(RtFieldHintDirective, /* @ts-ignore */
90
+ ...(ngDevMode ? [{ debugName: "projectedHint" }] : /* istanbul ignore next */ []));
91
+ this.#autoId = nextAutoId();
92
+ /** Итоговый id: явный controlId контрола важнее авто-id. */
93
+ this.controlId = computed(() => this.projectedControl()?.effectiveControlId() ?? this.#autoId, /* @ts-ignore */
94
+ ...(ngDevMode ? [{ debugName: "controlId" }] : /* istanbul ignore next */ []));
95
+ this.isRequired = computed(() => this.projectedControl()?.required() ?? false, /* @ts-ignore */
96
+ ...(ngDevMode ? [{ debugName: "isRequired" }] : /* istanbul ignore next */ []));
97
+ this.showError = computed(() => !!this.projectedControl()?.invalid(), /* @ts-ignore */
98
+ ...(ngDevMode ? [{ debugName: "showError" }] : /* istanbul ignore next */ []));
99
+ /** Имя первого сработавшего валидатора: сообщений показываем по одному */
100
+ this.#failedValidator = computed(() => {
101
+ const errs = this.projectedControl()?.errors() ?? null;
102
+ return errs ? (Object.keys(errs)[0] ?? '') : '';
103
+ }, /* @ts-ignore */
104
+ ...(ngDevMode ? [{ debugName: "#failedValidator" }] : /* istanbul ignore next */ []));
105
+ /**
106
+ * Умолчание переводится по ключу.
107
+ *
108
+ * Ключ передаётся сигналом, а не строкой: так подпись пересчитывается и при
109
+ * смене валидатора, и при смене языка — пользователь переключает его
110
+ * на лету, и текст ошибки обязан переключиться вместе с формой.
111
+ */
112
+ this.#defaultErrorText = rtKitLabel(computed(() => RT_FIELD_DEFAULT_ERROR_KEYS[this.#failedValidator()] ?? ''));
113
+ /** Сообщение об ошибке: текст, переданный формой, важнее умолчания */
114
+ this.errorText = computed(() => {
115
+ const validator = this.#failedValidator();
116
+ if (!validator) {
117
+ return '';
118
+ }
119
+ const own = this.errors()[validator];
120
+ if (own) {
121
+ return own;
122
+ }
123
+ return RT_FIELD_DEFAULT_ERROR_KEYS[validator] ? this.#defaultErrorText() : '';
124
+ }, /* @ts-ignore */
125
+ ...(ngDevMode ? [{ debugName: "errorText" }] : /* istanbul ignore next */ []));
126
+ this.emptyValue = RT_FIELD_EMPTY_VALUE;
127
+ this.label = input('', /* @ts-ignore */
128
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
129
+ this.hint = input('', /* @ts-ignore */
130
+ ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
131
+ this.help = input('', /* @ts-ignore */
132
+ ...(ngDevMode ? [{ debugName: "help" }] : /* istanbul ignore next */ []));
133
+ this.readonly = input(false, { ...(ngDevMode ? { debugName: "readonly" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
134
+ this.loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
135
+ /**
136
+ * Поле обязательно, хотя валидатора на контроле нет: шаблонная форма его не кладёт. Даёт «*» и
137
+ * ошибку под тронутым пустым полем. Форму недействительной не делает — решение о записи
138
+ * остаётся у формы.
139
+ */
140
+ this.required = input(false, { ...(ngDevMode ? { debugName: "required" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
141
+ this.hideRequiredMark = input(false, { ...(ngDevMode ? { debugName: "hideRequiredMark" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
142
+ this.reserveHintSpace = input(false, { ...(ngDevMode ? { debugName: "reserveHintSpace" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
143
+ this.errors = input({}, /* @ts-ignore */
144
+ ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
145
+ // Реактивно прокидываем read-only режим в спроецированный контрол.
146
+ effect(() => {
147
+ this.projectedControl()?.setReadonly(this.readonly());
148
+ });
149
+ effect(() => {
150
+ this.projectedControl()?.setRequired(this.required());
151
+ });
152
+ }
153
+ ngAfterContentInit() {
154
+ const ctrl = this.projectedControl();
155
+ // Авто-id только если у контрола нет явного controlId — для label[for].
156
+ if (ctrl && ctrl.effectiveControlId() === null) {
157
+ ctrl.assignControlId(this.#autoId);
158
+ }
159
+ }
160
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
161
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtFieldComponent, isStandalone: true, selector: "rt-field", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, help: { classPropertyName: "help", publicName: "help", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, hideRequiredMark: { classPropertyName: "hideRequiredMark", publicName: "hideRequiredMark", isSignal: true, isRequired: false, transformFunction: null }, reserveHintSpace: { classPropertyName: "reserveHintSpace", publicName: "reserveHintSpace", isSignal: true, isRequired: false, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "rt-field" }, queries: [{ propertyName: "projectedControl", first: true, predicate: RtFormControlBase, descendants: true, isSignal: true }, { propertyName: "projectedHint", first: true, predicate: RtFieldHintDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container rtBlock=\"rt-field\">\n @if (label()) {\n <span rtElem=\"label-row\">\n <label rtElem=\"label\" qa-dataid=\"field-label\" [attr.for]=\"controlId()\">\n {{ label() }}\n @if (isRequired() && !hideRequiredMark()) {\n <span rtElem=\"required\" qa-dataid=\"field-required\" aria-hidden=\"true\">*</span>\n }\n </label>\n @if (help()) {\n <button\n rtElem=\"help\"\n qa-dataid=\"field-help\"\n type=\"button\"\n rtPopoverTrigger=\"hover\"\n [attr.aria-label]=\"t().uiHint\"\n [rtPopover]=\"helpTpl\">\n <rt-icon name=\"ico-help\" size=\"sm\" color=\"muted\" />\n </button>\n <ng-template #helpTpl>\n <span rtElem=\"help-popover\" qa-dataid=\"field-help-popover\">{{ help() }}</span>\n </ng-template>\n }\n </span>\n }\n\n <rt-skeleton-wrapper rtElem=\"control\" height=\"var(--rt-input-height)\" [isLoading]=\"loading()\">\n <ng-content />\n </rt-skeleton-wrapper>\n\n <!-- \u0421 \u0440\u0435\u0437\u0435\u0440\u0432\u043E\u043C hint \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u0432 \u043F\u043E\u0442\u043E\u043A\u0435 \u0434\u0430\u0436\u0435 \u043F\u043E\u0434 \u043E\u0448\u0438\u0431\u043A\u043E\u0439 (\u0441\u043A\u0440\u044B\u0442\u044B\u0439), \u0430 \u0441\u0430\u043C\u0430\n \u043E\u0448\u0438\u0431\u043A\u0430 \u043A\u043B\u0430\u0434\u0451\u0442\u0441\u044F \u0432 \u0442\u0443 \u0436\u0435 \u044F\u0447\u0435\u0439\u043A\u0443 \u0433\u0440\u0438\u0434\u0430: \u0432\u044B\u0441\u043E\u0442\u0430 \u0437\u043E\u043D\u044B \u0440\u0430\u0432\u043D\u0430 \u0431\u043E\u043B\u044C\u0448\u0435\u043C\u0443 \u0438\u0437\n \u0434\u0432\u0443\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0438 \u043D\u0435 \u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u043F\u0440\u0438 \u0438\u0445 \u043F\u043E\u0434\u043C\u0435\u043D\u0435. \u0411\u0435\u0437 \u0440\u0435\u0437\u0435\u0440\u0432\u0430 \u2014 \u043A\u0430\u043A \u0431\u044B\u043B\u043E,\n \u043E\u0434\u043D\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0437\u0430 \u0440\u0430\u0437, \u0447\u0442\u043E\u0431\u044B \u043F\u043B\u043E\u0442\u043D\u044B\u0435 \u0444\u043E\u0440\u043C\u044B \u043D\u0435 \u043D\u0430\u0431\u0438\u0440\u0430\u043B\u0438 \u043B\u0438\u0448\u043D\u0438\u0439 \u0432\u043E\u0437\u0434\u0443\u0445. -->\n <span rtElem=\"messages\" [rtMod]=\"{ reserved: reserveHintSpace() }\">\n @if (projectedHint() && (reserveHintSpace() || !showError())) {\n <small rtElem=\"hint\" qa-dataid=\"field-hint\" [rtMod]=\"{ hidden: showError() }\" [attr.aria-hidden]=\"showError() ? 'true' : null\">\n <ng-content select=\"[rtFieldHint]\" />\n </small>\n } @else if (hint() && (reserveHintSpace() || !showError())) {\n <small rtElem=\"hint\" qa-dataid=\"field-hint\" [rtMod]=\"{ hidden: showError() }\" [attr.aria-hidden]=\"showError() ? 'true' : null\">\n {{ hint() }}\n </small>\n }\n\n @if (showError()) {\n <small rtElem=\"error\" qa-dataid=\"field-error\">{{ errorText() }}</small>\n }\n </span>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-field{display:flex;flex-direction:column;gap:var(--rt-field-gap)}.rt-field__label-row{display:inline-flex;align-items:center;gap:var(--rt-field-label-help-gap)}.rt-field__label{color:var(--rt-field-label-color);font-size:var(--rt-field-label-font-size);font-weight:var(--rt-field-label-font-weight)}.rt-field__required{color:var(--rt-field-required-color)}.rt-field__control{color:var(--rt-field-value-color);font-size:var(--rt-field-value-font-size)}.rt-field__help{display:inline-flex;padding:0;border:none;margin:0;background:none;cursor:help}.rt-field__help-popover{display:block;max-width:240px;font-size:var(--rt-field-hint-font-size)}.rt-field__messages{display:grid}.rt-field__messages--reserved{font-size:var(--rt-field-error-font-size);min-block-size:1lh}.rt-field__messages--reserved>*{grid-area:1/1}.rt-field__hint{color:var(--rt-field-hint-color);font-size:var(--rt-field-hint-font-size)}.rt-field__hint--hidden{visibility:hidden}.rt-field__error{color:var(--rt-field-error-color);font-size:var(--rt-field-error-font-size)}}\n"], dependencies: [{ kind: "component", type:
162
+ // standalone components / directives
163
+ RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "glyphStrategy", "size", "color", "fill", "spin", "rotate"] }, { kind: "directive", type: RtPopoverDirective, selector: "[rtPopover]", inputs: ["rtPopover", "rtPopoverTrigger", "rtPopoverWidth", "rtPopoverAlign", "rtPopoverFitViewport", "rtPopoverContext", "rtPopoverPanelClass", "rtPopoverDisabled", "rtPopoverOffsetY", "rtPopoverOffsetX"], outputs: ["rtPopoverOpened", "rtPopoverClosed"], exportAs: ["rtPopover"] }, { kind: "component", type: RtSkeletonWrapperComponent, selector: "rt-skeleton-wrapper", inputs: ["width", "height", "shape", "size", "radius", "animation", "isLoading"] }, { 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 }); }
164
+ }
165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtFieldComponent, decorators: [{
166
+ type: Component,
167
+ args: [{ selector: 'rt-field', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
168
+ // standalone components / directives
169
+ RtIconComponent,
170
+ RtPopoverDirective,
171
+ RtSkeletonWrapperComponent,
172
+ BlockDirective,
173
+ ElemDirective,
174
+ ModDirective,
175
+ ], host: { class: BEM_BLOCK }, template: "<ng-container rtBlock=\"rt-field\">\n @if (label()) {\n <span rtElem=\"label-row\">\n <label rtElem=\"label\" qa-dataid=\"field-label\" [attr.for]=\"controlId()\">\n {{ label() }}\n @if (isRequired() && !hideRequiredMark()) {\n <span rtElem=\"required\" qa-dataid=\"field-required\" aria-hidden=\"true\">*</span>\n }\n </label>\n @if (help()) {\n <button\n rtElem=\"help\"\n qa-dataid=\"field-help\"\n type=\"button\"\n rtPopoverTrigger=\"hover\"\n [attr.aria-label]=\"t().uiHint\"\n [rtPopover]=\"helpTpl\">\n <rt-icon name=\"ico-help\" size=\"sm\" color=\"muted\" />\n </button>\n <ng-template #helpTpl>\n <span rtElem=\"help-popover\" qa-dataid=\"field-help-popover\">{{ help() }}</span>\n </ng-template>\n }\n </span>\n }\n\n <rt-skeleton-wrapper rtElem=\"control\" height=\"var(--rt-input-height)\" [isLoading]=\"loading()\">\n <ng-content />\n </rt-skeleton-wrapper>\n\n <!-- \u0421 \u0440\u0435\u0437\u0435\u0440\u0432\u043E\u043C hint \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u0432 \u043F\u043E\u0442\u043E\u043A\u0435 \u0434\u0430\u0436\u0435 \u043F\u043E\u0434 \u043E\u0448\u0438\u0431\u043A\u043E\u0439 (\u0441\u043A\u0440\u044B\u0442\u044B\u0439), \u0430 \u0441\u0430\u043C\u0430\n \u043E\u0448\u0438\u0431\u043A\u0430 \u043A\u043B\u0430\u0434\u0451\u0442\u0441\u044F \u0432 \u0442\u0443 \u0436\u0435 \u044F\u0447\u0435\u0439\u043A\u0443 \u0433\u0440\u0438\u0434\u0430: \u0432\u044B\u0441\u043E\u0442\u0430 \u0437\u043E\u043D\u044B \u0440\u0430\u0432\u043D\u0430 \u0431\u043E\u043B\u044C\u0448\u0435\u043C\u0443 \u0438\u0437\n \u0434\u0432\u0443\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0438 \u043D\u0435 \u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u043F\u0440\u0438 \u0438\u0445 \u043F\u043E\u0434\u043C\u0435\u043D\u0435. \u0411\u0435\u0437 \u0440\u0435\u0437\u0435\u0440\u0432\u0430 \u2014 \u043A\u0430\u043A \u0431\u044B\u043B\u043E,\n \u043E\u0434\u043D\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0437\u0430 \u0440\u0430\u0437, \u0447\u0442\u043E\u0431\u044B \u043F\u043B\u043E\u0442\u043D\u044B\u0435 \u0444\u043E\u0440\u043C\u044B \u043D\u0435 \u043D\u0430\u0431\u0438\u0440\u0430\u043B\u0438 \u043B\u0438\u0448\u043D\u0438\u0439 \u0432\u043E\u0437\u0434\u0443\u0445. -->\n <span rtElem=\"messages\" [rtMod]=\"{ reserved: reserveHintSpace() }\">\n @if (projectedHint() && (reserveHintSpace() || !showError())) {\n <small rtElem=\"hint\" qa-dataid=\"field-hint\" [rtMod]=\"{ hidden: showError() }\" [attr.aria-hidden]=\"showError() ? 'true' : null\">\n <ng-content select=\"[rtFieldHint]\" />\n </small>\n } @else if (hint() && (reserveHintSpace() || !showError())) {\n <small rtElem=\"hint\" qa-dataid=\"field-hint\" [rtMod]=\"{ hidden: showError() }\" [attr.aria-hidden]=\"showError() ? 'true' : null\">\n {{ hint() }}\n </small>\n }\n\n @if (showError()) {\n <small rtElem=\"error\" qa-dataid=\"field-error\">{{ errorText() }}</small>\n }\n </span>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-field{display:flex;flex-direction:column;gap:var(--rt-field-gap)}.rt-field__label-row{display:inline-flex;align-items:center;gap:var(--rt-field-label-help-gap)}.rt-field__label{color:var(--rt-field-label-color);font-size:var(--rt-field-label-font-size);font-weight:var(--rt-field-label-font-weight)}.rt-field__required{color:var(--rt-field-required-color)}.rt-field__control{color:var(--rt-field-value-color);font-size:var(--rt-field-value-font-size)}.rt-field__help{display:inline-flex;padding:0;border:none;margin:0;background:none;cursor:help}.rt-field__help-popover{display:block;max-width:240px;font-size:var(--rt-field-hint-font-size)}.rt-field__messages{display:grid}.rt-field__messages--reserved{font-size:var(--rt-field-error-font-size);min-block-size:1lh}.rt-field__messages--reserved>*{grid-area:1/1}.rt-field__hint{color:var(--rt-field-hint-color);font-size:var(--rt-field-hint-font-size)}.rt-field__hint--hidden{visibility:hidden}.rt-field__error{color:var(--rt-field-error-color);font-size:var(--rt-field-error-font-size)}}\n"] }]
176
+ }], ctorParameters: () => [], propDecorators: { projectedControl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtFormControlBase), { isSignal: true }] }], projectedHint: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtFieldHintDirective), { isSignal: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], help: [{ type: i0.Input, args: [{ isSignal: true, alias: "help", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], hideRequiredMark: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideRequiredMark", required: false }] }], reserveHintSpace: [{ type: i0.Input, args: [{ isSignal: true, alias: "reserveHintSpace", required: false }] }], errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }] } });
177
+
178
+ /**
179
+ * Generated bundle index. Do not edit.
180
+ */
181
+
182
+ export { RT_FIELD_DEFAULT_ERROR_KEYS, RT_FIELD_EMPTY_VALUE, RtFieldComponent, RtFieldHintDirective };
183
+ //# sourceMappingURL=rt-tools-ui-kit-v2-field.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-field.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/field/rt-field-hint.directive.ts","../../../projects/ui-kit-v2/src/lib/components/field/rt-field.model.ts","../../../projects/ui-kit-v2/src/lib/components/field/rt-field.component.ts","../../../projects/ui-kit-v2/src/lib/components/field/rt-field.component.html","../../../projects/ui-kit-v2/src/lib/components/field/rt-tools-ui-kit-v2-field.ts"],"sourcesContent":["import { Directive } from '@angular/core';\n\n/**\n * Маркер проецируемого hint'а для rt-field. Нужен, когда подсказке требуется\n * разметка (`<strong>`, интерполяция значений), которую плоский string-input\n * `[hint]` передать не может. Если проецируемый hint присутствует — rt-field\n * рендерит его вместо строкового `[hint]` (тот остаётся fallback'ом).\n */\n@Directive({\n selector: '[rtFieldHint]',\n})\nexport class RtFieldHintDirective {}\n","import { TRtKitLabelKey } from '@rt-tools/ui-kit-v2/core';\n\n/** Контракт поля-обёртки common/ui. */\nexport namespace IRtField {\n /** Карта validatorKey → человекочитаемое сообщение. */\n export type ErrorMessages = Record<string, string>;\n}\n\n/**\n * Ключи сообщений об ошибках по имени валидатора (перекрываются input'ом\n * [errors] поштучно, уже готовым текстом).\n *\n * Здесь ключи, а не переводы: карта собирается при загрузке модуля, когда язык\n * страницы ещё неизвестен, и готовый текст остался бы на языке по умолчанию\n * даже под переведённой подписью поля. Переводит сам компонент поля.\n */\nexport const RT_FIELD_DEFAULT_ERROR_KEYS: Readonly<Record<string, TRtKitLabelKey>> = {\n required: 'fieldErrorRequired',\n email: 'fieldErrorEmail',\n minlength: 'fieldErrorMinLength',\n maxlength: 'fieldErrorMaxLength',\n min: 'fieldErrorMin',\n max: 'fieldErrorMax',\n pattern: 'fieldErrorPattern',\n};\n\n/** Текст-плейсхолдер read-only поля без значения. */\nexport const RT_FIELD_EMPTY_VALUE: string = '—';\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n contentChild,\n effect,\n inject,\n input,\n AfterContentInit,\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ValidationErrors } from '@angular/forms';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelKey, TRtKitLabelMap, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { RtFormControlBase } from '@rt-tools/ui-kit-v2/form-control';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';\nimport { RtSkeletonWrapperComponent } from '@rt-tools/ui-kit-v2/skeleton-wrapper';\nimport { RtFieldHintDirective } from './rt-field-hint.directive';\nimport { RT_FIELD_DEFAULT_ERROR_KEYS, RT_FIELD_EMPTY_VALUE, IRtField } from './rt-field.model';\n\nconst BEM_BLOCK: string = 'rt-field';\n\n/** Счётчик для авто-id (связка label[for] ↔ controlId спроецированного контрола). */\nlet uidSeed: number = 0;\n\nfunction nextAutoId(): string {\n uidSeed += 1;\n return `rt-field-${uidSeed}`;\n}\n\n/**\n * Обёртка единой анатомии поля: label (+ опц. help-иконка с popover, + авто «*»\n * для required) сверху, спроецированный rt-контрол посередине, hint/error снизу.\n * `required` объявляет поле обязательным там, где валидатора на контроле нет (шаблонная форма).\n * `hideRequiredMark` глушит авто-«*» — для форм, где все поля обязательны и\n * маркер лишний (логин).\n * `reserveHintSpace` держит под контролом строку высотой в одно сообщение даже\n * когда ни ошибки, ни hint нет — чтобы появление ошибки не сдвигало форму вниз\n * (нужно для полей без постоянного hint, напр. логин).\n *\n * Читает контрол через contentChild(RtFormControlBase): авто-связывает label[for],\n * прокидывает read-only режим, показывает текст ошибки/required-маркер. На loading\n * оборачивает зону контрола в rt-skeleton-wrapper (label/hint остаются видимыми) —\n * нужно для route-aside, где поля рендерятся до прихода данных.\n */\n@Component({\n selector: 'rt-field',\n templateUrl: './rt-field.component.html',\n styleUrls: ['./rt-field.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconComponent,\n RtPopoverDirective,\n RtSkeletonWrapperComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: { class: BEM_BLOCK },\n})\nexport class RtFieldComponent implements AfterContentInit {\n // contentChild нельзя объявлять на ES-private (#) поле — Angular это запрещает,\n // поэтому проекция контрола живёт в protected-поле.\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly projectedControl: Signal<RtFormControlBase<unknown> | undefined> = contentChild(RtFormControlBase);\n\n // Проецируемый hint (с разметкой) — если присутствует, рендерится вместо\n // строкового [hint].\n protected readonly projectedHint: Signal<RtFieldHintDirective | undefined> = contentChild(RtFieldHintDirective);\n\n readonly #autoId: string = nextAutoId();\n\n /** Итоговый id: явный controlId контрола важнее авто-id. */\n protected readonly controlId: Signal<string> = computed((): string => this.projectedControl()?.effectiveControlId() ?? this.#autoId);\n\n protected readonly isRequired: Signal<boolean> = computed((): boolean => this.projectedControl()?.required() ?? false);\n\n protected readonly showError: Signal<boolean> = computed((): boolean => !!this.projectedControl()?.invalid());\n\n /** Имя первого сработавшего валидатора: сообщений показываем по одному */\n readonly #failedValidator: Signal<string> = computed((): string => {\n const errs: ValidationErrors | null = this.projectedControl()?.errors() ?? null;\n return errs ? (Object.keys(errs)[0] ?? '') : '';\n });\n\n /**\n * Умолчание переводится по ключу.\n *\n * Ключ передаётся сигналом, а не строкой: так подпись пересчитывается и при\n * смене валидатора, и при смене языка — пользователь переключает его\n * на лету, и текст ошибки обязан переключиться вместе с формой.\n */\n readonly #defaultErrorText: Signal<string> = rtKitLabel(\n computed((): TRtKitLabelKey | '' => RT_FIELD_DEFAULT_ERROR_KEYS[this.#failedValidator()] ?? '')\n );\n\n /** Сообщение об ошибке: текст, переданный формой, важнее умолчания */\n protected readonly errorText: Signal<string> = computed((): string => {\n const validator: string = this.#failedValidator();\n if (!validator) {\n return '';\n }\n const own: string | undefined = this.errors()[validator];\n if (own) {\n return own;\n }\n return RT_FIELD_DEFAULT_ERROR_KEYS[validator] ? this.#defaultErrorText() : '';\n });\n\n protected readonly emptyValue: string = RT_FIELD_EMPTY_VALUE;\n\n public readonly label: InputSignal<string> = input<string>('');\n public readonly hint: InputSignal<string> = input<string>('');\n public readonly help: InputSignal<string> = input<string>('');\n public readonly readonly: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n /**\n * Поле обязательно, хотя валидатора на контроле нет: шаблонная форма его не кладёт. Даёт «*» и\n * ошибку под тронутым пустым полем. Форму недействительной не делает — решение о записи\n * остаётся у формы.\n */\n public readonly required: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n public readonly hideRequiredMark: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n public readonly reserveHintSpace: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n public readonly errors: InputSignal<IRtField.ErrorMessages> = input<IRtField.ErrorMessages>({});\n\n constructor() {\n // Реактивно прокидываем read-only режим в спроецированный контрол.\n effect((): void => {\n this.projectedControl()?.setReadonly(this.readonly());\n });\n effect((): void => {\n this.projectedControl()?.setRequired(this.required());\n });\n }\n\n public ngAfterContentInit(): void {\n const ctrl: RtFormControlBase<unknown> | undefined = this.projectedControl();\n // Авто-id только если у контрола нет явного controlId — для label[for].\n if (ctrl && ctrl.effectiveControlId() === null) {\n ctrl.assignControlId(this.#autoId);\n }\n }\n}\n","<ng-container rtBlock=\"rt-field\">\n @if (label()) {\n <span rtElem=\"label-row\">\n <label rtElem=\"label\" qa-dataid=\"field-label\" [attr.for]=\"controlId()\">\n {{ label() }}\n @if (isRequired() && !hideRequiredMark()) {\n <span rtElem=\"required\" qa-dataid=\"field-required\" aria-hidden=\"true\">*</span>\n }\n </label>\n @if (help()) {\n <button\n rtElem=\"help\"\n qa-dataid=\"field-help\"\n type=\"button\"\n rtPopoverTrigger=\"hover\"\n [attr.aria-label]=\"t().uiHint\"\n [rtPopover]=\"helpTpl\">\n <rt-icon name=\"ico-help\" size=\"sm\" color=\"muted\" />\n </button>\n <ng-template #helpTpl>\n <span rtElem=\"help-popover\" qa-dataid=\"field-help-popover\">{{ help() }}</span>\n </ng-template>\n }\n </span>\n }\n\n <rt-skeleton-wrapper rtElem=\"control\" height=\"var(--rt-input-height)\" [isLoading]=\"loading()\">\n <ng-content />\n </rt-skeleton-wrapper>\n\n <!-- С резервом hint остаётся в потоке даже под ошибкой (скрытый), а сама\n ошибка кладётся в ту же ячейку грида: высота зоны равна большему из\n двух сообщений и не меняется при их подмене. Без резерва — как было,\n одно сообщение за раз, чтобы плотные формы не набирали лишний воздух. -->\n <span rtElem=\"messages\" [rtMod]=\"{ reserved: reserveHintSpace() }\">\n @if (projectedHint() && (reserveHintSpace() || !showError())) {\n <small rtElem=\"hint\" qa-dataid=\"field-hint\" [rtMod]=\"{ hidden: showError() }\" [attr.aria-hidden]=\"showError() ? 'true' : null\">\n <ng-content select=\"[rtFieldHint]\" />\n </small>\n } @else if (hint() && (reserveHintSpace() || !showError())) {\n <small rtElem=\"hint\" qa-dataid=\"field-hint\" [rtMod]=\"{ hidden: showError() }\" [attr.aria-hidden]=\"showError() ? 'true' : null\">\n {{ hint() }}\n </small>\n }\n\n @if (showError()) {\n <small rtElem=\"error\" qa-dataid=\"field-error\">{{ errorText() }}</small>\n }\n </span>\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}