@rt-tools/ui-kit-v2 0.1.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 (436) hide show
  1. package/README.md +114 -0
  2. package/fesm2022/rt-tools-ui-kit-v2.mjs +13653 -0
  3. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -0
  4. package/package.json +54 -0
  5. package/rt-tools-ui-kit-v2-0.1.0.tgz +0 -0
  6. package/src/assets/icons/alarm-clock.svg +7 -0
  7. package/src/assets/icons/align-center.svg +7 -0
  8. package/src/assets/icons/align-justify.svg +7 -0
  9. package/src/assets/icons/align-left.svg +7 -0
  10. package/src/assets/icons/align-right.svg +7 -0
  11. package/src/assets/icons/angle-double-down.svg +7 -0
  12. package/src/assets/icons/angle-double-left.svg +7 -0
  13. package/src/assets/icons/angle-double-right.svg +7 -0
  14. package/src/assets/icons/angle-double-up.svg +7 -0
  15. package/src/assets/icons/angle-down.svg +7 -0
  16. package/src/assets/icons/angle-left.svg +7 -0
  17. package/src/assets/icons/angle-right.svg +7 -0
  18. package/src/assets/icons/angle-up.svg +7 -0
  19. package/src/assets/icons/arrow-bottom-old.svg +7 -0
  20. package/src/assets/icons/arrow-circle-down.svg +7 -0
  21. package/src/assets/icons/arrow-circle-left.svg +7 -0
  22. package/src/assets/icons/arrow-circle-right.svg +7 -0
  23. package/src/assets/icons/arrow-circle-up.svg +7 -0
  24. package/src/assets/icons/arrow-down-left.svg +7 -0
  25. package/src/assets/icons/arrow-down-long.svg +7 -0
  26. package/src/assets/icons/arrow-down-right.svg +7 -0
  27. package/src/assets/icons/arrow-down.svg +7 -0
  28. package/src/assets/icons/arrow-left-old.svg +7 -0
  29. package/src/assets/icons/arrow-left.svg +7 -0
  30. package/src/assets/icons/arrow-leftlong.svg +7 -0
  31. package/src/assets/icons/arrow-right-old.svg +7 -0
  32. package/src/assets/icons/arrow-right.svg +7 -0
  33. package/src/assets/icons/arrow-rightlong.svg +7 -0
  34. package/src/assets/icons/arrow-top-old.svg +7 -0
  35. package/src/assets/icons/arrow-up-left.svg +7 -0
  36. package/src/assets/icons/arrow-up-long.svg +7 -0
  37. package/src/assets/icons/arrow-up-right.svg +7 -0
  38. package/src/assets/icons/arrow-up.svg +7 -0
  39. package/src/assets/icons/arrows-h.svg +7 -0
  40. package/src/assets/icons/arrows-v.svg +7 -0
  41. package/src/assets/icons/at.svg +7 -0
  42. package/src/assets/icons/attach-docx-doc.svg +11 -0
  43. package/src/assets/icons/attach-eml.svg +21 -0
  44. package/src/assets/icons/attach-folder.svg +12 -0
  45. package/src/assets/icons/attach-jpg-png.svg +9 -0
  46. package/src/assets/icons/attach-msg.svg +48 -0
  47. package/src/assets/icons/attach-other.svg +9 -0
  48. package/src/assets/icons/attach-pdf.svg +9 -0
  49. package/src/assets/icons/attach-ppt-pptx.svg +10 -0
  50. package/src/assets/icons/attach-txt.svg +24 -0
  51. package/src/assets/icons/attach-webp.svg +9 -0
  52. package/src/assets/icons/attach-xlsx-xls.svg +9 -0
  53. package/src/assets/icons/attach-zip-rar.svg +13 -0
  54. package/src/assets/icons/ban.svg +7 -0
  55. package/src/assets/icons/bars.svg +7 -0
  56. package/src/assets/icons/bell.svg +7 -0
  57. package/src/assets/icons/bolt.svg +7 -0
  58. package/src/assets/icons/book.svg +7 -0
  59. package/src/assets/icons/bookmark-fill.svg +7 -0
  60. package/src/assets/icons/bookmark.svg +7 -0
  61. package/src/assets/icons/bot.svg +14 -0
  62. package/src/assets/icons/box.svg +7 -0
  63. package/src/assets/icons/briefcase.svg +7 -0
  64. package/src/assets/icons/building.svg +7 -0
  65. package/src/assets/icons/burger.svg +9 -0
  66. package/src/assets/icons/calendar-minus.svg +7 -0
  67. package/src/assets/icons/calendar-plus.svg +7 -0
  68. package/src/assets/icons/calendar-times.svg +7 -0
  69. package/src/assets/icons/calendar.svg +7 -0
  70. package/src/assets/icons/camera.svg +7 -0
  71. package/src/assets/icons/chart-bar.svg +7 -0
  72. package/src/assets/icons/chart-line-2.svg +13 -0
  73. package/src/assets/icons/chart-line.svg +7 -0
  74. package/src/assets/icons/chart-pie.svg +7 -0
  75. package/src/assets/icons/check-circle.svg +7 -0
  76. package/src/assets/icons/check-double.svg +10 -0
  77. package/src/assets/icons/check-square.svg +7 -0
  78. package/src/assets/icons/check.svg +7 -0
  79. package/src/assets/icons/chevron-circle-down.svg +7 -0
  80. package/src/assets/icons/chevron-circle-left.svg +7 -0
  81. package/src/assets/icons/chevron-circle-right.svg +7 -0
  82. package/src/assets/icons/chevron-circle-up.svg +7 -0
  83. package/src/assets/icons/chevron-down.svg +7 -0
  84. package/src/assets/icons/chevron-left.svg +7 -0
  85. package/src/assets/icons/chevron-right.svg +7 -0
  86. package/src/assets/icons/chevron-up-down.svg +9 -0
  87. package/src/assets/icons/chevron-up.svg +7 -0
  88. package/src/assets/icons/clock.svg +7 -0
  89. package/src/assets/icons/clone.svg +7 -0
  90. package/src/assets/icons/close.svg +7 -0
  91. package/src/assets/icons/cloud-download.svg +7 -0
  92. package/src/assets/icons/cloud-upload.svg +7 -0
  93. package/src/assets/icons/cloud.svg +7 -0
  94. package/src/assets/icons/code.svg +7 -0
  95. package/src/assets/icons/cog.svg +7 -0
  96. package/src/assets/icons/comment.svg +7 -0
  97. package/src/assets/icons/comments.svg +7 -0
  98. package/src/assets/icons/copy.svg +7 -0
  99. package/src/assets/icons/credit-card.svg +7 -0
  100. package/src/assets/icons/database.svg +7 -0
  101. package/src/assets/icons/desktop.svg +7 -0
  102. package/src/assets/icons/directions-alt.svg +7 -0
  103. package/src/assets/icons/directions.svg +7 -0
  104. package/src/assets/icons/doc-success.svg +7 -0
  105. package/src/assets/icons/docBox.svg +7 -0
  106. package/src/assets/icons/ellipsis-h.svg +7 -0
  107. package/src/assets/icons/ellipsis-v.svg +7 -0
  108. package/src/assets/icons/email.svg +7 -0
  109. package/src/assets/icons/exclamation-circle.svg +7 -0
  110. package/src/assets/icons/external-link.svg +7 -0
  111. package/src/assets/icons/eye-slash.svg +7 -0
  112. package/src/assets/icons/eye.svg +7 -0
  113. package/src/assets/icons/file-excel.svg +7 -0
  114. package/src/assets/icons/file-o.svg +7 -0
  115. package/src/assets/icons/file-pdf.svg +7 -0
  116. package/src/assets/icons/file.svg +7 -0
  117. package/src/assets/icons/filter-fill.svg +7 -0
  118. package/src/assets/icons/filter-slash.svg +7 -0
  119. package/src/assets/icons/filter.svg +7 -0
  120. package/src/assets/icons/flag-fill.svg +7 -0
  121. package/src/assets/icons/flag.svg +7 -0
  122. package/src/assets/icons/flagman-a.svg +7 -0
  123. package/src/assets/icons/flagman-b.svg +17 -0
  124. package/src/assets/icons/flagman-c.svg +9 -0
  125. package/src/assets/icons/flagman-q.svg +14 -0
  126. package/src/assets/icons/folder-open.svg +7 -0
  127. package/src/assets/icons/folder.svg +7 -0
  128. package/src/assets/icons/globe.svg +7 -0
  129. package/src/assets/icons/groupen.svg +15 -0
  130. package/src/assets/icons/hashtag.svg +7 -0
  131. package/src/assets/icons/heart-fill.svg +7 -0
  132. package/src/assets/icons/heart.svg +7 -0
  133. package/src/assets/icons/help.svg +15 -0
  134. package/src/assets/icons/history.svg +7 -0
  135. package/src/assets/icons/historyUpdate.svg +7 -0
  136. package/src/assets/icons/ico-age.svg +7 -0
  137. package/src/assets/icons/ico-alert.svg +7 -0
  138. package/src/assets/icons/ico-b.svg +7 -0
  139. package/src/assets/icons/ico-babyPacifier.svg +15 -0
  140. package/src/assets/icons/ico-bank.svg +12 -0
  141. package/src/assets/icons/ico-bill-striked.svg +7 -0
  142. package/src/assets/icons/ico-bill.svg +7 -0
  143. package/src/assets/icons/ico-bookmark-right.svg +5 -0
  144. package/src/assets/icons/ico-books.svg +7 -0
  145. package/src/assets/icons/ico-burger.svg +5 -0
  146. package/src/assets/icons/ico-businessman.svg +7 -0
  147. package/src/assets/icons/ico-c.svg +7 -0
  148. package/src/assets/icons/ico-calendar.svg +7 -0
  149. package/src/assets/icons/ico-case.svg +7 -0
  150. package/src/assets/icons/ico-change-2.svg +7 -0
  151. package/src/assets/icons/ico-change.svg +15 -0
  152. package/src/assets/icons/ico-check.svg +18 -0
  153. package/src/assets/icons/ico-checked-alert.svg +9 -0
  154. package/src/assets/icons/ico-checked.svg +7 -0
  155. package/src/assets/icons/ico-cheker.svg +7 -0
  156. package/src/assets/icons/ico-chevron-down.svg +3 -0
  157. package/src/assets/icons/ico-chevron.svg +7 -0
  158. package/src/assets/icons/ico-close.svg +7 -0
  159. package/src/assets/icons/ico-config.svg +26 -0
  160. package/src/assets/icons/ico-contragents.svg +7 -0
  161. package/src/assets/icons/ico-control.svg +18 -0
  162. package/src/assets/icons/ico-copy.svg +7 -0
  163. package/src/assets/icons/ico-counterparty.svg +7 -0
  164. package/src/assets/icons/ico-coworkers.svg +7 -0
  165. package/src/assets/icons/ico-debt.svg +7 -0
  166. package/src/assets/icons/ico-director.svg +7 -0
  167. package/src/assets/icons/ico-doc.svg +24 -0
  168. package/src/assets/icons/ico-docDocprimary.svg +9 -0
  169. package/src/assets/icons/ico-docs.svg +7 -0
  170. package/src/assets/icons/ico-door.svg +7 -0
  171. package/src/assets/icons/ico-dotted-more-horizontal.svg +7 -0
  172. package/src/assets/icons/ico-doubleArrows.svg +8 -0
  173. package/src/assets/icons/ico-download.svg +10 -0
  174. package/src/assets/icons/ico-eagle.svg +7 -0
  175. package/src/assets/icons/ico-edit.svg +7 -0
  176. package/src/assets/icons/ico-edo.svg +7 -0
  177. package/src/assets/icons/ico-email.svg +7 -0
  178. package/src/assets/icons/ico-email1.svg +7 -0
  179. package/src/assets/icons/ico-error.svg +4 -0
  180. package/src/assets/icons/ico-exit.svg +5 -0
  181. package/src/assets/icons/ico-eye.svg +7 -0
  182. package/src/assets/icons/ico-eyeClose.svg +7 -0
  183. package/src/assets/icons/ico-faq.svg +7 -0
  184. package/src/assets/icons/ico-farm.svg +7 -0
  185. package/src/assets/icons/ico-filter.svg +7 -0
  186. package/src/assets/icons/ico-fine.svg +7 -0
  187. package/src/assets/icons/ico-gasket.svg +7 -0
  188. package/src/assets/icons/ico-generator.svg +7 -0
  189. package/src/assets/icons/ico-grade-2.svg +7 -0
  190. package/src/assets/icons/ico-grade.svg +15 -0
  191. package/src/assets/icons/ico-ground-area-transport.svg +7 -0
  192. package/src/assets/icons/ico-groundArea.svg +7 -0
  193. package/src/assets/icons/ico-groupen.svg +7 -0
  194. package/src/assets/icons/ico-hands.svg +31 -0
  195. package/src/assets/icons/ico-help.svg +7 -0
  196. package/src/assets/icons/ico-ico-history.svg +15 -0
  197. package/src/assets/icons/ico-info.svg +15 -0
  198. package/src/assets/icons/ico-infoFill.svg +7 -0
  199. package/src/assets/icons/ico-invite.svg +16 -0
  200. package/src/assets/icons/ico-key.svg +14 -0
  201. package/src/assets/icons/ico-keyFill.svg +7 -0
  202. package/src/assets/icons/ico-letter.svg +7 -0
  203. package/src/assets/icons/ico-level-down.svg +7 -0
  204. package/src/assets/icons/ico-level-up.svg +7 -0
  205. package/src/assets/icons/ico-level.svg +7 -0
  206. package/src/assets/icons/ico-licence.svg +24 -0
  207. package/src/assets/icons/ico-limit.svg +10 -0
  208. package/src/assets/icons/ico-link-2.svg +7 -0
  209. package/src/assets/icons/ico-link.svg +13 -0
  210. package/src/assets/icons/ico-listadd.svg +7 -0
  211. package/src/assets/icons/ico-listing.svg +10 -0
  212. package/src/assets/icons/ico-lock.svg +7 -0
  213. package/src/assets/icons/ico-locked.svg +7 -0
  214. package/src/assets/icons/ico-megafon.svg +21 -0
  215. package/src/assets/icons/ico-new-window.svg +7 -0
  216. package/src/assets/icons/ico-notification.svg +7 -0
  217. package/src/assets/icons/ico-notificationOff.svg +13 -0
  218. package/src/assets/icons/ico-percent-alert.svg +7 -0
  219. package/src/assets/icons/ico-plus.svg +5 -0
  220. package/src/assets/icons/ico-referal.svg +7 -0
  221. package/src/assets/icons/ico-repeat.svg +7 -0
  222. package/src/assets/icons/ico-reset.svg +7 -0
  223. package/src/assets/icons/ico-return.svg +7 -0
  224. package/src/assets/icons/ico-search.svg +7 -0
  225. package/src/assets/icons/ico-setting.svg +16 -0
  226. package/src/assets/icons/ico-settings.svg +15 -0
  227. package/src/assets/icons/ico-site.svg +7 -0
  228. package/src/assets/icons/ico-snowflake.svg +7 -0
  229. package/src/assets/icons/ico-spec.svg +12 -0
  230. package/src/assets/icons/ico-statement.svg +7 -0
  231. package/src/assets/icons/ico-subuser.svg +24 -0
  232. package/src/assets/icons/ico-sun.svg +9 -0
  233. package/src/assets/icons/ico-sunrise.svg +46 -0
  234. package/src/assets/icons/ico-support.svg +21 -0
  235. package/src/assets/icons/ico-target.svg +12 -0
  236. package/src/assets/icons/ico-team.svg +7 -0
  237. package/src/assets/icons/ico-tech.svg +15 -0
  238. package/src/assets/icons/ico-telegram.svg +7 -0
  239. package/src/assets/icons/ico-time.svg +7 -0
  240. package/src/assets/icons/ico-trash.svg +7 -0
  241. package/src/assets/icons/ico-try.svg +27 -0
  242. package/src/assets/icons/ico-txt.svg +16 -0
  243. package/src/assets/icons/ico-unlock.svg +7 -0
  244. package/src/assets/icons/ico-upload.svg +10 -0
  245. package/src/assets/icons/ico-user-2.svg +7 -0
  246. package/src/assets/icons/ico-user.svg +7 -0
  247. package/src/assets/icons/ico-users-2.svg +7 -0
  248. package/src/assets/icons/ico-users.svg +7 -0
  249. package/src/assets/icons/ico-video-play.svg +7 -0
  250. package/src/assets/icons/ico-warning.svg +4 -0
  251. package/src/assets/icons/ico-warranty-shield.svg +9 -0
  252. package/src/assets/icons/ico-warranty.svg +7 -0
  253. package/src/assets/icons/ico-xml.svg +18 -0
  254. package/src/assets/icons/id-card.svg +7 -0
  255. package/src/assets/icons/image.svg +7 -0
  256. package/src/assets/icons/images.svg +7 -0
  257. package/src/assets/icons/inbox.svg +7 -0
  258. package/src/assets/icons/info-circle.svg +7 -0
  259. package/src/assets/icons/info.svg +7 -0
  260. package/src/assets/icons/link.svg +7 -0
  261. package/src/assets/icons/list.svg +7 -0
  262. package/src/assets/icons/lock-open.svg +7 -0
  263. package/src/assets/icons/lock.svg +7 -0
  264. package/src/assets/icons/map.svg +7 -0
  265. package/src/assets/icons/mapYandex.svg +9 -0
  266. package/src/assets/icons/microsoft.svg +7 -0
  267. package/src/assets/icons/minus-circle.svg +7 -0
  268. package/src/assets/icons/minus.svg +7 -0
  269. package/src/assets/icons/mobile.svg +7 -0
  270. package/src/assets/icons/money-bill.svg +7 -0
  271. package/src/assets/icons/moon.svg +6 -0
  272. package/src/assets/icons/paperclip.svg +7 -0
  273. package/src/assets/icons/pause.svg +7 -0
  274. package/src/assets/icons/pencil.svg +7 -0
  275. package/src/assets/icons/percentage.svg +7 -0
  276. package/src/assets/icons/phone.svg +7 -0
  277. package/src/assets/icons/pie-chart.svg +8 -0
  278. package/src/assets/icons/plus-circle.svg +7 -0
  279. package/src/assets/icons/power-off.svg +7 -0
  280. package/src/assets/icons/print.svg +7 -0
  281. package/src/assets/icons/qrcode.svg +7 -0
  282. package/src/assets/icons/question-circle.svg +7 -0
  283. package/src/assets/icons/refresh.svg +4 -0
  284. package/src/assets/icons/replay.svg +7 -0
  285. package/src/assets/icons/reply.svg +7 -0
  286. package/src/assets/icons/reset.svg +7 -0
  287. package/src/assets/icons/search-minus.svg +7 -0
  288. package/src/assets/icons/search-plus.svg +7 -0
  289. package/src/assets/icons/search.svg +7 -0
  290. package/src/assets/icons/send.svg +7 -0
  291. package/src/assets/icons/server.svg +7 -0
  292. package/src/assets/icons/share-alt.svg +7 -0
  293. package/src/assets/icons/shield.svg +7 -0
  294. package/src/assets/icons/sitemap.svg +7 -0
  295. package/src/assets/icons/sliders-v.svg +7 -0
  296. package/src/assets/icons/sort-alpha-alt-down.svg +7 -0
  297. package/src/assets/icons/sort-alpha-alt-up.svg +7 -0
  298. package/src/assets/icons/sort-alpha-down.svg +7 -0
  299. package/src/assets/icons/sort-alpha-up.svg +7 -0
  300. package/src/assets/icons/sort-alt-slash.svg +7 -0
  301. package/src/assets/icons/sort-alt.svg +7 -0
  302. package/src/assets/icons/sort-amount-down-alt.svg +7 -0
  303. package/src/assets/icons/sort-amount-down.svg +7 -0
  304. package/src/assets/icons/sort-amount-up-alt.svg +7 -0
  305. package/src/assets/icons/sort-amount-up.svg +7 -0
  306. package/src/assets/icons/sort-numeric-alt-down.svg +7 -0
  307. package/src/assets/icons/sort-numeric-alt-up.svg +7 -0
  308. package/src/assets/icons/sort-numeric-down.svg +7 -0
  309. package/src/assets/icons/sort-numeric-up.svg +7 -0
  310. package/src/assets/icons/spinner.svg +7 -0
  311. package/src/assets/icons/star-fill.svg +7 -0
  312. package/src/assets/icons/star.svg +7 -0
  313. package/src/assets/icons/stock.svg +8 -0
  314. package/src/assets/icons/stop.svg +7 -0
  315. package/src/assets/icons/sync.svg +7 -0
  316. package/src/assets/icons/table.svg +7 -0
  317. package/src/assets/icons/tablet.svg +7 -0
  318. package/src/assets/icons/tag.svg +7 -0
  319. package/src/assets/icons/tags.svg +7 -0
  320. package/src/assets/icons/telegram.svg +7 -0
  321. package/src/assets/icons/th-large.svg +7 -0
  322. package/src/assets/icons/ticket.svg +7 -0
  323. package/src/assets/icons/times-circle.svg +7 -0
  324. package/src/assets/icons/trash.svg +7 -0
  325. package/src/assets/icons/undo.svg +7 -0
  326. package/src/assets/icons/unlock.svg +7 -0
  327. package/src/assets/icons/user-edit.svg +7 -0
  328. package/src/assets/icons/user-minus.svg +7 -0
  329. package/src/assets/icons/user-plus.svg +7 -0
  330. package/src/assets/icons/user.svg +7 -0
  331. package/src/assets/icons/users.svg +7 -0
  332. package/src/assets/icons/video.svg +7 -0
  333. package/src/assets/icons/volume-down.svg +7 -0
  334. package/src/assets/icons/volume-off.svg +7 -0
  335. package/src/assets/icons/volume-up.svg +7 -0
  336. package/src/assets/icons/wallet.svg +7 -0
  337. package/src/assets/icons/warning.svg +13 -0
  338. package/src/assets/icons/wifi.svg +7 -0
  339. package/src/assets/icons/window-maximize.svg +7 -0
  340. package/src/assets/icons/window-minimize.svg +7 -0
  341. package/src/lib/components/aside/footer/rt-aside-footer.component.scss +22 -0
  342. package/src/lib/components/aside/header/rt-aside-header.component.scss +88 -0
  343. package/src/lib/components/aside/rt-aside.component.scss +208 -0
  344. package/src/lib/components/aside/unsaved-dialog/rt-aside-unsaved-dialog.component.scss +39 -0
  345. package/src/lib/components/aside-section/rt-aside-section.component.scss +30 -0
  346. package/src/lib/components/autocomplete/rt-autocomplete.component.scss +143 -0
  347. package/src/lib/components/bar-list/rt-bar-list.component.scss +95 -0
  348. package/src/lib/components/bottom-sheet/rt-bottom-sheet.component.scss +71 -0
  349. package/src/lib/components/button/rt-button.directive.scss +268 -0
  350. package/src/lib/components/calendar/rt-calendar.component.scss +132 -0
  351. package/src/lib/components/card/rt-card.component.scss +57 -0
  352. package/src/lib/components/chat/rt-chat.component.scss +366 -0
  353. package/src/lib/components/checkbox/rt-checkbox.component.scss +57 -0
  354. package/src/lib/components/collapsible-text/rt-collapsible-text.component.scss +43 -0
  355. package/src/lib/components/confirm-popover/rt-confirm-popover.component.scss +36 -0
  356. package/src/lib/components/container/rt-container.component.scss +175 -0
  357. package/src/lib/components/counter/rt-counter.component.scss +15 -0
  358. package/src/lib/components/counter-row/rt-counter-row.component.scss +33 -0
  359. package/src/lib/components/date-picker/rt-date-picker.component.scss +89 -0
  360. package/src/lib/components/delta-view/rt-delta-view.component.scss +31 -0
  361. package/src/lib/components/detail-list/rt-detail-list.component.scss +8 -0
  362. package/src/lib/components/detail-list/rt-detail-row.component.scss +21 -0
  363. package/src/lib/components/dialog/footer/rt-dialog-footer.component.scss +13 -0
  364. package/src/lib/components/dialog/header/rt-dialog-header.component.scss +21 -0
  365. package/src/lib/components/dialog/rt-dialog.component.scss +62 -0
  366. package/src/lib/components/download-link/rt-download-link.component.scss +22 -0
  367. package/src/lib/components/empty-state/rt-empty-state.component.scss +58 -0
  368. package/src/lib/components/field/rt-field.component.scss +78 -0
  369. package/src/lib/components/file-card/rt-file-card.component.scss +96 -0
  370. package/src/lib/components/file-drop/rt-file-drop.component.scss +91 -0
  371. package/src/lib/components/file-input/rt-file-input.component.scss +25 -0
  372. package/src/lib/components/file-list/rt-file-list.component.scss +8 -0
  373. package/src/lib/components/filter-control/rt-filter-control.component.scss +20 -0
  374. package/src/lib/components/header/rt-header.component.scss +67 -0
  375. package/src/lib/components/icon/rt-icon.component.scss +17 -0
  376. package/src/lib/components/icon-button/rt-icon-button.component.scss +139 -0
  377. package/src/lib/components/info-item/rt-info-item.component.scss +46 -0
  378. package/src/lib/components/input/rt-input.component.scss +120 -0
  379. package/src/lib/components/input-number/rt-input-number.component.scss +102 -0
  380. package/src/lib/components/live-badge/rt-live-badge.component.scss +28 -0
  381. package/src/lib/components/logo/rt-logo.component.scss +64 -0
  382. package/src/lib/components/menu/rt-menu-confirm-dialog.component.scss +36 -0
  383. package/src/lib/components/menu/rt-menu-item.component.scss +54 -0
  384. package/src/lib/components/menu/rt-menu.component.scss +19 -0
  385. package/src/lib/components/message/rt-message.component.scss +58 -0
  386. package/src/lib/components/message-composer/rt-message-composer.component.scss +59 -0
  387. package/src/lib/components/money-list/rt-money-list.component.scss +11 -0
  388. package/src/lib/components/money-list/rt-money-row.component.scss +25 -0
  389. package/src/lib/components/multiselect/rt-multiselect.component.scss +198 -0
  390. package/src/lib/components/night-grid/rt-night-grid.component.scss +43 -0
  391. package/src/lib/components/note/rt-note.component.scss +13 -0
  392. package/src/lib/components/notifications-bell/rt-notifications-bell.component.scss +32 -0
  393. package/src/lib/components/page-header/rt-page-header-mobile.scss +156 -0
  394. package/src/lib/components/page-header/rt-page-header-submenu.scss +147 -0
  395. package/src/lib/components/page-header/rt-page-header.component.scss +257 -0
  396. package/src/lib/components/pagination/rt-pagination.component.scss +102 -0
  397. package/src/lib/components/photo-viewer/rt-photo-viewer.component.scss +131 -0
  398. package/src/lib/components/rich-editor/rt-rich-editor.component.scss +71 -0
  399. package/src/lib/components/section-nav/rt-section-nav.component.scss +52 -0
  400. package/src/lib/components/select/rt-select.component.scss +173 -0
  401. package/src/lib/components/skeleton/rt-skeleton.component.scss +56 -0
  402. package/src/lib/components/skeleton-wrapper/rt-skeleton-wrapper.component.scss +4 -0
  403. package/src/lib/components/spinner/rt-spinner.component.scss +42 -0
  404. package/src/lib/components/split-button/rt-split-button.component.scss +64 -0
  405. package/src/lib/components/stat-tile/rt-stat-tile.component.scss +108 -0
  406. package/src/lib/components/stepper/rt-stepper.component.scss +117 -0
  407. package/src/lib/components/table/copy-cell/rt-copy-cell.component.scss +40 -0
  408. package/src/lib/components/table/rt-table.component.scss +312 -0
  409. package/src/lib/components/table/settings-aside/rt-table-settings-aside.component.scss +5 -0
  410. package/src/lib/components/table/settings-panel/rt-table-settings-panel.component.scss +77 -0
  411. package/src/lib/components/table/sort-header/rt-table-sort-header.component.scss +39 -0
  412. package/src/lib/components/tabs/rt-tabs.component.scss +219 -0
  413. package/src/lib/components/tag/rt-tag.component.scss +95 -0
  414. package/src/lib/components/textarea/rt-textarea.component.scss +78 -0
  415. package/src/lib/components/theme-toggle/rt-theme-toggle.component.scss +3 -0
  416. package/src/lib/components/thread-list/rt-thread-list.component.scss +248 -0
  417. package/src/lib/components/timeline/rt-timeline.component.scss +95 -0
  418. package/src/lib/components/toast/rt-toast.component.scss +201 -0
  419. package/src/lib/components/toast/rt-toaster.component.scss +45 -0
  420. package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +138 -0
  421. package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +98 -0
  422. package/src/lib/components/toolbar/rt-toolbar.component.scss +69 -0
  423. package/src/lib/components/tooltip/rt-tooltip.component.scss +18 -0
  424. package/src/lib/components/welcome-dialog/rt-welcome-dialog.component.scss +48 -0
  425. package/src/lib/components/workspace/rt-workspace.component.scss +173 -0
  426. package/src/lib/components/workspace-details/rt-workspace-details.component.scss +128 -0
  427. package/src/styles/_breakpoints.scss +7 -0
  428. package/src/styles/_index.scss +13 -0
  429. package/src/styles/_login.scss +97 -0
  430. package/src/styles/_mixins.scss +21 -0
  431. package/src/styles/_primitives.scss +222 -0
  432. package/src/styles/_scrollbar.scss +24 -0
  433. package/src/styles/_semantic.scss +297 -0
  434. package/src/styles/_theme-dark.scss +123 -0
  435. package/styles/tokens.css +810 -0
  436. package/types/rt-tools-ui-kit-v2.d.ts +5673 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rt-tools-ui-kit-v2.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/aside/rt-aside.component.ts","../../../projects/ui-kit-v2/src/lib/components/aside/rt-aside.component.html","../../../projects/ui-kit-v2/src/lib/components/aside/rt-aside-ref.ts","../../../projects/ui-kit-v2/src/lib/components/aside/rt-aside.tokens.ts","../../../projects/ui-kit-v2/src/lib/components/aside/rt-aside.service.ts","../../../projects/ui-kit-v2/src/lib/components/icon/rt-icon-names.ts","../../../projects/ui-kit-v2/src/lib/components/icon/rt-icon.registry.ts","../../../projects/ui-kit-v2/src/lib/components/icon/rt-icon.component.ts","../../../projects/ui-kit-v2/src/lib/components/tooltip/rt-tooltip.component.ts","../../../projects/ui-kit-v2/src/lib/components/tooltip/rt-tooltip.directive.ts","../../../projects/ui-kit-v2/src/lib/components/icon-button/rt-icon-button.component.ts","../../../projects/ui-kit-v2/src/lib/components/icon-button/rt-icon-button.component.html","../../../projects/ui-kit-v2/src/lib/components/skeleton/rt-skeleton.component.ts","../../../projects/ui-kit-v2/src/lib/components/skeleton-wrapper/rt-skeleton-wrapper.component.ts","../../../projects/ui-kit-v2/src/lib/components/skeleton-wrapper/rt-skeleton-wrapper.component.html","../../../projects/ui-kit-v2/src/lib/components/icon/icon-categories.ts","../../../projects/ui-kit-v2/src/lib/components/icon/rt-icon.providers.ts","../../../projects/ui-kit-v2/src/lib/components/tag/rt-tag.component.ts","../../../projects/ui-kit-v2/src/lib/components/tag/rt-tag.component.html","../../../projects/ui-kit-v2/src/lib/components/aside/header/rt-aside-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/aside/header/rt-aside-header.component.html","../../../projects/ui-kit-v2/src/lib/components/aside/footer/rt-aside-footer.component.ts","../../../projects/ui-kit-v2/src/lib/components/aside/footer/rt-aside-footer.component.html","../../../projects/ui-kit-v2/src/lib/components/aside-section/rt-aside-section.component.ts","../../../projects/ui-kit-v2/src/lib/components/aside-section/rt-aside-section.component.html","../../../projects/ui-kit-v2/src/lib/components/form-control/rt-form-control.base.ts","../../../projects/ui-kit-v2/src/lib/components/popover/rt-popover.directive.ts","../../../projects/ui-kit-v2/src/lib/components/autocomplete/rt-autocomplete.component.ts","../../../projects/ui-kit-v2/src/lib/components/autocomplete/rt-autocomplete.component.html","../../../projects/ui-kit-v2/src/lib/components/bar-list/rt-bar-list.component.ts","../../../projects/ui-kit-v2/src/lib/components/bar-list/rt-bar-list.component.html","../../../projects/ui-kit-v2/src/lib/components/bottom-sheet/rt-bottom-sheet.logic.ts","../../../projects/ui-kit-v2/src/lib/components/bottom-sheet/rt-bottom-sheet.component.ts","../../../projects/ui-kit-v2/src/lib/components/bottom-sheet/rt-bottom-sheet.component.html","../../../projects/ui-kit-v2/src/lib/components/button/rt-button.directive.ts","../../../projects/ui-kit-v2/src/lib/components/icon-button/rt-icon-button.model.ts","../../../projects/ui-kit-v2/src/lib/components/calendar/rt-calendar.component.ts","../../../projects/ui-kit-v2/src/lib/components/calendar/rt-calendar.component.html","../../../projects/ui-kit-v2/src/lib/components/calendar/rt-calendar.model.ts","../../../projects/ui-kit-v2/src/lib/components/card/rt-card.component.ts","../../../projects/ui-kit-v2/src/lib/components/card/rt-card.component.html","../../../projects/ui-kit-v2/src/lib/components/chat/rt-chat.model.ts","../../../projects/ui-kit-v2/src/lib/pipes/rt-chat-status-label.pipe.ts","../../../projects/ui-kit-v2/src/lib/components/confirm-popover/rt-confirm-popover.component.ts","../../../projects/ui-kit-v2/src/lib/components/confirm-popover/rt-confirm-popover.component.html","../../../projects/ui-kit-v2/src/lib/components/confirm-popover/rt-confirm.directive.ts","../../../projects/ui-kit-v2/src/lib/components/delta-view/rt-delta-view.component.ts","../../../projects/ui-kit-v2/src/lib/util/file-name-from-url.ts","../../../projects/ui-kit-v2/src/lib/util/format-file-size.ts","../../../projects/ui-kit-v2/src/lib/util/quill-delta.helper.ts","../../../projects/ui-kit-v2/src/lib/util/quill-delta.model.ts","../../../projects/ui-kit-v2/src/lib/util/search-debounce.ts","../../../projects/ui-kit-v2/src/lib/components/file-card/file-card.helper.ts","../../../projects/ui-kit-v2/src/lib/components/file-card/rt-truncate-middle.pipe.ts","../../../projects/ui-kit-v2/src/lib/components/file-card/rt-file-card.component.ts","../../../projects/ui-kit-v2/src/lib/components/file-card/rt-file-card.component.html","../../../projects/ui-kit-v2/src/lib/components/file-drop/rt-file-drop.component.ts","../../../projects/ui-kit-v2/src/lib/components/file-drop/rt-file-drop.component.html","../../../projects/ui-kit-v2/src/lib/components/rich-editor/rt-rich-editor.component.ts","../../../projects/ui-kit-v2/src/lib/components/rich-editor/rt-rich-editor.component.html","../../../projects/ui-kit-v2/src/lib/components/message-composer/rt-message-composer.component.ts","../../../projects/ui-kit-v2/src/lib/components/message-composer/rt-message-composer.component.html","../../../projects/ui-kit-v2/src/lib/components/note/rt-note.component.ts","../../../projects/ui-kit-v2/src/lib/components/note/rt-note.component.html","../../../projects/ui-kit-v2/src/lib/components/spinner/rt-spinner.component.ts","../../../projects/ui-kit-v2/src/lib/components/toolbar/rt-toolbar.component.ts","../../../projects/ui-kit-v2/src/lib/components/toolbar/rt-toolbar.component.html","../../../projects/ui-kit-v2/src/lib/components/chat/rt-chat.component.ts","../../../projects/ui-kit-v2/src/lib/components/chat/rt-chat.component.html","../../../projects/ui-kit-v2/src/lib/components/chat/to-rt-message.ts","../../../projects/ui-kit-v2/src/lib/components/checkbox/rt-checkbox.component.ts","../../../projects/ui-kit-v2/src/lib/components/checkbox/rt-checkbox.component.html","../../../projects/ui-kit-v2/src/lib/components/collapsible-text/rt-collapsible-text.component.ts","../../../projects/ui-kit-v2/src/lib/components/collapsible-text/rt-collapsible-text.component.html","../../../projects/ui-kit-v2/src/lib/platform/breakpoints.service.ts","../../../projects/ui-kit-v2/src/lib/platform/message-bus.ts","../../../projects/ui-kit-v2/src/lib/platform/notification-bus.service.ts","../../../projects/ui-kit-v2/src/lib/platform/storage-keys.const.ts","../../../projects/ui-kit-v2/src/lib/platform/theme.service.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.model.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toast.component.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toast.component.html","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.component.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.component.html","../../../projects/ui-kit-v2/src/lib/components/container/rt-container-state.service.ts","../../../projects/ui-kit-v2/src/lib/components/container/rt-container.directives.ts","../../../projects/ui-kit-v2/src/lib/components/container/rt-container.component.ts","../../../projects/ui-kit-v2/src/lib/components/container/rt-container.component.html","../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog-ref.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog.component.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog.component.html","../../../projects/ui-kit-v2/src/lib/components/aside/unsaved-dialog/rt-aside-unsaved.logic.ts","../../../projects/ui-kit-v2/src/lib/components/aside/unsaved-dialog/rt-aside-unsaved-dialog.component.ts","../../../projects/ui-kit-v2/src/lib/components/aside/unsaved-dialog/rt-aside-unsaved-dialog.component.html","../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog.tokens.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/rt-dialog.service.ts","../../../projects/ui-kit-v2/src/lib/components/container/rt-route-aside.logic.ts","../../../projects/ui-kit-v2/src/lib/components/container/rt-route-aside.base.ts","../../../projects/ui-kit-v2/src/lib/components/container/rt-route-aside.guard.ts","../../../projects/ui-kit-v2/src/lib/components/counter/rt-counter.model.ts","../../../projects/ui-kit-v2/src/lib/components/counter/rt-counter.component.ts","../../../projects/ui-kit-v2/src/lib/components/counter/rt-counter.component.html","../../../projects/ui-kit-v2/src/lib/components/counter-row/rt-counter-row.component.ts","../../../projects/ui-kit-v2/src/lib/components/counter-row/rt-counter-row.component.html","../../../projects/ui-kit-v2/src/lib/components/date-picker/rt-date-picker.component.ts","../../../projects/ui-kit-v2/src/lib/components/date-picker/rt-date-picker.component.html","../../../projects/ui-kit-v2/src/lib/components/detail-list/rt-detail-list.component.ts","../../../projects/ui-kit-v2/src/lib/components/detail-list/rt-detail-list.component.html","../../../projects/ui-kit-v2/src/lib/components/detail-list/rt-detail-row.component.ts","../../../projects/ui-kit-v2/src/lib/components/detail-list/rt-detail-row.component.html","../../../projects/ui-kit-v2/src/lib/components/dialog/header/rt-dialog-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/header/rt-dialog-header.component.html","../../../projects/ui-kit-v2/src/lib/components/dialog/footer/rt-dialog-footer.component.ts","../../../projects/ui-kit-v2/src/lib/components/dialog/footer/rt-dialog-footer.component.html","../../../projects/ui-kit-v2/src/lib/components/download-link/rt-download-link.component.ts","../../../projects/ui-kit-v2/src/lib/components/download-link/rt-download-link.component.html","../../../projects/ui-kit-v2/src/lib/components/empty-state/rt-empty-state.component.ts","../../../projects/ui-kit-v2/src/lib/components/empty-state/rt-empty-state.component.html","../../../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/file-list/rt-file-list.component.ts","../../../projects/ui-kit-v2/src/lib/components/file-list/rt-file-list.component.html","../../../projects/ui-kit-v2/src/lib/components/file-input/rt-file-input.component.ts","../../../projects/ui-kit-v2/src/lib/components/file-input/rt-file-input.component.html","../../../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/select/rt-select.component.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select.component.html","../../../projects/ui-kit-v2/src/lib/components/toggle-button-group/rt-toggle-button-group.component.ts","../../../projects/ui-kit-v2/src/lib/components/toggle-button-group/rt-toggle-button-group.component.html","../../../projects/ui-kit-v2/src/lib/components/filter-control/rt-filter-control.component.ts","../../../projects/ui-kit-v2/src/lib/components/filter-control/rt-filter-control.component.html","../../../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/header/rt-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/header/rt-header.component.html","../../../projects/ui-kit-v2/src/lib/components/info-item/rt-info-item.component.ts","../../../projects/ui-kit-v2/src/lib/components/info-item/rt-info-item.component.html","../../../projects/ui-kit-v2/src/lib/components/input-number/rt-input-number.component.ts","../../../projects/ui-kit-v2/src/lib/components/input-number/rt-input-number.component.html","../../../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/menu/rt-menu-confirm-dialog.component.ts","../../../projects/ui-kit-v2/src/lib/components/menu/rt-menu-confirm-dialog.component.html","../../../projects/ui-kit-v2/src/lib/components/menu/rt-menu.model.ts","../../../projects/ui-kit-v2/src/lib/components/menu/rt-menu-item.component.ts","../../../projects/ui-kit-v2/src/lib/components/menu/rt-menu-item.component.html","../../../projects/ui-kit-v2/src/lib/components/menu/rt-menu.component.ts","../../../projects/ui-kit-v2/src/lib/components/menu/rt-menu.component.html","../../../projects/ui-kit-v2/src/lib/components/message/rt-message.component.ts","../../../projects/ui-kit-v2/src/lib/components/message/rt-message.component.html","../../../projects/ui-kit-v2/src/lib/components/money-list/rt-money-list.component.ts","../../../projects/ui-kit-v2/src/lib/components/money-list/rt-money-list.component.html","../../../projects/ui-kit-v2/src/lib/components/money-list/rt-money-row.component.ts","../../../projects/ui-kit-v2/src/lib/components/money-list/rt-money-row.component.html","../../../projects/ui-kit-v2/src/lib/components/multiselect/rt-multiselect-label.pipe.ts","../../../projects/ui-kit-v2/src/lib/components/multiselect/rt-multiselect.component.ts","../../../projects/ui-kit-v2/src/lib/components/multiselect/rt-multiselect.component.html","../../../projects/ui-kit-v2/src/lib/components/night-grid/rt-night-grid.component.ts","../../../projects/ui-kit-v2/src/lib/components/night-grid/rt-night-grid.component.html","../../../projects/ui-kit-v2/src/lib/components/notifications-bell/rt-notifications-bell.component.ts","../../../projects/ui-kit-v2/src/lib/components/notifications-bell/rt-notifications-bell.component.html","../../../projects/ui-kit-v2/src/lib/components/page-header/rt-page-header.logic.ts","../../../projects/ui-kit-v2/src/lib/components/page-header/rt-page-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/page-header/rt-page-header.component.html","../../../projects/ui-kit-v2/src/lib/components/photo-viewer/rt-photo-viewer.logic.ts","../../../projects/ui-kit-v2/src/lib/components/photo-viewer/rt-photo-viewer.component.ts","../../../projects/ui-kit-v2/src/lib/components/photo-viewer/rt-photo-viewer.component.html","../../../projects/ui-kit-v2/src/lib/components/pagination/rt-pagination.logic.ts","../../../projects/ui-kit-v2/src/lib/components/pagination/rt-pagination.component.ts","../../../projects/ui-kit-v2/src/lib/components/pagination/rt-pagination.component.html","../../../projects/ui-kit-v2/src/lib/components/section-nav/rt-section-nav.component.ts","../../../projects/ui-kit-v2/src/lib/components/section-nav/rt-section-nav.component.html","../../../projects/ui-kit-v2/src/lib/components/split-button/rt-split-button.component.ts","../../../projects/ui-kit-v2/src/lib/components/split-button/rt-split-button.component.html","../../../projects/ui-kit-v2/src/lib/components/stat-tile/rt-stat-tile.component.ts","../../../projects/ui-kit-v2/src/lib/components/stat-tile/rt-stat-tile.component.html","../../../projects/ui-kit-v2/src/lib/components/stepper/rt-stepper.component.ts","../../../projects/ui-kit-v2/src/lib/components/stepper/rt-stepper.component.html","../../../projects/ui-kit-v2/src/lib/components/table/copy-cell/rt-copy-cell.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/copy-cell/rt-copy-cell.component.html","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-sort.logic.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-card.directive.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-row-actions.directive.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-row-actions.logic.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-row-actions.pipe.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-settings.registry.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table.component.html","../../../projects/ui-kit-v2/src/lib/components/table/sort-header/rt-table-sort-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/sort-header/rt-table-sort-header.component.html","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-row.directive.ts","../../../projects/ui-kit-v2/src/lib/components/table/settings-panel/rt-table-settings-panel.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/settings-panel/rt-table-settings-panel.component.html","../../../projects/ui-kit-v2/src/lib/components/table/settings-aside/rt-table-settings-aside.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/settings-aside/rt-table-settings-aside.component.html","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tab.directive.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs-control.directive.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs.component.ts","../../../projects/ui-kit-v2/src/lib/components/tabs/rt-tabs.component.html","../../../projects/ui-kit-v2/src/lib/components/textarea/rt-textarea.component.ts","../../../projects/ui-kit-v2/src/lib/components/textarea/rt-textarea.component.html","../../../projects/ui-kit-v2/src/lib/components/toggle-switch/rt-toggle-switch.component.ts","../../../projects/ui-kit-v2/src/lib/components/toggle-switch/rt-toggle-switch.component.html","../../../projects/ui-kit-v2/src/lib/components/toggle-switch/rt-toggle-switch.model.ts","../../../projects/ui-kit-v2/src/lib/components/theme-toggle/rt-theme-toggle.component.ts","../../../projects/ui-kit-v2/src/lib/components/theme-toggle/rt-theme-toggle.component.html","../../../projects/ui-kit-v2/src/lib/components/theme-toggle/rt-theme-toggle.model.ts","../../../projects/ui-kit-v2/src/lib/scroll/infinite-scroll.directive.ts","../../../projects/ui-kit-v2/src/lib/components/thread-list/rt-thread-list.directives.ts","../../../projects/ui-kit-v2/src/lib/components/thread-list/rt-thread-list.component.ts","../../../projects/ui-kit-v2/src/lib/components/thread-list/rt-thread-list.component.html","../../../projects/ui-kit-v2/src/lib/components/timeline/rt-timeline.component.ts","../../../projects/ui-kit-v2/src/lib/components/timeline/rt-timeline.component.html","../../../projects/ui-kit-v2/src/lib/components/welcome-dialog/rt-welcome-dialog.component.ts","../../../projects/ui-kit-v2/src/lib/components/welcome-dialog/rt-welcome-dialog.component.html","../../../projects/ui-kit-v2/src/lib/components/workspace/rt-workspace.directives.ts","../../../projects/ui-kit-v2/src/lib/components/workspace/rt-workspace.component.ts","../../../projects/ui-kit-v2/src/lib/components/workspace/rt-workspace.component.html","../../../projects/ui-kit-v2/src/lib/components/workspace-details/rt-workspace-details.component.ts","../../../projects/ui-kit-v2/src/lib/components/workspace-details/rt-workspace-details.component.html","../../../projects/ui-kit-v2/src/lib/components/index.ts","../../../projects/ui-kit-v2/src/lib/pipes/rt-day-stamp.pipe.ts","../../../projects/ui-kit-v2/src/lib/i18n/rt-kit-translations.ts","../../../projects/ui-kit-v2/src/lib/i18n/rt-kit-translations.providers.ts","../../../projects/ui-kit-v2/src/public-api.ts","../../../projects/ui-kit-v2/src/rt-tools-ui-kit-v2.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input, InputSignal, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-aside';\n\n/**\n * Варианты ширины side-sheet:\n * - `sm` — 400px (`--rt-aside-width-sm`)\n * - `md` — 540px (`--rt-aside-width-md`, дефолт)\n * - `lg` — 720px (`--rt-aside-width-lg`)\n */\nexport type IRtAsideSize = 'sm' | 'md' | 'lg';\n\n/**\n * Раскладка контентной зоны side-sheet:\n * - `default` — контентная зона сама скроллится при overflow (штатный режим);\n * - `tabs` — контент — это `rt-tabs`: внешняя зона перестаёт быть скроллером,\n * полоса вкладок прибита, скроллится только контент активной вкладки\n * (`rt-tabs__content`).\n */\nexport type IRtAsideContentLayout = 'default' | 'tabs';\n\n/**\n * Презентационный styled-frame для side-sheet.\n *\n * Видимость / backdrop / scroll-block / ESC / slide-in анимация — НЕ внутренняя\n * ответственность компонента. Это обеспечивает CDK Overlay через\n * `RtAsideService.open()`. rt-aside здесь — стилизованная \"рамка\" с size-вариантами\n * и тремя слотами: `rt-aside-header`, содержимое и `rt-aside-footer`.\n *\n * Содержимое лежит в одной зоне `.rt-aside__content` — она и держит инсет панели,\n * и прокручивается. Пока зоны не было, каждый корневой узел содержимого получал\n * инсет и прокрутку сам по себе: разделы делили высоту панели между собой, а\n * обводка фокуса поля срезалась краем такого мини-скроллера.\n *\n * Семантика — `role=\"complementary\"` (mirror rt-dialog имеет `role=\"dialog\"`,\n * aside — другая роль, side-sheet не обязательно блокирующий).\n *\n * `ViewEncapsulation.None` — стили префиксованы `.rt-aside`, чтобы соседние\n * rt-aside-header / rt-aside-footer работали с одним BEM-блоком без\n * cross-encapsulation хака.\n */\n@Component({\n selector: 'rt-aside',\n templateUrl: './rt-aside.component.html',\n styleUrl: './rt-aside.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [BlockDirective, ElemDirective, ModDirective],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtAsideComponent {\n public readonly size: InputSignal<IRtAsideSize> = input<IRtAsideSize>('md');\n public readonly contentLayout: InputSignal<IRtAsideContentLayout> = input<IRtAsideContentLayout>('default');\n public readonly width: InputSignal<string | null> = input<string | null>(null);\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n}\n","<div\n rtBlock=\"rt-aside\"\n qa-dataid=\"aside\"\n role=\"complementary\"\n [rtMod]=\"{ size: size(), content: contentLayout() }\"\n [style.--rt-aside-width]=\"width()\"\n [attr.aria-label]=\"ariaLabel()\">\n <ng-content select=\"rt-aside-header\" />\n\n <div rtElem=\"content\" qa-dataid=\"aside-content\">\n <ng-content />\n </div>\n\n <ng-content select=\"rt-aside-footer\" />\n</div>\n","import { OverlayRef } from '@angular/cdk/overlay';\nimport { Renderer2, signal, WritableSignal } from '@angular/core';\n\nimport { Observable, Subject } from 'rxjs';\n\n/** Длительность slide-out анимации; синхронизирована с `--rt-aside-animation-duration` в SCSS. */\nconst LEAVE_ANIMATION_DURATION_MS: number = 200;\n\n/**\n * Хэндл к программно открытой side-sheet (через `RtAsideService.open()`).\n *\n * Контент-компонент инжектит `RtAsideRef` и закрывает aside через `.close(result?)`.\n * Родитель ждёт результата через `.afterClosed()`.\n *\n * Generic `<T>` — тип результата `close(result)`. Дефолт `unknown` — если результат\n * не нужен, оставляй generic пустым.\n *\n * Lifecycle close():\n * 1. Race-guard `#isClosing` гарантирует один эмит даже при двойном вызове.\n * 2. Снимает `rt-aside-overlay--open` и ставит `rt-aside-overlay--leaving` на host —\n * CSS-transition (200ms) играет slide-out.\n * 3. Эмиттит result в `afterClosed()` СРАЗУ (consumer не ждёт анимацию).\n * 4. Через `setTimeout(200ms)` зовёт `overlayRef.dispose()` — overlay убран после анимации.\n *\n * @example\n * \\`\\`\\`ts\n * // в контент-компоненте\n * private readonly asideRef = inject(RtAsideRef<{ saved: boolean }>);\n * onSave(): void { this.asideRef.close({ saved: true }); }\n *\n * // в родителе\n * asideService.open(EditAsideComponent).afterClosed().subscribe(result => {...});\n * \\`\\`\\`\n */\nexport class RtAsideRef<T = unknown> {\n /**\n * Runtime-флаг, блокирующий close() через ESC / backdrop click.\n *\n * Default `false`. Включай (`asideRef.disableClose.set(true)`) на время\n * in-flight submit'а, чтобы юзер не потерял введённые в форму данные.\n * Программный `close(result)` гейтом не задет — он всегда закрывает.\n */\n public readonly disableClose: WritableSignal<boolean> = signal(false);\n\n readonly #overlayRef: OverlayRef;\n readonly #renderer: Renderer2;\n readonly #afterClosedSource: Subject<T | undefined> = new Subject<T | undefined>();\n\n #isClosing: boolean = false;\n\n constructor(overlayRef: OverlayRef, renderer: Renderer2) {\n this.#overlayRef = overlayRef;\n this.#renderer = renderer;\n }\n\n /** Закрывает overlay со slide-out анимацией; эмиттит result в `afterClosed()` синхронно. */\n public close(result?: T): void {\n if (this.#isClosing) {\n return;\n }\n this.#isClosing = true;\n\n this.#renderer.removeClass(this.#overlayRef.overlayElement, 'rt-aside-overlay--open');\n this.#renderer.addClass(this.#overlayRef.overlayElement, 'rt-aside-overlay--leaving');\n\n // Эмитим результат сразу — consumer не ждёт slide-out.\n this.#afterClosedSource.next(result);\n this.#afterClosedSource.complete();\n\n // Дефер dispose'а на длительность анимации — overlay остаётся в DOM,\n // пока CSS-transition не отыграет slide-out.\n setTimeout((): void => {\n this.#overlayRef.dispose();\n }, LEAVE_ANIMATION_DURATION_MS);\n }\n\n /** Эмиттит один раз — результат `close(result)` — и завершается. */\n public afterClosed(): Observable<T | undefined> {\n return this.#afterClosedSource.asObservable();\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Injection token для передачи данных в side-sheet, открытую через `RtAsideService.open()`.\n *\n * Пользовательский компонент-контент aside'а инжектит токен и получает данные,\n * переданные в `IRtAsideConfig.data`. Тип значения задаётся generic'ом — `inject(RT_ASIDE_DATA)`\n * вернёт `unknown`, прокастуй через `inject(RT_ASIDE_DATA) as MyDataType` ИЛИ\n * объяви токен с конкретным generic'ом в feature-либе.\n *\n * Намеренно отдельный токен от `RT_DIALOG_DATA`, чтобы type-checker не путал контексты\n * (rt-dialog vs rt-aside) — оба сервиса могут существовать в одном DI-дереве.\n *\n * @example\n * \\`\\`\\`ts\n * @Component({...})\n * export class GuestProfileAsideComponent {\n * readonly data = inject(RT_ASIDE_DATA) as { userId: number };\n * }\n *\n * // parent\n * asideService.open(GuestProfileAsideComponent, { data: { userId: 42 } });\n * \\`\\`\\`\n */\nexport const RT_ASIDE_DATA: InjectionToken<unknown> = new InjectionToken<unknown>('RT_ASIDE_DATA');\n","import { ComponentType, Overlay, OverlayConfig, OverlayRef, PositionStrategy } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { inject, Injectable, Injector, Renderer2, RendererFactory2, Signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { EMPTY, map, merge, mergeMap, Observable, Subject, takeUntil } from 'rxjs';\n\nimport { RtAsideRef } from './rt-aside-ref';\nimport { RT_ASIDE_DATA } from './rt-aside.tokens';\n\n/**\n * Позиционирование side-sheet — у какого края viewport \"приклеена\" панель.\n */\nexport type IRtAsidePosition = 'right' | 'left';\n\n/**\n * Конфигурация открытия side-sheet через `RtAsideService.open()`.\n */\nexport interface IRtAsideConfig<TData = unknown> {\n /** Данные, доступные внутри aside'а через `inject(RT_ASIDE_DATA)`. */\n data?: TData;\n\n /** Дополнительный CSS-класс для backdrop (поверх стандартного `rt-aside-backdrop`). */\n backdropClass?: string | string[];\n\n /** Дополнительный CSS-класс для panel-обёртки overlay (поверх `rt-aside-overlay`). */\n panelClass?: string | string[];\n\n /** Закрывать aside по клику на backdrop. По дефолту `true`. */\n closeOnBackdropClick?: boolean;\n\n /** Закрывать aside по ESC. По дефолту `true`. */\n closeOnEscape?: boolean;\n\n /** К какому краю viewport \"приклеить\" панель. По дефолту `\"right\"`. */\n position?: IRtAsidePosition;\n}\n\n/**\n * Контекст одного открытия aside'а — payload для per-open close-подписок в конструкторном\n * стриме. `asideRef` сужен до используемых handler'ами членов (`RtAsideRef<T>` инвариантен\n * по `T`, целиком в generic-agnostic контекст не влезает).\n */\ninterface IRtAsideOpenContext {\n overlayRef: OverlayRef;\n asideRef: {\n disableClose: Signal<boolean>;\n close: () => void;\n };\n closeOnBackdropClick: boolean;\n closeOnEscape: boolean;\n}\n\n/**\n * Программный API для открытия side-sheet поверх CDK Overlay.\n *\n * Архитектурно зеркалит `RtDialogService`, отличаясь только positionStrategy\n * (edge-anchored: `right('0')` / `left('0')` + `top('0')`) и slide-in анимацией,\n * которая триггерится через CSS-классы на overlay host (`Renderer2` инжектится\n * через `RendererFactory2`, потому что в service нет ComponentRef).\n *\n * Lifecycle:\n * 1. `overlay.create({ panelClass: [..., '--entering'] })` — host получает initial\n * CSS-стейт (translateX(±100%)).\n * 2. `overlayRef.attach(portal)` — контент-компонент монтируется в host.\n * 3. На следующий paint (`requestAnimationFrame`) сервис снимает `--entering` и\n * добавляет `--open` — CSS-transition сделает slide-in.\n * 4. На `ref.close(result)` ref добавляет `--leaving`, эмиттит result синхронно,\n * deferred `dispose()` через 200ms (длительность анимации).\n *\n * Альтернатива rt-dialog — для длинных форм / мастеров / side-panels, где\n * центрированная модалка ощущается тесной. Не предназначено для подтверждений\n * или коротких диалогов (для этого — `RtDialogService`).\n *\n * @example\n * \\`\\`\\`ts\n * private readonly asideService = inject(RtAsideService);\n *\n * openProfile(userId: number): void {\n * const ref = this.asideService.open<GuestProfileAsideComponent, { userId: number }, void>(\n * GuestProfileAsideComponent,\n * { data: { userId }, position: \"right\" }\n * );\n * ref.afterClosed().subscribe(() => this.reloadList());\n * }\n *\n * // контент-компонент\n * @Component({ ... })\n * export class GuestProfileAsideComponent {\n * readonly data = inject(RT_ASIDE_DATA) as { userId: number };\n * readonly #ref = inject(RtAsideRef);\n * close(): void { this.#ref.close(); }\n * }\n * \\`\\`\\`\n */\n@Injectable({ providedIn: 'root' })\nexport class RtAsideService {\n readonly #overlay: Overlay = inject(Overlay);\n readonly #injector: Injector = inject(Injector);\n // Renderer2 нужен для манипуляции CSS-классами на overlay.hostElement.\n // В service нет ComponentRef, поэтому Renderer2 берём через factory.\n readonly #renderer: Renderer2 = inject(RendererFactory2).createRenderer(null, null);\n\n readonly #openSource: Subject<IRtAsideOpenContext> = new Subject<IRtAsideOpenContext>();\n\n constructor() {\n // Per-open close-подписки (backdrop / ESC) живут в одном постоянном\n // конструкторном стриме: open() эмитит контекст открытия, mergeMap\n // подписывает event-стримы конкретного OverlayRef до его dispose\n // (`detachments()` терминирует внутренний поток). mergeMap, а не\n // switchMap — одновременно может быть открыто несколько aside'ов.\n //\n // Runtime-guard через asideRef.disableClose() — те же правила, что в\n // rt-dialog: ESC / backdrop НЕ закрывают overlay, если disableClose=true;\n // программный ref.close() гейтом не задет.\n this.#openSource\n .pipe(\n mergeMap((openContext: IRtAsideOpenContext): Observable<() => void> => {\n const backdropClose$: Observable<() => void> = openContext.closeOnBackdropClick\n ? openContext.overlayRef.backdropClick().pipe(\n map((): (() => void) => (): void => {\n if (openContext.asideRef.disableClose()) {\n return;\n }\n openContext.asideRef.close();\n })\n )\n : EMPTY;\n const escapeClose$: Observable<() => void> = openContext.closeOnEscape\n ? openContext.overlayRef.keydownEvents().pipe(\n map((event: KeyboardEvent): (() => void) => (): void => {\n if (event.key !== 'Escape') {\n return;\n }\n event.preventDefault();\n if (openContext.asideRef.disableClose()) {\n return;\n }\n openContext.asideRef.close();\n })\n )\n : EMPTY;\n return merge(backdropClose$, escapeClose$).pipe(takeUntil(openContext.overlayRef.detachments()));\n }),\n takeUntilDestroyed()\n )\n .subscribe((handleCloseIntent: () => void): void => handleCloseIntent());\n }\n\n public open<TComponent, TData = unknown, TResult = unknown>(\n component: ComponentType<TComponent>,\n config?: IRtAsideConfig<TData>\n ): RtAsideRef<TResult> {\n const position: IRtAsidePosition = config?.position ?? 'right';\n const positionStrategy: PositionStrategy =\n position === 'right'\n ? this.#overlay.position().global().right('0').top('0')\n : this.#overlay.position().global().left('0').top('0');\n\n const panelClasses: string[] = ['rt-aside-overlay', `rt-aside-overlay--position-${position}`, 'rt-aside-overlay--entering'];\n\n const overlayConfig: OverlayConfig = {\n positionStrategy,\n scrollStrategy: this.#overlay.scrollStrategies.block(),\n hasBackdrop: true,\n backdropClass: config?.backdropClass ?? 'rt-aside-backdrop',\n panelClass: config?.panelClass !== undefined ? [...panelClasses, ...this.#toArray(config.panelClass)] : panelClasses,\n disposeOnNavigation: true,\n };\n\n const overlayRef: OverlayRef = this.#overlay.create(overlayConfig);\n const asideRef: RtAsideRef<TResult> = new RtAsideRef<TResult>(overlayRef, this.#renderer);\n\n // Сами close-подписки объявлены один раз в конструкторе — здесь только\n // эмит контекста открытия (см. #openSource-стрим).\n this.#openSource.next({\n overlayRef,\n asideRef,\n closeOnBackdropClick: config?.closeOnBackdropClick !== false,\n closeOnEscape: config?.closeOnEscape !== false,\n });\n\n const injector: Injector = Injector.create({\n parent: this.#injector,\n providers: [\n { provide: RtAsideRef, useValue: asideRef },\n { provide: RT_ASIDE_DATA, useValue: config?.data ?? null },\n ],\n });\n\n const portal: ComponentPortal<TComponent> = new ComponentPortal<TComponent>(component, null, injector);\n overlayRef.attach(portal);\n\n // Slide-in: на следующий paint снимаем --entering и добавляем --open.\n // CSS transition (см. rt-aside.component.scss) сделает анимацию.\n // Backdrop default hidden — toggle --visible одновременно со слайдом.\n requestAnimationFrame((): void => {\n this.#renderer.removeClass(overlayRef.overlayElement, 'rt-aside-overlay--entering');\n this.#renderer.addClass(overlayRef.overlayElement, 'rt-aside-overlay--open');\n const backdropEl: HTMLElement | null = overlayRef.backdropElement;\n if (backdropEl !== null) {\n this.#renderer.addClass(backdropEl, 'rt-aside-backdrop--visible');\n }\n });\n\n return asideRef;\n }\n\n /** Нормализует `string | string[]` к массиву (panelClass поддерживает оба формата). */\n #toArray(value: string | string[]): string[] {\n return Array.isArray(value) ? value : [value];\n }\n}\n","/**\n * Имена иконок rt-icon. Набор лежит в `assets/icons` пакета, откуда сборка\n * приложения кладёт его туда, куда указывает `provideRtIcons()`. Большинство\n * файлов пришло из фрейма iconsLib\n * (https://www.figma.com/design/x1rxhwomHt1pQRUcM3Zqjb?node-id=2922-7969).\n *\n * При добавлении новой иконки: положить SVG в `assets/icons` пакета, добавить\n * slug сюда, прогнать pnpm exec eslint --fix + pnpm exec prettier --write по этому файлу.\n * Имя без файла роняет весь набор: реестр собирает спрайт одним `forkJoin`, и один отказ\n * гасит иконки во всём приложении.\n *\n * Аннотация типа намеренно не указывается: явный `readonly string[]` потерял бы узкий\n * литеральный тип, нужный для `IRtIcon.Name` (см. `rt-icon.model.ts`). `as const`\n * сохраняет литеральные ключи.\n */\n\n// eslint-disable-next-line @typescript-eslint/typedef -- аннотация стёрла бы литеральный тип, на котором стоит IRtIcon.Name\nexport const iconsName = [\n 'alarm-clock',\n 'align-center',\n 'align-justify',\n 'align-left',\n 'align-right',\n 'angle-double-down',\n 'angle-double-left',\n 'angle-double-right',\n 'angle-double-up',\n 'angle-down',\n 'angle-left',\n 'angle-right',\n 'angle-up',\n 'arrow-bottom-old',\n 'arrow-circle-down',\n 'arrow-circle-left',\n 'arrow-circle-right',\n 'arrow-circle-up',\n 'arrow-down',\n 'arrow-down-left',\n 'arrow-down-long',\n 'arrow-down-right',\n 'arrow-left',\n 'arrow-left-old',\n 'arrow-leftlong',\n 'arrow-right',\n 'arrow-right-old',\n 'arrow-rightlong',\n 'arrow-top-old',\n 'arrow-up',\n 'arrow-up-left',\n 'arrow-up-long',\n 'arrow-up-right',\n 'arrows-h',\n 'arrows-v',\n 'at',\n 'attach-docx-doc',\n 'attach-eml',\n 'attach-folder',\n 'attach-jpg-png',\n 'attach-msg',\n 'attach-other',\n 'attach-pdf',\n 'attach-ppt-pptx',\n 'attach-txt',\n 'attach-webp',\n 'attach-xlsx-xls',\n 'attach-zip-rar',\n 'ban',\n 'bars',\n 'bell',\n 'bolt',\n 'book',\n 'bookmark',\n 'bookmark-fill',\n 'bot',\n 'box',\n 'briefcase',\n 'building',\n 'burger',\n 'calendar',\n 'calendar-minus',\n 'calendar-plus',\n 'calendar-times',\n 'camera',\n 'chart-bar',\n 'chart-line',\n 'chart-line-2',\n 'chart-pie',\n 'check',\n 'check-circle',\n 'check-double',\n 'check-square',\n 'chevron-circle-down',\n 'chevron-circle-left',\n 'chevron-circle-right',\n 'chevron-circle-up',\n 'chevron-down',\n 'chevron-left',\n 'chevron-right',\n 'chevron-up',\n 'chevron-up-down',\n 'clock',\n 'clone',\n 'close',\n 'cloud',\n 'cloud-download',\n 'cloud-upload',\n 'code',\n 'cog',\n 'comment',\n 'comments',\n 'copy',\n 'credit-card',\n 'database',\n 'desktop',\n 'directions',\n 'directions-alt',\n 'doc-success',\n 'docBox',\n 'ellipsis-h',\n 'ellipsis-v',\n 'email',\n 'exclamation-circle',\n 'external-link',\n 'eye',\n 'eye-slash',\n 'file',\n 'file-excel',\n 'file-o',\n 'file-pdf',\n 'filter',\n 'filter-fill',\n 'filter-slash',\n 'flag',\n 'flag-fill',\n 'flagman-a',\n 'flagman-b',\n 'flagman-c',\n 'flagman-q',\n 'folder',\n 'folder-open',\n 'globe',\n 'groupen',\n 'hashtag',\n 'heart',\n 'heart-fill',\n 'help',\n 'history',\n 'historyUpdate',\n 'ico-age',\n 'ico-alert',\n 'ico-b',\n 'ico-babyPacifier',\n 'ico-bank',\n 'ico-bill',\n 'ico-bill-striked',\n 'ico-bookmark-right',\n 'ico-books',\n 'ico-burger',\n 'ico-businessman',\n 'ico-c',\n 'ico-calendar',\n 'ico-case',\n 'ico-change',\n 'ico-change-2',\n 'ico-check',\n 'ico-checked',\n 'ico-checked-alert',\n 'ico-cheker',\n 'ico-chevron',\n 'ico-chevron-down',\n 'ico-close',\n 'ico-config',\n 'ico-contragents',\n 'ico-control',\n 'ico-copy',\n 'ico-counterparty',\n 'ico-coworkers',\n 'ico-debt',\n 'ico-director',\n 'ico-doc',\n 'ico-docDocprimary',\n 'ico-docs',\n 'ico-door',\n 'ico-dotted-more-horizontal',\n 'ico-doubleArrows',\n 'ico-download',\n 'ico-eagle',\n 'ico-edit',\n 'ico-edo',\n 'ico-email',\n 'ico-email1',\n 'ico-error',\n 'ico-exit',\n 'ico-eye',\n 'ico-eyeClose',\n 'ico-faq',\n 'ico-farm',\n 'ico-filter',\n 'ico-fine',\n 'ico-gasket',\n 'ico-generator',\n 'ico-grade',\n 'ico-grade-2',\n 'ico-ground-area-transport',\n 'ico-groundArea',\n 'ico-groupen',\n 'ico-hands',\n 'ico-help',\n 'ico-ico-history',\n 'ico-info',\n 'ico-infoFill',\n 'ico-invite',\n 'ico-key',\n 'ico-keyFill',\n 'ico-letter',\n 'ico-level',\n 'ico-level-down',\n 'ico-level-up',\n 'ico-licence',\n 'ico-limit',\n 'ico-link',\n 'ico-link-2',\n 'ico-listadd',\n 'ico-listing',\n 'ico-lock',\n 'ico-locked',\n 'ico-megafon',\n 'ico-new-window',\n 'ico-notification',\n 'ico-notificationOff',\n 'ico-percent-alert',\n 'ico-plus',\n 'ico-referal',\n 'ico-repeat',\n 'ico-reset',\n 'ico-return',\n 'ico-search',\n 'ico-setting',\n 'ico-settings',\n 'ico-site',\n 'ico-snowflake',\n 'ico-spec',\n 'ico-statement',\n 'ico-subuser',\n 'ico-sun',\n 'ico-sunrise',\n 'ico-support',\n 'ico-target',\n 'ico-team',\n 'ico-tech',\n 'ico-telegram',\n 'ico-time',\n 'ico-trash',\n 'ico-try',\n 'ico-txt',\n 'ico-unlock',\n 'ico-upload',\n 'ico-user',\n 'ico-user-2',\n 'ico-users',\n 'ico-users-2',\n 'ico-video-play',\n 'ico-warning',\n 'ico-warranty',\n 'ico-warranty-shield',\n 'ico-xml',\n 'id-card',\n 'image',\n 'images',\n 'inbox',\n 'info',\n 'info-circle',\n 'link',\n 'list',\n 'lock',\n 'lock-open',\n 'map',\n 'mapYandex',\n 'microsoft',\n 'minus',\n 'minus-circle',\n 'mobile',\n 'money-bill',\n 'moon',\n 'paperclip',\n 'pause',\n 'pencil',\n 'percentage',\n 'phone',\n 'pie-chart',\n 'plus-circle',\n 'power-off',\n 'print',\n 'qrcode',\n 'question-circle',\n 'refresh',\n 'replay',\n 'reply',\n 'reset',\n 'search',\n 'search-minus',\n 'search-plus',\n 'send',\n 'server',\n 'share-alt',\n 'shield',\n 'sitemap',\n 'sliders-v',\n 'sort-alpha-alt-down',\n 'sort-alpha-alt-up',\n 'sort-alpha-down',\n 'sort-alpha-up',\n 'sort-alt',\n 'sort-alt-slash',\n 'sort-amount-down',\n 'sort-amount-down-alt',\n 'sort-amount-up',\n 'sort-amount-up-alt',\n 'sort-numeric-alt-down',\n 'sort-numeric-alt-up',\n 'sort-numeric-down',\n 'sort-numeric-up',\n 'spinner',\n 'star',\n 'star-fill',\n 'stock',\n 'stop',\n 'sync',\n 'table',\n 'tablet',\n 'tag',\n 'tags',\n 'telegram',\n 'th-large',\n 'ticket',\n 'times-circle',\n 'trash',\n 'undo',\n 'unlock',\n 'user',\n 'user-edit',\n 'user-minus',\n 'user-plus',\n 'users',\n 'video',\n 'volume-down',\n 'volume-off',\n 'volume-up',\n 'wallet',\n 'warning',\n 'wifi',\n 'window-maximize',\n 'window-minimize',\n] as const;\n","import { DOCUMENT } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport { Injectable, InjectionToken, inject } from '@angular/core';\n\nimport { Observable, forkJoin, map, of, shareReplay, tap } from 'rxjs';\n\nimport { iconsName } from './rt-icon-names';\nimport { IRtIcon } from './rt-icon.model';\n\n/** Префикс `id` для inline-sprite символов. Изолирует от внешних `id` на странице. */\nconst SYMBOL_ID_PREFIX: string = 'rt-icon-';\n\n/**\n * Адрес, по которому приложение публикует набор из `assets/icons` пакета.\n * Умолчание годится, когда сборка кладёт набор в корень статики; свой адрес\n * задаётся аргументом `provideRtIcons()`.\n */\nexport const RT_ICONS_BASE_URL: InjectionToken<string> = new InjectionToken<string>('RT_ICONS_BASE_URL', {\n providedIn: 'root',\n factory: (): string => '/icons',\n});\n\n/** Селектор inline-sprite, создаваемого один раз при первом обращении. */\nconst SPRITE_ID: string = 'rt-icon-sprite';\n\n@Injectable({ providedIn: 'root' })\nexport class RtIconRegistry {\n readonly #http: HttpClient = inject(HttpClient);\n readonly #doc: Document = inject(DOCUMENT);\n readonly #baseUrl: string = inject(RT_ICONS_BASE_URL);\n\n #preloadAll$: Observable<void> | null = null;\n\n /**\n * Имя symbol для `<use href=\"#X\">`. Возвращает строку с ведущим `#`.\n */\n public symbolHref(name: IRtIcon.Name): string {\n return `#${SYMBOL_ID_PREFIX}${name}`;\n }\n\n /**\n * Загружает все SVG из реестра и склеивает их в inline-sprite в `<body>`.\n * Вызывается из `provideAppInitializer`. Повторные вызовы — no-op (shareReplay).\n */\n public preloadAll(): Observable<void> {\n if (this.#preloadAll$) {\n return this.#preloadAll$;\n }\n // Sprite уже в DOM (другая Angular app instance в той же странице,\n // e.g. Storybook между stories) — пропускаем 313 HTTP-запросов.\n if (this.#doc.getElementById(SPRITE_ID)) {\n this.#preloadAll$ = of(undefined).pipe(shareReplay(1));\n return this.#preloadAll$;\n }\n this.#preloadAll$ = forkJoin(iconsName.map((name: IRtIcon.Name) => this.#fetchSymbol(name))).pipe(\n tap((symbols: string[]): void => this.#mountSprite(symbols)),\n map((): void => undefined),\n shareReplay(1)\n );\n return this.#preloadAll$;\n }\n\n #fetchSymbol(name: IRtIcon.Name): Observable<string> {\n return this.#http\n .get(`${this.#baseUrl}/${name}.svg`, { responseType: 'text' })\n .pipe(map((raw: string): string => this.#extractSymbol(name, raw)));\n }\n\n #extractSymbol(name: IRtIcon.Name, raw: string): string {\n // Заменяем root `<svg>` на `<symbol id=\"rt-icon-NAME\">`, сохраняя viewBox и содержимое.\n const viewBoxMatch: RegExpExecArray | null = /viewBox=\"([^\"]+)\"/.exec(raw);\n const viewBox: string = viewBoxMatch ? viewBoxMatch[1] : '0 0 24 24';\n const inner: string = raw\n .replace(/<\\?xml[\\s\\S]*?\\?>/g, '')\n .replace(/<!DOCTYPE[\\s\\S]*?>/g, '')\n .replace(/<svg\\b[^>]*>/i, '')\n .replace(/<\\/svg>\\s*$/i, '')\n .trim();\n return `<symbol id=\"${SYMBOL_ID_PREFIX}${name}\" viewBox=\"${viewBox}\">${inner}</symbol>`;\n }\n\n #mountSprite(symbols: string[]): void {\n const existing: HTMLElement | null = this.#doc.getElementById(SPRITE_ID);\n if (existing) {\n existing.remove();\n }\n const sprite: SVGSVGElement = this.#doc.createElementNS('http://www.w3.org/2000/svg', 'svg');\n sprite.id = SPRITE_ID;\n sprite.setAttribute('aria-hidden', 'true');\n sprite.setAttribute('style', 'position:absolute;width:0;height:0;overflow:hidden;');\n sprite.innerHTML = symbols.join('');\n this.#doc.body.insertBefore(sprite, this.#doc.body.firstChild);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { IRtIcon } from './rt-icon.model';\nimport { RtIconRegistry } from './rt-icon.registry';\n\nconst SIZES: Readonly<Record<IRtIcon.Size, number>> = Object.freeze({\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n});\n\nconst COLORS: Readonly<Record<IRtIcon.Color, string>> = Object.freeze({\n current: 'currentColor',\n muted: 'var(--rt-neutral-600)',\n info: 'var(--rt-color-state-info)',\n success: 'var(--rt-color-state-success)',\n warning: 'var(--rt-color-state-warning)',\n danger: 'var(--rt-color-state-danger)',\n inverse: 'var(--rt-color-text-inverse)',\n});\n\nconst BEM_BLOCK: string = 'rt-icon';\n\n@Component({\n selector: 'rt-icon',\n template: `\n <svg focusable=\"false\" aria-hidden=\"true\" [attr.viewBox]=\"'0 0 24 24'\">\n <use [attr.href]=\"href()\"></use>\n </svg>\n `,\n styleUrls: ['./rt-icon.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: BEM_BLOCK,\n '[attr.aria-hidden]': \"'true'\",\n '[style.width.px]': 'sizePx()',\n '[style.height.px]': 'sizePx()',\n '[style.color]': 'colorValue()',\n '[style.transform]': 'rotateStyle()',\n },\n})\nexport class RtIconComponent {\n readonly #registry: RtIconRegistry = inject(RtIconRegistry);\n\n protected readonly href: Signal<string> = computed((): string => this.#registry.symbolHref(this.name()));\n\n protected readonly sizePx: Signal<number> = computed((): number => SIZES[this.size()]);\n\n protected readonly colorValue: Signal<string> = computed((): string => COLORS[this.color()]);\n\n protected readonly rotateStyle: Signal<string | null> = computed((): string | null => {\n const r: number | null = this.rotate();\n return r !== null && r !== 0 ? `rotate(${r}deg)` : null;\n });\n\n public readonly name: InputSignal<IRtIcon.Name> = input.required<IRtIcon.Name>();\n\n public readonly size: InputSignal<IRtIcon.Size> = input<IRtIcon.Size>('md');\n\n public readonly color: InputSignal<IRtIcon.Color> = input<IRtIcon.Color>('current');\n\n public readonly rotate: InputSignalWithTransform<number | null, IRotateInput> = input<number | null, IRotateInput>(null, {\n transform: (v: IRotateInput): number | null => {\n if (v === null || v === '') {\n return null;\n }\n return numberAttribute(v, 0);\n },\n });\n}\n\ntype IRotateInput = number | string | null;\n","import { ChangeDetectionStrategy, Component, signal, ViewEncapsulation, WritableSignal } from '@angular/core';\n\nconst BEM_BLOCK: string = 'rt-tooltip';\n\n/**\n * Презентационная панель tooltip'а. Рендерится директивой `[rtTooltip]` через\n * CDK `ComponentPortal` в overlay; текст выставляется императивно\n * (`ref.instance.text.set(...)`) — отдельного `input()` нет, т.к. компонент\n * создаётся вручную, а не в шаблоне.\n *\n * `ViewEncapsulation.None` — стили префиксованы `.rt-tooltip` (единообразно с\n * остальным common/ui). `role=\"tooltip\"` — вспомогательный ярлык для AT.\n */\n@Component({\n selector: 'rt-tooltip',\n template: '{{ text() }}',\n styleUrl: './rt-tooltip.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: BEM_BLOCK,\n role: 'tooltip',\n },\n})\nexport class RtTooltipComponent {\n public readonly text: WritableSignal<string> = signal<string>('');\n}\n","import {\n ConnectedPosition,\n FlexibleConnectedPositionStrategy,\n Overlay,\n OverlayConfig,\n OverlayRef,\n ScrollStrategyOptions,\n} from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { ComponentRef, Directive, ElementRef, inject, input, InputSignal, InputSignalWithTransform, OnDestroy } from '@angular/core';\n\nimport { RtTooltipComponent } from './rt-tooltip.component';\nimport { IRtTooltip } from './rt-tooltip.model';\n\nconst SHOW_DELAY_MS: number = 300;\nconst VIEWPORT_MARGIN: number = 8;\n\n/**\n * Tooltip-директива поверх CDK Overlay. Показывает короткую подсказку\n * (`rtTooltip` = строка) на hover/focus host'а. Движок — CDK `flexibleConnectedTo`\n * (авто-flip у края viewport, reposition при скролле), так что подсказка не\n * режется `overflow: hidden` предками (таблицы, aside, карточки).\n *\n * Триггеры: `mouseenter`/`focusin` показывают (с задержкой `SHOW_DELAY_MS`),\n * `mouseleave`/`focusout`/`click` прячут. Пустой текст → no-op (директива\n * выключена), поэтому её можно безусловно вешать на icon-кнопки и включать\n * выставлением строки.\n *\n * @example\n * ```html\n * <rt-icon-button icon=\"ico-trash\" ariaLabel=\"Удалить\" tooltip=\"Удалить\" />\n * <button rtButton [rtTooltip]=\"'Подсказка'\">…</button>\n * ```\n */\n@Directive({\n selector: '[rtTooltip]',\n exportAs: 'rtTooltip',\n host: {\n '(mouseenter)': 'show()',\n '(mouseleave)': 'hide()',\n '(focusin)': 'show()',\n '(focusout)': 'hide()',\n '(click)': 'hide()',\n },\n})\nexport class RtTooltipDirective implements OnDestroy {\n readonly #overlay: Overlay = inject(Overlay);\n readonly #elementRef: ElementRef<HTMLElement> = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly #scrollStrategies: ScrollStrategyOptions = inject(ScrollStrategyOptions);\n\n #overlayRef: OverlayRef | null = null;\n #tooltipRef: ComponentRef<RtTooltipComponent> | null = null;\n #showTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Текст подсказки. Принимает `null`/`undefined` (частый результат date-пайпа\n * или nullable-полей модели) и нормализует их в пустую строку — иначе\n * биндинги вида `value | date` ломали бы строгую типизацию шаблона. Пустая\n * строка → no-op (директива выключена).\n */\n public readonly text: InputSignalWithTransform<string, string | null | undefined> = input<string, string | null | undefined>('', {\n alias: 'rtTooltip',\n transform: (value: string | null | undefined): string => value ?? '',\n });\n\n public readonly placement: InputSignal<IRtTooltip.Placement> = input<IRtTooltip.Placement>('top', { alias: 'rtTooltipPlacement' });\n\n public ngOnDestroy(): void {\n this.#clearTimer();\n this.#disposeOverlay();\n }\n\n protected show(): void {\n if (this.text().trim() === '' || this.#tooltipRef !== null) {\n return;\n }\n this.#clearTimer();\n this.#showTimer = setTimeout((): void => this.#attach(), SHOW_DELAY_MS);\n }\n\n protected hide(): void {\n this.#clearTimer();\n this.#overlayRef?.detach();\n this.#tooltipRef = null;\n }\n\n #attach(): void {\n if (this.text().trim() === '') {\n return;\n }\n const overlayRef: OverlayRef = this.#ensureOverlay();\n const portal: ComponentPortal<RtTooltipComponent> = new ComponentPortal(RtTooltipComponent);\n this.#tooltipRef = overlayRef.attach(portal);\n this.#tooltipRef.instance.text.set(this.text());\n this.#tooltipRef.changeDetectorRef.markForCheck();\n }\n\n #ensureOverlay(): OverlayRef {\n if (this.#overlayRef !== null) {\n return this.#overlayRef;\n }\n const above: ConnectedPosition = {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -6,\n };\n const below: ConnectedPosition = {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: 6,\n };\n const positions: ConnectedPosition[] = this.placement() === 'top' ? [above, below] : [below, above];\n\n const positionStrategy: FlexibleConnectedPositionStrategy = this.#overlay\n .position()\n .flexibleConnectedTo(this.#elementRef)\n .withPush(true)\n .withViewportMargin(VIEWPORT_MARGIN)\n .withFlexibleDimensions(false)\n .withPositions(positions);\n\n const config: OverlayConfig = new OverlayConfig({\n positionStrategy,\n scrollStrategy: this.#scrollStrategies.reposition(),\n hasBackdrop: false,\n panelClass: 'rt-tooltip-panel',\n });\n this.#overlayRef = this.#overlay.create(config);\n return this.#overlayRef;\n }\n\n #clearTimer(): void {\n if (this.#showTimer !== null) {\n clearTimeout(this.#showTimer);\n this.#showTimer = null;\n }\n }\n\n #disposeOverlay(): void {\n this.#overlayRef?.dispose();\n this.#overlayRef = null;\n this.#tooltipRef = null;\n }\n}\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n output,\n OutputEmitterRef,\n Signal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '../icon/rt-icon.component';\nimport { IRtIcon } from '../icon/rt-icon.model';\nimport { RtTooltipDirective } from '../tooltip/rt-tooltip.directive';\nimport { IRtIconButton } from './rt-icon-button.model';\n\nconst BEM_BLOCK: string = 'rt-icon-button';\n\n/**\n * Универсальная icon-only кнопка кита.\n *\n * Рендерит свой собственный `<button type=\"...\">` внутри template (НЕ host-button).\n * Все цвета и размеры — через семантические `--rt-*` токены; геометрия квадрата\n * выставляется CSS-custom-property `--rt-icon-button-size` (overridable inline\n * через `style=\"--rt-icon-button-size: 35px\"` — нужно для миграции rt-header 35×35).\n *\n * Loading state — заменяет иконку на `<rt-icon name=\"spinner\">` и блокирует\n * клики (`button[disabled]`). Active state управляет `aria-pressed` (для toggle-кнопок).\n * Indicator — небольшой dot top-right через BEM-элемент `__indicator`.\n *\n * BEM-разметка — через `rtBlock=\"rt-icon-button\"` + `[rtMod]` объект; камелкейс\n * модификаторов автоматически конвертируется директивой в kebab-case\n * (`hasIndicator` → `rt-icon-button--has-indicator`).\n */\n@Component({\n selector: 'rt-icon-button',\n templateUrl: './rt-icon-button.component.html',\n styleUrls: ['./rt-icon-button.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // standalone components / directives\n RtIconComponent,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtIconButtonComponent {\n /**\n * Размер дочерней `<rt-icon>`. По умолчанию маппится 1-к-1 от размера кнопки,\n * но потребитель может задать свой: у крупной кнопки-действия (плавающая\n * кнопка чата) иконка во весь диаметр выглядит тяжеловесно, а сама кнопка\n * должна остаться большой — в неё целятся пальцем.\n */\n protected readonly resolvedIconSize: Signal<IRtIcon.Size> = computed((): IRtIcon.Size => {\n const map: Readonly<Record<IRtIconButton.Size, IRtIcon.Size>> = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n };\n return this.iconSize() ?? map[this.size()];\n });\n\n /** Кнопка отключена, если установлен disabled ИЛИ loading. */\n protected readonly isDisabled: Signal<boolean> = computed((): boolean => this.disabled() || this.loading());\n\n /**\n * BEM-модификаторы для `[rtMod]`. Собираем в .ts (а не в шаблоне), потому что\n * Angular template-parser не поддерживает computed property keys в inline-объектах.\n * camelCase ключи `hasIndicator` директива автоматически конвертирует в `has-indicator`.\n */\n protected readonly bemMods: Signal<Record<string, boolean>> = computed((): Record<string, boolean> => ({\n [this.variant()]: true,\n [this.size()]: true,\n [this.shape()]: true,\n loading: this.loading(),\n active: this.active(),\n hasIndicator: this.indicator(),\n }));\n\n /** Имя иконки — обязательно. */\n public readonly icon: InputSignal<IRtIcon.Name> = input.required<IRtIcon.Name>();\n\n /** Доступное имя для screen-reader'ов — обязательно (icon-only кнопка). */\n public readonly ariaLabel: InputSignal<string> = input.required<string>();\n\n /** Семантическая палитра. */\n public readonly variant: InputSignal<IRtIconButton.Variant> = input<IRtIconButton.Variant>('ghost');\n\n /**\n * Цвет самой иконки. Default `current` — иконка наследует цвет текста кнопки\n * (поведение по умолчанию). Явное значение нужно, когда иконка должна\n * отличаться от текста кнопки — например крестик-очистка внутри поля,\n * который должен совпадать по цвету с иконками-аффордансами самого поля.\n */\n public readonly iconColor: InputSignal<IRtIcon.Color> = input<IRtIcon.Color>('current');\n\n /** Размер квадрата. */\n public readonly size: InputSignal<IRtIconButton.Size> = input<IRtIconButton.Size>('md');\n\n /** Размер иконки; пусто — берётся от размера кнопки. */\n public readonly iconSize: InputSignal<IRtIcon.Size | null> = input<IRtIcon.Size | null>(null);\n\n /** Форма (круг или скруглённый квадрат). */\n public readonly shape: InputSignal<IRtIconButton.Shape> = input<IRtIconButton.Shape>('square');\n\n /** HTML-type для нативного `<button>`. */\n public readonly type: InputSignal<IRtIconButton.Type> = input<IRtIconButton.Type>('button');\n\n /**\n * Текст styled-tooltip'а (`rtTooltip`), показывается на hover/focus. Пустая\n * строка → tooltip выключен. Для icon-only кнопок обычно дублирует `ariaLabel`.\n */\n public readonly tooltip: InputSignal<string> = input<string>('');\n\n /**\n * Tabindex внутренней `<button>`. Default `0` (в обычном таб-порядке).\n * Значение `-1` исключает кнопку из таб-навигации, оставляя клик мышью —\n * нужно для вспомогательных аффордансов вроде крестика-очистки внутри поля.\n */\n public readonly tabIndex: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(0, { transform: numberAttribute });\n\n /** Состояние загрузки: показывает spinner вместо иконки + disabled. */\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Нативное отключение кнопки. */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Toggle-состояние — превращается в `aria-pressed=\"true\"`. */\n public readonly active: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Бейдж-индикатор (dot top-right через BEM-модификатор). */\n public readonly indicator: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Эмиттит MouseEvent при клике (только когда не disabled и не loading). */\n public readonly clicked: OutputEmitterRef<MouseEvent> = output<MouseEvent>();\n\n protected onClick(event: MouseEvent): void {\n if (this.isDisabled()) {\n return;\n }\n this.clicked.emit(event);\n }\n}\n","<button\n rtBlock=\"rt-icon-button\"\n qa-dataid=\"icon-button-control\"\n [rtTooltip]=\"tooltip()\"\n [rtMod]=\"bemMods()\"\n [type]=\"type()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-pressed]=\"active() ? 'true' : null\"\n [attr.tabindex]=\"tabIndex()\"\n (click)=\"onClick($event)\">\n @if (loading()) {\n <rt-icon rtElem=\"spinner\" name=\"spinner\" color=\"current\" [size]=\"resolvedIconSize()\" />\n } @else {\n <rt-icon rtElem=\"icon\" [color]=\"iconColor()\" [name]=\"icon()\" [size]=\"resolvedIconSize()\" />\n }\n @if (indicator()) {\n <span rtElem=\"indicator\" aria-hidden=\"true\"></span>\n }\n</button>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n input,\n InputSignal,\n InputSignalWithTransform,\n ViewEncapsulation,\n} from '@angular/core';\n\nexport type IRtSkeletonShape = 'rectangle' | 'circle' | 'square';\nexport type IRtSkeletonSize = 'sm' | 'md' | 'lg';\nexport type IRtSkeletonRadius = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nconst BEM_BLOCK: string = 'rt-skeleton';\n\n/**\n * Visual primitive для loading-state'а: серая полоска с shimmer-анимацией.\n *\n * Не использовать напрямую — оборачивай реальный content в `<rt-skeleton-wrapper>`\n * с input'ом `[isLoading]`. Wrapper решает что показать (skeleton или content),\n * этот компонент только рисует placeholder.\n *\n * Shimmer через background-position keyframes; `@media (prefers-reduced-motion)`\n * убирает анимацию для пользователей с reduced-motion preference.\n */\n@Component({\n selector: 'rt-skeleton',\n template: '',\n styleUrls: ['./rt-skeleton.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtSkeletonComponent {\n readonly #sizeMap: Record<IRtSkeletonSize, string> = {\n sm: '10px',\n md: '15px',\n lg: '20px',\n };\n\n readonly #radiusMap: Record<IRtSkeletonRadius, string> = {\n xs: '2px',\n sm: '4px',\n md: '6px',\n lg: '10px',\n xl: '999px',\n };\n\n public readonly shape: InputSignal<IRtSkeletonShape> = input<IRtSkeletonShape>('rectangle');\n\n public readonly size: InputSignal<IRtSkeletonSize> = input<IRtSkeletonSize>('md');\n\n public readonly width: InputSignal<string> = input<string>('100%');\n\n public readonly height: InputSignal<string> = input<string>(this.#sizeMap.sm);\n\n public readonly borderRadius: InputSignal<IRtSkeletonRadius> = input<IRtSkeletonRadius>('xl');\n\n public readonly animation: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n @HostBinding('class.rt-skeleton--rectangle')\n protected get isRectangle(): boolean {\n return this.shape() === 'rectangle';\n }\n\n @HostBinding('class.rt-skeleton--circle')\n protected get isCircle(): boolean {\n return this.shape() === 'circle';\n }\n\n @HostBinding('class.rt-skeleton--square')\n protected get isSquare(): boolean {\n return this.shape() === 'square';\n }\n\n @HostBinding('class.rt-skeleton--sm')\n protected get isSizeSm(): boolean {\n return this.size() === 'sm';\n }\n\n @HostBinding('class.rt-skeleton--md')\n protected get isSizeMd(): boolean {\n return this.size() === 'md';\n }\n\n @HostBinding('class.rt-skeleton--lg')\n protected get isSizeLg(): boolean {\n return this.size() === 'lg';\n }\n\n @HostBinding('class.rt-skeleton--animated')\n protected get isAnimated(): boolean {\n return this.animation();\n }\n\n @HostBinding('style.width')\n protected get hostWidth(): string {\n switch (this.shape()) {\n case 'circle':\n case 'square':\n return this.#getSizeValue();\n\n case 'rectangle':\n default:\n return this.width();\n }\n }\n\n @HostBinding('style.height')\n protected get hostHeight(): string {\n switch (this.shape()) {\n case 'circle':\n case 'square':\n return this.#getSizeValue();\n\n case 'rectangle':\n default:\n return this.height();\n }\n }\n\n @HostBinding('style.border-radius')\n protected get hostBorderRadius(): string {\n switch (this.shape()) {\n case 'circle':\n return '50%';\n\n case 'square':\n return this.#radiusMap.sm;\n\n case 'rectangle':\n default:\n return this.#radiusMap[this.borderRadius()];\n }\n }\n\n #getSizeValue(): string {\n return this.#sizeMap[this.size()];\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n InputSignal,\n InputSignalWithTransform,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { RtSkeletonComponent, IRtSkeletonRadius, IRtSkeletonShape, IRtSkeletonSize } from '../skeleton/rt-skeleton.component';\n\nconst BEM_BLOCK: string = 'rt-skeleton-wrapper';\n\n/**\n * Conditional renderer: показывает `<rt-skeleton>` пока `[isLoading]=\"true\"`,\n * иначе проецирует `<ng-content>`. Основной use-case — обёртка вокруг текстовых\n * значений и форм-полей в dialog'ах с async-данными.\n *\n * @example\n * ```html\n * <rt-skeleton-wrapper [isLoading]=\"!tour()\" width=\"240px\" height=\"16px\">\n * {{ tour()?.title }}\n * </rt-skeleton-wrapper>\n * ```\n */\n@Component({\n selector: 'rt-skeleton-wrapper',\n templateUrl: './rt-skeleton-wrapper.component.html',\n styleUrls: ['./rt-skeleton-wrapper.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtSkeletonComponent],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtSkeletonWrapperComponent {\n public readonly width: InputSignal<string> = input<string>('100%');\n\n public readonly height: InputSignal<string> = input<string>('15px');\n\n public readonly shape: InputSignal<IRtSkeletonShape> = input<IRtSkeletonShape>('rectangle');\n\n public readonly size: InputSignal<IRtSkeletonSize> = input<IRtSkeletonSize>('md');\n\n public readonly borderRadius: InputSignal<IRtSkeletonRadius> = input<IRtSkeletonRadius>('xl');\n\n public readonly animation: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n public readonly isLoading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n}\n","@if (isLoading()) {\n <rt-skeleton\n qa-dataid=\"skeleton-wrapper-placeholder\"\n [width]=\"width()\"\n [height]=\"height()\"\n [shape]=\"shape()\"\n [size]=\"size()\"\n [borderRadius]=\"borderRadius()\"\n [animation]=\"animation()\" />\n} @else {\n <ng-content />\n}\n","import { IRtIcon } from './rt-icon.model';\n\n/**\n * Категории иконок rt-icon. 10 buckets: 8 prefix-based + Custom (префикс `ico-`) + Misc (fallback).\n * Порядок фиксирован — соответствует порядку отображения в Catalog story (rt-icon.stories.ts).\n *\n * Аннотация типа намеренно не указывается: явный `readonly string[]` потерял бы узкий\n * литеральный тип, нужный для {@link IIconCategory}. `as const` сохраняет литеральные ключи.\n */\n// eslint-disable-next-line @typescript-eslint/typedef -- аннотация стёрла бы литеральный тип, на котором стоит IIconCategory\nexport const CATEGORY_ORDER = [\n 'Navigation',\n 'Alignment & Sorting',\n 'Status',\n 'Time & Calendar',\n 'Communication',\n 'Documents',\n 'People',\n 'Commerce',\n 'Custom',\n 'Misc',\n] as const;\n\n/** Литеральный union из {@link CATEGORY_ORDER}. */\nexport type IIconCategory = (typeof CATEGORY_ORDER)[number];\n\n/**\n * Правило маппинга имени иконки в категорию.\n * Порядок правил в {@link ICON_CATEGORY_RULES} важен: первое совпавшее правило выигрывает.\n */\ninterface IIconCategoryRule {\n readonly category: IIconCategory;\n readonly match: (name: string) => boolean;\n}\n\nfunction startsWithAny(name: string, prefixes: readonly string[]): boolean {\n return prefixes.some((p: string): boolean => name.startsWith(p));\n}\n\nfunction isOneOf(name: string, names: readonly string[]): boolean {\n return names.includes(name);\n}\n\nfunction matchPrefixOrExact(prefixes: readonly string[], exact: readonly string[]): (name: string) => boolean {\n return (name: string): boolean => startsWithAny(name, prefixes) || isOneOf(name, exact);\n}\n\n/**\n * Упорядоченный список правил категоризации.\n * `Custom` — единственная категория по строгому префиксу `ico-` и проверяется первой,\n * чтобы исключить конфликты с другими prefix-based категориями.\n * `Misc` — fallback в {@link categoryOf}, отдельным правилом не описывается.\n */\nexport const ICON_CATEGORY_RULES: readonly IIconCategoryRule[] = [\n { category: 'Custom', match: (n: string): boolean => n.startsWith('ico-') },\n {\n category: 'Navigation',\n match: matchPrefixOrExact(['arrow', 'arrows', 'angle', 'chevron', 'directions'], []),\n },\n {\n category: 'Alignment & Sorting',\n match: matchPrefixOrExact(['align', 'sort', 'bars', 'ellipsis', 'sliders', 'filter', 'th'], []),\n },\n {\n category: 'Status',\n match: matchPrefixOrExact(['check', 'times', 'ban', 'exclamation', 'info', 'eye', 'lock', 'unlock', 'shield'], ['spinner', 'stop']),\n },\n {\n category: 'Time & Calendar',\n match: matchPrefixOrExact(['alarm', 'calendar'], ['clock']),\n },\n {\n category: 'Communication',\n match: matchPrefixOrExact(['comment', 'share'], ['bell', 'bot', 'telegram', 'at', 'email', 'send', 'phone', 'mobile']),\n },\n {\n category: 'Documents',\n match: matchPrefixOrExact(['attach', 'file', 'folder', 'bookmark'], ['book', 'copy', 'clone', 'tag', 'tags']),\n },\n {\n category: 'People',\n match: matchPrefixOrExact(['user'], ['users', 'id-card']),\n },\n {\n category: 'Commerce',\n match: (n: string): boolean => isOneOf(n, ['wallet', 'money-bill', 'ticket', 'credit-card']),\n },\n];\n\n/**\n * Возвращает категорию для имени иконки.\n * Первое совпавшее правило в {@link ICON_CATEGORY_RULES} выигрывает; иначе — `Misc`.\n */\nexport function categoryOf(name: IRtIcon.Name): IIconCategory {\n for (const rule of ICON_CATEGORY_RULES) {\n if (rule.match(name)) {\n return rule.category;\n }\n }\n return 'Misc';\n}\n","import { EnvironmentProviders, inject, makeEnvironmentProviders, provideAppInitializer } from '@angular/core';\n\nimport { firstValueFrom } from 'rxjs';\n\nimport { PlatformService } from '@rt-tools/core';\n\nimport { RT_ICONS_BASE_URL, RtIconRegistry } from './rt-icon.registry';\n\n/**\n * Регистрирует все SVG-иконки `rt-icon` в sprite-реестре при бутстрапе приложения.\n *\n * ```typescript\n * export function withCoreProviders(): EnvironmentProviders {\n * return makeEnvironmentProviders([\n * provideHttpClient(...),\n * provideRtStorage(),\n * provideRtIcons(),\n * ]);\n * }\n * ```\n *\n * Внутри: forkJoin по всем именам из `rt-icon-names.ts`, склейка в `<svg><symbol>...`,\n * вставка в `<body>` первым элементом. Компонент `<rt-icon>` через `<use href=\"#rt-icon-NAME\">`\n * рендерит иконку из inline-sprite без дополнительных HTTP-запросов.\n *\n * Сами файлы приложение публикует само — набор лежит в `assets/icons` пакета, и\n * сборка копирует его в свою статику.\n *\n * @param baseUrl Адрес опубликованного набора. По умолчанию `/icons`.\n */\nexport function provideRtIcons(baseUrl?: string): EnvironmentProviders {\n return makeEnvironmentProviders([\n ...(baseUrl === undefined ? [] : [{ provide: RT_ICONS_BASE_URL, useValue: baseUrl }]),\n provideAppInitializer((): void => {\n // На сервере (SSR/prerender) sprite не грузим: относительные HTTP-запросы\n // к assets там невозможны, иконки дорисуются после гидрации.\n if (!inject(PlatformService).isPlatformBrowser) {\n return;\n }\n const registry: RtIconRegistry = inject(RtIconRegistry);\n // Не блокируем bootstrap: sprite иконок грузится в фоне, приложение\n // стартует сразу. Иначе Angular ждёт forkJoin из сотен SVG-запросов\n // (первая загрузка +5с). rt-icon рендерит через <use> по мере готовности sprite.\n void firstValueFrom(registry.preloadAll());\n }),\n ]);\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent, IRtIcon } from '../icon';\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { IRtTag } from './rt-tag.model';\n\nconst BEM_BLOCK: string = 'rt-tag';\n\n/**\n * Status/label pill для отображения статусов и счётчиков.\n * Поддерживает 6 severity-вариантов (`info` / `success` / `warning` / `danger` /\n * `secondary` / `neutral`), 2 формы (`pill` / `square`) и опциональный close-control\n * (рендерит `rt-icon-button` с иконкой `ico-close` и emits `closed` MouseEvent).\n *\n * Все цвета — через семантические `--rt-color-state-*` токены; layout через\n * primitive `--rt-space-*` / `--rt-radius-*` / `--rt-text-*`. BEM-разметка через\n * директивы `rtBlock` / `rtElem` / `rtMod` из `@rt-tools/core`.\n */\n@Component({\n selector: 'rt-tag',\n templateUrl: './rt-tag.component.html',\n styleUrl: './rt-tag.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // standalone components / directives\n RtIconComponent,\n RtIconButtonComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtTagComponent {\n /** Текст pill — обязательный input. */\n public readonly value: InputSignal<string> = input.required<string>();\n\n /** Семантическая палитра. По умолчанию `neutral` (нейтральный серый). */\n public readonly severity: InputSignal<IRtTag.Severity> = input<IRtTag.Severity>('neutral');\n\n /** Форма tag'а. По умолчанию `pill` (фуллскруглённый). */\n public readonly shape: InputSignal<IRtTag.Shape> = input<IRtTag.Shape>('pill');\n\n /** Вид заливки. По умолчанию `solid`; `outlined` — прозрачный фон + рамка. */\n public readonly appearance: InputSignal<IRtTag.Appearance> = input<IRtTag.Appearance>('solid');\n\n /** Переопределение скругления поверх `shape`. `null` — радиус по `shape`. */\n public readonly radius: InputSignal<IRtTag.Radius | null> = input<IRtTag.Radius | null>(null);\n\n /** Префикс-иконка слева от текста. `null` (дефолт) — без иконки. */\n public readonly icon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Суффикс-иконка справа от текста (напр. `external-link` у тега-ссылки). */\n public readonly iconEnd: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Рендерит крестик `rt-icon-button` справа от текста. */\n public readonly closable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Эмиттит MouseEvent при клике на close-button (только если `closable=true`). */\n public readonly closed: OutputEmitterRef<MouseEvent> = output<MouseEvent>();\n\n protected onClose(event: MouseEvent): void {\n event.stopPropagation();\n this.closed.emit(event);\n }\n}\n","<span\n rtBlock=\"rt-tag\"\n qa-dataid=\"tag\"\n [attr.data-severity]=\"severity()\"\n [rtMod]=\"{\n severity: severity(),\n shape: shape(),\n appearance: appearance(),\n radius: radius(),\n closable: closable(),\n }\">\n @if (icon(); as iconName) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"iconName\" />\n }\n <span rtElem=\"text\" qa-dataid=\"tag-text\">{{ value() }}</span>\n @if (iconEnd(); as iconEndName) {\n <rt-icon rtElem=\"icon-end\" size=\"sm\" [name]=\"iconEndName\" />\n }\n @if (closable()) {\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"tag-close\"\n icon=\"ico-close\"\n variant=\"ghost\"\n size=\"sm\"\n shape=\"circle\"\n [ariaLabel]=\"'rtKit.uiRemove' | transloco\"\n (clicked)=\"onClose($event)\" />\n }\n</span>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtIconButtonComponent } from '../../icon-button/rt-icon-button.component';\nimport { RtSkeletonWrapperComponent } from '../../skeleton-wrapper/rt-skeleton-wrapper.component';\nimport { RtTagComponent } from '../../tag/rt-tag.component';\nimport { RtAsideRef } from '../rt-aside-ref';\nimport { IRtAsideHeader } from './rt-aside-header.model';\n\nconst BEM_BLOCK: string = 'rt-aside-header';\n\n/**\n * Заголовок side-sheet'а; работает в двух modes:\n *\n * 1. **Programmatic** (через `RtAsideService.open()`) — `RtAsideRef` провайдится\n * оверлей-инжектором; стрелка «назад» дёргает `asideRef.close()` напрямую,\n * consumer подписан на `afterClosed()`.\n * 2. **Route-driven** (через `[rtContainerRightSidenavPanel]` driver в\n * rt-container'е) — `RtAsideRef` НЕ провайдится (overlay принадлежит\n * rt-container'у, не RtAsideService). Consumer слушает `(dismiss)` output и\n * сам зовёт `panel.close()`.\n *\n * Оба пути живут одновременно: `onDismiss()` сперва эмитит output, затем (если\n * есть) дёргает optional `asideRef.close()`.\n *\n * Доменные действия (отклонить / удалить / снять с публикации и т.п.)\n * проецируются в слот `[asideActions]` как ряд `rt-icon-button` справа от title.\n *\n * `ViewEncapsulation.None` — для единообразия с rt-dialog-header (стили\n * префиксованы `.rt-aside-header`).\n *\n * @example\n * ```html\n * <rt-aside-header title=\"Профиль пользователя\" />\n * <rt-aside-header title=\"Создание записи\" [closable]=\"false\" />\n * <rt-aside-header title=\"Детали\" (dismiss)=\"onClose()\">\n * <rt-icon-button asideActions icon=\"ico-error\" variant=\"danger\"\n * ariaLabel=\"Отклонить\" (clicked)=\"reject()\" />\n * </rt-aside-header>\n * ```\n */\n@Component({\n selector: 'rt-aside-header',\n templateUrl: './rt-aside-header.component.html',\n styleUrl: './rt-aside-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n RtSkeletonWrapperComponent,\n RtTagComponent,\n BlockDirective,\n ElemDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtAsideHeaderComponent {\n readonly #asideRef: RtAsideRef | null = inject(RtAsideRef, { optional: true });\n\n /** Текст заголовка — рендерится в `<h2>`. Null/пустая строка вместе с\n * `[loading]=true` показывают skeleton вместо title. */\n public readonly title: InputSignal<string | null> = input<string | null>(null);\n\n /**\n * Мелкий приглушённый надзаголовок НАД основным title (контекст действия:\n * «Создание записи», «Запись № 6»). Null (дефолт) — обычный\n * однострочный хедер. Overline не участвует в skeleton-режиме — это\n * статичный текст, известный до загрузки данных.\n */\n public readonly overline: InputSignal<string | null> = input<string | null>(null);\n\n /**\n * Ряд бэйджей (`rt-tag`) под заголовком — контекст сущности (статус, метка\n * записи и т.п.). Пустой массив (дефолт) — ряд не рендерится. Async-данные:\n * потребитель отдаёт `[]` пока сущность не зарезолвилась.\n */\n public readonly badges: InputSignal<readonly IRtAsideHeader.Badge[]> = input<readonly IRtAsideHeader.Badge[]>([]);\n\n /** Показывать кнопку закрытия в углу заголовка. Дефолт `true`. */\n public readonly closable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /** Показывать skeleton вместо title (loading-state aside'а пока данные\n * резолвятся через async fasade). Дефолт `false`. */\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /**\n * Эмитится при клике по стрелке «назад» — намерение пользователя закрыть\n * aside (intent, не «закрыто»). Route-driven consumer слушает этот output и\n * дёргает `panel.close()` сам. Имя `dismiss` вместо `close` — ESLint\n * `@angular-eslint/no-output-native` блокирует output с именем стандартного\n * DOM-события (`close`).\n */\n public readonly dismiss: OutputEmitterRef<void> = output<void>();\n\n protected onDismiss(): void {\n // Сначала output — route-driven consumer обработает intent.\n this.dismiss.emit();\n // Затем (если есть) AsideRef — programmatic mode через RtAsideService.\n this.#asideRef?.close();\n }\n}\n","<ng-container rtBlock=\"rt-aside-header\">\n <header rtElem=\"content\" qa-dataid=\"aside-header\">\n @if (closable()) {\n <rt-icon-button\n rtElem=\"back\"\n qa-dataid=\"aside-back\"\n icon=\"arrow-left\"\n size=\"sm\"\n variant=\"ghost\"\n [ariaLabel]=\"'rtKit.uiBack' | transloco\"\n [tooltip]=\"'rtKit.uiBack' | transloco\"\n (clicked)=\"onDismiss()\" />\n }\n\n <div rtElem=\"heading\">\n @if (overline(); as overlineText) {\n <p rtElem=\"overline\" qa-dataid=\"aside-overline\">{{ overlineText }}</p>\n }\n <h2 rtElem=\"title\" qa-dataid=\"aside-title\">\n <rt-skeleton-wrapper width=\"180px\" height=\"20px\" [isLoading]=\"loading()\">\n {{ title() }}\n </rt-skeleton-wrapper>\n </h2>\n\n @if (badges().length > 0) {\n <div rtElem=\"badges\">\n @for (badge of badges(); track badge.value) {\n @if (badge.href; as href) {\n <a rtElem=\"badge-link\" qa-dataid=\"aside-badge-link\" target=\"_blank\" rel=\"noopener\" [href]=\"href\">\n <rt-tag\n iconEnd=\"external-link\"\n [value]=\"badge.value\"\n [severity]=\"badge.severity ?? 'neutral'\"\n [appearance]=\"badge.appearance ?? 'solid'\"\n [shape]=\"badge.shape ?? 'square'\"\n [radius]=\"badge.radius ?? 'md'\"\n [icon]=\"badge.icon ?? null\" />\n </a>\n } @else {\n <rt-tag\n [value]=\"badge.value\"\n [severity]=\"badge.severity ?? 'neutral'\"\n [appearance]=\"badge.appearance ?? 'solid'\"\n [shape]=\"badge.shape ?? 'square'\"\n [radius]=\"badge.radius ?? 'md'\"\n [icon]=\"badge.icon ?? null\" />\n }\n }\n </div>\n }\n </div>\n\n <div rtElem=\"actions\" qa-dataid=\"aside-actions\">\n <ng-content select=\"[asideActions]\" />\n </div>\n </header>\n</ng-container>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-aside-footer';\n\n/**\n * Footer-слот для композиции внутри `<rt-aside>`. Две зоны через именованные\n * слоты: `[asideDismiss]` (слева — «Закрыть», `appearance=\"text\"`, всегда) и\n * `[asidePrimary]` (справа — единственный позитивный глагол: Сохранить /\n * Отправить / Опубликовать, если есть). Раскладка `justify-content:\n * space-between`. Доменные/деструктивные действия в футер не кладём — они\n * проецируются иконками в `<rt-aside-header>` слот `[asideActions]`.\n *\n * Только две именованные зоны — безатрибутный контент НЕ проецируется (контент\n * без `asideDismiss`/`asidePrimary` не отрендерится).\n *\n * `ViewEncapsulation.None` — для единообразия с rt-aside.\n *\n * @example\n * \\`\\`\\`html\n * <rt-aside-footer>\n * <button rtButton asideDismiss appearance=\"text\" (click)=\"onClose()\">Закрыть</button>\n * <button rtButton asidePrimary theme=\"primary\" (click)=\"save()\">Сохранить</button>\n * </rt-aside-footer>\n * \\`\\`\\`\n */\n@Component({\n selector: 'rt-aside-footer',\n templateUrl: './rt-aside-footer.component.html',\n styleUrl: './rt-aside-footer.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [BlockDirective, ElemDirective],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtAsideFooterComponent {}\n","<ng-container rtBlock=\"rt-aside-footer\">\n <footer rtElem=\"content\" qa-dataid=\"aside-footer\">\n <ng-content select=\"[asideDismiss]\" />\n <ng-content select=\"[asidePrimary]\" />\n </footer>\n</ng-container>\n","import { ChangeDetectionStrategy, Component, input, InputSignal, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-aside-section';\n\n/**\n * Смысловая секция внутри асайда: единый вертикальный ритм между полями и\n * необязательный заголовок одного стиля. Заменяет разнобой из `fieldset`,\n * самопальных `div`-секций, `h3` и `<legend>`, которым раньше каждый диалог\n * группировал контент по-своему.\n *\n * Заголовок (`[heading]`) рендерится только когда задан. Соседние секции\n * автоматически разделяются верхней границей — отдельный разделитель в\n * потребителе не нужен.\n */\n@Component({\n selector: 'rt-aside-section',\n templateUrl: './rt-aside-section.component.html',\n styleUrl: './rt-aside-section.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtAsideSectionComponent {\n public readonly heading: InputSignal<string | null> = input<string | null>(null);\n}\n","<ng-container rtBlock=\"rt-aside-section\">\n @if (heading()) {\n <h3 rtElem=\"heading\" qa-dataid=\"aside-section-heading\">{{ heading() }}</h3>\n }\n <div rtElem=\"body\" qa-dataid=\"aside-section-body\">\n <ng-content />\n </div>\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n effect,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n OnInit,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AbstractControl, ControlValueAccessor, NgControl, ValidationErrors, Validators } from '@angular/forms';\n\nimport { IRtInput } from '../input/rt-input.model';\n\n/**\n * Базовый класс input-семейства common/ui. Владеет единым CVA-ядром:\n * - self-injected `NgControl` + ручная привязка `valueAccessor` (без\n * `NG_VALUE_ACCESSOR` provider — иначе NG0200 cycle при self-reference),\n * что даёт доступ к `control.invalid/touched` для авто-подсветки ошибки;\n * - сигнал значения `value`, состояния `isDisabled`/`isInvalid`;\n * - общие инпуты `size`/`disabled`/`controlId`/`ariaLabel`/`clearable`;\n * - оркестрацию очистки (`clear`) через абстрактные хуки конкретного поля.\n *\n * Конкретные поля реализуют `getEmptyValue`/`hasValue`/`focusAfterClear`. Поля\n * с отдельным display-состоянием (autocomplete, input-number) дополнительно\n * переопределяют `writeValue`/`clearValue`, синхронизируя свой display-сигнал.\n */\n@Directive()\nexport abstract class RtFormControlBase<TValue> implements ControlValueAccessor, OnInit {\n readonly #ngControl: NgControl | null = inject(NgControl, { self: true, optional: true });\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n #onChange: (value: TValue) => void = (): void => undefined;\n #onTouched: () => void = (): void => undefined;\n\n // Состояние, которым управляет родительский rt-field (через публичные сеттеры):\n // авто-id для связки label[for], read-only режим, зеркало ошибок/required.\n readonly #controlIdAssigned: WritableSignal<string | null> = signal<string | null>(null);\n readonly #readonlyAssigned: WritableSignal<boolean> = signal<boolean>(false);\n readonly #errors: WritableSignal<ValidationErrors | null> = signal<ValidationErrors | null>(null);\n readonly #required: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly value: WritableSignal<TValue>;\n protected readonly isDisabled: WritableSignal<boolean> = signal<boolean>(false);\n protected readonly isInvalid: WritableSignal<boolean> = signal<boolean>(false);\n\n /** Видимость кнопки очистки: включена, есть значение, поле активно. */\n protected readonly showClearButton: Signal<boolean> = computed(\n (): boolean => this.clearable() && this.hasValue() && !this.isDisabled()\n );\n\n /** Есть ли в поле значение — гейт видимости крестика. */\n protected abstract readonly hasValue: Signal<boolean>;\n\n public readonly size: InputSignal<IRtInput.Size> = input<IRtInput.Size>('md');\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n public readonly controlId: InputSignal<string | null> = input<string | null>(null);\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n public readonly clearable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /**\n * Видимая resting-рамка контрола. По умолчанию `true` — рамка видна на обеих\n * темах. `false` снимает только resting-рамку; focus/invalid состояния свою\n * рамку показывают всё равно, read-only остаётся плоским.\n */\n public readonly bordered: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /** Итоговый id поля: явный input важнее авто-id, назначенного rt-field. */\n public readonly effectiveControlId: Signal<string | null> = computed(\n (): string | null => this.controlId() ?? this.#controlIdAssigned()\n );\n\n /** Read-only режим (плоский текст вместо контрола); включается rt-field'ом. */\n public readonly isReadonly: Signal<boolean> = this.#readonlyAssigned.asReadonly();\n\n /** Публичный invalid для rt-field (touched/dirty уже учтён в #syncState). */\n public readonly invalid: Signal<boolean> = computed((): boolean => this.isInvalid());\n\n /** Текущие ошибки связанного контрола — источник текста ошибки в rt-field. */\n public readonly errors: Signal<ValidationErrors | null> = this.#errors.asReadonly();\n\n /** Помечен ли контрол как обязательный — для авто-«*» в rt-field. */\n public readonly required: Signal<boolean> = this.#required.asReadonly();\n\n /** Текст read-only представления. Реализуется конкретным контролом. */\n public abstract readonly displayText: Signal<string>;\n\n constructor() {\n this.value = signal<TValue>(this.getEmptyValue());\n // Self-inject NgControl + ручная привязка valueAccessor: доступ к\n // control.invalid/touched без NG_VALUE_ACCESSOR provider'а (тот\n // спровоцировал бы NG0200 cycle при self-reference).\n if (this.#ngControl !== null) {\n this.#ngControl.valueAccessor = this;\n }\n // Signal-input `disabled` → внутренний isDisabled (CVA пишет туда же).\n effect((): void => {\n this.isDisabled.set(this.disabled());\n });\n }\n\n public ngOnInit(): void {\n const control: AbstractControl | null = this.#ngControl?.control ?? null;\n if (control === null) {\n return;\n }\n // Авто-подсветка invalid + зеркало ошибок/required для rt-field.\n this.#required.set(control.hasValidator(Validators.required));\n this.#syncState(control);\n control.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((): void => {\n this.#syncState(control);\n });\n }\n\n public writeValue(value: TValue | null): void {\n this.value.set(value ?? this.getEmptyValue());\n }\n\n public registerOnChange(fn: (value: TValue) => void): void {\n this.#onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.#onTouched = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n\n /** Назначить авто-id (rt-field), когда у контрола нет явного controlId. */\n public assignControlId(id: string): void {\n this.#controlIdAssigned.set(id);\n }\n\n /** Включить/выключить read-only режим — вызывает родительский rt-field. */\n public setReadonly(value: boolean): void {\n this.#readonlyAssigned.set(value);\n }\n\n /** Очистка значения по кнопке-крестику + возврат фокуса в поле. */\n protected clear(event?: Event): void {\n event?.stopPropagation();\n if (this.isDisabled()) {\n return;\n }\n this.clearValue();\n this.#onChange(this.value());\n this.#onTouched();\n this.focusAfterClear();\n }\n\n /** Сбрасывает значение к пустому. Поля с display-сигналом расширяют. */\n protected clearValue(): void {\n this.value.set(this.getEmptyValue());\n }\n\n /** Прокидывает change наружу — для обработчиков пользовательского ввода. */\n protected emitChange(value: TValue): void {\n this.#onChange(value);\n }\n\n /** Помечает контрол touched — для blur/close-обработчиков. */\n protected markTouched(): void {\n this.#onTouched();\n }\n\n /** Пустое значение поля (тип-специфично: \"\", null, []). */\n protected abstract getEmptyValue(): TValue;\n\n /** Возврат фокуса после очистки (в input или на trigger-кнопку). */\n protected abstract focusAfterClear(): void;\n\n #syncState(control: AbstractControl): void {\n this.isInvalid.set(!!control.invalid && (control.touched || control.dirty));\n this.#errors.set(control.errors);\n }\n}\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n ConnectedPosition,\n FlexibleConnectedPositionStrategy,\n Overlay,\n OverlayConfig,\n OverlayRef,\n ScrollStrategyOptions,\n} from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n booleanAttribute,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n OnDestroy,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n TemplateRef,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { map, merge, Observable, Subject, switchMap } from 'rxjs';\n\nimport { IRtPopover } from './rt-popover.model';\n\nconst HOVER_CLOSE_DELAY_MS: number = 100;\n\n/**\n * Высота, ниже которой ужимать панель под вьюпорт бессмысленно: в такой полосе не\n * видно и одного пункта. Нужна только режиму `fitViewport` — по ней CDK решает,\n * что свободного места под триггером хватает.\n */\nconst FIT_VIEWPORT_MIN_HEIGHT_PX: number = 120;\n\n/**\n * Переиспользуемый popover-примитив поверх CDK Overlay. Привязывает плавающую\n * панель (`<ng-template>`) к host-элементу. Движок — CDK Overlay\n * (`flexibleConnectedTo`): авто-flip у края viewport, reposition при скролле,\n * outside-click и Escape закрытие из коробки — без ручного `position: absolute`\n * в `:host` (тот резался `overflow: hidden` предками: таблицы, aside, карточки).\n *\n * Триггеры:\n * - `click` (default) — toggle по клику на host; outside-click закрывает.\n * - `hover` — открытие на `mouseenter`, закрытие с grace-периодом на `mouseleave`\n * (наведение на панель удерживает её открытой).\n * - `manual` — авто-listener'ы не вешаются; host сам зовёт `open()/close()`.\n * Используется form-control'ами с собственным жестом (autocomplete — открытие\n * по набору текста).\n *\n * `open()/close()/toggle()/isOpen()` публичны во ВСЕХ режимах — `trigger` лишь\n * определяет авто-listener'ы. `width: 'trigger'` синхронизирует ширину панели с\n * host'ом (dropdown'ы), `'auto'` — content-sized (тултипы).\n */\n@Directive({\n selector: '[rtPopover]',\n exportAs: 'rtPopover',\n host: {\n '(click)': 'onHostClick()',\n '(mouseenter)': 'onHostMouseEnter()',\n '(mouseleave)': 'onHostMouseLeave($event)',\n },\n})\nexport class RtPopoverDirective implements OnDestroy {\n readonly #overlay: Overlay = inject(Overlay);\n readonly #elementRef: ElementRef<HTMLElement> = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly #viewContainerRef: ViewContainerRef = inject(ViewContainerRef);\n readonly #scrollStrategies: ScrollStrategyOptions = inject(ScrollStrategyOptions);\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n readonly #overlayCreatedSource: Subject<OverlayRef> = new Subject<OverlayRef>();\n\n #overlayRef: OverlayRef | null = null;\n #hoverCloseTimer: ReturnType<typeof setTimeout> | null = null;\n\n protected readonly isOpenState: WritableSignal<boolean> = signal<boolean>(false);\n\n public readonly template: InputSignal<TemplateRef<unknown> | null> = input<TemplateRef<unknown> | null>(null, { alias: 'rtPopover' });\n\n public readonly trigger: InputSignal<IRtPopover.Trigger> = input<IRtPopover.Trigger>('click', {\n alias: 'rtPopoverTrigger',\n });\n\n public readonly width: InputSignal<IRtPopover.Width> = input<IRtPopover.Width>('auto', {\n alias: 'rtPopoverWidth',\n });\n\n /** `end` — панель прижата к правому краю host'а (триггеры у правого края viewport). */\n public readonly align: InputSignal<IRtPopover.Align> = input<IRtPopover.Align>('start', {\n alias: 'rtPopoverAlign',\n });\n\n /**\n * Панель обязана уместиться во вьюпорт: не влезающая по ширине сдвигается от\n * края экрана внутрь, не влезающая по высоте ужимается до свободного места под\n * триггером, и содержимое в ней прокручивается.\n *\n * По умолчанию выключено: панель стоит ровно там, куда её ставит привязка к\n * триггеру, даже если часть её ушла за экран. Включать там, где панель широкая\n * или высокая настолько, что привязка сама по себе её не удерживает, — иначе\n * пункты навигации остаются за краем экрана и недостижимы.\n */\n public readonly fitViewport: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n alias: 'rtPopoverFitViewport',\n transform: booleanAttribute,\n });\n\n public readonly context: InputSignal<unknown> = input<unknown>(null, {\n alias: 'rtPopoverContext',\n });\n\n public readonly panelClass: InputSignal<string> = input<string>('', {\n alias: 'rtPopoverPanelClass',\n });\n\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n alias: 'rtPopoverDisabled',\n transform: booleanAttribute,\n });\n\n public readonly offsetY: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(4, {\n alias: 'rtPopoverOffsetY',\n transform: numberAttribute,\n });\n\n public readonly offsetX: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(0, {\n alias: 'rtPopoverOffsetX',\n transform: numberAttribute,\n });\n\n public readonly opened: OutputEmitterRef<void> = output<void>({ alias: 'rtPopoverOpened' });\n\n public readonly closed: OutputEmitterRef<void> = output<void>({ alias: 'rtPopoverClosed' });\n\n public readonly isOpen: Signal<boolean> = this.isOpenState.asReadonly();\n\n constructor() {\n // Outside-click / ESC подписки на единожды создаваемый overlay живут в\n // одном конструкторном стриме: #ensureOverlay эмитит OverlayRef после\n // создания (ровно один раз за жизнь директивы), стрим живёт до destroy.\n this.#overlayCreatedSource\n .pipe(\n switchMap((overlayRef: OverlayRef): Observable<() => void> =>\n merge(\n overlayRef.outsidePointerEvents().pipe(\n map((event: MouseEvent): (() => void) => (): void => {\n // Клик по host в режиме click обрабатывает onHostClick (toggle) —\n // не закрываем здесь, иначе двойной toggle (close + open).\n if (this.#elementRef.nativeElement.contains(event.target as Node)) {\n return;\n }\n // Клик по вложенной панели — не клик снаружи: закрытие\n // разрушило бы её вместе с нашей до того, как выбор\n // дойдёт до обработчика\n if (this.#isNestedOverlay(event.target)) {\n return;\n }\n this.close();\n })\n ),\n overlayRef.keydownEvents().pipe(\n map((event: KeyboardEvent): (() => void) => (): void => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n }\n })\n )\n )\n ),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe((handleCloseIntent: () => void): void => handleCloseIntent());\n }\n\n public ngOnDestroy(): void {\n this.#clearHoverTimer();\n this.#disposeOverlay();\n }\n\n public open(): void {\n if (this.disabled() || this.isOpenState() || this.template() === null) {\n return;\n }\n const overlayRef: OverlayRef = this.#ensureOverlay();\n if (this.width() === 'trigger') {\n overlayRef.updateSize({ width: this.#elementRef.nativeElement.offsetWidth });\n }\n const portal: TemplatePortal<unknown> = new TemplatePortal(this.template() as TemplateRef<unknown>, this.#viewContainerRef, {\n $implicit: this.context(),\n });\n overlayRef.attach(portal);\n this.isOpenState.set(true);\n this.opened.emit();\n }\n\n public close(): void {\n if (!this.isOpenState()) {\n return;\n }\n this.#overlayRef?.detach();\n this.isOpenState.set(false);\n this.closed.emit();\n }\n\n public toggle(): void {\n if (this.isOpenState()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n // --- авто-triggers (HostListener'ы навешиваются на host безусловно, но\n // проверяют активный режим — это дешевле, чем условная подписка) ---\n\n protected onHostClick(): void {\n if (this.trigger() !== 'click' || this.disabled()) {\n return;\n }\n this.toggle();\n }\n\n protected onHostMouseEnter(): void {\n if (this.trigger() !== 'hover') {\n return;\n }\n this.#clearHoverTimer();\n this.open();\n }\n\n protected onHostMouseLeave(event: MouseEvent): void {\n if (this.trigger() !== 'hover') {\n return;\n }\n if (this.#isNestedOverlay(event.relatedTarget)) {\n return;\n }\n this.#scheduleHoverClose();\n }\n\n #ensureOverlay(): OverlayRef {\n if (this.#overlayRef !== null) {\n return this.#overlayRef;\n }\n const alignX: 'start' | 'end' = this.align();\n const positions: ConnectedPosition[] = [\n {\n originX: alignX,\n originY: 'bottom',\n overlayX: alignX,\n overlayY: 'top',\n offsetX: this.offsetX(),\n offsetY: this.offsetY(),\n },\n {\n originX: alignX,\n originY: 'top',\n overlayX: alignX,\n overlayY: 'bottom',\n offsetX: this.offsetX(),\n offsetY: -this.offsetY(),\n },\n ];\n // Сдвиг к краю экрана и ужатие по высоте включаются только по просьбе\n // потребителя: панель, которая и так помещается, обязана стоять у своего\n // триггера — меню строки таблицы, подтверждение, меню профиля.\n const fitViewport: boolean = this.fitViewport();\n const positionStrategy: FlexibleConnectedPositionStrategy = this.#overlay\n .position()\n .flexibleConnectedTo(this.#elementRef)\n .withPush(fitViewport)\n .withFlexibleDimensions(fitViewport)\n // Отступ от края экрана равен отступу от триггера: свободное место\n // считается без него, и ужатая по высоте панель свисала бы за нижний\n // край ровно на этот отступ — вместе со своей рамкой.\n .withViewportMargin(fitViewport ? Math.abs(this.offsetY()) : 0)\n .withPositions(positions);\n\n const config: OverlayConfig = new OverlayConfig({\n positionStrategy,\n scrollStrategy: this.#scrollStrategies.reposition(),\n hasBackdrop: false,\n panelClass: this.#resolvePanelClasses(),\n // Порог, ниже которого свободного места под триггером считается\n // недостаточно и панель не ужимается, а сдвигается целиком.\n minHeight: fitViewport ? FIT_VIEWPORT_MIN_HEIGHT_PX : undefined,\n });\n const overlayRef: OverlayRef = this.#overlay.create(config);\n\n // Hover-bridge: при переходе курсора с host'а на панель отложенный close\n // (grace-период) гасится; уход с панели планирует его заново. Без этого\n // hover-popover закрывался бы по таймеру, как только мышь покидает host.\n // Listeners живут на overlay-элементе и умирают вместе с ним в dispose().\n overlayRef.overlayElement.addEventListener('mouseenter', (): void => {\n if (this.trigger() === 'hover') {\n this.#clearHoverTimer();\n }\n });\n overlayRef.overlayElement.addEventListener('mouseleave', (event: MouseEvent): void => {\n if (this.trigger() === 'hover' && !this.#isNestedOverlay(event.relatedTarget)) {\n this.#scheduleHoverClose();\n }\n });\n\n // Outside-click / ESC подписки объявлены один раз в конструкторе —\n // здесь только эмит созданного OverlayRef (см. #overlayCreatedSource-стрим).\n this.#overlayCreatedSource.next(overlayRef);\n\n this.#overlayRef = overlayRef;\n return overlayRef;\n }\n\n /**\n * Панель, открытая из нашей — список `rt-select`, календарь, вложенное меню.\n *\n * В DOM она лежит не внутри нашей панели, а рядом, отдельным оверлеем CDK.\n * Поэтому и уход курсора на неё, и клик по ней выглядят как «ушёл наружу»:\n * меню профиля закрывалось прямо под рукой, стоило потянуться к списку\n * языков, а выбранное значение до обработчика не доходило — панель со\n * `rt-select` разрушалась раньше.\n *\n * Вложенность определяется порядком в контейнере оверлеев: CDK добавляет их\n * по мере открытия, поэтому панель, открытая из нашей, всегда следует за\n * нашей. Соседний оверлей, открытый до нас, этой проверкой не удерживается —\n * клик по нему закрывает попап, как и любой клик снаружи.\n */\n #isNestedOverlay(target: EventTarget | null): boolean {\n const panel: HTMLElement | undefined = this.#overlayRef?.overlayElement;\n if (!panel || !(target instanceof Element)) {\n return false;\n }\n\n const nested: Element | null = target.closest('.cdk-overlay-pane');\n const container: HTMLElement | null = panel.parentElement;\n if (nested === null || nested === panel || container === null) {\n return false;\n }\n\n // `querySelectorAll` отдаёт узлы в порядке документа — им и меряется,\n // какая панель открыта позже\n const panes: readonly Element[] = Array.from(container.querySelectorAll('.cdk-overlay-pane'));\n\n return panes.indexOf(nested) > panes.indexOf(panel);\n }\n\n #resolvePanelClasses(): string[] {\n const base: string = 'rt-popover-panel';\n const extra: string = this.panelClass().trim();\n return extra ? [base, ...extra.split(/\\s+/)] : [base];\n }\n\n #scheduleHoverClose(): void {\n this.#clearHoverTimer();\n this.#hoverCloseTimer = setTimeout((): void => this.close(), HOVER_CLOSE_DELAY_MS);\n }\n\n #clearHoverTimer(): void {\n if (this.#hoverCloseTimer !== null) {\n clearTimeout(this.#hoverCloseTimer);\n this.#hoverCloseTimer = null;\n }\n }\n\n #disposeOverlay(): void {\n this.#overlayRef?.dispose();\n this.#overlayRef = null;\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n TemplateRef,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtFormControlBase } from '../form-control/rt-form-control.base';\nimport { RtIconComponent, IRtIcon } from '../icon';\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { RtPopoverDirective } from '../popover/rt-popover.directive';\nimport { IRtAutocomplete } from './rt-autocomplete.model';\n\nconst BEM_BLOCK: string = 'rt-autocomplete';\n\nlet panelIdSeed: number = 0;\n\nfunction nextPanelId(): number {\n panelIdSeed += 1;\n return panelIdSeed;\n}\n\n/**\n * Typeahead/autocomplete с server-side filter через `(complete)` event.\n *\n * Panel рендерится через CDK Overlay (`[rtPopover]` trigger=\"manual\" на input'е)\n * — открывается по набору текста (не click/hover), не обрезается overflow.\n * Подписчик получает `(complete)` с текущей строкой и сам грузит подсказки.\n *\n * CVA через общий `RtFormControlBase`. Generic `TItem` — тип подсказки и\n * selected value. Крестик (`clearable`) виден при непустом тексте — очищает и\n * текст, и выбранный объект. Keyboard-nav (activedescendant): ArrowUp/Down —\n * highlight, Enter — выбрать активную, Escape — закрыть. Home/End — deferred.\n */\n@Component({\n selector: 'rt-autocomplete',\n templateUrl: './rt-autocomplete.component.html',\n styleUrl: './rt-autocomplete.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n NgTemplateOutlet,\n\n // standalone components / directives\n RtIconButtonComponent,\n RtIconComponent,\n RtPopoverDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n TranslocoPipe,\n ],\n providers: [\n // Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtAutocompleteComponent) },\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-autocomplete--open]': 'isOpen()',\n '[class.rt-autocomplete--disabled]': 'isDisabled()',\n '[class.rt-autocomplete--readonly]': 'isReadonly()',\n '[class.rt-autocomplete--invalid]': 'isInvalid()',\n '[class.rt-autocomplete--borderless]': '!bordered()',\n '[class.rt-autocomplete--size--sm]': \"size() === 'sm'\",\n '[class.rt-autocomplete--size--lg]': \"size() === 'lg'\",\n },\n})\nexport class RtAutocompleteComponent<TItem> extends RtFormControlBase<TItem | null> {\n protected readonly panelId: string = `rt-autocomplete-panel-${nextPanelId()}`;\n\n protected readonly popover: Signal<RtPopoverDirective> = viewChild.required(RtPopoverDirective);\n\n protected readonly fieldEl: Signal<ElementRef<HTMLInputElement> | undefined> = viewChild<ElementRef<HTMLInputElement>>('fieldEl');\n\n protected readonly inputText: WritableSignal<string> = signal<string>('');\n protected readonly activeIndex: WritableSignal<number> = signal<number>(-1);\n\n protected readonly isOpen: Signal<boolean> = computed((): boolean => this.popover().isOpen());\n\n protected readonly hasValue: Signal<boolean> = computed((): boolean => this.inputText() !== '');\n\n public readonly displayText: Signal<string> = computed((): string => this.displayWith()(this.value()));\n\n public readonly suggestions: InputSignal<ReadonlyArray<TItem>> = input<ReadonlyArray<TItem>>([]);\n\n public readonly displayWith: InputSignal<(item: TItem | null) => string> = input<(item: TItem | null) => string>(\n (item: TItem | null): string => String(item ?? '')\n );\n\n public readonly placeholder: InputSignal<string> = input<string>('');\n public readonly minLength: InputSignal<number> = input<number>(1);\n\n /** Префикс-иконка слева в поле (например, `map` для поиска). */\n public readonly iconLeft: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n public readonly openOnFocus: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly itemTemplate: InputSignal<TemplateRef<{ $implicit: TItem }> | null> = input<TemplateRef<{ $implicit: TItem }> | null>(\n null\n );\n\n public readonly complete: OutputEmitterRef<IRtAutocomplete.CompleteEvent> = output<IRtAutocomplete.CompleteEvent>();\n\n public readonly itemSelect: OutputEmitterRef<TItem> = output<TItem>();\n\n public override writeValue(value: TItem | null): void {\n super.writeValue(value);\n this.inputText.set(this.displayWith()(this.value()));\n }\n\n public override setDisabledState(disabled: boolean): void {\n super.setDisabledState(disabled);\n if (disabled) {\n this.popover().close();\n }\n }\n\n protected getEmptyValue(): TItem | null {\n return null;\n }\n\n protected focusAfterClear(): void {\n this.fieldEl()?.nativeElement.focus();\n }\n\n protected override clearValue(): void {\n super.clearValue();\n this.inputText.set('');\n }\n\n protected onInput(event: Event): void {\n const target: HTMLInputElement = event.target as HTMLInputElement;\n const query: string = target.value;\n this.inputText.set(query);\n this.activeIndex.set(-1);\n if (query.length >= this.minLength()) {\n this.complete.emit({ query, originalEvent: event });\n this.popover().open();\n } else {\n this.popover().close();\n }\n }\n\n protected onFocus(): void {\n if (!this.openOnFocus()) {\n return;\n }\n this.complete.emit({ query: this.inputText(), originalEvent: new Event('focus') });\n this.popover().open();\n }\n\n protected onBlur(): void {\n this.markTouched();\n }\n\n protected onClosed(): void {\n this.activeIndex.set(-1);\n }\n\n protected onSelect(item: TItem): void {\n this.value.set(item);\n this.inputText.set(this.displayWith()(item));\n this.emitChange(item);\n this.itemSelect.emit(item);\n this.popover().close();\n }\n\n protected onInputKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) {\n return;\n }\n const key: string = event.key;\n if (!this.isOpen()) {\n return;\n }\n switch (key) {\n case 'ArrowDown':\n event.preventDefault();\n this.#moveActive(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.#moveActive(-1);\n break;\n case 'Enter':\n event.preventDefault();\n this.#selectActive();\n break;\n case 'Escape':\n event.preventDefault();\n this.popover().close();\n break;\n default:\n break;\n }\n }\n\n #moveActive(delta: number): void {\n const items: ReadonlyArray<TItem> = this.suggestions();\n if (items.length === 0) {\n this.activeIndex.set(-1);\n return;\n }\n const index: number = this.activeIndex();\n const next: number = (index + delta + items.length) % items.length;\n this.activeIndex.set(next);\n }\n\n #selectActive(): void {\n const items: ReadonlyArray<TItem> = this.suggestions();\n const index: number = this.activeIndex();\n if (index >= 0 && index < items.length) {\n this.onSelect(items[index]);\n }\n }\n}\n","<ng-container rtBlock=\"rt-autocomplete\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" qa-dataid=\"autocomplete-readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '—' }}</span>\n }\n <div rtElem=\"field\" rtPopoverTrigger=\"manual\" rtPopoverWidth=\"trigger\" [rtPopover]=\"panelTpl\" (rtPopoverClosed)=\"onClosed()\">\n @if (iconLeft(); as left) {\n <rt-icon rtElem=\"icon-left\" size=\"sm\" color=\"muted\" [name]=\"left\" />\n }\n <input\n #fieldEl\n rtElem=\"input\"\n qa-dataid=\"autocomplete-input\"\n type=\"text\"\n autocomplete=\"off\"\n role=\"combobox\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-autocomplete]=\"'list'\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-activedescendant]=\"isOpen() && activeIndex() >= 0 ? panelId + '-opt-' + activeIndex() : null\"\n [placeholder]=\"placeholder()\"\n [value]=\"inputText()\"\n [disabled]=\"isDisabled()\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onInputKeydown($event)\" />\n @if (showClearButton()) {\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"autocomplete-clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"'rtKit.uiClear' | transloco\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n </div>\n\n <ng-template #panelTpl>\n <!--\n Опции выбираются мышью через (click); keyboard-nav — на input'е\n (activedescendant), опции не focusable индивидуально.\n -->\n <!-- eslint-disable @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <ul rtElem=\"panel\" qa-dataid=\"autocomplete-panel\" role=\"listbox\" [id]=\"panelId\">\n @for (item of suggestions(); track $index; let i = $index) {\n <li\n rtElem=\"option\"\n qa-dataid=\"autocomplete-option\"\n role=\"option\"\n [id]=\"panelId + '-opt-' + i\"\n [rtMod]=\"{ active: i === activeIndex() }\"\n [attr.aria-selected]=\"item === value()\"\n (click)=\"onSelect(item)\">\n @if (itemTemplate(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl; context: { $implicit: item }\" />\n } @else {\n {{ displayWith()(item) }}\n }\n </li>\n } @empty {\n <li rtElem=\"empty\" qa-dataid=\"autocomplete-empty\">{{ 'rtKit.uiNothingFound' | transloco }}</li>\n }\n </ul>\n </ng-template>\n</ng-container>\n","import { ChangeDetectionStrategy, Component, computed, input, InputSignal, Signal } from '@angular/core';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '../icon';\nimport { IRtBarList } from './rt-bar-list.model';\n\nconst BEM_BLOCK: string = 'rt-bar-list';\n\n/**\n * Список «топ-N» со шкалой доли: заголовок, необязательное уточнение, значение\n * справа и полоса под строкой. Заменяет самодельные бары — третьей реализации\n * в проекте быть не должно.\n *\n * Компонент ничего не считает и не форматирует: доля приходит числом 0…100,\n * значение — готовой строкой. Так список одинаково годится и для денег, и для\n * счётчиков визитов.\n */\n@Component({\n selector: 'rt-bar-list',\n templateUrl: './rt-bar-list.component.html',\n styleUrl: './rt-bar-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // standalone components / directives\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtBarListComponent {\n readonly #t_uiNoData: Signal<string> = translateSignal('rtKit.uiNoData');\n\n protected readonly emptyMessage: Signal<string> = computed((): string => this.emptyText() || this.#t_uiNoData());\n\n public readonly rows: InputSignal<ReadonlyArray<IRtBarList.Row>> = input.required<ReadonlyArray<IRtBarList.Row>>();\n\n public readonly title: InputSignal<string> = input<string>('');\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly emptyText: InputSignal<string> = input<string>('');\n}\n","<section rtBlock=\"rt-bar-list\" qa-dataid=\"bar-list\">\n @if (title()) {\n <h3 rtElem=\"title\" qa-dataid=\"bar-list-title\">{{ title() }}</h3>\n }\n\n @if (rows().length > 0) {\n <ul rtElem=\"rows\" qa-dataid=\"bar-list-rows\">\n @for (row of rows(); track row.id) {\n <li rtElem=\"row\" qa-dataid=\"bar-list-row\" [attr.data-id]=\"row.id\">\n <span rtElem=\"row-head\">\n <span rtElem=\"row-title\" qa-dataid=\"bar-list-row-title\">{{ row.title }}</span>\n <span rtElem=\"row-value\" qa-dataid=\"bar-list-row-value\">{{ row.value }}</span>\n </span>\n @if (row.meta) {\n <span rtElem=\"row-meta\" qa-dataid=\"bar-list-row-meta\">{{ row.meta }}</span>\n }\n <span rtElem=\"track\">\n <span rtElem=\"fill\" qa-dataid=\"bar-list-row-fill\" [style.width.%]=\"row.sharePercent\"></span>\n </span>\n </li>\n }\n </ul>\n } @else {\n <div rtElem=\"empty\" qa-dataid=\"bar-list-empty\">\n <rt-icon name=\"warning\" size=\"md\" color=\"muted\" />\n <p rtElem=\"empty-text\" qa-dataid=\"bar-list-empty-text\">{{ emptyMessage() }}</p>\n </div>\n }\n</section>\n","export const DRAG_DISMISS_THRESHOLD_PX: number = 80;\n\nexport function clampDragDelta(deltaY: number): number {\n return Math.max(0, deltaY);\n}\n\nexport function shouldDismissDrag(deltaY: number): boolean {\n return deltaY > DRAG_DISMISS_THRESHOLD_PX;\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n InputSignal,\n output,\n OutputEmitterRef,\n signal,\n WritableSignal,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\n// rt-tools\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { clampDragDelta, shouldDismissDrag } from './rt-bottom-sheet.logic';\n\nconst BEM_BLOCK: string = 'rt-bottom-sheet';\n\n@Component({\n selector: 'rt-bottom-sheet',\n templateUrl: './rt-bottom-sheet.component.html',\n styleUrl: './rt-bottom-sheet.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // rt-tools\n BlockDirective,\n ElemDirective,\n ModDirective,\n\n // transloco\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-bottom-sheet--open]': 'open()',\n },\n})\nexport class RtBottomSheetComponent {\n readonly #document: Document = inject(DOCUMENT);\n readonly #onDragMove: (event: PointerEvent) => void = (event: PointerEvent): void => this.#handleDragMove(event);\n readonly #onDragEnd: () => void = (): void => this.#handleDragEnd();\n\n #dragStartY: number = 0;\n\n protected readonly dragDeltaY: WritableSignal<number> = signal<number>(0);\n protected readonly dragging: WritableSignal<boolean> = signal<boolean>(false);\n\n public readonly open: InputSignal<boolean> = input.required<boolean>();\n public readonly openChange: OutputEmitterRef<boolean> = output<boolean>();\n\n protected onDragStart(event: PointerEvent): void {\n this.#dragStartY = event.clientY;\n this.dragging.set(true);\n this.dragDeltaY.set(0);\n this.#document.addEventListener('pointermove', this.#onDragMove);\n this.#document.addEventListener('pointerup', this.#onDragEnd);\n }\n\n protected dismiss(): void {\n this.openChange.emit(false);\n }\n\n #handleDragMove(event: PointerEvent): void {\n this.dragDeltaY.set(clampDragDelta(event.clientY - this.#dragStartY));\n }\n\n #handleDragEnd(): void {\n this.dragging.set(false);\n this.#document.removeEventListener('pointermove', this.#onDragMove);\n this.#document.removeEventListener('pointerup', this.#onDragEnd);\n if (shouldDismissDrag(this.dragDeltaY())) {\n this.openChange.emit(false);\n }\n this.dragDeltaY.set(0);\n }\n}\n","<ng-container rtBlock=\"rt-bottom-sheet\">\n <button\n type=\"button\"\n rtElem=\"backdrop\"\n qa-dataid=\"bottom-sheet-backdrop\"\n [attr.aria-label]=\"'rtKit.bottomSheetClose' | transloco\"\n (click)=\"dismiss()\"></button>\n <div\n rtElem=\"panel\"\n qa-dataid=\"bottom-sheet-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n [rtMod]=\"{ dragging: dragging() }\"\n [style.transform]=\"dragging() ? 'translateY(' + dragDeltaY() + 'px)' : null\">\n <div rtElem=\"handle\" qa-dataid=\"bottom-sheet-handle\" (pointerdown)=\"onDragStart($event)\"></div>\n <div rtElem=\"header\" qa-dataid=\"bottom-sheet-header\">\n <ng-content select=\"[sheetHeader]\" />\n </div>\n <ng-content />\n </div>\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { DOCUMENT } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n computed,\n Directive,\n effect,\n ElementRef,\n HostBinding,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n Renderer2,\n Signal,\n untracked,\n} from '@angular/core';\n\nimport { RtIconRegistry, IRtIcon } from '../icon';\nimport { IButton } from './rt-button.model';\n\nconst BEM_BLOCK: string = 'rt-button';\n\n/**\n * Директива стилизованной кнопки. Применяется к `<button>` или `<a>`\n * (для ссылок-кнопок с `routerLink`/`href`).\n *\n * Иконка и лейбл рендерятся внутрь элемента через `Renderer2`, чтобы можно\n * было применять директиву к существующему элементу без обёртки.\n * Поддерживает анимированный переход в/из loading.\n *\n * @example\n * ```html\n * <button rtButton label=\"Войти\" theme=\"primary\"></button>\n * <button rtButton label=\"Скачать\" icon=\"ico-download\" theme=\"success\"></button>\n * <button rtButton icon=\"ico-pencil\" theme=\"info\" appearance=\"text\"></button>\n * <button rtButton label=\"Сохранение...\" [loading]=\"saving()\" [disabled]=\"saving()\"></button>\n * <a rtButton label=\"Главная\" [routerLink]=\"'/'\"></a>\n * ```\n */\n@Directive({\n selector: 'button[rtButton], a[rtButton]',\n})\nexport class RtButtonDirective {\n readonly #el: ElementRef<HTMLButtonElement | HTMLAnchorElement> = inject<ElementRef<HTMLButtonElement | HTMLAnchorElement>>(ElementRef);\n readonly #renderer: Renderer2 = inject(Renderer2);\n readonly #doc: Document = inject(DOCUMENT);\n readonly #iconRegistry: RtIconRegistry = inject(RtIconRegistry);\n\n #iconEl: HTMLElement | null = null;\n #labelEl: HTMLElement | null = null;\n #spinnerEl: HTMLElement | null = null;\n #wasLoading: boolean = false;\n\n protected readonly isIconOnly: Signal<boolean> = computed(() => !!this.icon() && !this.label());\n\n /** Текстовый лейбл кнопки. Если null — кнопка только с иконкой. */\n public readonly label: InputSignal<string | null> = input<string | null>(null);\n /** CSS-класс иконки (например, `check`). Если null — без иконки. */\n public readonly icon: InputSignal<string | null> = input<string | null>(null);\n /** Сторона размещения иконки относительно лейбла. */\n public readonly iconPos: InputSignal<IButton.IconPos> = input<IButton.IconPos>('left');\n /** Семантическая палитра. */\n public readonly theme: InputSignal<IButton.Theme> = input<IButton.Theme>('primary');\n /** Внешний вид (filled / outlined / text). */\n public readonly appearance: InputSignal<IButton.Appearance> = input<IButton.Appearance>('filled');\n /** Размер. */\n public readonly size: InputSignal<IButton.Size> = input<IButton.Size>('md');\n /** Скруглённые углы (по умолчанию false — квадратная кнопка с radius из --rt-btn-radius). */\n public readonly rounded: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n /** Состояние загрузки: показывает спиннер вместо иконки, блокирует клики. */\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n /** Кастомный CSS-класс иконки в loading. Если null — встроенный CSS-спиннер. */\n public readonly loadingIcon: InputSignal<string | null> = input<string | null>(null);\n\n constructor() {\n afterNextRender(() => untracked(() => this.#updateContent()));\n\n effect(() => {\n this.label();\n this.icon();\n this.iconPos();\n this.loading();\n this.loadingIcon();\n\n untracked(() => this.#updateContent());\n });\n }\n\n @HostBinding('class')\n protected get hostClasses(): Record<string, boolean> {\n const theme: IButton.Theme = this.theme();\n const appearance: IButton.Appearance = this.appearance();\n const size: IButton.Size = this.size();\n\n return {\n [BEM_BLOCK]: true,\n [`${BEM_BLOCK}--${theme}`]: theme !== 'primary',\n [`${BEM_BLOCK}--outlined`]: appearance === 'outlined',\n [`${BEM_BLOCK}--text`]: appearance === 'text',\n [`${BEM_BLOCK}--rounded`]: this.rounded(),\n [`${BEM_BLOCK}--loading`]: this.loading(),\n [`${BEM_BLOCK}--icon-only`]: this.isIconOnly(),\n [`${BEM_BLOCK}--${size}`]: size !== 'md',\n };\n }\n\n #updateContent(): void {\n const button: HTMLButtonElement | HTMLAnchorElement = this.#el.nativeElement;\n const isLoading: boolean = this.loading();\n const wasLoading: boolean = this.#wasLoading;\n this.#wasLoading = isLoading;\n\n if (wasLoading && !isLoading) {\n this.#transitionFromLoading(button);\n return;\n }\n\n this.#clearContent(button);\n\n if (isLoading) {\n this.#renderLoading(button);\n return;\n }\n\n this.#renderIconAndLabel(button);\n }\n\n #transitionFromLoading(button: HTMLElement): void {\n const spinnerEl: HTMLElement | null = this.#spinnerEl;\n\n if (spinnerEl) {\n spinnerEl.style.animation = 'rt-button-fade-out 0.3s ease-out forwards';\n spinnerEl.addEventListener(\n 'animationend',\n () => {\n this.#clearContent(button);\n this.#renderIconAndLabel(button);\n },\n { once: true }\n );\n } else {\n this.#clearContent(button);\n this.#renderIconAndLabel(button);\n }\n }\n\n /**\n * Чистим по классу, а не по своим ссылкам. Под серверным рендером разметку\n * кнопки рисует сервер: после гидратации лейбл и иконка уже лежат в DOM, но создавал их\n * другой экземпляр директивы, и `#labelEl` у клиентского — пустой. Ссылки\n * тогда не находят ничего, а `#renderIconAndLabel` дорисовывает второй\n * лейбл — подпись кнопки удваивается («СохранитьСохранить»).\n */\n #clearContent(button: HTMLElement): void {\n const ownClasses: ReadonlyArray<string> = [`${BEM_BLOCK}__icon`, `${BEM_BLOCK}__label`, `${BEM_BLOCK}__spinner`];\n\n // Обход по детям, а не селектором `:scope >`: тот же код исполняется на\n // сервере, где DOM эмулированный и селекторный движок урезан\n for (const child of Array.from(button.children)) {\n if (ownClasses.some((ownClass: string): boolean => child.classList.contains(ownClass))) {\n this.#renderer.removeChild(button, child);\n }\n }\n\n this.#iconEl = null;\n this.#labelEl = null;\n this.#spinnerEl = null;\n }\n\n #renderLoading(button: HTMLElement): void {\n const loadingIcon: string | null = this.loadingIcon();\n\n if (loadingIcon) {\n this.#iconEl = this.#createIcon(loadingIcon);\n this.#renderer.appendChild(button, this.#iconEl);\n } else {\n this.#spinnerEl = this.#createSpinner();\n this.#renderer.appendChild(button, this.#spinnerEl);\n }\n\n const label: string | null = this.label();\n if (label) {\n this.#labelEl = this.#createLabel(label);\n this.#renderer.appendChild(button, this.#labelEl);\n }\n }\n\n #renderIconAndLabel(button: HTMLElement): void {\n const iconClass: string | null = this.icon();\n const label: string | null = this.label();\n const pos: IButton.IconPos = this.iconPos();\n\n const iconEl: HTMLElement | null = iconClass ? this.#createIcon(iconClass) : null;\n const labelEl: HTMLElement | null = label ? this.#createLabel(label) : null;\n\n if (pos === 'left') {\n if (iconEl) {\n this.#renderer.appendChild(button, iconEl);\n }\n if (labelEl) {\n this.#renderer.appendChild(button, labelEl);\n }\n } else {\n if (labelEl) {\n this.#renderer.appendChild(button, labelEl);\n }\n if (iconEl) {\n this.#renderer.appendChild(button, iconEl);\n }\n }\n\n this.#iconEl = iconEl;\n this.#labelEl = labelEl;\n }\n\n #createIcon(iconName: string): HTMLElement {\n // Рендерим SVG-sprite через RtIconRegistry — единый источник иконок\n // (как rt-icon / rt-icon-button / rt-input). Старый `<i class=\"ico-X\">`\n // паттерн требовал icon-font CSS, который ушёл вместе с PrimeNG.\n const svg: SVGSVGElement = this.#doc.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('focusable', 'false');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.classList.add(`${BEM_BLOCK}__icon`);\n\n const use: SVGUseElement = this.#doc.createElementNS('http://www.w3.org/2000/svg', 'use');\n // Регистр типизирован через IRtIcon.Name; директива принимает arbitrary\n // string для совместимости со старыми потребителями. Если name неизвестен,\n // <use href> просто не зарезолвится — браузер тихо отрендерит пустой контейнер.\n use.setAttribute('href', this.#iconRegistry.symbolHref(iconName as IRtIcon.Name));\n svg.appendChild(use);\n\n return svg as unknown as HTMLElement;\n }\n\n #createLabel(text: string): HTMLElement {\n const el: HTMLElement = this.#renderer.createElement('span') as HTMLElement;\n this.#renderer.addClass(el, `${BEM_BLOCK}__label`);\n this.#renderer.appendChild(el, this.#renderer.createText(text));\n return el;\n }\n\n #createSpinner(): HTMLElement {\n const wrapper: HTMLElement = this.#renderer.createElement('span') as HTMLElement;\n this.#renderer.addClass(wrapper, `${BEM_BLOCK}__spinner`);\n\n const circle: HTMLElement = this.#renderer.createElement('span') as HTMLElement;\n this.#renderer.addClass(circle, `${BEM_BLOCK}__spinner-circle`);\n this.#renderer.appendChild(wrapper, circle);\n\n return wrapper;\n }\n}\n","/**\n * Модель `<rt-icon-button>`: один корневой неймспейс с префиксом `I`.\n * Внутри — литеральные union-типы для variant / size / shape / type, чтобы:\n * - использовать как контракт `input()` сигналов компонента;\n * - переиспользовать в `argTypes` Storybook.\n */\n\nexport namespace IRtIconButton {\n /** Семантическая палитра кнопки. */\n export type Variant = 'primary' | 'secondary' | 'ghost' | 'danger' | 'success' | 'warning';\n\n /** Размер квадрата кнопки. Маппинг на пиксели — в SCSS (`--rt-icon-button-size`). */\n export type Size = 'sm' | 'md' | 'lg';\n\n /** Форма границы кнопки. */\n export type Shape = 'circle' | 'square';\n\n /** HTML-тип нативного `<button>`. */\n export type Type = 'button' | 'submit';\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n} from '@angular/core';\n\n// rt-tools\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtIconButtonComponent } from '../icon-button';\nimport { RtSkeletonComponent } from '../skeleton';\nimport { IRtCalendar } from './rt-calendar.model';\n\nconst BEM_BLOCK: string = 'rt-calendar';\n\n@Component({\n selector: 'rt-calendar',\n templateUrl: './rt-calendar.component.html',\n styleUrl: './rt-calendar.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // rt-tools\n BlockDirective,\n ElemDirective,\n\n // components\n RtIconButtonComponent,\n RtSkeletonComponent,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtCalendarComponent {\n protected readonly sublabelSkeletonHeight: string = '12px';\n\n public readonly months: InputSignal<readonly IRtCalendar.Month[]> = input.required<readonly IRtCalendar.Month[]>();\n public readonly weekdayLabels: InputSignal<readonly string[]> = input.required<readonly string[]>();\n public readonly canPrev: InputSignal<boolean> = input<boolean>(false);\n public readonly canNext: InputSignal<boolean> = input<boolean>(false);\n /** Локализованные aria-подписи кнопок навигации — задаёт consumer. */\n public readonly prevAriaLabel: InputSignal<string> = input<string>('');\n public readonly nextAriaLabel: InputSignal<string> = input<string>('');\n public readonly sublabelsLoading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly prevMonth: OutputEmitterRef<void> = output<void>();\n public readonly nextMonth: OutputEmitterRef<void> = output<void>();\n public readonly dayClick: OutputEmitterRef<IRtCalendar.Day> = output<IRtCalendar.Day>();\n\n protected onDayClick(day: IRtCalendar.Day): void {\n if (!day.disabled) {\n this.dayClick.emit(day);\n }\n }\n}\n","<ng-container rtBlock=\"rt-calendar\">\n <div rtElem=\"header\">\n <rt-icon-button\n rtElem=\"nav\"\n qa-dataid=\"calendar-prev-month\"\n icon=\"chevron-left\"\n variant=\"secondary\"\n shape=\"circle\"\n [ariaLabel]=\"prevAriaLabel()\"\n [disabled]=\"!canPrev()\"\n (clicked)=\"prevMonth.emit()\" />\n <ng-content select=\"[calendarHint]\" />\n <rt-icon-button\n rtElem=\"nav\"\n qa-dataid=\"calendar-next-month\"\n icon=\"chevron-right\"\n variant=\"secondary\"\n shape=\"circle\"\n [ariaLabel]=\"nextAriaLabel()\"\n [disabled]=\"!canNext()\"\n (clicked)=\"nextMonth.emit()\" />\n </div>\n\n <div rtElem=\"months\" qa-dataid=\"calendar-months\">\n @for (month of months(); track month.key) {\n <div rtElem=\"month\" qa-dataid=\"calendar-month\">\n <p rtElem=\"month-title\" qa-dataid=\"calendar-month-title\">{{ month.label }}</p>\n <div rtElem=\"grid\" qa-dataid=\"calendar-grid\">\n @for (weekday of weekdayLabels(); track $index) {\n <span rtElem=\"weekday\" qa-dataid=\"calendar-weekday\">{{ weekday }}</span>\n }\n @for (blank of month.leadingBlanks; track blank) {\n <span rtElem=\"blank\"></span>\n }\n @for (day of month.days; track day.key) {\n <button\n rtElem=\"day\"\n qa-dataid=\"calendar-day\"\n type=\"button\"\n [attr.data-iso]=\"day.key\"\n [attr.data-state]=\"day.state\"\n [disabled]=\"day.disabled\"\n (click)=\"onDayClick(day)\">\n <span rtElem=\"day-num\" qa-dataid=\"calendar-day-num\">{{ day.dayOfMonth }}</span>\n @if (sublabelsLoading()) {\n <rt-skeleton\n rtElem=\"day-sublabel\"\n qa-dataid=\"calendar-day-price-skeleton\"\n width=\"80%\"\n borderRadius=\"sm\"\n [height]=\"sublabelSkeletonHeight\" />\n } @else if (day.sublabel) {\n <span rtElem=\"day-sublabel\" qa-dataid=\"calendar-day-price\">{{ day.sublabel }}</span>\n }\n </button>\n }\n </div>\n </div>\n }\n </div>\n\n <ng-content />\n</ng-container>\n","/**\n * Контракты `rt-calendar` — презентационный месячный грид с range-выбором.\n *\n * Компонент домен-агностичен: состояния/цены/доступность дней вычисляет\n * consumer и передаёт готовые view-модели месяцев. Клики по дням и навигация\n * по месяцам эмитятся наружу; никакой доменной логики внутри нет.\n */\n\n/** Состояние ячейки дня — модификатор `data-state` на кнопке дня. */\nexport enum ERtCalendarDayState {\n Free = 'free',\n Busy = 'busy',\n Past = 'past',\n Blocked = 'blocked',\n Start = 'start',\n End = 'end',\n InRange = 'in-range',\n}\n\nexport namespace IRtCalendar {\n /** View-модель дня. `key` — стабильный ключ (ISO-дата). */\n export interface Day {\n key: string;\n dayOfMonth: number;\n /** Подпись под числом (цена за ночь и т.п.); пустая строка не рендерится. */\n sublabel: string;\n state: ERtCalendarDayState;\n disabled: boolean;\n }\n\n /** View-модель месяца: подпись, пустые ячейки до первого дня, дни. */\n export interface Month {\n key: string;\n label: string;\n leadingBlanks: readonly number[];\n days: readonly Day[];\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-card';\n\n/**\n * Контейнер-карточка с опциональным header (текст ИЛИ projected slot) и footer\n * (projected slot). Default content проецируется в основную область. Поддерживает\n * clickable mode для card-as-button сценариев: при `clickable=true` корневой\n * `<article>` получает `role=\"button\"`, `tabindex=\"0\"` и эмиттит `cardClick`\n * MouseEvent на клик и Enter/Space с клавиатуры.\n *\n * Две стратегии header:\n * 1. Текстом через `header=\"...\"` input — рендерит `<h3 class=\"rt-card__title\">`.\n * 2. Произвольный контент через attribute-selector slot `[rtCardHeader]`.\n *\n * Footer — только через slot `[rtCardFooter]`. Пустые header/footer слоты\n * визуально скрываются через `:empty` CSS-селектор.\n *\n * Все цвета и размеры — через семантические `--rt-*` токены; BEM-разметка через\n * директивы `rtBlock` / `rtElem` / `rtMod` из `@rt-tools/core`.\n */\n@Component({\n selector: 'rt-card',\n templateUrl: './rt-card.component.html',\n styleUrl: './rt-card.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtCardComponent {\n /** Заголовок-текст; если задан — рендерится `<h3 class=\"rt-card__title\">`. */\n public readonly header: InputSignal<string | null> = input<string | null>(null);\n\n /** ARIA-label на корневом `<article>`. */\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n /** Делает карточку интерактивной: `role=\"button\"`, `tabindex=\"0\"`, клавиатура. */\n public readonly clickable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Эмиттит MouseEvent при клике (или Enter/Space) — только если `clickable=true`. */\n public readonly cardClick: OutputEmitterRef<MouseEvent> = output<MouseEvent>();\n\n protected onClick(event: MouseEvent): void {\n if (this.clickable()) {\n this.cardClick.emit(event);\n }\n }\n\n protected onKeyActivate(event: Event): void {\n if (!this.clickable()) {\n return;\n }\n event.preventDefault();\n this.cardClick.emit(event as unknown as MouseEvent);\n }\n}\n","<article\n rtBlock=\"rt-card\"\n qa-dataid=\"card\"\n [rtMod]=\"{ clickable: clickable() }\"\n [attr.role]=\"clickable() ? 'button' : null\"\n [attr.tabindex]=\"clickable() ? 0 : null\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n (keydown.enter)=\"onKeyActivate($event)\"\n (keydown.space)=\"onKeyActivate($event)\">\n <header rtElem=\"header\">\n @if (header(); as h) {\n <h3 rtElem=\"title\" qa-dataid=\"card-title\">{{ h }}</h3>\n }\n <ng-content select=\"[rtCardHeader]\" />\n </header>\n <div rtElem=\"content\">\n <ng-content />\n </div>\n <footer rtElem=\"footer\">\n <ng-content select=\"[rtCardFooter]\" />\n </footer>\n</article>\n","import { IQuillDelta } from '../../util';\n\n/**\n * Модель общего чат-компонента `rt-chat`: один корневой неймспейс\n * с префиксом `I`. Доменные стора маппят свою модель сообщения в `Message`, а сам\n * `rt-chat` ничего не знает о доменных сущностях — только рисует тред и композер.\n */\n/**\n * Судьба своего сообщения в ленте: пока летит на сервер — часы, после записи —\n * двойной чек, после того как собеседник открыл переписку — тот же чек синим,\n * при обрыве — «!» с повтором. Входящие сообщения статуса не имеют.\n */\nexport enum ERtChatMessageStatus {\n Sending = 'sending',\n Sent = 'sent',\n Read = 'read',\n Failed = 'failed',\n}\n\nexport namespace IRtChat {\n /** Алиас enum'а для доменных мапперов, работающих через неймспейс. */\n export type MessageStatus = ERtChatMessageStatus;\n\n /** Вложение сообщения — домен маппит свой ресурс, скачивание по `public_id`. */\n export interface Attachment {\n id: number;\n /** Обезличенное имя для карточки файла. */\n name: string;\n /** Непрозрачный идентификатор файла — консюмер качает blob по нему. */\n publicId: string;\n }\n\n /**\n * Одно сообщение треда в уже подготовленной для отображения форме: автор —\n * готовый лейбл (домен решает, как его собрать), `own`/`system` — флаги\n * выравнивания и стиля, дата — ISO-строка (форматируется `DatePipe` внутри).\n */\n export interface Message {\n /** Идентификатор сообщения — ключ `@for track`. */\n id: number | string;\n /** Клиентский временный id оптимистичного сообщения (до ответа сервера). */\n tempId?: string;\n /**\n * Статус своего сообщения. Отсутствует у входящих: чужому сообщению\n * нечего сообщать о доставке.\n */\n status?: MessageStatus;\n /** Готовый лейбл автора (доменный authorLabel). */\n author: string;\n /** Сообщение текущего пользователя — выравнивается вправо, акцентный фон. */\n own: boolean;\n /** Признак системного сообщения (рендерится обычным входящим пузырём). */\n system?: boolean;\n text: string;\n /**\n * Rich-тело (Quill delta) — при наличии рендерится вместо plain `text`\n * через `rt-delta-view`. `null`/отсутствует ⇒ показываем `text`.\n */\n delta?: IQuillDelta | null;\n /** ISO-дата создания. */\n createdAt: string;\n /** URL вложения (если есть) — наличие включает карточку файла. */\n fileUrl?: string | null;\n /** Имя вложения для отображения в карточке. */\n fileName?: string | null;\n /**\n * Вложения сообщения (несколько файлов). Непустой массив имеет приоритет\n * над legacy-парой `fileUrl`/`fileName` (та равна первому вложению).\n */\n attachments?: readonly Attachment[];\n /** Внешняя ссылка-призыв (привязка Telegram) — наличие включает кнопку-ссылку. */\n deepLink?: string | null;\n /** Подпись кнопки-ссылки `deepLink` (домен решает текст по состоянию). */\n deepLinkLabel?: string | null;\n /** Сообщение помечено удалённым — рендерится плейсхолдером вместо содержимого. */\n deleted?: boolean;\n /** Показать действие «удалить» на этом сообщении (домен решает по правам/направлению). */\n canDelete?: boolean;\n /**\n * Текст подтверждения перед удалением. Задан — клик по корзине открывает\n * confirm-попап с этим текстом, удаление уходит только после подтверждения.\n * Пусто/undefined — удаление сразу по клику (домен без confirm-семантики).\n */\n deleteConfirm?: string;\n }\n\n /** Payload отправки: текст + файлы (пусто/undefined, если вложения выключены). */\n export interface SendPayload {\n text: string;\n files?: File[];\n /**\n * Rich-тело строкой JSON (`JSON.stringify(getContents())`) — взаимоисключимо\n * с непустым `text`. При наличии домен шлёт delta-канал (`message:\"\"`).\n */\n delta?: string | null;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { ERtChatMessageStatus } from '../components/chat/rt-chat.model';\n\n/**\n * Ключи подписей статусов для скринридера: сам индикатор — иконка, и без текста\n * различие «доставлено/прочитано» слышно не будет.\n *\n * Пайп отдаёт ключ, а переводит его `transloco` следующим звеном цепочки.\n * Готовый текст здесь застыл бы на языке, активном в момент загрузки модуля.\n */\nconst STATUS_KEYS: Readonly<Record<ERtChatMessageStatus, string>> = {\n [ERtChatMessageStatus.Sending]: 'rtKit.chatStatusSending',\n [ERtChatMessageStatus.Sent]: 'rtKit.chatStatusSent',\n [ERtChatMessageStatus.Read]: 'rtKit.chatStatusRead',\n [ERtChatMessageStatus.Failed]: 'rtKit.chatStatusFailed',\n};\n\n/** Ключ текстовой расшифровки иконки статуса сообщения. */\n@Pipe({ name: 'rtChatStatusLabel' })\nexport class RtChatStatusLabelPipe implements PipeTransform {\n public transform(status: ERtChatMessageStatus): string {\n return STATUS_KEYS[status];\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n output,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtButtonDirective } from '../button/rt-button.directive';\nimport { IRtConfirmPopover } from './rt-confirm-popover.model';\n\nconst BEM_BLOCK: string = 'rt-confirm-popover';\n\n/**\n * Презентационная панель подтверждения. Рендерится директивой `[rtConfirm]`\n * через CDK `ComponentPortal` под host-кнопкой. Содержит опциональный заголовок,\n * текст вопроса и две кнопки: «Отмена» (text/secondary) и подтверждающую\n * (`tone` — danger по умолчанию для деструктивных действий).\n *\n * `ViewEncapsulation.None` — стили префиксованы `.rt-confirm-popover`. Inputs\n * выставляются директивой через `setInput`; outputs (`confirm`/`cancel`) она\n * слушает и транслирует в `(confirmed)` / закрытие.\n */\n@Component({\n selector: 'rt-confirm-popover',\n templateUrl: './rt-confirm-popover.component.html',\n styleUrl: './rt-confirm-popover.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtButtonDirective, BlockDirective, ElemDirective],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtConfirmPopoverComponent {\n readonly #t_uiConfirm: Signal<string> = translateSignal('rtKit.uiConfirm');\n readonly #t_uiCancel: Signal<string> = translateSignal('rtKit.uiCancel');\n\n protected readonly confirmText: Signal<string> = computed((): string => this.confirmLabel() || this.#t_uiConfirm());\n protected readonly cancelText: Signal<string> = computed((): string => this.cancelLabel() || this.#t_uiCancel());\n\n public readonly message: InputSignal<string> = input<string>('');\n\n public readonly title: InputSignal<string | null> = input<string | null>(null);\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly confirmLabel: InputSignal<string> = input<string>('');\n\n public readonly cancelLabel: InputSignal<string> = input<string>('');\n\n public readonly tone: InputSignal<IRtConfirmPopover.Tone> = input<IRtConfirmPopover.Tone>('danger');\n\n public readonly accepted: OutputEmitterRef<void> = output<void>();\n\n public readonly cancelled: OutputEmitterRef<void> = output<void>();\n\n protected onConfirm(): void {\n this.accepted.emit();\n }\n\n protected onCancel(): void {\n this.cancelled.emit();\n }\n}\n","<ng-container rtBlock=\"rt-confirm-popover\">\n @if (title()) {\n <p rtElem=\"title\">{{ title() }}</p>\n }\n\n <p rtElem=\"message\">{{ message() }}</p>\n\n <div rtElem=\"actions\">\n <button\n rtButton\n qa-dataid=\"confirm-cancel\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n [label]=\"cancelText()\"\n [attr.aria-label]=\"cancelText()\"\n (click)=\"onCancel()\"></button>\n <button\n rtButton\n qa-dataid=\"confirm-accept\"\n type=\"button\"\n [theme]=\"tone()\"\n [label]=\"confirmText()\"\n [attr.aria-label]=\"confirmText()\"\n (click)=\"onConfirm()\"></button>\n </div>\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n ConnectedPosition,\n FlexibleConnectedPositionStrategy,\n Overlay,\n OverlayConfig,\n OverlayRef,\n ScrollStrategyOptions,\n} from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n booleanAttribute,\n ComponentRef,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n OnDestroy,\n output,\n OutputEmitterRef,\n signal,\n Signal,\n WritableSignal,\n} from '@angular/core';\nimport { outputToObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { map, merge, Observable, Subject, switchMap } from 'rxjs';\n\nimport { RtConfirmPopoverComponent } from './rt-confirm-popover.component';\nimport { IRtConfirmPopover } from './rt-confirm-popover.model';\n\nconst VIEWPORT_MARGIN: number = 8;\n\n/**\n * Confirm-popover директива поверх CDK Overlay. Вешается на host-кнопку\n * (обычно `rt-icon-button` деструктивного действия). По клику показывает прямо\n * под кнопкой панель `rt-confirm-popover` с вопросом и кнопками\n * «Отмена» / подтверждение. Подтверждение → `(confirmed)` + закрытие; отмена,\n * outside-click, Escape → просто закрытие.\n *\n * Движок — CDK `flexibleConnectedTo` (end-выравнивание + flip), чтобы панель у\n * правого края aside'а раскрывалась влево и не резалась `overflow: hidden`.\n *\n * @example\n * ```html\n * <rt-icon-button\n * icon=\"ico-error\"\n * variant=\"danger\"\n * ariaLabel=\"Отклонить\"\n * tooltip=\"Отклонить\"\n * [rtConfirm]=\"'Отклонить заявку? Оператор получит уведомление.'\"\n * rtConfirmTitle=\"Отклонить заявку\"\n * rtConfirmLabel=\"Отклонить\"\n * (confirmed)=\"rejectTour()\" />\n * ```\n */\n@Directive({\n selector: '[rtConfirm]',\n exportAs: 'rtConfirm',\n host: {\n '(click)': 'onHostClick()',\n },\n})\nexport class RtConfirmDirective implements OnDestroy {\n readonly #overlay: Overlay = inject(Overlay);\n readonly #elementRef: ElementRef<HTMLElement> = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly #scrollStrategies: ScrollStrategyOptions = inject(ScrollStrategyOptions);\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n readonly #overlayCreatedSource: Subject<OverlayRef> = new Subject<OverlayRef>();\n readonly #panelAttachedSource: Subject<ComponentRef<RtConfirmPopoverComponent>> = new Subject<\n ComponentRef<RtConfirmPopoverComponent>\n >();\n\n #overlayRef: OverlayRef | null = null;\n #panelRef: ComponentRef<RtConfirmPopoverComponent> | null = null;\n\n protected readonly isOpenState: WritableSignal<boolean> = signal<boolean>(false);\n\n public readonly message: InputSignal<string> = input<string>('', { alias: 'rtConfirm' });\n\n public readonly title: InputSignal<string | null> = input<string | null>(null, {\n alias: 'rtConfirmTitle',\n });\n\n /** Пусто — панель подставит переведённое умолчание */\n public readonly label: InputSignal<string> = input<string>('', {\n alias: 'rtConfirmLabel',\n });\n\n public readonly cancelLabel: InputSignal<string> = input<string>('', {\n alias: 'rtConfirmCancelLabel',\n });\n\n public readonly tone: InputSignal<IRtConfirmPopover.Tone> = input<IRtConfirmPopover.Tone>('danger', { alias: 'rtConfirmTone' });\n\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n alias: 'rtConfirmDisabled',\n transform: booleanAttribute,\n });\n\n public readonly confirmed: OutputEmitterRef<void> = output<void>();\n\n public readonly isOpen: Signal<boolean> = this.isOpenState.asReadonly();\n\n constructor() {\n // Per-attach подписки на outputs панели (accepted / cancelled) живут в\n // одном конструкторном стриме: open() эмитит свежий ComponentRef,\n // switchMap переключается на его outputs (предыдущая панель к этому\n // моменту уже detach'нута — outputs комплитятся при destroy componentRef).\n // Бэкстоп takeUntilDestroyed — на жизнь директивы.\n this.#panelAttachedSource\n .pipe(\n switchMap((panelRef: ComponentRef<RtConfirmPopoverComponent>): Observable<() => void> =>\n merge(\n outputToObservable(panelRef.instance.accepted).pipe(\n map((): (() => void) => (): void => {\n this.confirmed.emit();\n this.close();\n })\n ),\n outputToObservable(panelRef.instance.cancelled).pipe(map((): (() => void) => (): void => this.close()))\n )\n ),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe((handleCloseIntent: () => void): void => handleCloseIntent());\n\n // Outside-click / ESC подписки на единожды создаваемый overlay:\n // #ensureOverlay эмитит OverlayRef после создания (ровно один раз за\n // жизнь директивы), стрим живёт до destroy директивы.\n this.#overlayCreatedSource\n .pipe(\n switchMap((overlayRef: OverlayRef): Observable<() => void> =>\n merge(\n overlayRef.outsidePointerEvents().pipe(\n map((event: MouseEvent): (() => void) => (): void => {\n // Клик по host обрабатывает onHostClick (toggle) — не закрываем\n // здесь, иначе двойной toggle.\n if (this.#elementRef.nativeElement.contains(event.target as Node)) {\n return;\n }\n this.close();\n })\n ),\n overlayRef.keydownEvents().pipe(\n map((event: KeyboardEvent): (() => void) => (): void => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n }\n })\n )\n )\n ),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe((handleCloseIntent: () => void): void => handleCloseIntent());\n }\n\n public ngOnDestroy(): void {\n this.#disposeOverlay();\n }\n\n public open(): void {\n if (this.disabled() || this.isOpenState() || this.message().trim() === '') {\n return;\n }\n const overlayRef: OverlayRef = this.#ensureOverlay();\n const portal: ComponentPortal<RtConfirmPopoverComponent> = new ComponentPortal(RtConfirmPopoverComponent);\n this.#panelRef = overlayRef.attach(portal);\n this.#panelRef.setInput('message', this.message());\n this.#panelRef.setInput('title', this.title());\n this.#panelRef.setInput('confirmLabel', this.label());\n this.#panelRef.setInput('cancelLabel', this.cancelLabel());\n this.#panelRef.setInput('tone', this.tone());\n\n // Подписки на accepted/cancelled объявлены один раз в конструкторе —\n // здесь только эмит свежего ComponentRef (см. #panelAttachedSource-стрим).\n this.#panelAttachedSource.next(this.#panelRef);\n\n this.isOpenState.set(true);\n }\n\n public close(): void {\n if (!this.isOpenState()) {\n return;\n }\n this.#overlayRef?.detach();\n this.#panelRef = null;\n this.isOpenState.set(false);\n }\n\n protected onHostClick(): void {\n if (this.disabled()) {\n return;\n }\n if (this.isOpenState()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n #ensureOverlay(): OverlayRef {\n if (this.#overlayRef !== null) {\n return this.#overlayRef;\n }\n const positions: ConnectedPosition[] = [\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 6,\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -6,\n },\n ];\n const positionStrategy: FlexibleConnectedPositionStrategy = this.#overlay\n .position()\n .flexibleConnectedTo(this.#elementRef)\n .withPush(true)\n .withViewportMargin(VIEWPORT_MARGIN)\n .withFlexibleDimensions(false)\n .withPositions(positions);\n\n const config: OverlayConfig = new OverlayConfig({\n positionStrategy,\n scrollStrategy: this.#scrollStrategies.reposition(),\n hasBackdrop: false,\n panelClass: 'rt-confirm-popover-panel',\n });\n const overlayRef: OverlayRef = this.#overlay.create(config);\n\n // Outside-click / ESC подписки объявлены один раз в конструкторе —\n // здесь только эмит созданного OverlayRef (см. #overlayCreatedSource-стрим).\n this.#overlayCreatedSource.next(overlayRef);\n\n this.#overlayRef = overlayRef;\n return overlayRef;\n }\n\n #disposeOverlay(): void {\n this.#overlayRef?.dispose();\n this.#overlayRef = null;\n this.#panelRef = null;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, effect, ElementRef, inject, input, InputSignal, ViewEncapsulation } from '@angular/core';\n\nimport { IQuillDelta, IQuillDeltaAttributes } from '../../util';\n\nconst BEM_BLOCK: string = 'rt-delta-view';\n\n/** Inline-атрибут → оборачивающий тег. Порядок задаёт вложенность обёрток. */\nconst INLINE_TAGS: ReadonlyArray<[keyof IQuillDeltaAttributes, string]> = [\n ['bold', 'strong'],\n ['italic', 'em'],\n ['underline', 'u'],\n ['strike', 's'],\n];\n\n/** Одна строка треда: накопленные inline-узлы + атрибуты завершающего перевода строки. */\ninterface IDeltaLine {\n nodes: Node[];\n attrs?: IQuillDeltaAttributes;\n}\n\n/**\n * Безопасный рендер Quill delta: обход ops со сборкой DOM через нативный API\n * (`createElement`/`createTextNode` — текст экранируется автоматически). Никакого\n * `innerHTML`: содержимое `insert` — произвольный пользовательский текст. Блочные\n * атрибуты (list/header/blockquote/code-block) Quill вешает на op перевода строки —\n * накопленный inline-буфер закрывается этим блоком.\n */\n@Component({\n selector: 'rt-delta-view',\n template: '',\n styleUrl: './rt-delta-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtDeltaViewComponent {\n readonly #doc: Document = inject(DOCUMENT);\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n\n public readonly delta: InputSignal<IQuillDelta | null> = input<IQuillDelta | null>(null);\n\n constructor() {\n effect((): void => {\n const value: IQuillDelta | null = this.delta();\n const host: HTMLElement = this.#host.nativeElement;\n host.textContent = '';\n if (value !== null) {\n host.appendChild(this.#build(value));\n }\n });\n }\n\n /** Собирает фрагмент из строк delta, группируя подряд идущие list-элементы. */\n #build(delta: IQuillDelta): DocumentFragment {\n const fragment: DocumentFragment = this.#doc.createDocumentFragment();\n let list: HTMLElement | null = null;\n for (const line of this.#splitLines(delta)) {\n const listType: 'ordered' | 'bullet' | undefined = line.attrs?.list;\n if (listType !== undefined) {\n list = this.#appendListItem(fragment, list, line, listType);\n continue;\n }\n list = null;\n fragment.appendChild(this.#blockElement(line));\n }\n return fragment;\n }\n\n /** Разбивает ops на строки по `\\n`: inline-текст копится, `\\n` закрывает строку. */\n #splitLines(delta: IQuillDelta): IDeltaLine[] {\n const lines: IDeltaLine[] = [];\n let buffer: Node[] = [];\n for (const op of delta.ops) {\n const parts: string[] = op.insert.split('\\n');\n parts.forEach((part: string, index: number): void => {\n if (part.length > 0) {\n buffer.push(this.#inlineNode(part, op.attributes));\n }\n if (index < parts.length - 1) {\n lines.push({ nodes: buffer, attrs: op.attributes });\n buffer = [];\n }\n });\n }\n if (buffer.length > 0) {\n lines.push({ nodes: buffer });\n }\n return lines;\n }\n\n /** Текстовый узел, обёрнутый в inline-теги по whitelist-атрибутам. */\n #inlineNode(text: string, attrs: IQuillDeltaAttributes | undefined): Node {\n let node: Node = this.#doc.createTextNode(text);\n for (const [attr, tag] of INLINE_TAGS) {\n if (attrs?.[attr] === true) {\n const wrapper: HTMLElement = this.#doc.createElement(tag);\n wrapper.appendChild(node);\n node = wrapper;\n }\n }\n return node;\n }\n\n /** Блочный элемент строки (header/blockquote/code-block/абзац). */\n #blockElement(line: IDeltaLine): HTMLElement {\n if (line.attrs?.['code-block'] === true) {\n const pre: HTMLElement = this.#doc.createElement('pre');\n const code: HTMLElement = this.#doc.createElement('code');\n this.#fill(code, line.nodes);\n pre.appendChild(code);\n return pre;\n }\n const element: HTMLElement = this.#doc.createElement(this.#blockTag(line.attrs));\n this.#fill(element, line.nodes);\n return element;\n }\n\n /** Тег блока по whitelist-атрибутам перевода строки. */\n #blockTag(attrs: IQuillDeltaAttributes | undefined): string {\n if (attrs?.header !== undefined) {\n return `h${attrs.header}`;\n }\n if (attrs?.blockquote === true) {\n return 'blockquote';\n }\n return 'p';\n }\n\n /** Обеспечивает список нужного типа и добавляет в него элемент строки. */\n #appendListItem(\n fragment: DocumentFragment,\n current: HTMLElement | null,\n line: IDeltaLine,\n listType: 'ordered' | 'bullet'\n ): HTMLElement {\n const tag: string = listType === 'ordered' ? 'ol' : 'ul';\n let list: HTMLElement | null = current;\n if (list === null || list.tagName.toLowerCase() !== tag) {\n list = this.#doc.createElement(tag);\n fragment.appendChild(list);\n }\n const item: HTMLElement = this.#doc.createElement('li');\n this.#fill(item, line.nodes);\n list.appendChild(item);\n return list;\n }\n\n #fill(element: HTMLElement, nodes: Node[]): void {\n for (const node of nodes) {\n element.appendChild(node);\n }\n }\n}\n","/**\n * Подпись по умолчанию, когда из URL не удалось извлечь имя файла. Нейтральная\n * и непереводимая: кит не знает языка потребителя, а видимую подпись\n * вызывающая сторона передаёт вторым аргументом.\n */\nconst DEFAULT_ATTACHMENT_NAME: string = 'file';\n\n/**\n * Извлекает имя файла из URL: последний сегмент пути без query/fragment,\n * декодированный из percent-encoding. Нужен для вложений, у которых источник\n * отдаёт только ссылку на скачивание без метаданных (имени/размера).\n *\n * @param url Ссылка на файл. Пустая/`null` → `fallback`.\n * @param fallback Что вернуть, если сегмент пустой или URL не распарсился.\n */\nexport function fileNameFromUrl(url: string | null | undefined, fallback: string = DEFAULT_ATTACHMENT_NAME): string {\n if (!url) {\n return fallback;\n }\n\n const path: string = url.split('?')[0].split('#')[0];\n // У абсолютных URL имя файла живёт только в pathname — отбрасываем протокол и хост,\n // иначе для ссылки без пути (\"https://host/\") именем стал бы сам хост.\n let pathname: string = path;\n const schemeIdx: number = path.indexOf('://');\n if (schemeIdx !== -1) {\n const slashIdx: number = path.indexOf('/', schemeIdx + 3);\n pathname = slashIdx === -1 ? '' : path.slice(slashIdx);\n }\n const segment: string = pathname.split('/').filter(Boolean).pop() ?? '';\n if (!segment) {\n return fallback;\n }\n\n try {\n return decodeURIComponent(segment);\n } catch {\n // Некорректный percent-encoding — показываем сегмент как есть.\n return segment;\n }\n}\n","/**\n * Форматирует размер файла в байтах в человекочитаемую строку (SI, base-1000).\n *\n * Используется десятичная система (1 кБ = 1000 Б), а не двоичная (KiB), —\n * так размер совпадает с тем, что показывает большинство ОС и файловых менеджеров.\n * Единицы — латиницей (`B` / `kB` / `MB` / `GB`), как в макете карточки файла.\n *\n * @param bytes Размер в байтах. `null`/`undefined`/`NaN`/отрицательное → пустая строка\n * (caller сам решает, скрывать бейдж или нет).\n * @returns Строка вида `\"82 kB\"`, `\"1.4 MB\"` или `\"\"`, если размер неизвестен.\n */\nexport function formatFileSize(bytes: number | null | undefined): string {\n if (bytes === null || bytes === undefined || Number.isNaN(bytes) || bytes < 0) {\n return '';\n }\n\n if (bytes < 1_000) {\n return `${bytes} B`;\n }\n\n if (bytes < 1_000_000) {\n return `${Math.round(bytes / 1_000)} kB`;\n }\n\n if (bytes < 1_000_000_000) {\n return `${(bytes / 1_000_000).toFixed(1)} MB`;\n }\n\n return `${(bytes / 1_000_000_000).toFixed(1)} GB`;\n}\n","import { IQuillDelta, IQuillDeltaAttributes, IQuillDeltaOp } from './quill-delta.model';\n\n/** Значение — ровно `true` (флаговые атрибуты). */\nfunction isTrue(value: unknown): boolean {\n return value === true;\n}\n\n/** Per-key валидаторы whitelist: ключа нет в карте ⇒ атрибут запрещён. */\nconst ATTR_VALIDATORS: ReadonlyMap<string, (value: unknown) => boolean> = new Map<string, (value: unknown) => boolean>([\n ['bold', isTrue],\n ['italic', isTrue],\n ['underline', isTrue],\n ['strike', isTrue],\n ['blockquote', isTrue],\n ['code-block', isTrue],\n ['list', (value: unknown): boolean => value === 'ordered' || value === 'bullet'],\n ['header', (value: unknown): boolean => value === 1 || value === 2 || value === 3],\n]);\n\n/** Объект без прототипных сюрпризов — узкая guard-проверка. */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\n/** Все ключи атрибутов — из whitelist и с валидным значением. */\nfunction isValidAttributes(raw: Record<string, unknown>): boolean {\n return Object.keys(raw).every((key: string): boolean => {\n const validate: ((value: unknown) => boolean) | undefined = ATTR_VALIDATORS.get(key);\n return validate !== undefined && validate(raw[key]);\n });\n}\n\n/** Нормализует одну op; `null` — если форма нарушена (весь delta тогда отвергается). */\nfunction normalizeOp(op: unknown): IQuillDeltaOp | null {\n if (!isRecord(op)) {\n return null;\n }\n const insert: unknown = op['insert'];\n if (typeof insert !== 'string') {\n return null;\n }\n if (Object.keys(op).some((key: string): boolean => key !== 'insert' && key !== 'attributes')) {\n return null;\n }\n const attrs: unknown = op['attributes'];\n if (attrs === undefined) {\n return { insert };\n }\n if (!isRecord(attrs) || Object.keys(attrs).length === 0 || !isValidAttributes(attrs)) {\n return null;\n }\n return { insert, attributes: attrs as unknown as IQuillDeltaAttributes };\n}\n\n/**\n * Приводит сырой вывод Quill 2 к контракту `IQuillDelta`. Quill 2 хранит в\n * `code-block` язык подсветки (по умолчанию строку `\"plain\"`), тогда как контракт\n * и бэк ждут флаг `true`; без приведения бэк отвергает delta как\n * `invalid_message_delta`. Остальные атрибуты уже в нужной форме — их не трогаем.\n */\nexport function coerceQuillDeltaOutput(delta: IQuillDelta): IQuillDelta {\n return {\n ops: delta.ops.map((op: IQuillDeltaOp): IQuillDeltaOp => {\n const attrs: Record<string, unknown> | undefined = op.attributes as unknown as Record<string, unknown> | undefined;\n const codeBlock: unknown = attrs?.['code-block'];\n if (attrs === undefined || codeBlock === undefined || codeBlock === true) {\n return op;\n }\n return {\n ...op,\n attributes: { ...op.attributes, 'code-block': true },\n };\n }),\n };\n}\n\n/**\n * Defensive-нормализация тела rich-сообщения: пропускает только строго валидную\n * форму (top-level `{ops}`, `ops` непустой массив, `insert` — строка, `attributes`\n * непустой и из whitelist), иначе `null` — сообщение отрендерится plain-фолбэком\n * по `message`. Бэк гарантирует форму, но рендер не доверяет входу вслепую.\n */\nexport function normalizeQuillDelta(raw: unknown): IQuillDelta | null {\n if (!isRecord(raw)) {\n return null;\n }\n const ops: unknown = raw['ops'];\n if (!Array.isArray(ops) || ops.length === 0) {\n return null;\n }\n const clean: IQuillDeltaOp[] = [];\n for (const op of ops) {\n const normalized: IQuillDeltaOp | null = normalizeOp(op);\n if (normalized === null) {\n return null;\n }\n clean.push(normalized);\n }\n return { ops: clean };\n}\n","/**\n * Тело сообщения чата в rich-формате Quill delta. Форма и whitelist атрибутов\n * зафиксированы контрактом бэка: только текстовые вставки + ограниченный набор\n * форматирования, никаких ссылок и вложенных объектов (анонимность).\n */\n\n/** Атрибуты форматирования Quill delta — строго whitelist (без link/media). */\nexport interface IQuillDeltaAttributes {\n bold?: true;\n italic?: true;\n underline?: true;\n strike?: true;\n blockquote?: true;\n 'code-block'?: true;\n list?: 'ordered' | 'bullet';\n header?: 1 | 2 | 3;\n}\n\n/** Одна операция delta: текстовая вставка + опциональные атрибуты. */\nexport interface IQuillDeltaOp {\n insert: string;\n attributes?: IQuillDeltaAttributes;\n}\n\n/** Тело сообщения в rich-формате Quill delta. */\nexport interface IQuillDelta {\n ops: IQuillDeltaOp[];\n}\n","import { MonoTypeOperatorFunction, debounce, timer } from 'rxjs';\n\n/** Единый дебаунс полей поиска (мс) — одинаковый по всему киту. */\nexport const SEARCH_DEBOUNCE_MS: number = 300;\n\n/**\n * Дебаунс поля поиска с мгновенным сбросом. Непустой ввод откладывается на\n * SEARCH_DEBOUNCE_MS (не бить фильтром/запросом на каждый символ), пустое\n * значение — очистка крестиком или удаление до конца — применяется сразу,\n * без задержки. Иначе сброс поиска ощущается лагающим.\n */\nexport function searchDebounce(): MonoTypeOperatorFunction<string> {\n return debounce((value: string): ReturnType<typeof timer> => timer(value.trim() === '' ? 0 : SEARCH_DEBOUNCE_MS));\n}\n","import { IRtIcon } from '../icon/rt-icon.model';\n\n/** Иконка Word-семейства (несколько расширений делят один глиф). */\nconst ICON_WORD: IRtIcon.Name = 'attach-docx-doc';\n\n/** Иконка растровых изображений. */\nconst ICON_IMAGE: IRtIcon.Name = 'attach-jpg-png';\n\n/** Иконка презентаций. */\nconst ICON_PRESENTATION: IRtIcon.Name = 'attach-ppt-pptx';\n\n/** Иконка таблиц Excel-семейства. */\nconst ICON_SPREADSHEET: IRtIcon.Name = 'attach-xlsx-xls';\n\n/** Иконка архивов. */\nconst ICON_ARCHIVE: IRtIcon.Name = 'attach-zip-rar';\n\n/** Иконка web-форматов изображений/видео. */\nconst ICON_WEB_MEDIA: IRtIcon.Name = 'attach-webp';\n\n/**\n * Маппинг расширения файла → имя цветной иконки типа (`attach-*` в rt-icon-реестре).\n */\nconst FILE_TYPE_ICON: Readonly<Record<string, IRtIcon.Name>> = {\n doc: ICON_WORD,\n docx: ICON_WORD,\n odt: ICON_WORD,\n gif: ICON_IMAGE,\n jpg: ICON_IMAGE,\n jpeg: ICON_IMAGE,\n png: ICON_IMAGE,\n pdf: 'attach-pdf',\n ppt: ICON_PRESENTATION,\n pptx: ICON_PRESENTATION,\n txt: 'attach-txt',\n webp: ICON_WEB_MEDIA,\n webm: ICON_WEB_MEDIA,\n xls: ICON_SPREADSHEET,\n xlsx: ICON_SPREADSHEET,\n zip: ICON_ARCHIVE,\n rar: ICON_ARCHIVE,\n msg: 'attach-msg',\n eml: 'attach-eml',\n};\n\n/**\n * Возвращает имя иконки типа файла по его имени (берётся расширение после\n * последней точки). Неизвестное/отсутствующее расширение → нейтральный `attach-other`.\n */\nexport function getFileTypeIcon(fileName: string): IRtIcon.Name {\n const ext: string = fileName.split('.').pop()?.toLowerCase() ?? '';\n return FILE_TYPE_ICON[ext] ?? 'attach-other';\n}\n\n/**\n * Выводит читаемый заголовок из имени файла: отбрасывает расширение и заменяет\n * разделители `_`/`-` на пробелы (CamelCase намеренно НЕ разбивается — это давало\n * бы непредсказуемый результат на произвольных именах). Если после очистки строка\n * пустая (например имя было `.pdf`) — возвращается исходное имя.\n */\nexport function deriveFileTitle(fileName: string): string {\n const withoutExt: string = fileName.replace(/\\.[^./\\\\]+$/, '');\n const cleaned: string = withoutExt.replace(/[_-]+/g, ' ').replace(/\\s+/g, ' ').trim();\n return cleaned || fileName;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/** Многоточие, вставляемое в середину строки при усечении. */\nconst ELLIPSIS: string = '...';\n\n/** Длина строки по умолчанию, при которой включается усечение. */\nconst DEFAULT_MAX_LENGTH: number = 32;\n\n/**\n * Усекает длинное имя файла по середине, сохраняя расширение видимым:\n * `10588-1_EvaluationSearchReport.pdf` → `10588-1_EvaluationSearchRe...pdf`.\n *\n * Обычный CSS `text-overflow: ellipsis` режет хвост и теряет расширение —\n * поэтому усечение по середине делается здесь, а не в стилях. Усечение\n * посимвольное (не по ширине контейнера): предсказуемо и без измерений DOM.\n *\n * Pure-pipe: пересчитывается только при смене входа.\n */\n@Pipe({ name: 'rtTruncateMiddle' })\nexport class RtTruncateMiddlePipe implements PipeTransform {\n public transform(value: string | null | undefined, maxLength: number = DEFAULT_MAX_LENGTH): string {\n if (!value) {\n return '';\n }\n if (value.length <= maxLength) {\n return value;\n }\n\n const lastDot: number = value.lastIndexOf('.');\n const hasExt: boolean = lastDot > 0 && lastDot < value.length - 1;\n const ext: string = hasExt ? value.slice(lastDot + 1) : '';\n const base: string = hasExt ? value.slice(0, lastDot) : value;\n\n const headLength: number = maxLength - ext.length - ELLIPSIS.length;\n if (headLength <= 0) {\n // Расширение длиннее лимита — деградируем до простого усечения хвоста.\n return value.slice(0, Math.max(0, maxLength - ELLIPSIS.length)) + ELLIPSIS;\n }\n\n return base.slice(0, headLength) + ELLIPSIS + ext;\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { formatFileSize } from '../../util';\n\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { IRtIconButton } from '../icon-button/rt-icon-button.model';\nimport { RtIconComponent } from '../icon/rt-icon.component';\nimport { IRtIcon } from '../icon/rt-icon.model';\nimport { RtTooltipDirective } from '../tooltip/rt-tooltip.directive';\nimport { deriveFileTitle, getFileTypeIcon } from './file-card.helper';\nimport { IRtFileCard } from './rt-file-card.model';\nimport { RtTruncateMiddlePipe } from './rt-truncate-middle.pipe';\n\nconst BEM_BLOCK: string = 'rt-file-card';\n\n/** Иконка типа файла крупнее прочего: по ней карточку находят взглядом. */\nconst ICON_SIZES: Readonly<Record<IRtFileCard.Size, IRtIcon.Size>> = {\n sm: 'sm',\n md: 'xl',\n lg: 'xl',\n};\n\n/** Кнопки действий: в компактной карточке они не должны задавать её высоту. */\nconst ACTION_SIZES: Readonly<Record<IRtFileCard.Size, IRtIconButton.Size>> = {\n sm: 'sm',\n md: 'sm',\n lg: 'md',\n};\n\n/**\n * Карточка загруженного файла: цветная иконка типа, заголовок (выведенный из имени),\n * усечённое по середине имя файла, бейдж размера и опциональные действия справа\n * (скачать / переименовать / удалить).\n *\n * Презентационный компонент: сам ничего не решает, только эмиттит события действий.\n * Кнопки включаются точечно через `showDownload`/`showRemove`/`showRename` — в режиме\n * загрузки обычно нужен только remove, при показе сохранённых файлов — download.\n *\n * `showRename` по умолчанию выключен и сейчас нигде не включается: бэкенд не\n * поддерживает переименование (`original_name` неизменяем после создания). Вход\n * оставлен, чтобы кнопку можно было включить без правки компонента, когда появится API.\n */\n@Component({\n selector: 'rt-file-card',\n templateUrl: './rt-file-card.component.html',\n styleUrls: ['./rt-file-card.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconComponent,\n RtIconButtonComponent,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n\n // pipes\n RtTruncateMiddlePipe,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-file-card--sm]': \"size() === 'sm'\",\n '[class.rt-file-card--md]': \"size() === 'md'\",\n '[class.rt-file-card--lg]': \"size() === 'lg'\",\n },\n})\nexport class RtFileCardComponent {\n /** Имя цветной иконки типа файла по расширению. */\n protected readonly iconName: Signal<IRtIcon.Name> = computed((): IRtIcon.Name => getFileTypeIcon(this.name()));\n\n /** Заголовок карточки, выведенный из имени файла (без расширения, разделители → пробелы). */\n protected readonly title: Signal<string> = computed((): string => deriveFileTitle(this.name()));\n\n /** Отформатированный размер; пустая строка → размер неизвестен. */\n protected readonly sizeLabel: Signal<string> = computed((): string => formatFileSize(this.sizeBytes()));\n\n /** Показывать ли бейдж размера. */\n protected readonly hasSize: Signal<boolean> = computed((): boolean => this.sizeLabel() !== '');\n\n /** Размер иконки типа файла — маппится от размера карточки. */\n protected readonly iconSize: Signal<IRtIcon.Size> = computed((): IRtIcon.Size => ICON_SIZES[this.size()]);\n\n /** Размер кнопок действий — маппится от размера карточки. */\n protected readonly actionSize: Signal<IRtIconButton.Size> = computed((): IRtIconButton.Size => ACTION_SIZES[this.size()]);\n\n /** Имя файла с расширением — обязательно. */\n public readonly name: InputSignal<string> = input.required<string>();\n\n /** Размер в байтах. `null` → бейдж размера скрыт. */\n public readonly sizeBytes: InputSignal<number | null> = input<number | null>(null);\n\n /** Плотность карточки: `sm` для тесных мест вроде композера, `lg` — для страниц. */\n public readonly size: InputSignal<IRtFileCard.Size> = input<IRtFileCard.Size>('md');\n\n /** Показывать кнопку скачивания. */\n public readonly showDownload: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Показывать кнопку удаления. */\n public readonly showRemove: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Показывать кнопку переименования (отключена до появления API на бэке). */\n public readonly showRename: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Блокирует кнопки действий (например, во время сабмита формы). */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Запрошено скачивание файла. */\n public readonly download: OutputEmitterRef<void> = output<void>();\n\n /** Запрошено удаление файла. */\n public readonly removed: OutputEmitterRef<void> = output<void>();\n\n /** Запрошено переименование файла. */\n public readonly rename: OutputEmitterRef<void> = output<void>();\n\n protected onDownload(): void {\n this.download.emit();\n }\n\n protected onRemove(): void {\n this.removed.emit();\n }\n\n protected onRename(): void {\n this.rename.emit();\n }\n}\n","<ng-container rtBlock=\"rt-file-card\">\n <rt-icon rtElem=\"icon\" [size]=\"iconSize()\" [name]=\"iconName()\" />\n\n <span rtElem=\"text\">\n <span rtElem=\"title\" qa-dataid=\"file-card-title\" [rtTooltip]=\"title()\">{{ title() }}</span>\n <span rtElem=\"name\" qa-dataid=\"file-card-name\">{{ name() | rtTruncateMiddle }}</span>\n </span>\n\n <span rtElem=\"meta\">\n @if (hasSize()) {\n <span rtElem=\"size\" qa-dataid=\"file-card-size\">{{ sizeLabel() }}</span>\n }\n\n @if (showDownload()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"file-card-download\"\n icon=\"ico-download\"\n variant=\"ghost\"\n [ariaLabel]=\"'rtKit.uiDownload' | transloco\"\n [tooltip]=\"'rtKit.uiDownload' | transloco\"\n [size]=\"actionSize()\"\n [disabled]=\"disabled()\"\n (clicked)=\"onDownload()\" />\n }\n\n @if (showRename()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"file-card-rename\"\n icon=\"ico-edit\"\n variant=\"ghost\"\n [ariaLabel]=\"'rtKit.uiRename' | transloco\"\n [tooltip]=\"'rtKit.uiRename' | transloco\"\n [size]=\"actionSize()\"\n [disabled]=\"disabled()\"\n (clicked)=\"onRename()\" />\n }\n\n @if (showRemove()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"file-card-remove\"\n icon=\"ico-trash\"\n variant=\"ghost\"\n [ariaLabel]=\"'rtKit.uiRemove' | transloco\"\n [tooltip]=\"'rtKit.uiRemove' | transloco\"\n [size]=\"actionSize()\"\n [disabled]=\"disabled()\"\n (clicked)=\"onRemove()\" />\n }\n </span>\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n HostListener,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { IRtFileDrop } from './rt-file-drop.model';\n\nconst BEM_BLOCK: string = 'rt-file-drop';\n\n/** Задержка скрытия оверлея: dragleave стреляет при переходе между дочерними\n элементами, без debounce рамка мерцает. */\nconst DRAG_LEAVE_DEBOUNCE_MS: number = 80;\n\n/**\n * Зона перетаскивания файлов: оборачивает произвольный контент через\n * content-projection и превращает его в drop-зону. При перетаскивании файла над\n * областью рисует приглушающий оверлей-приглашение поверх контента, на drop —\n * эмитит выброшенные файлы через `(filesDropped)`.\n *\n * Мультизонный режим: при непустом `zones` оверлей делится на вертикальную стопку\n * равных зон с подписями; зона под курсором подсвечивается, drop эмитится через\n * `(zoneFilesDropped)` с id зоны (а `(filesDropped)` в этом режиме НЕ эмитится).\n * Зона курсора вычисляется по Y-координате против host-rect — оверлей остаётся\n * pointer-events:none, drag-события продолжают идти в host-listener'ы.\n *\n * `accept` (формат как у нативного input[accept]) отфильтровывает неподходящие\n * файлы до эмита — drop в обход файл-пикера не проносит запрещённые расширения;\n * отбрасывание молчаливое, как у самого пикера.\n *\n * Слушает drag-события на собственном host'е (всплывают со всего спроецированного\n * контента), гасит браузерный навигейт по файлу и принимает только перетаскивание\n * файлов (а не внутренний drag элементов формы). Потребитель управляет приёмом\n * через `[disabled]` (например «активна вкладка файлов и форма редактируема») и\n * сам решает, что делать с файлами — компонент состояние файлов не хранит.\n *\n * Оверлей `pointer-events: none` — не перехватывает drag/drop, события доходят до\n * host-listener'ов.\n */\n@Component({\n selector: 'rt-file-drop',\n templateUrl: './rt-file-drop.component.html',\n styleUrl: './rt-file-drop.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 RtFileDropComponent {\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n\n readonly #t_uiFileDropOverlay: Signal<string> = translateSignal('rtKit.uiFileDropOverlay');\n\n #dragLeaveTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Активна ли подсветка drop-зоны (файл тащат над областью). */\n protected readonly isDragging: WritableSignal<boolean> = signal(false);\n\n /** Зона под курсором в мультизонном режиме (id из `zones`). */\n protected readonly activeZoneId: WritableSignal<string | null> = signal(null);\n\n protected readonly hasZones: Signal<boolean> = computed((): boolean => this.zones().length > 0);\n\n protected readonly overlayText: Signal<string> = computed((): string => this.overlayLabel() || this.#t_uiFileDropOverlay());\n\n /** Приём drop'а выключен (потребитель решает по своему контексту). */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly overlayLabel: InputSignal<string> = input<string>('');\n\n /** Мультизонный режим: непустой список зон делит оверлей на стопку целей. */\n public readonly zones: InputSignal<readonly IRtFileDrop.Zone[]> = input<readonly IRtFileDrop.Zone[]>([]);\n\n /** Фильтр расширений/MIME (формат нативного input[accept]); пусто — без фильтра. */\n public readonly accept: InputSignal<string> = input<string>('');\n\n public readonly filesDropped: OutputEmitterRef<File[]> = output<File[]>();\n\n /** Drop в мультизонном режиме: файлы + id зоны, куда их бросили. */\n public readonly zoneFilesDropped: OutputEmitterRef<IRtFileDrop.ZoneDrop> = output<IRtFileDrop.ZoneDrop>();\n\n public readonly draggingChange: OutputEmitterRef<boolean> = output<boolean>();\n\n constructor() {\n this.#destroyRef.onDestroy((): void => this.#clearLeaveTimer());\n }\n\n @HostListener('dragenter', ['$event'])\n @HostListener('dragover', ['$event'])\n protected onDragOver(event: DragEvent): void {\n if (this.disabled() || !this.#isFileDrag(event)) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'copy';\n }\n this.#clearLeaveTimer();\n this.#setDragging(true);\n if (this.hasZones()) {\n this.activeZoneId.set(this.#zoneIdAt(event.clientY));\n }\n }\n\n @HostListener('dragleave', ['$event'])\n protected onDragLeave(event: DragEvent): void {\n if (!this.isDragging()) {\n return;\n }\n event.preventDefault();\n this.#clearLeaveTimer();\n this.#dragLeaveTimer = setTimeout((): void => {\n this.#dragLeaveTimer = null;\n this.#setDragging(false);\n }, DRAG_LEAVE_DEBOUNCE_MS);\n }\n\n @HostListener('drop', ['$event'])\n protected onDrop(event: DragEvent): void {\n if (this.disabled() || !this.#isFileDrag(event)) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n this.#clearLeaveTimer();\n this.#setDragging(false);\n\n const files: File[] = Array.from(event.dataTransfer?.files ?? []).filter((file: File): boolean => this.#matchesAccept(file));\n if (files.length === 0) {\n return;\n }\n if (!this.hasZones()) {\n this.filesDropped.emit(files);\n return;\n }\n const zoneId: string | null = this.#zoneIdAt(event.clientY);\n if (zoneId === null) {\n return;\n }\n this.zoneFilesDropped.emit({ zoneId, files });\n }\n\n /** Меняет dragging-флаг и эмитит изменение только при реальном переходе. */\n #setDragging(value: boolean): void {\n if (this.isDragging() === value) {\n return;\n }\n this.isDragging.set(value);\n this.draggingChange.emit(value);\n if (!value) {\n this.activeZoneId.set(null);\n }\n }\n\n /** Зона по Y-координате курсора: стопка равных по высоте полос host-rect. */\n #zoneIdAt(clientY: number): string | null {\n const zones: readonly IRtFileDrop.Zone[] = this.zones();\n if (zones.length === 0) {\n return null;\n }\n const rect: DOMRect = this.#host.nativeElement.getBoundingClientRect();\n if (rect.height <= 0) {\n return zones[0].id;\n }\n const ratio: number = (clientY - rect.top) / rect.height;\n const index: number = Math.min(zones.length - 1, Math.max(0, Math.floor(ratio * zones.length)));\n return zones[index].id;\n }\n\n /** Файл проходит accept-фильтр (расширение `.pdf` / MIME `image/png` / `image/*`). */\n #matchesAccept(file: File): boolean {\n const accept: string = this.accept().trim();\n if (accept === '') {\n return true;\n }\n const name: string = file.name.toLowerCase();\n const mime: string = file.type.toLowerCase();\n return accept.split(',').some((raw: string): boolean => {\n const token: string = raw.trim().toLowerCase();\n if (token === '') {\n return false;\n }\n if (token.startsWith('.')) {\n return name.endsWith(token);\n }\n if (token.endsWith('/*')) {\n return mime.startsWith(token.slice(0, -1));\n }\n return mime === token;\n });\n }\n\n /** Перетаскивают именно файлы (а не внутренний drag элементов формы). */\n #isFileDrag(event: DragEvent): boolean {\n const types: readonly string[] | undefined = event.dataTransfer?.types;\n return types?.includes('Files') ?? false;\n }\n\n #clearLeaveTimer(): void {\n if (this.#dragLeaveTimer !== null) {\n clearTimeout(this.#dragLeaveTimer);\n this.#dragLeaveTimer = null;\n }\n }\n}\n","<ng-container rtBlock=\"rt-file-drop\">\n <ng-content />\n\n @if (isDragging()) {\n <div rtElem=\"overlay\" qa-dataid=\"file-drop-overlay\" aria-hidden=\"true\" [rtMod]=\"{ zoned: hasZones() }\">\n @if (hasZones()) {\n @for (zone of zones(); track zone.id) {\n <div\n rtElem=\"zone\"\n qa-dataid=\"file-drop-zone\"\n [attr.data-zone]=\"zone.id\"\n [attr.data-active]=\"activeZoneId() === zone.id\"\n [rtMod]=\"{ active: activeZoneId() === zone.id }\">\n <span rtElem=\"label\" qa-dataid=\"file-drop-zone-label\">{{ zone.label }}</span>\n @if (zone.sublabel) {\n <span rtElem=\"sublabel\" qa-dataid=\"file-drop-zone-sublabel\">{{ zone.sublabel }}</span>\n }\n </div>\n }\n } @else {\n <div rtElem=\"frame\" qa-dataid=\"file-drop-frame\">\n <span rtElem=\"label\" qa-dataid=\"file-drop-label\">{{ overlayText() }}</span>\n </div>\n }\n </div>\n }\n</ng-container>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n input,\n InputSignal,\n OnDestroy,\n output,\n OutputEmitterRef,\n Signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport type Quill from 'quill';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { coerceQuillDeltaOutput, IQuillDelta, IQuillDeltaOp } from '../../util';\n\nimport { RtFormControlBase } from '../form-control/rt-form-control.base';\n\nconst BEM_BLOCK: string = 'rt-rich-editor';\n\n/**\n * Режим тулбара: `full` — весь whitelist, `minimal` — жирный + два списка\n * (G113: чаты оператора/админа/саппорта).\n */\nexport type IRtRichEditorToolbar = 'full' | 'minimal';\n\n/** Модули тулбара — строго whitelist (без link/image/color/script). */\nconst TOOLBAR: Record<IRtRichEditorToolbar, readonly unknown[]> = {\n full: [\n ['bold', 'italic', 'underline', 'strike'],\n [{ header: 1 }, { header: 2 }, { header: 3 }],\n [{ list: 'ordered' }, { list: 'bullet' }],\n ['blockquote', 'code-block'],\n ],\n minimal: [['bold'], [{ list: 'ordered' }, { list: 'bullet' }]],\n};\n\n/** Форматы, которые Quill вообще примет (вставленное из буфера лишнее вырезается). */\nconst FORMATS: Record<IRtRichEditorToolbar, readonly string[]> = {\n full: ['bold', 'italic', 'underline', 'strike', 'header', 'list', 'blockquote', 'code-block'],\n minimal: ['bold', 'list'],\n};\n\ntype IQuillContentsArg = Parameters<Quill['setContents']>[0];\n\n/**\n * Rich-редактор чата на Quill. Наследует CVA-ядро input-семейства\n * (`RtFormControlBase`) — плагается в reactive-форму. Quill грузится **лениво**\n * (`import(\"quill\")` в `ngAfterViewInit`), тип импортируется `import type` и в\n * бандл не попадает. Значение CVA — `IQuillDelta` (или `null`, когда пусто).\n */\n@Component({\n selector: 'rt-rich-editor',\n templateUrl: './rt-rich-editor.component.html',\n styleUrl: './rt-rich-editor.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtRichEditorComponent extends RtFormControlBase<IQuillDelta | null> implements AfterViewInit, OnDestroy {\n // `viewChild` не работает на ES-private (`#`) поле — держим `protected`.\n protected readonly editorHost: Signal<ElementRef<HTMLElement>> = viewChild.required<ElementRef<HTMLElement>>('editor');\n\n #quill: Quill | null = null;\n\n /** Значение, пришедшее через writeValue до готовности Quill. */\n #pending: IQuillDelta | null = null;\n\n protected readonly hasValue: Signal<boolean> = computed((): boolean => this.value() !== null);\n\n public readonly placeholder: InputSignal<string> = input<string>('');\n\n /** Набор кнопок форматирования; сужает и принимаемые форматы (вставка из буфера). */\n public readonly toolbar: InputSignal<IRtRichEditorToolbar> = input<IRtRichEditorToolbar>('full');\n\n /** Enter без Shift в редакторе — сигнал отправки (Shift+Enter остаётся переносом). */\n public readonly enterPressed: OutputEmitterRef<void> = output<void>();\n\n public readonly displayText: Signal<string> = computed((): string => {\n const delta: IQuillDelta | null = this.value();\n if (delta === null) {\n return '';\n }\n return delta.ops.map((op: IQuillDeltaOp): string => op.insert).join('');\n });\n\n public async ngAfterViewInit(): Promise<void> {\n const QuillCtor: typeof Quill = (await import('quill')).default;\n const quill: Quill = new QuillCtor(this.editorHost().nativeElement, {\n theme: 'snow',\n placeholder: this.placeholder(),\n formats: [...FORMATS[this.toolbar()]],\n modules: {\n toolbar: [...TOOLBAR[this.toolbar()]],\n keyboard: {\n bindings: {\n // Enter без Shift — отправка (перенос гасим возвратом false);\n // Shift+Enter не совпадает с биндингом и уходит в дефолт (перенос).\n enterSubmit: {\n key: 'Enter',\n shiftKey: false,\n handler: (): boolean => {\n this.enterPressed.emit();\n return false;\n },\n },\n },\n },\n },\n });\n this.#quill = quill;\n if (this.#pending !== null) {\n quill.setContents(this.#pending as unknown as IQuillContentsArg);\n this.#pending = null;\n }\n if (this.isDisabled()) {\n quill.disable();\n }\n quill.on('text-change', (): void => this.#onEditorChange());\n }\n\n public ngOnDestroy(): void {\n this.#quill = null;\n }\n\n public override writeValue(value: IQuillDelta | null): void {\n super.writeValue(value);\n if (this.#quill === null) {\n this.#pending = value;\n return;\n }\n this.#quill.setContents((value ?? { ops: [] }) as unknown as IQuillContentsArg);\n }\n\n public override setDisabledState(isDisabled: boolean): void {\n super.setDisabledState(isDisabled);\n if (this.#quill === null) {\n return;\n }\n if (isDisabled) {\n this.#quill.disable();\n return;\n }\n this.#quill.enable();\n }\n\n protected getEmptyValue(): IQuillDelta | null {\n return null;\n }\n\n protected focusAfterClear(): void {\n this.#quill?.focus();\n }\n\n /** Text-change: пустой слепок → null-канал; иначе delta. */\n #onEditorChange(): void {\n if (this.#quill === null) {\n return;\n }\n const blank: boolean = this.#quill.getText().trim().length === 0;\n const next: IQuillDelta | null = blank\n ? null\n : coerceQuillDeltaOutput({\n ops: this.#quill.getContents().ops as unknown as IQuillDeltaOp[],\n });\n this.value.set(next);\n this.emitChange(next);\n this.markTouched();\n }\n}\n","<ng-container rtBlock=\"rt-rich-editor\">\n <div #editor rtElem=\"surface\" qa-dataid=\"rich-editor-surface\"></div>\n</ng-container>\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport { CdkTextareaAutosize } from '@angular/cdk/text-field';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n output,\n OutputEmitterRef,\n Signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\n\nimport { translateSignal, TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { IQuillDelta } from '../../util';\n\nimport { RtFileCardComponent } from '../file-card/rt-file-card.component';\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { RtRichEditorComponent, IRtRichEditorToolbar } from '../rich-editor/rt-rich-editor.component';\nimport { IRtMessageComposer } from './rt-message-composer.model';\n\nconst BEM_BLOCK: string = 'rt-message-composer';\n\ninterface IComposerFormShape {\n message: FormControl<string>;\n files: FormControl<File[]>;\n delta: FormControl<IQuillDelta | null>;\n}\n\n/**\n * Композер сообщения: авто-растущая textarea сверху, под разделительной линией —\n * ряд контролов (слева — прикрепить файл, справа — отправить). Презентационный,\n * без data-access: наружу торчит только `submitted` с текстом и файлами.\n *\n * Отправка — `Enter` (без Shift) или клик по иконке; `Shift+Enter` — перенос\n * строки. Кнопка отправки активна, пока есть непустой текст или вложения.\n */\n@Component({\n selector: 'rt-message-composer',\n templateUrl: './rt-message-composer.component.html',\n styleUrl: './rt-message-composer.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // angular\n ReactiveFormsModule,\n\n // cdk\n CdkTextareaAutosize,\n\n // standalone components / directives\n RtFileCardComponent,\n RtIconButtonComponent,\n RtRichEditorComponent,\n BlockDirective,\n ElemDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtMessageComposerComponent {\n readonly #formValue: Signal<Partial<{ message: string; files: File[]; delta: IQuillDelta | null }>>;\n\n readonly #t_chatPlaceholder: Signal<string> = translateSignal('rtKit.chatPlaceholder');\n\n protected readonly placeholderText: Signal<string> = computed((): string => this.placeholder() || this.#t_chatPlaceholder());\n\n protected readonly fileInput: Signal<ElementRef<HTMLInputElement> | undefined> = viewChild<ElementRef<HTMLInputElement>>('fileEl');\n\n protected readonly form: FormGroup<IComposerFormShape> = new FormGroup<IComposerFormShape>({\n message: new FormControl<string>('', { nonNullable: true }),\n files: new FormControl<File[]>([], { nonNullable: true }),\n delta: new FormControl<IQuillDelta | null>(null),\n });\n\n protected readonly files: Signal<readonly File[]> = computed((): readonly File[] => this.#formValue().files ?? []);\n\n /** Отправка доступна: есть контент (текст/delta/файлы), композер не занят. */\n protected readonly canSend: Signal<boolean> = computed((): boolean => {\n if (this.sending() || this.disabled()) {\n return false;\n }\n const value: Partial<{ message: string; files: File[]; delta: IQuillDelta | null }> = this.#formValue();\n const hasFiles: boolean = this.attachments() && (value.files?.length ?? 0) > 0;\n if (this.formatting()) {\n return (value.delta ?? null) !== null || hasFiles;\n }\n const hasText: boolean = (value.message ?? '').trim().length > 0;\n return hasText || hasFiles;\n });\n\n /** Текст-подсказка textarea. Пусто — берётся переведённое умолчание. */\n public readonly placeholder: InputSignal<string> = input<string>('');\n\n /** Фильтр типов для file-input (`.pdf,.doc,...`). */\n public readonly accept: InputSignal<string> = input<string>('');\n\n /** Показывать кнопку вложения и список файлов. */\n public readonly attachments: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Отправка в процессе — блокирует submit и показывает её недоступность. */\n public readonly sending: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Полная блокировка композера. */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Rich-режим: вместо textarea — Quill-редактор, отправка уходит delta-каналом. */\n public readonly formatting: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Набор кнопок rich-редактора (проброс в `rt-rich-editor`). */\n public readonly toolbar: InputSignal<IRtRichEditorToolbar> = input<IRtRichEditorToolbar>('full');\n\n /** Минимальная высота textarea в строках. */\n public readonly minRows: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(1, { transform: numberAttribute });\n\n /** Максимальная высота textarea в строках (дальше — скролл). */\n public readonly maxRows: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(6, { transform: numberAttribute });\n\n /**\n * Файлы, выброшенные drag-n-drop'ом в обёртку чата: пробрасываются сюда как\n * вложения. Каждый физический drop даёт новый массив, поэтому effect\n * перезапускается на каждое перетаскивание; файлы добавляются к уже выбранным.\n */\n public readonly droppedFiles: InputSignal<File[] | null> = input<File[] | null>(null);\n\n /** Отправка сообщения: текст + файлы (последние — только при `attachments`). */\n public readonly submitted: OutputEmitterRef<IRtMessageComposer.SubmitPayload> = output<IRtMessageComposer.SubmitPayload>();\n\n constructor() {\n this.#formValue = toSignal(this.form.valueChanges, {\n initialValue: this.form.value,\n });\n\n effect((): void => {\n const blocked: boolean = this.disabled() || this.sending();\n if (blocked && this.form.enabled) {\n this.form.disable({ emitEvent: false });\n }\n if (!blocked && this.form.disabled) {\n this.form.enable({ emitEvent: false });\n }\n });\n\n effect((): void => {\n const dropped: File[] | null = this.droppedFiles();\n if (dropped !== null && dropped.length > 0 && this.attachments()) {\n this.form.controls.files.setValue([...this.form.controls.files.value, ...dropped]);\n }\n });\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n // Enter без модификаторов — отправка; Shift+Enter оставляем переносом строки.\n // isComposing — не перехватываем подтверждение IME-композиции.\n if (event.key === 'Enter' && !event.shiftKey && !event.isComposing) {\n event.preventDefault();\n this.submit();\n }\n }\n\n protected openPicker(): void {\n if (this.disabled() || this.sending()) {\n return;\n }\n this.fileInput()?.nativeElement.click();\n }\n\n protected onFilesPicked(event: Event): void {\n const el: HTMLInputElement = event.target as HTMLInputElement;\n const picked: File[] = el.files ? Array.from(el.files) : [];\n if (picked.length) {\n this.form.controls.files.setValue([...this.form.controls.files.value, ...picked]);\n }\n // Сброс value — чтобы повторный выбор того же файла снова дал change-событие.\n el.value = '';\n }\n\n protected removeFile(index: number): void {\n const next: File[] = this.form.controls.files.value.filter((_: File, i: number): boolean => i !== index);\n this.form.controls.files.setValue(next);\n }\n\n protected submit(): void {\n if (!this.canSend()) {\n return;\n }\n const files: File[] = this.attachments() ? this.form.controls.files.value : [];\n if (this.formatting()) {\n const delta: IQuillDelta | null = this.form.controls.delta.value;\n this.submitted.emit({\n text: '',\n delta: delta === null ? null : JSON.stringify(delta),\n files,\n });\n } else {\n const text: string = this.form.controls.message.value.trim();\n this.submitted.emit({ text, files });\n }\n this.form.reset({ message: '', files: [], delta: null });\n }\n}\n","<ng-container rtBlock=\"rt-message-composer\" [formGroup]=\"form\">\n @if (formatting()) {\n <rt-rich-editor\n rtElem=\"rich\"\n qa-dataid=\"message-composer-rich\"\n formControlName=\"delta\"\n [placeholder]=\"placeholderText()\"\n [toolbar]=\"toolbar()\"\n (enterPressed)=\"submit()\" />\n } @else {\n <textarea\n rtElem=\"input\"\n qa-dataid=\"message-composer-input\"\n cdkTextareaAutosize\n formControlName=\"message\"\n [attr.aria-label]=\"'rtKit.chatComposerAria' | transloco\"\n [placeholder]=\"placeholderText()\"\n [cdkAutosizeMinRows]=\"minRows()\"\n [cdkAutosizeMaxRows]=\"maxRows()\"\n (keydown)=\"onKeydown($event)\"></textarea>\n }\n\n @if (attachments() && files().length) {\n <div rtElem=\"files\" qa-dataid=\"message-composer-files\">\n @for (file of files(); track $index) {\n <rt-file-card\n showRemove\n qa-dataid=\"message-composer-file\"\n size=\"sm\"\n [name]=\"file.name\"\n [sizeBytes]=\"file.size\"\n [disabled]=\"disabled() || sending()\"\n (removed)=\"removeFile($index)\" />\n }\n </div>\n }\n\n <div rtElem=\"divider\"></div>\n\n <div rtElem=\"controls\">\n @if (attachments()) {\n <input\n #fileEl\n rtElem=\"native\"\n qa-dataid=\"message-composer-file-input\"\n type=\"file\"\n hidden\n multiple\n [attr.accept]=\"accept() || null\"\n (change)=\"onFilesPicked($event)\" />\n <rt-icon-button\n rtElem=\"attach\"\n qa-dataid=\"message-composer-attach\"\n icon=\"paperclip\"\n variant=\"ghost\"\n [ariaLabel]=\"'rtKit.chatAttachAria' | transloco\"\n [tooltip]=\"'rtKit.chatAttachTooltip' | transloco\"\n [disabled]=\"disabled() || sending()\"\n (clicked)=\"openPicker()\" />\n }\n\n <rt-icon-button\n rtElem=\"send\"\n qa-dataid=\"message-composer-send\"\n icon=\"send\"\n variant=\"primary\"\n [ariaLabel]=\"'rtKit.chatSendAria' | transloco\"\n [tooltip]=\"'rtKit.chatSendLabel' | transloco\"\n [disabled]=\"!canSend()\"\n (clicked)=\"submit()\" />\n </div>\n</ng-container>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-note';\n\n/**\n * Тихая информационная заметка-callout для асайдов и форм: приглушённый текст\n * на subtle-фоне, без иконки и severity-цвета. Назначение — пояснить контекст\n * (предупреждения, подсказки, контекстные примечания),\n * не перебивая основной контент.\n *\n * Семантика — `role=\"note\"` (ancillary-контент). Это НЕ alert: для громких\n * цветных уведомлений с severity/иконкой/закрытием используйте `rt-message`.\n *\n * Контент проецируется через `<ng-content />` — допустимы инлайн-теги\n * (`<strong>`, `<a>`) и control-flow (`@if`) внутри.\n */\n@Component({\n selector: 'rt-note',\n templateUrl: './rt-note.component.html',\n styleUrl: './rt-note.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n BlockDirective,\n ],\n host: {\n // Block-класс на host (BlockDirective пропускает comment-ноду ng-container),\n // role — на том же элементе: rt-note самодостаточен, без внутреннего контейнера.\n class: BEM_BLOCK,\n role: 'note',\n },\n})\nexport class RtNoteComponent {}\n","<ng-container rtBlock=\"rt-note\">\n <ng-content />\n</ng-container>\n","import { NumberInput } from '@angular/cdk/coercion';\nimport {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { IRtSpinner } from './rt-spinner.model';\n\nconst BEM_BLOCK: string = 'rt-spinner';\n\n/**\n * Атомарный rotating-spinner для loading-индикаторов.\n *\n * Чистый CSS keyframe (border + animation rotate), zero deps. Без conditional\n * rendering и backdrop'а — это ответственность parent'а (например `rt-table`\n * sticky overlay).\n *\n * Размер задаётся через `[diameter]` (px); цвет — через `[color]`\n * (`primary` / `neutral` / `on-primary`).\n *\n * Анимация уважает `@media (prefers-reduced-motion)` — у пользователей с\n * включённым reduced-motion spinner не вращается.\n */\n@Component({\n selector: 'rt-spinner',\n template: '',\n styleUrls: ['./rt-spinner.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: BEM_BLOCK,\n role: 'status',\n 'aria-live': 'polite',\n },\n})\nexport class RtSpinnerComponent {\n /** Диаметр spinner'а в px. Default 32. */\n public readonly diameter: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(32, {\n transform: numberAttribute,\n });\n\n /** Семантическая палитра. Default `primary`. */\n public readonly color: InputSignal<IRtSpinner.Color> = input<IRtSpinner.Color>('primary');\n\n @HostBinding('class')\n public get hostClasses(): Record<string, boolean> {\n return {\n [BEM_BLOCK]: true,\n [`${BEM_BLOCK}--${this.color()}`]: true,\n };\n }\n\n @HostBinding('style.--rt-spinner-diameter')\n public get cssDiameter(): string {\n return `${this.diameter()}px`;\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChild,\n Directive,\n input,\n InputSignalWithTransform,\n Signal,\n TemplateRef,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\n/**\n * Маркер-директива для контента в левой секции тулбара.\n *\n * @example\n * ```html\n * <rt-toolbar>\n * <ng-template rtToolbarLeft>\n * <button rtButton label=\"Создать\" />\n * </ng-template>\n * </rt-toolbar>\n * ```\n */\n@Directive({\n selector: '[rtToolbarLeft]',\n})\nexport class RtToolbarLeftDirective {}\n\n/**\n * Маркер-директива для контента в центральной секции тулбара.\n *\n * @example\n * ```html\n * <rt-toolbar>\n * <ng-template rtToolbarCenter>\n * <span>Заголовок страницы</span>\n * </ng-template>\n * </rt-toolbar>\n * ```\n */\n@Directive({\n selector: '[rtToolbarCenter]',\n})\nexport class RtToolbarCenterDirective {}\n\n/**\n * Маркер-директива для контента в правой секции тулбара.\n *\n * @example\n * ```html\n * <rt-toolbar>\n * <ng-template rtToolbarRight>\n * <input type=\"search\" placeholder=\"Поиск\" />\n * </ng-template>\n * </rt-toolbar>\n * ```\n */\n@Directive({\n selector: '[rtToolbarRight]',\n})\nexport class RtToolbarRightDirective {}\n\n/**\n * Универсальный тулбар с тремя секциями: left, center, right.\n * Секции задаются `<ng-template>` с директивами-маркерами и подставляются через `ngTemplateOutlet`.\n * Каждый модуль/фича подключает `rt-toolbar` в своём layout и наполняет нужные секции.\n *\n * @example\n * ```html\n * <rt-toolbar>\n * <ng-template rtToolbarLeft>\n * <button rtButton label=\"Создать\" />\n * <button rtButton label=\"Удалить\" appearance=\"text\" />\n * </ng-template>\n *\n * <ng-template rtToolbarCenter>\n * <span>Заявки</span>\n * </ng-template>\n *\n * <ng-template rtToolbarRight>\n * <input type=\"search\" [formControl]=\"searchCtrl\" />\n * </ng-template>\n * </rt-toolbar>\n * ```\n */\nconst BEM_BLOCK: string = 'rt-toolbar';\n\n@Component({\n selector: 'rt-toolbar',\n templateUrl: './rt-toolbar.component.html',\n styleUrls: ['./rt-toolbar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n NgTemplateOutlet,\n\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-toolbar--dense]': 'dense()',\n },\n})\nexport class RtToolbarComponent {\n protected readonly leftTpl: Signal<TemplateRef<unknown> | undefined> = contentChild(RtToolbarLeftDirective, { read: TemplateRef });\n\n protected readonly centerTpl: Signal<TemplateRef<unknown> | undefined> = contentChild(RtToolbarCenterDirective, { read: TemplateRef });\n\n protected readonly rightTpl: Signal<TemplateRef<unknown> | undefined> = contentChild(RtToolbarRightDirective, { read: TemplateRef });\n\n /**\n * Компактная шапка (заголовок + иконки-действия): зоны остаются в одну строку\n * даже на мобилке. Без этого трёхзонный list-тулбар стекается в колонку на\n * ≤768px, что для узкой шапки (напр. rt-chat) неверно.\n */\n public readonly dense: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n}\n","@if (leftTpl() || centerTpl() || rightTpl()) {\n <ng-container rtBlock=\"rt-toolbar\">\n <div rtElem=\"bars\">\n @if (leftTpl()) {\n <div rtElem=\"bar\" qa-dataid=\"toolbar-bar\" data-slot=\"left\" [rtMod]=\"{ left: true }\">\n <ng-container [ngTemplateOutlet]=\"leftTpl() ?? null\" />\n </div>\n }\n\n @if (centerTpl()) {\n <div rtElem=\"bar\" qa-dataid=\"toolbar-bar\" data-slot=\"center\" [rtMod]=\"{ center: true }\">\n <ng-container [ngTemplateOutlet]=\"centerTpl() ?? null\" />\n </div>\n }\n\n @if (rightTpl()) {\n <div rtElem=\"bar\" qa-dataid=\"toolbar-bar\" data-slot=\"right\" [rtMod]=\"{ right: true }\">\n <ng-container [ngTemplateOutlet]=\"rightTpl() ?? null\" />\n </div>\n }\n </div>\n </ng-container>\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { CdkTextareaAutosize } from '@angular/cdk/text-field';\nimport { DatePipe } from '@angular/common';\nimport {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\n\nimport { translateSignal, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtChatStatusLabelPipe } from '../../pipes/rt-chat-status-label.pipe';\nimport { RtButtonDirective } from '../button/rt-button.directive';\nimport { RtConfirmDirective } from '../confirm-popover/rt-confirm.directive';\nimport { RtDeltaViewComponent } from '../delta-view/rt-delta-view.component';\nimport { RtFileCardComponent } from '../file-card/rt-file-card.component';\nimport { RtFileDropComponent } from '../file-drop/rt-file-drop.component';\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { RtIconComponent } from '../icon/rt-icon.component';\nimport { RtMessageComposerComponent } from '../message-composer/rt-message-composer.component';\nimport { IRtMessageComposer } from '../message-composer/rt-message-composer.model';\nimport { RtNoteComponent } from '../note/rt-note.component';\nimport { IRtRichEditorToolbar } from '../rich-editor/rt-rich-editor.component';\nimport { RtSkeletonWrapperComponent } from '../skeleton-wrapper/rt-skeleton-wrapper.component';\nimport { RtSpinnerComponent } from '../spinner/rt-spinner.component';\nimport { RtToolbarComponent, RtToolbarLeftDirective, RtToolbarRightDirective } from '../toolbar/rt-toolbar.component';\nimport { ERtChatMessageStatus, IRtChat } from './rt-chat.model';\n\nconst BEM_BLOCK: string = 'rt-chat';\n\n/** Ключ заглушки имени вложения, когда домен не отдал `fileName` (только URL). */\nconst ATTACHMENT_FALLBACK_KEY: string = 'rtKit.chatAttachmentFallback';\n\n/** Зазор от низа треда, в пределах которого считаем пользователя «у нижнего края». */\nconst NEAR_BOTTOM_THRESHOLD_PX: number = 64;\n\n/**\n * Задержки (мс) серии повторных пинов к низу после первичной прокрутки. Rich-контент\n * (`rt-delta-view`, код-блоки) дорисовывается несколькими render-пассами уже после\n * того, как afterRenderEffect выставил scrollTop по промежуточной высоте, — набор\n * тиков покрывает окно, за которое высота устаканивается.\n */\nconst PIN_RETRY_DELAYS_MS: readonly number[] = [50, 150, 300, 500, 800];\n\n/**\n * Общий презентационный чат: тред сообщений + композер. Никакого data-access/api —\n * история приходит готовым массивом `IRtChat.Message[]`, отправка/обновление/\n * скачивание уходят наружу через outputs, а стор и blob-загрузка остаются в\n * feature-компоненте каждого домена.\n *\n * Композер держит свой `FormGroup` — наружу торчит только `send`. Полноэкранный\n * режим (expand) — overlay внутри самого компонента (`--expanded`), потребителю\n * лишь опционально сообщается через `expandedChange`.\n *\n * Шапка (тулбар «Чат» + refresh/expand) рендерится только когда включена хотя бы\n * одна из иконок (`showRefresh`/`showExpand`): в диалогах своя header-обёртка,\n * туда тулбар не нужен.\n */\n@Component({\n selector: 'rt-chat',\n templateUrl: './rt-chat.component.html',\n styleUrls: ['./rt-chat.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n CdkTextareaAutosize,\n DatePipe,\n ReactiveFormsModule,\n\n // standalone components / directives\n RtButtonDirective,\n RtChatStatusLabelPipe,\n RtConfirmDirective,\n RtDeltaViewComponent,\n RtFileCardComponent,\n RtFileDropComponent,\n RtIconButtonComponent,\n RtIconComponent,\n RtMessageComposerComponent,\n RtNoteComponent,\n RtSkeletonWrapperComponent,\n RtSpinnerComponent,\n RtToolbarComponent,\n RtToolbarLeftDirective,\n RtToolbarRightDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n\n // transloco\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-chat--expanded]': 'expanded()',\n '[class.rt-chat--fill]': 'fill()',\n },\n})\nexport class RtChatComponent {\n readonly #transloco: TranslocoService = inject(TranslocoService);\n\n /**\n * Дата сообщения форматируется по активному языку Transloco, а не по\n * `LOCALE_ID`: тот вычисляется на подъёме приложения и там, где язык\n * переключают на ходу, оставил бы часы в прежнем формате до перезагрузки.\n *\n * Данные локали для `DatePipe` регистрирует приложение: без них пайп падает\n * `Missing locale data`, и кит за это не отвечает.\n */\n protected readonly locale: Signal<string> = toSignal(this.#transloco.langChanges$, {\n initialValue: this.#transloco.getActiveLang(),\n });\n\n /**\n * Пользователь у нижнего края треда. Плоское поле (не сигнал), чтобы\n * afterRenderEffect не перезапускался на каждый scroll — обновляется в\n * обработчике scroll и читается при автоскролле.\n */\n #atBottom: boolean = true;\n\n /** Прошлый scrollTop треда — для различения прокрутки вверх и роста контента. */\n #lastScrollTop: number = 0;\n\n /** One-shot: своё отправленное сообщение всегда прокручивает тред вниз. */\n #forceScroll: boolean = false;\n\n /** Текущее значение композера — источник реактивности для `canSend`. */\n readonly #formValue: Signal<Partial<{ message: string; files: File[] }>>;\n\n /**\n * Скролл-контейнер треда — для автопрокрутки к последнему сообщению.\n * `viewChild` не работает на ES-private (`#`) поле, поэтому `protected`.\n */\n protected readonly thread: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('thread');\n\n /** Скрытый нативный input — открывается кнопкой-скрепкой внутри поля ввода. */\n protected readonly composerFileEl: Signal<ElementRef<HTMLInputElement> | undefined> =\n viewChild<ElementRef<HTMLInputElement>>('composerFileEl');\n\n protected readonly attachmentFallbackName: Signal<string> = translateSignal(ATTACHMENT_FALLBACK_KEY);\n\n /** Подписи с учётом того, что передал хозяин компонента: своё важнее умолчания */\n protected readonly titleText: Signal<string> = computed((): string => this.title() || this.#defaultTitle());\n protected readonly placeholderText: Signal<string> = computed((): string => this.placeholder() || this.#defaultPlaceholder());\n protected readonly emptyHintText: Signal<string> = computed((): string => this.emptyHint() || this.#defaultEmptyHint());\n\n readonly #defaultTitle: Signal<string> = translateSignal('rtKit.chatTitle');\n readonly #defaultPlaceholder: Signal<string> = translateSignal('rtKit.chatPlaceholder');\n readonly #defaultEmptyHint: Signal<string> = translateSignal('rtKit.chatEmptyHint');\n\n protected readonly MessageStatus: typeof ERtChatMessageStatus = ERtChatMessageStatus;\n\n /** Плейсхолдеры скелетонов треда при первичной загрузке. */\n protected readonly skeletonRows: readonly number[] = [1, 2, 3];\n\n /** Полноэкранный режим (overlay поверх страницы). */\n protected readonly expanded: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly replyForm: FormGroup<{\n message: FormControl<string>;\n files: FormControl<File[]>;\n }> = new FormGroup({\n message: new FormControl<string>('', { nonNullable: true }),\n files: new FormControl<File[]>([], { nonNullable: true }),\n });\n\n /** Композер заблокирован при загрузке/рефреше треда или отправке in-flight. */\n protected readonly composerDisabled: Signal<boolean> = computed((): boolean => this.loading() || this.fetching() || this.sending());\n\n /**\n * Можно ли отправить: композер активен и есть содержимое — непустой текст или\n * (при включённых вложениях) хотя бы один файл. Сообщение само по себе не\n * бывает «невалидным» — пустоту гасим дизейблом кнопки, а не подсветкой поля.\n */\n protected readonly canSend: Signal<boolean> = computed((): boolean => {\n if (this.composerDisabled()) {\n return false;\n }\n const value: Partial<{ message: string; files: File[] }> = this.#formValue();\n const hasText: boolean = (value.message ?? '').trim().length > 0;\n const hasFiles: boolean = this.attachments() && (value.files?.length ?? 0) > 0;\n return hasText || hasFiles;\n });\n\n /** Показывать ли шапку: только когда включена хотя бы одна иконка. */\n protected readonly showHeader: Signal<boolean> = computed((): boolean => this.showRefresh() || this.showExpand());\n\n /** Подпись кнопки fullscreen: тернарник в шаблоне переводом не покрыть. */\n protected readonly expandLabel: Signal<string> = translateSignal(\n computed((): string => (this.expanded() ? 'rtKit.chatCollapse' : 'rtKit.chatExpand'))\n );\n\n /** Выбранные, но ещё не отправленные файлы — карточки над полем ввода. */\n protected readonly selectedFiles: Signal<File[]> = computed((): File[] => this.#formValue().files ?? []);\n\n /**\n * Drop-зона активна только когда вложения включены, ответ доступен и композер\n * не занят (загрузка/рефреш/отправка). Иначе обёртка `rt-file-drop` просто\n * пропускает контент без оверлея.\n */\n protected readonly dropDisabled: Signal<boolean> = computed(\n (): boolean => !this.attachments() || !this.canReply() || this.composerDisabled()\n );\n\n /**\n * Файл из drag-n-drop для rich-композера: каждый drop кладёт новый `File`,\n * пробрасывается в `rt-message-composer` через input. Классический композер\n * принимает drop напрямую в свой `replyForm`.\n */\n protected readonly droppedFiles: WritableSignal<File[] | null> = signal<File[] | null>(null);\n\n /** История сообщений (consumer уже смаппил из доменной модели). */\n public readonly messages: InputSignal<readonly IRtChat.Message[]> = input<readonly IRtChat.Message[]>([]);\n\n /** Первичная загрузка — скелетоны вместо треда. */\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Рефреш при наличии данных — тред остаётся, композер дизейблится. */\n public readonly fetching: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Доступна ли отправка (иначе вместо композера — note с причиной). */\n public readonly canReply: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Причина блокировки ответа — note под тредом. */\n public readonly replyBlockReason: InputSignal<string | null> = input<string | null>(null);\n\n /** Отправка in-flight — спиннер/дизейбл на кнопке. */\n public readonly sending: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /**\n * Подписи по умолчанию приходят пустыми и переводятся ниже: значение\n * `input()` вычисляется при создании компонента, и готовый перевод застыл бы\n * на языке, активном в этот момент.\n */\n public readonly placeholder: InputSignal<string> = input<string>('');\n\n public readonly title: InputSignal<string> = input<string>('');\n\n /** Текст, когда треда ещё нет (заявка не создана). */\n public readonly emptyHint: InputSignal<string> = input<string>('');\n\n /** Есть ли тред (иначе показываем `emptyHint`). */\n public readonly hasThread: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Включить загрузку файлов в композере. */\n public readonly attachments: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** `accept` для file-input (`.pdf,.doc,...`). */\n public readonly accept: InputSignal<string> = input<string>('');\n\n /**\n * Компактный композер (`rt-message-composer`): авто-растущая textarea над\n * разделителем + ряд иконок (прикрепить слева, отправить справа) вместо\n * классического вертикального стека. По умолчанию выключен.\n */\n public readonly richComposer: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /**\n * Rich-текст в композере (Quill delta). Требует `richComposer` — форматирование\n * живёт только в компактном композере. Отправка уходит delta-каналом.\n */\n public readonly formatting: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Набор кнопок rich-редактора (проброс до `rt-rich-editor` через композер). */\n public readonly formattingToolbar: InputSignal<IRtRichEditorToolbar> = input<IRtRichEditorToolbar>('full');\n\n /**\n * Растягивать чат на всю высоту контейнера: тред занимает свободное место,\n * композер прижат к низу. По умолчанию выключен (тред с фикс. max-height).\n * Требует, чтобы родитель давал высоту (flex-цепочка).\n */\n public readonly fill: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Показать иконку refresh в шапке. */\n public readonly showRefresh: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Показать иконку expand (fullscreen) в шапке. */\n public readonly showExpand: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Отправка сообщения (+файлы) — consumer вызывает свой store/api. */\n public readonly send: OutputEmitterRef<IRtChat.SendPayload> = output<IRtChat.SendPayload>();\n\n /** Клик refresh — consumer перетягивает тред. */\n public readonly refresh: OutputEmitterRef<void> = output<void>();\n\n /** Клик по вложению — consumer качает blob своим api. */\n public readonly downloadFile: OutputEmitterRef<IRtChat.Message> = output<IRtChat.Message>();\n\n /** Клик по карточке вложения из `attachments[]` — консюмер качает по `publicId`. */\n public readonly downloadAttachment: OutputEmitterRef<IRtChat.Attachment> = output<IRtChat.Attachment>();\n\n /** Смена fullscreen-состояния. */\n public readonly expandedChange: OutputEmitterRef<boolean> = output<boolean>();\n\n public readonly deleteMessage: OutputEmitterRef<IRtChat.Message> = output<IRtChat.Message>();\n\n /** Повторная отправка своего сообщения со статусом `failed`. */\n public readonly retryMessage: OutputEmitterRef<IRtChat.Message> = output<IRtChat.Message>();\n\n constructor() {\n this.#formValue = toSignal(this.replyForm.valueChanges, {\n initialValue: this.replyForm.value,\n });\n\n // Поведение мессенджера: после каждого рендера, зависящего от треда\n // (новые сообщения, окончание загрузки, fullscreen), прокручиваем к\n // последнему сообщению — но только если это своё сообщение (forceScroll)\n // или пользователь уже у нижнего края. Если он ушёл вверх читать историю,\n // входящее сообщение его не дёргает. afterRenderEffect гарантирует, что DOM\n // уже обновлён и scrollHeight посчитан по реальной высоте.\n afterRenderEffect((): void => {\n this.messages();\n this.loading();\n this.fetching();\n this.expanded();\n const el: HTMLElement | undefined = this.thread()?.nativeElement;\n if (el === undefined) {\n return;\n }\n if (this.#forceScroll || this.#atBottom) {\n el.scrollTop = el.scrollHeight;\n this.#atBottom = true;\n this.#pinToBottomDeferred();\n }\n this.#forceScroll = false;\n });\n\n // `formControlName`-инпуты игнорируют атрибут `disabled` — состояние ввода\n // держим через сам контрол: блок при рефреше треда или отправке in-flight.\n effect((): void => {\n const blocked: boolean = this.composerDisabled();\n if (blocked && this.replyForm.enabled) {\n this.replyForm.disable({ emitEvent: false });\n return;\n }\n if (!blocked && this.replyForm.disabled) {\n this.replyForm.enable({ emitEvent: false });\n }\n });\n }\n\n protected onSubmit(): void {\n // Кнопка уже дизейблится по `canSend` — guard лишь страхует от submit в\n // обход кнопки (программный/Enter), молча и без подсветки поля.\n if (!this.canSend()) {\n return;\n }\n const text: string = this.replyForm.controls.message.value.trim();\n const files: File[] = this.replyForm.controls.files.value;\n // Своё сообщение всегда прокручивает тред вниз — независимо от позиции.\n this.#forceScroll = true;\n this.send.emit({ text, files: this.attachments() ? files : undefined });\n this.replyForm.reset({ message: '', files: [] });\n }\n\n protected onComposerKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey && !event.isComposing) {\n event.preventDefault();\n this.onSubmit();\n }\n }\n\n /** Релей submit'а от `rt-message-composer` (rich-режим) наружу как `send`. */\n protected onComposerSubmit(payload: IRtMessageComposer.SubmitPayload): void {\n // Своё сообщение всегда прокручивает тред вниз — независимо от позиции.\n this.#forceScroll = true;\n this.send.emit({\n text: payload.text,\n files: this.attachments() ? payload.files : undefined,\n delta: payload.delta,\n });\n }\n\n /**\n * Файлы выброшены в обёртку чата: в rich-режиме отдаём массив композеру через\n * input, в классическом — добавляем к уже выбранным в собственном `replyForm`.\n */\n protected onFilesDropped(files: File[]): void {\n if (files.length === 0) {\n return;\n }\n if (this.richComposer()) {\n // Новый массив на каждый drop — effect композера видит каждое перетаскивание.\n this.droppedFiles.set([...files]);\n return;\n }\n this.replyForm.controls.files.setValue([...this.replyForm.controls.files.value, ...files]);\n }\n\n protected openFilePicker(): void {\n this.composerFileEl()?.nativeElement.click();\n }\n\n protected onFilesPicked(event: Event): void {\n const inputEl: HTMLInputElement = event.target as HTMLInputElement;\n const picked: File[] = Array.from(inputEl.files ?? []);\n if (picked.length > 0) {\n this.replyForm.controls.files.setValue([...this.replyForm.controls.files.value, ...picked]);\n }\n // Сброс значения: без него повторный выбор того же файла не даёт `change`.\n inputEl.value = '';\n }\n\n protected removeFile(index: number): void {\n const next: File[] = this.replyForm.controls.files.value.filter((_: File, position: number): boolean => position !== index);\n this.replyForm.controls.files.setValue(next);\n }\n\n /**\n * Обновляем «у нижнего ли края» по скроллу — основа решения об автоскролле.\n * Прилипание к низу снимаем ТОЛЬКО когда пользователь прокрутил ВВЕРХ (scrollTop\n * уменьшился). Событие от программной прокрутки и рост контента идут при том же\n * или большем scrollTop — тогда прилипание лишь усиливаем, но не снимаем. Иначе\n * async-событие от нашего же `scrollTop = scrollHeight`, долетающее уже после\n * поздней дорисовки rich-контента (высота выросла, scrollTop прежний → мнимый\n * «отрыв от низа»), сбрасывало бы `#atBottom` и ломало до-прокрутку.\n */\n protected onThreadScroll(): void {\n const el: HTMLElement | undefined = this.thread()?.nativeElement;\n if (el === undefined) {\n return;\n }\n const scrollTop: number = el.scrollTop;\n const nearBottom: boolean = el.scrollHeight - el.clientHeight - scrollTop <= NEAR_BOTTOM_THRESHOLD_PX;\n if (scrollTop < this.#lastScrollTop - 1) {\n this.#atBottom = nearBottom;\n } else {\n this.#atBottom = this.#atBottom || nearBottom;\n }\n this.#lastScrollTop = scrollTop;\n }\n\n /**\n * Серия отложенных пинов к низу: rich-контент дорисовывается несколькими\n * render-пассами (иногда с пересозданием `#thread`), поэтому одного скролла в\n * afterRenderEffect мало — финальная высота устанавливается позже. Каждый тик\n * заново берёт актуальный элемент треда и его текущий scrollHeight и, пока\n * пользователь у нижнего края, дотягивает ленту до конца.\n */\n #pinToBottomDeferred(): void {\n for (const delay of PIN_RETRY_DELAYS_MS) {\n setTimeout((): void => {\n const el: HTMLElement | undefined = this.thread()?.nativeElement;\n if (el !== undefined && this.#atBottom) {\n el.scrollTop = el.scrollHeight;\n }\n }, delay);\n }\n }\n\n protected onRefresh(): void {\n this.refresh.emit();\n }\n\n protected onDownload(message: IRtChat.Message): void {\n this.downloadFile.emit(message);\n }\n\n /** Релей клика по вложению наружу — сам компонент файлов не качает. */\n protected onDownloadAttachment(attachment: IRtChat.Attachment): void {\n this.downloadAttachment.emit(attachment);\n }\n\n /** Релей запроса на удаление сообщения — удаляет домен, компонент только рисует. */\n protected onDeleteMessage(message: IRtChat.Message): void {\n this.deleteMessage.emit(message);\n }\n\n /** Релей повтора отправки упавшего сообщения — переотправляет домен. */\n protected onRetryMessage(message: IRtChat.Message): void {\n this.retryMessage.emit(message);\n }\n\n protected toggleExpand(): void {\n const next: boolean = !this.expanded();\n this.expanded.set(next);\n this.expandedChange.emit(next);\n }\n}\n","<ng-container rtBlock=\"rt-chat\">\n <rt-file-drop\n [overlayLabel]=\"'rtKit.chatDropOverlay' | transloco\"\n [accept]=\"accept()\"\n [disabled]=\"dropDisabled()\"\n (filesDropped)=\"onFilesDropped($event)\">\n @if (showHeader()) {\n <rt-toolbar rtElem=\"header\" dense>\n <ng-template rtToolbarLeft>\n <h3 rtElem=\"title\" qa-dataid=\"chat-title\">{{ title() }}</h3>\n </ng-template>\n <ng-template rtToolbarRight>\n @if (showRefresh()) {\n <rt-icon-button\n qa-dataid=\"chat-refresh\"\n icon=\"sync\"\n variant=\"ghost\"\n [ariaLabel]=\"'rtKit.chatRefreshAria' | transloco\"\n [tooltip]=\"'rtKit.chatRefreshTooltip' | transloco\"\n [loading]=\"fetching()\"\n [disabled]=\"!hasThread()\"\n (clicked)=\"onRefresh()\" />\n }\n @if (showExpand()) {\n <rt-icon-button\n qa-dataid=\"chat-expand\"\n variant=\"ghost\"\n [icon]=\"expanded() ? 'window-minimize' : 'window-maximize'\"\n [ariaLabel]=\"expandLabel()\"\n [tooltip]=\"expandLabel()\"\n (clicked)=\"toggleExpand()\" />\n }\n <ng-content select=\"[rtChatHeaderActions]\" />\n </ng-template>\n </rt-toolbar>\n }\n\n @if (!hasThread()) {\n <rt-note qa-dataid=\"chat-empty-hint\">{{ emptyHint() }}</rt-note>\n } @else {\n <div rtElem=\"thread-viewport\" qa-dataid=\"chat-thread-viewport\">\n @if (loading()) {\n <!-- Скелетон повторяет структуру сообщения (автор → текст → дата),\n чередуя выравнивание, чтобы тред не «прыгал» при подмене на реальные. -->\n <div rtElem=\"thread\" qa-dataid=\"chat-thread-skeleton\">\n @for (row of skeletonRows; track row; let even = $even) {\n <div rtElem=\"message-skeleton\" qa-dataid=\"chat-message-skeleton\" [rtMod]=\"{ own: even }\">\n <rt-skeleton-wrapper rtElem=\"skeleton-line\" width=\"72px\" height=\"10px\" [isLoading]=\"true\" />\n <rt-skeleton-wrapper rtElem=\"skeleton-line\" width=\"100%\" height=\"13px\" [isLoading]=\"true\" />\n <rt-skeleton-wrapper rtElem=\"skeleton-line\" width=\"55%\" height=\"13px\" [isLoading]=\"true\" />\n <rt-skeleton-wrapper rtElem=\"skeleton-line\" width=\"56px\" height=\"10px\" [isLoading]=\"true\" />\n </div>\n }\n </div>\n } @else {\n <div\n #thread\n rtElem=\"thread\"\n qa-dataid=\"chat-thread\"\n [rtMod]=\"{ frozen: fetching() }\"\n [attr.aria-busy]=\"fetching() ? 'true' : null\"\n (scroll)=\"onThreadScroll()\">\n @for (m of messages(); track m.id) {\n <div\n rtElem=\"message-row\"\n qa-dataid=\"chat-message\"\n [attr.data-own]=\"m.own\"\n [attr.data-status]=\"m.status || null\"\n [attr.data-deleted]=\"m.deleted || null\"\n [rtMod]=\"{ own: m.own }\">\n @if (m.canDelete && !m.deleted) {\n @if (m.deleteConfirm) {\n <rt-icon-button\n rtElem=\"message-delete\"\n qa-dataid=\"chat-message-delete\"\n icon=\"trash\"\n variant=\"ghost\"\n [ariaLabel]=\"'rtKit.chatDeleteAria' | transloco\"\n [tooltip]=\"'rtKit.chatDeleteTooltip' | transloco\"\n [rtConfirm]=\"m.deleteConfirm\"\n (confirmed)=\"onDeleteMessage(m)\" />\n } @else {\n <rt-icon-button\n rtElem=\"message-delete\"\n qa-dataid=\"chat-message-delete\"\n icon=\"trash\"\n variant=\"ghost\"\n [ariaLabel]=\"'rtKit.chatDeleteAria' | transloco\"\n [tooltip]=\"'rtKit.chatDeleteTooltip' | transloco\"\n (clicked)=\"onDeleteMessage(m)\" />\n }\n }\n <div rtElem=\"message\" [rtMod]=\"{ own: m.own, deleted: m.deleted }\">\n <p rtElem=\"message-author\" qa-dataid=\"chat-message-author\">{{ m.author }}</p>\n @if (m.deleted) {\n <p rtElem=\"message-text\" qa-dataid=\"chat-message-deleted\" rtMod=\"deleted\">\n {{ 'rtKit.chatMessageDeleted' | transloco }}\n </p>\n } @else {\n @if (m.delta) {\n <rt-delta-view rtElem=\"message-text\" qa-dataid=\"chat-message-text\" [delta]=\"m.delta\" />\n } @else {\n <p rtElem=\"message-text\" qa-dataid=\"chat-message-text\">{{ m.text }}</p>\n }\n @if (m.attachments?.length) {\n @for (att of m.attachments; track att.id) {\n <span rtElem=\"message-attachment\" qa-dataid=\"chat-message-attachment\">\n <rt-file-card\n showDownload\n size=\"sm\"\n [name]=\"att.name || attachmentFallbackName()\"\n (download)=\"onDownloadAttachment(att)\" />\n </span>\n }\n } @else if (m.fileUrl) {\n <span rtElem=\"message-attachment\" qa-dataid=\"chat-message-attachment\">\n <rt-file-card\n showDownload\n size=\"sm\"\n [name]=\"m.fileName || attachmentFallbackName()\"\n (download)=\"onDownload(m)\" />\n </span>\n }\n @if (m.deepLink) {\n <span rtElem=\"message-deeplink\">\n <a\n rtButton\n qa-dataid=\"chat-message-deeplink\"\n appearance=\"outlined\"\n icon=\"send\"\n rel=\"noopener\"\n target=\"_blank\"\n [href]=\"m.deepLink\"\n [label]=\"m.deepLinkLabel || ('rtKit.uiSubscribeNotifications' | transloco)\"\n [attr.aria-label]=\"\n m.deepLinkLabel || ('rtKit.uiSubscribeNotifications' | transloco)\n \"></a>\n </span>\n }\n }\n <span rtElem=\"message-footer\">\n <span rtElem=\"message-date\" qa-dataid=\"chat-message-date\">\n {{ m.createdAt | date: 'short' : undefined : locale() }}\n </span>\n @if (m.status) {\n <span\n rtElem=\"message-status\"\n qa-dataid=\"chat-message-status\"\n [attr.data-status]=\"m.status\"\n [rtMod]=\"{ status: m.status }\"\n [attr.aria-label]=\"m.status | rtChatStatusLabel\">\n @if (m.status === MessageStatus.Failed) {\n <rt-icon rtElem=\"status-icon\" name=\"exclamation-circle\" size=\"sm\" />\n <rt-icon-button\n rtElem=\"status-retry\"\n qa-dataid=\"chat-message-retry\"\n icon=\"sync\"\n variant=\"ghost\"\n [ariaLabel]=\"'rtKit.chatRetryAria' | transloco\"\n [tooltip]=\"'rtKit.chatRetryTooltip' | transloco\"\n (clicked)=\"onRetryMessage(m)\" />\n } @else {\n <!-- Часы, пока сообщение в пути; дальше двойной чек, цвет которого\n (серый/синий) различает доставлено и прочитано. -->\n <rt-icon\n rtElem=\"status-icon\"\n size=\"sm\"\n [name]=\"m.status === MessageStatus.Sending ? 'clock' : 'check-double'\" />\n }\n </span>\n }\n </span>\n </div>\n </div>\n } @empty {\n <rt-note rtElem=\"empty-thread\" qa-dataid=\"chat-empty-thread\">{{ 'rtKit.chatEmptyThread' | transloco }}</rt-note>\n }\n </div>\n }\n @if (!loading() && fetching()) {\n <div\n rtElem=\"thread-overlay\"\n qa-dataid=\"chat-thread-overlay\"\n role=\"status\"\n [attr.aria-label]=\"'rtKit.chatRefreshAria' | transloco\">\n <rt-spinner diameter=\"32\" />\n </div>\n }\n </div>\n\n @if (canReply()) {\n @if (richComposer()) {\n <rt-message-composer\n rtElem=\"composer-rich\"\n qa-dataid=\"chat-composer-rich\"\n [placeholder]=\"placeholder()\"\n [accept]=\"accept()\"\n [attachments]=\"attachments()\"\n [formatting]=\"formatting()\"\n [toolbar]=\"formattingToolbar()\"\n [sending]=\"sending()\"\n [disabled]=\"loading() || fetching()\"\n [droppedFiles]=\"droppedFiles()\"\n (submitted)=\"onComposerSubmit($event)\" />\n } @else {\n <form rtElem=\"composer\" qa-dataid=\"chat-composer\" [formGroup]=\"replyForm\" (ngSubmit)=\"onSubmit()\">\n @if (attachments() && selectedFiles().length > 0) {\n <div rtElem=\"composer-files\" qa-dataid=\"chat-composer-files\">\n @for (file of selectedFiles(); track $index) {\n <rt-file-card\n showRemove\n qa-dataid=\"chat-composer-file\"\n size=\"sm\"\n [name]=\"file.name\"\n [sizeBytes]=\"file.size\"\n [disabled]=\"composerDisabled()\"\n (removed)=\"removeFile($index)\" />\n }\n </div>\n }\n <div rtElem=\"composer-field\" [rtMod]=\"{ attach: attachments() }\">\n @if (attachments()) {\n <input\n #composerFileEl\n rtElem=\"composer-native\"\n qa-dataid=\"chat-composer-file-input\"\n type=\"file\"\n hidden\n multiple\n [attr.accept]=\"accept() || null\"\n (change)=\"onFilesPicked($event)\" />\n <rt-icon-button\n rtElem=\"composer-attach\"\n qa-dataid=\"chat-composer-attach\"\n icon=\"paperclip\"\n variant=\"ghost\"\n [ariaLabel]=\"'rtKit.chatAttachAria' | transloco\"\n [tooltip]=\"'rtKit.chatAttachTooltip' | transloco\"\n [disabled]=\"composerDisabled()\"\n (clicked)=\"openFilePicker()\" />\n }\n <textarea\n rtElem=\"composer-input\"\n qa-dataid=\"chat-composer-input\"\n cdkTextareaAutosize\n formControlName=\"message\"\n cdkAutosizeMinRows=\"1\"\n cdkAutosizeMaxRows=\"4\"\n [attr.aria-label]=\"'rtKit.chatComposerAria' | transloco\"\n [placeholder]=\"placeholder()\"\n (keydown)=\"onComposerKeydown($event)\"></textarea>\n </div>\n <button\n rtButton\n rtElem=\"composer-send\"\n qa-dataid=\"chat-composer-send\"\n type=\"submit\"\n theme=\"primary\"\n appearance=\"filled\"\n [label]=\"'rtKit.chatSendLabel' | transloco\"\n [attr.aria-label]=\"'rtKit.chatSendAria' | transloco\"\n [loading]=\"sending()\"\n [disabled]=\"!canSend()\"></button>\n </form>\n }\n } @else if (replyBlockReason()) {\n <rt-note rtElem=\"reply-block\" qa-dataid=\"chat-reply-block\">{{ replyBlockReason() }}</rt-note>\n }\n\n <!-- Слот доменных действий потребителя под композером: в fullscreen\n попадает внутрь overlay, поэтому кнопки остаются видны. -->\n <div rtElem=\"footer-slot\" qa-dataid=\"chat-footer\" [rtMod]=\"{ blocked: fetching() }\" [attr.inert]=\"fetching() ? '' : null\">\n <ng-content select=\"[rtChatFooter]\" />\n </div>\n }\n </rt-file-drop>\n</ng-container>\n","import { fileNameFromUrl, IQuillDelta } from '../../util';\n\nimport { ERtChatMessageStatus, IRtChat } from './rt-chat.model';\n\n/**\n * Статус уже сохранённого своего сообщения: сервер знает только, дошло ли оно до\n * собеседника. Часы и ошибка — состояния клиентской очереди, сюда не попадают.\n */\nexport function deliveryStatus(read: boolean): ERtChatMessageStatus {\n return read ? ERtChatMessageStatus.Read : ERtChatMessageStatus.Sent;\n}\n\n/**\n * Сообщение, ещё не подтверждённое сервером. Серверного id и ссылок на вложения\n * у него нет: есть клиентский ключ, текст и выбранные файлы.\n *\n * Rich-тело приходит уже разобранным — доменная форма его хранения тут ни при\n * чём, а хранят его стороны по-разному: одна шлёт обычный текст, другая —\n * строку композера, которая в том же виде уходит на сервер.\n */\nexport interface IRtPendingMessage {\n tempId: string;\n text: string;\n delta?: IQuillDelta | null;\n createdAt: string;\n status: IRtChat.MessageStatus;\n files: readonly File[];\n}\n\n/**\n * Неподтверждённое сообщение → строка ленты. Показывается сразу после отправки:\n * ждать ответа сервера, глядя в пустоту, незачем ни одной из сторон.\n *\n * Скрыть такое сообщение нельзя: на сервере его ещё нет, и удалять нечего.\n */\nexport function pendingToRtMessage(pending: IRtPendingMessage, authorLabel: string): IRtChat.Message {\n return {\n id: pending.tempId,\n tempId: pending.tempId,\n author: authorLabel,\n own: true,\n text: pending.text,\n delta: pending.delta ?? null,\n createdAt: pending.createdAt,\n status: pending.status,\n canDelete: false,\n attachments: pending.files.map((file: File, index: number): IRtChat.Attachment => ({\n id: index,\n name: file.name,\n // Файл ещё не на сервере — скачивать нечего, карточка только именует.\n publicId: '',\n })),\n };\n}\n\n/**\n * Структурный контракт доменного сообщения, достаточный для маппинга в\n * `IRtChat.Message`. Доменные модели удовлетворяют ему по форме;\n * роль-специфика (автор/own/system) задаётся опциями.\n */\nexport interface IRtMappableMessage {\n id: string | number;\n tempId?: string;\n status?: IRtChat.MessageStatus;\n message: string;\n messageDelta: IQuillDelta | null;\n createdAt: string;\n fileUrl: string | null;\n attachments: readonly { id: number; name: string; publicId: string }[];\n}\n\n/**\n * Опции маппинга: роль-специфичные куски, которые не вывести из общего контракта.\n *\n * - `roleLabel` — подпись автора (обычно ярлык роли).\n * - `isOwn` — своё ли это сообщение (правый пузырь).\n * - `isSystem` — системное ли (нейтральный стиль); по умолчанию нет.\n * - `fileName` — имя файла вложения; по умолчанию выводится из `fileUrl`.\n * - `optimistic` — включить `tempId`/`status` (оптимистичная отправка); по умолчанию да.\n * Для read-only тредов (агент) — `false`: тогда `id` берётся из серверного `id`.\n */\nexport interface IToRtMessageOptions<TMessage extends IRtMappableMessage> {\n roleLabel: (message: TMessage) => string;\n isOwn: (message: TMessage) => boolean;\n isSystem?: (message: TMessage) => boolean;\n fileName?: (message: TMessage) => string | null;\n optimistic?: boolean;\n}\n\n/**\n * Собрать `IRtChat.Message` из доменного сообщения. Общие поля (текст, delta,\n * дата, вложения, файл) берутся из контракта; автор/own/system/имя файла —\n * из опций. Ключ `id` — `tempId ?? id` в оптимистичном режиме (пока сервер не\n * подтвердил), иначе серверный `id`.\n */\nexport function toRtMessage<TMessage extends IRtMappableMessage>(\n message: TMessage,\n options: IToRtMessageOptions<TMessage>\n): IRtChat.Message {\n const optimistic: boolean = options.optimistic ?? true;\n const fileNameFromUrlOrNull: string | null = message.fileUrl ? fileNameFromUrl(message.fileUrl) : null;\n return {\n id: optimistic ? (message.tempId ?? message.id) : message.id,\n tempId: optimistic ? message.tempId : undefined,\n status: optimistic ? message.status : undefined,\n author: options.roleLabel(message),\n own: options.isOwn(message),\n system: options.isSystem?.(message) ?? false,\n text: message.message,\n delta: message.messageDelta,\n createdAt: message.createdAt,\n fileUrl: message.fileUrl,\n fileName: options.fileName ? options.fileName(message) : fileNameFromUrlOrNull,\n attachments: message.attachments.map((attachment: { id: number; name: string; publicId: string }): IRtChat.Attachment => ({\n id: attachment.id,\n name: attachment.name,\n publicId: attachment.publicId,\n })),\n };\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n effect,\n forwardRef,\n input,\n InputSignal,\n InputSignalWithTransform,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '../icon/rt-icon.component';\n\nconst BEM_BLOCK: string = 'rt-checkbox';\n\n/**\n * Чекбокс с `role=\"checkbox\"` + `aria-checked` (`true`/`false`/`mixed`) поверх\n * нативного `<button>` — клавиатурный toggle (Enter/Space) работает «из коробки»\n * без отдельных keydown-хендлеров. Галочка/прочерк рисуются через `rt-icon`\n * (`check`/`minus`), бокс и цвета — на токенах `--rt-*`.\n *\n * Реализует `ControlValueAccessor` для `boolean` value через\n * `useExisting: forwardRef(...)` — `useClass` на self-reference вызывает\n * NG0200 cycle при boot'е.\n *\n * Source-of-truth для disabled — внутренний `isDisabled` signal: и signal-input\n * `disabled`, и CVA `setDisabledState` пишут в один и тот же signal (input —\n * через `effect()`, CVA — напрямую), так `[disabled]=\"true\"` и\n * `FormControl.disable()` ведут себя одинаково.\n *\n * `indeterminate` — чисто визуальное mixed-состояние; клик по нему разрешается\n * в `true` (стандартное поведение tri-state чекбокса).\n *\n * Текстовая подпись проецируется через `<ng-content>`.\n */\n@Component({\n selector: 'rt-checkbox',\n templateUrl: './rt-checkbox.component.html',\n styleUrl: './rt-checkbox.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // standalone components / directives\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef((): typeof RtCheckboxComponent => RtCheckboxComponent),\n multi: true,\n },\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtCheckboxComponent implements ControlValueAccessor {\n #onChange: (value: boolean) => void = (): void => undefined;\n #onTouched: () => void = (): void => undefined;\n\n protected readonly isChecked: WritableSignal<boolean> = signal<boolean>(false);\n protected readonly isDisabled: WritableSignal<boolean> = signal<boolean>(false);\n\n public readonly inputId: InputSignal<string | null> = input<string | null>(null);\n\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly indeterminate: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n constructor() {\n // Синхронизируем signal-input `disabled` в `isDisabled`, чтобы\n // `[disabled]=\"...\"` и `setDisabledState(...)` (CVA) писали в одно\n // и то же место. Effect живёт в injection context конструктора.\n effect((): void => {\n this.isDisabled.set(this.disabled());\n });\n }\n\n public writeValue(value: boolean | null | undefined): void {\n this.isChecked.set(value === true);\n }\n\n public registerOnChange(fn: (value: boolean) => void): void {\n this.#onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.#onTouched = fn;\n }\n\n public setDisabledState(disabled: boolean): void {\n this.isDisabled.set(disabled);\n }\n\n protected toggle(): void {\n if (this.isDisabled()) {\n return;\n }\n // mixed-состояние при клике разрешается в checked (tri-state контракт).\n const next: boolean = this.indeterminate() ? true : !this.isChecked();\n this.isChecked.set(next);\n this.#onChange(next);\n this.#onTouched();\n }\n}\n","<button\n rtBlock=\"rt-checkbox\"\n qa-dataid=\"checkbox-control\"\n type=\"button\"\n role=\"checkbox\"\n [rtMod]=\"{\n checked: isChecked() && !indeterminate(),\n indeterminate: indeterminate(),\n disabled: isDisabled(),\n }\"\n [attr.id]=\"inputId()\"\n [attr.aria-checked]=\"indeterminate() ? 'mixed' : isChecked()\"\n [attr.aria-label]=\"ariaLabel()\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\">\n <span rtElem=\"box\">\n @if (indeterminate()) {\n <rt-icon rtElem=\"icon\" name=\"minus\" size=\"xs\" color=\"inverse\" />\n } @else if (isChecked()) {\n <rt-icon rtElem=\"icon\" name=\"check\" size=\"xs\" color=\"inverse\" />\n }\n </span>\n\n <span rtElem=\"label\" qa-dataid=\"checkbox-label\">\n <ng-content />\n </span>\n</button>\n","import {\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n OnDestroy,\n Signal,\n signal,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-collapsible-text';\n\n@Component({\n selector: 'rt-collapsible-text',\n templateUrl: './rt-collapsible-text.component.html',\n styleUrl: './rt-collapsible-text.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtCollapsibleTextComponent implements OnDestroy {\n #resizeObserver: ResizeObserver | null = null;\n\n protected readonly textRef: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('text');\n\n protected readonly expanded: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly overflowing: WritableSignal<boolean> = signal<boolean>(false);\n\n public readonly paragraphs: InputSignal<readonly string[]> = input.required<readonly string[]>();\n\n public readonly clampLines: InputSignalWithTransform<number, number | string> = input<number, number | string>(6, {\n transform: numberAttribute,\n });\n\n constructor() {\n afterRenderEffect((): void => {\n this.paragraphs();\n this.#observeText();\n this.#measure();\n });\n }\n\n public ngOnDestroy(): void {\n this.#resizeObserver?.disconnect();\n }\n\n protected toggle(): void {\n this.expanded.update((expanded: boolean): boolean => !expanded);\n }\n\n #observeText(): void {\n const el: HTMLElement | undefined = this.textRef()?.nativeElement;\n if (el === undefined || this.#resizeObserver !== null) {\n return;\n }\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n this.#resizeObserver = new ResizeObserver((): void => this.#measure());\n this.#resizeObserver.observe(el);\n }\n\n #measure(): void {\n if (this.expanded()) {\n return;\n }\n const el: HTMLElement | undefined = this.textRef()?.nativeElement;\n if (el === undefined) {\n return;\n }\n this.overflowing.set(el.scrollHeight > el.clientHeight + 1);\n }\n}\n","<ng-container rtBlock=\"rt-collapsible-text\">\n <div\n #text\n rtElem=\"text\"\n qa-dataid=\"collapsible-text-body\"\n [rtMod]=\"{ clamped: !expanded() }\"\n [style.-webkit-line-clamp]=\"expanded() ? null : clampLines()\">\n @for (paragraph of paragraphs(); track $index) {\n <p rtElem=\"paragraph\" qa-dataid=\"collapsible-text-paragraph\">{{ paragraph }}</p>\n }\n </div>\n @if (overflowing() || expanded()) {\n <button rtElem=\"toggle\" qa-dataid=\"collapsible-text-toggle\" type=\"button\" [attr.aria-expanded]=\"expanded()\" (click)=\"toggle()\">\n {{ expanded() ? ('rtKit.uiCollapse' | transloco) : ('rtKit.uiMore' | transloco) }}\n </button>\n }\n</ng-container>\n","import { BreakpointObserver, BreakpointState, Breakpoints } from '@angular/cdk/layout';\nimport { Injectable, Signal, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\nimport { Observable, map } from 'rxjs';\n\n/** Порог узкого вьюпорта — тот же, что у `$breakpoint-lg` в стилях кита. */\nconst NARROW_VIEWPORT_QUERY: string = '(max-width: 1080px)';\n\n/**\n * Обёртка над CDK `BreakpointObserver` — публикует reactive signals для\n * mobile/tablet/desktop матчей. `toSignal()` обёртывает CDK Observable в Signal\n * с `initialValue` для CSR-safe рендера.\n */\n@Injectable({ providedIn: 'root' })\nexport class BreakpointsService {\n readonly #observer: BreakpointObserver = inject(BreakpointObserver);\n\n public readonly mobile: Signal<boolean> = toSignal(this.#match([Breakpoints.HandsetPortrait, Breakpoints.HandsetLandscape]), {\n initialValue: false,\n });\n\n public readonly tablet: Signal<boolean> = toSignal(this.#match([Breakpoints.TabletPortrait, Breakpoints.TabletLandscape]), {\n initialValue: false,\n });\n\n public readonly desktop: Signal<boolean> = toSignal(this.#match([Breakpoints.WebPortrait, Breakpoints.WebLandscape]), {\n initialValue: true,\n });\n\n /**\n * Узкий вьюпорт (≤1080px, планшет + мобила) — единый порог для компонентов,\n * которые на узком экране подменяют развёрнутый контрол на компактный\n * (напр. `rt-filter-control`: сегменты → `rt-select`). Совпадает с\n * брейкпоинтом 1080px из SCSS-конвенции кита. `initialValue: false` — на\n * SSR/CSR до первого matchMedia рендерим desktop-вариант.\n */\n public readonly narrow: Signal<boolean> = toSignal(this.#match([NARROW_VIEWPORT_QUERY]), {\n initialValue: false,\n });\n\n #match(queries: string[]): Observable<boolean> {\n return this.#observer.observe(queries).pipe(map((state: BreakpointState): boolean => state.matches));\n }\n}\n","import { Observable, Subject, filter } from 'rxjs';\n\n/**\n * Базовое событие шины: дискриминируется строковым `type`. Конкретные шины\n * сужают `T` до своего union'а типов событий, а полезную нагрузку добавляют\n * наследники интерфейса.\n */\nexport interface IMessageBusEvent<T = string> {\n readonly type: T;\n}\n\n/**\n * Лёгкая типизированная pub/sub-шина поверх RxJS `Subject`. Не зависит от\n * Angular DI и UI: эмиттер (например, стор) и потребитель (например, layout-\n * контейнер) развязаны — отправитель не знает, кто и как отрисует событие.\n *\n * - `emit` — опубликовать событие;\n * - `onEmit` — поток всех событий;\n * - `ofType` — поток событий конкретного типа (для точечной подписки).\n */\nexport class MessageBus<E extends IMessageBusEvent> {\n readonly #eventSource: Subject<E> = new Subject<E>();\n\n public emit(event: E): void {\n this.#eventSource.next(event);\n }\n\n public onEmit(): Observable<E> {\n return this.#eventSource.asObservable();\n }\n\n public ofType<T extends E['type']>(type: T): Observable<Extract<E, { type: T }>> {\n return this.#eventSource.asObservable().pipe(filter((event: E): event is Extract<E, { type: T }> => event.type === type));\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Observable } from 'rxjs';\n\nimport { MessageBus } from './message-bus';\nimport { INotification } from './notification.model';\n\n/**\n * Шина уведомлений приложения. Эмиттеры (сторы) публикуют сюда событие с\n * готовым текстом и severity и больше ничего не знают об отрисовке. Подписчик\n * (`rt-toaster`) слушает `onEmit()` и показывает toast'ы.\n *\n * Convenience-методы `success/info/warning/error` собирают событие: первым\n * аргументом — текст для пользователя, вторым (необязательно) — доменный\n * action-тип для точечной фильтрации через `ofType`. Если тип не передан,\n * подставляется значение severity.\n */\n@Injectable({ providedIn: 'root' })\nexport class NotificationBus {\n readonly #bus: MessageBus<INotification.Event> = new MessageBus<INotification.Event>();\n\n public emit(event: INotification.Event): void {\n this.#bus.emit(event);\n }\n\n public onEmit(): Observable<INotification.Event> {\n return this.#bus.onEmit();\n }\n\n public ofType(type: string): Observable<INotification.Event> {\n return this.#bus.ofType(type);\n }\n\n public success(message: string, type: string = 'success', options: INotification.Options = {}): void {\n this.emit({ type, payload: { message, severity: 'success', ...options } });\n }\n\n public info(message: string, type: string = 'info', options: INotification.Options = {}): void {\n this.emit({ type, payload: { message, severity: 'info', ...options } });\n }\n\n public warning(message: string, type: string = 'warning', options: INotification.Options = {}): void {\n this.emit({ type, payload: { message, severity: 'warning', ...options } });\n }\n\n public error(message: string, type: string = 'danger', options: INotification.Options = {}): void {\n this.emit({ type, payload: { message, severity: 'danger', ...options } });\n }\n}\n","/**\n * Ключи браузерного хранилища, которые кит занимает под себя. Единый реестр\n * вместо констант, разбросанных по компонентам: так видно весь занятый\n * неймспейс и не возникает двух ключей на одно и то же. Значения читает и пишет\n * только `StorageService` из `@rt-tools/core`.\n *\n * Неймспейс `rt.` отделяет их от ключей приложения-потребителя.\n */\nexport enum ERtStorageKeys {\n /** Выбранная тема оформления: переживает перезагрузку и смену пользователя */\n Theme = 'rt.theme',\n\n /** Префикс, а не полный ключ: итоговый вид — `rt.table.columns.<tableId>`. */\n TableColumnsPrefix = 'rt.table.columns.',\n}\n","import { DOCUMENT } from '@angular/common';\nimport { computed, effect, Injectable, Signal, WritableSignal, inject, signal } from '@angular/core';\n\nimport { PlatformService, StorageService } from '@rt-tools/core';\n\nimport { ERtStorageKeys } from './storage-keys.const';\nimport { ITheme } from './theme.model';\n\nconst DEFAULT_THEME: ITheme.Mode = 'light';\n\n/**\n * Глобальный сервис темы. Применяет `data-theme` к `<html>` через DOM-эффект,\n * персистит выбор под единственным device-level ключом. Тема не привязана к\n * пользователю: на одном устройстве последняя выставленная тема переживает\n * вход, выход и перезагрузку.\n */\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n readonly #storage: StorageService = inject(StorageService);\n readonly #document: Document = inject(DOCUMENT);\n readonly #platform: PlatformService = inject(PlatformService);\n\n readonly #currentTheme: WritableSignal<ITheme.Mode> = signal<ITheme.Mode>(this.#readOrDefault());\n\n public readonly current: Signal<ITheme.Mode> = this.#currentTheme.asReadonly();\n\n public readonly isDark: Signal<boolean> = computed((): boolean => this.#currentTheme() === 'dark');\n\n constructor() {\n effect((): void => {\n const theme: ITheme.Mode = this.#currentTheme();\n // Prerender/SSR-окружение не даёт documentElement.dataset — тему\n // применяем только в браузере, серверный HTML остаётся в light.\n if (!this.#platform.isPlatformBrowser) {\n return;\n }\n this.#document.documentElement.dataset['theme'] = theme;\n this.#storage.setItem(ERtStorageKeys.Theme, theme);\n });\n }\n\n public toggle(): void {\n this.#currentTheme.update((mode: ITheme.Mode): ITheme.Mode => (mode === 'light' ? 'dark' : 'light'));\n }\n\n public setTheme(theme: ITheme.Mode): void {\n this.#currentTheme.set(theme);\n }\n\n #readOrDefault(): ITheme.Mode {\n const stored: ITheme.Mode | null = this.#storage.getItem<ITheme.Mode>(ERtStorageKeys.Theme) ?? null;\n return stored === 'light' || stored === 'dark' ? stored : DEFAULT_THEME;\n }\n}\n","import { INotification } from '../../platform';\n\nexport const RT_TOASTER_GAP_PX: number = 14;\n\nexport namespace IRtToaster {\n export type Position = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\n\n export type PositionY = 'top' | 'bottom';\n\n export type PositionX = 'left' | 'center' | 'right';\n\n export interface Toast {\n readonly id: number;\n readonly severity: INotification.Severity;\n readonly message: string;\n readonly description?: string;\n readonly meta?: string;\n readonly action?: INotification.Action;\n readonly secondaryAction?: INotification.Action;\n readonly filled?: boolean;\n }\n\n export interface Height {\n readonly toastId: number;\n readonly height: number;\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n InputSignal,\n OnDestroy,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { INotification } from '../../platform';\n\nimport { RtButtonDirective } from '../button/rt-button.directive';\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { RtIconComponent } from '../icon/rt-icon.component';\nimport { IRtIcon } from '../icon/rt-icon.model';\nimport { RT_TOASTER_GAP_PX, IRtToaster } from './rt-toaster.model';\n\nconst BEM_BLOCK: string = 'rt-toast';\n\nconst UNMOUNT_DELAY_MS: number = 200;\n\n@Component({\n selector: 'rt-toast',\n templateUrl: './rt-toast.component.html',\n styleUrl: './rt-toast.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtButtonDirective, RtIconComponent, RtIconButtonComponent, BlockDirective, ElemDirective, TranslocoPipe],\n host: {\n class: BEM_BLOCK,\n role: 'status',\n 'aria-atomic': 'true',\n },\n})\nexport class RtToastComponent implements AfterViewInit, OnDestroy {\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n\n readonly #severityIcon: Readonly<Record<INotification.Severity, IRtIcon.Name>> = {\n info: 'info-circle',\n success: 'check-circle',\n warning: 'exclamation-circle',\n danger: 'times-circle',\n };\n\n readonly #mounted: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #removed: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #offsetBeforeRemove: WritableSignal<number> = signal<number>(0);\n\n readonly #initialHeight: WritableSignal<number> = signal<number>(0);\n\n readonly #heightIndex: Signal<number> = computed((): number =>\n this.heights().findIndex((item: IRtToaster.Height): boolean => item.toastId === this.toast().id)\n );\n\n readonly #heightBefore: Signal<number> = computed((): number =>\n this.heights().reduce(\n (total: number, item: IRtToaster.Height, itemIndex: number): number =>\n itemIndex >= this.#heightIndex() ? total : total + item.height,\n 0\n )\n );\n\n readonly #offset: Signal<number> = computed((): number => Math.round(this.#heightIndex() * RT_TOASTER_GAP_PX + this.#heightBefore()));\n\n readonly #positionY: Signal<IRtToaster.PositionY> = computed((): IRtToaster.PositionY =>\n this.position().startsWith('top') ? 'top' : 'bottom'\n );\n\n #timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n #unmountTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n #remainingTimeMs: number = 0;\n\n #closeTimerStartedAt: number = 0;\n\n #closeTimerPausedAt: number = 0;\n\n protected readonly icon: Signal<IRtIcon.Name> = computed((): IRtIcon.Name => this.#severityIcon[this.toast().severity]);\n\n public readonly toast: InputSignal<IRtToaster.Toast> = input.required<IRtToaster.Toast>();\n\n public readonly index: InputSignal<number> = input.required<number>();\n\n public readonly totalToasts: InputSignal<number> = input.required<number>();\n\n public readonly heights: InputSignal<IRtToaster.Height[]> = input.required<IRtToaster.Height[]>();\n\n public readonly expanded: InputSignal<boolean> = input.required<boolean>();\n\n public readonly expandByDefault: InputSignal<boolean> = input<boolean>(false);\n\n public readonly interacting: InputSignal<boolean> = input<boolean>(false);\n\n public readonly position: InputSignal<IRtToaster.Position> = input<IRtToaster.Position>('bottom-right');\n\n public readonly visibleToasts: InputSignal<number> = input<number>(3);\n\n public readonly duration: InputSignal<number> = input<number>(4000);\n\n public readonly heightAdded: OutputEmitterRef<IRtToaster.Height> = output<IRtToaster.Height>();\n\n public readonly heightRemoved: OutputEmitterRef<number> = output<number>();\n\n public readonly dismissed: OutputEmitterRef<number> = output<number>();\n\n @HostBinding('class')\n public get hostModifierClasses(): Record<string, boolean> {\n return {\n [`${BEM_BLOCK}--severity--${this.toast().severity}`]: true,\n [`${BEM_BLOCK}--filled`]: this.toast().filled === true,\n [`${BEM_BLOCK}--y--${this.#positionY()}`]: true,\n [`${BEM_BLOCK}--mounted`]: this.#mounted(),\n [`${BEM_BLOCK}--removed`]: this.#removed(),\n [`${BEM_BLOCK}--front`]: this.index() === 0,\n [`${BEM_BLOCK}--hidden`]: this.index() + 1 > this.visibleToasts(),\n [`${BEM_BLOCK}--expanded`]: this.expanded() || (this.expandByDefault() && this.#mounted()),\n };\n }\n\n @HostBinding('style')\n public get hostStackStyles(): Record<string, string> {\n return {\n '--index': `${this.index()}`,\n '--toasts-before': `${this.index()}`,\n '--z-index': `${this.totalToasts() - this.index()}`,\n '--offset': `${this.#removed() ? this.#offsetBeforeRemove() : this.#offset()}px`,\n '--initial-height': this.expandByDefault() ? 'auto' : `${this.#initialHeight()}px`,\n };\n }\n\n constructor() {\n effect((onCleanup: (cleanup: () => void) => void): void => {\n if (!this.#mounted() || this.#removed()) {\n return;\n }\n\n if (this.expanded() || this.interacting()) {\n this.#pauseTimer();\n } else {\n this.#startTimer();\n }\n\n onCleanup((): void => clearTimeout(this.#timeoutId));\n });\n }\n\n public ngAfterViewInit(): void {\n this.#remainingTimeMs = this.duration();\n\n const height: number = this.#host.nativeElement.getBoundingClientRect().height;\n this.#initialHeight.set(height);\n this.heightAdded.emit({ toastId: this.toast().id, height });\n\n this.#mounted.set(true);\n }\n\n public ngOnDestroy(): void {\n clearTimeout(this.#timeoutId);\n clearTimeout(this.#unmountTimeoutId);\n }\n\n protected onAction(): void {\n this.toast().action?.handler();\n this.#deleteToast();\n }\n\n protected onSecondaryAction(): void {\n this.toast().secondaryAction?.handler();\n this.#deleteToast();\n }\n\n protected onClose(): void {\n this.#deleteToast();\n }\n\n #deleteToast(): void {\n if (this.#removed()) {\n return;\n }\n\n this.#removed.set(true);\n this.#offsetBeforeRemove.set(this.#offset());\n this.heightRemoved.emit(this.toast().id);\n\n this.#unmountTimeoutId = setTimeout((): void => this.dismissed.emit(this.toast().id), UNMOUNT_DELAY_MS);\n }\n\n #startTimer(): void {\n this.#closeTimerStartedAt = Date.now();\n this.#timeoutId = setTimeout((): void => this.#deleteToast(), this.#remainingTimeMs);\n }\n\n #pauseTimer(): void {\n if (this.#closeTimerPausedAt < this.#closeTimerStartedAt) {\n const elapsedMs: number = Date.now() - this.#closeTimerStartedAt;\n this.#remainingTimeMs = this.#remainingTimeMs - elapsedMs;\n }\n\n this.#closeTimerPausedAt = Date.now();\n }\n}\n","<ng-container rtBlock=\"rt-toast\">\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"icon()\" [color]=\"toast().severity\" />\n <div rtElem=\"content\" qa-dataid=\"toast-content\">\n @if (toast().meta; as meta) {\n <span rtElem=\"meta\" qa-dataid=\"toast-meta\">{{ meta }}</span>\n }\n <span rtElem=\"message\" qa-dataid=\"toast-message\">{{ toast().message }}</span>\n @if (toast().description; as description) {\n <span rtElem=\"description\" qa-dataid=\"toast-description\">{{ description }}</span>\n }\n @if (toast().action || toast().secondaryAction) {\n <div rtElem=\"actions\">\n @if (toast().action; as action) {\n <button rtButton rtElem=\"action\" qa-dataid=\"toast-action\" size=\"sm\" type=\"button\" (click)=\"onAction()\">\n {{ action.label }}\n </button>\n }\n @if (toast().secondaryAction; as secondaryAction) {\n <button\n rtButton\n rtElem=\"action\"\n qa-dataid=\"toast-secondary-action\"\n size=\"sm\"\n theme=\"secondary\"\n appearance=\"text\"\n type=\"button\"\n (click)=\"onSecondaryAction()\">\n {{ secondaryAction.label }}\n </button>\n }\n </div>\n }\n </div>\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"toast-close\"\n icon=\"ico-close\"\n variant=\"ghost\"\n size=\"sm\"\n [ariaLabel]=\"'rtKit.uiClose' | transloco\"\n (clicked)=\"onClose()\" />\n</ng-container>\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n booleanAttribute,\n computed,\n inject,\n input,\n linkedSignal,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { INotification, NotificationBus } from '../../platform';\n\nimport { RtToastComponent } from './rt-toast.component';\nimport { RT_TOASTER_GAP_PX, IRtToaster } from './rt-toaster.model';\n\nconst BEM_BLOCK: string = 'rt-toaster';\n\nconst DEFAULT_DURATION_MS: number = 4000;\n\nconst DEFAULT_VISIBLE_TOASTS: number = 3;\n\n@Component({\n selector: 'rt-toaster',\n templateUrl: './rt-toaster.component.html',\n styleUrl: './rt-toaster.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtToastComponent],\n host: {\n class: BEM_BLOCK,\n role: 'region',\n '[attr.aria-label]': 'ariaLabel()',\n '(mouseenter)': 'onStackEnter()',\n '(mousemove)': 'onStackEnter()',\n '(mouseleave)': 'onStackLeave()',\n '(pointerdown)': 'onStackPointerDown()',\n '(pointerup)': 'onStackPointerUp()',\n },\n})\nexport class RtToasterComponent {\n readonly #notificationBus: NotificationBus = inject(NotificationBus);\n\n protected readonly ariaLabel: Signal<string> = translateSignal('rtKit.uiNotifications');\n\n #toastCounter: number = 0;\n\n protected readonly toasts: WritableSignal<IRtToaster.Toast[]> = signal<IRtToaster.Toast[]>([]);\n\n protected readonly heights: WritableSignal<IRtToaster.Height[]> = signal<IRtToaster.Height[]>([]);\n\n protected readonly expanded: WritableSignal<boolean> = linkedSignal<IRtToaster.Toast[], boolean>({\n source: this.toasts,\n computation: (toasts: IRtToaster.Toast[]): boolean => toasts.length < 1,\n });\n\n protected readonly interacting: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly positionY: Signal<IRtToaster.PositionY> = computed((): IRtToaster.PositionY =>\n this.position().startsWith('top') ? 'top' : 'bottom'\n );\n\n protected readonly positionX: Signal<IRtToaster.PositionX> = computed((): IRtToaster.PositionX => {\n if (this.position().endsWith('left')) {\n return 'left';\n }\n return this.position().endsWith('center') ? 'center' : 'right';\n });\n\n public readonly position: InputSignal<IRtToaster.Position> = input<IRtToaster.Position>('bottom-right');\n\n public readonly duration: InputSignalWithTransform<number, number | string> = input<number, number | string>(DEFAULT_DURATION_MS, {\n transform: numberAttribute,\n });\n\n public readonly visibleToasts: InputSignalWithTransform<number, number | string> = input<number, number | string>(\n DEFAULT_VISIBLE_TOASTS,\n { transform: numberAttribute }\n );\n\n public readonly expand: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n @HostBinding('class')\n public get hostModifierClasses(): Record<string, boolean> {\n return {\n [`${BEM_BLOCK}--y--${this.positionY()}`]: true,\n [`${BEM_BLOCK}--x--${this.positionX()}`]: true,\n };\n }\n\n @HostBinding('style')\n public get hostStackStyles(): Record<string, string> {\n return {\n '--front-toast-height': `${this.heights()[0]?.height ?? 0}px`,\n '--gap': `${RT_TOASTER_GAP_PX}px`,\n };\n }\n\n constructor() {\n this.#notificationBus\n .onEmit()\n .pipe(takeUntilDestroyed())\n .subscribe((event: INotification.Event): void => this.#addToast(event));\n }\n\n protected onStackEnter(): void {\n if (this.toasts().length > 0) {\n this.expanded.set(true);\n }\n }\n\n protected onStackLeave(): void {\n if (!this.interacting()) {\n this.expanded.set(false);\n }\n }\n\n protected onStackPointerDown(): void {\n this.interacting.set(true);\n }\n\n protected onStackPointerUp(): void {\n this.interacting.set(false);\n }\n\n protected onHeightAdded(height: IRtToaster.Height): void {\n this.heights.update((items: IRtToaster.Height[]): IRtToaster.Height[] =>\n this.#sortHeights([height, ...items.filter((item: IRtToaster.Height): boolean => item.toastId !== height.toastId)])\n );\n }\n\n protected onHeightRemoved(toastId: number): void {\n this.heights.update((items: IRtToaster.Height[]): IRtToaster.Height[] =>\n items.filter((item: IRtToaster.Height): boolean => item.toastId !== toastId)\n );\n }\n\n protected onDismissed(toastId: number): void {\n this.onHeightRemoved(toastId);\n this.toasts.update((items: IRtToaster.Toast[]): IRtToaster.Toast[] =>\n items.filter((item: IRtToaster.Toast): boolean => item.id !== toastId)\n );\n }\n\n #addToast(event: INotification.Event): void {\n this.#toastCounter += 1;\n const toast: IRtToaster.Toast = {\n id: this.#toastCounter,\n severity: event.payload.severity,\n message: event.payload.message,\n description: event.payload.description,\n meta: event.payload.meta,\n action: event.payload.action,\n secondaryAction: event.payload.secondaryAction,\n filled: event.payload.filled,\n };\n this.toasts.update((items: IRtToaster.Toast[]): IRtToaster.Toast[] => [toast, ...items]);\n }\n\n #sortHeights(items: IRtToaster.Height[]): IRtToaster.Height[] {\n const order: number[] = this.toasts().map((toast: IRtToaster.Toast): number => toast.id);\n return [...items].sort(\n (left: IRtToaster.Height, right: IRtToaster.Height): number => order.indexOf(left.toastId) - order.indexOf(right.toastId)\n );\n }\n}\n","@for (item of toasts(); track item.id) {\n <rt-toast\n qa-dataid=\"toast\"\n [toast]=\"item\"\n [index]=\"$index\"\n [totalToasts]=\"toasts().length\"\n [heights]=\"heights()\"\n [expanded]=\"expanded()\"\n [expandByDefault]=\"expand()\"\n [interacting]=\"interacting()\"\n [position]=\"position()\"\n [visibleToasts]=\"visibleToasts()\"\n [duration]=\"duration()\"\n (heightAdded)=\"onHeightAdded($event)\"\n (heightRemoved)=\"onHeightRemoved($event)\"\n (dismissed)=\"onDismissed($event)\" />\n}\n","import { Injectable, WritableSignal, signal } from '@angular/core';\n\n/**\n * Приватный signal-store для `rt-container`.\n *\n * Хранит open-state левой docked sidenav. Driver-директива\n * `[rtContainerLeftSidenavPanel]` пишет в `leftSidenavOpen`, шаблон\n * `RtContainerComponent` читает через signal-tracking.\n *\n * Provided component-level через `providers: [RtContainerStateService]` на\n * `RtContainerComponent` — per-instance state, без singleton'а. Pure signal IO\n * с автоматической reactivity.\n *\n * Правая sidenav (overlay) НЕ хранится здесь: её open-state живёт прямо в\n * `RtContainerComponent.rightOpen` сигнале и управляется через `openRight()` /\n * `closeRight()` методы + lifecycle outputs.\n */\n@Injectable()\nexport class RtContainerStateService {\n public readonly leftSidenavOpen: WritableSignal<boolean> = signal<boolean>(true);\n}\n","import { DestroyRef, Directive, OnDestroy, OutputEmitterRef, Signal, inject, output } from '@angular/core';\nimport { outputToObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { RtContainerStateService } from './rt-container-state.service';\nimport { RtContainerComponent } from './rt-container.component';\n\n/**\n * Маркер-директива для содержимого хедера `rt-container`.\n *\n * @example\n * ```html\n * <rt-container>\n * <ng-container *rtContainerHeader>\n * <rt-header />\n * </ng-container>\n * </rt-container>\n * ```\n */\n@Directive({\n selector: '[rtContainerHeader]',\n})\nexport class RtContainerHeaderDirective {}\n\n/**\n * Маркер-директива для контента левой sidenav в `rt-container`.\n *\n * @example\n * ```html\n * <rt-container>\n * <ng-container *rtContainerLeftSidenav>\n * <router-outlet name=\"lo\" />\n * </ng-container>\n * </rt-container>\n * ```\n */\n@Directive({\n selector: '[rtContainerLeftSidenav]',\n})\nexport class RtContainerLeftSidenavDirective {}\n\n/**\n * Маркер-директива для контента правой sidenav в `rt-container`.\n *\n * @example\n * ```html\n * <rt-container>\n * <ng-container *rtContainerRightSidenav>\n * <router-outlet name=\"ro\" />\n * </ng-container>\n * </rt-container>\n * ```\n */\n@Directive({\n selector: '[rtContainerRightSidenav]',\n})\nexport class RtContainerRightSidenavDirective {}\n\n/**\n * Маркер-директива для контента в левой секции toolbar.\n *\n * @example\n * ```html\n * <rt-container>\n * <ng-container *rtContainerToolbarLeft>\n * <router-outlet name=\"lb\" />\n * </ng-container>\n * </rt-container>\n * ```\n */\n@Directive({\n selector: '[rtContainerToolbarLeft]',\n})\nexport class RtContainerToolbarLeftDirective {}\n\n/**\n * Маркер-директива для контента в центральной секции toolbar.\n *\n * @example\n * ```html\n * <rt-container>\n * <ng-container *rtContainerToolbarCenter>\n * <router-outlet name=\"cb\" />\n * </ng-container>\n * </rt-container>\n * ```\n */\n@Directive({\n selector: '[rtContainerToolbarCenter]',\n})\nexport class RtContainerToolbarCenterDirective {}\n\n/**\n * Маркер-директива для контента в правой секции toolbar.\n *\n * @example\n * ```html\n * <rt-container>\n * <ng-container *rtContainerToolbarRight>\n * <router-outlet name=\"rb\" />\n * </ng-container>\n * </rt-container>\n * ```\n */\n@Directive({\n selector: '[rtContainerToolbarRight]',\n})\nexport class RtContainerToolbarRightDirective {}\n\n/**\n * Маркер-директива для основного контента `rt-container`.\n *\n * @example\n * ```html\n * <rt-container>\n * <ng-container *rtContainerContent>\n * <router-outlet />\n * </ng-container>\n * </rt-container>\n * ```\n */\n@Directive({\n selector: '[rtContainerContent]',\n})\nexport class RtContainerContentDirective {}\n\n/**\n * Driver-директива для управления левой sidenav через шаблонную ссылку.\n *\n * Пишет в component-scoped `RtContainerStateService.leftSidenavOpen` signal —\n * шаблон контейнера читает этот signal и применяет docked grid-cell состояние.\n *\n * @example\n * ```html\n * <ng-container rtContainerLeftSidenavPanel #left=\"containerLeftPanel\">\n * <button (click)=\"left.toggle(true)\">Open</button>\n * </ng-container>\n * ```\n */\n@Directive({\n selector: '[rtContainerLeftSidenavPanel]',\n exportAs: 'containerLeftPanel',\n})\nexport class RtContainerLeftSidenavPanelDirective {\n readonly #state: RtContainerStateService = inject(RtContainerStateService);\n\n public open(): void {\n this.#state.leftSidenavOpen.set(true);\n }\n\n public close(): void {\n this.#state.leftSidenavOpen.set(false);\n }\n\n public toggle(isOpen: boolean): void {\n this.#state.leftSidenavOpen.set(isOpen);\n }\n}\n\n/**\n * Driver-директива правой sidenav: route-component вызывает `open()`/`close()`,\n * rt-container выполняет slide-in/slide-out через CSS transform. После завершения\n * анимации driver эмитит `(opened)` / `(closed)`; backdrop click и ESC контейнера\n * эмитятся через `(cancelled)` — консьюмер сам решает что делать (обычно `close()`).\n *\n * Sub'ы через `takeUntilDestroyed` снимаются при разрушении route-component'а.\n * При уничтожении с открытой панелью гарантирует cleanup overlay'я (см. `ngOnDestroy`),\n * иначе при hard-navigate без `panel.close()` overlay останется висеть.\n *\n * @example\n * ```html\n * <ng-container\n * rtContainerRightSidenavPanel\n * #right=\"rtContainerRightPanel\"\n * (cancelled)=\"onClose()\"\n * (closed)=\"onClosed()\">\n * </ng-container>\n * ```\n */\n@Directive({\n selector: '[rtContainerRightSidenavPanel]',\n exportAs: 'rtContainerRightPanel',\n})\nexport class RtContainerRightSidenavPanelDirective implements OnDestroy {\n readonly #container: RtContainerComponent = inject(RtContainerComponent);\n\n public readonly opened: OutputEmitterRef<void> = output<void>();\n\n public readonly closed: OutputEmitterRef<void> = output<void>();\n\n public readonly cancelled: OutputEmitterRef<void> = output<void>();\n\n /**\n * Re-export rt-container.rightOverlayReady — `true` когда CDK Overlay создан\n * и attache'нут. Консьюмер должен ждать этого signal'а в effect'е, перед\n * тем как вызывать `panel.open()` (иначе race: rt-container.effect ещё не\n * создал overlay → openRight() рано вернётся → --entering остаётся).\n */\n public readonly ready: Signal<boolean> = this.#container.rightOverlayReady;\n\n constructor() {\n const destroyRef: DestroyRef = inject(DestroyRef);\n\n // `output()` возвращает OutputEmitterRef (нет .pipe) — оборачиваем через\n // outputToObservable, чтобы пристегнуть takeUntilDestroyed.\n outputToObservable(this.#container.backdropClick)\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe((): void => this.cancelled.emit());\n\n outputToObservable(this.#container.rightOpened)\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe((): void => this.opened.emit());\n\n outputToObservable(this.#container.rightClosed)\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe((): void => this.closed.emit());\n }\n\n public ngOnDestroy(): void {\n // Если route-component разрушается при открытой панели (hard-navigate без\n // явного close через panel.close) — гарантируем cleanup, иначе overlay\n // останется висеть после смены роута.\n if (this.#container.rightOpen()) {\n this.#container.closeRight();\n }\n }\n\n public open(): void {\n this.#container.openRight();\n }\n\n public close(): void {\n this.#container.closeRight();\n }\n}\n\n/**\n * Driver-директива для основного content-региона `rt-container`.\n *\n * Объявляет 3 outputs (`scrolled/scrolledUp/scrolledDown`) — публичную поверхность\n * для будущих consumer'ов. Real-time wiring (scroll listeners → emit) отложено\n * до первого реального потребителя.\n *\n * @example\n * ```html\n * <ng-container\n * rtContainerContentPanel\n * (scrolled)=\"onScroll()\"\n * >\n * <router-outlet />\n * </ng-container>\n * ```\n */\n@Directive({\n selector: '[rtContainerContentPanel]',\n})\nexport class RtContainerContentPanelDirective {\n public readonly scrolled: OutputEmitterRef<void> = output<void>();\n\n public readonly scrolledUp: OutputEmitterRef<void> = output<void>();\n\n public readonly scrolledDown: OutputEmitterRef<void> = output<void>();\n}\n","import { BlockScrollStrategy, Overlay, OverlayConfig, OverlayRef, PositionStrategy, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n OutputEmitterRef,\n Renderer2,\n RendererFactory2,\n Signal,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n WritableSignal,\n computed,\n contentChild,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { map, merge, Observable, Subject, switchMap, takeUntil } from 'rxjs';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtToasterComponent } from '../toast/rt-toaster.component';\nimport { RtContainerStateService } from './rt-container-state.service';\nimport {\n RtContainerContentDirective,\n RtContainerHeaderDirective,\n RtContainerLeftSidenavDirective,\n RtContainerRightSidenavDirective,\n RtContainerToolbarCenterDirective,\n RtContainerToolbarLeftDirective,\n RtContainerToolbarRightDirective,\n} from './rt-container.directives';\n\n/** Запас поверх длительности transition'а для страховочного таймера. */\nconst ASIDE_TRANSITION_BUFFER_MS: number = 80;\n\nconst BEM_BLOCK: string = 'rt-container';\n\n/**\n * Multi-slot container с CSS-grid layout. Slot consumers wrap content в\n * `*rtContainerXxx` structural directives, контейнер подхватывает шаблоны через\n * `contentChild(..., { read: TemplateRef })` + рендерит через `*ngTemplateOutlet`.\n *\n * Slots: `header`, `leftSidenav`, `toolbarLeft/Center/Right`, `content` — живут в\n * CSS-grid. `rightSidenav` рендерится через CDK Overlay поверх grid'а (slide-in\n * side-sheet), а не как grid-cell — overlay переиспользует глобальные\n * `rt-aside-overlay` / `rt-aside-backdrop` классы из rt-aside, чтобы анимация и\n * backdrop вели себя идентично программно открываемым asides.\n *\n * Driver-directives (`[rtContainerLeftSidenavPanel/RightSidenavPanel]`) общаются с\n * контейнером через `RtContainerStateService` (для левой docked) и через\n * `openRight()/closeRight()` + lifecycle outputs (для правой overlay).\n */\n@Component({\n selector: 'rt-container',\n templateUrl: './rt-container.component.html',\n styleUrls: ['./rt-container.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n NgTemplateOutlet,\n\n // standalone components / directives\n RtToasterComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n providers: [RtContainerStateService],\n host: {\n class: BEM_BLOCK,\n '[class.rt-container--mobile-left-bottom]': \"mobileLeftNav() === 'bottom'\",\n '[class.rt-container--viewport]': \"height() === 'viewport'\",\n },\n})\nexport class RtContainerComponent {\n readonly #overlay: Overlay = inject(Overlay);\n readonly #vcr: ViewContainerRef = inject(ViewContainerRef);\n readonly #scrollStrategies: ScrollStrategyOptions = inject(ScrollStrategyOptions);\n readonly #blockScroll: BlockScrollStrategy = this.#scrollStrategies.block();\n readonly #renderer: Renderer2 = inject(RendererFactory2).createRenderer(null, null);\n readonly #window: Window | null = inject(DOCUMENT).defaultView;\n\n readonly #rightOverlaySource: Subject<OverlayRef> = new Subject<OverlayRef>();\n\n #overlayRef: OverlayRef | null = null;\n\n readonly #overlayRefSignal: WritableSignal<OverlayRef | null> = signal<OverlayRef | null>(null);\n\n protected readonly headerTpl: Signal<TemplateRef<unknown> | undefined> = contentChild(RtContainerHeaderDirective, {\n read: TemplateRef,\n });\n\n protected readonly leftSidenavTpl: Signal<TemplateRef<unknown> | undefined> = contentChild(RtContainerLeftSidenavDirective, {\n read: TemplateRef,\n });\n\n protected readonly rightSidenavTpl: Signal<TemplateRef<unknown> | undefined> = contentChild(RtContainerRightSidenavDirective, {\n read: TemplateRef,\n });\n\n protected readonly toolbarLeftTpl: Signal<TemplateRef<unknown> | undefined> = contentChild(RtContainerToolbarLeftDirective, {\n read: TemplateRef,\n });\n\n protected readonly toolbarCenterTpl: Signal<TemplateRef<unknown> | undefined> = contentChild(RtContainerToolbarCenterDirective, {\n read: TemplateRef,\n });\n\n protected readonly toolbarRightTpl: Signal<TemplateRef<unknown> | undefined> = contentChild(RtContainerToolbarRightDirective, {\n read: TemplateRef,\n });\n\n protected readonly contentTpl: Signal<TemplateRef<unknown> | undefined> = contentChild(RtContainerContentDirective, {\n read: TemplateRef,\n });\n\n /**\n * Поведение левого sidenav на мобилке (<=768px): `keep` — остаётся боковой\n * колонкой (по умолчанию, десктоп-стиль); `bottom` — сворачивается в нижний\n * ряд grid'а (таб-бар), контент занимает всю ширину и скроллится над ним.\n */\n public readonly mobileLeftNav: InputSignal<'keep' | 'bottom'> = input<'keep' | 'bottom'>('keep');\n\n /**\n * Высота контейнера: `auto` — растёт под контент, скроллится документ (по\n * умолчанию; на этом держится sticky-хедер); `viewport` — контейнер жёстко\n * равен вьюпорту, страница не скроллится вовсе, а скроллятся зоны внутри —\n * каждая сама по себе (app-shell раскладка, напр. чаты бот-панели).\n */\n public readonly height: InputSignal<'auto' | 'viewport'> = input<'auto' | 'viewport'>('auto');\n\n public readonly backdropClick: OutputEmitterRef<void> = output<void>();\n\n public readonly rightOpened: OutputEmitterRef<void> = output<void>();\n\n public readonly rightClosed: OutputEmitterRef<void> = output<void>();\n\n public readonly rightOpen: WritableSignal<boolean> = signal<boolean>(false);\n\n /**\n * `true` когда CDK Overlay для правой sidenav создан и attache'нут (см.\n * effect в constructor'е). Дёргать panel.open() из консьюмера можно только\n * когда это true — иначе openRight() видит null overlayRef и early-return'ит,\n * --entering modifier остаётся, панель остаётся за экраном. Re-exposed на\n * driver через `panel.ready` для удобства route-driven dialog'ов.\n */\n public readonly rightOverlayReady: Signal<boolean> = computed((): boolean => this.#overlayRefSignal() !== null);\n\n constructor() {\n // Backdrop-click / ESC подписки правого overlay живут в одном\n // конструкторном стриме: #createRightOverlay эмитит созданный OverlayRef,\n // switchMap переключается на его event-стримы (предыдущий overlay к этому\n // моменту уже dispose'нут effect-cleanup'ом; `detachments()` терминирует\n // внутренний поток при dispose).\n this.#rightOverlaySource\n .pipe(\n switchMap((overlayRef: OverlayRef): Observable<() => void> =>\n merge(\n overlayRef.backdropClick().pipe(map((): (() => void) => (): void => this.backdropClick.emit())),\n overlayRef.keydownEvents().pipe(\n map((event: KeyboardEvent): (() => void) => (): void => {\n if (event.key !== 'Escape' || !this.rightOpen()) {\n return;\n }\n event.preventDefault();\n this.backdropClick.emit();\n })\n )\n ).pipe(takeUntil(overlayRef.detachments()))\n ),\n takeUntilDestroyed()\n )\n .subscribe((handleCloseIntent: () => void): void => handleCloseIntent());\n\n // Persistent overlay: создаётся при появлении rightSidenavTpl и живёт\n // до уничтожения rt-container'а. Это нужно чтобы <router-outlet name=\"ro\">\n // внутри slot template'а материализовался и мог активировать route.\n // Без auto-attach landmine: route не активируется → driver не вызывается\n // → ничего не открывается (chicken-and-egg).\n effect((onCleanup: (cleanup: () => void) => void): void => {\n const tpl: TemplateRef<unknown> | undefined = this.rightSidenavTpl();\n\n if (tpl === undefined || this.#overlayRef !== null) {\n return;\n }\n\n const overlayRef: OverlayRef = this.#createRightOverlay(tpl);\n this.#overlayRef = overlayRef;\n this.#overlayRefSignal.set(overlayRef);\n\n onCleanup((): void => {\n overlayRef.dispose();\n this.#overlayRef = null;\n this.#overlayRefSignal.set(null);\n });\n });\n }\n\n public openRight(): void {\n const overlayRef: OverlayRef | null = this.#overlayRef;\n if (overlayRef === null) {\n return;\n }\n\n this.#blockScroll.enable();\n\n this.#renderer.removeClass(overlayRef.overlayElement, 'rt-aside-overlay--entering');\n this.#renderer.removeClass(overlayRef.overlayElement, 'rt-aside-overlay--leaving');\n\n const backdropEl: HTMLElement | null = overlayRef.backdropElement;\n if (backdropEl !== null) {\n this.#renderer.addClass(backdropEl, 'rt-aside-backdrop--visible');\n }\n\n // Slide-in: на следующий paint добавляем --open.\n requestAnimationFrame((): void => {\n this.#renderer.addClass(overlayRef.overlayElement, 'rt-aside-overlay--open');\n this.#listenTransitionEnd(overlayRef, (): void => this.rightOpened.emit());\n });\n\n this.rightOpen.set(true);\n }\n\n public closeRight(): void {\n const overlayRef: OverlayRef | null = this.#overlayRef;\n if (overlayRef === null || !this.rightOpen()) {\n return;\n }\n\n this.#renderer.removeClass(overlayRef.overlayElement, 'rt-aside-overlay--open');\n this.#renderer.addClass(overlayRef.overlayElement, 'rt-aside-overlay--leaving');\n\n const backdropEl: HTMLElement | null = overlayRef.backdropElement;\n if (backdropEl !== null) {\n this.#renderer.removeClass(backdropEl, 'rt-aside-backdrop--visible');\n }\n\n this.#listenTransitionEnd(overlayRef, (): void => {\n this.#blockScroll.disable();\n this.rightOpen.set(false);\n this.rightClosed.emit();\n });\n }\n\n #createRightOverlay(tpl: TemplateRef<unknown>): OverlayRef {\n const positionStrategy: PositionStrategy = this.#overlay.position().global().right('0').top('0');\n\n const overlayConfig: OverlayConfig = {\n positionStrategy,\n // noop здесь, scroll-block управляется вручную через #blockScroll\n // в openRight/closeRight — иначе scroll заблокирован всегда\n // (overlay persistent), пока aside ещё не открыт.\n scrollStrategy: this.#overlay.scrollStrategies.noop(),\n hasBackdrop: true,\n backdropClass: 'rt-aside-backdrop',\n panelClass: ['rt-aside-overlay', 'rt-aside-overlay--position-right', 'rt-aside-overlay--entering'],\n disposeOnNavigation: false,\n };\n\n const overlayRef: OverlayRef = this.#overlay.create(overlayConfig);\n const portal: TemplatePortal = new TemplatePortal(tpl, this.#vcr);\n overlayRef.attach(portal);\n\n // Backdrop-click / ESC подписки объявлены один раз в конструкторе —\n // здесь только эмит созданного OverlayRef (см. #rightOverlaySource-стрим).\n this.#rightOverlaySource.next(overlayRef);\n\n return overlayRef;\n }\n\n // Слушаем именно transform-окончание: на overlay host'е могут анимироваться\n // и другие свойства (opacity backdrop'а, например) — это даст ложные срабатывания.\n #listenTransitionEnd(overlayRef: OverlayRef, callback: () => void): void {\n const element: HTMLElement = overlayRef.overlayElement;\n\n // Нет анимации (reduced-motion / `transition: none`) → `transitionend` не\n // придёт; teardown-callback (навигация `ro:null`) отрабатываем синхронно.\n const durationMs: number = this.#transitionDurationMs(element);\n if (durationMs === 0) {\n callback();\n return;\n }\n\n // settled-гард делает transitionend и fallback-таймаут взаимно\n // идемпотентными — сработает и снимет listener только то, что раньше.\n let settled: boolean = false;\n\n const handler: (event: TransitionEvent) => void = (event: TransitionEvent): void => {\n if (event.propertyName !== 'transform' || settled) {\n return;\n }\n settled = true;\n element.removeEventListener('transitionend', handler);\n callback();\n };\n element.addEventListener('transitionend', handler);\n\n // Страховка на случай пропущенного `transitionend` (лаг рендера).\n setTimeout((): void => {\n if (settled) {\n return;\n }\n settled = true;\n element.removeEventListener('transitionend', handler);\n callback();\n }, durationMs + ASIDE_TRANSITION_BUFFER_MS);\n }\n\n // Максимальная длительность transition'а элемента в мс; `0` если анимации нет.\n #transitionDurationMs(element: HTMLElement): number {\n const durationCss: string | undefined = this.#window?.getComputedStyle(element).transitionDuration;\n if (durationCss === undefined || durationCss === '') {\n return 0;\n }\n const maxSeconds: number = durationCss.split(',').reduce((max: number, part: string): number => {\n const trimmed: string = part.trim();\n const seconds: number = trimmed.endsWith('ms') ? Number.parseFloat(trimmed) / 1000 : Number.parseFloat(trimmed);\n return Number.isNaN(seconds) ? max : Math.max(max, seconds);\n }, 0);\n return maxSeconds * 1000;\n }\n}\n","<ng-container rtBlock=\"rt-container\">\n @if (headerTpl(); as tpl) {\n <header rtElem=\"header\" qa-dataid=\"container-header\">\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n </header>\n }\n\n @if (leftSidenavTpl(); as tpl) {\n <aside rtElem=\"left-sidenav\" qa-dataid=\"container-left-sidenav\">\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n </aside>\n }\n\n @if (toolbarLeftTpl(); as tpl) {\n <div rtElem=\"toolbar\" qa-dataid=\"container-toolbar\" data-slot=\"left\" [rtMod]=\"{ slot: 'left' }\">\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n </div>\n }\n\n @if (toolbarCenterTpl(); as tpl) {\n <div rtElem=\"toolbar\" qa-dataid=\"container-toolbar\" data-slot=\"center\" [rtMod]=\"{ slot: 'center' }\">\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n </div>\n }\n\n @if (toolbarRightTpl(); as tpl) {\n <div rtElem=\"toolbar\" qa-dataid=\"container-toolbar\" data-slot=\"right\" [rtMod]=\"{ slot: 'right' }\">\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n </div>\n }\n\n @if (contentTpl(); as tpl) {\n <main rtElem=\"content\" qa-dataid=\"container-content\">\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n </main>\n }\n\n <rt-toaster position=\"bottom-center\" />\n</ng-container>\n","import { OverlayRef } from '@angular/cdk/overlay';\nimport { signal, WritableSignal } from '@angular/core';\n\nimport { Observable, Subject } from 'rxjs';\n\n/**\n * Хэндл к программно открытой модалке (через `RtDialogService.open()`).\n *\n * Контент-компонент инжектит `RtDialogRef` и закрывает модалку через `.close(result?)`.\n * Родитель, открывший модалку, ждёт результата через `.afterClosed()`.\n *\n * Generic `<T>` — тип результата `close(result)`. Дефолт `unknown` — если результат\n * не нужен, оставляй generic пустым.\n *\n * @example\n * \\`\\`\\`ts\n * // в контент-компоненте\n * private readonly dialogRef = inject(RtDialogRef);\n * close(): void { this.dialogRef.close({ confirmed: true }); }\n *\n * // в родителе\n * dialogService.open(MyDialogComponent).afterClosed().subscribe((result) => {...});\n * \\`\\`\\`\n */\nexport class RtDialogRef<T = unknown> {\n /**\n * Runtime-флаг, блокирующий close() через ESC / backdrop click.\n *\n * Default `false`. Включай (`dialogRef.disableClose.set(true)`) на\n * время in-flight submit'а, чтобы юзер не потерял введённые в форму\n * данные на случайном ESC. После next/error subscribe ставь обратно\n * в `false`. Не влияет на программный `close(result)` — он всегда\n * закрывает overlay.\n *\n * Статические config-флаги `closeOnEscape` / `closeOnBackdropClick`\n * (см. `IRtDialogConfig`) определяют, подписан ли вообще handler на\n * соответствующее событие; `disableClose` — это runtime-override,\n * который гейтит dispatch внутри уже-подписанного handler'а.\n */\n public readonly disableClose: WritableSignal<boolean> = signal(false);\n\n readonly #overlayRef: OverlayRef;\n readonly #afterClosedSource: Subject<T | undefined> = new Subject<T | undefined>();\n\n constructor(overlayRef: OverlayRef) {\n this.#overlayRef = overlayRef;\n }\n\n /** Закрывает overlay; опционально передаёт результат подписчикам `afterClosed()`. */\n public close(result?: T): void {\n this.#overlayRef.dispose();\n this.#afterClosedSource.next(result);\n this.#afterClosedSource.complete();\n }\n\n /** Эмиттит один раз — результат `close(result)` — и завершается. */\n public afterClosed(): Observable<T | undefined> {\n return this.#afterClosedSource.asObservable();\n }\n}\n","import { ChangeDetectionStrategy, Component, input, InputSignal, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ModDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-dialog';\n\nexport type IRtDialogSize = 'sm' | 'md' | 'lg';\n\n/**\n * Презентационный styled-frame для модалки поверх CDK Overlay.\n *\n * Видимость / backdrop / scroll-block / ESC / focus-trap — НЕ внутренняя\n * ответственность компонента. Это обеспечивает CDK Overlay через\n * `RtDialogService.open()`. rt-dialog здесь — стилизованная \"рамка\"\n * (padding-free контейнер) с size-вариантами + ng-content слотом.\n *\n * Композиция:\n * \\`\\`\\`html\n * <rt-dialog size=\"md\">\n * <rt-dialog-header title=\"Создание записи\" />\n * <div style=\"padding: var(--rt-space-lg);\">body...</div>\n * <rt-dialog-footer>\n * <button rtButton (click)=\"cancel()\">Отмена</button>\n * <button rtButton (click)=\"save()\">Сохранить</button>\n * </rt-dialog-footer>\n * </rt-dialog>\n * \\`\\`\\`\n *\n * Открытие — через `RtDialogService.open(MyModalComponent, { data })` →\n * получаешь `RtDialogRef<T>` с `.close(result)` + `.afterClosed()`.\n *\n * `ViewEncapsulation.None` — стили префиксованы `.rt-dialog`, чтобы\n * rt-dialog-header / rt-dialog-footer subscriptions работали с одним\n * BEM-классом без cross-encapsulation хака.\n */\n@Component({\n selector: 'rt-dialog',\n templateUrl: './rt-dialog.component.html',\n styleUrl: './rt-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [BlockDirective, ModDirective],\n host: {\n class: BEM_BLOCK,\n '[style.--rt-dialog-width]': 'width()',\n },\n})\nexport class RtDialogComponent {\n /**\n * Размер модалки:\n * - `sm` — 460px (`--rt-dialog-width-sm`)\n * - `md` — 660px (`--rt-dialog-width-md`, дефолт)\n * - `lg` — 860px (`--rt-dialog-width-lg`)\n */\n public readonly size: InputSignal<IRtDialogSize> = input<IRtDialogSize>('md');\n\n /** Override ширины через CSS-property `--rt-dialog-width`. Имеет приоритет над `size`. */\n public readonly width: InputSignal<string | null> = input<string | null>(null);\n\n /** ARIA-label для dialog-обёртки (если нет видимого заголовка). */\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n}\n","<div\n rtBlock=\"rt-dialog\"\n qa-dataid=\"dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n [rtMod]=\"{ size: size() }\"\n [style.--rt-dialog-width]=\"width()\"\n [attr.aria-label]=\"ariaLabel()\">\n <ng-content />\n</div>\n","import { Signal } from '@angular/core';\n\n/** Что делает панель, когда её просят закрыться. */\nexport enum ERtAsideCloseIntent {\n /** Ничего: идёт запись, и закрытие посреди неё потеряло бы её результат. */\n Ignore = 'ignore',\n /** Закрыться сразу: терять нечего. */\n Close = 'close',\n /** Спросить, что сделать с несохранёнными правками. */\n Ask = 'ask',\n}\n\n/** Исход окна с несохранёнными правками. */\nexport enum ERtAsideUnsavedOutcome {\n /** Закрыть без сохранения. */\n Discard = 'discard',\n /** Закрыть с сохранением. */\n Save = 'save',\n /** Остаться в панели. */\n Stay = 'stay',\n}\n\n/**\n * Гард закрытия, который панель ставит на себя: признак нетронутости формы и\n * запись, которую зовёт исход «закрыть с сохранением».\n */\nexport interface IRtAsideUnsavedGuard {\n pristine: Signal<boolean>;\n save: () => void;\n}\n\n/** Состояние панели на момент намерения закрыть её. */\nexport interface IRtAsideCloseState {\n submitting: boolean;\n guarded: boolean;\n pristine: boolean;\n}\n\n/**\n * Решение по намерению закрыть панель. Одно на все четыре пути закрытия: кнопку\n * в шапке, кнопку в футере, нажатие мимо панели и клавишу Esc — иначе Esc обошёл\n * бы то, что ловит кнопка.\n */\nexport function resolveCloseIntent(state: IRtAsideCloseState): ERtAsideCloseIntent {\n if (state.submitting) {\n return ERtAsideCloseIntent.Ignore;\n }\n\n return state.guarded && !state.pristine ? ERtAsideCloseIntent.Ask : ERtAsideCloseIntent.Close;\n}\n","import { ChangeDetectionStrategy, Component, inject, ViewEncapsulation } from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtButtonDirective } from '../../button/rt-button.directive';\nimport { RtDialogRef } from '../../dialog/rt-dialog-ref';\nimport { RtDialogComponent } from '../../dialog/rt-dialog.component';\nimport { ERtAsideUnsavedOutcome } from './rt-aside-unsaved.logic';\n\nconst BEM_BLOCK: string = 'rt-aside-unsaved-dialog';\n\n/**\n * Окно, которое видит пользователь, закрывая панель с несохранёнными правками. Три\n * исхода: закрыть без сохранения, закрыть с сохранением, остаться. Открывает его\n * общая основа асайда, поэтому наружу компонент не экспортируется.\n *\n * Отказ от правок подан красной кнопкой: это единственный исход, после которого\n * введённое не вернуть.\n */\n@Component({\n selector: 'rt-aside-unsaved-dialog',\n templateUrl: './rt-aside-unsaved-dialog.component.html',\n styleUrl: './rt-aside-unsaved-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtButtonDirective,\n RtDialogComponent,\n BlockDirective,\n ElemDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtAsideUnsavedDialogComponent {\n readonly #dialogRef: RtDialogRef<ERtAsideUnsavedOutcome> = inject(RtDialogRef);\n\n protected onDiscard(): void {\n this.#dialogRef.close(ERtAsideUnsavedOutcome.Discard);\n }\n\n protected onSave(): void {\n this.#dialogRef.close(ERtAsideUnsavedOutcome.Save);\n }\n\n protected onStay(): void {\n this.#dialogRef.close(ERtAsideUnsavedOutcome.Stay);\n }\n}\n","<rt-dialog width=\"440px\" qa-dataid=\"aside-unsaved-dialog\" [ariaLabel]=\"'rtKit.uiUnsavedTitle' | transloco\">\n <div rtBlock=\"rt-aside-unsaved-dialog\">\n <div rtElem=\"text\">\n <h2 rtElem=\"title\" qa-dataid=\"aside-unsaved-title\">{{ 'rtKit.uiUnsavedTitle' | transloco }}</h2>\n <p rtElem=\"message\" qa-dataid=\"aside-unsaved-message\">{{ 'rtKit.uiUnsavedMessage' | transloco }}</p>\n </div>\n\n <div rtElem=\"footer\">\n <button\n rtButton\n rtElem=\"discard\"\n qa-dataid=\"aside-unsaved-discard\"\n type=\"button\"\n theme=\"danger\"\n appearance=\"outlined\"\n [label]=\"'rtKit.uiUnsavedDiscard' | transloco\"\n [attr.aria-label]=\"'rtKit.uiUnsavedDiscard' | transloco\"\n (click)=\"onDiscard()\"></button>\n <button\n rtButton\n rtElem=\"stay\"\n qa-dataid=\"aside-unsaved-stay\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n [label]=\"'rtKit.uiUnsavedStay' | transloco\"\n [attr.aria-label]=\"'rtKit.uiUnsavedStay' | transloco\"\n (click)=\"onStay()\"></button>\n <button\n rtButton\n rtElem=\"save\"\n qa-dataid=\"aside-unsaved-save\"\n type=\"button\"\n appearance=\"filled\"\n [label]=\"'rtKit.uiUnsavedSave' | transloco\"\n [attr.aria-label]=\"'rtKit.uiUnsavedSave' | transloco\"\n (click)=\"onSave()\"></button>\n </div>\n </div>\n</rt-dialog>\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Injection token для передачи данных в модалку, открытую через `RtDialogService.open()`.\n *\n * Пользовательский компонент-контент модалки инжектит токен и получает данные,\n * переданные в `DialogConfig.data`. Тип значения задаётся generic'ом — `inject(RT_DIALOG_DATA)`\n * вернёт `unknown`, прокастуй через `inject(RT_DIALOG_DATA) as MyDataType` ИЛИ\n * объяви токен с конкретным generic'ом в feature-либе.\n *\n * @example\n * \\`\\`\\`ts\n * @Component({...})\n * export class WelcomeModalComponent {\n * readonly data = inject(RT_DIALOG_DATA) as { userName: string };\n * }\n *\n * // parent\n * dialogService.open(WelcomeModalComponent, { data: { userName: \"Иван\" } });\n * \\`\\`\\`\n */\nexport const RT_DIALOG_DATA: InjectionToken<unknown> = new InjectionToken<unknown>('RT_DIALOG_DATA');\n","import { ComponentType, Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { inject, Injectable, Injector, Signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { EMPTY, map, merge, mergeMap, Observable, Subject, takeUntil } from 'rxjs';\n\nimport { RtDialogRef } from './rt-dialog-ref';\nimport { RT_DIALOG_DATA } from './rt-dialog.tokens';\n\n/**\n * Конфигурация открытия модалки через `RtDialogService.open()`.\n */\nexport interface IRtDialogConfig<TData = unknown> {\n /** Данные, доступные внутри модалки через `inject(RT_DIALOG_DATA)`. */\n data?: TData;\n\n /** Дополнительный CSS-класс для backdrop (поверх стандартного `rt-dialog-backdrop`). */\n backdropClass?: string | string[];\n\n /** Дополнительный CSS-класс для panel-обёртки overlay (поверх `rt-dialog-overlay`). */\n panelClass?: string | string[];\n\n /** Закрывать модалку по клику на backdrop. По дефолту `true`. */\n closeOnBackdropClick?: boolean;\n\n /** Закрывать модалку по ESC. По дефолту `true`. */\n closeOnEscape?: boolean;\n}\n\n/**\n * Контекст одного открытия модалки — payload для per-open close-подписок в конструкторном\n * стриме. `dialogRef` сужен до используемых handler'ами членов (`RtDialogRef<T>` инвариантен\n * по `T`, целиком в generic-agnostic контекст не влезает).\n */\ninterface IRtDialogOpenContext {\n overlayRef: OverlayRef;\n dialogRef: {\n disableClose: Signal<boolean>;\n close: () => void;\n };\n closeOnBackdropClick: boolean;\n closeOnEscape: boolean;\n}\n\n/**\n * Программный API для открытия модалок поверх CDK Overlay.\n *\n * Устройство сервиса:\n * - `Overlay.position().global().centerHorizontally().centerVertically()` — центрирование.\n * - `scrollStrategies.block()` — фиксирует background-scroll.\n * - `hasBackdrop: true` + кастомный класс — затемнение.\n * - `ComponentPortal` + custom `Injector` подкидывает `RtDialogRef` + `RT_DIALOG_DATA` в DI\n * контент-компонента.\n *\n * Альтернатива: legacy inline `<rt-dialog [visible]>` форма продолжает работать через\n * native `<dialog>.showModal()`. Новые экраны — на программный API.\n *\n * @example\n * \\`\\`\\`ts\n * // открытие\n * private readonly dialogService = inject(RtDialogService);\n *\n * openConfirm(): void {\n * const ref = this.dialogService.open<ConfirmDialogComponent, { question: string }, boolean>(\n * ConfirmDialogComponent,\n * { data: { question: \"Удалить?\" } }\n * );\n * ref.afterClosed().subscribe((confirmed) => {\n * if (confirmed) this.delete();\n * });\n * }\n *\n * // контент-компонент\n * @Component({\n * selector: \"rt-confirm-dialog\",\n * template: \\`\n * <rt-dialog size=\"sm\">\n * <rt-dialog-header [title]=\"data.question\" />\n * <div>Действие необратимо.</div>\n * <rt-dialog-footer>\n * <button rtButton (click)=\"close(false)\">Отмена</button>\n * <button rtButton theme=\"danger\" (click)=\"close(true)\">Удалить</button>\n * </rt-dialog-footer>\n * </rt-dialog>\n * \\`,\n * })\n * export class ConfirmDialogComponent {\n * readonly data = inject(RT_DIALOG_DATA) as { question: string };\n * readonly #ref = inject(RtDialogRef<boolean>);\n * close(result: boolean): void { this.#ref.close(result); }\n * }\n * \\`\\`\\`\n */\n@Injectable({ providedIn: 'root' })\nexport class RtDialogService {\n readonly #overlay: Overlay = inject(Overlay);\n readonly #injector: Injector = inject(Injector);\n\n readonly #openSource: Subject<IRtDialogOpenContext> = new Subject<IRtDialogOpenContext>();\n\n constructor() {\n // Per-open close-подписки (backdrop / ESC) живут в одном постоянном\n // конструкторном стриме: open() эмитит контекст открытия, mergeMap\n // подписывает event-стримы конкретного OverlayRef. `detachments()`\n // терминирует внутренний поток при overlay.dispose() (дёргается из\n // RtDialogRef.close()). mergeMap, а не switchMap — одновременно может\n // быть открыто несколько модалок (стек).\n //\n // Внутри обоих handler'ов — runtime-guard через `dialogRef.disableClose()`:\n // если контент-компонент выставил `disableClose.set(true)` (например, на\n // время in-flight submit'а), ESC / backdrop НЕ закрывают overlay.\n // Программный `dialogRef.close(result)` гейтом не задет — он всегда работает.\n this.#openSource\n .pipe(\n mergeMap((openContext: IRtDialogOpenContext): Observable<() => void> => {\n const backdropClose$: Observable<() => void> = openContext.closeOnBackdropClick\n ? openContext.overlayRef.backdropClick().pipe(\n map((): (() => void) => (): void => {\n if (openContext.dialogRef.disableClose()) {\n return;\n }\n openContext.dialogRef.close();\n })\n )\n : EMPTY;\n const escapeClose$: Observable<() => void> = openContext.closeOnEscape\n ? openContext.overlayRef.keydownEvents().pipe(\n map((event: KeyboardEvent): (() => void) => (): void => {\n if (event.key !== 'Escape') {\n return;\n }\n event.preventDefault();\n if (openContext.dialogRef.disableClose()) {\n return;\n }\n openContext.dialogRef.close();\n })\n )\n : EMPTY;\n return merge(backdropClose$, escapeClose$).pipe(takeUntil(openContext.overlayRef.detachments()));\n }),\n takeUntilDestroyed()\n )\n .subscribe((handleCloseIntent: () => void): void => handleCloseIntent());\n }\n\n public open<TComponent, TData = unknown, TResult = unknown>(\n component: ComponentType<TComponent>,\n config?: IRtDialogConfig<TData>\n ): RtDialogRef<TResult> {\n const overlayRef: OverlayRef = this.#overlay.create({\n positionStrategy: this.#overlay.position().global().centerHorizontally().centerVertically(),\n scrollStrategy: this.#overlay.scrollStrategies.block(),\n hasBackdrop: true,\n backdropClass: config?.backdropClass ?? 'rt-dialog-backdrop',\n panelClass: config?.panelClass ?? 'rt-dialog-overlay',\n disposeOnNavigation: true,\n });\n\n const dialogRef: RtDialogRef<TResult> = new RtDialogRef<TResult>(overlayRef);\n\n // Сами close-подписки объявлены один раз в конструкторе — здесь только\n // эмит контекста открытия (см. #openSource-стрим).\n this.#openSource.next({\n overlayRef,\n dialogRef,\n closeOnBackdropClick: config?.closeOnBackdropClick !== false,\n closeOnEscape: config?.closeOnEscape !== false,\n });\n\n const injector: Injector = Injector.create({\n parent: this.#injector,\n providers: [\n { provide: RtDialogRef, useValue: dialogRef },\n { provide: RT_DIALOG_DATA, useValue: config?.data ?? null },\n ],\n });\n\n const portal: ComponentPortal<TComponent> = new ComponentPortal<TComponent>(component, null, injector);\n overlayRef.attach(portal);\n\n return dialogRef;\n }\n}\n","/**\n * Абсолютные команды приводятся к сегментам от корня: внутри объекта `outlets`\n * ведущий слэш отдельным сегментом не разбирается.\n *\n * Нужно это затем, что уход панели на связанную запись обязан снять её аутлет\n * той же навигацией. Абсолютные команды меняют только первичную ветку, поэтому\n * панель, открытая в корне приложения, переход переживает: адрес получается с\n * аутлетом, под который в корне маршрута нет, и роутер отклоняет навигацию\n * молча — адрес остаётся прежним, а приложение застревает на панели, которой на\n * экране уже нет.\n */\nexport function rootSegmentsOf(commands: readonly unknown[]): unknown[] {\n const [head, ...rest]: readonly unknown[] = commands;\n\n if (typeof head !== 'string' || !head.startsWith('/')) {\n return [...commands];\n }\n\n return [...head.split('/').filter(Boolean), ...rest];\n}\n","import {\n computed,\n DestroyRef,\n Directive,\n effect,\n inject,\n Injector,\n isSignal,\n OnInit,\n Signal,\n signal,\n viewChild,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { AbstractControl, PristineChangeEvent } from '@angular/forms';\nimport { ActivatedRoute, ParamMap, Params, Router, UrlTree } from '@angular/router';\n\nimport { catchError, exhaustMap, filter, map, mergeMap, Observable, of, startWith, Subject, switchMap, take, tap } from 'rxjs';\n\nimport { TranslocoService } from '@jsverse/transloco';\n\nimport { NotificationBus } from '../../platform';\n\nimport { RtAsideUnsavedDialogComponent } from '../aside/unsaved-dialog/rt-aside-unsaved-dialog.component';\nimport {\n ERtAsideCloseIntent,\n ERtAsideUnsavedOutcome,\n IRtAsideUnsavedGuard,\n resolveCloseIntent,\n} from '../aside/unsaved-dialog/rt-aside-unsaved.logic';\nimport { RtDialogService } from '../dialog/rt-dialog.service';\nimport { RtContainerRightSidenavPanelDirective } from './rt-container.directives';\nimport { rootSegmentsOf } from './rt-route-aside.logic';\n\n/**\n * Одна мутация, запущенная через `runMutation()`: сам поток операции + готовые\n * success/error-handler'ы (замыкают `opts` вызова) — payload конструкторного стрима.\n */\ninterface IRtRouteAsideMutation {\n op$: Observable<unknown>;\n handleSuccess: () => void;\n handleError: (error: unknown) => void;\n}\n\n/**\n * Открытие ждёт `panel.ready()`, а не `ngAfterViewInit`: на F5 rt-container\n * создаёт overlay асинхронно, иначе `open()` гонится с ещё не готовым overlay.\n *\n * `@Directive()` без селектора — чтобы query/`inject`/lifecycle наследовались на\n * конкретный `@Component` (как `RtFormControlBase`).\n *\n * Закрытие всегда идёт через `onClose()`, куда сходятся все четыре пути: две\n * кнопки панели и — через `onCancel()` — нажатие мимо панели и Esc, которые ловит\n * `rt-container`. Панель, поставившая гард через `guardUnsavedChanges()`, на\n * тронутой форме получает вопрос о правках; панель без гарда закрывается сразу.\n */\n@Directive()\nexport abstract class RtRouteAsideComponent<T> implements OnInit {\n readonly #entity: WritableSignal<T | null> = signal<T | null>(null);\n readonly #entityId: WritableSignal<string | null> = signal<string | null>(null);\n readonly #isCreateMode: WritableSignal<boolean> = signal(false);\n readonly #resolving: WritableSignal<boolean> = signal(false);\n readonly #submitting: WritableSignal<boolean> = signal(false);\n\n readonly #mutationSource: Subject<IRtRouteAsideMutation> = new Subject<IRtRouteAsideMutation>();\n readonly #refreshSource: Subject<string> = new Subject<string>();\n readonly #closeIntentSource: Subject<void> = new Subject<void>();\n\n readonly #unsavedGuard: WritableSignal<IRtAsideUnsavedGuard | null> = signal<IRtAsideUnsavedGuard | null>(null);\n\n /** Связанная запись, на которую панель уйдёт, когда пользователь решит судьбу правок */\n #relatedCommands: readonly unknown[] | null = null;\n\n /** Параметры адреса связанной записи: у события журнала ими задан отбор списка */\n #relatedQueryParams: Params | null = null;\n\n readonly #notificationBus: NotificationBus = inject(NotificationBus);\n readonly #transloco: TranslocoService = inject(TranslocoService);\n readonly #dialog: RtDialogService = inject(RtDialogService);\n readonly #injector: Injector = inject(Injector);\n\n #opened: boolean = false;\n\n protected readonly router: Router = inject(Router);\n protected readonly route: ActivatedRoute = inject(ActivatedRoute);\n protected readonly destroyRef: DestroyRef = inject(DestroyRef);\n\n protected readonly panel: Signal<RtContainerRightSidenavPanelDirective | undefined> = viewChild(RtContainerRightSidenavPanelDirective);\n\n protected readonly entity: Signal<T | null> = this.#entity.asReadonly();\n\n /** id из route-параметра как есть (uuid/строка); числовые id консьюмер парсит сам. */\n protected readonly entityId: Signal<string | null> = this.#entityId.asReadonly();\n protected readonly isCreateMode: Signal<boolean> = this.#isCreateMode.asReadonly();\n protected readonly submitting: Signal<boolean> = this.#submitting.asReadonly();\n\n /**\n * Скелетоны биндятся на это, а не на пустоту `entity()`: та залипает после\n * первой загрузки и не ловит рефетч.\n */\n protected readonly resolving: Signal<boolean> = this.#resolving.asReadonly();\n\n protected readonly busy: Signal<boolean> = computed((): boolean => this.#submitting() || this.#resolving());\n\n /**\n * Форма не тронута. Панель, которая не поставила гард закрытия, считается\n * нетронутой всегда — и закрывается без вопроса, как раньше.\n */\n protected readonly pristine: Signal<boolean> = computed((): boolean => this.#unsavedGuard()?.pristine() ?? true);\n\n protected readonly submitError: WritableSignal<string | null> = signal<string | null>(null);\n\n protected readonly idParamName: string = 'id';\n\n /** id-only режим: нужен только id (например, смена пароля по userId), сущность не грузится. */\n protected readonly idOnly: boolean = false;\n\n constructor() {\n effect((): void => {\n const panel: RtContainerRightSidenavPanelDirective | undefined = this.panel();\n if (panel === undefined || !panel.ready() || this.#opened) {\n return;\n }\n this.#opened = true;\n panel.open();\n });\n\n // Мутации из runMutation(): mergeMap подписывает каждый op$ независимо\n // (как раньше — по подписке на вызов, без отмены предыдущей in-flight\n // мутации); handler'ы замыкают opts вызова, catchError гасит ошибку\n // конкретной мутации, не убивая общий стрим.\n this.#mutationSource\n .pipe(\n mergeMap((mutation: IRtRouteAsideMutation): Observable<() => void> =>\n mutation.op$.pipe(\n map((): (() => void) => mutation.handleSuccess),\n catchError((error: unknown): Observable<() => void> => of((): void => mutation.handleError(error)))\n )\n ),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe((handleResult: () => void): void => handleResult());\n\n // Рефетч сущности из #refreshEntity(): mergeMap — каждый запуск resolve\n // живёт независимо (как раньше — отдельная подписка на вызов).\n this.#refreshSource\n .pipe(\n mergeMap((id: string): Observable<T | null> => this.resolve(id)),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe((entity: T | null): void => {\n this.#resolving.set(false);\n if (entity === null) {\n this.#navigateAway();\n return;\n }\n this.#entity.set(entity);\n this.onResolved();\n });\n\n // Вопрос о несохранённых правках: exhaustMap, а не switchMap — пока окно\n // открыто, повторное намерение закрыться игнорируется. switchMap отписался\n // бы от первого окна, не убрав его overlay, и на экране осталось бы два.\n this.#closeIntentSource\n .pipe(\n exhaustMap((): Observable<ERtAsideUnsavedOutcome | undefined> =>\n this.#dialog\n .open<RtAsideUnsavedDialogComponent, undefined, ERtAsideUnsavedOutcome>(RtAsideUnsavedDialogComponent)\n .afterClosed()\n ),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe((outcome: ERtAsideUnsavedOutcome | undefined): void => this.#applyUnsavedOutcome(outcome));\n }\n\n public ngOnInit(): void {\n this.route.paramMap\n .pipe(\n switchMap((params: ParamMap): Observable<T | null> => {\n const idParam: string | null = params.get(this.idParamName);\n if (idParam === null || idParam === '') {\n this.#isCreateMode.set(true);\n this.#entityId.set(null);\n return of(null);\n }\n this.#isCreateMode.set(false);\n this.#entityId.set(idParam);\n if (this.idOnly) {\n return of(null);\n }\n this.#resolving.set(true);\n return this.resolve(idParam);\n }),\n tap((entity: T | null): void => {\n this.#resolving.set(false);\n if (entity === null) {\n if (!this.#isCreateMode() && !this.idOnly) {\n this.#navigateAway();\n }\n return;\n }\n this.#entity.set(entity);\n this.onResolved();\n }),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n }\n\n /**\n * Панель уходит с экрана не сама: её место в аутлете занимает другая — лента\n * событий из шапки или соседняя запись. Тронутая форма спрашивает о правках\n * так же, как при закрытии; окно кнопок этот путь не ловит, потому что панель\n * закрывает роутер.\n *\n * Гард ставится на ro-маршрут панели (`rtAsideUnsavedGuard`).\n */\n public canDeactivate(): Observable<boolean> {\n const intent: ERtAsideCloseIntent = this.#closeIntent();\n\n if (intent === ERtAsideCloseIntent.Ignore) {\n return of(false);\n }\n\n if (intent === ERtAsideCloseIntent.Close) {\n return of(true);\n }\n\n return this.#dialog\n .open<RtAsideUnsavedDialogComponent, undefined, ERtAsideUnsavedOutcome>(RtAsideUnsavedDialogComponent)\n .afterClosed()\n .pipe(switchMap((outcome: ERtAsideUnsavedOutcome | undefined): Observable<boolean> => this.#deactivateAfter(outcome)));\n }\n\n protected setEntity(entity: T | null): void {\n this.#entity.set(entity);\n }\n\n /**\n * Признак нетронутой формы. Контрол принимается и сигналом: форма панели\n * собрана директивой `ngForm` и до отрисовки шаблона её ещё нет, поэтому\n * `viewChild(NgForm)` отдаёт её только сигналом.\n */\n protected pristineSignal(control: AbstractControl | Signal<AbstractControl | undefined>): Signal<boolean> {\n const control$: Observable<AbstractControl | undefined> = isSignal(control) ? toObservable(control) : of(control);\n\n return toSignal(\n control$.pipe(\n switchMap((current: AbstractControl | undefined): Observable<boolean> => {\n if (current === undefined) {\n return of(true);\n }\n\n return current.events.pipe(\n filter((event: unknown): event is PristineChangeEvent => event instanceof PristineChangeEvent),\n map((event: PristineChangeEvent): boolean => event.pristine),\n // Форма могла испачкаться до того, как сигнал отдал её: события\n // прошлого подписка не получит, и без нынешнего состояния\n // кнопка записи осталась бы недоступной\n startWith(current.pristine)\n );\n })\n ),\n { initialValue: true }\n );\n }\n\n /**\n * Ставит гард закрытия: пока форма тронута, любой из четырёх путей закрытия\n * спрашивает, что сделать с правками, и исход «закрыть с сохранением» зовёт\n * `save`. Признак нетронутости даёт `pristineSignal(control)` — тот же, что\n * гейтит кнопку записи.\n */\n protected guardUnsavedChanges(guard: IRtAsideUnsavedGuard): void {\n this.#unsavedGuard.set(guard);\n }\n\n /**\n * Адрес связанной записи для атрибута `href`. Ссылка остаётся настоящей\n * ссылкой: её открывают в новой вкладке и копируют, а обычное нажатие панель\n * перехватывает и уводит сама.\n */\n protected relatedUrl(commands: readonly unknown[]): string {\n return this.router.serializeUrl(this.#relatedTree(commands));\n }\n\n /**\n * Уход на связанную запись. Он уводит с адреса панели так же, как её\n * закрытие, поэтому идёт тем же путём: тронутая форма спрашивает, что\n * сделать с правками, и на исходе «закрыть с сохранением» запись открывается\n * после удачной записи.\n */\n protected openRelated(commands: readonly unknown[], queryParams: Params | null = null): void {\n const intent: ERtAsideCloseIntent = this.#closeIntent();\n\n if (intent === ERtAsideCloseIntent.Ignore) {\n return;\n }\n\n if (intent === ERtAsideCloseIntent.Close) {\n this.#navigateRelated(commands, queryParams);\n\n return;\n }\n\n this.#relatedQueryParams = queryParams;\n\n this.#relatedCommands = commands;\n // Подписка объявлена один раз в конструкторе (см. #closeIntentSource-стрим).\n this.#closeIntentSource.next();\n }\n\n protected onResolved(): void {\n // Хук для наследника: базовый асайд после разрешения данных ничего не делает.\n }\n\n protected closeOutlets(): Record<string, Array<string> | null> {\n return { ro: null };\n }\n\n /**\n * `successKey` — ключ словаря для тоста об успехе. Ключ принадлежит\n * конкретной мутации, а не панели: у снятия промокода и опроса подписки свой\n * текст успеха, и один ключ на панель показал бы не тот.\n *\n * `errorText` принимается и функцией: причина отказа известна только после\n * него — стор кладёт её в свой сигнал, а панель без стора выводит из ответа\n * сервера, — и готовой строкой на момент запуска мутации её не передать.\n */\n protected runMutation(\n op$: Observable<unknown>,\n opts?: {\n onSuccess?: () => void;\n successKey?: string;\n errorText?: string | ((error: unknown) => string);\n closeOnSuccess?: boolean;\n refreshOnSuccess?: boolean;\n }\n ): void {\n this.#submitting.set(true);\n this.submitError.set(null);\n // Подписка объявлена один раз в конструкторе (см. #mutationSource-стрим) —\n // здесь только эмит операции с handler'ами, замыкающими opts.\n this.#mutationSource.next({\n op$,\n handleSuccess: (): void => {\n this.#submitting.set(false);\n if (opts?.successKey) {\n this.#notificationBus.success(this.#transloco.translate(opts.successKey));\n }\n // Пользователь шёл на связанную запись и по дороге согласился\n // сохранить: панель уходит туда, куда он нажал.\n const related: readonly unknown[] | null = this.#relatedCommands;\n if (related !== null) {\n this.#navigateRelated(related);\n return;\n }\n if (opts?.onSuccess) {\n opts.onSuccess();\n return;\n }\n // Закрытие после успеха идёт мимо гарда: форма к этому моменту\n // ещё тронута, и вопрос о несохранённых правках был бы задан\n // ровно про то, что только что сохранилось.\n if (opts?.closeOnSuccess === true || this.#isCreateMode()) {\n this.#closePanel();\n return;\n }\n if (opts?.refreshOnSuccess === true) {\n this.#refreshEntity();\n }\n },\n handleError: (error: unknown): void => {\n this.#submitting.set(false);\n // Отказ оставляет пользователю� в панели с его правками, поэтому\n // намерение уйти на связанную запись снимается.\n this.#relatedCommands = null;\n const text: string | undefined = typeof opts?.errorText === 'function' ? opts.errorText(error) : opts?.errorText;\n if (text) {\n this.submitError.set(text);\n }\n },\n });\n }\n\n /**\n * Единственная точка закрытия панели. Через неё идут все четыре пути: кнопка\n * в шапке, кнопка в футере и — через `onCancel()` — нажатие мимо панели и\n * клавиша Esc, которые ловит `rt-container` и отдаёт панели одним выходом\n * `cancelled`.\n */\n protected onClose(): void {\n const intent: ERtAsideCloseIntent = this.#closeIntent();\n\n if (intent === ERtAsideCloseIntent.Ignore) {\n return;\n }\n\n if (intent === ERtAsideCloseIntent.Close) {\n this.#closePanel();\n return;\n }\n\n // Подписка объявлена один раз в конструкторе (см. #closeIntentSource-стрим).\n this.#closeIntentSource.next();\n }\n\n protected onCancel(): void {\n this.onClose();\n }\n\n protected onClosed(): void {\n this.#navigateAway();\n }\n\n protected abstract resolve(id: string): Observable<T | null>;\n\n #refreshEntity(): void {\n const id: string | null = this.#entityId();\n if (id === null || this.idOnly) {\n return;\n }\n this.#resolving.set(true);\n // Подписка объявлена один раз в конструкторе (см. #refreshSource-стрим).\n this.#refreshSource.next(id);\n }\n\n /** Решение по намерению уйти с панели — одно на закрытие и на переход по связанной записи */\n #closeIntent(): ERtAsideCloseIntent {\n return resolveCloseIntent({\n submitting: this.#submitting(),\n guarded: this.#unsavedGuard() !== null,\n pristine: this.pristine(),\n });\n }\n\n /**\n * Что делать с уходом панели после ответа пользователю�. «Закрыть с сохранением»\n * ждёт конца записи: панель уступает место только удачной — иначе правки\n * пропали бы вместе с отказом, о котором пользователь ещё не знает.\n */\n #deactivateAfter(outcome: ERtAsideUnsavedOutcome | undefined): Observable<boolean> {\n if (outcome === ERtAsideUnsavedOutcome.Discard) {\n return of(true);\n }\n\n if (outcome !== ERtAsideUnsavedOutcome.Save) {\n return of(false);\n }\n\n this.#unsavedGuard()?.save();\n // Запись могла и не начаться — например, черновик не годится\n if (!this.#submitting()) {\n return of(false);\n }\n\n return toObservable(this.#submitting, { injector: this.#injector }).pipe(\n filter((submitting: boolean): boolean => !submitting),\n take(1),\n map((): boolean => this.submitError() === null)\n );\n }\n\n #closePanel(): void {\n this.panel()?.close();\n }\n\n #navigateRelated(commands: readonly unknown[], queryParams: Params | null = null): void {\n const params: Params | null = queryParams ?? this.#relatedQueryParams;\n\n this.#relatedCommands = null;\n this.#relatedQueryParams = null;\n void this.router.navigateByUrl(this.#relatedTree(commands, params));\n }\n\n /**\n * Адрес, на который уходит панель. Свой аутлет она снимает здесь же, тем же\n * деревом: абсолютные команды меняют только первичную ветку, поэтому панель,\n * открытая в корне приложения, переход переживает. Маршрута под неё в корне\n * нет, и роутер отклоняет такую навигацию молча — адрес остаётся прежним, а\n * приложение застревает на панели, которой на экране уже нет.\n */\n #relatedTree(commands: readonly unknown[], queryParams: Params | null = null): UrlTree {\n const outlets: Record<string, unknown[] | null> = { ...this.closeOutlets(), primary: rootSegmentsOf(commands) };\n\n return this.router.createUrlTree([{ outlets }], { queryParams });\n }\n\n #applyUnsavedOutcome(outcome: ERtAsideUnsavedOutcome | undefined): void {\n const related: readonly unknown[] | null = this.#relatedCommands;\n\n if (outcome === ERtAsideUnsavedOutcome.Discard) {\n if (related !== null) {\n this.#navigateRelated(related);\n return;\n }\n this.#closePanel();\n return;\n }\n\n // Запись закрывает панель сама на успехе — иначе панель ушла бы с экрана\n // раньше ответа, и отказ пользователю� было бы негде показать. Уход на\n // связанную запись ждёт того же успеха.\n if (outcome === ERtAsideUnsavedOutcome.Save) {\n this.#unsavedGuard()?.save();\n // Запись могла и не начаться — например, черновик не годится. Тогда\n // намерение уйти снимается вместе с ней, иначе панель ушла бы на\n // связанную запись после следующей удачной записи.\n if (!this.#submitting()) {\n this.#relatedCommands = null;\n }\n return;\n }\n\n this.#relatedCommands = null;\n }\n\n #navigateAway(): void {\n void this.router.navigate([{ outlets: this.closeOutlets() }], {\n relativeTo: this.route.parent,\n });\n }\n}\n","import { CanDeactivateFn } from '@angular/router';\n\nimport { Observable, of } from 'rxjs';\n\n/** Панель, которая умеет ответить на вопрос «можно ли уступить место». */\nexport interface IRtAsideDeactivate {\n canDeactivate(): Observable<boolean>;\n}\n\n/**\n * Панель с несохранёнными правками спрашивает о них и при смене маршрута, а не\n * только при закрытии: аутлет `ro` занимает соседняя панель, и правки пропали бы\n * молча.\n *\n * Ставится на каждый ro-маршрут: гард висит на кнопках, нажатии мимо и Esc, а\n * смену маршрута ловит только роутер.\n *\n * Панели может не быть: роутер зовёт гард и для маршрута, чей компонент не создан.\n * Спрашивать тогда не о чем — уступить место можно. Без этой проверки первая же\n * такая навигация падает, а следом отказывает любая другая: маршрут остаётся\n * активным, и приложение застревает на адресе панели.\n */\nexport const rtAsideUnsavedGuard: CanDeactivateFn<IRtAsideDeactivate | null> = (\n component: IRtAsideDeactivate | null\n): Observable<boolean> => component?.canDeactivate() ?? of(true);\n","/** Контракт счётчика common/ui. */\n\n/**\n * Ключи подписей кнопок для скринридера.\n *\n * Здесь именно ключи, а не готовый текст: константа вычисляется один раз при\n * загрузке модуля, а язык страницы известен только после старта приложения —\n * переведённая на этом этапе строка застряла бы на языке по умолчанию. Перевод\n * берёт компонент, у которого есть доступ к текущей локали; перекрываются\n * поштучно через input'ы `decreaseLabel` / `increaseLabel`.\n */\nexport const RT_COUNTER_DECREASE_KEY: string = 'rtKit.counterDecrease';\n\nexport const RT_COUNTER_INCREASE_KEY: string = 'rtKit.counterIncrease';\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n forwardRef,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { RT_COUNTER_DECREASE_KEY, RT_COUNTER_INCREASE_KEY } from './rt-counter.model';\n\nconst BEM_BLOCK: string = 'rt-counter';\n\n/** Значение всегда внутри границ: и при записи из формы, и при шаге кнопкой. */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Счётчик «− N +» для целых величин: количество гостей, мест, единиц.\n * В отличие от `rt-input-number` значение нельзя ввести с клавиатуры — только\n * шагами, поэтому здесь нет ни маски, ни дробной части, ни кнопки очистки.\n *\n * Реализует `ControlValueAccessor` для `number` через\n * `useExisting: forwardRef(...)` — `useClass` на self-reference вызывает\n * NG0200 cycle при boot'е.\n *\n * Source-of-truth для disabled — внутренний `isDisabled` signal: и signal-input\n * `disabled`, и CVA `setDisabledState` пишут в него, поэтому `[disabled]=\"true\"`\n * и `FormControl.disable()` ведут себя одинаково.\n *\n * Хост объявлен группой с `aria-label`, значение помечено `aria-live`, так что\n * скринридер называет назначение счётчика и проговаривает новое число.\n *\n * ViewEncapsulation — default (Emulated), стили обёрнуты в `:host { ... }`.\n */\n@Component({\n selector: 'rt-counter',\n templateUrl: './rt-counter.component.html',\n styleUrl: './rt-counter.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // rt-tools\n BlockDirective,\n ElemDirective,\n\n // components\n RtIconButtonComponent,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef((): typeof RtCounterComponent => RtCounterComponent),\n multi: true,\n },\n ],\n host: {\n class: BEM_BLOCK,\n role: 'group',\n '[attr.aria-label]': 'ariaLabel()',\n },\n})\nexport class RtCounterComponent implements ControlValueAccessor {\n #onChange: (value: number) => void = (): void => undefined;\n #onTouched: () => void = (): void => undefined;\n\n readonly #decreaseFallback: Signal<string> = translateSignal(RT_COUNTER_DECREASE_KEY);\n readonly #increaseFallback: Signal<string> = translateSignal(RT_COUNTER_INCREASE_KEY);\n\n protected readonly value: WritableSignal<number> = signal<number>(0);\n protected readonly isDisabled: WritableSignal<boolean> = signal<boolean>(false);\n /** Своя подпись важнее умолчания: форма знает, что именно считает */\n protected readonly decreaseAriaLabel: Signal<string> = computed((): string => this.decreaseLabel() || this.#decreaseFallback());\n protected readonly increaseAriaLabel: Signal<string> = computed((): string => this.increaseLabel() || this.#increaseFallback());\n\n protected readonly canDecrease: Signal<boolean> = computed((): boolean => !this.isDisabled() && this.value() > this.min());\n\n protected readonly canIncrease: Signal<boolean> = computed((): boolean => !this.isDisabled() && this.value() < this.max());\n\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n /** Нижняя граница; значение из формы поднимается до неё. */\n public readonly min: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(0, { transform: numberAttribute });\n\n /** Верхняя граница; по умолчанию потолка нет. */\n public readonly max: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(Number.MAX_SAFE_INTEGER, {\n transform: numberAttribute,\n });\n\n public readonly step: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(1, { transform: numberAttribute });\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly decreaseLabel: InputSignal<string> = input<string>('');\n\n public readonly increaseLabel: InputSignal<string> = input<string>('');\n\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n constructor() {\n // Синхронизируем signal-input `disabled` в `isDisabled`, чтобы\n // `[disabled]=\"...\"` и `setDisabledState(...)` (CVA) писали в одно\n // и то же место. Effect живёт в injection context конструктора.\n effect((): void => {\n this.isDisabled.set(this.disabled());\n });\n }\n\n public writeValue(value: number | null | undefined): void {\n this.value.set(clamp(Number(value ?? this.min()), this.min(), this.max()));\n }\n\n public registerOnChange(fn: (value: number) => void): void {\n this.#onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.#onTouched = fn;\n }\n\n public setDisabledState(disabled: boolean): void {\n this.isDisabled.set(disabled);\n }\n\n protected decrease(): void {\n this.#shift(-this.step());\n }\n\n protected increase(): void {\n this.#shift(this.step());\n }\n\n #shift(delta: number): void {\n if (this.isDisabled()) {\n return;\n }\n const next: number = clamp(this.value() + delta, this.min(), this.max());\n if (next === this.value()) {\n return;\n }\n this.value.set(next);\n this.#onChange(next);\n this.#onTouched();\n }\n}\n","<ng-container rtBlock=\"rt-counter\">\n <rt-icon-button\n rtElem=\"decrease\"\n qa-dataid=\"counter-decrease\"\n icon=\"minus\"\n variant=\"secondary\"\n size=\"sm\"\n [ariaLabel]=\"decreaseAriaLabel()\"\n [disabled]=\"!canDecrease()\"\n (clicked)=\"decrease()\" />\n <span rtElem=\"value\" qa-dataid=\"counter-value\" aria-live=\"polite\">{{ value() }}</span>\n <rt-icon-button\n rtElem=\"increase\"\n qa-dataid=\"counter-increase\"\n icon=\"ico-plus\"\n variant=\"secondary\"\n size=\"sm\"\n [ariaLabel]=\"increaseAriaLabel()\"\n [disabled]=\"!canIncrease()\"\n (clicked)=\"increase()\" />\n</ng-container>\n","import { ChangeDetectionStrategy, Component, input, InputSignal } from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-counter-row';\n\n/**\n * Строка списка со счётчиком: подпись с пояснением слева, контрол справа,\n * волосяная линия между соседними строками.\n *\n * Сам счётчик проецируется, а не собирается внутри: строка отвечает только за\n * раскладку, и её не приходится расширять каждый раз, когда у `rt-counter`\n * появляется новый input.\n *\n * ViewEncapsulation — default (Emulated), стили обёрнуты в `:host { ... }`.\n */\n@Component({\n selector: 'rt-counter-row',\n templateUrl: './rt-counter-row.component.html',\n styleUrl: './rt-counter-row.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // rt-tools\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtCounterRowComponent {\n public readonly label: InputSignal<string> = input.required<string>();\n\n /** Пояснение под подписью: возрастная вилка, условие. Пусто — строки нет. */\n public readonly hint: InputSignal<string> = input<string>('');\n}\n","<ng-container rtBlock=\"rt-counter-row\">\n <span rtElem=\"text\">\n <span rtElem=\"label\" qa-dataid=\"counter-row-label\">{{ label() }}</span>\n @if (hint(); as hintText) {\n <span rtElem=\"hint\" qa-dataid=\"counter-row-hint\">{{ hintText }}</span>\n }\n </span>\n <ng-content />\n</ng-container>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n InputSignal,\n LOCALE_ID,\n Signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtFormControlBase } from '../form-control/rt-form-control.base';\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { IRtDatePicker } from './rt-date-picker.model';\n\nconst BEM_BLOCK: string = 'rt-date-picker';\n\n/**\n * Date/time picker на нативном `<input type=\"date\"|\"datetime-local\"|\"time\">`,\n * визуально и по токенам идентичный rt-input (host — box `--rt-input-*`, input —\n * прозрачный `__field`). Календарь/часы — нативные браузерные (без сторонних\n * библиотек). CVA через общий `RtFormControlBase`: clearable, авто-подсветка\n * invalid, read-only представление (значение форматируется через Intl).\n *\n * `value` — ISO-строка, которую отдаёт нативный input (`YYYY-MM-DD`,\n * `YYYY-MM-DDTHH:mm`, `HH:mm`).\n */\n@Component({\n selector: 'rt-date-picker',\n templateUrl: './rt-date-picker.component.html',\n styleUrls: ['./rt-date-picker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n TranslocoPipe,\n ],\n providers: [\n // Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtDatePickerComponent) },\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-date-picker--disabled]': 'isDisabled()',\n '[class.rt-date-picker--invalid]': 'isInvalid()',\n '[class.rt-date-picker--readonly]': 'isReadonly()',\n '[class.rt-date-picker--borderless]': '!bordered()',\n '[class.rt-date-picker--size--sm]': \"size() === 'sm'\",\n '[class.rt-date-picker--size--lg]': \"size() === 'lg'\",\n },\n})\nexport class RtDatePickerComponent extends RtFormControlBase<string> {\n readonly #locale: string = inject(LOCALE_ID);\n\n protected readonly fieldEl: Signal<ElementRef<HTMLInputElement> | undefined> = viewChild<ElementRef<HTMLInputElement>>('fieldEl');\n\n protected readonly hasValue: Signal<boolean> = computed((): boolean => this.value() !== '');\n\n public readonly displayText: Signal<string> = computed((): string => this.#format(this.value(), this.type()));\n\n public readonly type: InputSignal<IRtDatePicker.Type> = input<IRtDatePicker.Type>('date');\n public readonly min: InputSignal<string | null> = input<string | null>(null);\n public readonly max: 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 protected onInput(event: Event): void {\n const next: string = (event.target as HTMLInputElement).value;\n this.value.set(next);\n this.emitChange(next);\n }\n\n protected onBlur(): void {\n this.markTouched();\n }\n\n /**\n * Форматирует ISO-значение нативного input'а в локализованный текст для\n * read-only. Для `time` форматируем как сегодняшнюю дату с временем (нужен\n * валидный Date), показывая только часы/минуты.\n */\n #format(value: string, type: IRtDatePicker.Type): string {\n if (value === '') {\n return '';\n }\n const parsed: number = Date.parse(type === 'time' ? `1970-01-01T${value}` : value);\n if (Number.isNaN(parsed)) {\n return value;\n }\n return new Intl.DateTimeFormat(this.#locale, this.#formatOptions(type)).format(new Date(parsed));\n }\n\n #formatOptions(type: IRtDatePicker.Type): Intl.DateTimeFormatOptions {\n if (type === 'time') {\n return { hour: '2-digit', minute: '2-digit' };\n }\n if (type === 'datetime-local') {\n return { dateStyle: 'medium', timeStyle: 'short' };\n }\n return { dateStyle: 'medium' };\n }\n}\n","<ng-container rtBlock=\"rt-date-picker\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" qa-dataid=\"date-picker-readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '—' }}</span>\n } @else {\n <input\n #fieldEl\n rtElem=\"field\"\n qa-dataid=\"date-picker-control\"\n [type]=\"type()\"\n [value]=\"value()\"\n [disabled]=\"isDisabled()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.min]=\"min()\"\n [attr.max]=\"max()\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\" />\n @if (showClearButton()) {\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"date-picker-clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"'rtKit.uiClear' | transloco\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n }\n</ng-container>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-detail-list';\n\n/**\n * Контейнер для стопки `rt-detail-row` — задаёт единый вертикальный gap между\n * строками «лейбл + значение». Используется в read-only details-панелях асайдов\n * (детали заявки, профиля) вместо самопальных `div`-обёрток.\n *\n * Контент — только `rt-detail-row` через проекцию.\n */\n@Component({\n selector: 'rt-detail-list',\n templateUrl: './rt-detail-list.component.html',\n styleUrl: './rt-detail-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n BlockDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtDetailListComponent {}\n","<ng-container rtBlock=\"rt-detail-list\">\n <ng-content />\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n InputSignal,\n InputSignalWithTransform,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtSkeletonWrapperComponent } from '../skeleton-wrapper';\n\nconst BEM_BLOCK: string = 'rt-detail-row';\n\n/**\n * Одна read-only строка «лейбл + значение» в stacked-раскладке: приглушённый\n * лейбл сверху, значение снизу. Единый паттерн info-строки для всех асайдов\n * (раньше — пять разных реализаций).\n *\n * Значение проецируется через `<ng-content>` — допустим текст, дата через pipe\n * или `rt-tag`. При `[loading]=\"true\"` значение замещается скелетоном (потребитель\n * не оборачивает `rt-skeleton-wrapper` вручную).\n */\n@Component({\n selector: 'rt-detail-row',\n templateUrl: './rt-detail-row.component.html',\n styleUrl: './rt-detail-row.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtSkeletonWrapperComponent,\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtDetailRowComponent {\n public readonly label: InputSignal<string> = input<string>('');\n\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n}\n","<ng-container rtBlock=\"rt-detail-row\">\n <span rtElem=\"label\" qa-dataid=\"detail-row-label\">{{ label() }}</span>\n <div rtElem=\"value\" qa-dataid=\"detail-row-value\">\n <rt-skeleton-wrapper width=\"180px\" height=\"16px\" [isLoading]=\"loading()\">\n <ng-content />\n </rt-skeleton-wrapper>\n </div>\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtIconButtonComponent } from '../../icon-button/rt-icon-button.component';\nimport { RtDialogRef } from '../rt-dialog-ref';\n\nconst BEM_BLOCK: string = 'rt-dialog-header';\n\n/**\n * Заголовок модалки для композиции внутри `<rt-dialog>`.\n *\n * Если компонент рендерится внутри overlay-портала, открытого через `RtDialogService.open()`,\n * кнопка закрытия дёргает `inject(RtDialogRef).close()` автоматически. В legacy-режиме\n * (внутри inline `<rt-dialog [visible]>`) `RtDialogRef` не зарегистрирован — клик\n * по close-кнопке эмитит output `(closeAction)`, который должен повесить родитель.\n *\n * `ViewEncapsulation.None` — для единообразия с rt-dialog (стили префиксованы `.rt-dialog-header`).\n *\n * @example\n * \\`\\`\\`html\n * <rt-dialog size=\"md\">\n * <rt-dialog-header title=\"Создание записи\" />\n * <div>...форма...</div>\n * <rt-dialog-footer>\n * <button rtButton (click)=\"cancel()\">Отмена</button>\n * <button rtButton theme=\"primary\" (click)=\"save()\">Сохранить</button>\n * </rt-dialog-footer>\n * </rt-dialog>\n * \\`\\`\\`\n */\n@Component({\n selector: 'rt-dialog-header',\n templateUrl: './rt-dialog-header.component.html',\n styleUrl: './rt-dialog-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n BlockDirective,\n ElemDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtDialogHeaderComponent {\n readonly #dialogRef: RtDialogRef | null = inject(RtDialogRef, { optional: true });\n\n /** Текст заголовка — рендерится в `<h2>`. */\n public readonly title: InputSignal<string> = input.required<string>();\n\n /** Показывать кнопку закрытия в углу заголовка. Дефолт `true`. */\n public readonly closable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n protected onClose(): void {\n // Programmatic mode — закрываем через DialogRef.\n this.#dialogRef?.close();\n }\n}\n","<header rtBlock=\"rt-dialog-header\" qa-dataid=\"dialog-header\">\n <h2 rtElem=\"title\" qa-dataid=\"dialog-title\">{{ title() }}</h2>\n @if (closable()) {\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"dialog-close\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n [ariaLabel]=\"'rtKit.uiClose' | transloco\"\n (clicked)=\"onClose()\" />\n }\n</header>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-dialog-footer';\n\n/**\n * Footer-слот для композиции внутри `<rt-dialog>`. Принимает любой проектированный\n * контент (action-кнопки, статусные сообщения и т.п.), оборачивает в footer с\n * top-border и flex-раскладкой `justify-content: flex-end`.\n *\n * `ViewEncapsulation.None` — для единообразия с rt-dialog.\n *\n * @example\n * \\`\\`\\`html\n * <rt-dialog-footer>\n * <button rtButton (click)=\"cancel()\">Отмена</button>\n * <button rtButton theme=\"primary\" (click)=\"save()\">Сохранить</button>\n * </rt-dialog-footer>\n * \\`\\`\\`\n */\n@Component({\n selector: 'rt-dialog-footer',\n templateUrl: './rt-dialog-footer.component.html',\n styleUrl: './rt-dialog-footer.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [BlockDirective],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtDialogFooterComponent {}\n","<footer rtBlock=\"rt-dialog-footer\" qa-dataid=\"dialog-footer\">\n <ng-content />\n</footer>\n","import { ChangeDetectionStrategy, Component, input, InputSignal, output, OutputEmitterRef, ViewEncapsulation } from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '../icon/rt-icon.component';\n\nconst BEM_BLOCK: string = 'rt-download-link';\n\n@Component({\n selector: 'rt-download-link',\n templateUrl: './rt-download-link.component.html',\n styleUrl: './rt-download-link.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtDownloadLinkComponent {\n public readonly label: InputSignal<string> = input.required<string>();\n\n public readonly downloadClick: OutputEmitterRef<void> = output<void>();\n\n protected onClick(): void {\n this.downloadClick.emit();\n }\n}\n","<ng-container rtBlock=\"rt-download-link\">\n <button\n rtElem=\"button\"\n qa-dataid=\"download-link-button\"\n type=\"button\"\n [attr.aria-label]=\"'rtKit.uiDownloadFile' | transloco: { name: label() }\"\n (click)=\"onClick()\">\n <rt-icon rtElem=\"icon\" name=\"ico-download\" size=\"md\" />\n <span rtElem=\"label\" qa-dataid=\"download-link-label\">{{ label() }}</span>\n </button>\n</ng-container>\n","import { ChangeDetectionStrategy, Component, input, InputSignal, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '../icon/rt-icon.component';\nimport { IRtIcon } from '../icon/rt-icon.model';\n\nconst BEM_BLOCK: string = 'rt-empty-state';\n\n/**\n * Заглушка пустого состояния: центрированная иконка в круглой подложке, заголовок,\n * опциональное описание и проецируемый слот для действия (кнопка «Прикрепить»,\n * «Выбрать» и т.п.). Применяется в пустых вкладках/списках и зонах загрузки, когда\n * сущностей ещё нет.\n *\n * Иконка опциональна (`icon`), действие — через `<ng-content />` (если ничего не\n * спроецировано, слот скрыт `:empty`). Громких severity-цветов нет — приглушённая\n * палитра, как у `rt-note`.\n */\n@Component({\n selector: 'rt-empty-state',\n templateUrl: './rt-empty-state.component.html',\n styleUrl: './rt-empty-state.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtEmptyStateComponent {\n public readonly icon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n public readonly title: InputSignal<string> = input<string>('');\n\n public readonly description: InputSignal<string | null> = input<string | null>(null);\n}\n","<ng-container rtBlock=\"rt-empty-state\">\n <div rtElem=\"illustration\">\n <ng-content select=\"[rtEmptyIllustration]\" />\n </div>\n\n @if (icon(); as iconName) {\n <span rtElem=\"icon-wrap\" qa-dataid=\"empty-state-icon\">\n <rt-icon size=\"xl\" color=\"muted\" [name]=\"iconName\" />\n </span>\n }\n\n @if (title()) {\n <p rtElem=\"title\" qa-dataid=\"empty-state-title\">{{ title() }}</p>\n }\n\n @if (description(); as desc) {\n <p rtElem=\"description\" qa-dataid=\"empty-state-description\">{{ desc }}</p>\n }\n\n <div rtElem=\"action\" qa-dataid=\"empty-state-action\">\n <ng-content />\n </div>\n</ng-container>\n","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","/** Контракт поля-обёртки 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: IRtField.ErrorMessages = {\n required: 'rtKit.fieldErrorRequired',\n email: 'rtKit.fieldErrorEmail',\n minlength: 'rtKit.fieldErrorMinLength',\n maxlength: 'rtKit.fieldErrorMaxLength',\n min: 'rtKit.fieldErrorMin',\n max: 'rtKit.fieldErrorMax',\n pattern: 'rtKit.fieldErrorPattern',\n};\n\n/** Текст-плейсхолдер read-only поля без значения. */\nexport const RT_FIELD_EMPTY_VALUE: string = '—';\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n AfterContentInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n effect,\n input,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ValidationErrors } from '@angular/forms';\n\nimport { translateSignal, TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtFormControlBase } from '../form-control/rt-form-control.base';\nimport { RtIconComponent } from '../icon';\nimport { RtPopoverDirective } from '../popover/rt-popover.directive';\nimport { RtSkeletonWrapperComponent } from '../skeleton-wrapper/rt-skeleton-wrapper.component';\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 * `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 TranslocoPipe,\n ],\n host: { class: BEM_BLOCK },\n})\nexport class RtFieldComponent implements AfterContentInit {\n // contentChild нельзя объявлять на ES-private (#) поле — Angular это запрещает,\n // поэтому проекция контрола живёт в protected-поле.\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> = translateSignal(\n computed((): string => 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 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 }\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]=\"'rtKit.uiHint' | transloco\"\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","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-file-list';\n\n/**\n * Вертикальный контейнер для карточек файлов (`rt-file-card`): задаёт отступы между\n * карточками и растягивает их по ширине. Чисто презентационный — содержимое\n * проецируется через `<ng-content />`, логику списка держит caller.\n */\n@Component({\n selector: 'rt-file-list',\n templateUrl: './rt-file-list.component.html',\n styleUrls: ['./rt-file-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n BlockDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtFileListComponent {}\n","<ng-container rtBlock=\"rt-file-list\">\n <ng-content />\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtButtonDirective } from '../button/rt-button.directive';\nimport { RtFileCardComponent } from '../file-card/rt-file-card.component';\nimport { RtFileListComponent } from '../file-list/rt-file-list.component';\nimport { RtFormControlBase } from '../form-control/rt-form-control.base';\n\nconst BEM_BLOCK: string = 'rt-file-input';\n\n/**\n * Поле выбора файлов: кнопка «выбрать» + список выбранных файлов карточками\n * `rt-file-card` (иконка типа, имя, размер, удаление). Скрывает нативный\n * `<input type=\"file\">`, value хранит как `File[]` (одиночный режим = максимум\n * один файл). CVA через общий `RtFormControlBase`. Read-only представление —\n * имена файлов через запятую.\n *\n * Без drag-drop (MVP). `accept` пробрасывается в нативный input, `multiple`\n * включает множественный выбор.\n */\n@Component({\n selector: 'rt-file-input',\n templateUrl: './rt-file-input.component.html',\n styleUrls: ['./rt-file-input.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtButtonDirective,\n RtFileCardComponent,\n RtFileListComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n providers: [\n // Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtFileInputComponent) },\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-file-input--disabled]': 'isDisabled()',\n '[class.rt-file-input--invalid]': 'isInvalid()',\n '[class.rt-file-input--readonly]': 'isReadonly()',\n },\n})\nexport class RtFileInputComponent extends RtFormControlBase<File[]> {\n readonly #t_uiChooseFile: Signal<string> = translateSignal('rtKit.uiChooseFile');\n\n protected readonly fileEl: Signal<ElementRef<HTMLInputElement> | undefined> = viewChild<ElementRef<HTMLInputElement>>('fileEl');\n\n protected readonly buttonText: Signal<string> = computed((): string => this.buttonLabel() || this.#t_uiChooseFile());\n\n protected readonly hasValue: Signal<boolean> = computed((): boolean => this.value().length > 0);\n\n public readonly displayText: Signal<string> = computed((): string =>\n this.value()\n .map((f: File): string => f.name)\n .join(', ')\n );\n\n public readonly multiple: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n public readonly accept: InputSignal<string | null> = input<string | null>(null);\n\n /**\n * Выбор каталога целиком вместо отдельных файлов. Браузер отдаёт\n * относительные пути (`webkitRelativePath`), по ним вызывающая сторона\n * восстанавливает структуру — иначе пользователю пришлось бы выбирать\n * десятки файлов по одному.\n */\n public readonly directory: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly buttonLabel: InputSignal<string> = input<string>('');\n\n protected getEmptyValue(): File[] {\n return [];\n }\n\n protected focusAfterClear(): void {\n // Скрытый native input фокусировать бессмысленно — фокус остаётся на кнопке.\n }\n\n protected openPicker(): void {\n if (this.isDisabled()) {\n return;\n }\n this.fileEl()?.nativeElement.click();\n }\n\n protected onFiles(event: Event): void {\n const list: FileList | null = (event.target as HTMLInputElement).files;\n const files: File[] = list ? Array.from(list) : [];\n const next: File[] = this.multiple() ? files : files.slice(0, 1);\n this.value.set(next);\n this.emitChange(next);\n this.markTouched();\n }\n\n protected removeFile(index: number): void {\n if (this.isDisabled()) {\n return;\n }\n const next: File[] = this.value().filter((_: File, i: number): boolean => i !== index);\n this.value.set(next);\n this.emitChange(next);\n // Сбрасываем native input, иначе повторный выбор того же файла не сработает.\n const el: HTMLInputElement | undefined = this.fileEl()?.nativeElement;\n if (el) {\n el.value = '';\n }\n }\n}\n","<ng-container rtBlock=\"rt-file-input\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" qa-dataid=\"file-input-readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '—' }}</span>\n } @else {\n <input\n #fileEl\n rtElem=\"native\"\n qa-dataid=\"file-input-native\"\n type=\"file\"\n hidden\n [multiple]=\"multiple()\"\n [disabled]=\"isDisabled()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.accept]=\"accept()\"\n [attr.webkitdirectory]=\"directory() ? '' : null\"\n (change)=\"onFiles($event)\" />\n\n <button\n rtElem=\"trigger\"\n qa-dataid=\"file-input-trigger\"\n type=\"button\"\n rtButton\n appearance=\"outlined\"\n icon=\"ico-upload\"\n [label]=\"buttonText()\"\n [attr.aria-label]=\"buttonText()\"\n [disabled]=\"isDisabled()\"\n (click)=\"openPicker()\"></button>\n\n @if (value().length > 0) {\n <rt-file-list rtElem=\"list\" qa-dataid=\"file-input-list\">\n @for (file of value(); track $index) {\n <rt-file-card\n showRemove\n qa-dataid=\"file-input-file\"\n [name]=\"file.name\"\n [sizeBytes]=\"file.size\"\n [disabled]=\"isDisabled()\"\n (removed)=\"removeFile($index)\" />\n }\n </rt-file-list>\n }\n }\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n signal,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtFormControlBase } from '../form-control/rt-form-control.base';\nimport { RtIconComponent, IRtIcon } from '../icon';\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { IRtInput } from './rt-input.model';\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 TranslocoPipe,\n ],\n providers: [\n // Алиас базового токена — чтобы rt-field мог найти контрол через\n // contentChild(RtFormControlBase) (query по абстрактному классу).\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtInputComponent) },\n ],\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--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 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 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]=\"'rtKit.uiClear' | transloco\"\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() ? ('rtKit.uiHidePassword' | transloco) : ('rtKit.uiShowPassword' | transloco)\"\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","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { translateSignal, TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtFormControlBase } from '../form-control/rt-form-control.base';\nimport { RtIconComponent, IRtIcon } from '../icon';\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { RtInputComponent } from '../input/rt-input.component';\nimport { RtPopoverDirective } from '../popover/rt-popover.directive';\nimport { IRtSelect } from './rt-select.model';\n\nconst BEM_BLOCK: string = 'rt-select';\n\n/** Клавиши, открывающие закрытый dropdown с фокуса на trigger'е. */\nconst OPEN_KEYS: ReadonlySet<string> = new Set<string>(['ArrowDown', 'ArrowUp', 'Enter', ' ']);\n\ntype IBooleanInput = boolean | string;\n\nlet panelIdSeed: number = 0;\n\nfunction nextPanelId(): number {\n panelIdSeed += 1;\n return panelIdSeed;\n}\n\n/**\n * Single-select dropdown с опциональным filter input.\n *\n * Panel рендерится через CDK Overlay (директива `[rtPopover]` на trigger'е) —\n * не обрезается `overflow: hidden` предками (таблицы, aside, карточки) и\n * авто-flip'ается у края viewport. CVA через общий `RtFormControlBase`. Крестик\n * (`clearable`) слева от шеврона — виден при наличии значения, очищает выбор.\n *\n * Keyboard-nav (activedescendant): фокус на trigger'е, ArrowUp/Down двигают\n * виртуальный highlight (`aria-activedescendant`), Enter выбирает, Escape\n * закрывает. Home/End/typeahead — deferred.\n */\n@Component({\n selector: 'rt-select',\n templateUrl: './rt-select.component.html',\n styleUrl: './rt-select.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n FormsModule,\n\n // standalone components / directives\n RtIconButtonComponent,\n RtIconComponent,\n RtInputComponent,\n RtPopoverDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n TranslocoPipe,\n ],\n providers: [\n // Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtSelectComponent) },\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-select--open]': 'isOpen()',\n '[class.rt-select--disabled]': 'isDisabled()',\n '[class.rt-select--readonly]': 'isReadonly()',\n '[class.rt-select--invalid]': 'isInvalid()',\n '[class.rt-select--borderless]': '!bordered()',\n '[class.rt-select--size--sm]': \"size() === 'sm'\",\n '[class.rt-select--size--lg]': \"size() === 'lg'\",\n '[class.rt-select--with-icon-left]': '!!iconLeft()',\n },\n})\nexport class RtSelectComponent<TValue> extends RtFormControlBase<TValue | null> {\n readonly #t_uiSearch: Signal<string> = translateSignal('rtKit.uiSearch');\n\n protected readonly panelId: string = `rt-select-panel-${nextPanelId()}`;\n\n protected readonly filterPlaceholderText: Signal<string> = computed((): string => this.filterPlaceholder() || this.#t_uiSearch());\n\n protected readonly popover: Signal<RtPopoverDirective> = viewChild.required(RtPopoverDirective);\n\n protected readonly triggerEl: Signal<ElementRef<HTMLButtonElement> | undefined> = viewChild<ElementRef<HTMLButtonElement>>('triggerEl');\n\n protected readonly filterTerm: WritableSignal<string> = signal<string>('');\n protected readonly activeIndex: WritableSignal<number> = signal<number>(-1);\n\n protected readonly isOpen: Signal<boolean> = computed((): boolean => this.popover().isOpen());\n\n protected readonly hasValue: Signal<boolean> = computed((): boolean => this.value() !== null);\n\n protected readonly selectedLabel: Signal<string> = computed((): string => {\n const v: TValue | null = this.value();\n if (v === null) {\n return '';\n }\n const match: IRtSelect.Option<TValue> | undefined = this.options().find((o: IRtSelect.Option<TValue>): boolean => o.value === v);\n return match?.label ?? '';\n });\n\n protected readonly filteredOptions: Signal<ReadonlyArray<IRtSelect.Option<TValue>>> = computed(\n (): ReadonlyArray<IRtSelect.Option<TValue>> => {\n const term: string = this.filterTerm().toLowerCase().trim();\n const all: ReadonlyArray<IRtSelect.Option<TValue>> = this.options();\n if (!term) {\n return all;\n }\n return all.filter((o: IRtSelect.Option<TValue>): boolean => o.label.toLowerCase().includes(term));\n }\n );\n\n public readonly displayText: Signal<string> = computed((): string => this.selectedLabel());\n\n public readonly options: InputSignal<ReadonlyArray<IRtSelect.Option<TValue>>> = input<ReadonlyArray<IRtSelect.Option<TValue>>>([]);\n\n public readonly placeholder: InputSignal<string> = input<string>('');\n\n public readonly iconLeft: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n public readonly filter: InputSignalWithTransform<boolean, IBooleanInput> = input<boolean, IBooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly filterPlaceholder: InputSignal<string> = input<string>('');\n\n public readonly selectionChange: OutputEmitterRef<TValue | null> = output<TValue | null>();\n\n public override setDisabledState(disabled: boolean): void {\n super.setDisabledState(disabled);\n if (disabled) {\n this.popover().close();\n }\n }\n\n protected getEmptyValue(): TValue | null {\n return null;\n }\n\n protected focusAfterClear(): void {\n this.triggerEl()?.nativeElement.focus();\n }\n\n protected override clear(event?: Event): void {\n if (this.isDisabled()) {\n return;\n }\n super.clear(event);\n this.selectionChange.emit(null);\n }\n\n protected onClosed(): void {\n // Закрытие (outside-click / Escape / выбор) = пользователь увёл фокус.\n this.filterTerm.set('');\n this.activeIndex.set(-1);\n this.markTouched();\n }\n\n protected select(opt: IRtSelect.Option<TValue>): void {\n if (opt.disabled) {\n return;\n }\n this.value.set(opt.value);\n this.emitChange(opt.value);\n this.selectionChange.emit(opt.value);\n this.popover().close();\n }\n\n protected setFilter(term: string): void {\n this.filterTerm.set(term);\n this.activeIndex.set(-1);\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) {\n return;\n }\n if (!this.isOpen()) {\n if (OPEN_KEYS.has(event.key)) {\n event.preventDefault();\n this.popover().open();\n this.#moveActive(1);\n }\n return;\n }\n this.#handleOpenKeydown(event);\n }\n\n #handleOpenKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.#moveActive(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.#moveActive(-1);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.#selectActive();\n break;\n case 'Escape':\n event.preventDefault();\n this.popover().close();\n break;\n default:\n break;\n }\n }\n\n #moveActive(delta: number): void {\n const opts: ReadonlyArray<IRtSelect.Option<TValue>> = this.filteredOptions();\n if (opts.length === 0) {\n this.activeIndex.set(-1);\n return;\n }\n let index: number = this.activeIndex();\n for (let step: number = 0; step < opts.length; step += 1) {\n index = (index + delta + opts.length) % opts.length;\n if (!opts[index].disabled) {\n this.activeIndex.set(index);\n return;\n }\n }\n }\n\n #selectActive(): void {\n const opts: ReadonlyArray<IRtSelect.Option<TValue>> = this.filteredOptions();\n const index: number = this.activeIndex();\n if (index >= 0 && index < opts.length) {\n this.select(opts[index]);\n }\n }\n}\n","<ng-container rtBlock=\"rt-select\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '—' }}</span>\n }\n <button\n #triggerEl\n rtElem=\"trigger\"\n qa-dataid=\"select-trigger\"\n type=\"button\"\n rtPopoverWidth=\"trigger\"\n [rtPopover]=\"panelTpl\"\n [rtPopoverDisabled]=\"isDisabled()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-activedescendant]=\"isOpen() && activeIndex() >= 0 ? panelId + '-opt-' + activeIndex() : null\"\n [disabled]=\"isDisabled()\"\n (keydown)=\"onTriggerKeydown($event)\"\n (rtPopoverClosed)=\"onClosed()\">\n @if (iconLeft(); as left) {\n <rt-icon rtElem=\"icon-left\" size=\"sm\" color=\"muted\" [name]=\"left\" />\n }\n <span rtElem=\"label\" [rtMod]=\"{ placeholder: !selectedLabel() }\">\n {{ selectedLabel() || placeholder() }}\n </span>\n @if (showClearButton()) {\n <rt-icon-button\n rtElem=\"clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"'rtKit.uiClear' | transloco\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n <rt-icon rtElem=\"chevron\" name=\"chevron-down\" size=\"sm\" color=\"muted\" />\n </button>\n\n <ng-template #panelTpl>\n <div rtElem=\"panel\" role=\"listbox\" [attr.aria-label]=\"ariaLabel()\">\n @if (filter()) {\n <div rtElem=\"filter\">\n <rt-input [placeholder]=\"filterPlaceholderText()\" [ngModel]=\"filterTerm()\" (ngModelChange)=\"setFilter($event)\" />\n </div>\n }\n <!--\n Опции listbox'а выбираются мышью через (click); keyboard-nav —\n на trigger'е (activedescendant: ArrowUp/Down/Enter), опции не\n focusable индивидуально, поэтому a11y-правила здесь не применимы.\n -->\n <!-- eslint-disable @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <ul rtElem=\"list\">\n @for (opt of filteredOptions(); track opt.value; let i = $index) {\n <li\n rtElem=\"option\"\n qa-dataid=\"select-option\"\n role=\"option\"\n [id]=\"panelId + '-opt-' + i\"\n [attr.data-value]=\"opt.value\"\n [rtMod]=\"{\n selected: opt.value === value(),\n active: i === activeIndex(),\n disabled: !!opt.disabled,\n }\"\n [attr.aria-selected]=\"opt.value === value()\"\n [attr.aria-disabled]=\"!!opt.disabled\"\n (click)=\"select(opt)\">\n {{ opt.label }}\n </li>\n } @empty {\n <li rtElem=\"empty\">{{ 'rtKit.uiNoOptions' | transloco }}</li>\n }\n </ul>\n </div>\n </ng-template>\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '../icon/rt-icon.component';\nimport { IRtIcon } from '../icon/rt-icon.model';\nimport { RtTooltipDirective } from '../tooltip/rt-tooltip.directive';\nimport { IRtToggleButtonGroup } from './rt-toggle-button-group.model';\n\nconst BEM_BLOCK: string = 'rt-toggle-button-group';\n\n/**\n * Маппинг размера группы на размер вложенной `<rt-icon>`. rt-icon не имеет\n * промежуточных значений (12 / 16 / 20 / 24 / 32), поэтому `lg` тоже едет\n * на `sm` (16px) — ближе к расчётным 18px у rt-button lg, чем md (20px).\n */\nconst ICON_SIZE_BY_SIZE: Readonly<Record<IRtToggleButtonGroup.Size, IRtIcon.Size>> = Object.freeze({\n sm: 'xs',\n md: 'sm',\n lg: 'sm',\n});\n\n/**\n * Generic segmented control кита.\n *\n * API `toggle-button-group` с тремя особенностями:\n * 1. BEM через `rtBlock/rtElem/rtMod` (camelCase mods → kebab-case в CSS).\n * 2. Tooltip — нативный `[attr.title]` вместо `MatTooltip` (Angular Material\n * запрещён, см. CLAUDE.md).\n * 3. Визуал — текстовые лейблы + опциональная иконка, а не icon-only кнопки.\n * Иконка остаётся опциональной, чтобы покрыть оба сценария.\n *\n * Компонент \"controlled\" — рендерит сегмент с `value === option.value` как\n * активный, эмиттит `valueChange` при клике, обновление `value` остаётся за\n * потребителем.\n *\n * Generic `<T = string>` сохраняет типизацию по value (`'list' | 'grid'`,\n * union'ы, enum'ы). Дефолт `string` нужен, чтобы шаблон-инстанцирование\n * без явного параметра компилировалось.\n */\n@Component({\n selector: 'rt-toggle-button-group',\n templateUrl: './rt-toggle-button-group.component.html',\n styleUrls: ['./rt-toggle-button-group.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // standalone components / directives\n RtIconComponent,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-toggle-button-group--full-width]': 'fullWidth()',\n },\n})\nexport class RtToggleButtonGroupComponent<T = string> {\n protected readonly iconSize: Signal<IRtIcon.Size> = computed((): IRtIcon.Size => ICON_SIZE_BY_SIZE[this.size()]);\n\n public readonly options: InputSignal<ReadonlyArray<IRtToggleButtonGroup.Option<T>>> =\n input.required<ReadonlyArray<IRtToggleButtonGroup.Option<T>>>();\n\n public readonly value: InputSignal<T | undefined> = input<T | undefined>(undefined);\n\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n public readonly size: InputSignal<IRtToggleButtonGroup.Size> = input<IRtToggleButtonGroup.Size>('sm');\n\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Растягивает группу на всю ширину контейнера; опции делят ширину поровну. */\n public readonly fullWidth: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly valueChange: OutputEmitterRef<T> = output<T>();\n\n protected onOptionClick(option: IRtToggleButtonGroup.Option<T>): void {\n if (this.disabled()) {\n return;\n }\n this.valueChange.emit(option.value);\n }\n}\n","<div\n rtBlock=\"rt-toggle-button-group\"\n role=\"group\"\n [rtMod]=\"{\n sm: size() === 'sm',\n md: size() === 'md',\n lg: size() === 'lg',\n disabled: disabled(),\n }\"\n [attr.aria-label]=\"ariaLabel()\">\n @for (option of options(); track option.value) {\n <button\n type=\"button\"\n rtElem=\"button\"\n qa-dataid=\"toggle-button-group-option\"\n [attr.data-value]=\"option.value\"\n [rtMod]=\"{\n active: value() === option.value,\n first: $first,\n last: $last,\n }\"\n [disabled]=\"disabled()\"\n [attr.aria-pressed]=\"value() === option.value ? 'true' : 'false'\"\n [rtTooltip]=\"option.title ?? ''\"\n (click)=\"onOptionClick(option)\">\n @if (option.icon) {\n <rt-icon rtElem=\"icon\" color=\"current\" [name]=\"option.icon\" [size]=\"iconSize()\" />\n }\n <span rtElem=\"label\">{{ option.label }}</span>\n </button>\n }\n</div>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { BreakpointsService } from '../../platform';\n\nimport { RtSelectComponent } from '../select/rt-select.component';\nimport { IRtSelect } from '../select/rt-select.model';\nimport { RtToggleButtonGroupComponent } from '../toggle-button-group/rt-toggle-button-group.component';\nimport { IRtFilterControl } from './rt-filter-control.model';\n\nconst BEM_BLOCK: string = 'rt-filter-control';\n\n/**\n * Адаптивный фильтр-контрол для тулбаров list-страниц.\n *\n * Один и тот же набор опций рендерится двумя способами по ширине вьюпорта:\n * - десктоп (> 1080px) — развёрнутые сегменты `rt-toggle-button-group`;\n * - узкий экран (≤ 1080px, `BreakpointsService.narrow`) — компактный\n * `rt-select` с `clearable=false` (сброс — через явную опцию «Все»).\n *\n * API повторяет controlled-контракт rt-toggle-button-group (`[options]` /\n * `[value]` / `(valueChange)`), поэтому миграция потребителя — смена селектора\n * без правки хендлеров. Sentinel «нет фильтра» задаёт сам потребитель реальным\n * значением опции («»/false), а не `null`/`undefined` — rt-select всегда\n * показывает выбранную опцию.\n *\n * Generic `<T = string>` сохраняет типизацию по value (union'ы, enum'ы).\n */\n@Component({\n selector: 'rt-filter-control',\n templateUrl: './rt-filter-control.component.html',\n styleUrls: ['./rt-filter-control.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n FormsModule,\n\n // standalone components / directives\n RtSelectComponent,\n RtToggleButtonGroupComponent,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtFilterControlComponent<T = string> {\n readonly #breakpoints: BreakpointsService = inject(BreakpointsService);\n\n protected readonly isNarrow: Signal<boolean> = this.#breakpoints.narrow;\n\n /** Проекция опций фильтра в форму rt-select (icon/title отбрасываются). */\n protected readonly selectOptions: Signal<ReadonlyArray<IRtSelect.Option<T>>> = computed((): ReadonlyArray<IRtSelect.Option<T>> =>\n this.options().map((option: IRtFilterControl.Option<T>): IRtSelect.Option<T> => ({\n label: option.label,\n value: option.value,\n }))\n );\n\n public readonly options: InputSignal<ReadonlyArray<IRtFilterControl.Option<T>>> =\n input.required<ReadonlyArray<IRtFilterControl.Option<T>>>();\n\n public readonly value: InputSignal<T | undefined> = input<T | undefined>(undefined);\n\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n public readonly placeholder: InputSignal<string> = input<string>('');\n\n /**\n * Размер сегментов (десктоп). На узком экране select всегда рендерится в md,\n * чтобы совпадать по высоте и ширине со строкой поиска list-страницы.\n */\n public readonly size: InputSignal<IRtFilterControl.Size> = input<IRtFilterControl.Size>('sm');\n\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Растягивает сегменты на всю ширину контейнера (только десктоп-вариант). */\n public readonly fullWidth: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly valueChange: OutputEmitterRef<T> = output<T>();\n\n protected onValueChange(value: T): void {\n this.valueChange.emit(value);\n }\n\n protected onSelectionChange(value: T | null): void {\n // rt-select с clearable=false и явной опцией «Все» не эмитит null,\n // но guard оставляем на случай программной очистки.\n if (value !== null) {\n this.valueChange.emit(value);\n }\n }\n}\n","@if (isNarrow()) {\n <rt-select\n qa-dataid=\"filter-control-select\"\n size=\"md\"\n [options]=\"selectOptions()\"\n [placeholder]=\"placeholder()\"\n [ariaLabel]=\"ariaLabel()\"\n [clearable]=\"false\"\n [disabled]=\"disabled()\"\n [ngModel]=\"value()\"\n (selectionChange)=\"onSelectionChange($event)\" />\n} @else {\n <rt-toggle-button-group\n qa-dataid=\"filter-control-group\"\n [options]=\"options()\"\n [value]=\"value()\"\n [ariaLabel]=\"ariaLabel()\"\n [size]=\"size()\"\n [disabled]=\"disabled()\"\n [fullWidth]=\"fullWidth()\"\n (valueChange)=\"onValueChange($event)\" />\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n Signal,\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 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","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconButtonComponent } from '../icon-button';\nimport { RtLogoComponent } from '../logo';\n\nconst BEM_BLOCK: string = 'rt-header';\n\n/**\n * Общий хедер приложения.\n *\n * Слева — slot 35×45 под back-button (rt-icon-button arrow-left, ghost variant),\n * который виден по входному сигналу `canGoBack` и эмитит `backClick`. Когда\n * `canGoBack=false` (default) — slot полностью скрыт через display:none, wordmark\n * выравнивается слева.\n *\n * Далее — wordmark, справа — action-иконки (на базе rt-icon-button с inline\n * override `--rt-icon-button-size: 35px`): опциональная «Пригласить пользователя»\n * (`showInvite`), слот колокольчика и профиль.\n *\n * Колокольчик уведомлений — проекция `[rtHeaderBell]`: домен кладёт в слот\n * `rt-notifications-bell` (общий попап-компонент), хедер про его устройство не знает.\n *\n * Темизация — через семантические `--rt-color-bg-surface` / `--rt-color-text-primary`,\n * dark override карточного фона выполняется в SCSS (header navy совпадает с фоном\n * страницы в dark).\n */\n@Component({\n selector: 'rt-header',\n templateUrl: './rt-header.component.html',\n styleUrls: ['./rt-header.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n RtLogoComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtHeaderComponent {\n public readonly canGoBack: InputSignal<boolean> = input<boolean>(false);\n\n /** Показывать action-иконку «Пригласить пользователя» слева от колокола. */\n public readonly showInvite: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n public readonly backClick: OutputEmitterRef<void> = output<void>();\n public readonly inviteClick: OutputEmitterRef<void> = output<void>();\n public readonly profileClick: OutputEmitterRef<void> = output<void>();\n\n protected onBackClick(): void {\n this.backClick.emit();\n }\n\n protected onInviteClick(): void {\n this.inviteClick.emit();\n }\n\n protected onProfileClick(): void {\n this.profileClick.emit();\n }\n}\n","<ng-container rtBlock=\"rt-header\">\n <div rtElem=\"content\">\n <rt-icon-button\n rtElem=\"back\"\n qa-dataid=\"header-back\"\n icon=\"arrow-left\"\n variant=\"ghost\"\n size=\"md\"\n shape=\"circle\"\n [ariaLabel]=\"'rtKit.uiBack' | transloco\"\n [tooltip]=\"'rtKit.uiBack' | transloco\"\n [rtMod]=\"{ visible: canGoBack() }\"\n (clicked)=\"onBackClick()\" />\n\n <div rtElem=\"logo\" qa-dataid=\"header-logo\">\n <rt-logo variant=\"wordmark\" height=\"15\" />\n </div>\n\n @if (showInvite()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"header-invite\"\n icon=\"user-plus\"\n variant=\"ghost\"\n size=\"md\"\n shape=\"circle\"\n style=\"--rt-icon-button-size: 35px\"\n [ariaLabel]=\"'rtKit.uiInviteUser' | transloco\"\n [tooltip]=\"'rtKit.uiInviteUser' | transloco\"\n (clicked)=\"onInviteClick()\" />\n }\n\n <ng-content select=\"[rtHeaderBell]\" />\n\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"header-profile\"\n icon=\"user\"\n variant=\"ghost\"\n size=\"md\"\n shape=\"circle\"\n style=\"--rt-icon-button-size: 35px\"\n [ariaLabel]=\"'rtKit.uiProfile' | transloco\"\n [tooltip]=\"'rtKit.uiProfile' | transloco\"\n (clicked)=\"onProfileClick()\" />\n </div>\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n InputSignal,\n InputSignalWithTransform,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtSkeletonWrapperComponent } from '../skeleton-wrapper/rt-skeleton-wrapper.component';\n\nconst BEM_BLOCK: string = 'rt-info-item';\n\n@Component({\n selector: 'rt-info-item',\n templateUrl: './rt-info-item.component.html',\n styleUrl: './rt-info-item.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtSkeletonWrapperComponent,\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-info-item--grow]': 'grow()',\n },\n})\nexport class RtInfoItemComponent {\n public readonly label: InputSignal<string> = input.required<string>();\n\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly grow: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n}\n","<ng-container rtBlock=\"rt-info-item\">\n <span rtElem=\"label\" qa-dataid=\"info-item-label\">{{ label() }}</span>\n @if (loading()) {\n <rt-skeleton-wrapper rtElem=\"value-skeleton\" qa-dataid=\"info-item-skeleton\" width=\"80px\" [isLoading]=\"true\" />\n } @else {\n <span rtElem=\"value\" qa-dataid=\"info-item-value\"><ng-content /></span>\n }\n</ng-container>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n InputSignal,\n LOCALE_ID,\n Signal,\n signal,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtFormControlBase } from '../form-control/rt-form-control.base';\nimport { RtIconComponent, IRtIcon } from '../icon';\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\n\nconst BEM_BLOCK: string = 'rt-input-number';\n\n/**\n * Парсит строку в `number | null`. Принимает `,` или `.` как decimal\n * separator. Все пробелы (включая неразрывный) удаляются — нужно чтобы\n * сгруппированное по разрядам отображение (`1 234,56`) парсилось обратно.\n * Пустая строка / NaN → null.\n */\nfunction parseNumber(text: string): number | null {\n const cleaned: string = text.replace(/\\s/g, '').replace(',', '.');\n if (cleaned === '') {\n return null;\n }\n const parsed: number = parseFloat(cleaned);\n return Number.isNaN(parsed) ? null : parsed;\n}\n\n/**\n * Клампит `value` в диапазон `[min, max]`. `null` границы игнорируются —\n * соответствующая сторона остаётся неограниченной.\n */\nfunction clamp(value: number, min: number | null, max: number | null): number {\n let result: number = value;\n if (min !== null && result < min) {\n result = min;\n }\n if (max !== null && result > max) {\n result = max;\n }\n return result;\n}\n\n/**\n * Форматирует `number | null` в строку с группировкой разрядов (неразрывный\n * пробел) и заданным fractionDigits diapason. `value === null` → \"\".\n * `maxFractionDigits` ограничивается сверху 20 (лимит Intl). Итоговый\n * precision = `max(min, min(max, 20))` и фиксирует одинаковую нижнюю/верхнюю\n * границу дробной части (как прежний `toFixed`), меняется только группировка\n * и десятичный разделитель — их даёт `locale`.\n */\nfunction formatNumber(value: number | null, minFractionDigits: number, maxFractionDigits: number, locale: string): string {\n if (value === null) {\n return '';\n }\n const cappedMax: number = Math.min(maxFractionDigits, 20);\n const precision: number = Math.min(20, Math.max(minFractionDigits, cappedMax));\n return value.toLocaleString(locale, {\n minimumFractionDigits: precision,\n maximumFractionDigits: precision,\n useGrouping: true,\n });\n}\n\n/**\n * Numeric input с parse/format/clamp logic. Использует native\n * `<input type=\"text\" inputmode=\"decimal\">` (НЕ `type=\"number\"` — избегаем\n * browser spinner quirks: scroll-wheel value changes, locale-specific decimal\n * separators, inconsistent step rounding).\n *\n * CVA через общий `RtFormControlBase` — авто-подсветка invalid, `clearable`\n * (крестик при непустом display). Parser принимает `,`/`.`, невалидный ввод\n * (NaN) не эмитится во время набора; на blur невалидное → null, валидное —\n * clamp + format.\n *\n * Визуально и по токенам идентичен rt-input (`--rt-input-*`): host — box,\n * `<input>` — прозрачный `__field`.\n */\n@Component({\n selector: 'rt-input-number',\n templateUrl: './rt-input-number.component.html',\n styleUrl: './rt-input-number.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 TranslocoPipe,\n ],\n providers: [\n // Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtInputNumberComponent) },\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-input-number--disabled]': 'isDisabled()',\n '[class.rt-input-number--invalid]': 'isInvalid()',\n '[class.rt-input-number--readonly]': 'isReadonly()',\n '[class.rt-input-number--borderless]': '!bordered()',\n '[class.rt-input-number--size--sm]': \"size() === 'sm'\",\n '[class.rt-input-number--size--lg]': \"size() === 'lg'\",\n '(mousedown)': 'onHostMousedown($event)',\n },\n})\nexport class RtInputNumberComponent extends RtFormControlBase<number | null> {\n readonly #locale: string = inject(LOCALE_ID);\n\n // Символ группировки разрядов из локали (для ru — неразрывный пробел). Берём\n // тот же, что отдаёт toLocaleString на blur — тогда live и blur выглядят\n // одинаково, а parseNumber (стрипает \\s) парсит обратно обе формы.\n readonly #groupSep: string = (1000).toLocaleString(this.#locale).replace(/\\d/g, '') || ' ';\n\n protected readonly fieldEl: Signal<ElementRef<HTMLInputElement> | undefined> = viewChild<ElementRef<HTMLInputElement>>('fieldEl');\n\n protected readonly displayValue: WritableSignal<string> = signal<string>('');\n\n // Крестик показываем только при непустом и ненулевом значении: 0 — это и\n // есть результат очистки, поэтому при нём кнопка сброса не нужна.\n protected readonly hasValue: Signal<boolean> = computed(\n (): boolean => this.displayValue() !== '' && this.value() !== null && this.value() !== 0\n );\n\n public readonly displayText: Signal<string> = computed((): string => this.displayValue());\n\n public readonly iconLeft: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n /** Текстовый префикс слева от значения (напр. «₽» для рублёвых сумм). */\n public readonly prefix: InputSignal<string | null> = input<string | null>(null);\n public readonly placeholder: InputSignal<string> = input<string>('');\n public readonly min: InputSignal<number | null> = input<number | null>(null);\n public readonly max: InputSignal<number | null> = input<number | null>(null);\n public readonly minFractionDigits: InputSignal<number> = input<number>(0);\n public readonly maxFractionDigits: InputSignal<number> = input<number>(2);\n\n public override writeValue(value: number | null): void {\n super.writeValue(value);\n this.displayValue.set(formatNumber(this.value(), this.minFractionDigits(), this.maxFractionDigits(), this.#locale));\n }\n\n protected getEmptyValue(): number | null {\n return null;\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 /**\n * Крестик сбрасывает поле не в пустое/null, а в 0 — отформатированный по\n * текущему fractionDigits (например `0,00`). Числовые поля всегда имеют\n * осмысленный ноль, поэтому «очистка» = обнуление, а не пустое значение.\n */\n protected override clearValue(): void {\n this.value.set(0);\n this.displayValue.set(formatNumber(0, this.minFractionDigits(), this.maxFractionDigits(), this.#locale));\n }\n\n protected onInput(event: Event): void {\n const target: HTMLInputElement = event.target as HTMLInputElement;\n const raw: string = target.value;\n const caret: number = target.selectionStart ?? raw.length;\n\n // Live-группировка разрядов прямо во время набора (1000000 → 1 000 000).\n const formatted: string = this.#groupDisplay(raw);\n const nextCaret: number = this.#restoreCaret(raw, caret, formatted);\n\n // Пишем value императивно ДО Angular CD: тогда повторная запись биндинга\n // `[value]` будет той же строкой и не сбросит каретку в конец. Затем\n // восстанавливаем позицию по числу значимых символов слева от курсора.\n target.value = formatted;\n target.setSelectionRange(nextCaret, nextCaret);\n this.displayValue.set(formatted);\n\n const parsed: number | null = parseNumber(formatted);\n if (parsed === null) {\n // Только реально пустой ввод → emit null (пользователь очистил поле).\n // Нечисловой ввод стрипается из отображения, но prev value держится до\n // blur — поэтому проверяем исходный `raw`, а не очищенный `formatted`.\n if (raw.trim() === '') {\n this.value.set(null);\n this.emitChange(null);\n }\n return;\n }\n this.value.set(parsed);\n this.emitChange(parsed);\n }\n\n protected onBlur(): void {\n const parsed: number | null = parseNumber(this.displayValue());\n if (parsed === null) {\n this.value.set(null);\n this.displayValue.set('');\n this.emitChange(null);\n this.markTouched();\n return;\n }\n const clamped: number = clamp(parsed, this.min(), this.max());\n const formatted: string = formatNumber(clamped, this.minFractionDigits(), this.maxFractionDigits(), this.#locale);\n // `formatted` содержит пробелы-разделители и запятую — обратный парс\n // через parseNumber (а не parseFloat) даёт округлённое числовое значение.\n const rounded: number = parseNumber(formatted) ?? clamped;\n this.value.set(rounded);\n this.displayValue.set(formatted);\n this.emitChange(rounded);\n this.markTouched();\n }\n\n /**\n * Live-форматирование строки во время набора: целая часть группируется по\n * разрядам (`#groupSep`), дробная остаётся как набрана (хвостовая запятая и\n * нули сохраняются, чтобы их можно было дописать). Десятичный разделитель\n * всегда допускается — округление по `maxFractionDigits` происходит на blur\n * (поэтому в целочисленном поле «1000,5» парсится и округлится, а не склеится\n * в «10005»). Группировка — линейным проходом, а не `Number()`, чтобы не\n * терять точность на суммах длиннее 2^53.\n */\n #groupDisplay(raw: string): string {\n const negative: boolean = raw.trimStart().startsWith('-');\n\n let sep: string = '';\n let fracDigits: string = '';\n let intDigits: string;\n\n const sepIndex: number = raw.search(/[.,]/);\n if (sepIndex >= 0) {\n sep = raw.charAt(sepIndex);\n intDigits = raw.slice(0, sepIndex).replace(/\\D/g, '');\n fracDigits = raw.slice(sepIndex + 1).replace(/\\D/g, '');\n } else {\n intDigits = raw.replace(/\\D/g, '');\n }\n\n // Ведущие нули убираем, но сохраняем один «0» перед десятичным разделителем.\n intDigits = intDigits.replace(/^0+(?=\\d)/, '');\n\n let intPart: string;\n if (intDigits === '') {\n intPart = sep === '' ? '' : '0';\n } else {\n intPart = this.#groupInteger(intDigits);\n }\n\n let out: string = negative ? `-${intPart}` : intPart;\n if (sep !== '') {\n out += sep + fracDigits;\n }\n return out;\n }\n\n /**\n * Группирует строку цифр по три справа налево, вставляя `#groupSep`. Без\n * регэкспа намеренно — `(\\d{3})+`-lookahead флагуется как ReDoS-уязвимый, а\n * линейный проход и быстрее, и безопасен.\n */\n #groupInteger(digits: string): string {\n const length: number = digits.length;\n let out: string = '';\n for (let i: number = 0; i < length; i++) {\n if (i > 0 && (length - i) % 3 === 0) {\n out += this.#groupSep;\n }\n out += digits.charAt(i);\n }\n return out;\n }\n\n /**\n * Пересчитывает позицию каретки после вставки разделителей разрядов: считает\n * значимые символы (цифры и десятичный разделитель — не group-separator)\n * слева от старой каретки и находит ту же точку в новой строке. Иначе курсор\n * прыгал бы в конец при каждом вставленном пробеле.\n */\n #restoreCaret(raw: string, caret: number, formatted: string): number {\n const isAnchor: (ch: string) => boolean = (ch: string): boolean => /[\\d.,]/.test(ch);\n\n let need: number = 0;\n for (let i: number = 0; i < caret && i < raw.length; i++) {\n if (isAnchor(raw.charAt(i))) {\n need++;\n }\n }\n if (need === 0) {\n return formatted.startsWith('-') ? 1 : 0;\n }\n\n let seen: number = 0;\n let pos: number = 0;\n while (pos < formatted.length) {\n if (isAnchor(formatted.charAt(pos))) {\n seen++;\n if (seen === need) {\n pos++;\n break;\n }\n }\n pos++;\n }\n return pos;\n }\n}\n","<ng-container rtBlock=\"rt-input-number\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" qa-dataid=\"input-number-readonly\" [rtMod]=\"{ empty: !displayText() }\">\n @if (prefix() && displayText()) {\n <span rtElem=\"prefix\" qa-dataid=\"input-number-prefix\">{{ prefix() }}</span>\n }\n {{ displayText() || '—' }}\n </span>\n } @else {\n @if (iconLeft(); as left) {\n <rt-icon rtElem=\"icon-left\" size=\"sm\" color=\"muted\" [name]=\"left\" />\n }\n @if (prefix(); as pfx) {\n <span rtElem=\"prefix\" qa-dataid=\"input-number-prefix\" aria-hidden=\"true\">{{ pfx }}</span>\n }\n <input\n #fieldEl\n rtElem=\"field\"\n qa-dataid=\"input-number-control\"\n type=\"text\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [value]=\"displayValue()\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\" />\n @if (showClearButton()) {\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"input-number-clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"'rtKit.uiClear' | transloco\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n }\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n} from '@angular/core';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/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 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> = translateSignal('rtKit.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","import { ChangeDetectionStrategy, Component, inject, ViewEncapsulation } from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtButtonDirective } from '../button/rt-button.directive';\nimport { RtDialogRef } from '../dialog/rt-dialog-ref';\nimport { RtDialogComponent } from '../dialog/rt-dialog.component';\nimport { RT_DIALOG_DATA } from '../dialog/rt-dialog.tokens';\nimport { IRtMenu } from './rt-menu.model';\n\nconst BEM_BLOCK: string = 'rt-menu-confirm-dialog';\n\n/**\n * Confirm-модалка деструктивного пункта `rt-menu-item`. Открывается через\n * `RtDialogService` (центрированный overlay поверх меню), возвращает `true`\n * при подтверждении и `false`/`undefined` при отмене.\n *\n * Модалка (а не popover-под-пунктом) нужна потому, что панель `rt-menu` сама\n * живёт в CDK Overlay: вложенный popover-overlay конфликтовал бы с её\n * backdrop/закрытием. Внутренний компонент — не экспортируется из `components`, это\n * деталь реализации confirm-флоу пункта меню.\n */\n@Component({\n selector: 'rt-menu-confirm-dialog',\n templateUrl: './rt-menu-confirm-dialog.component.html',\n styleUrl: './rt-menu-confirm-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtButtonDirective,\n RtDialogComponent,\n BlockDirective,\n ElemDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtMenuConfirmDialogComponent {\n protected readonly data: IRtMenu.ConfirmData = inject(RT_DIALOG_DATA) as IRtMenu.ConfirmData;\n\n readonly #dialogRef: RtDialogRef<boolean> = inject(RtDialogRef);\n\n protected onConfirm(): void {\n this.#dialogRef.close(true);\n }\n\n protected onCancel(): void {\n this.#dialogRef.close(false);\n }\n}\n","<rt-dialog width=\"360px\" [ariaLabel]=\"'rtKit.uiConfirmAction' | transloco\">\n <div rtBlock=\"rt-menu-confirm-dialog\">\n <div rtElem=\"text\">\n @if (data.title; as title) {\n <h2 rtElem=\"title\" qa-dataid=\"menu-confirm-title\">{{ title }}</h2>\n }\n <p rtElem=\"message\" qa-dataid=\"menu-confirm-message\">{{ data.message }}</p>\n </div>\n <div rtElem=\"footer\">\n <!-- eslint-disable-next-line @angular-eslint/template/elements-content -->\n <button\n rtButton\n rtElem=\"cancel\"\n qa-dataid=\"menu-confirm-cancel\"\n type=\"button\"\n appearance=\"text\"\n theme=\"secondary\"\n [label]=\"data.cancelLabel\"\n (click)=\"onCancel()\"></button>\n <!-- eslint-disable-next-line @angular-eslint/template/elements-content -->\n <button\n rtButton\n rtElem=\"confirm\"\n qa-dataid=\"menu-confirm-accept\"\n type=\"button\"\n appearance=\"filled\"\n [label]=\"data.confirmLabel\"\n [theme]=\"data.tone\"\n (click)=\"onConfirm()\"></button>\n </div>\n </div>\n</rt-dialog>\n","/**\n * Контракты `rt-menu` — dropdown-меню действий (триггер «…» + плавающая панель\n * с пунктами `rt-menu-item`). Один корневой неймспейс с префиксом `I`.\n */\nexport namespace IRtMenu {\n /** Горизонтальное выравнивание панели относительно триггера. */\n export type Align = 'start' | 'end';\n\n /** Тон подтверждающей кнопки в confirm-модалке пункта меню. */\n export type ConfirmTone = 'danger' | 'warning' | 'primary';\n\n /**\n * Данные для confirm-модалки, которую `rt-menu-item` открывает перед\n * деструктивным действием. Прокидываются в `rt-menu-confirm-dialog` через\n * `RT_DIALOG_DATA`; модалка возвращает `true` при подтверждении.\n */\n export interface ConfirmData {\n readonly message: string;\n readonly title: string | null;\n readonly confirmLabel: string;\n readonly cancelLabel: string;\n readonly tone: ConfirmTone;\n }\n}\n\n/**\n * Имя DOM-события, которое `rt-menu-item` всплывающе диспатчит при выборе пункта.\n * `rt-menu` слушает его на панели и закрывается. DOM-событие (а не DI/output)\n * нужно потому, что пункты проецируются в overlay-панель — всплытие через DOM\n * переживает границы content-projection и overlay-контейнера.\n */\nexport const RT_MENU_SELECT_EVENT: string = 'rtMenuSelect';\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { mergeMap, Observable, Subject } from 'rxjs';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtDialogService } from '../dialog/rt-dialog.service';\nimport { RtIconComponent } from '../icon/rt-icon.component';\nimport { IRtIcon } from '../icon/rt-icon.model';\nimport { RtTooltipDirective } from '../tooltip/rt-tooltip.directive';\nimport { RtMenuConfirmDialogComponent } from './rt-menu-confirm-dialog.component';\nimport { RT_MENU_SELECT_EVENT, IRtMenu } from './rt-menu.model';\n\nconst BEM_BLOCK: string = 'rt-menu-item';\n\n/**\n * Пункт меню `rt-menu`: иконка (опц.) + лейбл. Кликабелен и активируется с\n * клавиатуры (Enter/Space). Выбор пункта эмитит `(selected)` для потребителя\n * и всплывающе диспатчит DOM-событие `rtMenuSelect`, по которому `rt-menu`\n * закрывается. `disabled` блокирует и `(selected)`, и закрытие.\n *\n * Tooltip — через host-директиву `RtTooltipDirective` (`tooltip` маппится в\n * `rtTooltip`): полезно показать причину недоступности на `disabled`-пункте.\n *\n * Деструктивный пункт может требовать подтверждения: задайте `confirmMessage`\n * (опц. `confirmTitle` / `confirmLabel` / `confirmTone`) — тогда по выбору\n * сперва открывается центрированная confirm-модалка, и `(selected)` эмитится\n * только после подтверждения. Модалка (а не popover) нужна потому, что панель\n * `rt-menu` сама в CDK Overlay; меню остаётся открытым под backdrop'ом, пока\n * пользователь решает.\n *\n * `ViewEncapsulation.None`; стили префиксованы `.rt-menu-item`. Host несёт\n * BEM-класс блока (template-`<ng-container rtBlock>` даёт контекст для `rtElem`,\n * но класс на comment-node не вешает — см. host-class паттерн rt-icon-button).\n */\n@Component({\n selector: 'rt-menu-item',\n templateUrl: './rt-menu-item.component.html',\n styleUrl: './rt-menu-item.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n ],\n hostDirectives: [\n {\n directive: RtTooltipDirective,\n inputs: ['rtTooltip: tooltip'],\n },\n ],\n host: {\n class: BEM_BLOCK,\n role: 'menuitem',\n '[class.rt-menu-item--danger]': 'danger()',\n '[class.rt-menu-item--disabled]': 'disabled()',\n '[attr.aria-disabled]': \"disabled() ? 'true' : null\",\n '[attr.tabindex]': 'disabled() ? null : 0',\n '(click)': 'onActivate($event)',\n '(keydown.enter)': 'onKey($event)',\n '(keydown.space)': 'onKey($event)',\n },\n})\nexport class RtMenuItemComponent {\n readonly #elementRef: ElementRef<HTMLElement> = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly #dialogService: RtDialogService = inject(RtDialogService);\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n readonly #confirmRequestSource: Subject<IRtMenu.ConfirmData> = new Subject<IRtMenu.ConfirmData>();\n\n readonly #t_uiConfirm: Signal<string> = translateSignal('rtKit.uiConfirm');\n readonly #t_uiCancel: Signal<string> = translateSignal('rtKit.uiCancel');\n\n /** Иконка слева от лейбла. `null` — без иконки. */\n public readonly icon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Текст пункта. */\n public readonly label: InputSignal<string> = input<string>('');\n\n /** Деструктивный пункт (например «Удалить») — красный текст/иконка. */\n public readonly danger: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Недоступный пункт — приглушён, не эмитит `(selected)` и не закрывает меню. */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /**\n * Текст confirm-модалки. Непустое значение включает подтверждение: по выбору\n * пункта открывается модалка, и `(selected)` эмитится только после согласия.\n */\n public readonly confirmMessage: InputSignal<string> = input<string>('');\n\n /** Заголовок confirm-модалки (опц.). */\n public readonly confirmTitle: InputSignal<string | null> = input<string | null>(null);\n\n /** Лейбл подтверждающей кнопки в модалке. */\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly confirmLabel: InputSignal<string> = input<string>('');\n\n /** Лейбл кнопки отмены в модалке. */\n public readonly confirmCancelLabel: InputSignal<string> = input<string>('');\n\n /** Тон подтверждающей кнопки в модалке. */\n public readonly confirmTone: InputSignal<IRtMenu.ConfirmTone> = input<IRtMenu.ConfirmTone>('danger');\n\n /** Пункт выбран (клик/Enter/Space и не `disabled`; после подтверждения, если задано). */\n public readonly selected: OutputEmitterRef<void> = output<void>();\n\n constructor() {\n // Подписка на результат confirm-модалки объявлена один раз: #openConfirm\n // эмитит данные модалки, mergeMap открывает её и ждёт afterClosed()\n // (одноразовый стрим — комплитится при закрытии модалки).\n this.#confirmRequestSource\n .pipe(\n mergeMap((data: IRtMenu.ConfirmData): Observable<boolean | undefined> =>\n this.#dialogService\n .open<RtMenuConfirmDialogComponent, IRtMenu.ConfirmData, boolean>(RtMenuConfirmDialogComponent, { data })\n .afterClosed()\n ),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe((confirmed: boolean | undefined = false): void => {\n if (confirmed === true) {\n this.#commitSelection();\n }\n });\n }\n\n protected onActivate(event: Event): void {\n if (this.disabled()) {\n // Гасим, чтобы клик по disabled-пункту не «протёк» наружу.\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n const message: string = this.confirmMessage().trim();\n if (message !== '') {\n // Не закрываем меню сразу: оно остаётся открытым под backdrop'ом\n // модалки, чтобы пункт пережил решение пользователя (отмена → меню\n // снова видно). Подтверждение коммитит выбор.\n this.#openConfirm(message);\n return;\n }\n this.#commitSelection();\n }\n\n protected onKey(event: Event): void {\n // Space иначе проскроллит страницу — гасим дефолт перед активацией.\n event.preventDefault();\n this.onActivate(event);\n }\n\n #openConfirm(message: string): void {\n const data: IRtMenu.ConfirmData = {\n message,\n title: this.confirmTitle(),\n confirmLabel: this.confirmLabel() || this.#t_uiConfirm(),\n cancelLabel: this.confirmCancelLabel() || this.#t_uiCancel(),\n tone: this.confirmTone(),\n };\n // Открытие модалки и подписка на результат — в конструкторном стриме\n // (см. #confirmRequestSource); здесь только эмит данных модалки.\n this.#confirmRequestSource.next(data);\n }\n\n #commitSelection(): void {\n this.selected.emit();\n // Закрыть родительское меню: событие всплывает к панели rt-menu в overlay.\n this.#elementRef.nativeElement.dispatchEvent(new CustomEvent(RT_MENU_SELECT_EVENT, { bubbles: true }));\n }\n}\n","<ng-container rtBlock=\"rt-menu-item\">\n @if (icon(); as iconName) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"iconName\" />\n }\n\n <span rtElem=\"label\" qa-dataid=\"menu-item-label\">{{ label() }}</span>\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { ConnectedPosition, OverlayModule } from '@angular/cdk/overlay';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { IRtIcon } from '../icon/rt-icon.model';\nimport { IRtMenu } from './rt-menu.model';\n\nconst BEM_BLOCK: string = 'rt-menu';\n\nconst POSITION_BELOW_END: ConnectedPosition = {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 4,\n};\nconst POSITION_ABOVE_END: ConnectedPosition = {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -4,\n};\nconst POSITION_BELOW_START: ConnectedPosition = {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 4,\n};\nconst POSITION_ABOVE_START: ConnectedPosition = {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -4,\n};\n\n/**\n * Dropdown-меню действий: icon-only триггер «…» + плавающая панель с пунктами\n * `rt-menu-item`, спроецированными через `<ng-content>`. Типовое применение —\n * per-row действия в конце строки `rt-table` (см. `[showRowActions]`).\n *\n * Движок — CDK `cdkConnectedOverlay` с прозрачным backdrop: авто-flip у края\n * viewport (4 fallback-позиции), backdrop-click и `(detach)` закрывают, Escape\n * закрывает через `(overlayKeydown)`. Панель не режется `overflow: hidden`\n * предками (таблицы, карточки), т.к. рендерится в overlay-контейнере.\n *\n * Выбор пункта закрывает меню: `rt-menu-item` всплывающе диспатчит DOM-событие\n * `rtMenuSelect`, которое панель ловит, — это переживает content-projection.\n *\n * @example\n * ```html\n * <rt-menu ariaLabel=\"Действия\">\n * <rt-menu-item icon=\"ico-edit\" label=\"Редактировать\" (selected)=\"edit()\" />\n * <rt-menu-item icon=\"ico-trash\" label=\"Удалить\" danger (selected)=\"remove()\" />\n * </rt-menu>\n * ```\n */\n@Component({\n selector: 'rt-menu',\n templateUrl: './rt-menu.component.html',\n styleUrl: './rt-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // @angular/cdk\n OverlayModule,\n\n // standalone components / directives\n RtIconButtonComponent,\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-menu--open]': 'isOpen()',\n },\n})\nexport class RtMenuComponent {\n readonly #t_uiActions: Signal<string> = translateSignal('rtKit.uiActions');\n\n protected readonly isOpen: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly ariaText: Signal<string> = computed((): string => this.ariaLabel() || this.#t_uiActions());\n\n /** Fallback-цепочка позиций панели: первой идёт сторона по `align`. */\n protected readonly overlayPositions: Signal<ConnectedPosition[]> = computed((): ConnectedPosition[] =>\n this.align() === 'end'\n ? [POSITION_BELOW_END, POSITION_ABOVE_END, POSITION_BELOW_START, POSITION_ABOVE_START]\n : [POSITION_BELOW_START, POSITION_ABOVE_START, POSITION_BELOW_END, POSITION_ABOVE_END]\n );\n\n /** Иконка триггера. Default `ellipsis-h` («…» — три точки в конце строки). */\n public readonly icon: InputSignal<IRtIcon.Name> = input<IRtIcon.Name>('ellipsis-h');\n\n /** ARIA-метка триггера (icon-only кнопка) + текст tooltip'а. */\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly ariaLabel: InputSignal<string> = input<string>('');\n\n /** Сторона раскрытия панели относительно триггера. */\n public readonly align: InputSignal<IRtMenu.Align> = input<IRtMenu.Align>('end');\n\n /** Триггер отключён — меню не открыть. */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n protected toggle(event: MouseEvent): void {\n // Клик по триггеру не должен активировать строку таблицы под ним.\n event.stopPropagation();\n this.isOpen.update((open: boolean): boolean => !open);\n }\n\n protected close(): void {\n this.isOpen.set(false);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n this.close();\n }\n }\n}\n","<rt-icon-button\n cdkOverlayOrigin\n qa-dataid=\"menu-trigger\"\n #trigger=\"cdkOverlayOrigin\"\n variant=\"ghost\"\n [icon]=\"icon()\"\n [ariaLabel]=\"ariaText()\"\n [tooltip]=\"ariaText()\"\n [disabled]=\"disabled()\"\n (clicked)=\"toggle($event)\" />\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n (overlayKeydown)=\"onKeydown($event)\">\n <ng-container rtBlock=\"rt-menu\">\n <div rtElem=\"panel\" qa-dataid=\"menu-panel\" role=\"menu\" (rtMenuSelect)=\"close()\">\n <ng-content />\n </div>\n </ng-container>\n</ng-template>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { RtIconComponent } from '../icon/rt-icon.component';\nimport { IRtIcon } from '../icon/rt-icon.model';\nimport { IRtTag } from '../tag/rt-tag.model';\n\nconst BEM_BLOCK: string = 'rt-message';\n\n/**\n * Alert / banner для уведомлений с 6 severities и default icon mapping.\n *\n * Использует `role=\"alert\"` на корневом `<aside>` — screen reader озвучивает\n * содержимое сразу после маунта (полезно для inline-фидбэка форм типа\n * «Сохранено успешно» / «{{ assignError() }}»).\n *\n * Severity-палитра идентична `rt-tag` (`info` / `success` / `warning` / `danger` /\n * `secondary` / `neutral`); тип `IRtTag.Severity` переиспользуется напрямую, чтобы\n * не дублировать union. Цвета — через семантические `--rt-color-state-*` токены,\n * layout — через primitive `--rt-space-*` / `--rt-radius-*`. BEM-разметка через\n * директивы `rtBlock` / `rtElem` / `rtMod` из `@rt-tools/core`.\n *\n * Default icon по severity:\n * - `info` → `ico-info`\n * - `success` → `check`\n * - `warning` → `ico-warning`\n * - `danger` → `ico-error`\n * - `secondary` / `neutral` → `null` (icon не рендерится)\n *\n * Любой default можно переопределить через `[icon]=\"...\"`, либо явно отключить\n * передачей `[icon]=\"null\"` (override срабатывает только для truthy значений).\n */\n@Component({\n selector: 'rt-message',\n templateUrl: './rt-message.component.html',\n styleUrl: './rt-message.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtMessageComponent {\n /** Default icon mapping для каждой severity. `null` — иконка не рендерится. */\n readonly #severityIconDefaults: Readonly<Record<IRtTag.Severity, IRtIcon.Name | null>> = {\n info: 'ico-info',\n success: 'check',\n warning: 'ico-warning',\n danger: 'ico-error',\n secondary: null,\n neutral: null,\n };\n\n /**\n * Финальное имя иконки: явный override через `[icon]` имеет приоритет; иначе —\n * default по severity. Чтобы скрыть иконку у severity, у которой есть default,\n * передайте пустую строку как `[icon]` — она будет falsy и не «победит» default.\n * Полное отключение делается через severity `secondary` / `neutral`.\n */\n protected readonly effectiveIcon: Signal<IRtIcon.Name | null> = computed((): IRtIcon.Name | null => {\n if (this.hideIcon()) {\n return null;\n }\n const override: IRtIcon.Name | null = this.icon();\n if (override) {\n return override;\n }\n return this.#severityIconDefaults[this.severity()];\n });\n\n /** Семантическая палитра. По умолчанию `info` (синий info-banner). */\n public readonly severity: InputSignal<IRtTag.Severity> = input<IRtTag.Severity>('info');\n\n /** Override default-icon. `null` — использовать default по severity. */\n public readonly icon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Полностью скрыть иконку (даже если у severity есть default) — только текст. */\n public readonly hideIcon: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Рендерит close-button справа (rt-icon-button ghost sm). */\n public readonly closable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Эмиттится при клике на close-button (только если `closable=true`). */\n public readonly closed: OutputEmitterRef<void> = output<void>();\n\n protected onClose(): void {\n this.closed.emit();\n }\n}\n","<aside rtBlock=\"rt-message\" qa-dataid=\"message-alert\" role=\"alert\" [attr.data-severity]=\"severity()\" [rtMod]=\"{ severity: severity() }\">\n @if (effectiveIcon(); as iconName) {\n <rt-icon rtElem=\"icon\" [name]=\"iconName\" />\n }\n <div rtElem=\"body\" qa-dataid=\"message-body\">\n <ng-content />\n </div>\n @if (closable()) {\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"message-close\"\n icon=\"ico-close\"\n variant=\"ghost\"\n size=\"sm\"\n shape=\"circle\"\n [ariaLabel]=\"'rtKit.uiClose' | transloco\"\n (clicked)=\"onClose()\" />\n }\n</aside>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-money-list';\n\n/**\n * Финансовый блок асайда: суммы и комиссии на subtle-подложке. Контейнер задаёт\n * фон, скругление и компактный gap между `rt-money-row`. Отдельный примитив (не\n * `rt-detail-list`), потому что у денег своя раскладка — значение прижато вправо,\n * суммы не переносятся, есть итоговая строка.\n *\n * Контент — только `rt-money-row` через проекцию.\n */\n@Component({\n selector: 'rt-money-list',\n templateUrl: './rt-money-list.component.html',\n styleUrl: './rt-money-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n BlockDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtMoneyListComponent {}\n","<ng-container rtBlock=\"rt-money-list\">\n <ng-content />\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n InputSignal,\n InputSignalWithTransform,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtSkeletonComponent } from '../skeleton/rt-skeleton.component';\n\nconst BEM_BLOCK: string = 'rt-money-row';\n\n/**\n * Строка финансового блока: лейбл слева, сумма справа (без переноса). Модификатор\n * `[total]` выделяет итоговую строку верхней границей и полужирным начертанием.\n *\n * Сумма проецируется через `<ng-content>`. При `[loading]=\"true\"` сумма замещается\n * скелетоном фиксированной ширины — inline-раскладка и прижатие вправо сохраняются.\n */\n@Component({\n selector: 'rt-money-row',\n templateUrl: './rt-money-row.component.html',\n styleUrl: './rt-money-row.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtSkeletonComponent,\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-money-row--total]': 'total()',\n },\n})\nexport class RtMoneyRowComponent {\n public readonly label: InputSignal<string> = input<string>('');\n\n public readonly total: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n}\n","<ng-container rtBlock=\"rt-money-row\">\n <span rtElem=\"label\" qa-dataid=\"money-row-label\">{{ label() }}</span>\n <span rtElem=\"value\" qa-dataid=\"money-row-value\">\n @if (loading()) {\n <rt-skeleton qa-dataid=\"money-row-skeleton\" width=\"72px\" height=\"14px\" />\n } @else {\n <ng-content />\n }\n </span>\n</ng-container>\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { IRtSelect } from '../select/rt-select.model';\n\n/** Лейбл опции по её value для отображения чипа выбранного значения. */\n@Pipe({ name: 'rtMultiselectLabel' })\nexport class RtMultiselectLabelPipe implements PipeTransform {\n public transform<TValue>(value: TValue, options: ReadonlyArray<IRtSelect.Option<TValue>>): string {\n const match: IRtSelect.Option<TValue> | undefined = options.find((o: IRtSelect.Option<TValue>): boolean => o.value === value);\n return match?.label ?? String(value);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n InputSignal,\n Signal,\n signal,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { translateSignal, TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtFormControlBase } from '../form-control/rt-form-control.base';\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { RtIconComponent } from '../icon/rt-icon.component';\nimport { RtPopoverDirective } from '../popover/rt-popover.directive';\nimport { IRtSelect } from '../select/rt-select.model';\nimport { RtTagComponent } from '../tag/rt-tag.component';\nimport { RtMultiselectLabelPipe } from './rt-multiselect-label.pipe';\n\nconst BEM_BLOCK: string = 'rt-multiselect';\n\n/** Клавиши, открывающие закрытый dropdown с фокуса на trigger'е. */\nconst OPEN_KEYS: ReadonlySet<string> = new Set<string>(['ArrowDown', 'ArrowUp', 'Enter', ' ']);\n\nlet panelIdSeed: number = 0;\n\nfunction nextPanelId(): number {\n panelIdSeed += 1;\n return panelIdSeed;\n}\n\n/**\n * Multi-select с chip-rendering выбранных значений в trigger.\n *\n * Panel рендерится через CDK Overlay (`[rtPopover]`) — не обрезается overflow,\n * авто-flip. Панель НЕ закрывается после выбора (multi vs single). CVA через\n * общий `RtFormControlBase`. Reuses `IRtSelect.Option<TValue>` (type-import).\n * Чипы закрываются поштучно; крестик (`clearable`) слева от шеврона очищает весь\n * выбор.\n *\n * Keyboard-nav (activedescendant): фокус на trigger'е, ArrowUp/Down — highlight,\n * Enter — toggle опции (panel остаётся открытой), Escape — закрыть. Home/End —\n * deferred.\n */\n@Component({\n selector: 'rt-multiselect',\n templateUrl: './rt-multiselect.component.html',\n styleUrl: './rt-multiselect.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n RtIconComponent,\n RtPopoverDirective,\n RtTagComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n\n // pipes\n RtMultiselectLabelPipe,\n TranslocoPipe,\n ],\n providers: [\n // Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtMultiselectComponent) },\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-multiselect--open]': 'isOpen()',\n '[class.rt-multiselect--disabled]': 'isDisabled()',\n '[class.rt-multiselect--readonly]': 'isReadonly()',\n '[class.rt-multiselect--invalid]': 'isInvalid()',\n '[class.rt-multiselect--borderless]': '!bordered()',\n '[class.rt-multiselect--size--sm]': \"size() === 'sm'\",\n '[class.rt-multiselect--size--lg]': \"size() === 'lg'\",\n },\n})\nexport class RtMultiselectComponent<TValue> extends RtFormControlBase<ReadonlyArray<TValue>> {\n readonly #t_uiSelectValues: Signal<string> = translateSignal('rtKit.uiSelectValues');\n\n protected readonly panelId: string = `rt-multiselect-panel-${nextPanelId()}`;\n\n protected readonly placeholderText: Signal<string> = computed((): string => this.placeholder() || this.#t_uiSelectValues());\n\n protected readonly popover: Signal<RtPopoverDirective> = viewChild.required(RtPopoverDirective);\n\n protected readonly triggerEl: Signal<ElementRef<HTMLButtonElement> | undefined> = viewChild<ElementRef<HTMLButtonElement>>('triggerEl');\n\n protected readonly activeIndex: WritableSignal<number> = signal<number>(-1);\n\n protected readonly isOpen: Signal<boolean> = computed((): boolean => this.popover().isOpen());\n\n protected readonly hasValue: Signal<boolean> = computed((): boolean => this.value().length > 0);\n\n protected readonly visibleChips: Signal<ReadonlyArray<TValue>> = computed((): ReadonlyArray<TValue> =>\n this.value().slice(0, this.maxChips())\n );\n\n protected readonly extraChipsCount: Signal<number> = computed((): number => Math.max(0, this.value().length - this.maxChips()));\n\n public readonly displayText: Signal<string> = computed((): string =>\n this.value()\n .map((v: TValue): string => this.labelOf(v))\n .join(', ')\n );\n\n public readonly options: InputSignal<ReadonlyArray<IRtSelect.Option<TValue>>> = input<ReadonlyArray<IRtSelect.Option<TValue>>>([]);\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly placeholder: InputSignal<string> = input<string>('');\n public readonly maxChips: InputSignal<number> = input<number>(3);\n\n public override setDisabledState(disabled: boolean): void {\n super.setDisabledState(disabled);\n if (disabled) {\n this.popover().close();\n }\n }\n\n protected getEmptyValue(): ReadonlyArray<TValue> {\n return [];\n }\n\n protected focusAfterClear(): void {\n this.triggerEl()?.nativeElement.focus();\n }\n\n protected labelOf(value: TValue): string {\n const match: IRtSelect.Option<TValue> | undefined = this.options().find(\n (o: IRtSelect.Option<TValue>): boolean => o.value === value\n );\n return match?.label ?? String(value);\n }\n\n protected isSelected(value: TValue): boolean {\n return this.value().includes(value);\n }\n\n protected onClosed(): void {\n this.activeIndex.set(-1);\n this.markTouched();\n }\n\n protected toggleOption(opt: IRtSelect.Option<TValue>): void {\n if (opt.disabled || this.isDisabled()) {\n return;\n }\n const current: ReadonlyArray<TValue> = this.value();\n const next: ReadonlyArray<TValue> = this.isSelected(opt.value)\n ? current.filter((v: TValue): boolean => v !== opt.value)\n : [...current, opt.value];\n this.value.set(next);\n this.emitChange([...next]);\n }\n\n protected removeChip(value: TValue, event: MouseEvent): void {\n event.stopPropagation();\n if (this.isDisabled()) {\n return;\n }\n const next: ReadonlyArray<TValue> = this.value().filter((v: TValue): boolean => v !== value);\n this.value.set(next);\n this.emitChange([...next]);\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) {\n return;\n }\n if (!this.isOpen()) {\n if (OPEN_KEYS.has(event.key)) {\n event.preventDefault();\n this.popover().open();\n this.#moveActive(1);\n }\n return;\n }\n this.#handleOpenKeydown(event);\n }\n\n #handleOpenKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.#moveActive(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.#moveActive(-1);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.#toggleActive();\n break;\n case 'Escape':\n event.preventDefault();\n this.popover().close();\n break;\n default:\n break;\n }\n }\n\n #moveActive(delta: number): void {\n const opts: ReadonlyArray<IRtSelect.Option<TValue>> = this.options();\n if (opts.length === 0) {\n this.activeIndex.set(-1);\n return;\n }\n let index: number = this.activeIndex();\n for (let step: number = 0; step < opts.length; step += 1) {\n index = (index + delta + opts.length) % opts.length;\n if (!opts[index].disabled) {\n this.activeIndex.set(index);\n return;\n }\n }\n }\n\n #toggleActive(): void {\n const opts: ReadonlyArray<IRtSelect.Option<TValue>> = this.options();\n const index: number = this.activeIndex();\n if (index >= 0 && index < opts.length) {\n this.toggleOption(opts[index]);\n }\n }\n}\n","<ng-container rtBlock=\"rt-multiselect\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" qa-dataid=\"multiselect-readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '—' }}</span>\n }\n <button\n #triggerEl\n rtElem=\"trigger\"\n qa-dataid=\"multiselect-trigger\"\n type=\"button\"\n rtPopoverWidth=\"trigger\"\n [rtPopover]=\"panelTpl\"\n [rtPopoverDisabled]=\"isDisabled()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-activedescendant]=\"isOpen() && activeIndex() >= 0 ? panelId + '-opt-' + activeIndex() : null\"\n [disabled]=\"isDisabled()\"\n (keydown)=\"onTriggerKeydown($event)\"\n (rtPopoverClosed)=\"onClosed()\">\n @if (value().length === 0) {\n <span rtElem=\"placeholder\" qa-dataid=\"multiselect-placeholder\">{{ placeholderText() }}</span>\n } @else {\n <span rtElem=\"chips\">\n @for (val of visibleChips(); track val) {\n <span rtElem=\"chip\" qa-dataid=\"multiselect-chip\" [attr.data-value]=\"val\">\n <rt-tag\n severity=\"info\"\n [value]=\"val | rtMultiselectLabel: options()\"\n [closable]=\"true\"\n (closed)=\"removeChip(val, $event)\" />\n </span>\n }\n @if (extraChipsCount() > 0) {\n <span rtElem=\"chip-more\" qa-dataid=\"multiselect-chip-more\">+{{ extraChipsCount() }}</span>\n }\n </span>\n }\n @if (showClearButton()) {\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"multiselect-clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"'rtKit.uiClear' | transloco\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n <rt-icon rtElem=\"chevron\" name=\"chevron-down\" size=\"sm\" color=\"muted\" />\n </button>\n\n <ng-template #panelTpl>\n <div rtElem=\"panel\" qa-dataid=\"multiselect-panel\" role=\"listbox\" [attr.aria-label]=\"ariaLabel()\">\n <!--\n Опции выбираются мышью через (click); keyboard-nav — на trigger'е\n (activedescendant), опции не focusable индивидуально.\n -->\n <!-- eslint-disable @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <ul rtElem=\"list\">\n @for (opt of options(); track opt.value; let i = $index) {\n <li\n rtElem=\"option\"\n qa-dataid=\"multiselect-option\"\n role=\"option\"\n [id]=\"panelId + '-opt-' + i\"\n [attr.data-value]=\"opt.value\"\n [rtMod]=\"{\n selected: value().includes(opt.value),\n active: i === activeIndex(),\n disabled: !!opt.disabled,\n }\"\n [attr.aria-selected]=\"value().includes(opt.value)\"\n [attr.aria-disabled]=\"!!opt.disabled\"\n (click)=\"toggleOption(opt)\">\n <input\n rtElem=\"checkbox\"\n qa-dataid=\"multiselect-option-checkbox\"\n type=\"checkbox\"\n tabindex=\"-1\"\n [checked]=\"value().includes(opt.value)\" />\n <span rtElem=\"option-label\" qa-dataid=\"multiselect-option-label\">{{ opt.label }}</span>\n </li>\n } @empty {\n <li rtElem=\"empty\" qa-dataid=\"multiselect-empty\">{{ 'rtKit.uiNoOptions' | transloco }}</li>\n }\n </ul>\n </div>\n </ng-template>\n</ng-container>\n","import { ChangeDetectionStrategy, Component, computed, input, InputSignal, output, OutputEmitterRef, Signal } from '@angular/core';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { IRtNightGrid } from './rt-night-grid.model';\n\nconst BEM_BLOCK: string = 'rt-night-grid';\n\n/**\n * Плотная сетка суток: ряд мелких ячеек, каждая — одна ночь. Применяется там, где\n * нужно окинуть взглядом занятость на недели вперёд, а не листать календарь.\n *\n * Сетка скроллится внутри себя по горизонтали — документ боком не едет.\n */\n@Component({\n selector: 'rt-night-grid',\n templateUrl: './rt-night-grid.component.html',\n styleUrl: './rt-night-grid.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtNightGridComponent {\n readonly #t_uiNightGridAria: Signal<string> = translateSignal('rtKit.uiNightGridAria');\n\n protected readonly ariaText: Signal<string> = computed((): string => this.ariaLabel() || this.#t_uiNightGridAria());\n\n public readonly cells: InputSignal<ReadonlyArray<IRtNightGrid.Cell>> = input.required<ReadonlyArray<IRtNightGrid.Cell>>();\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly ariaLabel: InputSignal<string> = input<string>('');\n\n public readonly cellClick: OutputEmitterRef<IRtNightGrid.Cell> = output<IRtNightGrid.Cell>();\n\n protected onCellClick(cell: IRtNightGrid.Cell): void {\n this.cellClick.emit(cell);\n }\n}\n","<div rtBlock=\"rt-night-grid\" qa-dataid=\"night-grid\" role=\"list\" [attr.aria-label]=\"ariaText()\">\n @for (cell of cells(); track cell.id) {\n <button\n rtElem=\"cell\"\n qa-dataid=\"night-grid-cell\"\n type=\"button\"\n role=\"listitem\"\n [attr.data-id]=\"cell.id\"\n [attr.data-state]=\"cell.state\"\n [rtMod]=\"{ state: cell.state }\"\n [attr.title]=\"cell.title\"\n [attr.aria-label]=\"cell.title\"\n (click)=\"onCellClick(cell)\"></button>\n }\n</div>\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '../icon/rt-icon.component';\n\nconst BEM_BLOCK: string = 'rt-notifications-bell';\n\n/**\n * Колокольчик в шапке: открывает ленту событий и показывает точкой, что\n * непрочитанное есть.\n *\n * Маркер — точка, а не число: точное число получатель видит в самой ленте, а\n * двузначное в шапке спорило бы с подписями разделов.\n */\n@Component({\n selector: 'rt-notifications-bell',\n templateUrl: './rt-notifications-bell.component.html',\n styleUrl: './rt-notifications-bell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // rt-tools\n BlockDirective,\n ElemDirective,\n\n // components\n RtIconComponent,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtNotificationsBellComponent {\n public readonly unread: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n public readonly ariaLabel: InputSignal<string> = input<string>('');\n\n /** Подпись маркера для скринридера: точка сама по себе ничего не говорит */\n public readonly unreadLabel: InputSignal<string> = input<string>('');\n\n public readonly clicked: OutputEmitterRef<void> = output<void>();\n\n protected onClick(): void {\n this.clicked.emit();\n }\n}\n","<button rtBlock=\"rt-notifications-bell\" type=\"button\" qa-dataid=\"header-bell\" [attr.aria-label]=\"ariaLabel()\" (click)=\"onClick()\">\n <rt-icon rtElem=\"icon\" name=\"bell\" size=\"sm\" />\n\n @if (unread()) {\n <span rtElem=\"marker\" role=\"img\" qa-dataid=\"header-bell-marker\" [attr.aria-label]=\"unreadLabel()\"></span>\n }\n</button>\n","import { IRtIcon } from '../icon';\nimport { IRtPageHeader } from './rt-page-header.model';\n\n/** Чем пункт отрисуется: панелью, ссылкой или кнопкой. */\nexport enum ERtPageHeaderEntry {\n Panel = 'panel',\n Link = 'link',\n Button = 'button',\n}\n\nexport namespace IRtPageHeaderView {\n /** Пункт, готовый к отрисовке: форма решена заранее, шаблон её не выводит. */\n export interface Entry {\n readonly id: string;\n readonly label: string;\n readonly icon: IRtIcon.Name | null;\n readonly route: string;\n readonly routerLinkActiveExact: boolean;\n readonly disabled: boolean;\n readonly unread: boolean;\n readonly kind: ERtPageHeaderEntry;\n }\n\n export interface Group {\n readonly id: string;\n readonly label: string;\n readonly icon: IRtIcon.Name | null;\n readonly items: ReadonlyArray<Entry>;\n }\n\n export interface Column {\n readonly id: string;\n readonly groups: ReadonlyArray<Group>;\n }\n\n export interface Section extends Entry {\n readonly columns: ReadonlyArray<Column>;\n readonly columnCount: number;\n /** Все пункты панели одним списком: подсветка раздела и сведение маркера. */\n readonly panelItems: ReadonlyArray<Entry>;\n /** Группы всех колонок подряд: на узком экране колонок нет, а группы есть. */\n readonly panelGroups: ReadonlyArray<Group>;\n }\n}\n\n/** Пункты панели одним списком — колонки и группы для этого раскрываются. */\nexport function panelItemsOf(item: IRtPageHeader.Item): ReadonlyArray<IRtPageHeader.Item> {\n return (item.columns ?? []).flatMap((column: IRtPageHeader.Column): ReadonlyArray<IRtPageHeader.Item> =>\n column.groups.flatMap((group: IRtPageHeader.Group): ReadonlyArray<IRtPageHeader.Item> => group.items)\n );\n}\n\n/**\n * Маркер раздела. Пункты панели свёрнуты, и непросмотренное внутри видно только\n * по точке у самого раздела.\n */\nexport function unreadOf(item: IRtPageHeader.Item): boolean {\n return item.unread === true || panelItemsOf(item).some((entry: IRtPageHeader.Item): boolean => entry.unread === true);\n}\n\nexport function entryKindOf(item: IRtPageHeader.Item): ERtPageHeaderEntry {\n if (panelItemsOf(item).length > 0) {\n return ERtPageHeaderEntry.Panel;\n }\n if ((item.route ?? '') !== '' && !item.disabled) {\n return ERtPageHeaderEntry.Link;\n }\n\n return ERtPageHeaderEntry.Button;\n}\n\nexport function toEntry(item: IRtPageHeader.Item): IRtPageHeaderView.Entry {\n return {\n id: item.id,\n label: item.label,\n icon: item.icon ?? null,\n route: item.route ?? '',\n routerLinkActiveExact: item.routerLinkActiveExact === true,\n disabled: item.disabled === true,\n unread: item.unread === true,\n kind: entryKindOf(item),\n };\n}\n\nfunction toGroup(group: IRtPageHeader.Group): IRtPageHeaderView.Group {\n return {\n id: group.id,\n label: group.label ?? '',\n icon: group.icon ?? null,\n items: group.items.map(toEntry),\n };\n}\n\nfunction toColumn(column: IRtPageHeader.Column): IRtPageHeaderView.Column {\n return {\n id: column.id,\n groups: column.groups.map(toGroup),\n };\n}\n\n/** Группы всех колонок одним списком — узкий экран раскладывает панель без колонок. */\nexport function panelGroupsOf(columns: ReadonlyArray<IRtPageHeaderView.Column>): ReadonlyArray<IRtPageHeaderView.Group> {\n return columns.flatMap((column: IRtPageHeaderView.Column): ReadonlyArray<IRtPageHeaderView.Group> => column.groups);\n}\n\n/** Разделы верхнего ряда вместе с раскладкой их панелей. */\nexport function toSections(items: ReadonlyArray<IRtPageHeader.Item>): ReadonlyArray<IRtPageHeaderView.Section> {\n return items.map((item: IRtPageHeader.Item): IRtPageHeaderView.Section => {\n const columns: ReadonlyArray<IRtPageHeaderView.Column> = (item.columns ?? []).map(toColumn);\n\n return {\n ...toEntry(item),\n unread: unreadOf(item),\n columns,\n columnCount: columns.length,\n panelItems: panelItemsOf(item).map(toEntry),\n panelGroups: panelGroupsOf(columns),\n };\n });\n}\n\n/** Адрес без строки запроса и якоря — подсветка считается по пути. */\nexport function pathOf(url: string): string {\n return url.split(/[?#]/)[0] ?? '';\n}\n\nexport function isEntryActive(entry: IRtPageHeaderView.Entry, path: string): boolean {\n if (entry.kind !== ERtPageHeaderEntry.Link) {\n return false;\n }\n\n return entry.routerLinkActiveExact ? path === entry.route : path.startsWith(entry.route);\n}\n\n/**\n * Разделы, у которых активен хоть один пункт панели. Обход идёт по раскрытому\n * списку пунктов: своего адреса у раздела с панелью нет, и подсветить его больше\n * нечем.\n */\nexport function activeSectionIds(sections: ReadonlyArray<IRtPageHeaderView.Section>, url: string): ReadonlySet<string> {\n const path: string = pathOf(url);\n const ids: Set<string> = new Set<string>();\n for (const section of sections) {\n if (section.panelItems.some((entry: IRtPageHeaderView.Entry): boolean => isEntryActive(entry, path))) {\n ids.add(section.id);\n }\n }\n\n return ids;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n InputSignal,\n output,\n OutputEmitterRef,\n signal,\n Signal,\n TemplateRef,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Event as RouterEvent, NavigationEnd, Router, RouterLink, RouterLinkActive } from '@angular/router';\n\nimport { filter, map } from 'rxjs';\n\nimport { translateSignal, TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { BreakpointsService } from '../../platform';\n\nimport { RtIconComponent } from '../icon';\nimport { RtPopoverDirective } from '../popover';\nimport { RtTooltipDirective } from '../tooltip';\nimport { activeSectionIds, ERtPageHeaderEntry, IRtPageHeaderView, toSections } from './rt-page-header.logic';\nimport { IRtPageHeader } from './rt-page-header.model';\n\nconst BEM_BLOCK: string = 'rt-page-header';\n\n/**\n * Верхняя горизонтальная плашка-навигация для первого уровня доменных страниц.\n *\n * Контракт:\n * - `items` — `Item[]`. Анкор для пунктов с `route`; `<button>` для недоступных\n * и для тех, кто обрабатывается снаружи (`itemClick`). Пункт с `columns` —\n * кнопка-триггер: панель второго уровня открывается наведением ([rtPopover]).\n * - `user` — необязательный блок справа. Если задан `userMenu` (TemplateRef) —\n * блок становится hover-триггером попапа с этим контентом (клик — touch-fallback,\n * панель прижата к правому краю); иначе по клику emit'ит `userClick`.\n *\n * Active state — через `RouterLinkActive` с классом `rt-page-header__link--is-active`;\n * для раздела с панелью — вычисляется по текущему URL (своего route у него нет).\n */\n@Component({\n selector: 'rt-page-header',\n templateUrl: './rt-page-header.component.html',\n // Панель второго уровня и панель узкого экрана рисуются в CDK Overlay, вне\n // хоста, поэтому это отдельные корневые блоки — и отдельные файлы: бюджет\n // стилей компонента считается на каждый файл, и одним они его перебирают.\n styleUrls: ['./rt-page-header.component.scss', './rt-page-header-submenu.scss', './rt-page-header-mobile.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n RouterLink,\n RouterLinkActive,\n\n // standalone components / directives\n RtIconComponent,\n RtPopoverDirective,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtPageHeaderComponent {\n readonly #router: Router = inject(Router);\n\n readonly #t_uiMainNav: Signal<string> = translateSignal('rtKit.uiMainNav');\n\n /* Реактивный URL для подсветки раздела: у раздела с панелью нет своего\n route, поэтому RouterLinkActive не применим — сравниваем по факту навигации. */\n readonly #currentUrl: Signal<string> = toSignal(\n this.#router.events.pipe(\n filter((e: RouterEvent): e is NavigationEnd => e instanceof NavigationEnd),\n map((): string => this.#router.url)\n ),\n { initialValue: this.#router.url }\n );\n\n readonly #breakpoints: BreakpointsService = inject(BreakpointsService);\n\n protected readonly mobileNavPopoverRef: Signal<RtPopoverDirective | undefined> = viewChild('mobileNavPopover', {\n read: RtPopoverDirective,\n });\n\n /** Форма пункта решается один раз здесь, а не ветвлениями в шаблоне. */\n protected readonly sections: Signal<ReadonlyArray<IRtPageHeaderView.Section>> = computed((): ReadonlyArray<IRtPageHeaderView.Section> =>\n toSections(this.items())\n );\n\n /**\n * id разделов с активным вложенным адресом — для O(1) lookup в шаблоне.\n * Зависит от #currentUrl + items (сигналы) → подсветка реактивна на навигацию.\n */\n protected readonly activeSectionIds: Signal<ReadonlySet<string>> = computed((): ReadonlySet<string> =>\n activeSectionIds(this.sections(), this.#currentUrl())\n );\n\n protected readonly userAvatar: Signal<string> = computed((): string => {\n const u: IRtPageHeader.User | null = this.user();\n if (!u) {\n return '';\n }\n if (u.avatar && u.avatar.length > 0) {\n return u.avatar.charAt(0).toUpperCase();\n }\n return u.name.charAt(0).toUpperCase();\n });\n\n /** Узкий вьюпорт (≤1080px): инлайн-навигация прячется, показывается гамбургер. */\n protected readonly isNarrow: Signal<boolean> = this.#breakpoints.narrow;\n\n /**\n * id раскрытых разделов-аккордеонов в мобильной панели. Ключ — только раздел:\n * группы внутри раскрытого раздела показаны сразу, и совпасть идентификаторам\n * раздела и группы в этом множестве негде.\n */\n protected readonly expandedSectionIds: WritableSignal<ReadonlySet<string>> = signal<ReadonlySet<string>>(new Set<string>());\n\n protected readonly EntryKind: typeof ERtPageHeaderEntry = ERtPageHeaderEntry;\n\n public readonly items: InputSignal<ReadonlyArray<IRtPageHeader.Item>> = input<ReadonlyArray<IRtPageHeader.Item>>([]);\n\n public readonly user: InputSignal<IRtPageHeader.User | null> = input<IRtPageHeader.User | null>(null);\n\n public readonly userTitle: InputSignal<string> = input<string>('');\n\n public readonly userMenu: InputSignal<TemplateRef<unknown> | null> = input<TemplateRef<unknown> | null>(null);\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly ariaLabel: InputSignal<string> = input<string>('');\n\n /** Своё имя навигации важнее умолчания */\n public readonly navAriaLabel: Signal<string> = computed((): string => this.ariaLabel() || this.#t_uiMainNav());\n\n public readonly itemClick: OutputEmitterRef<string> = output<string>();\n\n public readonly userClick: OutputEmitterRef<void> = output<void>();\n\n constructor() {\n // Ресайз обратно в десктоп — гамбургер скрывается CSS'ом; открытую\n // мобильную панель закрываем, иначе overlay зависнет без якоря.\n effect((): void => {\n if (!this.isNarrow()) {\n this.mobileNavPopoverRef()?.close();\n }\n });\n }\n\n protected onItemClick(id: string): void {\n this.itemClick.emit(id);\n }\n\n protected onUserClick(): void {\n this.userClick.emit();\n }\n\n /** Аккордеон мобильной панели: тумблер раскрытия раздела по его id. */\n protected toggleSection(id: string): void {\n this.expandedSectionIds.update((prev: ReadonlySet<string>): ReadonlySet<string> => {\n const next: Set<string> = new Set<string>(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }\n\n /** Клик по плоскому пункту мобильной панели: emit + закрыть панель. */\n protected onMobileItemClick(id: string): void {\n this.itemClick.emit(id);\n this.mobileNavPopoverRef()?.close();\n }\n}\n","<ng-container rtBlock=\"rt-page-header\">\n <nav rtElem=\"nav\" [attr.aria-label]=\"navAriaLabel()\">\n <ul rtElem=\"list\" role=\"list\">\n @for (section of sections(); track section.id) {\n <li rtElem=\"item\" qa-dataid=\"header-nav-item\" [attr.data-id]=\"section.id\">\n @switch (section.kind) {\n @case (EntryKind.Panel) {\n <button\n rtElem=\"link\"\n type=\"button\"\n qa-dataid=\"header-nav-trigger\"\n #groupPopover=\"rtPopover\"\n rtPopoverTrigger=\"hover\"\n rtPopoverFitViewport\n rtPopoverOffsetY=\"14\"\n [rtMod]=\"{\n isActive: activeSectionIds().has(section.id),\n isOpen: groupPopover.isOpen(),\n }\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"groupPopover.isOpen()\"\n [rtPopover]=\"submenuTpl\"\n (click)=\"groupPopover.open()\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"'rtKit.uiNavUnread' | transloco\"></span>\n }\n <span rtElem=\"caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n <ng-template #submenuTpl>\n <div rtBlock=\"rt-page-header-submenu\" role=\"menu\" [style.--rt-nav-panel-columns]=\"section.columnCount\">\n @for (column of section.columns; track column.id) {\n <div rtElem=\"column\" qa-dataid=\"header-nav-column\" [attr.data-id]=\"column.id\">\n @for (group of column.groups; track group.id) {\n <div rtElem=\"group\" role=\"group\" [attr.aria-label]=\"group.label || null\">\n @if (group.label) {\n <div rtElem=\"group-title\" qa-dataid=\"header-nav-group\" [attr.data-id]=\"group.id\">\n @if (group.icon) {\n <rt-icon rtElem=\"group-icon\" size=\"xs\" [name]=\"group.icon\" />\n }\n <span rtElem=\"group-label\">{{ group.label }}</span>\n </div>\n }\n @for (entry of group.items; track entry.id) {\n @if (entry.kind === EntryKind.Link) {\n <a\n rtElem=\"link\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-subitem\"\n routerLinkActive=\"rt-page-header-submenu__link--is-active\"\n [attr.data-id]=\"entry.id\"\n [routerLink]=\"entry.route\"\n [routerLinkActiveOptions]=\"{ exact: entry.routerLinkActiveExact }\"\n (click)=\"groupPopover.close()\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"'rtKit.uiNavUnread' | transloco\"></span>\n }\n </a>\n } @else if (entry.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"\n 'rtKit.uiSectionInProgress' | transloco: { label: entry.label }\n \">\n <button\n rtElem=\"link\"\n role=\"menuitem\"\n type=\"button\"\n qa-dataid=\"header-nav-subitem\"\n [rtMod]=\"{ disabled: true }\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-disabled]=\"true\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n </button>\n </span>\n } @else {\n <button\n rtElem=\"link\"\n role=\"menuitem\"\n type=\"button\"\n qa-dataid=\"header-nav-subitem\"\n [attr.data-id]=\"entry.id\"\n (click)=\"onItemClick(entry.id)\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"'rtKit.uiNavUnread' | transloco\"></span>\n }\n </button>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n }\n @case (EntryKind.Link) {\n <a\n rtElem=\"link\"\n routerLinkActive=\"rt-page-header__link--is-active\"\n [routerLink]=\"section.route\"\n [routerLinkActiveOptions]=\"{ exact: section.routerLinkActiveExact }\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"'rtKit.uiNavUnread' | transloco\"></span>\n }\n </a>\n }\n @default {\n @if (section.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"'rtKit.uiSectionInProgress' | transloco: { label: section.label }\">\n <button rtElem=\"link\" type=\"button\" [rtMod]=\"{ disabled: true }\" [attr.aria-disabled]=\"true\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n </button>\n </span>\n } @else {\n <button rtElem=\"link\" type=\"button\" (click)=\"onItemClick(section.id)\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"'rtKit.uiNavUnread' | transloco\"></span>\n }\n </button>\n }\n }\n }\n </li>\n }\n </ul>\n </nav>\n\n <button\n rtElem=\"burger\"\n type=\"button\"\n qa-dataid=\"header-nav-burger\"\n #mobileNavPopover=\"rtPopover\"\n rtPopoverFitViewport\n rtPopoverOffsetY=\"14\"\n [attr.aria-label]=\"'rtKit.uiNavMenu' | transloco\"\n [rtMod]=\"{ isOpen: mobileNavPopover.isOpen() }\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"mobileNavPopover.isOpen()\"\n [rtPopover]=\"mobileNavTpl\">\n <rt-icon rtElem=\"burger-icon\" name=\"bars\" size=\"md\" />\n </button>\n\n <ng-template #mobileNavTpl>\n <div rtBlock=\"rt-page-header-mobile\" role=\"menu\">\n @for (section of sections(); track section.id) {\n @switch (section.kind) {\n @case (EntryKind.Panel) {\n <button\n rtElem=\"section\"\n type=\"button\"\n qa-dataid=\"header-nav-mobile-trigger\"\n [rtMod]=\"{\n isExpanded: expandedSectionIds().has(section.id),\n isActive: activeSectionIds().has(section.id),\n }\"\n [attr.data-id]=\"section.id\"\n [attr.aria-expanded]=\"expandedSectionIds().has(section.id)\"\n (click)=\"toggleSection(section.id)\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"'rtKit.uiNavUnread' | transloco\"></span>\n }\n <span rtElem=\"caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n @if (expandedSectionIds().has(section.id)) {\n <div rtElem=\"children\">\n @for (group of section.panelGroups; track group.id) {\n <div rtElem=\"group\" role=\"group\" [attr.aria-label]=\"group.label || null\">\n @if (group.label) {\n <div rtElem=\"group-title\" qa-dataid=\"header-nav-mobile-group\" [attr.data-id]=\"group.id\">\n @if (group.icon) {\n <rt-icon rtElem=\"group-icon\" size=\"xs\" [name]=\"group.icon\" />\n }\n <span rtElem=\"group-label\">{{ group.label }}</span>\n </div>\n }\n @for (entry of group.items; track entry.id) {\n @if (entry.kind === EntryKind.Link) {\n <a\n rtElem=\"link\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n routerLinkActive=\"rt-page-header-mobile__link--is-active\"\n [rtMod]=\"{ child: true }\"\n [attr.data-id]=\"entry.id\"\n [routerLink]=\"entry.route\"\n [routerLinkActiveOptions]=\"{ exact: entry.routerLinkActiveExact }\"\n (click)=\"mobileNavPopover.close()\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"'rtKit.uiNavUnread' | transloco\"></span>\n }\n </a>\n } @else if (entry.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"'rtKit.uiSectionInProgress' | transloco: { label: entry.label }\">\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [rtMod]=\"{ child: true, disabled: true }\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-disabled]=\"true\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n </button>\n </span>\n } @else {\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [rtMod]=\"{ child: true }\"\n [attr.data-id]=\"entry.id\"\n (click)=\"onMobileItemClick(entry.id)\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"'rtKit.uiNavUnread' | transloco\"></span>\n }\n </button>\n }\n }\n </div>\n }\n </div>\n }\n }\n @case (EntryKind.Link) {\n <a\n rtElem=\"link\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n routerLinkActive=\"rt-page-header-mobile__link--is-active\"\n [attr.data-id]=\"section.id\"\n [routerLink]=\"section.route\"\n [routerLinkActiveOptions]=\"{ exact: section.routerLinkActiveExact }\"\n (click)=\"mobileNavPopover.close()\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"'rtKit.uiNavUnread' | transloco\"></span>\n }\n </a>\n }\n @default {\n @if (section.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"'rtKit.uiSectionInProgress' | transloco: { label: section.label }\">\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [rtMod]=\"{ disabled: true }\"\n [attr.data-id]=\"section.id\"\n [attr.aria-disabled]=\"true\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n </button>\n </span>\n } @else {\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [attr.data-id]=\"section.id\"\n (click)=\"onMobileItemClick(section.id)\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"'rtKit.uiNavUnread' | transloco\"></span>\n }\n </button>\n }\n }\n }\n }\n </div>\n </ng-template>\n\n <ng-content select=\"[rtHeaderBell]\" />\n\n @if (user(); as u) {\n @if (userMenu(); as menuTpl) {\n <!--\n Меню профиля открывается наведением, как и разделы: весь верхний\n ряд ведёт себя одинаково. Нажатие остаётся запасным путём для\n касания, а переход курсора на список языков панель переживает —\n вложенный оверлей за уход наружу не считается.\n -->\n <button\n rtElem=\"user\"\n type=\"button\"\n qa-dataid=\"header-user-menu\"\n #userPopover=\"rtPopover\"\n rtPopoverTrigger=\"hover\"\n rtPopoverAlign=\"end\"\n rtPopoverOffsetY=\"14\"\n [rtMod]=\"{ isOpen: userPopover.isOpen() }\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"userPopover.isOpen()\"\n [rtPopover]=\"menuTpl\"\n (click)=\"userPopover.open()\">\n <span rtElem=\"user-avatar\" aria-hidden=\"true\">{{ userAvatar() }}</span>\n <span rtElem=\"user-name\" qa-dataid=\"header-user-name\">{{ u.name }}</span>\n <span rtElem=\"user-caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n } @else {\n <button rtElem=\"user\" type=\"button\" (click)=\"onUserClick()\">\n <span rtElem=\"user-avatar\" aria-hidden=\"true\">{{ userAvatar() }}</span>\n <span rtElem=\"user-name\" qa-dataid=\"header-user-name\">{{ u.name }}</span>\n <span rtElem=\"user-caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n }\n }\n</ng-container>\n","/**\n * Чистая логика просмотрщика: переходы между кадрами и то, какие из них стоит\n * держать загруженными.\n */\n\n/** Листание по кругу: с последнего кадра стрелка вправо ведёт на первый */\nexport function nextPhotoIndex(current: number, total: number, step: number): number {\n if (total <= 0) {\n return 0;\n }\n return (((current + step) % total) + total) % total;\n}\n\n/** Индекс из адреса: в URL кадры нумеруются с единицы, внутри — с нуля */\nexport function indexFromParam(param: string | null, total: number): number {\n const parsed: number = Number(param);\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > total) {\n return -1;\n }\n return parsed - 1;\n}\n\nexport function paramFromIndex(index: number): string {\n return String(index + 1);\n}\n\n/**\n * Индекс кадра по позиции прокрутки. Нужен, потому что листать можно свайпом:\n * без этого счётчик показывал бы один кадр, а на экране был бы другой.\n */\nexport function indexFromScroll(scrollLeft: number, slideWidth: number, total: number): number {\n if (slideWidth <= 0 || total <= 0) {\n return 0;\n }\n const index: number = Math.round(scrollLeft / slideWidth);\n return Math.min(Math.max(index, 0), total - 1);\n}\n\n/**\n * Кадры, которые держим в разметке: текущий и соседние. Полноразмерная\n * фотография весит сотни килобайт, и загружать все пятьдесят разом — значит\n * выесть трафик пользователя ради кадров, до которых он не долистает.\n */\nexport function shouldRenderPhoto(index: number, current: number, total: number): boolean {\n if (total <= 0) {\n return false;\n }\n const distance: number = Math.min(Math.abs(index - current), total - Math.abs(index - current));\n return distance <= 1;\n}\n","import { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n Signal,\n signal,\n TemplateRef,\n viewChild,\n WritableSignal,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\n// rt-tools\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtDialogRef } from '../dialog/rt-dialog-ref';\nimport { RT_DIALOG_DATA } from '../dialog/rt-dialog.tokens';\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { indexFromScroll, nextPhotoIndex, shouldRenderPhoto } from './rt-photo-viewer.logic';\nimport { IRtPhotoViewer } from './rt-photo-viewer.model';\n\nconst BEM_BLOCK: string = 'rt-photo-viewer';\n\n/**\n * Полноэкранный просмотрщик фотографий поверх `RtDialogService`.\n *\n * Листание — нативный `scroll-snap`: свайп, инерцию и прилипание даёт сам\n * браузер, и на телефоне это ощущается правильнее любой реализации на\n * обработчиках. Готовую библиотеку не берём — весь кит здесь собственный, а\n * токены, BEM и `qa-dataid` ложатся естественно.\n *\n * Руками сделаны: стрелки, клавиши `←` `→`, счётчик и предзагрузка соседних\n * кадров. `Esc`, блокировку прокрутки фона и затемнение даёт сам диалог.\n */\n@Component({\n selector: 'rt-photo-viewer',\n templateUrl: './rt-photo-viewer.component.html',\n styleUrl: './rt-photo-viewer.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // angular\n CdkTrapFocus,\n NgTemplateOutlet,\n\n // rt-tools\n BlockDirective,\n ElemDirective,\n\n // components\n RtIconButtonComponent,\n\n // transloco\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n role: 'dialog',\n 'aria-modal': 'true',\n // Клавиши слушает сам просмотрщик, поэтому фокус переводится на него\n // сразу после открытия — иначе стрелки и Esc не работали бы, пока\n // пользователь куда-нибудь не кликнет\n tabindex: '-1',\n '(keydown.escape)': 'close()',\n '(keydown.arrowLeft)': 'move(-1)',\n '(keydown.arrowRight)': 'move(1)',\n },\n})\nexport class RtPhotoViewerComponent {\n readonly #data: IRtPhotoViewer.Data = inject(RT_DIALOG_DATA) as IRtPhotoViewer.Data;\n readonly #dialogRef: RtDialogRef<number> = inject(RtDialogRef<number>);\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef<HTMLElement>);\n\n protected readonly track: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('track');\n\n protected readonly photos: readonly IRtPhotoViewer.Photo[] = this.#data.photos;\n\n /** Панель правки под дорожкой; там, где кадр только смотрят, её нет */\n protected readonly panel: TemplateRef<IRtPhotoViewer.PanelContext> | null = this.#data.panel ?? null;\n\n protected readonly currentIndex: WritableSignal<number> = signal<number>(this.#data.startIndex);\n\n protected readonly counter: Signal<string> = computed((): string => `${this.currentIndex() + 1} / ${this.photos.length}`);\n\n /** Соседние кадры готовятся заранее, дальние в разметку не попадают */\n protected readonly rendered: Signal<readonly boolean[]> = computed((): readonly boolean[] =>\n this.photos.map((_photo: IRtPhotoViewer.Photo, index: number): boolean =>\n shouldRenderPhoto(index, this.currentIndex(), this.photos.length)\n )\n );\n\n constructor() {\n // Открытие может быть не с первого кадра: без явной прокрутки счётчик\n // показывал бы второй кадр, а на экране остался бы первый\n afterNextRender((): void => {\n this.#host.nativeElement.focus();\n this.#scrollToCurrent();\n });\n }\n\n /** Наружу отдаётся кадр, на котором закрыли: по нему вызывающая сторона чистит адрес */\n public close(): void {\n this.#dialogRef.close(this.currentIndex());\n }\n\n protected move(step: number): void {\n this.select(nextPhotoIndex(this.currentIndex(), this.photos.length, step));\n }\n\n protected select(index: number): void {\n this.currentIndex.set(index);\n this.#scrollToCurrent();\n }\n\n /** Свайп листает мимо стрелок — счётчик догоняет позицию дорожки */\n protected onScroll(): void {\n const track: HTMLElement | undefined = this.track()?.nativeElement;\n if (track) {\n this.currentIndex.set(indexFromScroll(track.scrollLeft, track.clientWidth, this.photos.length));\n }\n }\n\n /**\n * Прокрутка ленты вслед за выбором. Позиция считается от ширины дорожки, а\n * не от `scrollWidth`: кадры за пределами окна ещё не отрисованы, и общая\n * ширина до их появления меньше реальной.\n *\n * Переход мгновенный: `behavior: 'smooth'` внутри оверлея молча не двигает\n * дорожку — счётчик менялся, а кадр оставался прежним. Свайп при этом\n * по-прежнему анимирует сам браузер через scroll-snap.\n */\n #scrollToCurrent(): void {\n const track: HTMLElement | undefined = this.track()?.nativeElement;\n if (!track) {\n return;\n }\n track.scrollTo({ left: track.clientWidth * this.currentIndex(), behavior: 'instant' });\n }\n}\n","<ng-container rtBlock=\"rt-photo-viewer\">\n <!-- Ловушка держит Tab внутри; фокус ставит сам компонент, поэтому\n авто-захвата здесь нет: он перебивал фокус на просмотрщике, и клавиши\n переставали листать -->\n <div rtElem=\"surface\" cdkTrapFocus>\n <header rtElem=\"bar\">\n <span rtElem=\"counter\" qa-dataid=\"photo-viewer-counter\">{{ counter() }}</span>\n <rt-icon-button\n qa-dataid=\"photo-viewer-close\"\n icon=\"close\"\n variant=\"ghost\"\n [ariaLabel]=\"'rtKit.photoViewerClose' | transloco\"\n (clicked)=\"close()\" />\n </header>\n\n <div rtElem=\"track\" qa-dataid=\"photo-viewer-track\" #track (scroll)=\"onScroll()\">\n @for (photo of photos; track photo.id; let index = $index) {\n <figure rtElem=\"slide\" [attr.data-photo-index]=\"index\">\n @if (rendered()[index]) {\n <picture>\n @for (source of photo.picture.sources; track source.type) {\n <source sizes=\"100vw\" [type]=\"source.type\" [srcset]=\"source.srcset\" />\n }\n <img\n rtElem=\"image\"\n qa-dataid=\"photo-viewer-image\"\n decoding=\"async\"\n sizes=\"100vw\"\n [srcset]=\"photo.picture.fallbackSrcset\"\n [src]=\"photo.picture.fallbackSrc\"\n [alt]=\"photo.alt\" />\n </picture>\n }\n </figure>\n }\n </div>\n\n @if (photos.length > 1) {\n <rt-icon-button\n rtElem=\"arrow-prev\"\n qa-dataid=\"photo-viewer-prev\"\n icon=\"angle-left\"\n variant=\"ghost\"\n [ariaLabel]=\"'rtKit.photoViewerPrev' | transloco\"\n (clicked)=\"move(-1)\" />\n\n <rt-icon-button\n rtElem=\"arrow-next\"\n qa-dataid=\"photo-viewer-next\"\n icon=\"angle-right\"\n variant=\"ghost\"\n [ariaLabel]=\"'rtKit.photoViewerNext' | transloco\"\n (clicked)=\"move(1)\" />\n }\n\n <!-- Панель приходит снаружи: где-то кадр только смотрят, где-то им ещё и\n управляют, и решение принимается там же, где кадр виден крупно -->\n @if (panel) {\n <footer rtElem=\"panel\" qa-dataid=\"photo-viewer-panel\">\n <ng-container\n [ngTemplateOutlet]=\"panel\"\n [ngTemplateOutletContext]=\"{ $implicit: photos[currentIndex()], index: currentIndex() }\" />\n </footer>\n }\n </div>\n</ng-container>\n","import { IPageModel } from '@rt-tools/utils';\n\nimport { IRtPagination } from './rt-pagination.model';\n\n/** Сколько всего страниц. Пустой список — одна страница, листать нечего. */\nexport function lastPageOf(page: IPageModel): number {\n if (page.pageSize <= 0) {\n return 1;\n }\n\n return Math.max(1, Math.ceil(page.totalCount / page.pageSize));\n}\n\n/** Номер первой записи открытой страницы. */\nexport function rangeFromOf(page: IPageModel): number {\n return (page.pageNumber - 1) * page.pageSize + 1;\n}\n\n/** Номер последней записи открытой страницы — на последней странице она короче. */\nexport function rangeToOf(page: IPageModel): number {\n return Math.min(page.pageNumber * page.pageSize, page.totalCount);\n}\n\n/**\n * Полоса номеров страниц с разрывами «…»: первая, последняя и соседи открытой.\n * Пуста при единственной странице — показывать нечего.\n */\nexport function pageItemsOf(page: IPageModel, neighbours: number): ReadonlyArray<IRtPagination.PageItem> {\n const lastPage: number = lastPageOf(page);\n if (lastPage <= 1) {\n return [];\n }\n\n const items: IRtPagination.PageItem[] = [];\n let previous: number = 0;\n for (let candidate: number = 1; candidate <= lastPage; candidate++) {\n const isEdge: boolean = candidate === 1 || candidate === lastPage;\n const isNeighbour: boolean = candidate >= page.pageNumber - neighbours && candidate <= page.pageNumber + neighbours;\n if (!isEdge && !isNeighbour) {\n continue;\n }\n if (previous && candidate - previous > 1) {\n items.push('gap');\n }\n items.push(candidate);\n previous = candidate;\n }\n\n return items;\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\nimport { IPageModel } from '@rt-tools/utils';\n\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { RtSelectComponent } from '../select/rt-select.component';\nimport { IRtSelect } from '../select/rt-select.model';\nimport { lastPageOf, pageItemsOf, rangeFromOf, rangeToOf } from './rt-pagination.logic';\nimport { IRtPagination } from './rt-pagination.model';\n\nconst BEM_BLOCK: string = 'rt-pagination';\nconst NEIGHBOURS: number = 1; // соседей вокруг открытой страницы\n\n@Component({\n selector: 'rt-pagination',\n templateUrl: './rt-pagination.component.html',\n styleUrl: './rt-pagination.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n FormsModule,\n\n // standalone components / directives\n RtIconButtonComponent,\n RtSelectComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n '[style.display]': \"isVisible() ? null : 'none'\",\n },\n})\nexport class RtPaginationComponent {\n protected readonly perPageSelectOptions: Signal<ReadonlyArray<IRtSelect.Option<number>>> = computed(\n (): ReadonlyArray<IRtSelect.Option<number>> =>\n this.perPageOptions().map((n: number): IRtSelect.Option<number> => ({ label: String(n), value: n }))\n );\n\n protected readonly isFirst: Signal<boolean> = computed((): boolean => this.pageModel().pageNumber <= 1);\n\n protected readonly isLast: Signal<boolean> = computed((): boolean => this.pageModel().pageNumber >= this.lastPage());\n\n public readonly pageModel: InputSignal<IPageModel> = input.required<IPageModel>();\n\n public readonly perPageOptions: InputSignal<ReadonlyArray<number>> = input<ReadonlyArray<number>>([20, 50, 100]);\n\n public readonly loading: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n public readonly pageChange: OutputEmitterRef<number> = output<number>();\n\n public readonly perPageChange: OutputEmitterRef<number> = output<number>();\n\n /**\n * Пагинацию показываем, только когда есть что листать/менять: всё не влезает\n * на одну страницу даже при минимальной опции размера (`total > наименьший\n * perPageOption`). Иначе и навигация, и селектор размера бесполезны — прячем\n * весь бар (включая пустой и пустой-по-фильтру список).\n */\n public readonly isVisible: Signal<boolean> = computed((): boolean => {\n const options: ReadonlyArray<number> = this.perPageOptions();\n const smallest: number = options.length > 0 ? Math.min(...options) : 0;\n return this.pageModel().totalCount > smallest;\n });\n\n /** Сколько всего страниц при нынешнем размере страницы. */\n public readonly lastPage: Signal<number> = computed((): number => lastPageOf(this.pageModel()));\n\n /**\n * Границы диапазона записей открытой страницы. Собираются числами, а сама\n * подпись — в шаблоне: только там подстановка проходит через словарь и\n * переживает смену языка.\n */\n public readonly rangeFrom: Signal<number> = computed((): number => rangeFromOf(this.pageModel()));\n\n public readonly rangeTo: Signal<number> = computed((): number => rangeToOf(this.pageModel()));\n\n /** Полоса номеров страниц с разрывами «…». Пуста при единственной странице. */\n public readonly pageItems: Signal<ReadonlyArray<IRtPagination.PageItem>> = computed((): ReadonlyArray<IRtPagination.PageItem> =>\n pageItemsOf(this.pageModel(), NEIGHBOURS)\n );\n\n public goTo(pageNumber: number): void {\n if (this.loading() || pageNumber === this.pageModel().pageNumber || pageNumber < 1 || pageNumber > this.lastPage()) {\n return;\n }\n this.pageChange.emit(pageNumber);\n }\n\n protected onPerPage(value: number | null): void {\n if (value === null || this.loading() || value === this.pageModel().pageSize) {\n return;\n }\n this.perPageChange.emit(value);\n }\n}\n","<ng-container rtBlock=\"rt-pagination\">\n <span rtElem=\"range\" qa-dataid=\"pagination-range\">\n @if (pageModel().totalCount === 0) {\n {{ 'rtKit.uiRangeEmpty' | transloco }}\n } @else {\n {{ 'rtKit.uiRangeOf' | transloco: { from: rangeFrom(), to: rangeTo(), total: pageModel().totalCount } }}\n }\n </span>\n\n @if (pageItems().length) {\n <nav rtElem=\"compact\" qa-dataid=\"pagination-compact\" [attr.aria-label]=\"'rtKit.uiPagination' | transloco\">\n <rt-icon-button\n rtElem=\"arrow\"\n qa-dataid=\"pagination-compact-prev\"\n icon=\"chevron-left\"\n variant=\"ghost\"\n size=\"sm\"\n [ariaLabel]=\"'rtKit.uiPrevPage' | transloco\"\n [tooltip]=\"'rtKit.uiBack' | transloco\"\n [disabled]=\"isFirst() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber - 1)\" />\n\n <span rtElem=\"compact-label\" qa-dataid=\"pagination-compact-label\">\n {{ 'rtKit.uiPageOf' | transloco: { page: pageModel().pageNumber, last: lastPage() } }}\n </span>\n\n <rt-icon-button\n rtElem=\"arrow\"\n qa-dataid=\"pagination-compact-next\"\n icon=\"chevron-right\"\n variant=\"ghost\"\n size=\"sm\"\n [ariaLabel]=\"'rtKit.uiNextPage' | transloco\"\n [tooltip]=\"'rtKit.uiForward' | transloco\"\n [disabled]=\"isLast() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber + 1)\" />\n </nav>\n\n <nav rtElem=\"nav\" qa-dataid=\"pagination-nav\" [attr.aria-label]=\"'rtKit.uiPagination' | transloco\">\n <rt-icon-button\n rtElem=\"arrow\"\n qa-dataid=\"pagination-prev\"\n icon=\"chevron-left\"\n variant=\"ghost\"\n size=\"sm\"\n [ariaLabel]=\"'rtKit.uiPrevPage' | transloco\"\n [tooltip]=\"'rtKit.uiBack' | transloco\"\n [disabled]=\"isFirst() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber - 1)\" />\n\n @for (item of pageItems(); track $index) {\n @if (item === 'gap') {\n <span rtElem=\"gap\" aria-hidden=\"true\">…</span>\n } @else {\n <button\n rtElem=\"page\"\n qa-dataid=\"pagination-page\"\n type=\"button\"\n [attr.data-page]=\"item\"\n [rtMod]=\"{ current: item === pageModel().pageNumber }\"\n [attr.aria-current]=\"item === pageModel().pageNumber ? 'page' : null\"\n [disabled]=\"loading()\"\n (click)=\"goTo(item)\">\n {{ item }}\n </button>\n }\n }\n\n <rt-icon-button\n rtElem=\"arrow\"\n qa-dataid=\"pagination-next\"\n icon=\"chevron-right\"\n variant=\"ghost\"\n size=\"sm\"\n [ariaLabel]=\"'rtKit.uiNextPage' | transloco\"\n [tooltip]=\"'rtKit.uiForward' | transloco\"\n [disabled]=\"isLast() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber + 1)\" />\n </nav>\n }\n\n <div rtElem=\"per-page\">\n <span rtElem=\"per-page-label\">{{ 'rtKit.uiPerPage' | transloco }}</span>\n <rt-select\n qa-dataid=\"pagination-per-page\"\n [ariaLabel]=\"'rtKit.uiItemsPerPage' | transloco\"\n [options]=\"perPageSelectOptions()\"\n [clearable]=\"false\"\n [ngModel]=\"pageModel().pageSize\"\n [ngModelOptions]=\"{ standalone: true }\"\n (selectionChange)=\"onPerPage($event)\" />\n </div>\n</ng-container>\n","import { ChangeDetectionStrategy, Component, input, InputSignal, output, OutputEmitterRef, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '../icon';\nimport { IRtSectionNav } from './rt-section-nav.model';\n\nconst BEM_BLOCK: string = 'rt-section-nav';\n\n@Component({\n selector: 'rt-section-nav',\n templateUrl: './rt-section-nav.component.html',\n styleUrls: ['./rt-section-nav.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtIconComponent, BlockDirective, ElemDirective, ModDirective],\n host: {\n class: BEM_BLOCK,\n role: 'navigation',\n },\n})\nexport class RtSectionNavComponent {\n public readonly items: InputSignal<readonly IRtSectionNav.Item[]> = input<readonly IRtSectionNav.Item[]>([]);\n\n public readonly itemSelect: OutputEmitterRef<string> = output<string>();\n\n protected onSelect(item: IRtSectionNav.Item): void {\n if (item.active) {\n return;\n }\n this.itemSelect.emit(item.id);\n }\n}\n","<ng-container rtBlock=\"rt-section-nav\">\n @for (item of items(); track item.id) {\n <button\n rtElem=\"tile\"\n qa-dataid=\"section-nav-tile\"\n type=\"button\"\n [attr.data-key]=\"item.id\"\n [attr.data-active]=\"item.active\"\n [attr.aria-current]=\"item.active ? 'page' : null\"\n [rtMod]=\"{ active: item.active }\"\n (click)=\"onSelect(item)\">\n <rt-icon rtElem=\"icon\" size=\"lg\" [name]=\"item.icon\" />\n <span rtElem=\"label\">{{ item.label }}</span>\n </button>\n }\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtButtonDirective } from '../button/rt-button.directive';\nimport { RtPopoverDirective } from '../popover/rt-popover.directive';\nimport { IRtSplitButton } from './rt-split-button.model';\n\nconst BEM_BLOCK: string = 'rt-split-button';\n\n/**\n * Кнопка с раздельным действием: основной CTA («лицо») + каретка, по клику на\n * которую раскрывается меню второстепенных действий. Применяется, когда у\n * сценария ДВА позитивных действия и нужно явно выделить главное, не пряча\n * второстепенное (например, футер формы: лицо «Сохранить», в меню\n * «Сохранить черновик»).\n *\n * Меню — поверх `[rtPopover]` (CDK Overlay): авто-flip у края, outside-click и\n * Escape закрывают, не режется `overflow: hidden` предками (футер aside'а).\n * Лицо и каретка — две `[rtButton]`, визуально сшитые в один контрол.\n *\n * `ViewEncapsulation.None` — стили префиксованы `.rt-split-button`.\n */\n@Component({\n selector: 'rt-split-button',\n templateUrl: './rt-split-button.component.html',\n styleUrl: './rt-split-button.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtButtonDirective, RtPopoverDirective, BlockDirective, ElemDirective],\n host: {\n class: BEM_BLOCK,\n '[class.rt-split-button--open]': 'menu()?.isOpen()',\n },\n})\nexport class RtSplitButtonComponent {\n readonly #t_uiMoreActions: Signal<string> = translateSignal('rtKit.uiMoreActions');\n\n protected readonly menu: Signal<RtPopoverDirective | undefined> = viewChild(RtPopoverDirective);\n\n /** Своё имя каретки важнее умолчания: экран знает, что за действия в меню */\n protected readonly menuAriaText: Signal<string> = computed((): string => this.menuAriaLabel() || this.#t_uiMoreActions());\n\n /** Подпись основного действия («лицо»). */\n public readonly label: InputSignal<string> = input.required<string>();\n\n /** Пункты выпадающего меню второстепенных действий. */\n public readonly menuItems: InputSignal<readonly IRtSplitButton.MenuItem[]> = input.required<readonly IRtSplitButton.MenuItem[]>();\n\n /** Семантическая палитра лица и каретки. */\n public readonly theme: InputSignal<IRtSplitButton.Theme> = input<IRtSplitButton.Theme>('primary');\n\n /** Размер контрола. */\n public readonly size: InputSignal<IRtSplitButton.Size> = input<IRtSplitButton.Size>('md');\n\n /** Доступное имя для каретки (icon-only кнопка открытия меню). */\n public readonly menuAriaLabel: InputSignal<string> = input<string>('');\n\n /** Загрузка: спиннер на лице + блокировка обеих кнопок. */\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Нативное отключение обеих кнопок. */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Клик по лицу (основное действие). */\n public readonly faceClick: OutputEmitterRef<void> = output<void>();\n\n /** Выбор пункта меню — эмитит `value` выбранного пункта. */\n public readonly itemSelect: OutputEmitterRef<string> = output<string>();\n\n protected onFace(): void {\n if (this.disabled() || this.loading()) {\n return;\n }\n this.faceClick.emit();\n }\n\n protected onToggle(): void {\n if (this.disabled() || this.loading()) {\n return;\n }\n this.menu()?.toggle();\n }\n\n protected onItem(item: IRtSplitButton.MenuItem): void {\n if (item.disabled) {\n return;\n }\n this.menu()?.close();\n this.itemSelect.emit(item.value);\n }\n}\n","<ng-container rtBlock=\"rt-split-button\">\n <!-- Popover висит на всём контроле (а не на узкой каретке): width=\"trigger\"\n делает меню по ширине кнопки, originX:start — ровно под её левым краем,\n без горизонтального вылета за экран. Триггер manual — открывает каретка. -->\n <div\n rtElem=\"control\"\n rtPopoverTrigger=\"manual\"\n rtPopoverWidth=\"trigger\"\n rtPopoverPanelClass=\"rt-split-button-menu-panel\"\n [rtPopover]=\"menuTpl\"\n [rtPopoverOffsetY]=\"6\"\n [rtPopoverDisabled]=\"disabled() || loading()\">\n <button\n rtButton\n rtElem=\"face\"\n qa-dataid=\"split-button-face\"\n type=\"button\"\n [label]=\"label()\"\n [theme]=\"theme()\"\n [size]=\"size()\"\n [attr.aria-label]=\"label()\"\n [loading]=\"loading()\"\n [disabled]=\"disabled()\"\n (click)=\"onFace()\"></button>\n\n <button\n rtButton\n rtElem=\"toggle\"\n qa-dataid=\"split-button-toggle\"\n type=\"button\"\n icon=\"chevron-down\"\n [theme]=\"theme()\"\n [size]=\"size()\"\n [attr.aria-label]=\"menuAriaText()\"\n [disabled]=\"disabled() || loading()\"\n (click)=\"onToggle()\"></button>\n </div>\n\n <ng-template #menuTpl>\n <ul rtElem=\"menu\" qa-dataid=\"split-button-menu\" role=\"menu\">\n @for (item of menuItems(); track item.value) {\n <li role=\"none\">\n <button\n rtButton\n rtElem=\"menu-item\"\n qa-dataid=\"split-button-menu-item\"\n type=\"button\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n role=\"menuitem\"\n [attr.data-value]=\"item.value\"\n [label]=\"item.label\"\n [icon]=\"item.icon ?? null\"\n [attr.aria-label]=\"item.label\"\n [disabled]=\"item.disabled ?? false\"\n (click)=\"onItem(item)\"></button>\n </li>\n }\n </ul>\n </ng-template>\n</ng-container>\n","import { ChangeDetectionStrategy, Component, computed, input, InputSignal, Signal } from '@angular/core';\n\nimport { translateSignal, TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { IRtIcon, RtIconComponent } from '../icon';\nimport { IRtStatTile } from './rt-stat-tile.model';\n\nconst BEM_BLOCK: string = 'rt-stat-tile';\n\n/** Строка дельты в готовом к рендеру виде — вся ветвистость решена здесь. */\ninterface IDeltaRow {\n key: string;\n label: string;\n text: string;\n baseline: string;\n direction: IRtStatTile.Direction;\n icon: IRtIcon.Name;\n}\n\nconst DIRECTION_ICONS: Readonly<Record<IRtStatTile.Direction, IRtIcon.Name>> = Object.freeze({\n up: 'arrow-up',\n down: 'arrow-down',\n flat: 'minus',\n unknown: 'minus',\n});\n\nfunction directionOf(percent: number | null): IRtStatTile.Direction {\n if (percent === null) {\n return 'unknown';\n }\n if (percent > 0) {\n return 'up';\n }\n return percent < 0 ? 'down' : 'flat';\n}\n\n/**\n * Нулевая база — «—»: «+100 %» от нуля вводит в заблуждение, «∞» нечитаемо.\n * Дробная часть — через запятую, как и остальные проценты в интерфейсе: кит\n * форматирует сам, потому что не может зависеть от логики приложений.\n */\nfunction percentText(percent: number | null): string {\n if (percent === null) {\n return '—';\n }\n const sign: string = percent > 0 ? '+' : '';\n return `${sign}${String(percent).replace('.', ',')} %`;\n}\n\nfunction deltaRow(key: string, delta: IRtStatTile.Delta | null): IDeltaRow | null {\n if (!delta) {\n return null;\n }\n const direction: IRtStatTile.Direction = directionOf(delta.percent);\n return {\n key,\n direction,\n label: delta.label,\n text: percentText(delta.percent),\n baseline: delta.baseline ?? '',\n icon: DIRECTION_ICONS[direction],\n };\n}\n\n/**\n * KPI-плитка: крупное значение, необязательная вторичная строка и до двух строк\n * сравнения (к предыдущему периоду и к прошлому году).\n *\n * Компонент ничего не считает и не форматирует: `value` и `baseline` приходят\n * готовыми строками, `percent` — посчитанным числом. Так плитка не знает ни про\n * валюты, ни про методику метрик и остаётся общей для любого домена.\n *\n * Нулевая база показывается как «—»: «+100 %» от нуля вводит в заблуждение, а\n * «∞» нечитаемо.\n */\n@Component({\n selector: 'rt-stat-tile',\n templateUrl: './rt-stat-tile.component.html',\n styleUrl: './rt-stat-tile.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // standalone components / directives\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtStatTileComponent {\n readonly #baselinePrefix: Signal<string> = translateSignal('rtKit.uiBaseline');\n\n /**\n * Дельта к предыдущему периоду — рядом со значением. Пустая база (`percent`\n * = null) не рисуется вовсе: «—» рядом с цифрой читается как поломка, а не\n * как «сравнивать не с чем».\n */\n protected readonly primaryDelta: Signal<IDeltaRow | null> = computed((): IDeltaRow | null => this.#visibleDelta(this.deltaPrimary()));\n\n /** Годовое сравнение — отдельным компактным чипом, без слов в строке. */\n protected readonly yearDelta: Signal<IDeltaRow | null> = computed((): IDeltaRow | null => this.#visibleDelta(this.deltaSecondary()));\n\n /**\n * База сравнения — короткой строкой «было X» и ничем больше: всё остальное\n * (занятость, состав воронки) живёт во вторичной строке, иначе одна плитка\n * растягивает ряд под самую длинную подпись.\n */\n protected readonly baselineText: Signal<string> = computed((): string => {\n const baseline: string | undefined = this.deltaPrimary()?.baseline;\n return baseline ? this.#baselinePrefix().replace('{{value}}', baseline) : '';\n });\n\n /** Подпись метрики. */\n public readonly label: InputSignal<string> = input.required<string>();\n\n /** Уже отформатированное значение — плитка его не преобразует. */\n public readonly value: InputSignal<string> = input.required<string>();\n\n /** Вторичная строка под значением (занятость, доля оценки и т.п.). */\n public readonly secondary: InputSignal<string | null> = input<string | null>(null);\n\n /** Сравнение с предыдущим равным периодом. */\n public readonly deltaPrimary: InputSignal<IRtStatTile.Delta | null> = input<IRtStatTile.Delta | null>(null);\n\n /** Сравнение с тем же периодом год назад. */\n public readonly deltaSecondary: InputSignal<IRtStatTile.Delta | null> = input<IRtStatTile.Delta | null>(null);\n\n /** Пояснение методики — нативный title на иконке подсказки. */\n public readonly hint: InputSignal<string | null> = input<string | null>(null);\n\n #visibleDelta(delta: IRtStatTile.Delta | null): IDeltaRow | null {\n if (!delta || delta.percent === null) {\n return null;\n }\n return deltaRow('primary', delta);\n }\n}\n","<article rtBlock=\"rt-stat-tile\" qa-dataid=\"stat-tile\">\n <header rtElem=\"head\">\n <span rtElem=\"label\" qa-dataid=\"stat-tile-label\">{{ label() }}</span>\n @if (hint(); as hintText) {\n <rt-icon rtElem=\"hint\" qa-dataid=\"stat-tile-hint\" name=\"info-circle\" size=\"xs\" [attr.title]=\"hintText\" />\n }\n </header>\n\n <div rtElem=\"value-row\">\n <p rtElem=\"value\" qa-dataid=\"stat-tile-value\">{{ value() }}</p>\n\n @if (primaryDelta(); as row) {\n <span\n rtElem=\"delta\"\n qa-dataid=\"stat-tile-delta\"\n [attr.data-direction]=\"row.direction\"\n [rtMod]=\"{ direction: row.direction }\"\n [attr.title]=\"row.label\">\n <rt-icon rtElem=\"delta-icon\" size=\"xs\" [name]=\"row.icon\" />\n <span rtElem=\"delta-percent\" qa-dataid=\"stat-tile-delta-percent\">{{ row.text }}</span>\n </span>\n }\n\n @if (yearDelta(); as row) {\n <span\n rtElem=\"year\"\n qa-dataid=\"stat-tile-year\"\n [attr.data-direction]=\"row.direction\"\n [rtMod]=\"{ direction: row.direction }\"\n [attr.title]=\"row.label\">\n {{ 'rtKit.uiYearOverYear' | transloco }} {{ row.text }}\n </span>\n }\n </div>\n\n @if (baselineText(); as text) {\n <p rtElem=\"baseline\" qa-dataid=\"stat-tile-baseline\">{{ text }}</p>\n }\n\n @if (secondary(); as text) {\n <p rtElem=\"secondary\" qa-dataid=\"stat-tile-secondary\">{{ text }}</p>\n }\n</article>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n Signal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { IRtStepper } from './rt-stepper.model';\n\nconst BEM_BLOCK: string = 'rt-stepper';\n\n/**\n * Линейный прогресс-степпер: тонкая полоса, набор точек и подпись\n * текущего шага. Шаги задаются через input `steps` (массив `IRtStepper.Step`\n * со связкой label + description), активный шаг — через `currentIndex`.\n *\n * Активная точка увеличена и подсвечивается янтарным; над ней висит подпись\n * текущего шага (тоже янтарная, выравнивается по краю на крайних шагах).\n * Пройденные точки и заполненная часть полосы — progress-цвет; будущие точки\n * и трек — приглушённый цвет (в dark-теме оба ухода от яркого синего). Под\n * полосой — описание текущего шага, многоабзацное (`\\n\\n`). Сам список названий\n * шагов на ui не выводится — публичен только текущий, остальные читаются\n * скринридером через aria.\n */\n@Component({\n selector: 'rt-stepper',\n templateUrl: './rt-stepper.component.html',\n styleUrl: './rt-stepper.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtStepperComponent {\n protected readonly currentStep: Signal<IRtStepper.Step | null> = computed((): IRtStepper.Step | null => {\n const list: readonly IRtStepper.Step[] = this.steps();\n const idx: number = this.currentIndex();\n return list[idx] ?? null;\n });\n\n /**\n * Доля заполненной полосы от 0 до 100. На один шаг и меньше — 0%, иначе\n * `idx / (total - 1)`. Без clamp в шаблоне получаем переполнение если\n * передадут `currentIndex > total`.\n */\n protected readonly progressPercent: Signal<number> = computed((): number => {\n const total: number = this.steps().length;\n const idx: number = this.currentIndex();\n if (total <= 1) {\n return 0;\n }\n return Math.max(0, Math.min(100, (idx / (total - 1)) * 100));\n });\n\n protected readonly totalSteps: Signal<number> = computed((): number => this.steps().length);\n\n /**\n * Якорь подписи текущего шага: подпись висит над активной точкой и не должна\n * вылезать за края рельсы. Первый шаг — выравнивание по левому краю точки,\n * последний — по правому, остальные центрируются над точкой.\n */\n protected readonly labelAnchor: Signal<'start' | 'center' | 'end'> = computed((): 'start' | 'center' | 'end' => {\n const total: number = this.steps().length;\n const idx: number = this.currentIndex();\n if (idx <= 0) {\n return 'start';\n }\n if (idx >= total - 1) {\n return 'end';\n }\n return 'center';\n });\n\n /** Абзацы описания текущего шага: бэк отдаёт плоскую строку, делим по `\\n\\n`. */\n protected readonly descriptionParagraphs: Signal<readonly string[]> = computed((): readonly string[] => {\n const text: string = this.currentStep()?.description ?? '';\n if (text.length === 0) {\n return [];\n }\n return text.split('\\n\\n');\n });\n\n public readonly steps: InputSignal<readonly IRtStepper.Step[]> = input<readonly IRtStepper.Step[]>([]);\n\n public readonly currentIndex: InputSignalWithTransform<number, number | string> = input<number, number | string>(0, {\n transform: numberAttribute,\n });\n}\n","@let current = currentStep();\n<div\n rtBlock=\"rt-stepper\"\n qa-dataid=\"stepper\"\n role=\"progressbar\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"totalSteps()\"\n [attr.aria-valuenow]=\"currentIndex() + 1\"\n [attr.aria-valuetext]=\"current?.label ?? null\">\n <div rtElem=\"rail\">\n @if (current) {\n <p rtElem=\"label\" qa-dataid=\"stepper-label\" [rtMod]=\"{ anchor: labelAnchor() }\" [style.left.%]=\"progressPercent()\">\n {{ current.label }}\n </p>\n }\n <div rtElem=\"track-band\">\n <span rtElem=\"track\" aria-hidden=\"true\"></span>\n <span rtElem=\"progress\" qa-dataid=\"stepper-progress\" aria-hidden=\"true\" [style.width.%]=\"progressPercent()\"></span>\n <ul rtElem=\"points\">\n @for (step of steps(); track $index; let i = $index) {\n <li\n rtElem=\"point\"\n qa-dataid=\"stepper-point\"\n aria-hidden=\"true\"\n [rtMod]=\"{\n current: i === currentIndex(),\n complete: i < currentIndex(),\n }\"></li>\n }\n </ul>\n </div>\n </div>\n @for (paragraph of descriptionParagraphs(); track $index) {\n <p rtElem=\"description\" qa-dataid=\"stepper-description\">{{ paragraph }}</p>\n }\n</div>\n","import { Clipboard } from '@angular/cdk/clipboard';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n signal,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtIconButtonComponent } from '../../icon-button/rt-icon-button.component';\nimport { IRtIconButton } from '../../icon-button/rt-icon-button.model';\nimport { IRtIcon } from '../../icon/rt-icon.model';\n\nconst BEM_BLOCK: string = 'rt-copy-cell';\n\n/** Значение для буфера: явная строка/число либо `null` (тогда берётся отображаемый текст). */\ntype ICopyValue = string | number | null;\n\n/**\n * Ключи подписей действия в покое и после копирования (tooltip и aria-label).\n *\n * Здесь ключи, а не готовый текст: константа вычисляется при загрузке чанка,\n * когда язык страницы ещё не выбран, — переводит сам компонент.\n */\nconst COPY_KEY: string = 'rtKit.uiCopy';\nconst COPIED_KEY: string = 'rtKit.uiCopied';\n\n/** Сколько держать состояние «скопировано» перед сбросом иконки/подписи. */\nconst RESET_DELAY_MS: number = 2000;\n\n/**\n * Ячейка с копированием в буфер — переиспользуемый примитив для `cdkCellDef`\n * (и не только). rt-table projection-driven: контент ячейки пишет\n * потребитель, поэтому копирование оформлено отдельным cell-level компонентом,\n * а не флагом на конфиге колонки.\n *\n * Потребитель проецирует отображаемый контент через `<ng-content>`. Что уйдёт в\n * буфер:\n * - если задан `[value]` — ровно он (нужно когда копируемое отличается от\n * отображаемого: для id-ячейки показываем `#123`, копируем `123`);\n * - если `[value]` не задан — берётся отображаемый текст (textContent\n * проецируемого контента, схлопнутые пробелы) — «копировать как показано»,\n * удобно для составных ячеек (`#7 — Имя`).\n *\n * По умолчанию кнопка скрыта и проявляется при наведении/фокусе (для плотных\n * таблиц). Вне таблиц (модалки, карточки) строки для hover нет — там\n * `revealOnHover=\"false\"` держит кнопку всегда видимой. Палитра кнопки —\n * через `variant` (по умолчанию `ghost`). После клика на `RESET_DELAY_MS`\n * иконка меняется `copy`→`check`, подпись — на «Скопировано».\n */\n@Component({\n selector: 'rt-copy-cell',\n templateUrl: './rt-copy-cell.component.html',\n styleUrls: ['./rt-copy-cell.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-copy-cell--static]': '!revealOnHover()',\n },\n})\nexport class RtCopyCellComponent {\n readonly #clipboard: Clipboard = inject(Clipboard);\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n\n #resetTimer: ReturnType<typeof setTimeout> | null = null;\n\n readonly #copyLabel: Signal<string> = translateSignal(COPY_KEY);\n readonly #copiedLabel: Signal<string> = translateSignal(COPIED_KEY);\n\n protected readonly copied: WritableSignal<boolean> = signal(false);\n\n protected readonly iconName: Signal<IRtIcon.Name> = computed((): IRtIcon.Name => (this.copied() ? 'check' : 'copy'));\n\n protected readonly actionLabel: Signal<string> = computed((): string => (this.copied() ? this.#copiedLabel() : this.#copyLabel()));\n\n /**\n * Строка для буфера. Если не задана — копируется отображаемый текст\n * (textContent проецируемого контента). Число приводится к строке.\n */\n public readonly value: InputSignal<ICopyValue> = input<ICopyValue>(null);\n\n /** Палитра кнопки копирования. В таблицах — `ghost`; вне таблиц удобнее `secondary`. */\n public readonly variant: InputSignal<IRtIconButton.Variant> = input<IRtIconButton.Variant>('ghost');\n\n /**\n * Прятать кнопку до наведения/фокуса (поведение плотных таблиц). `false` —\n * кнопка всегда видима: нужно вне таблиц (модалки/карточки), где нет строки\n * для hover.\n */\n public readonly revealOnHover: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n constructor() {\n this.#destroyRef.onDestroy((): void => this.#clearTimer());\n }\n\n protected onCopy(event: MouseEvent): void {\n // Гасим всплытие, чтобы клик/Enter по кнопке не активировал кликабельную\n // строку (rtTableRow) и не дошёл до прочих row-level слушателей.\n event.stopPropagation();\n\n this.#clipboard.copy(this.#resolveText());\n this.copied.set(true);\n\n this.#clearTimer();\n this.#resetTimer = setTimeout((): void => this.copied.set(false), RESET_DELAY_MS);\n }\n\n /** Явный `value` приоритетнее; иначе — отображаемый текст со схлопнутыми пробелами. */\n #resolveText(): string {\n const explicit: ICopyValue = this.value();\n if (explicit !== null) {\n return String(explicit);\n }\n\n const content: Element | null = this.#host.nativeElement.querySelector(`.${BEM_BLOCK}__content`);\n return (content?.textContent ?? '').replace(/\\s+/g, ' ').trim();\n }\n\n #clearTimer(): void {\n if (this.#resetTimer !== null) {\n clearTimeout(this.#resetTimer);\n this.#resetTimer = null;\n }\n }\n}\n","<ng-container rtBlock=\"rt-copy-cell\">\n <span rtElem=\"content\" qa-dataid=\"copy-cell-content\"><ng-content /></span>\n <rt-icon-button\n rtElem=\"button\"\n qa-dataid=\"copy-cell-button\"\n size=\"sm\"\n [icon]=\"iconName()\"\n [variant]=\"variant()\"\n [ariaLabel]=\"actionLabel()\"\n [tooltip]=\"actionLabel()\"\n (clicked)=\"onCopy($event)\" />\n</ng-container>\n","import { LIST_SORT_ORDER_ENUM, ListSortOrderType, ISortModel } from '@rt-tools/utils';\n\nimport { IRtTable } from './rt-table.model';\n\n/** Значение атрибута `aria-sort` заголовка: направление либо его отсутствие. */\nexport type IRtTableAriaSort = 'ascending' | 'descending' | 'none';\n\n/**\n * Следующее состояние сортировки при нажатии на заголовок колонки.\n *\n * Порядок кругов: по возрастанию → по убыванию → без сортировки. Третье состояние\n * нужно, чтобы пользователь мог вернуть исходный порядок, не перезагружая список.\n */\nexport function nextSort(current: ISortModel<string> | null, propertyName: string): ISortModel<string> | null {\n if (current === null || current.propertyName !== propertyName) {\n return { propertyName, sortDirection: LIST_SORT_ORDER_ENUM.ASC };\n }\n if (current.sortDirection === LIST_SORT_ORDER_ENUM.ASC) {\n return { propertyName, sortDirection: LIST_SORT_ORDER_ENUM.DESC };\n }\n\n return null;\n}\n\n/** Направление сортировки по этой колонке либо `null`, когда сортирует другая. */\nexport function sortDirectionOf(current: ISortModel<string> | null, propertyName: string): ListSortOrderType | null {\n return current !== null && current.propertyName === propertyName ? current.sortDirection : null;\n}\n\n/** Значение `aria-sort` заголовка: направление читается скринридером с самой колонки. */\nexport function ariaSortOf(current: ISortModel<string> | null, propertyName: string): IRtTableAriaSort {\n const direction: ListSortOrderType | null = sortDirectionOf(current, propertyName);\n if (direction === null) {\n return 'none';\n }\n\n return direction === LIST_SORT_ORDER_ENUM.ASC ? 'ascending' : 'descending';\n}\n\n/**\n * Сортируется ли колонка. Колонка, описанная в `columnsConfig`, сортируется только\n * по своему признаку; колонки, которой в конфиге нет, метаданных взять неоткуда —\n * объявлением служит сам заголовок.\n */\nexport function isColumnSortable(config: ReadonlyArray<IRtTable.ColumnConfig>, key: string): boolean {\n const column: IRtTable.ColumnConfig | undefined = config.find((candidate: IRtTable.ColumnConfig): boolean => candidate.key === key);\n\n return column === undefined ? true : column.sortable === true;\n}\n","import { Directive, inject, input, InputSignal, TemplateRef } from '@angular/core';\n\n/**\n * Контекст шаблона `[rtTableCard]`: `$implicit` — строка таблицы.\n */\nexport interface IRtTableCardContext<TRow> {\n $implicit: TRow;\n}\n\n/**\n * Захватывает `<ng-template rtTableCard let-row>` — кастомную разметку карточки\n * строки для мобильного (узкого) режима `rt-table`. Когда задан, rt-table на\n * узком экране (≤1080px) рендерит эту разметку в `<article>` вместо\n * авто-карточки «label: value» по колонкам.\n *\n * Escape-hatch для страниц, которым нужна rich-карточка (составной primary-блок,\n * теги, произвольная раскладка), а не построчный список полей.\n *\n * @example\n * ```html\n * <rt-table #t=\"rtTable\" [dataSource]=\"rows\" ...>\n * ...колонки...\n * <ng-template rtTableCard [rtTableCardRowType]=\"rows\" let-row>\n * <div class=\"my-card-head\">{{ row.login }}</div>\n * </ng-template>\n * <tr cdk-row *cdkRowDef=\"let row; columns: t.displayedColumns()\"></tr>\n * </rt-table>\n * ```\n */\n@Directive({\n selector: 'ng-template[rtTableCard]',\n})\nexport class RtTableCardDirective<TRow = unknown> {\n public readonly template: TemplateRef<IRtTableCardContext<TRow>> = inject<TemplateRef<IRtTableCardContext<TRow>>>(TemplateRef);\n\n /**\n * Type-carrier для вывода `TRow`: биндят тот же массив, что в `dataSource`.\n * Значение в рантайме не читается — служит только подсказкой типизации для\n * `let-row` (через `ngTemplateContextGuard`).\n */\n public readonly rtTableCardRowType: InputSignal<readonly TRow[]> = input<readonly TRow[]>([]);\n\n /** Type-guard: сужает контекст шаблона до строки таблицы при проверке шаблонов. */\n public static ngTemplateContextGuard<TRow>(\n _directive: RtTableCardDirective<TRow>,\n context: unknown\n ): context is IRtTableCardContext<TRow> {\n return true;\n }\n}\n","import { Directive, inject, input, InputSignal, TemplateRef } from '@angular/core';\n\n/**\n * Контекст шаблона `[rtTableRowActions]`: `$implicit` — строка таблицы.\n */\nexport interface IRtTableRowActionsContext<TRow> {\n $implicit: TRow;\n}\n\n/**\n * Захватывает `<ng-template rtTableRowActions let-row>` — содержимое «…»-меню\n * действий строки. `rt-table` (`[showRowActions]`) рендерит этот шаблон в конце\n * каждой строки внутри `rt-menu`, прокидывая строку через `$implicit`.\n *\n * Тип `let-row` выводится из `[rtTableRowActionsRowType]` (передаётся тот же\n * массив, что в `dataSource`) — type-carrier, как `*ngFor` выводит тип из\n * `ngForOf`. В рантайме значение не используется.\n *\n * @example\n * ```html\n * <rt-table #t=\"rtTable\" [columns]=\"cols\" [showRowActions]=\"true\" [dataSource]=\"rows\" ...>\n * ...колонки...\n * <ng-template rtTableRowActions [rtTableRowActionsRowType]=\"rows\" let-row>\n * <rt-menu-item icon=\"ico-edit\" label=\"Редактировать\" (selected)=\"edit(row)\" />\n * </ng-template>\n * <tr cdk-header-row *cdkHeaderRowDef=\"t.displayedColumns()\"></tr>\n * <tr cdk-row *cdkRowDef=\"let row; columns: t.displayedColumns()\"></tr>\n * </rt-table>\n * ```\n */\n@Directive({\n selector: 'ng-template[rtTableRowActions]',\n})\nexport class RtTableRowActionsDirective<TRow = unknown> {\n public readonly template: TemplateRef<IRtTableRowActionsContext<TRow>> =\n inject<TemplateRef<IRtTableRowActionsContext<TRow>>>(TemplateRef);\n\n /**\n * Type-carrier для вывода `TRow`: биндят тот же массив, что в `dataSource`.\n * Значение в рантайме не читается — служит только подсказкой типизации для\n * `let-row` (через `ngTemplateContextGuard`). Имя совпадает с binding'ом —\n * без alias, чтобы не триггерить `no-input-rename`.\n */\n public readonly rtTableRowActionsRowType: InputSignal<readonly TRow[]> = input<readonly TRow[]>([]);\n\n /** Type-guard: сужает контекст шаблона до строки таблицы при проверке шаблонов. */\n public static ngTemplateContextGuard<TRow>(\n _directive: RtTableRowActionsDirective<TRow>,\n context: unknown\n ): context is IRtTableRowActionsContext<TRow> {\n return true;\n }\n}\n","import { IRtTable } from './rt-table.model';\n\n/**\n * Есть ли у строки хотя бы одно доступное действие.\n *\n * Признак приходит предикатом от экрана, а не подсчётом отрисованных пунктов меню:\n * содержимое спроецированного шаблона известно только после отрисовки, и кнопка\n * успевала бы мигнуть на первом кадре.\n *\n * Предикат не задан — у строки есть действия: экран, который ничего не гейтит,\n * показывает кнопку меню, как и раньше.\n */\nexport function rowHasAvailableActions<TRow>(row: TRow, hasActions: IRtTable.RowActionsPredicate<TRow> | null): boolean {\n return hasActions === null ? true : hasActions(row);\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { rowHasAvailableActions } from './rt-table-row-actions.logic';\nimport { IRtTable } from './rt-table.model';\n\n/**\n * Есть ли у строки доступные действия — гейт кнопки «…» в ячейке действий.\n *\n * Pure-pipe: пересчитывается только при смене строки или предиката, а не на каждом\n * цикле проверки. Значение приходит из контекста шаблона (строка таблицы), поэтому\n * `computed()` здесь неприменим.\n */\n@Pipe({ name: 'rtRowHasActions' })\nexport class RtRowHasActionsPipe implements PipeTransform {\n public transform<TRow>(row: TRow, hasActions: IRtTable.RowActionsPredicate<TRow> | null): boolean {\n return rowHasAvailableActions(row, hasActions);\n }\n}\n","import { computed, Injectable, Signal, signal, WritableSignal } from '@angular/core';\n\nimport { IRtTable } from './rt-table.model';\n\n/**\n * Регистрация настраиваемой таблицы в реестре: её текущие/дефолтные колонки\n * (сигналы) + callback применения новых настроек (применяет к таблице и\n * персистит). Заполняется самой `rt-table`, читается route-асайдом настроек.\n */\nexport interface IRtTableSettingsRegistration {\n columns: Signal<ReadonlyArray<IRtTable.ColumnSettingItem>>;\n defaults: Signal<ReadonlyArray<IRtTable.ColumnSettingItem>>;\n apply: (settings: IRtTable.ColumnSettings) => void;\n}\n\n/**\n * Реестр настраиваемых таблиц — мост между `rt-table` (shared UI) и route-асайдом\n * настроек колонок, которые живут в разных ветках дерева и не видят друг друга\n * напрямую. `rt-table` регистрируется по `tableId` на init, снимается на destroy;\n * асайд читает регистрацию активной таблицы (`active()` выставляется при открытии).\n *\n * Реестр реактивный (`Map` живёт в сигнале): при F5 route-асайд инициализируется\n * раньше `rt-table`, и синхронный промах по пустому реестру не должен быть\n * финальным — асайд дожидается регистрации через `effect` (фикс F-16).\n */\n@Injectable({ providedIn: 'root' })\nexport class RtTableSettingsRegistry {\n readonly #registrations: WritableSignal<ReadonlyMap<string, IRtTableSettingsRegistration>> = signal<\n ReadonlyMap<string, IRtTableSettingsRegistration>\n >(new Map<string, IRtTableSettingsRegistration>());\n\n readonly #active: WritableSignal<string | null> = signal<string | null>(null);\n\n /** Id таблицы, чьи настройки сейчас открыты в асайде (или `null`). */\n public readonly active: Signal<string | null> = this.#active.asReadonly();\n\n /**\n * Id единственной зарегистрированной таблицы (или `null`, если их 0 или >1).\n * Нужен асайду для восстановления `active` после F5: сервис пересоздан,\n * `setActive` никто не звал, но открытая страница регистрирует ровно\n * одну настраиваемую таблицу.\n */\n public readonly soleTableId: Signal<string | null> = computed((): string | null => {\n const registrations: ReadonlyMap<string, IRtTableSettingsRegistration> = this.#registrations();\n if (registrations.size !== 1) {\n return null;\n }\n const first: string | undefined = registrations.keys().next().value;\n return first ?? null;\n });\n\n public register(tableId: string, registration: IRtTableSettingsRegistration): void {\n this.#registrations.update(\n (current: ReadonlyMap<string, IRtTableSettingsRegistration>): ReadonlyMap<string, IRtTableSettingsRegistration> => {\n const next: Map<string, IRtTableSettingsRegistration> = new Map(current);\n next.set(tableId, registration);\n return next;\n }\n );\n }\n\n public unregister(tableId: string): void {\n this.#registrations.update(\n (current: ReadonlyMap<string, IRtTableSettingsRegistration>): ReadonlyMap<string, IRtTableSettingsRegistration> => {\n const next: Map<string, IRtTableSettingsRegistration> = new Map(current);\n next.delete(tableId);\n return next;\n }\n );\n if (this.#active() === tableId) {\n this.#active.set(null);\n }\n }\n\n /** Реактивная регистрация таблицы: `null`, пока таблица не зарегистрировалась. */\n public get(tableId: string): Signal<IRtTableSettingsRegistration | null> {\n return computed((): IRtTableSettingsRegistration | null => this.#registrations().get(tableId) ?? null);\n }\n\n public setActive(tableId: string): void {\n this.#active.set(tableId);\n }\n\n public clearActive(): void {\n this.#active.set(null);\n }\n}\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n CDK_TABLE,\n CdkCell,\n CdkCellDef,\n CdkColumnDef,\n CdkHeaderCell,\n CdkHeaderCellDef,\n CdkTable,\n CdkTableDataSourceInput,\n DataRowOutlet,\n FooterRowOutlet,\n HeaderRowOutlet,\n NoDataRowOutlet,\n} from '@angular/cdk/table';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n forwardRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n linkedSignal,\n numberAttribute,\n output,\n OutputEmitterRef,\n signal,\n Signal,\n TemplateRef,\n ViewChild,\n WritableSignal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { mergeMap, Observable, Subject } from 'rxjs';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, IDBStorageService, ModDirective } from '@rt-tools/core';\nimport { ISortModel } from '@rt-tools/utils';\n\nimport { BreakpointsService } from '../../platform';\nimport { ERtStorageKeys } from '../../platform';\n\nimport { RtEmptyStateComponent } from '../empty-state/rt-empty-state.component';\nimport { IRtIcon } from '../icon/rt-icon.model';\nimport { RtMenuComponent } from '../menu/rt-menu.component';\nimport { RtSkeletonComponent } from '../skeleton/rt-skeleton.component';\nimport { RtSpinnerComponent } from '../spinner/rt-spinner.component';\nimport { RtTableCardDirective, IRtTableCardContext } from './rt-table-card.directive';\nimport { RtTableRowActionsDirective } from './rt-table-row-actions.directive';\nimport { RtRowHasActionsPipe } from './rt-table-row-actions.pipe';\nimport { RtTableSettingsRegistry, type IRtTableSettingsRegistration } from './rt-table-settings.registry';\nimport { nextSort } from './rt-table-sort.logic';\nimport { IRtTable } from './rt-table.model';\n\nconst BEM_BLOCK: string = 'rt-table';\n\n/** Ключ настроек одной таблицы в IndexedDB. */\nfunction settingsKey(tableId: string): string {\n return `${ERtStorageKeys.TableColumnsPrefix}${tableId}`;\n}\n\nconst DEFAULT_SKELETON_ROWS: number = 5;\n/** Ключ подписи пустой таблицы: язык известен только после старта приложения */\nconst DEFAULT_EMPTY_KEY: string = 'rtKit.uiNoRows';\n\n/** Имя внутренней «…»-колонки действий, добавляемой при `[showRowActions]`. */\nexport const RT_TABLE_ROW_ACTIONS_COLUMN: string = 'rtRowActions';\n\n/**\n * Описатель поля авто-карточки мобильного режима: лейбл колонки (из `columnsConfig`)\n * + её cell-шаблон (`cdkColumnDef`.cell), который рендерится в значение через\n * `ngTemplateOutlet` с контекстом `{ $implicit: row }`.\n */\ninterface IRtTableCardColumn<TRow> {\n key: string;\n label: string;\n cell: TemplateRef<IRtTableCardContext<TRow>>;\n}\n\n/** Запрос на персист настроек колонок — payload конструкторного стрима записи через порт. */\ninterface IRtTablePersistRequest {\n tableId: string;\n settings: IRtTable.ColumnSettings;\n}\n\n/**\n * Таблица — стилизованная обёртка над `cdk-table` (`@angular/cdk/table`).\n *\n * Селектор работает и как element (`<rt-table>`), и как attribute на native\n * `<table rt-table>`. Native-вариант предпочтительнее — даёт правильную\n * table-семантику для скрин-ридеров. Loading/empty/skeleton overlays\n * требуют `<rt-table>` element selector (overlay-divs не валидны как дети\n * `<table>`).\n *\n * Состояния рендера (по комбинации `[loading]` + `[fetching]` + `dataSource.length`):\n *\n * - `loading && data=[]` → header row + N skeleton `<tr>` (по `[columns]`).\n * - `fetching && data=[...]` → existing rows + sticky overlay с rt-spinner поверх.\n * - `!loading && !fetching && data=[]` → empty placeholder (ContentChild\n * `#rtTableEmpty` template или default `<rt-empty-state>` по `emptyMessage`/`emptyIcon`).\n * - `!loading && !fetching && data=[...]` → обычный рендер CDK row-outlet'ов.\n *\n * Sticky overlay использует `position: sticky` относительно ближайшего\n * scroll-container ancestor'а (обычно page-level `rtElem=\"table-scroll\"` wrapper).\n * Spinner внутри overlay flex-центрирован → всегда в middle viewport.\n *\n * Skeleton rows читают `[columns]` input — массив имён колонок (тот же что в\n * `*cdkRowDef=\"let row; columns: ...\"`). Auto-detect через CDK internals не\n * используется — explicit input проще и testable.\n */\n@Component({\n selector: 'rt-table, table[rt-table]',\n exportAs: 'rtTable',\n templateUrl: './rt-table.component.html',\n styleUrl: './rt-table.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // @angular/cdk\n CdkCell,\n CdkCellDef,\n CdkColumnDef,\n CdkHeaderCell,\n CdkHeaderCellDef,\n DataRowOutlet,\n FooterRowOutlet,\n HeaderRowOutlet,\n NoDataRowOutlet,\n\n // @angular/common\n NgTemplateOutlet,\n\n // standalone components / directives\n RtEmptyStateComponent,\n RtMenuComponent,\n RtSkeletonComponent,\n RtSpinnerComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n\n // pipes\n RtRowHasActionsPipe,\n ],\n providers: [\n {\n provide: CDK_TABLE,\n useExisting: forwardRef((): typeof RtTableComponent => RtTableComponent),\n },\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-table--density--compact]': \"density() === 'compact'\",\n '[class.rt-table--clickable]': 'clickable()',\n '[class.rt-table--loading]': 'isInitialLoading()',\n '[class.rt-table--fetching]': 'fetching()',\n '[class.rt-table--empty]': 'isEmpty()',\n '[class.rt-table--cards]': 'showCards()',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-busy]': \"isInitialLoading() || fetching() ? 'true' : null\",\n },\n})\nexport class RtTableComponent<TRow> extends CdkTable<TRow> {\n readonly #t_uiNoRows: Signal<string> = translateSignal(DEFAULT_EMPTY_KEY);\n\n readonly #registry: RtTableSettingsRegistry = inject(RtTableSettingsRegistry);\n readonly #settingsStorage: IDBStorageService<IRtTable.ColumnSettings> = inject(IDBStorageService);\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n readonly #breakpoints: BreakpointsService = inject(BreakpointsService);\n\n readonly #dataSourceVersion: WritableSignal<number> = signal<number>(0);\n\n /**\n * Выбранная сортировка. Заводится от входа `[sort]` и переключается заголовками:\n * таблица показывает порядок и без потребителя, который его слушает.\n */\n readonly #sort: WritableSignal<ISortModel<string> | null> = linkedSignal<ISortModel<string> | null>((): ISortModel<string> | null =>\n this.sort()\n );\n\n readonly #persistSettingsSource: Subject<IRtTablePersistRequest> = new Subject<IRtTablePersistRequest>();\n\n /**\n * Пользовательские настройки колонок (порядок + скрытые), применённые поверх\n * `[columnsConfig]`. `null` — используются дефолты из конфига. Мутируется из\n * панели настроек через `applyColumnSettings()`.\n */\n readonly #columnSettings: WritableSignal<IRtTable.ColumnSettings | null> = signal<IRtTable.ColumnSettings | null>(null);\n\n /**\n * Дефолтные колонки из конфига (порядок массива + `config.hidden`), без применённых\n * пользовательских настроек — источник для кнопки «Сбросить» в панели.\n */\n readonly #defaultColumns: Signal<ReadonlyArray<IRtTable.ColumnSettingItem>> = computed((): ReadonlyArray<IRtTable.ColumnSettingItem> =>\n this.columnsConfig().map((c: IRtTable.ColumnConfig): IRtTable.ColumnSettingItem => ({\n ...c,\n hidden: c.locked === true ? false : c.hidden === true,\n }))\n );\n\n /** tableId для персиста настроек (ключ порта). `null` — таблица не настраиваемая (нет tableId/config). */\n readonly #persistableTableId: Signal<string | null> = computed((): string | null => {\n const id: string | null = this.tableId();\n return id !== null && this.columnsConfig().length > 0 ? id : null;\n });\n\n /**\n * Внутренняя «…»-колонка действий объявлена в шаблоне rt-table (view) и\n * регистрируется в CdkTable вручную (`addColumnDef`) в `ngOnInit` — так же,\n * как это делает CDK-шный `CdkTextColumn`. Статический `@ViewChild` нужен,\n * чтобы колонка попала в реестр ДО первого рендера строк (signal-query\n * резолвится слишком поздно). Не `#private`: декоратор требует ключевое\n * слово `private`.\n */\n @ViewChild(CdkColumnDef, { static: true })\n private readonly actionsColumnDef?: CdkColumnDef;\n\n /**\n * Cell/header-def'ы «…»-колонки. Присваиваем их `columnDef` вручную в\n * `ngOnInit` (как `CdkTextColumn`), потому что собственный ContentChild\n * `CdkColumnDef` ещё не отработал к моменту первого рендера view-колонки —\n * без ручного присвоения CdkTable падает на `extractCellTemplate`.\n */\n @ViewChild(CdkCellDef, { static: true })\n private readonly actionsCellDef?: CdkCellDef;\n\n @ViewChild(CdkHeaderCellDef, { static: true })\n private readonly actionsHeaderCellDef?: CdkHeaderCellDef;\n\n /** `true` когда initial-load в полёте и entities ещё нет — рендерим skeleton rows. */\n protected readonly isInitialLoading: Signal<boolean> = computed((): boolean => this.loading() && this.#hasData() === false);\n\n /** `true` когда загрузка завершена и entities пустые — рендерим empty placeholder. */\n protected readonly isEmpty: Signal<boolean> = computed((): boolean => !this.loading() && !this.fetching() && this.#hasData() === false);\n\n /** Массив для `@for` — числа от 0 до skeletonRows-1, рендерим placeholder-rows. */\n protected readonly skeletonRowIndexes: Signal<ReadonlyArray<number>> = computed((): ReadonlyArray<number> =>\n Array.from({ length: this.skeletonRows() }, (_: unknown, i: number) => i)\n );\n\n /** Шаблон содержимого «…»-меню действий строки (`<ng-template rtTableRowActions>`). */\n protected readonly rowActions: Signal<RtTableRowActionsDirective | undefined> = contentChild(RtTableRowActionsDirective);\n\n /** Кастомный шаблон карточки мобильного режима (`<ng-template rtTableCard>`). Опционален. */\n protected readonly cardTemplate: Signal<RtTableCardDirective | undefined> = contentChild(RtTableCardDirective);\n\n /**\n * Все проецируемые потребителем `cdkColumnDef` — источник cell-шаблонов для\n * авто-карточек. «…»-колонка действий объявлена во view rt-table, поэтому в\n * этот content-query не попадает.\n */\n protected readonly columnDefs: Signal<ReadonlyArray<CdkColumnDef>> = contentChildren(CdkColumnDef, { descendants: true });\n\n /** Узкий вьюпорт (≤1080px): таблица прячется, строки рендерятся карточками. */\n protected readonly isNarrow: Signal<boolean> = this.#breakpoints.narrow;\n\n /** Карточки показываются только когда card-режим включён (`[cards]`) и экран узкий. */\n protected readonly showCards: Signal<boolean> = computed((): boolean => this.cards() && this.isNarrow());\n\n /**\n * Строки для card-рендера. CdkTable хранит `dataSource` как array | Observable |\n * DataSource — карточки строим только для массива (client-side pattern);\n * для остальных типов пусто (карточки не поддерживаются). `#dataSourceVersion`\n * инвалидирует computed при смене источника.\n */\n protected readonly cardRows: Signal<ReadonlyArray<TRow>> = computed((): ReadonlyArray<TRow> => {\n this.#dataSourceVersion();\n const ds: unknown = this.dataSource;\n return Array.isArray(ds) ? (ds as ReadonlyArray<TRow>) : [];\n });\n\n /**\n * Поля авто-карточки: видимые колонки (кроме «…»-действий) с лейблом из\n * `columnsConfig` (fallback — ключ колонки) и cell-шаблоном из `cdkColumnDef`.\n * Колонки без cell-шаблона пропускаются.\n */\n protected readonly cardColumns: Signal<ReadonlyArray<IRtTableCardColumn<TRow>>> = computed(\n (): ReadonlyArray<IRtTableCardColumn<TRow>> => {\n const defsByName: Map<string, CdkColumnDef> = new Map(\n this.columnDefs().map((d: CdkColumnDef): [string, CdkColumnDef] => [d.name, d])\n );\n const labelByKey: Map<string, string> = new Map(\n this.columnsConfig().map((c: IRtTable.ColumnConfig): [string, string] => [c.key, c.label])\n );\n\n return this.displayedColumns()\n .filter((key: string): boolean => key !== RT_TABLE_ROW_ACTIONS_COLUMN)\n .map((key: string): IRtTableCardColumn<TRow> | null => {\n const cell: TemplateRef<IRtTableCardContext<TRow>> | undefined = defsByName.get(key)?.cell?.template;\n if (cell === undefined) {\n return null;\n }\n return { key, cell, label: labelByKey.get(key) ?? key };\n })\n .filter((c: IRtTableCardColumn<TRow> | null): c is IRtTableCardColumn<TRow> => c !== null);\n }\n );\n\n /** ContentChild template для кастом empty-placeholder'а. Опционален; fallback — emptyMessage. */\n public readonly emptyTemplate: Signal<TemplateRef<unknown> | undefined> = contentChild('rtTableEmpty', { read: TemplateRef });\n\n /** ARIA-label корневого `<table>` (или `<rt-table>` элемента). */\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n /** Плотность: `\"compact\"` уменьшает padding и высоту ячеек. */\n public readonly density: InputSignal<IRtTable.Density> = input<IRtTable.Density>('default');\n\n /**\n * Мобильный card-режим на узком экране (≤1080px): таблица рендерится списком\n * карточек «поле: значение». Включён по умолчанию для всех списков. Отключать\n * (`[cards]=\"false\"`) для не-списочных таблиц — например, key-value quote-таблицы\n * внутри асайда, где карточки дублируют смысл.\n */\n public readonly cards: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /**\n * Строки кликабельны (открывают деталь/асайд). Включает визуальный аффорданс\n * (cursor/focus-ring); саму активацию + a11y обеспечивает директива\n * `rtTableRow` на `<tr cdk-row>`.\n */\n public readonly clickable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Initial-load в полёте. При `true` + пустых entities рендерит skeleton rows. */\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Re-fetch в полёте. При `true` рисует sticky overlay c rt-spinner поверх существующих rows. */\n public readonly fetching: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Имена колонок (тот же массив что в `*cdkRowDef columns: ...`). Нужен для skeleton row layout. */\n public readonly columns: InputSignal<ReadonlyArray<string>> = input<ReadonlyArray<string>>([]);\n\n /**\n * Метаданные колонок для настраиваемой таблицы: `[{key,label,hidden?,locked?}]`.\n * Когда задан — `displayedColumns()` вычисляется из него с учётом настроек\n * (видимость + порядок), а таблица получает панель настроек (при заданном `[tableId]`).\n * Пуст — таблица работает по legacy `[columns]` без панели.\n */\n public readonly columnsConfig: InputSignal<ReadonlyArray<IRtTable.ColumnConfig>> = input<ReadonlyArray<IRtTable.ColumnConfig>>([]);\n\n /**\n * Идентификатор таблицы для персиста настроек колонок (ключ в IndexedDB).\n * Без него панель настроек недоступна (`canConfigure()` = false).\n */\n public readonly tableId: InputSignal<string | null> = input<string | null>(null);\n\n /**\n * Добавляет в конец строки «…»-колонку действий (`rt-menu`). Содержимое меню —\n * через `<ng-template rtTableRowActions let-row>`; колонку нужно подключить\n * в row-def'ах через `displayedColumns()`.\n */\n public readonly showRowActions: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /**\n * Есть ли у строки доступные действия. Строка, которой нельзя сделать ничего,\n * кнопки «…» не показывает вовсе. Экран заполняет тем же признаком, которым\n * гейтит пункты меню; `null` — у всех строк действия есть.\n */\n public readonly rowHasActions: InputSignal<IRtTable.RowActionsPredicate<TRow> | null> =\n input<IRtTable.RowActionsPredicate<TRow> | null>(null);\n\n /** Выбранная сортировка: `null` — порядок задаёт источник данных. */\n public readonly sort: InputSignal<ISortModel<string> | null> = input<ISortModel<string> | null>(null);\n\n /** Пользователь переключил порядок заголовком. Саму выборку делает потребитель. */\n public readonly sortChange: OutputEmitterRef<ISortModel<string> | null> = output<ISortModel<string> | null>();\n\n /** Текущая сортировка — её читают заголовки колонок (`rtSortHeader`). */\n public readonly currentSort: Signal<ISortModel<string> | null> = this.#sort.asReadonly();\n\n /**\n * Разрешённые колонки настраиваемой таблицы: `[columnsConfig]` в применённом\n * порядке, с текущим флагом `hidden` (locked всегда видимы). Панель настроек\n * читает этот список для отрисовки; из него же строится `displayedColumns()`.\n * Пустой при отсутствии `[columnsConfig]` (legacy-режим).\n */\n public readonly resolvedColumns: Signal<ReadonlyArray<IRtTable.ColumnSettingItem>> = computed(\n (): ReadonlyArray<IRtTable.ColumnSettingItem> => {\n const config: ReadonlyArray<IRtTable.ColumnConfig> = this.columnsConfig();\n if (config.length === 0) {\n return [];\n }\n\n const settings: IRtTable.ColumnSettings | null = this.#columnSettings();\n const byKey: Map<string, IRtTable.ColumnConfig> = new Map(\n config.map((c: IRtTable.ColumnConfig): [string, IRtTable.ColumnConfig] => [c.key, c])\n );\n\n // Порядок: сохранённый из настроек, затем новые колонки (появившиеся в\n // конфиге после сохранения) — в конец.\n const orderedKeys: ReadonlyArray<string> = settings\n ? [\n ...settings.order.filter((k: string): boolean => byKey.has(k)),\n ...config\n .filter((c: IRtTable.ColumnConfig): boolean => !settings.order.includes(c.key))\n .map((c: IRtTable.ColumnConfig): string => c.key),\n ]\n : config.map((c: IRtTable.ColumnConfig): string => c.key);\n\n const hiddenKeys: ReadonlySet<string> = new Set(\n settings\n ? settings.hidden\n : config\n .filter((c: IRtTable.ColumnConfig): boolean => c.hidden === true)\n .map((c: IRtTable.ColumnConfig): string => c.key)\n );\n\n return orderedKeys\n .map((key: string): IRtTable.ColumnConfig | undefined => byKey.get(key))\n .filter((c: IRtTable.ColumnConfig | undefined): c is IRtTable.ColumnConfig => c !== undefined)\n .map((c: IRtTable.ColumnConfig): IRtTable.ColumnSettingItem => ({\n ...c,\n hidden: c.locked === true ? false : hiddenKeys.has(c.key),\n }));\n }\n );\n\n /**\n * Колонки для `*cdkHeaderRowDef`/`*cdkRowDef`. При заданном `[columnsConfig]` —\n * видимые колонки в применённом порядке; иначе — legacy `[columns]`. Плюс\n * «…»-колонка действий в конце при `[showRowActions]`. Потребитель читает через\n * template-ref: `<rt-table #t=\"rtTable\" ...>` →\n * `*cdkRowDef=\"let row; columns: t.displayedColumns()\"`.\n */\n public readonly displayedColumns: Signal<ReadonlyArray<string>> = computed((): ReadonlyArray<string> => {\n const base: ReadonlyArray<string> =\n this.columnsConfig().length > 0\n ? this.resolvedColumns()\n .filter((c: IRtTable.ColumnSettingItem): boolean => !c.hidden)\n .map((c: IRtTable.ColumnSettingItem): string => c.key)\n : [...this.columns()];\n return this.showRowActions() ? [...base, RT_TABLE_ROW_ACTIONS_COLUMN] : [...base];\n });\n\n /** `true` когда таблица настраиваемая: есть и `[columnsConfig]`, и `[tableId]`. */\n public readonly canConfigure: Signal<boolean> = computed((): boolean => this.columnsConfig().length > 0 && this.tableId() !== null);\n\n /** Сколько skeleton-строк рендерить во время initial-load. Default 5. */\n public readonly skeletonRows: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(DEFAULT_SKELETON_ROWS, {\n transform: numberAttribute,\n });\n\n /** Текст empty-placeholder'а если `rtTableEmpty` ContentChild template не задан. */\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly emptyMessage: InputSignal<string> = input<string>('');\n\n /** Своя подпись пустой таблицы важнее умолчания */\n public readonly emptyText: Signal<string> = computed((): string => this.emptyMessage() || this.#t_uiNoRows());\n\n /** Иконка дефолтного empty-placeholder'а (rt-empty-state). `null` — без иконки. */\n public readonly emptyIcon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>('inbox');\n\n /** Описание под заголовком дефолтного empty-placeholder'а. Опционально. */\n public readonly emptyDescription: InputSignal<string | null> = input<string | null>(null);\n\n constructor() {\n super();\n // Персист настроек колонок объявлен одним конструкторным стримом:\n // #persistSettings эмитит запрос, mergeMap подписывает store.set\n // (fire-and-forget, каждый запрос — независимая запись, как раньше).\n this.#persistSettingsSource\n .pipe(\n mergeMap((request: IRtTablePersistRequest): Observable<void> =>\n this.#settingsStorage.set(settingsKey(request.tableId), request.settings)\n ),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe();\n }\n\n public override ngOnInit(): void {\n super.ngOnInit();\n // Регистрируем view-колонку действий до первого рендера строк, чтобы\n // `displayedColumns()` мог на неё ссылаться без «column not found».\n // Cell/header присваиваем вручную — их ContentChild ещё не отработал.\n if (this.actionsColumnDef !== undefined && this.actionsCellDef !== undefined && this.actionsHeaderCellDef !== undefined) {\n this.actionsColumnDef.cell = this.actionsCellDef;\n this.actionsColumnDef.headerCell = this.actionsHeaderCellDef;\n this.addColumnDef(this.actionsColumnDef);\n }\n\n this.#registerSettings();\n\n // Загрузка сохранённых настроек колонок. Запись может отсутствовать —\n // IndexedDB отдаёт в этом случае undefined, применять нечего.\n const persistedTableId: string | null = this.#persistableTableId();\n if (persistedTableId !== null) {\n this.#settingsStorage\n .get(settingsKey(persistedTableId))\n .pipe(takeUntilDestroyed(this.#destroyRef))\n .subscribe((settings: IRtTable.ColumnSettings | undefined): void => {\n if (settings !== undefined) {\n this.applyColumnSettings(settings);\n }\n });\n }\n }\n\n public override ngOnDestroy(): void {\n if (this.actionsColumnDef !== undefined) {\n this.removeColumnDef(this.actionsColumnDef);\n }\n const tableId: string | null = this.tableId();\n if (tableId !== null) {\n this.#registry.unregister(tableId);\n }\n super.ngOnDestroy();\n }\n\n /**\n * Применяет новые настройки колонок (из панели настроек): порядок + скрытые.\n * Locked-колонки принудительно остаются видимыми (их ключи вычищаются из hidden).\n */\n /**\n * Переключает порядок по колонке: по возрастанию → по убыванию → без сортировки.\n * Выбранное состояние уходит наружу — выборку делает потребитель.\n */\n public toggleSort(propertyName: string): void {\n const selected: ISortModel<string> | null = nextSort(this.#sort(), propertyName);\n this.#sort.set(selected);\n this.sortChange.emit(selected);\n }\n\n public applyColumnSettings(settings: IRtTable.ColumnSettings): void {\n const lockedKeys: ReadonlySet<string> = new Set(\n this.columnsConfig()\n .filter((c: IRtTable.ColumnConfig): boolean => c.locked === true)\n .map((c: IRtTable.ColumnConfig): string => c.key)\n );\n this.#columnSettings.set({\n order: [...settings.order],\n hidden: settings.hidden.filter((k: string): boolean => !lockedKeys.has(k)),\n });\n }\n\n /**\n * Регистрирует настраиваемую таблицу в реестре: её колонки/дефолты (сигналы) +\n * apply-callback (применяет настройки к таблице и персистит их в IndexedDB).\n * Реестр — мост к route-асайду настроек, который\n * открывается потребителем через навигацию.\n */\n #registerSettings(): void {\n const tableId: string | null = this.tableId();\n if (tableId === null || !this.canConfigure()) {\n return;\n }\n const registration: IRtTableSettingsRegistration = {\n columns: this.resolvedColumns,\n defaults: this.#defaultColumns,\n apply: (settings: IRtTable.ColumnSettings): void => {\n this.applyColumnSettings(settings);\n this.#persistSettings(settings);\n },\n };\n this.#registry.register(tableId, registration);\n }\n\n /** Сохраняет настройки колонок через порт по `tableId` (запись — в конструкторном стриме). */\n #persistSettings(settings: IRtTable.ColumnSettings): void {\n const tableId: string | null = this.#persistableTableId();\n if (tableId === null) {\n return;\n }\n this.#persistSettingsSource.next({ tableId, settings });\n }\n\n /**\n * Пробрасывает `dataSource` в CdkTable и отдельно инвалидирует signals,\n * которые вычисляют loading/empty-состояния по plain CDK input.\n */\n public override set dataSource(dataSource: CdkTableDataSourceInput<TRow>) {\n super.dataSource = dataSource;\n this.#dataSourceVersion.update((version: number): number => version + 1);\n }\n\n /** Возвращает текущий источник данных, сохранённый базовым CdkTable. */\n public override get dataSource(): CdkTableDataSourceInput<TRow> {\n return super.dataSource;\n }\n\n /**\n * Проверка наличия данных в `dataSource`. CdkTable принимает array | Observable | DataSource —\n * нас интересуют только массивы (client-side filter pattern). Для остальных типов\n * (Observable / DataSource) консервативно возвращаем `true` — не показываем skeleton/empty\n * там где не можем точно определить.\n */\n #hasData(): boolean {\n this.#dataSourceVersion();\n\n const ds: unknown = this.dataSource;\n if (Array.isArray(ds)) {\n return ds.length > 0;\n }\n return true;\n }\n}\n","<ng-container rtBlock=\"rt-table\">\n <ng-content select=\"caption\" />\n <ng-content select=\"colgroup, col\" />\n\n <ng-container cdkColumnDef=\"rtRowActions\">\n <th *cdkHeaderCellDef rtElem=\"actions-header\" cdk-header-cell aria-hidden=\"true\"></th>\n <td *cdkCellDef=\"let row\" rtElem=\"actions-cell\" qa-dataid=\"table-row-actions\" cdk-cell>\n @if (rowActions()?.template; as tpl) {\n @if (row | rtRowHasActions: rowHasActions()) {\n <div rtElem=\"actions-float\">\n <rt-menu>\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </rt-menu>\n </div>\n }\n }\n </td>\n </ng-container>\n\n <ng-container headerRowOutlet />\n\n @if (isInitialLoading()) {\n @for (i of skeletonRowIndexes(); track i) {\n <tr rtElem=\"skeleton-row\" qa-dataid=\"table-skeleton-row\">\n @for (col of displayedColumns(); track col) {\n <td rtElem=\"skeleton-cell\">\n <rt-skeleton rtElem=\"skeleton-bar\" />\n </td>\n }\n </tr>\n }\n }\n\n <ng-container rowOutlet />\n <ng-container noDataRowOutlet />\n <ng-container footerRowOutlet />\n\n @if (isEmpty()) {\n <tr rtElem=\"empty-row\" qa-dataid=\"table-empty-row\">\n <td rtElem=\"empty\" [attr.colspan]=\"displayedColumns().length || null\">\n @if (emptyTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n <rt-empty-state\n rtElem=\"empty-message\"\n qa-dataid=\"table-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyText()\"\n [description]=\"emptyDescription()\" />\n }\n </td>\n </tr>\n }\n\n @if (showCards()) {\n <div rtElem=\"cards\" qa-dataid=\"table-cards\" role=\"list\">\n @if (isInitialLoading()) {\n @for (i of skeletonRowIndexes(); track i) {\n <article rtElem=\"card\" qa-dataid=\"table-skeleton-card\" [rtMod]=\"{ skeleton: true }\">\n <rt-skeleton rtElem=\"card-skeleton-bar\" />\n <rt-skeleton rtElem=\"card-skeleton-bar\" />\n </article>\n }\n } @else if (isEmpty()) {\n @if (emptyTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n <rt-empty-state\n rtElem=\"empty-message\"\n qa-dataid=\"table-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyText()\"\n [description]=\"emptyDescription()\" />\n }\n } @else {\n @for (row of cardRows(); track row) {\n <article rtElem=\"card\" qa-dataid=\"table-card\" role=\"listitem\">\n @if (cardTemplate()?.template; as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n } @else {\n @for (col of cardColumns(); track col.key) {\n <div rtElem=\"card-field\" qa-dataid=\"table-card-field\" [attr.data-key]=\"col.key\">\n <span rtElem=\"card-label\" qa-dataid=\"table-card-label\">{{ col.label }}</span>\n <div rtElem=\"card-value\" qa-dataid=\"table-card-value\">\n <ng-container [ngTemplateOutlet]=\"col.cell\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </div>\n </div>\n }\n @if (rowActions()?.template; as tpl) {\n @if (row | rtRowHasActions: rowHasActions()) {\n <div rtElem=\"card-actions\" qa-dataid=\"table-card-actions\">\n <rt-menu>\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </rt-menu>\n </div>\n }\n }\n }\n </article>\n }\n }\n </div>\n }\n</ng-container>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, InputSignal, Signal, ViewEncapsulation } from '@angular/core';\n\nimport { ElemDirective, ModDirective } from '@rt-tools/core';\nimport { LIST_SORT_ORDER_ENUM, ListSortOrderType } from '@rt-tools/utils';\n\nimport { RtIconComponent } from '../../icon/rt-icon.component';\nimport { IRtIcon } from '../../icon/rt-icon.model';\nimport { ariaSortOf, IRtTableAriaSort, isColumnSortable, sortDirectionOf } from '../rt-table-sort.logic';\nimport { RtTableComponent } from '../rt-table.component';\n\nconst BEM_BLOCK: string = 'rt-table-sort-header';\n\n/** Иконка направления: без сортировки — обе стрелки, иначе стрелка выбранного порядка. */\nconst ICONS: Readonly<Record<ListSortOrderType | 'none', IRtIcon.Name>> = Object.freeze({\n none: 'sort-alt',\n [LIST_SORT_ORDER_ENUM.ASC]: 'arrow-up',\n [LIST_SORT_ORDER_ENUM.DESC]: 'arrow-down',\n});\n\n/**\n * Заголовок сортируемой колонки — атрибутом на ячейке шапки:\n * `<th *cdkHeaderCellDef cdk-header-cell rtSortHeader=\"checkIn\">Заезд</th>`.\n *\n * Подпись проецируется внутрь кнопки, и доступное имя кнопки берётся из неё — порядок\n * меняется не только мышью. Текущее направление читается с самой колонки через\n * `aria-sort`, а видно его по стрелке.\n *\n * Колонка сортируется, только когда помечена `sortable` в `[columnsConfig]` таблицы;\n * иначе заголовок остаётся обычной подписью. Элементная форма селектора нужна правилу\n * префиксов и в разметке не применяется: `aria-sort` принадлежит ячейке шапки.\n */\n@Component({\n selector: 'rt-table-sort-header, th[rtSortHeader]',\n templateUrl: './rt-table-sort-header.component.html',\n styleUrl: './rt-table-sort-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // angular\n NgTemplateOutlet,\n\n // rt-tools\n ElemDirective,\n ModDirective,\n\n // components\n RtIconComponent,\n ],\n host: {\n class: BEM_BLOCK,\n '[attr.aria-sort]': 'ariaSort()',\n },\n})\nexport class RtTableSortHeaderComponent {\n readonly #table: RtTableComponent<unknown> = inject<RtTableComponent<unknown>>(RtTableComponent);\n\n /** Направление сортировки по этой колонке; `null` — сортирует другая либо никакая. */\n protected readonly direction: Signal<ListSortOrderType | null> = computed((): ListSortOrderType | null =>\n sortDirectionOf(this.#table.currentSort(), this.rtSortHeader())\n );\n\n protected readonly icon: Signal<IRtIcon.Name> = computed((): IRtIcon.Name => ICONS[this.direction() ?? 'none']);\n\n protected readonly sortable: Signal<boolean> = computed((): boolean =>\n isColumnSortable(this.#table.columnsConfig(), this.rtSortHeader())\n );\n\n /** Ключ колонки — тот же, что в `cdkColumnDef` и в `[columnsConfig]`. */\n public readonly rtSortHeader: InputSignal<string> = input.required<string>();\n\n public readonly ariaSort: Signal<IRtTableAriaSort> = computed((): IRtTableAriaSort =>\n ariaSortOf(this.#table.currentSort(), this.rtSortHeader())\n );\n\n protected onToggle(): void {\n this.#table.toggleSort(this.rtSortHeader());\n }\n}\n","<ng-template #label>\n <ng-content />\n</ng-template>\n\n@if (sortable()) {\n <button\n rtElem=\"button\"\n qa-dataid=\"table-sort-header\"\n type=\"button\"\n [attr.data-column]=\"rtSortHeader()\"\n [attr.data-direction]=\"direction()\"\n [rtMod]=\"{ active: direction() !== null }\"\n (click)=\"onToggle()\">\n <ng-container [ngTemplateOutlet]=\"label\" />\n <rt-icon rtElem=\"icon\" size=\"xs\" [name]=\"icon()\" />\n </button>\n} @else {\n <ng-container [ngTemplateOutlet]=\"label\" />\n}\n","import { Directive, output, OutputEmitterRef } from '@angular/core';\n\n/**\n * Делает строку таблицы (`<tr cdk-row>`) активируемой — общий паттерн «клик по\n * строке открывает деталь/асайд». Инкапсулирует доступность: строка становится\n * focusable, активируется кликом и Enter/Space, наружу отдаёт `(activated)`.\n *\n * Клик/клавиша по интерактивному потомку (кнопка/ссылка/контрол) активацией\n * строки НЕ считается — иначе вложенные действия конфликтовали бы с переходом.\n * Роль строки не переопределяется (table-семантика для скрин-ридеров сохраняется).\n * Визуальный аффорданс (cursor/hover/focus-ring) включает `[clickable]` на rt-table.\n */\n@Directive({\n selector: '[rtTableRow]',\n host: {\n tabindex: '0',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onKey($event)',\n '(keydown.space)': 'onKey($event)',\n },\n})\nexport class RtTableRowDirective {\n public readonly activated: OutputEmitterRef<void> = output<void>();\n\n protected onClick(event: MouseEvent): void {\n if (this.#fromInteractive(event)) {\n return;\n }\n this.activated.emit();\n }\n\n protected onKey(event: Event): void {\n if (this.#fromInteractive(event)) {\n return;\n }\n // Space иначе проскроллит страницу — гасим дефолт перед активацией.\n event.preventDefault();\n this.activated.emit();\n }\n\n /** `true`, если событие пришло из интерактивного потомка строки. */\n #fromInteractive(event: Event): boolean {\n const target: HTMLElement | null = event.target as HTMLElement | null;\n if (target === null) {\n return false;\n }\n return target.closest(\"button, a, input, select, textarea, label, [role='button'], [role='switch']\") !== null;\n }\n}\n","import { CdkDrag, CdkDragDrop, CdkDragHandle, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { ChangeDetectionStrategy, Component, model, ModelSignal, ViewEncapsulation } from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconButtonComponent } from '../../icon-button/rt-icon-button.component';\nimport { RtIconComponent } from '../../icon/rt-icon.component';\nimport { IRtTable } from '../rt-table.model';\n\nconst BEM_BLOCK: string = 'rt-table-settings-panel';\n\n/**\n * Презентационный редактор списка колонок таблицы: reorder (drag-drop) + видимость\n * (глаз). Locked-колонки всегда видимы и не перетаскиваются. Двусторонний `items` —\n * текущее состояние; контейнер (route-асайд настроек) владеет сигналом, читает его\n * для «Сохранить»/«Сбросить» и передаёт сюда через `[(items)]`.\n */\n@Component({\n selector: 'rt-table-settings-panel',\n templateUrl: './rt-table-settings-panel.component.html',\n styleUrl: './rt-table-settings-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // @angular/cdk\n CdkDrag,\n CdkDragHandle,\n CdkDropList,\n\n // standalone components / directives\n RtIconButtonComponent,\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtTableSettingsPanelComponent {\n public readonly items: ModelSignal<ReadonlyArray<IRtTable.ColumnSettingItem>> =\n model.required<ReadonlyArray<IRtTable.ColumnSettingItem>>();\n\n /** Reorder через drag-drop. Locked-строки drag-disabled; индексы — по всему списку. */\n protected onDrop(event: CdkDragDrop<ReadonlyArray<IRtTable.ColumnSettingItem>>): void {\n if (event.previousIndex === event.currentIndex) {\n return;\n }\n const next: IRtTable.ColumnSettingItem[] = [...this.items()];\n moveItemInArray(next, event.previousIndex, event.currentIndex);\n this.items.set(next);\n }\n\n /** Переключить видимость колонки (locked — нельзя). */\n protected onToggleHidden(key: string): void {\n this.items.update((items: ReadonlyArray<IRtTable.ColumnSettingItem>): ReadonlyArray<IRtTable.ColumnSettingItem> =>\n items.map((item: IRtTable.ColumnSettingItem): IRtTable.ColumnSettingItem =>\n item.key === key && item.locked !== true ? { ...item, hidden: !item.hidden } : item\n )\n );\n }\n}\n","<ul rtBlock=\"rt-table-settings-panel\" rtElem=\"list\" qa-dataid=\"table-settings-list\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\n @for (item of items(); track item.key) {\n <li\n rtElem=\"row\"\n qa-dataid=\"table-settings-row\"\n cdkDrag\n [attr.data-key]=\"item.key\"\n [rtMod]=\"{ locked: item.locked === true, hidden: item.hidden }\"\n [cdkDragDisabled]=\"item.locked === true\">\n @if (item.locked === true) {\n <span rtElem=\"handle\" rtMod=\"placeholder\" aria-hidden=\"true\"></span>\n } @else {\n <button\n rtElem=\"handle\"\n qa-dataid=\"table-settings-drag\"\n type=\"button\"\n cdkDragHandle\n [attr.aria-label]=\"'rtKit.uiDragColumn' | transloco\">\n <rt-icon name=\"bars\" size=\"sm\" color=\"muted\" />\n </button>\n }\n\n <span rtElem=\"label\" qa-dataid=\"table-settings-label\">{{ item.label }}</span>\n\n <rt-icon-button\n rtElem=\"toggle\"\n qa-dataid=\"table-settings-toggle\"\n [icon]=\"item.hidden ? 'eye-slash' : 'eye'\"\n [ariaLabel]=\"item.hidden ? ('rtKit.uiShowColumn' | transloco) : ('rtKit.uiHideColumn' | transloco)\"\n [tooltip]=\"\n item.locked === true\n ? ('rtKit.uiColumnLocked' | transloco)\n : item.hidden\n ? ('rtKit.uiShow' | transloco)\n : ('rtKit.uiHide' | transloco)\n \"\n [disabled]=\"item.locked === true\"\n (clicked)=\"onToggleHidden(item.key)\" />\n </li>\n }\n</ul>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n Signal,\n signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { Observable, of } from 'rxjs';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { RtAsideFooterComponent } from '../../aside/footer/rt-aside-footer.component';\nimport { RtAsideHeaderComponent } from '../../aside/header/rt-aside-header.component';\nimport { RtAsideComponent } from '../../aside/rt-aside.component';\nimport { RtButtonDirective } from '../../button/rt-button.directive';\nimport { RtContainerRightSidenavPanelDirective } from '../../container/rt-container.directives';\nimport { RtRouteAsideComponent } from '../../container/rt-route-aside.base';\nimport { RtIconButtonComponent } from '../../icon-button/rt-icon-button.component';\nimport { RtTableSettingsPanelComponent } from '../settings-panel/rt-table-settings-panel.component';\nimport { RtTableSettingsRegistry, type IRtTableSettingsRegistration } from '../rt-table-settings.registry';\nimport { IRtTable } from '../rt-table.model';\n\nconst BEM_BLOCK: string = 'rt-table-settings-aside';\n\n/**\n * Общий route-driven side-sheet настроек колонок для любой `rt-table`. Открывается\n * навигацией на `(ro:table-settings)`; какая таблица настраивается — берётся из\n * `RtTableSettingsRegistry.active()` (потребитель выставляет `setActive(tableId)`\n * перед навигацией). Create-mode: id в route нет (`tableId` — строка, числовой базой\n * не резолвится).\n *\n * Тело списка (drag-reorder + видимость) — переиспользуемый `rt-table-settings-panel`;\n * «Сохранить»/«Сбросить» живут в chrome асайда над локальным `items`, засеянным из\n * активной регистрации. Регистрируется в `routes.ts` каждого shell под `outlet: \"ro\"`.\n */\n@Component({\n selector: 'rt-table-settings-aside',\n templateUrl: './rt-table-settings-aside.component.html',\n styleUrls: ['./rt-table-settings-aside.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n RtAsideComponent,\n RtAsideFooterComponent,\n RtAsideHeaderComponent,\n RtButtonDirective,\n RtContainerRightSidenavPanelDirective,\n RtIconButtonComponent,\n RtTableSettingsPanelComponent,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtTableSettingsAsideComponent extends RtRouteAsideComponent<never> {\n readonly #registry: RtTableSettingsRegistry = inject(RtTableSettingsRegistry);\n\n /**\n * `active` на момент создания асайда: `null` — восстановление после F5\n * (`setActive` никто не звал), непустой id — штатное открытие потребителем.\n */\n readonly #initialActive: string | null = this.#registry.active();\n\n /** Регистрация активной таблицы (её колонки/дефолты/apply). Реактивна к реестру. */\n readonly #registration: Signal<IRtTableSettingsRegistration | null> = computed((): IRtTableSettingsRegistration | null => {\n const tableId: string | null = this.#registry.active();\n return tableId !== null ? this.#registry.get(tableId)() : null;\n });\n\n /** Рабочая копия списка колонок (сидится из регистрации, редактируется телом-панелью). */\n protected readonly items: WritableSignal<ReadonlyArray<IRtTable.ColumnSettingItem>> = signal<ReadonlyArray<IRtTable.ColumnSettingItem>>(\n []\n );\n\n #seeded: boolean = false;\n\n /** Асайд восстановил `active` сам (после F5) — дальше живёт по штатным правилам. */\n #adopted: boolean = false;\n\n constructor() {\n super();\n // Фикс F-16: после F5 асайд инициализируется раньше `rt-table`, реестр в\n // этот момент пуст и `active` сброшен (root-сервис пересоздан). Вместо\n // самозакрытия на первом промахе ждём регистрацию: страница регистрирует\n // ровно одну настраиваемую таблицу — она и становится активной.\n if (this.#initialActive === null) {\n effect((): void => {\n // Усыновление одноразовое: после него асайд живёт по штатным\n // правилам (уход со страницы = закрытие), а не перепрыгивает\n // на таблицу следующей страницы.\n if (this.#adopted || this.#registry.active() !== null) {\n return;\n }\n const sole: string | null = this.#registry.soleTableId();\n if (sole !== null) {\n this.#adopted = true;\n this.#registry.setActive(sole);\n }\n });\n }\n effect((): void => {\n const registration: IRtTableSettingsRegistration | null = this.#registration();\n const panel: RtContainerRightSidenavPanelDirective | undefined = this.panel();\n if (panel === undefined || !panel.ready()) {\n return;\n }\n if (registration === null) {\n // Штатно открытый (или уже усыновивший таблицу) асайд закрывается,\n // когда регистрация исчезла — уход со страницы таблицы. Асайд,\n // восстановленный после F5, регистрацию ещё ЖДЁТ — не закрываемся.\n if (this.#initialActive !== null || this.#adopted) {\n this.onClose();\n }\n return;\n }\n if (!this.#seeded) {\n this.#seeded = true;\n this.items.set(\n registration.columns().map((c: IRtTable.ColumnSettingItem): IRtTable.ColumnSettingItem => ({\n ...c,\n }))\n );\n }\n });\n }\n\n protected resolve(): Observable<never | null> {\n return of(null);\n }\n\n /** Сбросить рабочую копию к дефолтным колонкам из конфига. */\n protected onReset(): void {\n const registration: IRtTableSettingsRegistration | null = this.#registration();\n if (registration === null) {\n return;\n }\n this.items.set(registration.defaults().map((c: IRtTable.ColumnSettingItem): IRtTable.ColumnSettingItem => ({ ...c })));\n }\n\n /** Применить настройки к таблице (через registry) и закрыть асайд. */\n protected onSave(): void {\n const registration: IRtTableSettingsRegistration | null = this.#registration();\n if (registration !== null) {\n const items: ReadonlyArray<IRtTable.ColumnSettingItem> = this.items();\n registration.apply({\n order: items.map((item: IRtTable.ColumnSettingItem): string => item.key),\n hidden: items\n .filter((item: IRtTable.ColumnSettingItem): boolean => item.hidden)\n .map((item: IRtTable.ColumnSettingItem): string => item.key),\n });\n }\n this.#registry.clearActive();\n this.onClose();\n }\n}\n","<ng-container rtContainerRightSidenavPanel #panel=\"rtContainerRightPanel\" (cancelled)=\"onCancel()\" (closed)=\"onClosed()\" />\n\n<rt-aside [ariaLabel]=\"'rtKit.uiColumnSettings' | transloco\">\n <rt-aside-header [title]=\"'rtKit.uiColumnSettingsTitle' | transloco\" (dismiss)=\"onClose()\">\n <rt-icon-button\n asideActions\n qa-dataid=\"table-settings-reset\"\n icon=\"undo\"\n variant=\"ghost\"\n [tooltip]=\"'rtKit.uiResetDefaults' | transloco\"\n [ariaLabel]=\"'rtKit.uiResetDefaults' | transloco\"\n (clicked)=\"onReset()\" />\n </rt-aside-header>\n\n <rt-table-settings-panel [(items)]=\"items\" />\n\n <rt-aside-footer>\n <button\n rtButton\n asideDismiss\n qa-dataid=\"table-settings-close\"\n type=\"button\"\n appearance=\"text\"\n [label]=\"'rtKit.uiClose' | transloco\"\n [attr.aria-label]=\"'rtKit.uiClose' | transloco\"\n (click)=\"onClose()\"></button>\n <button\n rtButton\n asidePrimary\n qa-dataid=\"table-settings-save\"\n type=\"button\"\n [label]=\"'rtKit.uiSave' | transloco\"\n [attr.aria-label]=\"'rtKit.uiSave' | transloco\"\n (click)=\"onSave()\"></button>\n </rt-aside-footer>\n</rt-aside>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n Directive,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n TemplateRef,\n} from '@angular/core';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { IRtIcon } from '../icon/rt-icon.model';\nimport { IRtTabs } from './rt-tabs.model';\n\n/**\n * Декларирует одну вкладку `<rt-tabs>`. Ставится на `<ng-template>`: контент\n * шаблона становится телом панели и рендерится только когда вкладка активна.\n *\n * Метаданные (label, icon, disabled, badge, invalid) — signal-inputs, поэтому\n * шапка вкладки реагирует на их изменение без ручной перерегистрации. Сам\n * список вкладок `rt-tabs` собирает через `contentChildren`.\n */\n@Directive({\n selector: '[rtTab]',\n})\nexport class RtTabDirective {\n readonly #t_uiTabInvalid: Signal<string> = translateSignal('rtKit.uiTabInvalid');\n\n /** Шаблон тела панели — рендерится в области контента при активной вкладке. */\n public readonly templateRef: TemplateRef<unknown> = inject<TemplateRef<unknown>>(TemplateRef);\n\n /** Стабильный идентификатор вкладки (значение атрибута `rtTab`). */\n public readonly id: InputSignal<IRtTabs.Id> = input<IRtTabs.Id>('', { alias: 'rtTab' });\n\n /** Текстовый заголовок. Игнорируется, если задан `titleTemplate`. */\n public readonly label: InputSignal<string> = input<string>('');\n\n /** Кастомный шаблон заголовка — замещает `label`. */\n public readonly titleTemplate: InputSignal<TemplateRef<unknown> | null> = input<TemplateRef<unknown> | null>(null);\n\n /** Иконка слева от заголовка. */\n public readonly icon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Семантический цвет иконки заголовка. */\n public readonly iconColor: InputSignal<IRtTabs.TitleColor> = input<IRtTabs.TitleColor>('current');\n\n /** Значение бейджа справа от заголовка (число/строка). `null` — без бейджа. */\n public readonly badge: InputSignal<string | number | null> = input<string | number | null>(null);\n\n /** Заблокированная вкладка: не выбирается и не получает фокус. */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Скрытая вкладка: не рендерится ни в шапке, ни в контенте. */\n public readonly hidden: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Вкладка с ошибками: подсвечивается danger-цветом. */\n public readonly invalid: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Подсказка для невалидной вкладки. Пусто — берётся переведённое умолчание. */\n public readonly invalidMessage: InputSignal<string> = input<string>('');\n\n /** Готовый текст подсказки: своя формулировка важнее умолчания. */\n public readonly invalidTitle: Signal<string> = computed((): string => this.invalidMessage() || this.#t_uiTabInvalid());\n}\n","import { Directive, inject, input, InputSignal, TemplateRef } from '@angular/core';\n\nimport { IRtTabs } from './rt-tabs.model';\n\n/**\n * Декларирует header-контрол `<rt-tabs>` — произвольный шаблон (кнопка, фильтр),\n * который рендерится слева или справа от полосы вкладок. Ставится на\n * `<ng-template>`; `rt-tabs` собирает контролы через `contentChildren` и\n * раскладывает по сторонам согласно `side`.\n */\n@Directive({\n selector: '[rtTabsControl]',\n})\nexport class RtTabsControlDirective {\n /** Шаблон контрола, выводимый в header-слоте. */\n public readonly templateRef: TemplateRef<unknown> = inject<TemplateRef<unknown>>(TemplateRef);\n\n /** Сторона размещения относительно полосы вкладок. */\n public readonly side: InputSignal<IRtTabs.ControlSide> = input<IRtTabs.ControlSide>('right', {\n alias: 'rtTabsControl',\n });\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n DestroyRef,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { debounceTime, fromEvent } from 'rxjs';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '../icon/rt-icon.component';\nimport { RtTooltipDirective } from '../tooltip/rt-tooltip.directive';\nimport { RtTabDirective } from './rt-tab.directive';\nimport { RtTabsControlDirective } from './rt-tabs-control.directive';\nimport { IRtTabs } from './rt-tabs.model';\n\n/** Шаг ручной прокрутки полосы вкладок за один тик удержания стрелки (px). */\nconst SCROLL_STEP: number = 12;\n\n/** Интервал тика прокрутки при зажатой стрелке (мс). */\nconst SCROLL_TICK_MS: number = 15;\n\n/** Дебаунс пересчёта видимости стрелок прокрутки на resize/scroll (мс). */\nconst REST_DEBOUNCE_MS: number = 50;\n\nconst BEM_BLOCK: string = 'rt-tabs';\n\ntype IScrollDirection = 'before' | 'after';\n\n/**\n * Полоса вкладок с проекцией контента. Вкладки декларируются через\n * `<ng-template rtTab=\"id\" label=\"…\">…</ng-template>` (см. {@link RtTabDirective}),\n * собираются `contentChildren` и рендерятся как header-кнопки + активная панель.\n * Опциональные header-контролы — через `[rtTabsControl]`.\n *\n * Компонент \"controlled-ish\": активная вкладка берётся из `activeId` (если\n * задан), иначе — из внутреннего выбора, иначе — первая доступная. Клик/клавиша\n * эмиттят `activeIdChange`; синхронизацию `activeId` оставляем потребителю.\n *\n * Горизонтальная полоса при переполнении прячет вкладки под скролл и показывает\n * стрелки-«хвосты» (`__rest`) с прокруткой по удержанию. Вертикальная ориентация\n * раскладывает вкладки в колонку без стрелок.\n *\n * Доступность: `role=\"tablist\"`/`role=\"tab\"`/`role=\"tabpanel\"`, `aria-selected`,\n * roving `tabindex`, навигация стрелками + Home/End.\n */\n@Component({\n selector: 'rt-tabs',\n templateUrl: './rt-tabs.component.html',\n styleUrl: './rt-tabs.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // angular\n NgTemplateOutlet,\n\n // standalone components / directives\n RtIconComponent,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-tabs--direction--horizontal]': \"direction() === 'horizontal'\",\n '[class.rt-tabs--direction--vertical]': \"direction() === 'vertical'\",\n },\n})\nexport class RtTabsComponent {\n /** `Window` через `DOCUMENT` (SSR-safe: `defaultView` может быть `null`). */\n readonly #win: Window | null = inject(DOCUMENT).defaultView;\n\n /** Все задекларированные вкладки (включая скрытые). */\n protected readonly tabs: Signal<readonly RtTabDirective[]> = contentChildren(RtTabDirective);\n\n /** Все header-контролы. */\n protected readonly controls: Signal<readonly RtTabsControlDirective[]> = contentChildren(RtTabsControlDirective);\n\n /** Видимые вкладки (без `hidden`). */\n protected readonly visibleTabs: Signal<readonly RtTabDirective[]> = computed((): readonly RtTabDirective[] =>\n this.tabs().filter((tab: RtTabDirective): boolean => !tab.hidden())\n );\n\n protected readonly leftControls: Signal<readonly RtTabsControlDirective[]> = computed((): readonly RtTabsControlDirective[] =>\n this.controls().filter((c: RtTabsControlDirective): boolean => c.side() === 'left')\n );\n\n protected readonly rightControls: Signal<readonly RtTabsControlDirective[]> = computed((): readonly RtTabsControlDirective[] =>\n this.controls().filter((c: RtTabsControlDirective): boolean => c.side() === 'right')\n );\n\n /**\n * Эффективный id активной вкладки. Приоритет: контролируемый `activeId` →\n * внутренний выбор → первая доступная. Кандидат валидируется по множеству\n * видимых незаблокированных вкладок, поэтому корректно реагирует на\n * асинхронную загрузку/смену набора вкладок.\n */\n protected readonly selectedId: Signal<IRtTabs.Id | null> = computed((): IRtTabs.Id | null => {\n const enabled: readonly RtTabDirective[] = this.visibleTabs().filter((tab: RtTabDirective): boolean => !tab.disabled());\n const candidate: IRtTabs.Id | null = this.activeId() ?? this.#internalId();\n const candidateValid: boolean = candidate !== null && enabled.some((tab: RtTabDirective): boolean => tab.id() === candidate);\n\n let result: IRtTabs.Id | null;\n if (candidateValid) {\n result = candidate;\n } else if (enabled.length) {\n result = enabled[0].id();\n } else {\n result = null;\n }\n\n return result;\n });\n\n /** Активная вкладка целиком (для рендера панели). */\n protected readonly activeTab: Signal<RtTabDirective | null> = computed(\n (): RtTabDirective | null => this.visibleTabs().find((tab: RtTabDirective): boolean => tab.id() === this.selectedId()) ?? null\n );\n\n /** Видны ли стрелки прокрутки слева/справа (только горизонтальная полоса). */\n protected readonly restBeforeVisible: WritableSignal<boolean> = signal(false);\n protected readonly restAfterVisible: WritableSignal<boolean> = signal(false);\n\n protected readonly tabListRef: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('tabList');\n\n /** Контролируемый активный id. `null` — компонент сам выбирает первую вкладку. */\n public readonly activeId: InputSignal<IRtTabs.Id | null> = input<IRtTabs.Id | null>(null);\n\n /** Ориентация полосы. */\n public readonly direction: InputSignal<IRtTabs.Direction> = input<IRtTabs.Direction>('horizontal');\n\n /** Растягивать вкладки на всю ширину полосы. */\n public readonly stretch: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Скроллить область контента при переполнении. */\n public readonly contentScrollable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /** Эмиттит id вкладки при её выборе (клик/клавиатура). */\n public readonly activeIdChange: OutputEmitterRef<IRtTabs.Id> = output<IRtTabs.Id>();\n\n /** Внутренний выбор (uncontrolled-ветка). */\n readonly #internalId: WritableSignal<IRtTabs.Id | null> = signal<IRtTabs.Id | null>(null);\n\n /** Хэндл интервала прокрутки по удержанию стрелки. */\n #scrollIntervalId: number | null = null;\n\n constructor() {\n if (this.#win) {\n fromEvent(this.#win, 'resize')\n .pipe(debounceTime(REST_DEBOUNCE_MS), takeUntilDestroyed())\n .subscribe((): void => this.#updateRestVisibility());\n }\n\n afterNextRender((): void => this.#updateRestVisibility());\n\n // Снимаем hold-scroll интервал при уничтожении: если компонент разрушить\n // с зажатой стрелкой (pointerdown без pointerup), интервал остался бы жив.\n inject(DestroyRef).onDestroy((): void => this.#clearScrollInterval());\n }\n\n protected selectTab(id: IRtTabs.Id): void {\n const target: RtTabDirective | undefined = this.visibleTabs().find((tab: RtTabDirective): boolean => tab.id() === id);\n\n if (!target || target.disabled()) {\n return;\n }\n\n this.#internalId.set(id);\n this.activeIdChange.emit(id);\n this.#scrollTabIntoView(id);\n }\n\n /** Навигация по вкладкам с клавиатуры (automatic activation). */\n protected onTabKeydown(event: KeyboardEvent): void {\n const enabled: readonly RtTabDirective[] = this.visibleTabs().filter((tab: RtTabDirective): boolean => !tab.disabled());\n\n if (!enabled.length) {\n return;\n }\n\n const isVertical: boolean = this.direction() === 'vertical';\n const nextKey: string = isVertical ? 'ArrowDown' : 'ArrowRight';\n const prevKey: string = isVertical ? 'ArrowUp' : 'ArrowLeft';\n const currentIndex: number = enabled.findIndex((tab: RtTabDirective): boolean => tab.id() === this.selectedId());\n\n // Карта клавиша → целевой индекс (без if/else-if цепочки).\n const moveByKey: ReadonlyMap<string, number> = new Map<string, number>([\n [nextKey, (currentIndex + 1) % enabled.length],\n [prevKey, (currentIndex - 1 + enabled.length) % enabled.length],\n ['Home', 0],\n ['End', enabled.length - 1],\n ]);\n\n const targetIndex: number | undefined = moveByKey.get(event.key);\n\n if (targetIndex === undefined) {\n return;\n }\n\n event.preventDefault();\n const targetId: IRtTabs.Id = enabled[targetIndex].id();\n this.selectTab(targetId);\n this.#focusTab(targetId);\n }\n\n /** Старт прокрутки полосы по удержанию ЛКМ на стрелке. */\n protected onRestPointerDown(direction: IScrollDirection, event: MouseEvent): void {\n if (event.button !== 0 || this.#scrollIntervalId !== null || !this.#win) {\n return;\n }\n\n this.#scrollIntervalId = this.#win.setInterval((): void => {\n this.#scrollStep(direction);\n this.#updateRestVisibility();\n }, SCROLL_TICK_MS);\n }\n\n protected onRestPointerUp(): void {\n this.#clearScrollInterval();\n }\n\n protected onTabListScroll(): void {\n this.#updateRestVisibility();\n }\n\n #clearScrollInterval(): void {\n if (this.#win && this.#scrollIntervalId !== null) {\n this.#win.clearInterval(this.#scrollIntervalId);\n this.#scrollIntervalId = null;\n }\n }\n\n #scrollStep(direction: IScrollDirection): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n if (!list) {\n return;\n }\n\n const scrolledLeft: number = list.scrollLeft;\n const scrolledRight: number = list.scrollWidth - list.scrollLeft - list.clientWidth;\n const remaining: number = direction === 'before' ? scrolledLeft : scrolledRight;\n\n if (remaining > 0) {\n list.scrollBy(direction === 'before' ? -SCROLL_STEP : SCROLL_STEP, 0);\n }\n\n if (remaining - SCROLL_STEP <= 0) {\n this.#clearScrollInterval();\n }\n }\n\n #updateRestVisibility(): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n\n if (!list || this.direction() !== 'horizontal') {\n this.restBeforeVisible.set(false);\n this.restAfterVisible.set(false);\n return;\n }\n\n const scrolledRight: number = list.scrollWidth - list.scrollLeft - list.clientWidth;\n\n this.restBeforeVisible.set(list.scrollLeft > 0);\n // 1px — погрешность субпиксельного scrollWidth\n this.restAfterVisible.set(scrolledRight > 1);\n }\n\n #scrollTabIntoView(id: IRtTabs.Id): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n const tab: HTMLElement | null | undefined = list?.querySelector<HTMLElement>(`[data-tabid=\"${id}\"]`);\n\n if (!list || !tab) {\n return;\n }\n\n const viewLeft: number = list.scrollLeft;\n const viewRight: number = list.scrollLeft + list.clientWidth;\n\n if (tab.offsetLeft < viewLeft) {\n list.scrollTo({ left: tab.offsetLeft });\n } else if (tab.offsetLeft + tab.offsetWidth > viewRight) {\n list.scrollTo({ left: tab.offsetLeft + tab.offsetWidth - list.clientWidth });\n } else {\n // вкладка целиком в зоне видимости — прокрутка не нужна\n }\n }\n\n #focusTab(id: IRtTabs.Id): void {\n const list: HTMLElement | undefined = this.tabListRef()?.nativeElement;\n list?.querySelector<HTMLElement>(`[data-tabid=\"${id}\"]`)?.focus();\n }\n}\n","<ng-container rtBlock=\"rt-tabs\">\n <div rtElem=\"header\">\n @if (leftControls().length) {\n <div rtElem=\"controls\" [rtMod]=\"{ before: true }\">\n @for (control of leftControls(); track $index) {\n <ng-container [ngTemplateOutlet]=\"control.templateRef\" />\n }\n </div>\n }\n\n <div rtElem=\"tab-list-wrapper\">\n <div\n rtElem=\"rest\"\n qa-dataid=\"tabs-scroll-prev\"\n [rtMod]=\"{ before: true, visible: restBeforeVisible() }\"\n (mousedown)=\"onRestPointerDown('before', $event)\"\n (mouseup)=\"onRestPointerUp()\"\n (mouseleave)=\"onRestPointerUp()\">\n <rt-icon rtElem=\"rest-icon\" name=\"chevron-left\" color=\"current\" size=\"sm\" />\n </div>\n\n <div\n #tabList\n rtElem=\"tab-list\"\n qa-dataid=\"tabs-tab-list\"\n role=\"tablist\"\n [rtMod]=\"{ stretch: stretch(), direction: direction() }\"\n [attr.aria-orientation]=\"direction()\"\n (scroll)=\"onTabListScroll()\">\n @for (tab of visibleTabs(); track tab.id()) {\n <button\n rtBlock=\"rt-tab-item\"\n qa-dataid=\"tabs-tab\"\n type=\"button\"\n role=\"tab\"\n [rtMod]=\"{\n selected: tab.id() === selectedId(),\n disabled: tab.disabled(),\n invalid: tab.invalid(),\n stretch: stretch(),\n }\"\n [id]=\"'rt-tab-' + tab.id()\"\n [disabled]=\"tab.disabled()\"\n [attr.data-tabid]=\"tab.id()\"\n [attr.aria-selected]=\"tab.id() === selectedId()\"\n [attr.aria-controls]=\"'rt-tabpanel-' + tab.id()\"\n [attr.tabindex]=\"tab.id() === selectedId() ? 0 : -1\"\n [rtTooltip]=\"tab.invalid() ? tab.invalidTitle() : ''\"\n (click)=\"selectTab(tab.id())\"\n (keydown)=\"onTabKeydown($event)\">\n @if (tab.icon(); as icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"icon\" [color]=\"tab.iconColor()\" />\n }\n\n @if (tab.titleTemplate(); as titleTpl) {\n <ng-container [ngTemplateOutlet]=\"titleTpl\" />\n } @else {\n <span rtElem=\"title\">{{ tab.label() }}</span>\n }\n\n @if (tab.badge() !== null) {\n <span rtElem=\"badge\">{{ tab.badge() }}</span>\n }\n </button>\n }\n </div>\n\n <div\n rtElem=\"rest\"\n qa-dataid=\"tabs-scroll-next\"\n [rtMod]=\"{ after: true, visible: restAfterVisible() }\"\n (mousedown)=\"onRestPointerDown('after', $event)\"\n (mouseup)=\"onRestPointerUp()\"\n (mouseleave)=\"onRestPointerUp()\">\n <rt-icon rtElem=\"rest-icon\" name=\"chevron-right\" color=\"current\" size=\"sm\" />\n </div>\n </div>\n\n @if (rightControls().length) {\n <div rtElem=\"controls\" [rtMod]=\"{ after: true }\">\n @for (control of rightControls(); track $index) {\n <ng-container [ngTemplateOutlet]=\"control.templateRef\" />\n }\n </div>\n }\n </div>\n\n @if (activeTab(); as tab) {\n <div\n rtElem=\"content\"\n qa-dataid=\"tabs-panel\"\n role=\"tabpanel\"\n tabindex=\"0\"\n [rtMod]=\"{ scrollable: contentScrollable() }\"\n [id]=\"'rt-tabpanel-' + tab.id()\"\n [attr.aria-labelledby]=\"'rt-tab-' + tab.id()\">\n <ng-container [ngTemplateOutlet]=\"tab.templateRef\" />\n </div>\n }\n</ng-container>\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n Signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtFormControlBase } from '../form-control/rt-form-control.base';\n\nconst BEM_BLOCK: string = 'rt-textarea';\n\nexport type IRtTextareaResize = 'none' | 'vertical';\n\n/**\n * Шеренный textarea common/ui. CVA через общий `RtFormControlBase` —\n * авто-подсветка invalid. Размерные варианты sm/md/lg через host-класс. Resize\n * policy none/vertical.\n *\n * Крестик-очистка НЕ рендерится: в многострочном поле он нетипичен (`clearable`\n * наследуется, но шаблон его не использует).\n *\n * Размеры/цвета — через `--rt-input-*` / `--rt-textarea-*` semantic-токены.\n * `font-family: inherit` явно — textarea иначе падает на UA-default (monospace).\n */\n@Component({\n selector: 'rt-textarea',\n templateUrl: './rt-textarea.component.html',\n styleUrls: ['./rt-textarea.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n providers: [\n // Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtTextareaComponent) },\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-textarea--size--sm]': \"size() === 'sm'\",\n '[class.rt-textarea--size--lg]': \"size() === 'lg'\",\n '[class.rt-textarea--disabled]': 'isDisabled()',\n '[class.rt-textarea--readonly]': 'readonly()',\n '[class.rt-textarea--invalid]': 'isInvalid()',\n '[class.rt-textarea--borderless]': '!bordered()',\n },\n})\nexport class RtTextareaComponent extends RtFormControlBase<string> {\n protected readonly fieldEl: Signal<ElementRef<HTMLTextAreaElement> | undefined> = viewChild<ElementRef<HTMLTextAreaElement>>('fieldEl');\n\n protected readonly effectiveDisabled: Signal<boolean> = computed((): boolean => this.disabled() || this.isDisabled());\n\n protected readonly hasValue: Signal<boolean> = computed((): boolean => this.value() !== '');\n\n public readonly displayText: Signal<string> = computed((): string => this.value());\n\n public readonly placeholder: InputSignal<string> = input<string>('');\n public readonly readonly: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n public readonly rows: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(3, { transform: numberAttribute });\n public readonly resize: InputSignal<IRtTextareaResize> = input<IRtTextareaResize>('vertical');\n\n protected getEmptyValue(): string {\n return '';\n }\n\n protected focusAfterClear(): void {\n this.fieldEl()?.nativeElement.focus();\n }\n\n protected onInput(event: Event): void {\n const target: HTMLTextAreaElement = event.target as HTMLTextAreaElement;\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","<ng-container rtBlock=\"rt-textarea\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" qa-dataid=\"textarea-readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '—' }}</span>\n } @else {\n <textarea\n #fieldEl\n rtElem=\"control\"\n qa-dataid=\"textarea-control\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [style.resize]=\"resize()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"effectiveDisabled()\"\n [readOnly]=\"readonly()\"\n [rows]=\"rows()\"\n [value]=\"value()\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"></textarea>\n }\n</ng-container>\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n forwardRef,\n input,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '../icon/rt-icon.component';\nimport { IRtIcon } from '../icon/rt-icon.model';\nimport { IRtToggleSwitch } from './rt-toggle-switch.model';\n\nconst BEM_BLOCK: string = 'rt-toggle-switch';\n\n/**\n * On/off switch с `role=\"switch\"` + `aria-checked` — более правильный a11y\n * pattern чем `<input type=\"checkbox\">` для toggle (screen readers произносят\n * \"switch off/on\" вместо \"checkbox checked/unchecked\").\n *\n * Реализует `ControlValueAccessor` для `boolean` value через\n * `useExisting: forwardRef(...)` — `useClass` на self-reference вызывает\n * NG0200 cycle при boot'е.\n *\n * Source-of-truth для disabled — внутренний `isDisabled` signal. И signal-input\n * `disabled`, и CVA `setDisabledState` пишут в один и тот же signal: input —\n * через `effect()`, CVA — напрямую через метод. Так `[disabled]=\"true\"` и\n * `FormControl.disable()` ведут себя одинаково.\n *\n * Опциональные иконки `iconOff` / `iconOn` рисуются внутри трека статично:\n * off-иконка в начальной половине, on-иконка в конечной. Бегунок непрозрачен\n * и наезжает на иконку активного состояния, так что видна всегда иконка того\n * состояния, куда переключится контрол.\n *\n * ViewEncapsulation — default (Emulated), стили обёрнуты в `:host { ... }`.\n */\n@Component({\n selector: 'rt-toggle-switch',\n templateUrl: './rt-toggle-switch.component.html',\n styleUrl: './rt-toggle-switch.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // standalone components / directives\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef((): typeof RtToggleSwitchComponent => RtToggleSwitchComponent),\n multi: true,\n },\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtToggleSwitchComponent implements ControlValueAccessor {\n #onChange: (value: boolean) => void = (): void => undefined;\n #onTouched: () => void = (): void => undefined;\n\n protected readonly isOn: WritableSignal<boolean> = signal<boolean>(false);\n protected readonly isDisabled: WritableSignal<boolean> = signal<boolean>(false);\n\n /**\n * BEM-модификаторы для `[rtMod]`. Собираем в .ts, потому что\n * Angular template-parser не поддерживает computed property keys\n * в inline-объектах, а размер приходит ключом.\n */\n protected readonly bemMods: Signal<Record<string, boolean>> = computed((): Record<string, boolean> => ({\n [this.size()]: true,\n on: this.isOn(),\n disabled: this.isDisabled(),\n withIcons: this.iconOff() !== null || this.iconOn() !== null,\n }));\n\n public readonly inputId: InputSignal<string | null> = input<string | null>(null);\n\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n /** Размерный тир трека. */\n public readonly size: InputSignal<IRtToggleSwitch.Size> = input<IRtToggleSwitch.Size>('sm');\n\n /** Иконка выключенного состояния — в начальной половине трека. Пусто — без иконки. */\n public readonly iconOff: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /** Иконка включённого состояния — в конечной половине трека. Пусто — без иконки. */\n public readonly iconOn: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n constructor() {\n // Синхронизируем signal-input `disabled` в `isDisabled`, чтобы\n // `[disabled]=\"...\"` и `setDisabledState(...)` (CVA) писали в одно\n // и то же место. Effect живёт в injection context конструктора.\n effect((): void => {\n this.isDisabled.set(this.disabled());\n });\n }\n\n public writeValue(value: boolean | null | undefined): void {\n this.isOn.set(value === true);\n }\n\n public registerOnChange(fn: (value: boolean) => void): void {\n this.#onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.#onTouched = fn;\n }\n\n public setDisabledState(disabled: boolean): void {\n this.isDisabled.set(disabled);\n }\n\n protected toggle(): void {\n if (this.isDisabled()) {\n return;\n }\n const next: boolean = !this.isOn();\n this.isOn.set(next);\n this.#onChange(next);\n this.#onTouched();\n }\n}\n","<button\n rtBlock=\"rt-toggle-switch\"\n qa-dataid=\"toggle-switch-control\"\n type=\"button\"\n role=\"switch\"\n [rtMod]=\"bemMods()\"\n [attr.id]=\"inputId()\"\n [attr.aria-checked]=\"isOn()\"\n [attr.aria-label]=\"ariaLabel()\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\">\n <span rtElem=\"track\">\n @if (iconOff(); as iconOffName) {\n <rt-icon rtElem=\"icon-off\" size=\"sm\" [name]=\"iconOffName\" />\n }\n @if (iconOn(); as iconOnName) {\n <rt-icon rtElem=\"icon-on\" size=\"sm\" [name]=\"iconOnName\" />\n }\n <span rtElem=\"thumb\"></span>\n </span>\n</button>\n","/**\n * Модель `<rt-toggle-switch>`: один корневой неймспейс с префиксом `I`.\n */\n\nexport namespace IRtToggleSwitch {\n /**\n * Размерный тир трека. Маппинг на пиксели — в SCSS\n * (`--rt-toggle-track-width` / `-height` / `--rt-toggle-thumb-size`).\n * Default — `sm`: он совпадает по высоте с плотными контролами формы,\n * где тоггл стоит в ряду с текстом.\n */\n export type Size = 'sm' | 'md' | 'lg';\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, InputSignal, Signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { translateSignal } from '@jsverse/transloco';\n\nimport { ThemeService } from '../../platform';\n\nimport { RtIconButtonComponent } from '../icon-button';\nimport { IRtIcon } from '../icon/rt-icon.model';\nimport { RtToggleSwitchComponent } from '../toggle-switch';\nimport { IRtThemeToggle } from './rt-theme-toggle.model';\n\nconst BEM_BLOCK: string = 'rt-theme-toggle';\n\n/**\n * Переключатель темы в двух видах (`appearance`):\n * - `icon` — круглая icon-кнопка, рендер делегирован в `rt-icon-button`\n * (ghost-стиль, focus-visible, hover, aria-pressed через `[active]`);\n * - `switch` — тоггл-рельса `rt-toggle-switch` с иконками внутри трека.\n *\n * В обоих видах видна иконка противоположной темы — кликом пользователь\n * переходит к ней. В `switch` это получается само: бегунок стоит над иконкой\n * текущей темы и закрывает её.\n *\n * Инжектит ThemeService напрямую — допустимо благодаря расширенному boundary\n * ThemeService сам провайден root.\n */\n@Component({\n selector: 'rt-theme-toggle',\n templateUrl: './rt-theme-toggle.component.html',\n styleUrls: ['./rt-theme-toggle.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // angular\n FormsModule,\n\n // standalone components / directives\n RtIconButtonComponent,\n RtToggleSwitchComponent,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtThemeToggleComponent {\n /** Тексты компонента: сигналы, потому что язык может смениться без перезагрузки */\n readonly #t_themeToggleLabel: Signal<string> = translateSignal('rtKit.themeToggleLabel');\n\n readonly #theme: ThemeService = inject(ThemeService);\n\n protected readonly iconName: Signal<IRtIcon.Name> = computed((): IRtIcon.Name => (this.#theme.isDark() ? 'ico-sun' : 'moon'));\n\n protected readonly isSwitch: Signal<boolean> = computed((): boolean => this.appearance() === 'switch');\n\n protected readonly isDark: Signal<boolean> = this.#theme.isDark;\n\n protected readonly label: string = this.#t_themeToggleLabel();\n\n /** Внешний вид. Default `icon` — компактная кнопка для шапки. */\n public readonly appearance: InputSignal<IRtThemeToggle.Appearance> = input<IRtThemeToggle.Appearance>('icon');\n\n public onToggle(): void {\n this.#theme.toggle();\n }\n}\n","@if (isSwitch()) {\n <rt-toggle-switch\n qa-dataid=\"theme-toggle-control\"\n size=\"md\"\n iconOff=\"ico-sun\"\n iconOn=\"moon\"\n [ariaLabel]=\"label\"\n [ngModel]=\"isDark()\"\n (ngModelChange)=\"onToggle()\" />\n} @else {\n <rt-icon-button\n qa-dataid=\"theme-toggle-control\"\n variant=\"ghost\"\n size=\"md\"\n shape=\"circle\"\n [ariaLabel]=\"label\"\n [icon]=\"iconName()\"\n [active]=\"isDark()\"\n (clicked)=\"onToggle()\" />\n}\n","/**\n * Модель `<rt-theme-toggle>`: один корневой неймспейс с префиксом `I`.\n */\n\nexport namespace IRtThemeToggle {\n /**\n * Внешний вид переключателя:\n * - `icon` — круглая icon-кнопка с иконкой противоположной темы;\n * - `switch` — тоггл-рельса с иконками солнца и луны внутри трека.\n */\n export type Appearance = 'icon' | 'switch';\n}\n","import {\n booleanAttribute,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n OnDestroy,\n output,\n OutputEmitterRef,\n} from '@angular/core';\n\nimport { WINDOW } from '@rt-tools/core';\n\n/**\n * Триггер бесконечной прокрутки. Вешается на элемент-«маяк» в конце списка;\n * когда маяк приближается к области видимости — эмитит `(loadMore)`, чтобы\n * потребитель догрузил следующую страницу и ДОБАВИЛ её к уже показанным\n * сущностям (а не перезаписал).\n *\n * Использует `IntersectionObserver`, поэтому не зависит от того, какой предок\n * владеет вертикальным скроллом: контент скроллится в `.rt-container__content`\n * shell'а, а не в самом feature-компоненте, и браузер сам клипует маяк\n * скроллящими предками при расчёте пересечения.\n *\n * `rootMargin` расширяет нижнюю кромку корня, чтобы триггерить догрузку\n * ЗАРАНЕЕ (по умолчанию за половину вьюпорта до низа) — страница успевает\n * подгрузиться прежде, чем пользователь упрётся в конец списка. Пока идёт\n * запрос или страниц больше нет, потребитель ставит `[disabled]=\"true\"` —\n * наблюдение приостанавливается.\n */\n@Directive({\n selector: '[rtInfiniteScroll]',\n})\nexport class RtInfiniteScrollDirective implements OnDestroy {\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n // Конструкторы вроде IntersectionObserver объявлены на globalThis, а не на\n // интерфейсе Window — токен отдаёт тот же объект, тип лишь уточняется.\n readonly #window: Window & typeof globalThis = inject(WINDOW) as Window & typeof globalThis;\n\n #observer: IntersectionObserver | null = null;\n\n /** Пауза наблюдения: `true`, пока идёт догрузка или страниц больше нет. */\n public readonly disabled: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n /**\n * Запас корня снизу — за сколько до низа триггерить догрузку. CSS-формат\n * `rootMargin` (px или %). Default `50%` — половина вьюпорта заранее.\n */\n public readonly rootMargin: InputSignal<string> = input<string>('50%');\n\n public readonly loadMore: OutputEmitterRef<void> = output<void>();\n\n constructor() {\n effect((): void => {\n // Читаем оба сигнала, чтобы effect пересоздавал наблюдатель при их\n // смене. После завершения догрузки (disabled false-edge) нужен\n // свежий observe: IntersectionObserver не шлёт повторный колбэк,\n // если пересечение с прошлого раза не менялось.\n const disabled: boolean = this.disabled();\n const rootMargin: string = this.rootMargin();\n this.#disconnect();\n if (!disabled) {\n this.#observe(rootMargin);\n }\n });\n }\n\n public ngOnDestroy(): void {\n this.#disconnect();\n }\n\n #observe(rootMargin: string): void {\n const view: Window & typeof globalThis = this.#window;\n if (typeof view.IntersectionObserver === 'undefined') {\n return;\n }\n this.#observer = new view.IntersectionObserver(\n (entries: IntersectionObserverEntry[]): void => {\n const reached: boolean = entries.some((entry: IntersectionObserverEntry): boolean => entry.isIntersecting);\n if (reached) {\n this.loadMore.emit();\n }\n },\n { root: null, threshold: 0, rootMargin }\n );\n this.#observer.observe(this.#host.nativeElement);\n }\n\n #disconnect(): void {\n this.#observer?.disconnect();\n this.#observer = null;\n }\n}\n","import { Directive, inject, input, InputSignal, TemplateRef } from '@angular/core';\n\nimport { IRtThreadList } from './rt-thread-list.model';\n\n/**\n * Помечает `<ng-template>` содержимого строки списка. Входом `[rtThreadListRow]`\n * потребитель передаёт свой массив строк — из него выводится тип `TRow`, поэтому\n * `let-row` в темплейте типизируется строго (context-guard ниже это подтверждает).\n */\n@Directive({\n selector: 'ng-template[rtThreadListRow]',\n})\nexport class RtThreadListRowDirective<TRow extends IRtThreadList.Row> {\n public readonly templateRef: TemplateRef<IRtThreadList.RowContext<TRow>> =\n inject<TemplateRef<IRtThreadList.RowContext<TRow>>>(TemplateRef);\n\n public readonly rows: InputSignal<readonly TRow[]> = input<readonly TRow[]>([], {\n alias: 'rtThreadListRow',\n });\n\n public static ngTemplateContextGuard<TRow extends IRtThreadList.Row>(\n _directive: RtThreadListRowDirective<TRow>,\n context: unknown\n ): context is IRtThreadList.RowContext<TRow> {\n return true;\n }\n}\n\n/**\n * Помечает `<ng-template>` с фильтрами — его содержимое рендерится в поповере,\n * который открывает иконка-фильтр в шапке списка.\n */\n@Directive({\n selector: 'ng-template[rtThreadListFilters]',\n})\nexport class RtThreadListFiltersDirective {\n public readonly templateRef: TemplateRef<unknown> = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/**\n * Помечает `<ng-template>` с кастомным контролом поиска. Когда потребитель его\n * проецирует, шапка списка рендерит его содержимое вместо встроенного `rt-input`\n * — так воркспейс подставляет свой автокомплит по каталогу вместо текстового\n * поиска, не ломая generic-природу списка.\n */\n@Directive({\n selector: 'ng-template[rtThreadListSearch]',\n})\nexport class RtThreadListSearchDirective {\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 DestroyRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n OnInit,\n output,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\n\nimport { distinctUntilChanged, map } from 'rxjs';\n\nimport { translateSignal, TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { searchDebounce } from '../../util';\n\nimport { RtInfiniteScrollDirective } from '../../scroll/infinite-scroll.directive';\nimport { RtEmptyStateComponent } from '../empty-state/rt-empty-state.component';\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { RtIconComponent } from '../icon/rt-icon.component';\nimport { IRtIcon } from '../icon/rt-icon.model';\nimport { RtInputComponent } from '../input/rt-input.component';\nimport { RtPopoverDirective } from '../popover/rt-popover.directive';\nimport { RtSkeletonComponent } from '../skeleton/rt-skeleton.component';\nimport { RtThreadListFiltersDirective, RtThreadListRowDirective, RtThreadListSearchDirective } from './rt-thread-list.directives';\nimport { IRtThreadList } from './rt-thread-list.model';\n\nconst BEM_BLOCK: string = 'rt-thread-list';\n\n/** Кол-во скелетон-строк на первичной загрузке (пока `rows` пусты). */\nconst SKELETON_ROWS_COUNT: number = 6;\n\n/**\n * Презентационный список тредов для воркспейсов:\n * поиск с дебаунсом, фильтр-поповер и бесконечная прокрутка. Данные и оркестрация\n * — на вызывающем; список стора/api не видит.\n *\n * Строку рисует потребитель через `<ng-template rtThreadListRow let-row>` (body +\n * meta); оболочка владеет кнопкой строки (active/unread/overdue), поиском, кнопкой\n * фильтров (точка-индикатор при `filtersActive`) и скроллом. Фильтры потребитель\n * кладёт в `<ng-template rtThreadListFilters>` — они рендерятся в поповере.\n */\n@Component({\n selector: 'rt-thread-list',\n templateUrl: './rt-thread-list.component.html',\n styleUrls: ['./rt-thread-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n NgTemplateOutlet,\n ReactiveFormsModule,\n\n // standalone components / directives\n RtEmptyStateComponent,\n RtIconComponent,\n RtIconButtonComponent,\n RtInputComponent,\n RtPopoverDirective,\n RtSkeletonComponent,\n BlockDirective,\n ElemDirective,\n RtInfiniteScrollDirective,\n ModDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtThreadListComponent<TRow extends IRtThreadList.Row> implements OnInit {\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n readonly #t_uiSearch: Signal<string> = translateSignal('rtKit.uiSearch');\n readonly #t_uiNothingFound: Signal<string> = translateSignal('rtKit.uiNothingFound');\n\n protected readonly searchPlaceholderText: Signal<string> = computed((): string => this.searchPlaceholder() || this.#t_uiSearch());\n protected readonly emptyTitle: Signal<string> = computed((): string => this.emptyText() || this.#t_uiNothingFound());\n\n protected readonly skeletonRows: number[] = Array.from({ length: SKELETON_ROWS_COUNT }, (_: unknown, i: number): number => i);\n\n /** Декоративные строки-превью для иллюстрации пустого состояния списка. */\n protected readonly emptyPreviewRows: readonly {\n id: number;\n icon: IRtIcon.Name;\n offset: boolean;\n }[] = [\n { id: 1, icon: 'user', offset: false },\n { id: 2, icon: 'users', offset: true },\n { id: 3, icon: 'user', offset: false },\n ];\n\n protected readonly searchControl: FormControl<string> = new FormControl<string>('', {\n nonNullable: true,\n });\n\n protected readonly rowTemplate: Signal<RtThreadListRowDirective<TRow> | undefined> = contentChild(RtThreadListRowDirective<TRow>);\n\n protected readonly filtersTemplate: Signal<RtThreadListFiltersDirective | undefined> = contentChild(RtThreadListFiltersDirective);\n\n protected readonly searchTemplate: Signal<RtThreadListSearchDirective | undefined> = contentChild(RtThreadListSearchDirective);\n\n public readonly rows: InputSignal<readonly TRow[]> = input<readonly TRow[]>([]);\n\n public readonly activeId: InputSignal<number | null> = input<number | null>(null);\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly searchPlaceholder: InputSignal<string> = input<string>('');\n\n public readonly emptyText: InputSignal<string> = input<string>('');\n\n public readonly loading: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n public readonly fetching: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n public readonly hasMore: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n public readonly filtersActive: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n // Имя `select` зарезервировано под нативное DOM-событие\n // (@angular-eslint/no-output-native), поэтому output переименован.\n public readonly selectRow: OutputEmitterRef<number> = output<number>();\n\n // Ctrl/⌘+клик по строке: потребитель открывает строку в новой вкладке.\n // Обычный клик остаётся на `selectRow`.\n public readonly openInNewTab: OutputEmitterRef<number> = output<number>();\n\n public readonly searchChange: OutputEmitterRef<string> = output<string>();\n\n public readonly loadMore: OutputEmitterRef<void> = output<void>();\n\n public ngOnInit(): void {\n // Дебаунс непустого ввода; очистка крестиком применяется сразу (searchDebounce).\n this.searchControl.valueChanges\n .pipe(\n map((value: string): string => value.trim()),\n searchDebounce(),\n distinctUntilChanged(),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe((value: string): void => this.searchChange.emit(value));\n }\n\n protected onSelect(id: number, event: MouseEvent): void {\n // Ctrl (Win/Linux) или ⌘ (macOS) — «открыть в новой вкладке», как у\n // нативных ссылок. Иначе — обычный выбор строки в текущей вкладке.\n if (event.ctrlKey || event.metaKey) {\n this.openInNewTab.emit(id);\n return;\n }\n this.selectRow.emit(id);\n }\n\n protected onLoadMore(): void {\n this.loadMore.emit();\n }\n}\n","<ng-container rtBlock=\"rt-thread-list\">\n <header rtElem=\"head\">\n @if (searchTemplate()) {\n <div rtElem=\"search\" qa-dataid=\"thread-list-search\">\n <ng-container [ngTemplateOutlet]=\"searchTemplate()?.templateRef ?? null\" />\n </div>\n } @else {\n <rt-input\n rtElem=\"search\"\n qa-dataid=\"thread-list-search\"\n iconLeft=\"search\"\n [placeholder]=\"searchPlaceholderText()\"\n [formControl]=\"searchControl\" />\n }\n @if (filtersTemplate()) {\n <rt-icon-button\n rtElem=\"filter-trigger\"\n qa-dataid=\"thread-list-filter\"\n icon=\"filter\"\n variant=\"secondary\"\n rtPopoverAlign=\"end\"\n [ariaLabel]=\"'rtKit.uiFilters' | transloco\"\n [indicator]=\"filtersActive()\"\n [rtPopover]=\"filtersPanel\" />\n }\n </header>\n\n <ng-template #filtersPanel>\n <div rtElem=\"filters-panel\" qa-dataid=\"thread-list-filters-panel\">\n <ng-container [ngTemplateOutlet]=\"filtersTemplate()?.templateRef ?? null\" />\n </div>\n </ng-template>\n\n <div rtElem=\"rows\" qa-dataid=\"thread-list-rows\">\n @if (loading() && !rows().length) {\n @for (i of skeletonRows; track i) {\n <div rtElem=\"row-skeleton\" qa-dataid=\"thread-list-row-skeleton\" aria-hidden=\"true\">\n <rt-skeleton width=\"60%\" height=\"14px\" />\n <rt-skeleton width=\"90%\" height=\"12px\" />\n </div>\n }\n } @else if (!rows().length) {\n <rt-empty-state\n rtElem=\"empty\"\n qa-dataid=\"thread-list-empty\"\n [description]=\"'rtKit.uiThreadListEmptyHint' | transloco\"\n [title]=\"emptyTitle()\">\n <div rtEmptyIllustration rtElem=\"empty-preview\">\n @for (row of emptyPreviewRows; track row.id) {\n <div rtElem=\"empty-card\" [rtMod]=\"{ offset: row.offset }\">\n <span rtElem=\"empty-avatar\">\n <rt-icon size=\"sm\" [name]=\"row.icon\" />\n </span>\n <span rtElem=\"empty-lines\">\n <span rtElem=\"empty-line\" [rtMod]=\"{ short: true }\"></span>\n <span rtElem=\"empty-line\"></span>\n </span>\n </div>\n }\n </div>\n </rt-empty-state>\n } @else {\n @for (row of rows(); track row.id) {\n <button\n rtElem=\"row\"\n qa-dataid=\"thread-list-row\"\n type=\"button\"\n [attr.data-id]=\"row.id\"\n [attr.data-unread]=\"row.hasUnread\"\n [attr.aria-current]=\"row.id === activeId() ? 'true' : null\"\n [rtMod]=\"{\n active: row.id === activeId(),\n unread: row.hasUnread,\n overdue: !!row.overdue,\n }\"\n (click)=\"onSelect(row.id, $event)\">\n <ng-container [ngTemplateOutlet]=\"rowTemplate()?.templateRef ?? null\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </button>\n }\n @if (fetching()) {\n <div rtElem=\"row-loader\" qa-dataid=\"thread-list-row-loader\">\n <rt-skeleton width=\"90%\" height=\"12px\" />\n </div>\n }\n @if (hasMore()) {\n <div\n rtElem=\"load-anchor\"\n qa-dataid=\"thread-list-load-more\"\n aria-hidden=\"true\"\n rtInfiniteScroll\n [disabled]=\"fetching()\"\n (loadMore)=\"onLoadMore()\"></div>\n }\n }\n </div>\n</ng-container>\n","import { ChangeDetectionStrategy, Component, input, InputSignal } from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { IRtTimeline } from './rt-timeline.model';\n\nconst BEM_BLOCK: string = 'rt-timeline';\n\n/**\n * Вертикальный таймлайн-степпер: список шагов сверху вниз, каждый — точка на\n * соединительной линии, заголовок и вторичная строка (время + инициатор). Шаги\n * задаются через input `steps`; статус точки (`complete`/`current`/`pending`)\n * приходит готовым в каждом шаге — компонент презентационный и порядок не считает.\n */\n@Component({\n selector: 'rt-timeline',\n templateUrl: './rt-timeline.component.html',\n styleUrl: './rt-timeline.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtTimelineComponent {\n public readonly steps: InputSignal<readonly IRtTimeline.Step[]> = input<readonly IRtTimeline.Step[]>([]);\n}\n","<ol rtBlock=\"rt-timeline\" qa-dataid=\"timeline\">\n @for (step of steps(); track $index; let last = $last) {\n <li rtElem=\"item\" qa-dataid=\"timeline-item\" [attr.data-status]=\"step.status\" [rtMod]=\"{ status: step.status }\">\n <span rtElem=\"rail\" aria-hidden=\"true\">\n <span rtElem=\"dot\" [rtMod]=\"{ status: step.status }\"></span>\n @if (!last) {\n <span rtElem=\"line\"></span>\n }\n </span>\n <span rtElem=\"body\">\n <span rtElem=\"label\" qa-dataid=\"timeline-item-label\">{{ step.label }}</span>\n @if (step.meta || step.actor) {\n <span rtElem=\"meta\">\n @if (step.meta) {\n <span rtElem=\"time\" qa-dataid=\"timeline-item-time\">{{ step.meta }}</span>\n }\n @if (step.actor) {\n <span rtElem=\"actor\" qa-dataid=\"timeline-item-actor\">{{ step.actor }}</span>\n }\n </span>\n }\n </span>\n </li>\n }\n</ol>\n","import { ChangeDetectionStrategy, Component, computed, inject, Signal } from '@angular/core';\n\nimport { translateSignal, TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RtButtonDirective } from '../button/rt-button.directive';\nimport { RtDialogRef } from '../dialog/rt-dialog-ref';\nimport { RtDialogComponent } from '../dialog/rt-dialog.component';\nimport { RT_DIALOG_DATA } from '../dialog/rt-dialog.tokens';\n\nconst BEM_BLOCK: string = 'rt-welcome-dialog';\n\n/** Ключ подписи CTA по умолчанию: язык известен только после старта приложения */\nconst DEFAULT_CTA_KEY: string = 'rtKit.uiContinue';\n\nexport namespace IRtWelcomeDialog {\n /** Payload модалки: настраиваемый текст приветствия + подпись CTA-кнопки. */\n export interface Data {\n message: string;\n ctaLabel?: string;\n }\n}\n\n/**\n * Welcome-модалка первого входа: показывает настраиваемый текст приветствия роли.\n * Открывается программно через `RtDialogService.open(RtWelcomeDialogComponent, { data })`.\n *\n * Текст приходит многострочным: первый абзац (до пустой строки) рендерится\n * заголовком, остальные — параграфами описания. Без `rt-dialog-header` —\n * единственное действие закрытия — CTA-кнопка.\n */\n@Component({\n selector: 'rt-welcome-dialog',\n templateUrl: './rt-welcome-dialog.component.html',\n styleUrl: './rt-welcome-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n // standalone components / directives\n RtButtonDirective,\n RtDialogComponent,\n BlockDirective,\n ElemDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtWelcomeDialogComponent {\n readonly #dialogRef: RtDialogRef = inject(RtDialogRef);\n readonly #data: IRtWelcomeDialog.Data | null = inject<IRtWelcomeDialog.Data | null>(RT_DIALOG_DATA, { optional: true });\n\n readonly #defaultCtaLabel: Signal<string> = translateSignal(DEFAULT_CTA_KEY);\n\n protected readonly title: string;\n\n protected readonly paragraphs: string[];\n\n /** Своя подпись важнее умолчания: роль знает, куда ведёт кнопка */\n protected readonly ctaLabel: Signal<string> = computed((): string => this.#data?.ctaLabel || this.#defaultCtaLabel());\n\n constructor() {\n const parts: string[] = (this.#data?.message ?? '')\n .split(/\\n{2,}/)\n .map((part: string): string => part.trim())\n .filter((part: string): boolean => part.length > 0);\n this.title = parts[0] ?? '';\n this.paragraphs = parts.slice(1);\n }\n\n protected onClose(): void {\n this.#dialogRef.close();\n }\n}\n","<rt-dialog width=\"335px\" [ariaLabel]=\"'rtKit.uiWelcomeAria' | transloco\">\n <div rtBlock=\"rt-welcome-dialog\">\n <div rtElem=\"text\">\n @if (title) {\n <h2 rtElem=\"title\" qa-dataid=\"welcome-dialog-title\">{{ title }}</h2>\n }\n @for (paragraph of paragraphs; track $index) {\n <p rtElem=\"description\" qa-dataid=\"welcome-dialog-description\">{{ paragraph }}</p>\n }\n </div>\n <!-- rtButton-директива рендерит label через Renderer2 в afterNextRender —\n статического child-контента в template нет намеренно. -->\n <!-- eslint-disable-next-line @angular-eslint/template/elements-content -->\n <button\n rtButton\n rtElem=\"cta\"\n qa-dataid=\"welcome-dialog-cta\"\n type=\"button\"\n theme=\"primary\"\n appearance=\"filled\"\n [label]=\"ctaLabel()\"\n (click)=\"onClose()\"></button>\n </div>\n</rt-dialog>\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { IRtWorkspace } from './rt-workspace.model';\n\n@Directive({\n selector: '[rtWorkspaceDesktopOnly]',\n host: {\n class: 'rt-workspace__desktop-only',\n },\n})\nexport class RtWorkspaceDesktopOnlyDirective {}\n\n@Directive({\n selector: '[rtWorkspaceList]',\n})\nexport class RtWorkspaceListDirective {\n public readonly templateRef: TemplateRef<IRtWorkspace.SlotContext> = inject<TemplateRef<IRtWorkspace.SlotContext>>(TemplateRef);\n\n public static ngTemplateContextGuard(_directive: RtWorkspaceListDirective, context: unknown): context is IRtWorkspace.SlotContext {\n return true;\n }\n}\n\n@Directive({\n selector: '[rtWorkspaceCenter]',\n})\nexport class RtWorkspaceCenterDirective {\n public readonly templateRef: TemplateRef<IRtWorkspace.SlotContext> = inject<TemplateRef<IRtWorkspace.SlotContext>>(TemplateRef);\n\n public static ngTemplateContextGuard(_directive: RtWorkspaceCenterDirective, context: unknown): context is IRtWorkspace.SlotContext {\n return true;\n }\n}\n\n@Directive({\n selector: '[rtWorkspaceAside]',\n})\nexport class RtWorkspaceAsideDirective {\n public readonly templateRef: TemplateRef<IRtWorkspace.SlotContext> = inject<TemplateRef<IRtWorkspace.SlotContext>>(TemplateRef);\n\n public static ngTemplateContextGuard(_directive: RtWorkspaceAsideDirective, context: unknown): context is IRtWorkspace.SlotContext {\n return true;\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n output,\n OutputEmitterRef,\n Renderer2,\n signal,\n Signal,\n untracked,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { StorageService } from '@rt-tools/core';\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { RtWorkspaceAsideDirective, RtWorkspaceCenterDirective, RtWorkspaceListDirective } from './rt-workspace.directives';\nimport { IRtWorkspace } from './rt-workspace.model';\n\nconst BEM_BLOCK: string = 'rt-workspace';\nconst STORAGE_PREFIX: string = 'rt-workspace:';\nconst KEYBOARD_STEP: number = 16;\n\ninterface IDragState {\n kind: IRtWorkspace.PanelKind;\n startX: number;\n startWidth: number;\n}\n\n@Component({\n selector: 'rt-workspace',\n templateUrl: './rt-workspace.component.html',\n styleUrls: ['./rt-workspace.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n NgTemplateOutlet,\n\n // standalone components / directives\n RtIconButtonComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-workspace--has-active]': 'hasActive()',\n '[class.rt-workspace--aside-collapsed]': 'asideCollapsed()',\n '[class.rt-workspace--resizing]': 'resizing()',\n '[style.--rt-workspace-list-size]': \"listWidth() + 'px'\",\n '[style.--rt-workspace-aside-size]': \"asideWidth() + 'px'\",\n },\n})\nexport class RtWorkspaceComponent implements IRtWorkspace.PanelApi {\n readonly #storage: StorageService = inject(StorageService);\n\n readonly #renderer: Renderer2 = inject(Renderer2);\n\n readonly #hostRef: ElementRef<HTMLElement> = inject(ElementRef);\n\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n readonly #listWidthOverride: WritableSignal<number | null> = signal<number | null>(null);\n\n readonly #asideWidthOverride: WritableSignal<number | null> = signal<number | null>(null);\n\n readonly #asideCollapsed: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #asideOpen: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #resizing: WritableSignal<boolean> = signal<boolean>(false);\n\n #restoredKey: string | null = null;\n\n #dragState: IDragState | null = null;\n\n #detachDragListeners: (() => void) | null = null;\n\n protected readonly listSlot: Signal<RtWorkspaceListDirective | undefined> = contentChild(RtWorkspaceListDirective);\n\n protected readonly centerSlot: Signal<RtWorkspaceCenterDirective | undefined> = contentChild(RtWorkspaceCenterDirective);\n\n protected readonly asideSlot: Signal<RtWorkspaceAsideDirective | undefined> = contentChild(RtWorkspaceAsideDirective);\n\n protected readonly resizing: Signal<boolean> = this.#resizing.asReadonly();\n\n protected readonly slotContext: IRtWorkspace.SlotContext = { $implicit: this };\n\n public readonly storageKey: InputSignal<string | null> = input<string | null>(null);\n\n public readonly hasActive: InputSignal<boolean> = input<boolean>(false);\n\n public readonly listMinWidth: InputSignalWithTransform<number, number | string> = input<number, number | string>(240, {\n transform: numberAttribute,\n });\n\n public readonly listMaxWidth: InputSignalWithTransform<number, number | string> = input<number, number | string>(480, {\n transform: numberAttribute,\n });\n\n public readonly listDefaultWidth: InputSignalWithTransform<number, number | string> = input<number, number | string>(320, {\n transform: numberAttribute,\n });\n\n public readonly asideMinWidth: InputSignalWithTransform<number, number | string> = input<number, number | string>(280, {\n transform: numberAttribute,\n });\n\n public readonly asideMaxWidth: InputSignalWithTransform<number, number | string> = input<number, number | string>(560, {\n transform: numberAttribute,\n });\n\n public readonly asideDefaultWidth: InputSignalWithTransform<number, number | string> = input<number, number | string>(360, {\n transform: numberAttribute,\n });\n\n public readonly centerMinWidth: InputSignalWithTransform<number, number | string> = input<number, number | string>(360, {\n transform: numberAttribute,\n });\n\n public readonly backClicked: OutputEmitterRef<void> = output<void>();\n\n public readonly listWidth: Signal<number> = computed((): number => this.#listWidthOverride() ?? this.listDefaultWidth());\n\n public readonly asideWidth: Signal<number> = computed((): number => this.#asideWidthOverride() ?? this.asideDefaultWidth());\n\n public readonly asideCollapsed: Signal<boolean> = this.#asideCollapsed.asReadonly();\n\n public readonly asideOpen: Signal<boolean> = this.#asideOpen.asReadonly();\n\n constructor() {\n effect((): void => {\n const key: string | null = this.storageKey();\n if (key === null || key === this.#restoredKey) {\n return;\n }\n this.#restoredKey = key;\n untracked((): void => this.#restoreFromStorage(key));\n });\n\n this.#destroyRef.onDestroy((): void => this.#stopDragging());\n }\n\n public toggleAsideCollapsed(): void {\n this.#asideCollapsed.update((collapsed: boolean): boolean => !collapsed);\n this.#persist();\n }\n\n public openAside(): void {\n this.#asideOpen.set(true);\n }\n\n public closeAside(): void {\n this.#asideOpen.set(false);\n }\n\n public toggleAside(): void {\n this.#asideOpen.update((open: boolean): boolean => !open);\n }\n\n protected onBackClicked(): void {\n this.closeAside();\n this.backClicked.emit();\n }\n\n protected onHandlePointerDown(event: PointerEvent, kind: IRtWorkspace.PanelKind): void {\n if (event.button !== 0) {\n return;\n }\n event.preventDefault();\n this.#dragState = {\n kind,\n startX: event.clientX,\n startWidth: kind === 'list' ? this.listWidth() : this.asideWidth(),\n };\n this.#resizing.set(true);\n\n const detachMove: () => void = this.#renderer.listen('document', 'pointermove', (moveEvent: PointerEvent): void =>\n this.#onDragMove(moveEvent)\n );\n const detachUp: () => void = this.#renderer.listen('document', 'pointerup', (): void => {\n this.#persist();\n this.#stopDragging();\n });\n this.#detachDragListeners = (): void => {\n detachMove();\n detachUp();\n };\n }\n\n protected onHandleKeydown(event: KeyboardEvent, kind: IRtWorkspace.PanelKind): void {\n let delta: number;\n if (event.key === 'ArrowRight') {\n delta = kind === 'list' ? KEYBOARD_STEP : -KEYBOARD_STEP;\n } else if (event.key === 'ArrowLeft') {\n delta = kind === 'list' ? -KEYBOARD_STEP : KEYBOARD_STEP;\n } else {\n return;\n }\n event.preventDefault();\n const current: number = kind === 'list' ? this.listWidth() : this.asideWidth();\n this.#applyWidth(kind, current + delta);\n this.#persist();\n }\n\n protected onHandleReset(kind: IRtWorkspace.PanelKind): void {\n const override: WritableSignal<number | null> = kind === 'list' ? this.#listWidthOverride : this.#asideWidthOverride;\n override.set(null);\n this.#persist();\n }\n\n #onDragMove(event: PointerEvent): void {\n const drag: IDragState | null = this.#dragState;\n if (drag === null) {\n return;\n }\n const dx: number = event.clientX - drag.startX;\n const rawWidth: number = drag.kind === 'list' ? drag.startWidth + dx : drag.startWidth - dx;\n this.#applyWidth(drag.kind, rawWidth);\n }\n\n #applyWidth(kind: IRtWorkspace.PanelKind, rawWidth: number): void {\n const override: WritableSignal<number | null> = kind === 'list' ? this.#listWidthOverride : this.#asideWidthOverride;\n override.set(this.#clampWidth(kind, rawWidth));\n }\n\n #clampWidth(kind: IRtWorkspace.PanelKind, rawWidth: number): number {\n const min: number = kind === 'list' ? this.listMinWidth() : this.asideMinWidth();\n const configMax: number = kind === 'list' ? this.listMaxWidth() : this.asideMaxWidth();\n const otherWidth: number = kind === 'list' ? this.asideWidth() : this.listWidth();\n const hostWidth: number = this.#hostRef.nativeElement.clientWidth;\n const available: number = hostWidth > 0 ? hostWidth - otherWidth - this.centerMinWidth() : Number.POSITIVE_INFINITY;\n const max: number = Math.max(min, Math.min(configMax, available));\n return Math.round(Math.min(max, Math.max(min, rawWidth)));\n }\n\n #stopDragging(): void {\n this.#detachDragListeners?.();\n this.#detachDragListeners = null;\n this.#dragState = null;\n this.#resizing.set(false);\n }\n\n #restoreFromStorage(key: string): void {\n const stored: IRtWorkspace.PersistedState | null =\n this.#storage.getItem<IRtWorkspace.PersistedState>(`${STORAGE_PREFIX}${key}`) ?? null;\n if (stored === null || typeof stored !== 'object') {\n return;\n }\n if (typeof stored.listWidth === 'number') {\n this.#listWidthOverride.set(this.#clampWidth('list', stored.listWidth));\n }\n if (typeof stored.asideWidth === 'number') {\n this.#asideWidthOverride.set(this.#clampWidth('aside', stored.asideWidth));\n }\n this.#asideCollapsed.set(stored.asideCollapsed === true);\n }\n\n #persist(): void {\n const key: string | null = this.storageKey();\n if (key === null) {\n return;\n }\n const state: IRtWorkspace.PersistedState = {\n listWidth: this.listWidth(),\n asideWidth: this.asideWidth(),\n asideCollapsed: this.asideCollapsed(),\n };\n this.#storage.setItem(`${STORAGE_PREFIX}${key}`, state);\n }\n}\n","<ng-container rtBlock=\"rt-workspace\">\n <section rtElem=\"list\" qa-dataid=\"workspace-list\">\n <ng-container [ngTemplateOutlet]=\"listSlot()?.templateRef ?? null\" [ngTemplateOutletContext]=\"slotContext\" />\n </section>\n\n <div\n rtElem=\"handle\"\n qa-dataid=\"workspace-handle-list\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n tabindex=\"0\"\n [attr.aria-label]=\"'rtKit.uiResizeList' | transloco\"\n [rtMod]=\"{ list: true }\"\n [attr.aria-valuenow]=\"listWidth()\"\n [attr.aria-valuemin]=\"listMinWidth()\"\n [attr.aria-valuemax]=\"listMaxWidth()\"\n (pointerdown)=\"onHandlePointerDown($event, 'list')\"\n (dblclick)=\"onHandleReset('list')\"\n (keydown)=\"onHandleKeydown($event, 'list')\"></div>\n\n <section rtElem=\"center\" qa-dataid=\"workspace-center\">\n @if (hasActive()) {\n <div rtElem=\"mobile-toolbar\">\n <rt-icon-button\n qa-dataid=\"workspace-back\"\n icon=\"arrow-left\"\n variant=\"secondary\"\n [ariaLabel]=\"'rtKit.uiBackToList' | transloco\"\n [tooltip]=\"'rtKit.uiToList' | transloco\"\n (clicked)=\"onBackClicked()\" />\n <rt-icon-button\n qa-dataid=\"workspace-open-details\"\n icon=\"info-circle\"\n variant=\"secondary\"\n [ariaLabel]=\"'rtKit.uiShowDetails' | transloco\"\n [tooltip]=\"'rtKit.uiDetails' | transloco\"\n (clicked)=\"openAside()\" />\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"centerSlot()?.templateRef ?? null\" [ngTemplateOutletContext]=\"slotContext\" />\n </section>\n\n <div\n rtElem=\"handle\"\n qa-dataid=\"workspace-handle-aside\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n tabindex=\"0\"\n [attr.aria-label]=\"'rtKit.uiResizeDetails' | transloco\"\n [rtMod]=\"{ aside: true }\"\n [attr.aria-valuenow]=\"asideWidth()\"\n [attr.aria-valuemin]=\"asideMinWidth()\"\n [attr.aria-valuemax]=\"asideMaxWidth()\"\n (pointerdown)=\"onHandlePointerDown($event, 'aside')\"\n (dblclick)=\"onHandleReset('aside')\"\n (keydown)=\"onHandleKeydown($event, 'aside')\"></div>\n\n <section rtElem=\"aside\" qa-dataid=\"workspace-aside\" [rtMod]=\"{ open: asideOpen() }\">\n <ng-container [ngTemplateOutlet]=\"asideSlot()?.templateRef ?? null\" [ngTemplateOutletContext]=\"slotContext\" />\n </section>\n</ng-container>\n","import { DecimalPipe, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n InputSignal,\n output,\n OutputEmitterRef,\n signal,\n Signal,\n untracked,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { NotificationBus } from '../../platform';\n\nimport { RtAsideSectionComponent } from '../aside-section/rt-aside-section.component';\nimport { RtButtonDirective } from '../button/rt-button.directive';\nimport { RtConfirmDirective } from '../confirm-popover/rt-confirm.directive';\nimport { RtDetailListComponent } from '../detail-list/rt-detail-list.component';\nimport { RtDetailRowComponent } from '../detail-list/rt-detail-row.component';\nimport { RtEmptyStateComponent } from '../empty-state/rt-empty-state.component';\nimport { RtFieldComponent } from '../field/rt-field.component';\nimport { RtIconButtonComponent } from '../icon-button/rt-icon-button.component';\nimport { RtMoneyListComponent } from '../money-list/rt-money-list.component';\nimport { RtMoneyRowComponent } from '../money-list/rt-money-row.component';\nimport { RtNoteComponent } from '../note/rt-note.component';\nimport { RtSelectComponent } from '../select/rt-select.component';\nimport { RtSpinnerComponent } from '../spinner/rt-spinner.component';\nimport { RtTabDirective } from '../tabs/rt-tab.directive';\nimport { RtTabsComponent } from '../tabs/rt-tabs.component';\nimport { RtTextareaComponent } from '../textarea/rt-textarea.component';\nimport { RtTimelineComponent } from '../timeline/rt-timeline.component';\nimport { RtToggleSwitchComponent } from '../toggle-switch/rt-toggle-switch.component';\nimport { IRtWorkspaceDetails } from './rt-workspace-details.model';\n\nconst BEM_BLOCK: string = 'rt-workspace-details';\n\ninterface ITransitionFormShape {\n to_key: FormControl<string | null>;\n note: FormControl<string | null>;\n}\n\n@Component({\n selector: 'rt-workspace-details',\n templateUrl: './rt-workspace-details.component.html',\n styleUrls: ['./rt-workspace-details.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n DecimalPipe,\n FormsModule,\n NgTemplateOutlet,\n ReactiveFormsModule,\n\n // standalone components / directives\n RtAsideSectionComponent,\n RtButtonDirective,\n RtConfirmDirective,\n RtDetailListComponent,\n RtDetailRowComponent,\n RtEmptyStateComponent,\n RtFieldComponent,\n RtIconButtonComponent,\n RtMoneyListComponent,\n RtMoneyRowComponent,\n RtNoteComponent,\n RtSelectComponent,\n RtSpinnerComponent,\n RtTabDirective,\n RtTabsComponent,\n RtTextareaComponent,\n RtTimelineComponent,\n RtToggleSwitchComponent,\n BlockDirective,\n ElemDirective,\n TranslocoPipe,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtWorkspaceDetailsComponent {\n readonly #notificationBus: NotificationBus = inject(NotificationBus);\n\n readonly #lastEntityId: WritableSignal<number | null | undefined> = signal<number | null | undefined>(undefined);\n\n readonly #lastAgentId: WritableSignal<number | null | undefined> = signal<number | null | undefined>(undefined);\n\n #lastTransitionSuccess: string | null = null;\n\n #lastTransitionError: string | null = null;\n\n #lastTransitionSubmitError: string | null = null;\n\n #lastAuditError: string | null = null;\n\n #lastPanelError: string | null = null;\n\n protected readonly editingAgent: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly selectedAgentId: WritableSignal<number | null> = signal<number | null>(null);\n\n protected readonly transitionForm: FormGroup<ITransitionFormShape> = new FormGroup<ITransitionFormShape>({\n to_key: new FormControl<string | null>(null, {\n validators: [Validators.required],\n }),\n note: new FormControl<string | null>(null),\n });\n\n protected readonly hasTabs: Signal<boolean> = computed((): boolean => this.transition() !== null || this.audit() !== null);\n\n protected readonly noTransitions: Signal<boolean> = computed((): boolean => {\n const transition: IRtWorkspaceDetails.Transition | null = this.transition();\n return transition !== null && !transition.loading && transition.error === null && transition.options.length === 0;\n });\n\n protected readonly canSaveReassign: Signal<boolean> = computed((): boolean => {\n const edit: IRtWorkspaceDetails.AgentEdit | null = this.agentEdit();\n const selected: number | null = this.selectedAgentId();\n return edit !== null && selected !== null && selected !== edit.currentAgentId;\n });\n\n public readonly title: InputSignal<string | null> = input<string | null>(null);\n\n public readonly entityId: InputSignal<number | null> = input<number | null>(null);\n\n public readonly loading: InputSignal<boolean> = input<boolean>(false);\n\n public readonly busy: InputSignal<boolean> = input<boolean>(false);\n\n public readonly rows: InputSignal<readonly IRtWorkspaceDetails.Row[]> = input<readonly IRtWorkspaceDetails.Row[]>([]);\n\n public readonly agentEdit: InputSignal<IRtWorkspaceDetails.AgentEdit | null> = input<IRtWorkspaceDetails.AgentEdit | null>(null);\n\n public readonly money: InputSignal<readonly IRtWorkspaceDetails.MoneyRow[]> = input<readonly IRtWorkspaceDetails.MoneyRow[]>([]);\n\n public readonly toggles: InputSignal<readonly IRtWorkspaceDetails.Toggle[]> = input<readonly IRtWorkspaceDetails.Toggle[]>([]);\n\n public readonly toggleHint: InputSignal<string | null> = input<string | null>(null);\n\n public readonly transition: InputSignal<IRtWorkspaceDetails.Transition | null> = input<IRtWorkspaceDetails.Transition | null>(null);\n\n public readonly audit: InputSignal<IRtWorkspaceDetails.Audit | null> = input<IRtWorkspaceDetails.Audit | null>(null);\n\n public readonly actions: InputSignal<readonly IRtWorkspaceDetails.Action[]> = input<readonly IRtWorkspaceDetails.Action[]>([]);\n\n public readonly error: InputSignal<string | null> = input<string | null>(null);\n\n public readonly toggleChange: OutputEmitterRef<IRtWorkspaceDetails.ToggleChange> = output<IRtWorkspaceDetails.ToggleChange>();\n\n public readonly agentReassign: OutputEmitterRef<number> = output<number>();\n\n public readonly transitionSubmit: OutputEmitterRef<IRtWorkspaceDetails.TransitionSubmit> =\n output<IRtWorkspaceDetails.TransitionSubmit>();\n\n public readonly transitionSuccessClose: OutputEmitterRef<void> = output<void>();\n\n public readonly transitionErrorClose: OutputEmitterRef<void> = output<void>();\n\n public readonly auditLoadMore: OutputEmitterRef<void> = output<void>();\n\n public readonly actionClicked: OutputEmitterRef<string> = output<string>();\n\n constructor() {\n effect((): void => {\n const id: number | null = this.entityId();\n if (id === untracked((): number | null | undefined => this.#lastEntityId())) {\n return;\n }\n this.#lastEntityId.set(id);\n this.editingAgent.set(false);\n this.selectedAgentId.set(untracked((): IRtWorkspaceDetails.AgentEdit | null => this.agentEdit())?.currentAgentId ?? null);\n this.transitionForm.reset();\n });\n\n effect((): void => {\n const currentAgentId: number | null = this.agentEdit()?.currentAgentId ?? null;\n if (currentAgentId === untracked((): number | null | undefined => this.#lastAgentId())) {\n return;\n }\n this.#lastAgentId.set(currentAgentId);\n this.editingAgent.set(false);\n this.selectedAgentId.set(currentAgentId);\n });\n\n effect((): void => {\n if (this.transition()?.success != null) {\n this.transitionForm.reset();\n }\n });\n\n effect((): void => {\n const successText: string | null = this.transition()?.success ?? null;\n if (successText !== null && successText !== this.#lastTransitionSuccess) {\n this.transitionSuccessClose.emit();\n }\n this.#lastTransitionSuccess = successText;\n });\n\n effect((): void => {\n const submitError: string | null = this.transition()?.submitError ?? null;\n if (submitError !== null && submitError !== this.#lastTransitionSubmitError) {\n this.#notificationBus.error(submitError);\n this.transitionErrorClose.emit();\n }\n this.#lastTransitionSubmitError = submitError;\n });\n\n effect((): void => {\n const transitionError: string | null = this.transition()?.error ?? null;\n if (transitionError !== null && transitionError !== this.#lastTransitionError) {\n this.#notificationBus.error(transitionError);\n }\n this.#lastTransitionError = transitionError;\n });\n\n effect((): void => {\n const auditError: string | null = this.audit()?.error ?? null;\n if (auditError !== null && auditError !== this.#lastAuditError) {\n this.#notificationBus.error(auditError);\n }\n this.#lastAuditError = auditError;\n });\n\n effect((): void => {\n const panelError: string | null = this.error();\n if (panelError !== null && panelError !== this.#lastPanelError) {\n this.#notificationBus.error(panelError);\n }\n this.#lastPanelError = panelError;\n });\n }\n\n protected startEditAgent(): void {\n const edit: IRtWorkspaceDetails.AgentEdit | null = this.agentEdit();\n if (edit === null || !edit.canEdit || this.busy()) {\n return;\n }\n this.selectedAgentId.set(edit.currentAgentId);\n this.editingAgent.set(true);\n }\n\n protected cancelEditAgent(): void {\n const edit: IRtWorkspaceDetails.AgentEdit | null = this.agentEdit();\n if (edit !== null && edit.loading) {\n return;\n }\n this.selectedAgentId.set(edit?.currentAgentId ?? null);\n this.editingAgent.set(false);\n }\n\n protected onReassign(): void {\n const agentId: number | null = this.selectedAgentId();\n if (agentId === null || !this.canSaveReassign() || this.busy()) {\n return;\n }\n this.agentReassign.emit(agentId);\n }\n\n protected onSelectedAgentChange(agentId: number | null): void {\n this.selectedAgentId.set(agentId);\n }\n\n protected onToggleChange(toggle: IRtWorkspaceDetails.Toggle, value: boolean): void {\n if (toggle.value === value) {\n return;\n }\n this.toggleChange.emit({ id: toggle.id, value });\n }\n\n protected onTransitionSubmit(): void {\n const transition: IRtWorkspaceDetails.Transition | null = this.transition();\n if (transition === null || transition.submitting) {\n return;\n }\n if (!this.transitionForm.valid) {\n this.transitionForm.markAllAsTouched();\n return;\n }\n\n const value: ReturnType<typeof this.transitionForm.getRawValue> = this.transitionForm.getRawValue();\n this.transitionSubmit.emit({\n stageKey: value.to_key ?? '',\n comment: value.note?.trim() ?? '',\n });\n }\n\n protected onAuditLoadMore(): void {\n this.auditLoadMore.emit();\n }\n\n protected onAction(action: IRtWorkspaceDetails.Action): void {\n if ((action.disabled ?? false) || this.busy()) {\n return;\n }\n this.actionClicked.emit(action.id);\n }\n}\n","<ng-container rtBlock=\"rt-workspace-details\">\n @if (title(); as headTitle) {\n <header rtElem=\"head\">\n <span rtElem=\"head-title\" qa-dataid=\"workspace-details-title\">{{ headTitle }}</span>\n </header>\n }\n\n @if (hasTabs()) {\n <rt-tabs rtElem=\"tabs\" qa-dataid=\"workspace-details-tabs\">\n <ng-template rtTab=\"details\" [label]=\"'rtKit.uiDetails' | transloco\">\n <ng-container [ngTemplateOutlet]=\"detailsTpl\" />\n </ng-template>\n\n <ng-template rtTab=\"transition\" [label]=\"'rtKit.uiStageTransition' | transloco\" [hidden]=\"transition() === null\">\n @if (transition(); as stageTransition) {\n @if (stageTransition.currentStageLabel; as stageLabel) {\n <rt-detail-list>\n <rt-detail-row qa-dataid=\"workspace-details-current-stage\" [label]=\"'rtKit.uiCurrentStage' | transloco\">\n {{ stageLabel }}\n </rt-detail-row>\n </rt-detail-list>\n }\n\n @if (noTransitions()) {\n <rt-note qa-dataid=\"workspace-details-no-transitions\">{{ stageTransition.noTransitionsText }}</rt-note>\n } @else {\n <form\n rtElem=\"transition-form\"\n qa-dataid=\"workspace-details-transition-form\"\n [formGroup]=\"transitionForm\"\n (ngSubmit)=\"onTransitionSubmit()\">\n <rt-field\n [label]=\"'rtKit.uiTargetStage' | transloco\"\n [loading]=\"stageTransition.loading\"\n [errors]=\"{ required: ('rtKit.uiTargetStageRequired' | transloco) }\">\n <rt-select\n formControlName=\"to_key\"\n qa-dataid=\"workspace-details-transition-stage\"\n [placeholder]=\"'rtKit.uiPickTransition' | transloco\"\n [options]=\"stageTransition.options\" />\n </rt-field>\n\n <rt-field\n [label]=\"'rtKit.uiCommentOptional' | transloco\"\n [hint]=\"'rtKit.uiStageNoteHint' | transloco\"\n [loading]=\"stageTransition.loading\">\n <rt-textarea formControlName=\"note\" qa-dataid=\"workspace-details-transition-note\" rows=\"3\" />\n </rt-field>\n\n <button\n rtButton\n rtElem=\"transition-submit\"\n qa-dataid=\"workspace-details-transition-submit\"\n type=\"submit\"\n [label]=\"'rtKit.uiMoveStage' | transloco\"\n [attr.aria-label]=\"'rtKit.uiMoveStageAria' | transloco\"\n [loading]=\"stageTransition.submitting\"\n [disabled]=\"stageTransition.loading || busy()\"></button>\n </form>\n }\n }\n </ng-template>\n\n <ng-template rtTab=\"audit\" [label]=\"'rtKit.uiHistory' | transloco\" [hidden]=\"audit() === null\">\n @if (audit(); as auditFeed) {\n <div rtElem=\"audit\" qa-dataid=\"workspace-details-audit\">\n @if (auditFeed.loading) {\n <rt-spinner rtElem=\"audit-loading\" qa-dataid=\"workspace-details-audit-loading\" />\n } @else if (auditFeed.steps.length === 0) {\n <rt-empty-state\n qa-dataid=\"workspace-details-audit-empty\"\n icon=\"history\"\n [description]=\"'rtKit.uiAuditEmptyHint' | transloco\"\n [title]=\"auditFeed.emptyText\" />\n } @else {\n <rt-timeline qa-dataid=\"workspace-details-audit-timeline\" [steps]=\"auditFeed.steps\" />\n }\n\n @if (auditFeed.hasMore) {\n <button\n rtButton\n rtElem=\"audit-more\"\n qa-dataid=\"workspace-details-audit-more\"\n type=\"button\"\n appearance=\"text\"\n [label]=\"'rtKit.uiLoadMore' | transloco\"\n [attr.aria-label]=\"'rtKit.uiLoadMore' | transloco\"\n [loading]=\"auditFeed.loadingMore\"\n [disabled]=\"auditFeed.loadingMore\"\n (click)=\"onAuditLoadMore()\"></button>\n }\n </div>\n }\n </ng-template>\n </rt-tabs>\n } @else {\n <div rtElem=\"body\">\n <ng-container [ngTemplateOutlet]=\"detailsTpl\" />\n </div>\n }\n\n <ng-template #detailsTpl>\n @if (rows().length > 0) {\n <rt-detail-list>\n @for (row of rows(); track row.label) {\n <rt-detail-row qa-dataid=\"workspace-details-row\" [label]=\"row.label\" [loading]=\"loading()\">\n @if (row.agent && agentEdit(); as edit) {\n @if (!editingAgent()) {\n <div rtElem=\"agent-view\">\n <span rtElem=\"agent-name\" qa-dataid=\"workspace-details-agent-name\">{{ edit.currentLabel }}</span>\n <rt-icon-button\n qa-dataid=\"workspace-details-agent-edit\"\n icon=\"pencil\"\n size=\"sm\"\n [ariaLabel]=\"'rtKit.uiChangeAgent' | transloco\"\n [tooltip]=\"edit.canEdit ? edit.editTooltip : edit.cannotEditTooltip\"\n [disabled]=\"!edit.canEdit || busy()\"\n (clicked)=\"startEditAgent()\" />\n </div>\n } @else {\n <div rtElem=\"agent-edit\">\n <rt-select\n qa-dataid=\"workspace-details-agent-select\"\n [placeholder]=\"'rtKit.uiPickAgent' | transloco\"\n [ngModel]=\"selectedAgentId()\"\n [options]=\"edit.options\"\n [clearable]=\"false\"\n (ngModelChange)=\"onSelectedAgentChange($event)\" />\n <rt-icon-button\n qa-dataid=\"workspace-details-agent-save\"\n icon=\"check\"\n size=\"sm\"\n rtConfirmTone=\"primary\"\n [ariaLabel]=\"'rtKit.uiSaveNewAgent' | transloco\"\n [rtConfirmTitle]=\"'rtKit.uiReplaceAgentTitle' | transloco\"\n [rtConfirmLabel]=\"'rtKit.uiReplace' | transloco\"\n [tooltip]=\"\n canSaveReassign()\n ? ('rtKit.uiSaveNewAgent' | transloco)\n : ('rtKit.uiPickAnotherAgent' | transloco)\n \"\n [loading]=\"edit.loading\"\n [disabled]=\"!canSaveReassign() || busy()\"\n [rtConfirm]=\"edit.confirmText\"\n [rtConfirmDisabled]=\"!canSaveReassign() || busy()\"\n (confirmed)=\"onReassign()\" />\n <rt-icon-button\n qa-dataid=\"workspace-details-agent-cancel\"\n icon=\"ico-close\"\n size=\"sm\"\n [ariaLabel]=\"'rtKit.uiRevert' | transloco\"\n [tooltip]=\"'rtKit.uiRevert' | transloco\"\n [disabled]=\"edit.loading\"\n (clicked)=\"cancelEditAgent()\" />\n </div>\n }\n } @else {\n {{ row.value }}\n }\n </rt-detail-row>\n }\n </rt-detail-list>\n }\n\n @if (money().length > 0) {\n <rt-money-list>\n @for (moneyRow of money(); track moneyRow.label) {\n <rt-money-row\n qa-dataid=\"workspace-details-money-row\"\n [label]=\"moneyRow.label\"\n [total]=\"moneyRow.total ?? false\"\n [loading]=\"loading()\">\n {{ moneyRow.amount | number: moneyRow.format ?? '1.0-0' }} ₽\n </rt-money-row>\n }\n </rt-money-list>\n }\n\n @if (toggles().length > 0 || toggleHint()) {\n <rt-aside-section>\n @for (toggle of toggles(); track toggle.id) {\n <div rtElem=\"toggle-row\" qa-dataid=\"workspace-details-toggle-row\" [attr.data-id]=\"toggle.id\">\n <span rtElem=\"toggle-label\" qa-dataid=\"workspace-details-toggle-label\">{{ toggle.label }}</span>\n <rt-toggle-switch\n qa-dataid=\"workspace-details-toggle\"\n [inputId]=\"toggle.id\"\n [ariaLabel]=\"toggle.label\"\n [ngModel]=\"toggle.value\"\n [disabled]=\"(toggle.disabled ?? false) || busy()\"\n (ngModelChange)=\"onToggleChange(toggle, $event)\" />\n </div>\n }\n @if (toggleHint(); as hint) {\n <p rtElem=\"toggle-hint\" qa-dataid=\"workspace-details-toggle-hint\">{{ hint }}</p>\n }\n </rt-aside-section>\n }\n </ng-template>\n\n <footer rtElem=\"footer\">\n @for (panelAction of actions(); track panelAction.id) {\n @if (panelAction.confirm; as confirm) {\n <button\n rtButton\n rtElem=\"footer-action\"\n qa-dataid=\"workspace-details-action\"\n type=\"button\"\n [attr.data-id]=\"panelAction.id\"\n [theme]=\"panelAction.theme ?? 'primary'\"\n [appearance]=\"panelAction.appearance ?? 'filled'\"\n [label]=\"panelAction.label\"\n [icon]=\"panelAction.icon\"\n [attr.aria-label]=\"panelAction.label\"\n [rtConfirmTitle]=\"confirm.title\"\n [rtConfirmLabel]=\"confirm.label\"\n [rtConfirmTone]=\"confirm.tone\"\n [loading]=\"panelAction.loading ?? false\"\n [disabled]=\"(panelAction.disabled ?? false) || busy()\"\n [rtConfirm]=\"confirm.text\"\n [rtConfirmDisabled]=\"(panelAction.disabled ?? false) || busy()\"\n (confirmed)=\"onAction(panelAction)\"></button>\n } @else {\n <button\n rtButton\n rtElem=\"footer-action\"\n qa-dataid=\"workspace-details-action\"\n type=\"button\"\n [attr.data-id]=\"panelAction.id\"\n [theme]=\"panelAction.theme ?? 'primary'\"\n [appearance]=\"panelAction.appearance ?? 'filled'\"\n [label]=\"panelAction.label\"\n [icon]=\"panelAction.icon\"\n [attr.aria-label]=\"panelAction.label\"\n [loading]=\"panelAction.loading ?? false\"\n [disabled]=\"(panelAction.disabled ?? false) || busy()\"\n (click)=\"onAction(panelAction)\"></button>\n }\n }\n </footer>\n</ng-container>\n","/**\n * Семейство общих UI-компонентов в `common/ui`:\n * - `rt-*` — единственный разрешённый префикс для компонентов common/ui\n * (rt-button, rt-toolbar, rt-icon, rt-container и т.п.). Используется всеми\n * доменами; у каждого модуля свой layout, который собирает rt-* компоненты\n * по своей логике.\n *\n * Все компоненты используют токены `--rt-*` (см. styles либы).\n */\nexport * from './aside';\nexport * from './aside-section';\nexport * from './autocomplete';\nexport * from './bar-list';\nexport * from './bottom-sheet';\nexport * from './button';\nexport * from './calendar';\nexport * from './card';\nexport * from './chat';\nexport * from './checkbox';\nexport * from './collapsible-text';\nexport * from './confirm-popover';\nexport * from './container';\nexport * from './counter';\nexport * from './counter-row';\nexport * from './date-picker';\nexport * from './detail-list';\nexport * from './dialog';\nexport * from './download-link';\nexport * from './empty-state';\nexport * from './field';\nexport * from './file-card';\nexport * from './file-drop';\nexport * from './file-input';\nexport * from './file-list';\nexport * from './filter-control';\nexport * from './form-control';\nexport * from './header';\nexport * from './icon';\nexport * from './icon-button';\nexport * from './info-item';\nexport * from './input';\nexport * from './input-number';\nexport * from './live-badge';\nexport * from './logo';\nexport * from './menu';\nexport * from './message';\nexport * from './message-composer';\nexport * from './money-list';\nexport * from './multiselect';\nexport * from './night-grid';\nexport * from './delta-view';\nexport * from './note';\nexport * from './notifications-bell';\nexport * from './rich-editor';\nexport * from './page-header';\nexport * from './photo-viewer';\nexport * from './pagination/rt-pagination.component';\nexport * from './pagination/rt-pagination.model';\nexport * from './popover';\nexport * from './section-nav';\nexport * from './select';\nexport * from './skeleton';\nexport * from './skeleton-wrapper';\nexport * from './spinner';\nexport * from './split-button';\nexport * from './stat-tile';\nexport * from './stepper';\nexport * from './table';\nexport * from './tabs';\nexport * from './tag';\nexport * from './textarea';\nexport * from './theme-toggle';\nexport * from './thread-list';\nexport * from './timeline';\nexport * from './toast';\nexport * from './toggle-button-group';\nexport * from './toggle-switch';\nexport * from './toolbar';\nexport * from './tooltip';\nexport * from './welcome-dialog';\nexport * from './workspace';\nexport * from './workspace-details';\n","import { formatDate } from '@angular/common';\nimport { inject, LOCALE_ID, Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Штамп последнего взаимодействия для превью списков чатов: событие за сегодня\n * показывается временем («14:05»), за вчера и ранее — датой («18.07.2026»), чтобы\n * старые чаты не выглядели сегодняшними (G121).\n */\n@Pipe({ name: 'rtDayStamp' })\nexport class RtDayStampPipe implements PipeTransform {\n readonly #locale: string = inject(LOCALE_ID);\n\n public transform(value: Date | string | null): string {\n if (value == null || value === '') {\n return '—';\n }\n const date: Date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) {\n return '—';\n }\n const now: Date = new Date();\n const isToday: boolean =\n date.getFullYear() === now.getFullYear() && date.getMonth() === now.getMonth() && date.getDate() === now.getDate();\n return formatDate(date, isToday ? 'HH:mm' : 'dd.MM.yyyy', this.#locale);\n }\n}\n","/**\n * Словари кита: подписи, которые компоненты рисуют сами — кнопки диалогов,\n * ярлыки состояний, подсказки для скринридера, тексты ошибок поля.\n *\n * Ключи лежат в собственном неймспейсе `rtKit`, чтобы не занимать глобальное\n * пространство ключей приложения: в разметке они пишутся полным именем\n * (`'rtKit.uiClose' | transloco`), а грузит их `provideRtKitTranslations()`.\n *\n * Приложение переопределяет любую подпись, передав свой словарь тем же\n * провайдером: переданные ключи ложатся поверх этих.\n */\nexport const RT_KIT_TRANSLATIONS: Readonly<Record<string, Readonly<Record<string, string>>>> = {\n de: {\n bottomSheetClose: 'Schließen',\n chatAttachAria: 'Datei anhängen',\n chatAttachTooltip: 'Datei anhängen',\n chatAttachmentFallback: 'Anhang',\n chatCollapse: 'Chat verkleinern',\n chatComposerAria: 'Nachrichteneingabe',\n chatDeleteAria: 'Nachricht löschen',\n chatDeleteTooltip: 'Löschen',\n chatDropOverlay: 'Dateien loslassen, um sie an die Nachricht anzuhängen',\n chatEmptyHint: 'Der Chat ist noch nicht verfügbar.',\n chatEmptyThread: 'Noch keine Nachrichten.',\n chatExpand: 'Chat im Vollbild öffnen',\n chatMessageDeleted: 'Nachricht gelöscht',\n chatPlaceholder: 'Nachricht eingeben',\n chatRefreshAria: 'Nachrichten aktualisieren',\n chatRefreshTooltip: 'Nachrichten aktualisieren',\n chatRetryAria: 'Erneut senden',\n chatRetryTooltip: 'Erneut senden',\n chatSendAria: 'Nachricht senden',\n chatSendLabel: 'Senden',\n chatStatusFailed: 'Nicht gesendet',\n chatStatusRead: 'Gelesen',\n chatStatusSending: 'Wird gesendet',\n chatStatusSent: 'Zugestellt',\n chatTitle: 'Chat',\n counterDecrease: 'Verringern',\n counterIncrease: 'Erhöhen',\n fieldErrorEmail: 'Ungültige E-Mail-Adresse',\n fieldErrorMax: 'Wert ist zu groß',\n fieldErrorMaxLength: 'Eingabe ist zu lang',\n fieldErrorMin: 'Wert ist zu klein',\n fieldErrorMinLength: 'Eingabe ist zu kurz',\n fieldErrorPattern: 'Ungültiges Format',\n fieldErrorRequired: 'Pflichtfeld',\n photoViewerClose: 'Ansicht schließen',\n photoViewerNext: 'Nächstes Foto',\n photoViewerPrev: 'Vorheriges Foto',\n themeToggleLabel: 'Design wechseln',\n uiActions: 'Aktionen',\n uiAuditEmptyHint: 'Hier erscheinen Ereignisse zum Vorgang — Phasenwechsel und andere Aktionen.',\n uiBack: 'Zurück',\n uiBackToList: 'Zurück zur Liste',\n uiBaseline: 'vorher {{value}}',\n uiCancel: 'Abbrechen',\n uiChangeAgent: 'Betreuer wechseln',\n uiChooseFile: 'Datei wählen',\n uiClear: 'Leeren',\n uiClose: 'Schließen',\n uiCollapse: 'Einklappen',\n uiColumnLocked: 'Spalte ist fixiert',\n uiColumnSettings: 'Spalteneinstellungen',\n uiColumnSettingsTitle: 'Spalten einrichten',\n uiCommentOptional: 'Kommentar (optional)',\n uiConfirm: 'Bestätigen',\n uiConfirmAction: 'Aktion bestätigen',\n uiContinue: 'Weiter',\n uiCopied: 'Kopiert',\n uiCopy: 'Kopieren',\n uiCurrentStage: 'Aktuelle Phase',\n uiDetails: 'Details',\n uiDownload: 'Herunterladen',\n uiDownloadFile: 'Herunterladen: {{name}}',\n uiDragColumn: 'Spalte verschieben',\n uiFileDropOverlay: 'Dateien loslassen, um sie anzuhängen',\n uiFilters: 'Filter',\n uiForward: 'Vorwärts',\n uiHide: 'Ausblenden',\n uiHideColumn: 'Spalte ausblenden',\n uiHidePassword: 'Passwort verbergen',\n uiHint: 'Hinweis',\n uiHistory: 'Verlauf',\n uiInviteUser: 'Nutzer einladen',\n uiItemsPerPage: 'Einträge pro Seite',\n uiLiveOnSite: 'Gerade auf der Website',\n uiLoadMore: 'Mehr laden',\n uiMainNav: 'Hauptnavigation',\n uiMore: 'Mehr',\n uiMoreActions: 'Weitere Aktionen',\n uiMoveStage: 'Wechseln',\n uiMoveStageAria: 'Phase wechseln',\n uiNavMenu: 'Navigationsmenü',\n uiNavUnread: 'Ungelesen',\n uiNextPage: 'Nächste Seite',\n uiNightGridAria: 'Belegungsraster',\n uiNoData: 'Noch keine Daten',\n uiNoOptions: 'Keine Optionen',\n uiNoRows: 'Keine Daten',\n uiNothingFound: 'Nichts gefunden',\n uiNotifications: 'Benachrichtigungen',\n uiPageOf: 'Seite {{page}} von {{last}}',\n uiPagination: 'Seitennavigation',\n uiPerPage: 'Pro Seite:',\n uiPickAgent: 'Betreuer auswählen',\n uiPickAnotherAgent: 'Anderen Betreuer auswählen',\n uiPickTransition: 'Übergang auswählen',\n uiPrevPage: 'Vorherige Seite',\n uiProfile: 'Profil',\n uiRangeEmpty: '0 von 0',\n uiRangeOf: '{{from}}–{{to}} von {{total}}',\n uiRemove: 'Löschen',\n uiRename: 'Umbenennen',\n uiReplace: 'Ersetzen',\n uiReplaceAgentTitle: 'Betreuer ersetzen',\n uiResetDefaults: 'Auf Standard zurücksetzen',\n uiResizeDetails: 'Breite der Detailspalte ändern',\n uiResizeList: 'Breite der Listenspalte ändern',\n uiRevert: 'Verwerfen',\n uiSave: 'Speichern',\n uiSaveNewAgent: 'Neuen Betreuer speichern',\n uiSearch: 'Suche',\n uiSectionInProgress: '{{label}} — Bereich in Arbeit',\n uiSelectValues: 'Werte auswählen',\n uiShow: 'Anzeigen',\n uiShowColumn: 'Spalte einblenden',\n uiShowDetails: 'Details anzeigen',\n uiShowPassword: 'Passwort anzeigen',\n uiStageNoteHint: 'Interne Notiz — für den Kunden nicht sichtbar.',\n uiStageTransition: 'Phasenwechsel',\n uiSubscribeNotifications: 'Benachrichtigungen abonnieren',\n uiTabInvalid: 'Dieser Tab enthält Fehler',\n uiTargetStage: 'Zielphase',\n uiTargetStageRequired: 'Wählen Sie eine Zielphase.',\n uiThreadListEmptyHint: 'Hier erscheinen neue Threads.',\n uiToList: 'Zur Liste',\n uiUnsavedDiscard: 'Schließen ohne zu speichern',\n uiUnsavedMessage: 'Im Panel gibt es Änderungen, die noch nicht gespeichert sind. Wählen Sie, was damit geschehen soll.',\n uiUnsavedSave: 'Speichern und schließen',\n uiUnsavedStay: 'Bleiben',\n uiUnsavedTitle: 'Nicht gespeicherte Änderungen',\n uiWelcomeAria: 'Begrüßung für neue Nutzer',\n uiYearOverYear: 'ggü. Vj.',\n },\n en: {\n bottomSheetClose: 'Close',\n chatAttachAria: 'Attach a file',\n chatAttachTooltip: 'Attach a file',\n chatAttachmentFallback: 'Attachment',\n chatCollapse: 'Collapse chat',\n chatComposerAria: 'Message input',\n chatDeleteAria: 'Delete message',\n chatDeleteTooltip: 'Delete',\n chatDropOverlay: 'Drop the files to attach them to your message',\n chatEmptyHint: 'Chat is not available yet.',\n chatEmptyThread: 'No messages yet.',\n chatExpand: 'Expand chat to full screen',\n chatMessageDeleted: 'Message deleted',\n chatPlaceholder: 'Type a message',\n chatRefreshAria: 'Refresh messages',\n chatRefreshTooltip: 'Refresh messages',\n chatRetryAria: 'Send again',\n chatRetryTooltip: 'Retry',\n chatSendAria: 'Send message',\n chatSendLabel: 'Send',\n chatStatusFailed: 'Not sent',\n chatStatusRead: 'Read',\n chatStatusSending: 'Sending',\n chatStatusSent: 'Delivered',\n chatTitle: 'Chat',\n counterDecrease: 'Decrease',\n counterIncrease: 'Increase',\n fieldErrorEmail: 'Invalid email',\n fieldErrorMax: 'Value is too large',\n fieldErrorMaxLength: 'Value is too long',\n fieldErrorMin: 'Value is too small',\n fieldErrorMinLength: 'Value is too short',\n fieldErrorPattern: 'Invalid format',\n fieldErrorRequired: 'Required field',\n photoViewerClose: 'Close viewer',\n photoViewerNext: 'Next photo',\n photoViewerPrev: 'Previous photo',\n themeToggleLabel: 'Switch theme',\n uiActions: 'Actions',\n uiAuditEmptyHint: 'Deal events will appear here — stage changes and other actions.',\n uiBack: 'Back',\n uiBackToList: 'Back to list',\n uiBaseline: 'was {{value}}',\n uiCancel: 'Cancel',\n uiChangeAgent: 'Change agent',\n uiChooseFile: 'Choose file',\n uiClear: 'Clear',\n uiClose: 'Close',\n uiCollapse: 'Collapse',\n uiColumnLocked: 'Column is pinned',\n uiColumnSettings: 'Column settings',\n uiColumnSettingsTitle: 'Configure columns',\n uiCommentOptional: 'Comment (optional)',\n uiConfirm: 'Confirm',\n uiConfirmAction: 'Confirm action',\n uiContinue: 'Continue',\n uiCopied: 'Copied',\n uiCopy: 'Copy',\n uiCurrentStage: 'Current stage',\n uiDetails: 'Details',\n uiDownload: 'Download',\n uiDownloadFile: 'Download: {{name}}',\n uiDragColumn: 'Drag column',\n uiFileDropOverlay: 'Drop the files to attach them',\n uiFilters: 'Filters',\n uiForward: 'Forward',\n uiHide: 'Hide',\n uiHideColumn: 'Hide column',\n uiHidePassword: 'Hide password',\n uiHint: 'Hint',\n uiHistory: 'History',\n uiInviteUser: 'Invite user',\n uiItemsPerPage: 'Items per page',\n uiLiveOnSite: 'On the site now',\n uiLoadMore: 'Load more',\n uiMainNav: 'Main navigation',\n uiMore: 'More',\n uiMoreActions: 'More actions',\n uiMoveStage: 'Move',\n uiMoveStageAria: 'Move stage',\n uiNavMenu: 'Navigation menu',\n uiNavUnread: 'Unread',\n uiNextPage: 'Next page',\n uiNightGridAria: 'Occupancy grid',\n uiNoData: 'No data yet',\n uiNoOptions: 'No options',\n uiNoRows: 'No data',\n uiNothingFound: 'Nothing found',\n uiNotifications: 'Notifications',\n uiPageOf: 'Page {{page}} of {{last}}',\n uiPagination: 'Pagination',\n uiPerPage: 'Per page:',\n uiPickAgent: 'Select an agent',\n uiPickAnotherAgent: 'Select a different agent',\n uiPickTransition: 'Select a transition',\n uiPrevPage: 'Previous page',\n uiProfile: 'Profile',\n uiRangeEmpty: '0 of 0',\n uiRangeOf: '{{from}}–{{to}} of {{total}}',\n uiRemove: 'Delete',\n uiRename: 'Rename',\n uiReplace: 'Replace',\n uiReplaceAgentTitle: 'Replace agent',\n uiResetDefaults: 'Reset to defaults',\n uiResizeDetails: 'Resize details pane',\n uiResizeList: 'Resize list pane',\n uiRevert: 'Revert',\n uiSave: 'Save',\n uiSaveNewAgent: 'Save the new agent',\n uiSearch: 'Search',\n uiSectionInProgress: '{{label}} — section under development',\n uiSelectValues: 'Select values',\n uiShow: 'Show',\n uiShowColumn: 'Show column',\n uiShowDetails: 'Show details',\n uiShowPassword: 'Show password',\n uiStageNoteHint: 'Internal note — the client will not see it.',\n uiStageTransition: 'Stage transition',\n uiSubscribeNotifications: 'Subscribe to notifications',\n uiTabInvalid: 'This tab contains errors',\n uiTargetStage: 'Target stage',\n uiTargetStageRequired: 'Select a target stage.',\n uiThreadListEmptyHint: 'New threads will appear here.',\n uiToList: 'To list',\n uiUnsavedDiscard: 'Close without saving',\n uiUnsavedMessage: 'The panel has edits that have not been saved yet. Choose what to do with them.',\n uiUnsavedSave: 'Save and close',\n uiUnsavedStay: 'Stay',\n uiUnsavedTitle: 'Unsaved changes',\n uiWelcomeAria: 'Welcome message for a new user',\n uiYearOverYear: 'YoY',\n },\n hi: {\n bottomSheetClose: 'बंद करें',\n chatAttachAria: 'फ़ाइल संलग्न करें',\n chatAttachTooltip: 'फ़ाइल संलग्न करें',\n chatAttachmentFallback: 'संलग्नक',\n chatCollapse: 'चैट छोटी करें',\n chatComposerAria: 'संदेश लिखने का क्षेत्र',\n chatDeleteAria: 'संदेश हटाएँ',\n chatDeleteTooltip: 'हटाएँ',\n chatDropOverlay: 'संदेश में जोड़ने के लिए फ़ाइलें यहाँ छोड़ें',\n chatEmptyHint: 'चैट अभी उपलब्ध नहीं है।',\n chatEmptyThread: 'अभी कोई संदेश नहीं है।',\n chatExpand: 'चैट पूरी स्क्रीन पर खोलें',\n chatMessageDeleted: 'संदेश हटा दिया गया',\n chatPlaceholder: 'संदेश लिखें',\n chatRefreshAria: 'संदेश ताज़ा करें',\n chatRefreshTooltip: 'संदेश ताज़ा करें',\n chatRetryAria: 'फिर से भेजें',\n chatRetryTooltip: 'फिर से भेजें',\n chatSendAria: 'संदेश भेजें',\n chatSendLabel: 'भेजें',\n chatStatusFailed: 'भेजा नहीं गया',\n chatStatusRead: 'पढ़ा गया',\n chatStatusSending: 'भेजा जा रहा है',\n chatStatusSent: 'पहुँच गया',\n chatTitle: 'चैट',\n counterDecrease: 'घटाएँ',\n counterIncrease: 'बढ़ाएँ',\n fieldErrorEmail: 'ईमेल पता सही नहीं है',\n fieldErrorMax: 'मान बहुत बड़ा है',\n fieldErrorMaxLength: 'मान बहुत लंबा है',\n fieldErrorMin: 'मान बहुत छोटा है',\n fieldErrorMinLength: 'मान बहुत छोटा है',\n fieldErrorPattern: 'प्रारूप सही नहीं है',\n fieldErrorRequired: 'यह फ़ील्ड आवश्यक है',\n photoViewerClose: 'दृश्य बंद करें',\n photoViewerNext: 'अगली तस्वीर',\n photoViewerPrev: 'पिछली तस्वीर',\n themeToggleLabel: 'थीम बदलें',\n uiActions: 'कार्रवाइयाँ',\n uiAuditEmptyHint: 'सौदे की घटनाएँ यहाँ दिखेंगी — चरण बदलाव और अन्य कार्रवाइयाँ।',\n uiBack: 'पीछे',\n uiBackToList: 'सूची पर लौटें',\n uiBaseline: 'पहले {{value}}',\n uiCancel: 'रद्द करें',\n uiChangeAgent: 'एजेंट बदलें',\n uiChooseFile: 'फ़ाइल चुनें',\n uiClear: 'साफ़ करें',\n uiClose: 'बंद करें',\n uiCollapse: 'छोटा करें',\n uiColumnLocked: 'कॉलम स्थिर है',\n uiColumnSettings: 'कॉलम सेटिंग्स',\n uiColumnSettingsTitle: 'कॉलम सेट करें',\n uiCommentOptional: 'टिप्पणी (वैकल्पिक)',\n uiConfirm: 'पुष्टि करें',\n uiConfirmAction: 'कार्रवाई की पुष्टि',\n uiContinue: 'जारी रखें',\n uiCopied: 'कॉपी हो गया',\n uiCopy: 'कॉपी करें',\n uiCurrentStage: 'मौजूदा चरण',\n uiDetails: 'विवरण',\n uiDownload: 'डाउनलोड',\n uiDownloadFile: 'डाउनलोड: {{name}}',\n uiDragColumn: 'कॉलम खींचें',\n uiFileDropOverlay: 'फ़ाइलें छोड़ें, वे संलग्न हो जाएँगी',\n uiFilters: 'फ़िल्टर',\n uiForward: 'आगे',\n uiHide: 'छिपाएँ',\n uiHideColumn: 'कॉलम छिपाएँ',\n uiHidePassword: 'पासवर्ड छिपाएँ',\n uiHint: 'संकेत',\n uiHistory: 'इतिहास',\n uiInviteUser: 'उपयोगकर्ता को आमंत्रित करें',\n uiItemsPerPage: 'प्रति पृष्ठ प्रविष्टियाँ',\n uiLiveOnSite: 'अभी साइट पर',\n uiLoadMore: 'और लोड करें',\n uiMainNav: 'मुख्य नेविगेशन',\n uiMore: 'और देखें',\n uiMoreActions: 'अन्य कार्रवाइयाँ',\n uiMoveStage: 'बदलें',\n uiMoveStageAria: 'चरण बदलें',\n uiNavMenu: 'नेविगेशन मेन्यू',\n uiNavUnread: 'अपठित',\n uiNextPage: 'अगला पृष्ठ',\n uiNightGridAria: 'ठहराव ग्रिड',\n uiNoData: 'अभी कोई डेटा नहीं',\n uiNoOptions: 'कोई विकल्प नहीं',\n uiNoRows: 'कोई डेटा नहीं',\n uiNothingFound: 'कुछ नहीं मिला',\n uiNotifications: 'सूचनाएँ',\n uiPageOf: 'पृष्ठ {{page}} / {{last}}',\n uiPagination: 'पृष्ठ नेविगेशन',\n uiPerPage: 'प्रति पृष्ठ:',\n uiPickAgent: 'एजेंट चुनें',\n uiPickAnotherAgent: 'कोई दूसरा एजेंट चुनें',\n uiPickTransition: 'बदलाव चुनें',\n uiPrevPage: 'पिछला पृष्ठ',\n uiProfile: 'प्रोफ़ाइल',\n uiRangeEmpty: '0 में से 0',\n uiRangeOf: '{{total}} में से {{from}}–{{to}}',\n uiRemove: 'हटाएँ',\n uiRename: 'नाम बदलें',\n uiReplace: 'बदलें',\n uiReplaceAgentTitle: 'एजेंट बदलें',\n uiResetDefaults: 'डिफ़ॉल्ट पर लौटाएँ',\n uiResizeDetails: 'विवरण पैनल की चौड़ाई बदलें',\n uiResizeList: 'सूची पैनल की चौड़ाई बदलें',\n uiRevert: 'वापस लें',\n uiSave: 'सहेजें',\n uiSaveNewAgent: 'नया एजेंट सहेजें',\n uiSearch: 'खोज',\n uiSectionInProgress: '{{label}} — यह अनुभाग बन रहा है',\n uiSelectValues: 'मान चुनें',\n uiShow: 'दिखाएँ',\n uiShowColumn: 'कॉलम दिखाएँ',\n uiShowDetails: 'विवरण दिखाएँ',\n uiShowPassword: 'पासवर्ड दिखाएँ',\n uiStageNoteHint: 'आंतरिक टिप्पणी — ग्राहक को नहीं दिखती।',\n uiStageTransition: 'चरण बदलाव',\n uiSubscribeNotifications: 'सूचनाएँ प्राप्त करें',\n uiTabInvalid: 'इस टैब में त्रुटियाँ हैं',\n uiTargetStage: 'लक्ष्य चरण',\n uiTargetStageRequired: 'लक्ष्य चरण चुनें।',\n uiThreadListEmptyHint: 'नई बातचीत यहाँ दिखेगी।',\n uiToList: 'सूची पर',\n uiUnsavedDiscard: 'बिना सहेजे बंद करें',\n uiUnsavedMessage: 'पैनल में ऐसे बदलाव हैं जो अभी सहेजे नहीं गए हैं। तय करें कि उनका क्या करना है।',\n uiUnsavedSave: 'सहेजें और बंद करें',\n uiUnsavedStay: 'यहीं रहें',\n uiUnsavedTitle: 'बिना सहेजे बदलाव',\n uiWelcomeAria: 'नए उपयोगकर्ता का स्वागत संदेश',\n uiYearOverYear: 'वर्ष-दर-वर्ष',\n },\n ko: {\n bottomSheetClose: '닫기',\n chatAttachAria: '파일 첨부',\n chatAttachTooltip: '파일 첨부',\n chatAttachmentFallback: '첨부파일',\n chatCollapse: '채팅 축소',\n chatComposerAria: '메시지 입력창',\n chatDeleteAria: '메시지 삭제',\n chatDeleteTooltip: '삭제',\n chatDropOverlay: '파일을 놓으면 메시지에 첨부됩니다',\n chatEmptyHint: '채팅을 아직 사용할 수 없습니다.',\n chatEmptyThread: '아직 메시지가 없습니다.',\n chatExpand: '채팅 전체화면으로 보기',\n chatMessageDeleted: '삭제된 메시지',\n chatPlaceholder: '메시지를 입력하세요',\n chatRefreshAria: '메시지 새로고침',\n chatRefreshTooltip: '메시지 새로고침',\n chatRetryAria: '다시 보내기',\n chatRetryTooltip: '다시 보내기',\n chatSendAria: '메시지 보내기',\n chatSendLabel: '보내기',\n chatStatusFailed: '전송 실패',\n chatStatusRead: '읽음',\n chatStatusSending: '보내는 중',\n chatStatusSent: '전달됨',\n chatTitle: '채팅',\n counterDecrease: '줄이기',\n counterIncrease: '늘리기',\n fieldErrorEmail: '이메일 형식이 올바르지 않습니다',\n fieldErrorMax: '값이 너무 큽니다',\n fieldErrorMaxLength: '입력이 너무 깁니다',\n fieldErrorMin: '값이 너무 작습니다',\n fieldErrorMinLength: '입력이 너무 짧습니다',\n fieldErrorPattern: '형식이 올바르지 않습니다',\n fieldErrorRequired: '필수 입력 항목입니다',\n photoViewerClose: '보기 닫기',\n photoViewerNext: '다음 사진',\n photoViewerPrev: '이전 사진',\n themeToggleLabel: '테마 전환',\n uiActions: '작업',\n uiAuditEmptyHint: '거래 관련 이벤트가 여기에 표시됩니다 — 단계 이동과 기타 작업.',\n uiBack: '뒤로',\n uiBackToList: '목록으로 돌아가기',\n uiBaseline: '이전 {{value}}',\n uiCancel: '취소',\n uiChangeAgent: '담당자 변경',\n uiChooseFile: '파일 선택',\n uiClear: '지우기',\n uiClose: '닫기',\n uiCollapse: '접기',\n uiColumnLocked: '고정된 열입니다',\n uiColumnSettings: '열 설정',\n uiColumnSettingsTitle: '열 설정',\n uiCommentOptional: '메모 (선택)',\n uiConfirm: '확인',\n uiConfirmAction: '작업 확인',\n uiContinue: '계속',\n uiCopied: '복사됨',\n uiCopy: '복사',\n uiCurrentStage: '현재 단계',\n uiDetails: '상세',\n uiDownload: '다운로드',\n uiDownloadFile: '다운로드: {{name}}',\n uiDragColumn: '열 이동',\n uiFileDropOverlay: '파일을 놓으면 첨부됩니다',\n uiFilters: '필터',\n uiForward: '앞으로',\n uiHide: '숨기기',\n uiHideColumn: '열 숨기기',\n uiHidePassword: '비밀번호 숨기기',\n uiHint: '도움말',\n uiHistory: '기록',\n uiInviteUser: '사용자 초대',\n uiItemsPerPage: '페이지당 항목 수',\n uiLiveOnSite: '현재 접속자',\n uiLoadMore: '더 보기',\n uiMainNav: '주 메뉴',\n uiMore: '자세히',\n uiMoreActions: '추가 작업',\n uiMoveStage: '이동',\n uiMoveStageAria: '단계 이동',\n uiNavMenu: '탐색 메뉴',\n uiNavUnread: '읽지 않음',\n uiNextPage: '다음 페이지',\n uiNightGridAria: '숙박 현황 표',\n uiNoData: '아직 데이터가 없습니다',\n uiNoOptions: '선택 항목 없음',\n uiNoRows: '데이터 없음',\n uiNothingFound: '결과가 없습니다',\n uiNotifications: '알림',\n uiPageOf: '{{last}}페이지 중 {{page}}페이지',\n uiPagination: '페이지 이동',\n uiPerPage: '페이지당:',\n uiPickAgent: '담당자를 선택하세요',\n uiPickAnotherAgent: '다른 담당자를 선택하세요',\n uiPickTransition: '이동할 단계를 선택하세요',\n uiPrevPage: '이전 페이지',\n uiProfile: '프로필',\n uiRangeEmpty: '0개 중 0개',\n uiRangeOf: '{{total}}개 중 {{from}}–{{to}}',\n uiRemove: '삭제',\n uiRename: '이름 변경',\n uiReplace: '교체',\n uiReplaceAgentTitle: '담당자 교체',\n uiResetDefaults: '기본값으로 되돌리기',\n uiResizeDetails: '상세 영역 너비 조절',\n uiResizeList: '목록 영역 너비 조절',\n uiRevert: '되돌리기',\n uiSave: '저장',\n uiSaveNewAgent: '새 담당자 저장',\n uiSearch: '검색',\n uiSectionInProgress: '{{label}} — 준비 중인 메뉴',\n uiSelectValues: '값을 선택하세요',\n uiShow: '표시',\n uiShowColumn: '열 표시',\n uiShowDetails: '상세 보기',\n uiShowPassword: '비밀번호 표시',\n uiStageNoteHint: '내부 메모 — 고객에게는 보이지 않습니다.',\n uiStageTransition: '단계 이동',\n uiSubscribeNotifications: '알림 받기',\n uiTabInvalid: '이 탭에 오류가 있습니다',\n uiTargetStage: '이동할 단계',\n uiTargetStageRequired: '이동할 단계를 선택하세요.',\n uiThreadListEmptyHint: '새 대화가 여기에 표시됩니다.',\n uiToList: '목록으로',\n uiUnsavedDiscard: '저장하지 않고 닫기',\n uiUnsavedMessage: '패널에 아직 저장되지 않은 변경이 있습니다. 어떻게 할지 선택하세요.',\n uiUnsavedSave: '저장하고 닫기',\n uiUnsavedStay: '계속 편집',\n uiUnsavedTitle: '저장되지 않은 변경',\n uiWelcomeAria: '신규 사용자 환영 메시지',\n uiYearOverYear: '전년 대비',\n },\n ru: {\n bottomSheetClose: 'Закрыть',\n chatAttachAria: 'Прикрепить файл',\n chatAttachTooltip: 'Прикрепить файл',\n chatAttachmentFallback: 'Вложение',\n chatCollapse: 'Свернуть чат',\n chatComposerAria: 'Поле ввода сообщения',\n chatDeleteAria: 'Удалить сообщение',\n chatDeleteTooltip: 'Удалить',\n chatDropOverlay: 'Отпустите файлы, чтобы прикрепить к сообщению',\n chatEmptyHint: 'Чат пока недоступен.',\n chatEmptyThread: 'Сообщений пока нет.',\n chatExpand: 'Развернуть чат на весь экран',\n chatMessageDeleted: 'Сообщение удалено',\n chatPlaceholder: 'Введите сообщение',\n chatRefreshAria: 'Обновить сообщения',\n chatRefreshTooltip: 'Обновить сообщения',\n chatRetryAria: 'Повторить отправку',\n chatRetryTooltip: 'Повторить',\n chatSendAria: 'Отправить сообщение',\n chatSendLabel: 'Отправить',\n chatStatusFailed: 'Не отправлено',\n chatStatusRead: 'Прочитано',\n chatStatusSending: 'Отправляется',\n chatStatusSent: 'Доставлено',\n chatTitle: 'Чат',\n counterDecrease: 'Уменьшить',\n counterIncrease: 'Увеличить',\n fieldErrorEmail: 'Некорректный email',\n fieldErrorMax: 'Значение слишком велико',\n fieldErrorMaxLength: 'Слишком длинное значение',\n fieldErrorMin: 'Значение слишком мало',\n fieldErrorMinLength: 'Слишком короткое значение',\n fieldErrorPattern: 'Некорректный формат',\n fieldErrorRequired: 'Обязательное поле',\n photoViewerClose: 'Закрыть просмотр',\n photoViewerNext: 'Следующее фото',\n photoViewerPrev: 'Предыдущее фото',\n themeToggleLabel: 'Переключить тему',\n uiActions: 'Действия',\n uiAuditEmptyHint: 'Здесь появятся события по сделке — переходы этапов и другие действия.',\n uiBack: 'Назад',\n uiBackToList: 'Назад к списку',\n uiBaseline: 'было {{value}}',\n uiCancel: 'Отмена',\n uiChangeAgent: 'Сменить агента',\n uiChooseFile: 'Выбрать файл',\n uiClear: 'Очистить',\n uiClose: 'Закрыть',\n uiCollapse: 'Свернуть',\n uiColumnLocked: 'Колонка закреплена',\n uiColumnSettings: 'Настройки колонок',\n uiColumnSettingsTitle: 'Настроить столбцы',\n uiCommentOptional: 'Комментарий (опционально)',\n uiConfirm: 'Подтвердить',\n uiConfirmAction: 'Подтверждение действия',\n uiContinue: 'Продолжить',\n uiCopied: 'Скопировано',\n uiCopy: 'Скопировать',\n uiCurrentStage: 'Текущий этап',\n uiDetails: 'Детали',\n uiDownload: 'Скачать',\n uiDownloadFile: 'Скачать: {{name}}',\n uiDragColumn: 'Перетащить колонку',\n uiFileDropOverlay: 'Отпустите файлы, чтобы прикрепить их',\n uiFilters: 'Фильтры',\n uiForward: 'Вперёд',\n uiHide: 'Скрыть',\n uiHideColumn: 'Скрыть колонку',\n uiHidePassword: 'Скрыть пароль',\n uiHint: 'Подсказка',\n uiHistory: 'История',\n uiInviteUser: 'Пригласить пользователя',\n uiItemsPerPage: 'Элементов на странице',\n uiLiveOnSite: 'Сейчас на сайте',\n uiLoadMore: 'Загрузить ещё',\n uiMainNav: 'Основная навигация',\n uiMore: 'Подробнее',\n uiMoreActions: 'Ещё действия',\n uiMoveStage: 'Перевести',\n uiMoveStageAria: 'Перевести этап',\n uiNavMenu: 'Меню навигации',\n uiNavUnread: 'Непросмотренное',\n uiNextPage: 'Следующая страница',\n uiNightGridAria: 'Сетка занятости',\n uiNoData: 'Пока нет данных',\n uiNoOptions: 'Нет вариантов',\n uiNoRows: 'Данных нет',\n uiNothingFound: 'Ничего не найдено',\n uiNotifications: 'Уведомления',\n uiPageOf: 'Стр. {{page}} из {{last}}',\n uiPagination: 'Постраничная навигация',\n uiPerPage: 'На странице:',\n uiPickAgent: 'Выберите агента',\n uiPickAnotherAgent: 'Выберите другого агента',\n uiPickTransition: 'Выберите переход',\n uiPrevPage: 'Предыдущая страница',\n uiProfile: 'Профиль',\n uiRangeEmpty: '0 из 0',\n uiRangeOf: '{{from}}–{{to}} из {{total}}',\n uiRemove: 'Удалить',\n uiRename: 'Переименовать',\n uiReplace: 'Заменить',\n uiReplaceAgentTitle: 'Заменить агента',\n uiResetDefaults: 'Сбросить к умолчанию',\n uiResizeDetails: 'Изменить ширину деталей',\n uiResizeList: 'Изменить ширину списка',\n uiRevert: 'Отменить',\n uiSave: 'Сохранить',\n uiSaveNewAgent: 'Сохранить нового агента',\n uiSearch: 'Поиск',\n uiSectionInProgress: '{{label}} — раздел в разработке',\n uiSelectValues: 'Выберите значения',\n uiShow: 'Показать',\n uiShowColumn: 'Показать колонку',\n uiShowDetails: 'Показать детали',\n uiShowPassword: 'Показать пароль',\n uiStageNoteHint: 'Внутренняя заметка — клиенту не видна.',\n uiStageTransition: 'Переход этапа',\n uiSubscribeNotifications: 'Подписаться на уведомления',\n uiTabInvalid: 'Вкладка содержит ошибки',\n uiTargetStage: 'Целевой этап',\n uiTargetStageRequired: 'Выберите целевой этап.',\n uiThreadListEmptyHint: 'Здесь появятся новые треды.',\n uiToList: 'К списку',\n uiUnsavedDiscard: 'Закрыть без сохранения',\n uiUnsavedMessage: 'В панели есть правки, которые ещё не сохранены. Выберите, что с ними сделать.',\n uiUnsavedSave: 'Сохранить и закрыть',\n uiUnsavedStay: 'Остаться',\n uiUnsavedTitle: 'Несохранённые правки',\n uiWelcomeAria: 'Приветствие нового пользователя',\n uiYearOverYear: 'г/г',\n },\n th: {\n bottomSheetClose: 'ปิด',\n chatAttachAria: 'แนบไฟล์',\n chatAttachTooltip: 'แนบไฟล์',\n chatAttachmentFallback: 'ไฟล์แนบ',\n chatCollapse: 'ย่อแชท',\n chatComposerAria: 'ช่องพิมพ์ข้อความ',\n chatDeleteAria: 'ลบข้อความ',\n chatDeleteTooltip: 'ลบ',\n chatDropOverlay: 'วางไฟล์เพื่อแนบไปกับข้อความ',\n chatEmptyHint: 'แชทยังไม่พร้อมใช้งาน',\n chatEmptyThread: 'ยังไม่มีข้อความ',\n chatExpand: 'ขยายแชทเต็มหน้าจอ',\n chatMessageDeleted: 'ข้อความถูกลบแล้ว',\n chatPlaceholder: 'พิมพ์ข้อความ',\n chatRefreshAria: 'รีเฟรชข้อความ',\n chatRefreshTooltip: 'รีเฟรชข้อความ',\n chatRetryAria: 'ส่งอีกครั้ง',\n chatRetryTooltip: 'ลองอีกครั้ง',\n chatSendAria: 'ส่งข้อความ',\n chatSendLabel: 'ส่ง',\n chatStatusFailed: 'ส่งไม่สำเร็จ',\n chatStatusRead: 'อ่านแล้ว',\n chatStatusSending: 'กำลังส่ง',\n chatStatusSent: 'ส่งแล้ว',\n chatTitle: 'แชท',\n counterDecrease: 'ลด',\n counterIncrease: 'เพิ่ม',\n fieldErrorEmail: 'อีเมลไม่ถูกต้อง',\n fieldErrorMax: 'ค่ามากเกินไป',\n fieldErrorMaxLength: 'ค่ายาวเกินไป',\n fieldErrorMin: 'ค่าน้อยเกินไป',\n fieldErrorMinLength: 'ค่าสั้นเกินไป',\n fieldErrorPattern: 'รูปแบบไม่ถูกต้อง',\n fieldErrorRequired: 'จำเป็นต้องกรอก',\n photoViewerClose: 'ปิดการดูภาพ',\n photoViewerNext: 'ภาพถัดไป',\n photoViewerPrev: 'ภาพก่อนหน้า',\n themeToggleLabel: 'สลับธีม',\n uiActions: 'การทำงาน',\n uiAuditEmptyHint: 'เหตุการณ์ของดีลจะปรากฏที่นี่ — การเปลี่ยนขั้นตอนและการกระทำอื่น ๆ',\n uiBack: 'ย้อนกลับ',\n uiBackToList: 'กลับไปที่รายการ',\n uiBaseline: 'ก่อนหน้า {{value}}',\n uiCancel: 'ยกเลิก',\n uiChangeAgent: 'เปลี่ยนผู้ดูแล',\n uiChooseFile: 'เลือกไฟล์',\n uiClear: 'ล้าง',\n uiClose: 'ปิด',\n uiCollapse: 'ย่อ',\n uiColumnLocked: 'คอลัมน์ถูกตรึงไว้',\n uiColumnSettings: 'ตั้งค่าคอลัมน์',\n uiColumnSettingsTitle: 'ตั้งค่าคอลัมน์',\n uiCommentOptional: 'ความคิดเห็น (ไม่บังคับ)',\n uiConfirm: 'ยืนยัน',\n uiConfirmAction: 'ยืนยันการทำงาน',\n uiContinue: 'ดำเนินการต่อ',\n uiCopied: 'คัดลอกแล้ว',\n uiCopy: 'คัดลอก',\n uiCurrentStage: 'ขั้นตอนปัจจุบัน',\n uiDetails: 'รายละเอียด',\n uiDownload: 'ดาวน์โหลด',\n uiDownloadFile: 'ดาวน์โหลด: {{name}}',\n uiDragColumn: 'ลากคอลัมน์',\n uiFileDropOverlay: 'ปล่อยไฟล์เพื่อแนบ',\n uiFilters: 'ตัวกรอง',\n uiForward: 'ถัดไป',\n uiHide: 'ซ่อน',\n uiHideColumn: 'ซ่อนคอลัมน์',\n uiHidePassword: 'ซ่อนรหัสผ่าน',\n uiHint: 'คำแนะนำ',\n uiHistory: 'ประวัติ',\n uiInviteUser: 'เชิญผู้ใช้',\n uiItemsPerPage: 'จำนวนรายการต่อหน้า',\n uiLiveOnSite: 'กำลังอยู่บนเว็บไซต์',\n uiLoadMore: 'โหลดเพิ่ม',\n uiMainNav: 'เมนูหลัก',\n uiMore: 'รายละเอียดเพิ่มเติม',\n uiMoreActions: 'การทำงานอื่น',\n uiMoveStage: 'ย้าย',\n uiMoveStageAria: 'ย้ายขั้นตอน',\n uiNavMenu: 'เมนูนำทาง',\n uiNavUnread: 'ยังไม่ได้อ่าน',\n uiNextPage: 'หน้าถัดไป',\n uiNightGridAria: 'ตารางการเข้าพัก',\n uiNoData: 'ยังไม่มีข้อมูล',\n uiNoOptions: 'ไม่มีตัวเลือก',\n uiNoRows: 'ไม่มีข้อมูล',\n uiNothingFound: 'ไม่พบข้อมูล',\n uiNotifications: 'การแจ้งเตือน',\n uiPageOf: 'หน้า {{page}} จาก {{last}}',\n uiPagination: 'การเลื่อนหน้า',\n uiPerPage: 'ต่อหน้า:',\n uiPickAgent: 'เลือกผู้ดูแล',\n uiPickAnotherAgent: 'เลือกผู้ดูแลคนอื่น',\n uiPickTransition: 'เลือกการเปลี่ยนขั้นตอน',\n uiPrevPage: 'หน้าก่อนหน้า',\n uiProfile: 'โปรไฟล์',\n uiRangeEmpty: '0 จาก 0',\n uiRangeOf: '{{from}}–{{to}} จาก {{total}}',\n uiRemove: 'ลบ',\n uiRename: 'เปลี่ยนชื่อ',\n uiReplace: 'แทนที่',\n uiReplaceAgentTitle: 'แทนที่ผู้ดูแล',\n uiResetDefaults: 'คืนค่าเริ่มต้น',\n uiResizeDetails: 'ปรับความกว้างของแผงรายละเอียด',\n uiResizeList: 'ปรับความกว้างของแผงรายการ',\n uiRevert: 'ย้อนกลับ',\n uiSave: 'บันทึก',\n uiSaveNewAgent: 'บันทึกผู้ดูแลคนใหม่',\n uiSearch: 'ค้นหา',\n uiSectionInProgress: '{{label}} — ส่วนนี้อยู่ระหว่างพัฒนา',\n uiSelectValues: 'เลือกค่า',\n uiShow: 'แสดง',\n uiShowColumn: 'แสดงคอลัมน์',\n uiShowDetails: 'แสดงรายละเอียด',\n uiShowPassword: 'แสดงรหัสผ่าน',\n uiStageNoteHint: 'บันทึกภายใน — ลูกค้าไม่เห็น',\n uiStageTransition: 'การเปลี่ยนขั้นตอน',\n uiSubscribeNotifications: 'รับการแจ้งเตือน',\n uiTabInvalid: 'แท็บนี้มีข้อผิดพลาด',\n uiTargetStage: 'ขั้นตอนปลายทาง',\n uiTargetStageRequired: 'เลือกขั้นตอนปลายทาง',\n uiThreadListEmptyHint: 'การสนทนาใหม่จะปรากฏที่นี่',\n uiToList: 'ไปที่รายการ',\n uiUnsavedDiscard: 'ปิดโดยไม่บันทึก',\n uiUnsavedMessage: 'ในแผงมีการแก้ไขที่ยังไม่ได้บันทึก เลือกว่าจะทำอย่างไรกับการแก้ไขนี้',\n uiUnsavedSave: 'บันทึกแล้วปิด',\n uiUnsavedStay: 'อยู่ต่อ',\n uiUnsavedTitle: 'การแก้ไขที่ยังไม่ได้บันทึก',\n uiWelcomeAria: 'ข้อความต้อนรับผู้ใช้ใหม่',\n uiYearOverYear: 'เทียบปีก่อน',\n },\n 'zh-Hans': {\n bottomSheetClose: '关闭',\n chatAttachAria: '添加附件',\n chatAttachTooltip: '添加附件',\n chatAttachmentFallback: '附件',\n chatCollapse: '收起聊天',\n chatComposerAria: '消息输入框',\n chatDeleteAria: '删除消息',\n chatDeleteTooltip: '删除',\n chatDropOverlay: '松开文件即可添加到消息',\n chatEmptyHint: '聊天暂不可用。',\n chatEmptyThread: '暂无消息。',\n chatExpand: '全屏显示聊天',\n chatMessageDeleted: '消息已删除',\n chatPlaceholder: '输入消息',\n chatRefreshAria: '刷新消息',\n chatRefreshTooltip: '刷新消息',\n chatRetryAria: '重新发送',\n chatRetryTooltip: '重试',\n chatSendAria: '发送消息',\n chatSendLabel: '发送',\n chatStatusFailed: '未发送',\n chatStatusRead: '已读',\n chatStatusSending: '发送中',\n chatStatusSent: '已送达',\n chatTitle: '聊天',\n counterDecrease: '减少',\n counterIncrease: '增加',\n fieldErrorEmail: '邮箱格式不正确',\n fieldErrorMax: '数值太大',\n fieldErrorMaxLength: '内容太长',\n fieldErrorMin: '数值太小',\n fieldErrorMinLength: '内容太短',\n fieldErrorPattern: '格式不正确',\n fieldErrorRequired: '必填项',\n photoViewerClose: '关闭查看',\n photoViewerNext: '下一张',\n photoViewerPrev: '上一张',\n themeToggleLabel: '切换主题',\n uiActions: '操作',\n uiAuditEmptyHint: '这里会显示该业务的事件——阶段流转和其他操作。',\n uiBack: '返回',\n uiBackToList: '返回列表',\n uiBaseline: '此前 {{value}}',\n uiCancel: '取消',\n uiChangeAgent: '更换负责人',\n uiChooseFile: '选择文件',\n uiClear: '清空',\n uiClose: '关闭',\n uiCollapse: '收起',\n uiColumnLocked: '该列已固定',\n uiColumnSettings: '列设置',\n uiColumnSettingsTitle: '设置列',\n uiCommentOptional: '备注(选填)',\n uiConfirm: '确认',\n uiConfirmAction: '确认操作',\n uiContinue: '继续',\n uiCopied: '已复制',\n uiCopy: '复制',\n uiCurrentStage: '当前阶段',\n uiDetails: '详情',\n uiDownload: '下载',\n uiDownloadFile: '下载:{{name}}',\n uiDragColumn: '拖动列',\n uiFileDropOverlay: '松开鼠标即可添加附件',\n uiFilters: '筛选',\n uiForward: '下一步',\n uiHide: '隐藏',\n uiHideColumn: '隐藏该列',\n uiHidePassword: '隐藏密码',\n uiHint: '提示',\n uiHistory: '历史',\n uiInviteUser: '邀请用户',\n uiItemsPerPage: '每页条数',\n uiLiveOnSite: '当前在线',\n uiLoadMore: '加载更多',\n uiMainNav: '主导航',\n uiMore: '展开',\n uiMoreActions: '更多操作',\n uiMoveStage: '流转',\n uiMoveStageAria: '流转阶段',\n uiNavMenu: '导航菜单',\n uiNavUnread: '未读',\n uiNextPage: '下一页',\n uiNightGridAria: '入住情况表',\n uiNoData: '暂无数据',\n uiNoOptions: '暂无选项',\n uiNoRows: '没有数据',\n uiNothingFound: '未找到结果',\n uiNotifications: '通知',\n uiPageOf: '第 {{page}} 页,共 {{last}} 页',\n uiPagination: '分页导航',\n uiPerPage: '每页:',\n uiPickAgent: '请选择负责人',\n uiPickAnotherAgent: '请选择另一位负责人',\n uiPickTransition: '请选择流转',\n uiPrevPage: '上一页',\n uiProfile: '个人资料',\n uiRangeEmpty: '0 / 0',\n uiRangeOf: '{{from}}–{{to}},共 {{total}}',\n uiRemove: '删除',\n uiRename: '重命名',\n uiReplace: '替换',\n uiReplaceAgentTitle: '替换负责人',\n uiResetDefaults: '恢复默认',\n uiResizeDetails: '调整详情栏宽度',\n uiResizeList: '调整列表栏宽度',\n uiRevert: '撤销',\n uiSave: '保存',\n uiSaveNewAgent: '保存新负责人',\n uiSearch: '搜索',\n uiSectionInProgress: '{{label}} — 该板块正在开发',\n uiSelectValues: '请选择',\n uiShow: '显示',\n uiShowColumn: '显示该列',\n uiShowDetails: '显示详情',\n uiShowPassword: '显示密码',\n uiStageNoteHint: '内部备注——客户看不到。',\n uiStageTransition: '阶段流转',\n uiSubscribeNotifications: '订阅通知',\n uiTabInvalid: '该标签页存在错误',\n uiTargetStage: '目标阶段',\n uiTargetStageRequired: '请选择目标阶段。',\n uiThreadListEmptyHint: '新的会话会显示在这里。',\n uiToList: '回到列表',\n uiUnsavedDiscard: '不保存并关闭',\n uiUnsavedMessage: '面板中有尚未保存的修改,请选择如何处理。',\n uiUnsavedSave: '保存并关闭',\n uiUnsavedStay: '留在此处',\n uiUnsavedTitle: '未保存的修改',\n uiWelcomeAria: '新用户欢迎信息',\n uiYearOverYear: '同比',\n },\n 'zh-Hant': {\n bottomSheetClose: '關閉',\n chatAttachAria: '新增附件',\n chatAttachTooltip: '新增附件',\n chatAttachmentFallback: '附件',\n chatCollapse: '收合聊天',\n chatComposerAria: '訊息輸入框',\n chatDeleteAria: '刪除訊息',\n chatDeleteTooltip: '刪除',\n chatDropOverlay: '放開檔案即可加入訊息',\n chatEmptyHint: '聊天暫時無法使用。',\n chatEmptyThread: '尚無訊息。',\n chatExpand: '全螢幕顯示聊天',\n chatMessageDeleted: '訊息已刪除',\n chatPlaceholder: '輸入訊息',\n chatRefreshAria: '重新整理訊息',\n chatRefreshTooltip: '重新整理訊息',\n chatRetryAria: '重新傳送',\n chatRetryTooltip: '重試',\n chatSendAria: '傳送訊息',\n chatSendLabel: '傳送',\n chatStatusFailed: '未傳送',\n chatStatusRead: '已讀',\n chatStatusSending: '傳送中',\n chatStatusSent: '已送達',\n chatTitle: '聊天',\n counterDecrease: '減少',\n counterIncrease: '增加',\n fieldErrorEmail: '電子郵件格式不正確',\n fieldErrorMax: '數值太大',\n fieldErrorMaxLength: '內容太長',\n fieldErrorMin: '數值太小',\n fieldErrorMinLength: '內容太短',\n fieldErrorPattern: '格式不正確',\n fieldErrorRequired: '必填欄位',\n photoViewerClose: '關閉檢視',\n photoViewerNext: '下一張',\n photoViewerPrev: '上一張',\n themeToggleLabel: '切換主題',\n uiActions: '操作',\n uiAuditEmptyHint: '這裡會顯示該業務的事件——階段流轉與其他操作。',\n uiBack: '返回',\n uiBackToList: '返回清單',\n uiBaseline: '此前 {{value}}',\n uiCancel: '取消',\n uiChangeAgent: '更換負責人',\n uiChooseFile: '選擇檔案',\n uiClear: '清空',\n uiClose: '關閉',\n uiCollapse: '收合',\n uiColumnLocked: '此欄已固定',\n uiColumnSettings: '欄位設定',\n uiColumnSettingsTitle: '設定欄位',\n uiCommentOptional: '備註(選填)',\n uiConfirm: '確認',\n uiConfirmAction: '確認操作',\n uiContinue: '繼續',\n uiCopied: '已複製',\n uiCopy: '複製',\n uiCurrentStage: '目前階段',\n uiDetails: '詳情',\n uiDownload: '下載',\n uiDownloadFile: '下載:{{name}}',\n uiDragColumn: '拖曳欄位',\n uiFileDropOverlay: '放開滑鼠即可加入附件',\n uiFilters: '篩選',\n uiForward: '下一步',\n uiHide: '隱藏',\n uiHideColumn: '隱藏此欄',\n uiHidePassword: '隱藏密碼',\n uiHint: '提示',\n uiHistory: '紀錄',\n uiInviteUser: '邀請使用者',\n uiItemsPerPage: '每頁筆數',\n uiLiveOnSite: '目前在線',\n uiLoadMore: '載入更多',\n uiMainNav: '主導覽',\n uiMore: '展開',\n uiMoreActions: '更多操作',\n uiMoveStage: '流轉',\n uiMoveStageAria: '流轉階段',\n uiNavMenu: '導覽選單',\n uiNavUnread: '未讀',\n uiNextPage: '下一頁',\n uiNightGridAria: '入住情況表',\n uiNoData: '尚無資料',\n uiNoOptions: '沒有選項',\n uiNoRows: '沒有資料',\n uiNothingFound: '找不到結果',\n uiNotifications: '通知',\n uiPageOf: '第 {{page}} 頁,共 {{last}} 頁',\n uiPagination: '分頁導覽',\n uiPerPage: '每頁:',\n uiPickAgent: '請選擇負責人',\n uiPickAnotherAgent: '請選擇另一位負責人',\n uiPickTransition: '請選擇流轉',\n uiPrevPage: '上一頁',\n uiProfile: '個人資料',\n uiRangeEmpty: '0 / 0',\n uiRangeOf: '{{from}}–{{to}},共 {{total}}',\n uiRemove: '刪除',\n uiRename: '重新命名',\n uiReplace: '取代',\n uiReplaceAgentTitle: '取代負責人',\n uiResetDefaults: '回復預設',\n uiResizeDetails: '調整詳情欄寬度',\n uiResizeList: '調整清單欄寬度',\n uiRevert: '還原',\n uiSave: '儲存',\n uiSaveNewAgent: '儲存新負責人',\n uiSearch: '搜尋',\n uiSectionInProgress: '{{label}} — 此區塊開發中',\n uiSelectValues: '請選擇',\n uiShow: '顯示',\n uiShowColumn: '顯示此欄',\n uiShowDetails: '顯示詳情',\n uiShowPassword: '顯示密碼',\n uiStageNoteHint: '內部備註——客戶看不到。',\n uiStageTransition: '階段流轉',\n uiSubscribeNotifications: '訂閱通知',\n uiTabInvalid: '此分頁有錯誤',\n uiTargetStage: '目標階段',\n uiTargetStageRequired: '請選擇目標階段。',\n uiThreadListEmptyHint: '新的對話會顯示在這裡。',\n uiToList: '回到清單',\n uiUnsavedDiscard: '不儲存並關閉',\n uiUnsavedMessage: '面板中有尚未儲存的修改,請選擇如何處理。',\n uiUnsavedSave: '儲存並關閉',\n uiUnsavedStay: '留在此處',\n uiUnsavedTitle: '未儲存的修改',\n uiWelcomeAria: '新使用者歡迎訊息',\n uiYearOverYear: '年增率',\n },\n};\n","import { EnvironmentProviders, inject, makeEnvironmentProviders, provideAppInitializer } from '@angular/core';\n\nimport { TranslocoService } from '@jsverse/transloco';\n\nimport { RT_KIT_TRANSLATIONS } from './rt-kit-translations';\n\n/**\n * Неймспейс, под которым лежат подписи кита. Он же — префикс ключа в разметке:\n * `'rtKit.uiClose' | transloco`.\n */\nexport const RT_KIT_TRANSLATION_NAMESPACE: string = 'rtKit';\n\n/**\n * Подключает словари кита к Transloco приложения.\n *\n * Кит рисует часть подписей сам — кнопки диалогов, тексты ошибок поля,\n * расшифровки иконок для скринридера, — и без этого провайдера на экране\n * остались бы ключи. Словари вшиты в пакет: сеть за ними не ходит и копировать\n * ассеты не нужно.\n *\n * ```typescript\n * export const appConfig: ApplicationConfig = {\n * providers: [provideTransloco({ config, loader }), provideRtKitTranslations()],\n * };\n * ```\n *\n * Ключи ложатся в общий словарь языка под собственным неймспейсом, а не\n * скоупом Transloco: скоуп, объявленный на корне, приписался бы и ко всем\n * ключам приложения. Загрузку своих словарей это не задевает — они прилетают\n * позже и домешиваются рядом.\n *\n * Раскладываются все восемь языков, но прочитаются только заявленные в\n * `availableLangs` приложения: язык вне этого списка Transloco считает не\n * языком, а именем скоупа, и ключ по нему не найдётся.\n *\n * @param translations Свои словари поверх вшитых: ключи ложатся сверху по\n * каждому языку отдельно. Так переопределяется одна подпись, а не весь набор,\n * и так же добавляется язык, которого в пакете нет.\n */\nexport function provideRtKitTranslations(\n translations: Readonly<Record<string, Readonly<Record<string, string>>>> = {}\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideAppInitializer((): void => {\n const transloco: TranslocoService = inject(TranslocoService);\n const langs: string[] = [...new Set([...Object.keys(RT_KIT_TRANSLATIONS), ...Object.keys(translations)])];\n for (const lang of langs) {\n transloco.setTranslation(\n { [RT_KIT_TRANSLATION_NAMESPACE]: { ...RT_KIT_TRANSLATIONS[lang], ...translations[lang] } },\n lang,\n // Разметки на экране ещё нет — перерисовывать нечего, а\n // событие на каждый из языков подняло бы её восемь раз.\n { emitChange: false }\n );\n }\n }),\n ]);\n}\n","/**\n * Public API Surface of @rt-tools/ui-kit-v2\n */\n\n// components\nexport * from './lib/components';\n\n// pipes & directives\nexport * from './lib/pipes';\nexport * from './lib/scroll';\n\n// словари подписей, которые кит рисует сам\nexport * from './lib/i18n';\n\n// среда исполнения: тема, брейкпоинты, шина уведомлений\nexport * from './lib/platform';\n\n// чистые функции и типы, на которых стоят компоненты\nexport * from './lib/util';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["BEM_BLOCK","VIEWPORT_MARGIN","panelIdSeed","nextPanelId","clamp","OPEN_KEYS","i1"],"mappings":"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"}