ngwr 11.2.0 → 12.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 (395) hide show
  1. package/README.md +85 -26
  2. package/burger/styles/_index.scss +1 -1
  3. package/button/styles/_index.scss +2 -2
  4. package/calendar/styles/_index.scss +32 -12
  5. package/calendar-heatmap/styles/_index.scss +20 -0
  6. package/carousel/styles/_index.scss +23 -1
  7. package/cascader/styles/_index.scss +15 -3
  8. package/checkbox/styles/_index.scss +2 -2
  9. package/collapse/styles/_index.scss +2 -2
  10. package/color-picker/styles/_index.scss +3 -3
  11. package/compare/styles/_index.scss +18 -2
  12. package/context-menu/styles/_index.scss +21 -2
  13. package/date-picker/styles/_index.scss +5 -5
  14. package/descriptions/styles/_index.scss +1 -1
  15. package/drag-drop/styles/_index.scss +28 -1
  16. package/drawer/styles/_index.scss +37 -0
  17. package/dropdown/styles/_index.scss +2 -2
  18. package/event-calendar/styles/_index.scss +67 -10
  19. package/fesm2022/ngwr-action-sheet.mjs +3 -3
  20. package/fesm2022/ngwr-affix.mjs +3 -3
  21. package/fesm2022/ngwr-alert.mjs +3 -3
  22. package/fesm2022/ngwr-anchor.mjs +3 -3
  23. package/fesm2022/ngwr-aurora.mjs +3 -3
  24. package/fesm2022/ngwr-avatar.mjs +3 -3
  25. package/fesm2022/ngwr-back-top.mjs +3 -3
  26. package/fesm2022/ngwr-badge.mjs +6 -6
  27. package/fesm2022/ngwr-bar-chart-testing.mjs +20 -2
  28. package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -1
  29. package/fesm2022/ngwr-bar-chart.mjs +3 -3
  30. package/fesm2022/ngwr-blur-text.mjs +3 -3
  31. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  32. package/fesm2022/ngwr-border-glow.mjs +4 -4
  33. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  34. package/fesm2022/ngwr-breadcrumbs.mjs +29 -17
  35. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  36. package/fesm2022/ngwr-burger.mjs +3 -3
  37. package/fesm2022/ngwr-button.mjs +6 -6
  38. package/fesm2022/ngwr-calendar-heatmap.mjs +17 -5
  39. package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
  40. package/fesm2022/ngwr-calendar-testing.mjs +1 -1
  41. package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
  42. package/fesm2022/ngwr-calendar.mjs +187 -9
  43. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  44. package/fesm2022/ngwr-card.mjs +10 -10
  45. package/fesm2022/ngwr-card.mjs.map +1 -1
  46. package/fesm2022/ngwr-carousel.mjs +124 -24
  47. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  48. package/fesm2022/ngwr-cascader.mjs +48 -5
  49. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  50. package/fesm2022/ngwr-checkbox.mjs +6 -6
  51. package/fesm2022/ngwr-circular-text.mjs +4 -4
  52. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  53. package/fesm2022/ngwr-click-spark.mjs +27 -7
  54. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  55. package/fesm2022/ngwr-clipboard.mjs +3 -3
  56. package/fesm2022/ngwr-collapse.mjs +9 -9
  57. package/fesm2022/ngwr-color-picker-testing.mjs +26 -6
  58. package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
  59. package/fesm2022/ngwr-color-picker.mjs +98 -8
  60. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  61. package/fesm2022/ngwr-command-palette.mjs +14 -5
  62. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  63. package/fesm2022/ngwr-compare.mjs +3 -3
  64. package/fesm2022/ngwr-confetti.mjs +31 -6
  65. package/fesm2022/ngwr-confetti.mjs.map +1 -1
  66. package/fesm2022/ngwr-config.mjs +9 -0
  67. package/fesm2022/ngwr-config.mjs.map +1 -1
  68. package/fesm2022/ngwr-context-menu-testing.mjs +30 -11
  69. package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -1
  70. package/fesm2022/ngwr-context-menu.mjs +333 -43
  71. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  72. package/fesm2022/ngwr-cookie.mjs +3 -3
  73. package/fesm2022/ngwr-counter.mjs +25 -9
  74. package/fesm2022/ngwr-counter.mjs.map +1 -1
  75. package/fesm2022/{ngwr-date-adapter-fns.mjs → ngwr-date-adapters-fns.mjs} +37 -10
  76. package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -0
  77. package/fesm2022/{ngwr-date-adapter-luxon.mjs → ngwr-date-adapters-luxon.mjs} +5 -5
  78. package/fesm2022/ngwr-date-adapters-luxon.mjs.map +1 -0
  79. package/fesm2022/ngwr-date-picker-testing.mjs +11 -6
  80. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
  81. package/fesm2022/ngwr-date-picker.mjs +119 -37
  82. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  83. package/fesm2022/{ngwr-date-adapter.mjs → ngwr-date.mjs} +36 -10
  84. package/fesm2022/ngwr-date.mjs.map +1 -0
  85. package/fesm2022/ngwr-decrypt-text.mjs +3 -3
  86. package/fesm2022/ngwr-density.mjs +6 -6
  87. package/fesm2022/ngwr-descriptions.mjs +6 -6
  88. package/fesm2022/ngwr-dialog.mjs +73 -18
  89. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  90. package/fesm2022/ngwr-directives.mjs +12 -12
  91. package/fesm2022/ngwr-divider.mjs +52 -5
  92. package/fesm2022/ngwr-divider.mjs.map +1 -1
  93. package/fesm2022/ngwr-donut-chart-testing.mjs +8 -4
  94. package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -1
  95. package/fesm2022/ngwr-donut-chart.mjs +7 -7
  96. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  97. package/fesm2022/ngwr-drag-drop.mjs +160 -11
  98. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  99. package/fesm2022/ngwr-drawer.mjs +121 -58
  100. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  101. package/fesm2022/ngwr-dropdown.mjs +26 -10
  102. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  103. package/fesm2022/ngwr-empty.mjs +3 -3
  104. package/fesm2022/ngwr-event-calendar.mjs +28 -15
  105. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  106. package/fesm2022/ngwr-falling-text-testing.mjs +5 -3
  107. package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -1
  108. package/fesm2022/ngwr-falling-text.mjs +75 -46
  109. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  110. package/fesm2022/ngwr-file-upload.mjs +3 -3
  111. package/fesm2022/ngwr-form.mjs +32 -15
  112. package/fesm2022/ngwr-form.mjs.map +1 -1
  113. package/fesm2022/ngwr-fuzzy-text.mjs +21 -11
  114. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  115. package/fesm2022/ngwr-gauge.mjs +3 -3
  116. package/fesm2022/ngwr-glitch-text-testing.mjs +51 -17
  117. package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -1
  118. package/fesm2022/ngwr-glitch-text.mjs +7 -7
  119. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  120. package/fesm2022/ngwr-gradient-text-testing.mjs +46 -11
  121. package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -1
  122. package/fesm2022/ngwr-gradient-text.mjs +4 -4
  123. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  124. package/fesm2022/ngwr-hotkey.mjs +24 -9
  125. package/fesm2022/ngwr-hotkey.mjs.map +1 -1
  126. package/fesm2022/ngwr-i18n-en.mjs +73 -1
  127. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  128. package/fesm2022/ngwr-i18n-ru.mjs +55 -1
  129. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  130. package/fesm2022/ngwr-i18n.mjs +26 -15
  131. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  132. package/fesm2022/ngwr-icon.mjs +6 -6
  133. package/fesm2022/ngwr-image-cropper-testing.mjs +53 -9
  134. package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -1
  135. package/fesm2022/ngwr-image-cropper.mjs +150 -12
  136. package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
  137. package/fesm2022/ngwr-input-number-testing.mjs +15 -10
  138. package/fesm2022/ngwr-input-number-testing.mjs.map +1 -1
  139. package/fesm2022/ngwr-input-number.mjs +17 -10
  140. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  141. package/fesm2022/ngwr-input-otp-testing.mjs +12 -6
  142. package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -1
  143. package/fesm2022/ngwr-input-otp.mjs +24 -5
  144. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  145. package/fesm2022/ngwr-input.mjs +15 -15
  146. package/fesm2022/ngwr-keyboard.mjs +3 -3
  147. package/fesm2022/ngwr-knob.mjs +3 -3
  148. package/fesm2022/ngwr-layout.mjs +15 -15
  149. package/fesm2022/ngwr-lightbox.mjs +4 -4
  150. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  151. package/fesm2022/ngwr-line-chart.mjs +73 -26
  152. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  153. package/fesm2022/ngwr-list.mjs +7 -7
  154. package/fesm2022/ngwr-list.mjs.map +1 -1
  155. package/fesm2022/ngwr-loading-bar.mjs +7 -7
  156. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  157. package/fesm2022/ngwr-markdown.mjs +66 -8
  158. package/fesm2022/ngwr-markdown.mjs.map +1 -1
  159. package/fesm2022/ngwr-marquee.mjs +4 -4
  160. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  161. package/fesm2022/ngwr-media.mjs +3 -3
  162. package/fesm2022/ngwr-mention.mjs +108 -13
  163. package/fesm2022/ngwr-mention.mjs.map +1 -1
  164. package/fesm2022/ngwr-meta.mjs +6 -6
  165. package/fesm2022/ngwr-meter-group-testing.mjs +26 -6
  166. package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -1
  167. package/fesm2022/ngwr-meter-group.mjs +3 -3
  168. package/fesm2022/ngwr-overlay.mjs +6 -6
  169. package/fesm2022/ngwr-page-header.mjs +3 -3
  170. package/fesm2022/ngwr-pagination-testing.mjs +6 -6
  171. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
  172. package/fesm2022/ngwr-pagination.mjs +83 -16
  173. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  174. package/fesm2022/ngwr-pipes.mjs +39 -26
  175. package/fesm2022/ngwr-pipes.mjs.map +1 -1
  176. package/fesm2022/ngwr-platform.mjs +9 -9
  177. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  178. package/fesm2022/ngwr-popover-testing.mjs +7 -2
  179. package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
  180. package/fesm2022/ngwr-popover.mjs +155 -33
  181. package/fesm2022/ngwr-popover.mjs.map +1 -1
  182. package/fesm2022/ngwr-progress.mjs +3 -3
  183. package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
  184. package/fesm2022/ngwr-qr.mjs +42 -5
  185. package/fesm2022/ngwr-qr.mjs.map +1 -1
  186. package/fesm2022/ngwr-radio.mjs +6 -6
  187. package/fesm2022/ngwr-rating.mjs +3 -3
  188. package/fesm2022/ngwr-result.mjs +21 -30
  189. package/fesm2022/ngwr-result.mjs.map +1 -1
  190. package/fesm2022/ngwr-rotating-text.mjs +3 -3
  191. package/fesm2022/ngwr-scroll.mjs +3 -3
  192. package/fesm2022/ngwr-segmented-testing.mjs +85 -1
  193. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
  194. package/fesm2022/ngwr-segmented.mjs +123 -10
  195. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  196. package/fesm2022/ngwr-select.mjs +159 -34
  197. package/fesm2022/ngwr-select.mjs.map +1 -1
  198. package/fesm2022/ngwr-shiny-text.mjs +11 -9
  199. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  200. package/fesm2022/ngwr-sidebar.mjs +31 -16
  201. package/fesm2022/ngwr-sidebar.mjs.map +1 -1
  202. package/fesm2022/ngwr-skeleton.mjs +3 -3
  203. package/fesm2022/ngwr-slider.mjs +100 -9
  204. package/fesm2022/ngwr-slider.mjs.map +1 -1
  205. package/fesm2022/ngwr-sparkline.mjs +3 -3
  206. package/fesm2022/ngwr-speed-dial-testing.mjs +15 -13
  207. package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -1
  208. package/fesm2022/ngwr-speed-dial.mjs +27 -12
  209. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  210. package/fesm2022/ngwr-spinner.mjs +3 -3
  211. package/fesm2022/ngwr-splash-cursor.mjs +3 -3
  212. package/fesm2022/ngwr-split-text.mjs +17 -5
  213. package/fesm2022/ngwr-split-text.mjs.map +1 -1
  214. package/fesm2022/ngwr-splitter.mjs +3 -3
  215. package/fesm2022/ngwr-spotlight-card.mjs +7 -7
  216. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  217. package/fesm2022/ngwr-squircle.mjs +6 -6
  218. package/fesm2022/ngwr-star-border.mjs +4 -4
  219. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  220. package/fesm2022/ngwr-statistic.mjs +9 -9
  221. package/fesm2022/ngwr-stepper-testing.mjs +8 -8
  222. package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
  223. package/fesm2022/ngwr-stepper.mjs +33 -8
  224. package/fesm2022/ngwr-stepper.mjs.map +1 -1
  225. package/fesm2022/ngwr-storage.mjs +17 -5
  226. package/fesm2022/ngwr-storage.mjs.map +1 -1
  227. package/fesm2022/ngwr-switch.mjs +3 -3
  228. package/fesm2022/ngwr-table.mjs +99 -39
  229. package/fesm2022/ngwr-table.mjs.map +1 -1
  230. package/fesm2022/ngwr-tabs-testing.mjs +11 -10
  231. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
  232. package/fesm2022/ngwr-tabs.mjs +36 -10
  233. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  234. package/fesm2022/ngwr-textarea.mjs +3 -3
  235. package/fesm2022/ngwr-theme.mjs +181 -4
  236. package/fesm2022/ngwr-theme.mjs.map +1 -1
  237. package/fesm2022/ngwr-tilt-card.mjs +7 -7
  238. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  239. package/fesm2022/ngwr-timeline.mjs +6 -6
  240. package/fesm2022/ngwr-toast.mjs +9 -9
  241. package/fesm2022/ngwr-toolbar.mjs +3 -3
  242. package/fesm2022/ngwr-tour.mjs +34 -10
  243. package/fesm2022/ngwr-tour.mjs.map +1 -1
  244. package/fesm2022/ngwr-transfer.mjs +3 -3
  245. package/fesm2022/ngwr-tree.mjs +28 -10
  246. package/fesm2022/ngwr-tree.mjs.map +1 -1
  247. package/fesm2022/ngwr-typewriter-testing.mjs +15 -1
  248. package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -1
  249. package/fesm2022/ngwr-typewriter.mjs +13 -5
  250. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  251. package/fesm2022/ngwr-typography.mjs +3 -3
  252. package/fesm2022/ngwr-utils.mjs +5 -2
  253. package/fesm2022/ngwr-utils.mjs.map +1 -1
  254. package/fesm2022/ngwr-version.mjs +1 -1
  255. package/fesm2022/ngwr-version.mjs.map +1 -1
  256. package/fesm2022/ngwr-virtual-scroll.mjs +4 -4
  257. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  258. package/fesm2022/ngwr-waves.mjs +4 -4
  259. package/fesm2022/ngwr-waves.mjs.map +1 -1
  260. package/fesm2022/ngwr-window.mjs +94 -24
  261. package/fesm2022/ngwr-window.mjs.map +1 -1
  262. package/file-upload/styles/_index.scss +2 -2
  263. package/glitch-text/styles/_index.scss +27 -12
  264. package/i18n/en.json +56 -6
  265. package/i18n/ru.json +56 -6
  266. package/image-cropper/styles/_index.scss +19 -0
  267. package/input/styles/_index.scss +2 -2
  268. package/input-number/styles/_index.scss +2 -2
  269. package/input-otp/styles/_index.scss +9 -2
  270. package/knob/styles/_index.scss +1 -1
  271. package/lightbox/styles/_index.scss +16 -2
  272. package/line-chart/styles/_index.scss +28 -14
  273. package/list/styles/_index.scss +1 -1
  274. package/llms-full.txt +19 -24
  275. package/llms.txt +46 -8
  276. package/markdown/styles/_index.scss +3 -3
  277. package/mcp/api.js +6 -4
  278. package/mcp/catalog.js +40 -3
  279. package/mcp/providers.js +16 -3
  280. package/mcp/tools.js +21 -1
  281. package/meter-group/styles/_index.scss +1 -1
  282. package/overlay/styles/_index.scss +33 -1
  283. package/package.json +17 -12
  284. package/pagination/styles/_index.scss +23 -1
  285. package/popover/styles/_index.scss +16 -7
  286. package/progress/styles/_index.scss +1 -1
  287. package/radio/styles/_index.scss +2 -2
  288. package/rating/styles/_index.scss +1 -1
  289. package/schematics/collection.json +1 -1
  290. package/schematics/migrations/v12/index.js +65 -0
  291. package/schematics/migrations/v7/index.js +12 -1
  292. package/schematics/migrations/v8/index.js +10 -1
  293. package/schematics/migrations.json +5 -0
  294. package/schematics/ng-add/index.js +8 -3
  295. package/schematics/provider/index.js +80 -13
  296. package/schematics/use/index.js +9 -129
  297. package/schematics/use/rule.js +206 -0
  298. package/schematics/use/symbol-map.json +4 -4
  299. package/segmented/styles/_index.scss +14 -3
  300. package/select/styles/_index.scss +14 -2
  301. package/sidebar/styles/_index.scss +12 -10
  302. package/skills/ngwr/SKILL.md +7 -5
  303. package/skills/ngwr/references/catalog.md +9 -9
  304. package/skills/ngwr/references/setup.md +10 -5
  305. package/slider/styles/_index.scss +1 -1
  306. package/speed-dial/styles/_index.scss +1 -1
  307. package/stepper/styles/_index.scss +12 -3
  308. package/switch/styles/_index.scss +2 -2
  309. package/table/styles/_index.scss +61 -12
  310. package/tabs/styles/_index.scss +1 -1
  311. package/textarea/styles/_index.scss +1 -1
  312. package/theme/styles/_colors.scss +142 -56
  313. package/theme/styles/_dark.scss +46 -3
  314. package/theme/styles/_focus.scss +28 -5
  315. package/theme/styles/_mixins.scss +1 -1
  316. package/theme/styles/_variables.scss +67 -0
  317. package/transfer/styles/_index.scss +26 -3
  318. package/tree/styles/_index.scss +29 -6
  319. package/types/ngwr-bar-chart-testing.d.ts +9 -1
  320. package/types/ngwr-blur-text.d.ts +8 -4
  321. package/types/ngwr-breadcrumbs.d.ts +17 -10
  322. package/types/ngwr-calendar-testing.d.ts +1 -1
  323. package/types/ngwr-calendar.d.ts +66 -0
  324. package/types/ngwr-carousel.d.ts +85 -6
  325. package/types/ngwr-cascader.d.ts +17 -0
  326. package/types/ngwr-click-spark.d.ts +4 -0
  327. package/types/ngwr-color-picker-testing.d.ts +8 -0
  328. package/types/ngwr-color-picker.d.ts +21 -1
  329. package/types/ngwr-confetti.d.ts +8 -0
  330. package/types/ngwr-config.d.ts +10 -1
  331. package/types/ngwr-context-menu-testing.d.ts +24 -11
  332. package/types/ngwr-context-menu.d.ts +56 -0
  333. package/types/ngwr-counter.d.ts +1 -0
  334. package/types/{ngwr-date-adapter-fns.d.ts → ngwr-date-adapters-fns.d.ts} +33 -6
  335. package/types/{ngwr-date-adapter-luxon.d.ts → ngwr-date-adapters-luxon.d.ts} +1 -1
  336. package/types/ngwr-date-picker-testing.d.ts +11 -6
  337. package/types/ngwr-date-picker.d.ts +8 -4
  338. package/types/{ngwr-date-adapter.d.ts → ngwr-date.d.ts} +24 -5
  339. package/types/ngwr-dialog.d.ts +38 -1
  340. package/types/ngwr-divider.d.ts +25 -0
  341. package/types/ngwr-donut-chart-testing.d.ts +7 -3
  342. package/types/ngwr-donut-chart.d.ts +3 -3
  343. package/types/ngwr-drag-drop.d.ts +56 -2
  344. package/types/ngwr-drawer.d.ts +56 -5
  345. package/types/ngwr-event-calendar.d.ts +8 -2
  346. package/types/ngwr-falling-text-testing.d.ts +5 -3
  347. package/types/ngwr-falling-text.d.ts +1 -1
  348. package/types/ngwr-form.d.ts +12 -2
  349. package/types/ngwr-glitch-text-testing.d.ts +37 -8
  350. package/types/ngwr-gradient-text-testing.d.ts +16 -3
  351. package/types/ngwr-i18n.d.ts +13 -4
  352. package/types/ngwr-image-cropper-testing.d.ts +49 -10
  353. package/types/ngwr-image-cropper.d.ts +70 -5
  354. package/types/ngwr-input-number-testing.d.ts +15 -10
  355. package/types/ngwr-input-number.d.ts +11 -4
  356. package/types/ngwr-input-otp-testing.d.ts +12 -6
  357. package/types/ngwr-input-otp.d.ts +15 -1
  358. package/types/ngwr-line-chart.d.ts +20 -3
  359. package/types/ngwr-markdown.d.ts +11 -0
  360. package/types/ngwr-mention.d.ts +32 -0
  361. package/types/ngwr-meter-group-testing.d.ts +12 -2
  362. package/types/ngwr-overlay.d.ts +1 -0
  363. package/types/ngwr-pagination-testing.d.ts +4 -4
  364. package/types/ngwr-pagination.d.ts +11 -0
  365. package/types/ngwr-pipes.d.ts +1 -1
  366. package/types/ngwr-popover-testing.d.ts +7 -2
  367. package/types/ngwr-popover.d.ts +1 -0
  368. package/types/ngwr-result.d.ts +6 -0
  369. package/types/ngwr-segmented-testing.d.ts +53 -0
  370. package/types/ngwr-segmented.d.ts +107 -5
  371. package/types/ngwr-select.d.ts +68 -6
  372. package/types/ngwr-shiny-text.d.ts +4 -2
  373. package/types/ngwr-sidebar.d.ts +14 -5
  374. package/types/ngwr-slider.d.ts +69 -1
  375. package/types/ngwr-speed-dial-testing.d.ts +15 -11
  376. package/types/ngwr-speed-dial.d.ts +22 -3
  377. package/types/ngwr-split-text.d.ts +9 -0
  378. package/types/ngwr-stepper-testing.d.ts +5 -5
  379. package/types/ngwr-stepper.d.ts +8 -0
  380. package/types/ngwr-storage.d.ts +1 -0
  381. package/types/ngwr-table.d.ts +104 -11
  382. package/types/ngwr-tabs-testing.d.ts +11 -10
  383. package/types/ngwr-tabs.d.ts +2 -0
  384. package/types/ngwr-theme.d.ts +82 -1
  385. package/types/ngwr-tour.d.ts +22 -4
  386. package/types/ngwr-tree.d.ts +5 -4
  387. package/types/ngwr-typewriter-testing.d.ts +10 -0
  388. package/types/ngwr-utils.d.ts +5 -2
  389. package/types/ngwr-version.d.ts +1 -1
  390. package/types/ngwr-window.d.ts +39 -11
  391. package/typography/styles/_index.scss +1 -1
  392. package/window/styles/_index.scss +72 -26
  393. package/fesm2022/ngwr-date-adapter-fns.mjs.map +0 -1
  394. package/fesm2022/ngwr-date-adapter-luxon.mjs.map +0 -1
  395. package/fesm2022/ngwr-date-adapter.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ngwr-tree.mjs","sources":["../../../projects/lib/tree/tree.ts","../../../projects/lib/tree/tree.html","../../../projects/lib/tree/ngwr-tree.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { NgTemplateOutlet, isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n PLATFORM_ID,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport type { FormValueControl } from '@angular/forms/signals';\n\nimport { readI18nText, useI18nFormatter, useI18nText } from 'ngwr/i18n';\nimport { WR_OVERLAY, WrOutsideClick } from 'ngwr/overlay';\n\nimport type { WrTreeNode, WrTreeSelectionMode } from './interfaces';\n\ninterface FlatNode<TId> {\n readonly node: WrTreeNode<TId>;\n readonly depth: number;\n readonly hasChildren: boolean;\n /** Absolute position in the flattened visible list. */\n readonly index: number;\n /** 1-based position within its sibling group (ARIA `aria-posinset`). */\n readonly posinset: number;\n /** Sibling count at this level (ARIA `aria-setsize`). */\n readonly setsize: number;\n}\n\ninterface SelectedChip<TId> {\n readonly id: TId;\n readonly label: string;\n}\n\nlet panelUid = 0;\n\n/**\n * Hierarchical tree. Data-driven — pass `[nodes]` with optional `children`\n * arrays. Supports single / multi selection (two-way `[(selected)]`),\n * controlled expand state (two-way `[(expanded)]`), and full keyboard\n * navigation.\n *\n * Two render shapes, picked by `[openOn]`:\n * - `'inline'` (default) — renders the tree list in-place. Use as a display\n * widget or form-less hierarchical picker.\n * - `'overlay'` — renders a `<wr-select>`-style trigger button (with chips\n * in multi mode) that opens a popover containing the tree. A signal-forms\n * native control: it implements `FormValueControl<unknown>`, so `[formField]`\n * binds straight to its `value` model — no `ControlValueAccessor` in between.\n * `[(value)]` and classic `[(ngModel)]` / reactive forms all keep working via\n * Angular's bridge. Replaces the standalone `<wr-tree-select>`.\n *\n * Value type in `overlay` mode: `TId | null` in single mode,\n * `readonly TId[]` in multi mode.\n *\n * @example\n * ```html\n * <!-- Inline tree (display widget) -->\n * <wr-tree [nodes]=\"folders\" [(selected)]=\"picked\" [(expanded)]=\"open\" />\n *\n * <!-- Form-bound combobox (signal forms) -->\n * <wr-tree\n * openOn=\"overlay\"\n * [nodes]=\"folders\"\n * selectionMode=\"single\"\n * [formField]=\"form.folder\"\n * placeholder=\"Pick a folder\"\n * />\n *\n * <!-- standalone two-way binding -->\n * <wr-tree openOn=\"overlay\" [nodes]=\"folders\" [(value)]=\"picked\" placeholder=\"Pick a folder\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/tree\n */\n@Component({\n selector: 'wr-tree',\n templateUrl: './tree.html',\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()' },\n imports: [NgTemplateOutlet],\n})\nexport class WrTree<TId = string> implements FormValueControl<unknown> {\n /** Tree data. */\n readonly nodes = input<readonly WrTreeNode<TId>[]>([]);\n\n /** Selected node ids (two-way bindable). */\n readonly selected = model<readonly TId[]>([]);\n\n /** Expanded node ids (two-way bindable). */\n readonly expanded = model<readonly TId[]>([]);\n\n /** Selection behavior. @default 'single' */\n readonly selectionMode = input<WrTreeSelectionMode>('single');\n\n /**\n * Disable the whole tree. Bound automatically from the field's disabled\n * state when used with `[formField]`.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n // Overlay-mode inputs (ignored when openOn='inline')\n\n /** Render shape. @default 'inline' */\n readonly openOn = input<'inline' | 'overlay'>('inline');\n\n /** Placeholder shown on the trigger when no node is selected. */\n readonly placeholder = input<string>('');\n\n /**\n * The same fall-through `wr-select` has had all along: an unset placeholder\n * takes the catalog's `tree.placeholder`, so an overlay trigger with nothing\n * selected reads \"Select…\" in the app's language instead of rendering an\n * empty span. The key shipped in both catalogs and nothing read it.\n */\n protected readonly resolvedPlaceholder = useI18nText(this.placeholder, 'tree.placeholder', '');\n\n /**\n * Accessible name of the overlay trigger. Falls back to the placeholder, then\n * to `select.label` — a `role=\"combobox\"` with nothing selected and no\n * placeholder otherwise has no name at all.\n */\n readonly ariaLabel = input<string | null>(null);\n\n private readonly labelText = useI18nText(this.ariaLabel, 'select.label', 'Select');\n protected readonly resolvedAriaLabel = computed(() => {\n // Not `??`: an empty placeholder must fall through to the catalog string.\n const explicit = this.ariaLabel();\n if (explicit) return explicit;\n const placeholder = this.resolvedPlaceholder();\n return placeholder ? placeholder : this.labelText();\n });\n\n /** Show a clear-all (×) button on the trigger when at least one node is selected. @default true */\n readonly clearable = input(true, { transform: coerceBooleanProperty });\n\n /**\n * Cap on the number of chips rendered on the trigger before\n * collapsing the rest into `+N more` (multi mode only). `0` = render\n * every chip. @default 0\n */\n readonly maxTagCount = input(0, {\n transform: (v: unknown): number => Math.max(0, Number(v) || 0),\n });\n\n /** Auto-expand every node that has children on first open of the overlay. @default false */\n readonly defaultExpandAll = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Window the visible-node list so a large tree keeps only ~one viewport of\n * rows in the DOM. Opt-in and OFF by default — a tree without it renders\n * byte-identically to today. Works in both `inline` and `overlay` shapes;\n * while on, keyboard navigation switches to the `aria-activedescendant`\n * pattern so Arrow / Home / End / Enter keep working across un-rendered rows.\n * @default false\n */\n readonly virtualScroll = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Uniform row height in px used to map scroll offset to node index. `0`\n * (default) measures the first rendered row once and reuses it, so it adapts\n * to the active density / touch target automatically. Read only when\n * `virtualScroll` is on. @default 0\n */\n readonly rowHeight = input(0, { transform: (v: unknown): number => Math.max(0, coerceNumberProperty(v, 0)) });\n\n /**\n * Height of the scroll viewport when `virtualScroll` is on — a number (px) or\n * any CSS length (`'60vh'`). A numeric px value lets the server prerender the\n * exact first window. @default 288\n */\n readonly viewportHeight = input<number | string>(288);\n\n /** Extra rows kept rendered above and below the viewport as scroll headroom. @default 6 */\n readonly overscan = input(6, { transform: (v: unknown): number => Math.max(0, coerceNumberProperty(v, 6)) });\n\n /**\n * Form value — the current selection as seen by a bound field. Bound by\n * `[formField]`, or two-way via `[(value)]`. Shape follows `selectionMode`:\n * `TId | null` in single mode, `readonly TId[]` in multi mode. Meaningful in\n * `overlay` mode; inline mode drives selection via `[(selected)]` instead.\n */\n readonly value = model<unknown>(undefined);\n\n /** Emitted on blur so a bound field can mark itself touched. */\n readonly touch = output<void>();\n\n // Internals\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly overlay = inject(WR_OVERLAY);\n private readonly outsideClick = inject(WrOutsideClick);\n private readonly vcr = inject(ViewContainerRef);\n private readonly scrollStrategies = inject(ScrollStrategyOptions);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n /**\n * Ambient reading direction. Optional so a bare `TestBed` — or a consumer who\n * never set a direction — needs no provider; `Directionality` is root-provided\n * anyway, and a missing one simply reads as `ltr`.\n *\n * Read at keystroke time rather than cached, so a runtime `dir` flip needs no\n * subscription to `change`.\n */\n private readonly dir = inject(Directionality, { optional: true });\n\n /** Currently focused row's index in the flattened visible list. */\n protected readonly focusedIndex = signal(0);\n\n /**\n * The cursor as the DOM sees it, clamped to the list that exists RIGHT NOW.\n *\n * The raw index is only ever written when a row is focused, and nothing shrank\n * it when the list did: collapsing a branch above the cursor left the index\n * past the end, which gave the tree zero rows with `tabindex=\"0\"` (no way back\n * in with Tab) and made every arrow key a no-op, because `onKeydown` bails when\n * `flat[i]` is undefined.\n */\n protected readonly cursorIndex = computed(() => {\n const last = Math.max(0, this.flat().length - 1);\n return Math.min(this.focusedIndex(), last);\n });\n\n /** Resolved ARIA labels — resolved once at construction, so a runtime locale switch needs a re-create. */\n protected readonly clearLabel = readI18nText('tree.clearSelection', 'Clear selection');\n protected readonly expandLabel = readI18nText('tree.expand', 'Expand');\n protected readonly collapseLabel = readI18nText('tree.collapse', 'Collapse');\n protected readonly chipRemoveLabel = useI18nFormatter('tree.removeItem', 'Remove {{label}}');\n\n /** Flattened list of currently visible nodes — what the template renders. */\n protected readonly flat = computed<readonly FlatNode<TId>[]>(() => {\n const expanded = new Set(this.expanded());\n const out: FlatNode<TId>[] = [];\n const walk = (list: readonly WrTreeNode<TId>[], depth: number): void => {\n list.forEach((node, i) => {\n const hasChildren = (node.children?.length ?? 0) > 0;\n out.push({ node, depth, hasChildren, index: out.length, posinset: i + 1, setsize: list.length });\n if (hasChildren && expanded.has(node.id)) walk(node.children!, depth + 1);\n });\n };\n walk(this.nodes(), 0);\n return out;\n });\n\n protected readonly selectedSet = computed(() => new Set(this.selected()));\n protected readonly expandedSet = computed(() => new Set(this.expanded()));\n\n protected readonly isOverlay = computed(() => this.openOn() === 'overlay');\n protected readonly isMulti = computed(() => this.selectionMode() === 'multi');\n protected readonly hasSelection = computed(() => this.selected().length > 0);\n\n /** Overlay-mode trigger label / chip map. */\n private readonly labelMap = computed<ReadonlyMap<TId, string>>(() => {\n const map = new Map<TId, string>();\n const walk = (list: readonly WrTreeNode<TId>[]): void => {\n for (const n of list) {\n map.set(n.id, n.label);\n if (n.children?.length) walk(n.children);\n }\n };\n walk(this.nodes());\n return map;\n });\n\n protected readonly selectedChips = computed<readonly SelectedChip<TId>[]>(() => {\n const map = this.labelMap();\n return this.selected().map<SelectedChip<TId>>(id => ({ id, label: map.get(id) ?? String(id) }));\n });\n\n protected readonly visibleChips = computed<readonly SelectedChip<TId>[]>(() => {\n const cap = this.maxTagCount();\n const chips = this.selectedChips();\n return cap > 0 && chips.length > cap ? chips.slice(0, cap) : chips;\n });\n\n protected readonly hiddenChipCount = computed(() => {\n const cap = this.maxTagCount();\n const total = this.selectedChips().length;\n return cap > 0 && total > cap ? total - cap : 0;\n });\n\n protected readonly singleLabel = computed<string | null>(() => {\n if (this.isMulti()) return null;\n const first = this.selected()[0];\n if (first == null) return null;\n return this.labelMap().get(first) ?? null;\n });\n\n /** Overlay open state. Only meaningful when `openOn='overlay'`. */\n protected readonly open = signal(false);\n\n /** Trigger / panel id for `aria-controls`. */\n protected readonly panelId = `wr-tree-panel-${++panelUid}`;\n\n protected readonly classes = computed(() => {\n const parts = ['wr-tree'];\n if (this.disabled()) parts.push('wr-tree--disabled');\n if (this.isOverlay()) {\n parts.push('wr-tree--combobox');\n if (this.open()) parts.push('wr-tree--open');\n if (this.isMulti()) parts.push('wr-tree--multi');\n }\n return parts.join(' ');\n });\n\n protected readonly panelTpl = viewChild('panelTpl', { read: TemplateRef });\n\n private overlayRef: OverlayRef | null = null;\n\n // --- Virtual scroll -------------------------------------------------------\n\n private static readonly FALLBACK_ROW_PX = 32;\n private static readonly FALLBACK_VIEWPORT_PX = 288;\n\n /** Live vertical scroll offset (px); 0 on the server / before first scroll. */\n private readonly scrollTop = signal(0);\n /** Measured viewport clientHeight (px); 0 until the browser observer fires. */\n private readonly viewportPx = signal(0);\n /** Measured first-row height (px) when `rowHeight` is auto; 0 until measured. */\n private readonly measuredRowPx = signal(0);\n\n /** Virtualization active (opt-in and there is anything to window). */\n protected readonly virtualized = computed(() => this.virtualScroll() && this.flat().length > 0);\n\n /** Effective uniform row height (px). */\n protected readonly effRowH = computed(() =>\n this.rowHeight() > 0 ? this.rowHeight() : this.measuredRowPx() || WrTree.FALLBACK_ROW_PX\n );\n\n /** Deterministic viewport px for SSR + first paint (numeric height, else fallback). */\n private readonly fallbackViewportPx = computed(() => {\n const h = this.viewportHeight();\n if (typeof h === 'number') return h;\n return /^\\d+$/.test(h) ? Number(h) : WrTree.FALLBACK_VIEWPORT_PX;\n });\n\n /** `viewportHeight` as a CSS length for the inline max-height (bare number → px). */\n protected readonly resolvedViewportHeight = computed(() => {\n const h = this.viewportHeight();\n return typeof h === 'number' || /^\\d+$/.test(h) ? `${h}px` : h;\n });\n\n /** Rendered window [start,end) + spacer pads (px). Pure math from `scrollTop`. */\n protected readonly virtualWindow = computed<{ start: number; end: number; padTop: number; padBottom: number }>(() => {\n const total = this.flat().length;\n if (!this.virtualized() || total === 0) return { start: 0, end: total, padTop: 0, padBottom: 0 };\n const h = this.effRowH();\n const vp = this.viewportPx() || this.fallbackViewportPx();\n const over = this.overscan();\n // Clamp `first` so a transient effRowH shrink (auto-measure landing below the\n // fallback within one frame) can't push it past the list and slice to empty.\n const first = Math.min(Math.floor(this.scrollTop() / h), total - 1);\n // `+ 1` covers the partial row at the viewport's bottom edge even at overscan 0.\n const count = Math.ceil(vp / h) + 1;\n const start = Math.max(0, first - over);\n const end = Math.min(total, first + count + over);\n return { start, end, padTop: start * h, padBottom: (total - end) * h };\n });\n\n /** Nodes placed in the list. SAME array instance as `flat()` when off → byte-identical DOM. */\n protected readonly windowRows = computed<readonly FlatNode<TId>[]>(() => {\n if (!this.virtualized()) return this.flat();\n const { start, end } = this.virtualWindow();\n return this.flat().slice(start, end);\n });\n\n /** Stable id for a row at flat index `i` — the `aria-activedescendant` target. */\n protected rowId(i: number): string {\n return `${this.panelId}-row-${i}`;\n }\n\n /**\n * Active-descendant id when virtualized (focus stays on the list container),\n * else `null`. Returns `null` while the focused row is outside the rendered\n * window (e.g. mouse-wheeled away) so `aria-activedescendant` never dangles at\n * a removed element — the next arrow key scrolls it back and re-establishes it.\n */\n protected readonly activeRowId = computed(() => {\n if (!this.virtualized()) return null;\n const i = this.cursorIndex();\n const { start, end } = this.virtualWindow();\n return i >= start && i < end ? this.rowId(i) : null;\n });\n\n /** The scrollable `<ul>` — inside the overlay panel in overlay mode, else in the host. */\n private get listElement(): HTMLElement | null {\n const root = this.overlayRef?.overlayElement ?? this.host.nativeElement;\n return root.querySelector<HTMLElement>('.wr-tree__list');\n }\n\n /** Scroll flat index `i` just into view (sets the `scrollTop` signal synchronously). */\n private ensureVisible(i: number): void {\n const h = this.effRowH();\n const vp = this.viewportPx() || this.fallbackViewportPx();\n const top = i * h;\n const cur = this.scrollTop();\n let next = cur;\n if (top < cur) next = top;\n else if (top + h > cur + vp) next = top + h - vp;\n if (next !== cur) {\n this.scrollTop.set(next);\n this.listElement?.scrollTo({ top: next });\n }\n }\n\n /** Whether this OPEN has already auto-expanded; reset when the panel closes. */\n private didExpandAll = false;\n\n constructor() {\n // Drive the overlay open/close in response to the `open` signal.\n effect(() => {\n if (!this.isOverlay()) return;\n if (this.open()) {\n this.openOverlay();\n // Once per OPEN, which is what the input documents. Reading `expanded()`\n // as part of the guard made it a dependency of this effect, so closing\n // the last branch re-ran it and inflated the tree again — collapsible one\n // branch at a time, never all the way.\n if (this.defaultExpandAll() && !this.didExpandAll) {\n this.didExpandAll = true;\n untracked(() => {\n if (this.expanded().length === 0) this.expanded.set(this.collectExpandableIds(this.nodes()));\n });\n }\n } else {\n this.didExpandAll = false;\n this.closeOverlay();\n }\n });\n\n // Disabling the control closes any open overlay (mirrors the side effect\n // of the old CVA setDisabledState).\n effect(() => {\n if (this.disabled()) this.open.set(false);\n });\n\n // Bridge an external `value` write back into the internal `selected`\n // state (this is the old writeValue body). `undefined` is the untouched\n // sentinel — no field / ngModel has written yet, so leave any preset\n // `[(selected)]` alone; a real `null` still clears, exactly as\n // `writeValue(null)` did. Guarded against the echo of our own `emit()`\n // (equality check under `untracked`) so a live pick is never clobbered.\n effect(() => {\n const value = this.value();\n if (value === undefined) return;\n untracked(() => {\n const next: readonly TId[] = this.isMulti()\n ? Array.isArray(value)\n ? (value as readonly TId[])\n : []\n : value == null\n ? []\n : [value as TId];\n const current = this.selected();\n if (next.length === current.length && next.every((id, i) => id === current[i])) return;\n this.selected.set(next);\n });\n });\n\n // Wire the scroll listener + viewport/row measurement — only while virtual\n // and in the browser. Re-runs when the list (re)appears (overlay open, data\n // change), deferring the DOM read to a microtask so the portal / inline list\n // is attached. No-op on the server (SSR renders the deterministic first\n // window from inputs alone).\n effect(onCleanup => {\n if (!isPlatformBrowser(this.platformId) || !this.virtualScroll()) return;\n const open = this.isOverlay() ? this.open() : true;\n this.flat();\n if (!open) return;\n let raf = 0;\n let ro: ResizeObserver | null = null;\n let el: HTMLElement | null = null;\n const onScroll = (): void => {\n if (raf) return;\n raf = requestAnimationFrame(() => {\n raf = 0;\n if (el) this.scrollTop.set(el.scrollTop);\n });\n };\n queueMicrotask(() => {\n el = this.listElement;\n if (!el) return;\n // The overlay `<ul>` is destroyed + recreated on each open, but the\n // `scrollTop` signal persists — restore the fresh element to it so a\n // reopened panel isn't blank (window computed from a non-zero signal\n // while the new DOM sits at scrollTop 0). No-op on first open / inline.\n if (el.scrollTop !== this.scrollTop()) el.scrollTop = this.scrollTop();\n this.viewportPx.set(el.clientHeight);\n if (this.rowHeight() === 0) {\n const h = el.querySelector<HTMLElement>('.wr-tree__row')?.offsetHeight ?? 0;\n if (h > 0) this.measuredRowPx.set(h);\n }\n el.addEventListener('scroll', onScroll, { passive: true });\n if (typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(() => {\n if (el) this.viewportPx.set(el.clientHeight);\n });\n ro.observe(el);\n }\n });\n onCleanup(() => {\n if (raf) cancelAnimationFrame(raf);\n if (el) el.removeEventListener('scroll', onScroll);\n ro?.disconnect();\n });\n });\n\n this.destroyRef.onDestroy(() => this.closeOverlay());\n }\n\n // Template handlers\n\n protected onRowClick(flat: FlatNode<TId>, event: MouseEvent): void {\n if (this.disabled() || flat.node.disabled) return;\n if (flat.hasChildren && (event.target as HTMLElement).closest('.wr-tree__toggle')) {\n this.toggleExpanded(flat.node.id);\n return;\n }\n this.focusIndex(flat.index);\n this.select(flat.node.id, event.ctrlKey || event.metaKey);\n }\n\n protected onToggleClick(node: WrTreeNode<TId>, event: MouseEvent): void {\n event.stopPropagation();\n if (this.disabled() || node.disabled) return;\n this.toggleExpanded(node.id);\n }\n\n /**\n * Map a physical arrow onto the expand / collapse axis.\n *\n * The APG gives ArrowRight the job of opening a branch and ArrowLeft the job\n * of closing it because the arrows follow the INDENT, and the indent grows\n * rightward. Under `dir=\"rtl\"` it grows leftward, so the two swap — without\n * this an RTL user cannot open a node at all.\n *\n * Up / Down travel the block axis and Home / End name a semantic position\n * (first / last), so all four are returned untouched in both directions.\n */\n private inlineKey(key: string): string {\n if (this.dir?.value !== 'rtl') return key;\n if (key === 'ArrowRight') return 'ArrowLeft';\n if (key === 'ArrowLeft') return 'ArrowRight';\n return key;\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n const flat = this.flat();\n const i = this.cursorIndex();\n const current = flat[i];\n if (!current) return;\n\n // The cursor move is identical in both render shapes — `focusIndex()` owns\n // the roving-tabindex / `aria-activedescendant` split — so mirroring here\n // covers the windowed tree too.\n switch (this.inlineKey(event.key)) {\n case 'ArrowDown':\n event.preventDefault();\n this.focusIndex(Math.min(flat.length - 1, i + 1));\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.focusIndex(Math.max(0, i - 1));\n break;\n case 'ArrowRight':\n event.preventDefault();\n if (current.hasChildren && !this.expandedSet().has(current.node.id)) {\n this.toggleExpanded(current.node.id);\n } else if (current.hasChildren) {\n this.focusIndex(Math.min(flat.length - 1, i + 1));\n }\n break;\n case 'ArrowLeft':\n event.preventDefault();\n if (current.hasChildren && this.expandedSet().has(current.node.id)) {\n this.toggleExpanded(current.node.id);\n } else if (current.depth > 0) {\n for (let j = i - 1; j >= 0; j--) {\n if (flat[j].depth < current.depth) {\n this.focusIndex(j);\n break;\n }\n }\n }\n break;\n case 'Home':\n event.preventDefault();\n this.focusIndex(0);\n break;\n case 'End':\n event.preventDefault();\n this.focusIndex(flat.length - 1);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (!current.node.disabled) this.select(current.node.id, event.ctrlKey || event.metaKey);\n break;\n default:\n break;\n }\n }\n\n // Overlay-mode trigger handlers\n\n protected onTriggerClick(): void {\n if (this.disabled()) return;\n this.open.update(v => !v);\n }\n\n /** Trigger blur — mark the bound field touched. */\n protected onBlur(): void {\n this.touch.emit();\n }\n\n protected removeChip(id: TId, event: Event): void {\n event.stopPropagation();\n if (this.disabled()) return;\n const next = this.selected().filter(x => x !== id);\n this.selected.set(next);\n this.emit();\n }\n\n protected clearSelection(event: Event): void {\n event.stopPropagation();\n if (this.disabled()) return;\n this.selected.set([]);\n this.emit();\n }\n\n // Selection / expansion plumbing\n\n private toggleExpanded(id: TId): void {\n const set = new Set(this.expanded());\n if (set.has(id)) set.delete(id);\n else set.add(id);\n this.expanded.set([...set]);\n }\n\n private select(id: TId, additive: boolean): void {\n const mode = this.selectionMode();\n if (mode === 'none') return;\n if (mode === 'single') {\n this.selected.set([id]);\n } else {\n const set = new Set(this.selected());\n if (additive) {\n if (set.has(id)) set.delete(id);\n else set.add(id);\n } else {\n // Plain click toggles single id in multi mode — common UX.\n if (set.size === 1 && set.has(id)) set.delete(id);\n else {\n set.clear();\n set.add(id);\n }\n }\n this.selected.set([...set]);\n }\n\n // Overlay mode: propagate to the bound value, close on single-mode pick.\n if (this.isOverlay()) {\n this.emit();\n if (mode === 'single' && this.selected().length > 0) {\n this.open.set(false);\n }\n }\n }\n\n private emit(): void {\n this.touch.emit();\n if (this.isMulti()) {\n this.value.set(this.selected());\n } else {\n this.value.set(this.selected()[0] ?? null);\n }\n }\n\n private focusIndex(i: number): void {\n this.focusedIndex.set(i);\n if (this.virtualized()) {\n // Managed-focus (aria-activedescendant): focus stays on the list container.\n // Setting `scrollTop` synchronously materializes row `i` in the SAME change\n // detection pass, so the id referenced by `aria-activedescendant` is present\n // — no rAF/microtask race, no \"points at an absent id\" gap.\n this.ensureVisible(i);\n this.listElement?.focus();\n return;\n }\n // Non-virtual roving tabindex: defer so the DOM has updated tabindex, then\n // move focus to the row element.\n queueMicrotask(() => {\n const root = this.overlayRef?.overlayElement ?? this.host.nativeElement;\n const row = root.querySelector<HTMLElement>(`[data-tree-index=\"${i}\"]`);\n row?.focus();\n });\n }\n\n // Overlay\n\n private collectExpandableIds(list: readonly WrTreeNode<TId>[]): readonly TId[] {\n const out: TId[] = [];\n const walk = (items: readonly WrTreeNode<TId>[]): void => {\n for (const n of items) {\n if (n.children?.length) {\n out.push(n.id);\n walk(n.children);\n }\n }\n };\n walk(list);\n return out;\n }\n\n private openOverlay(): void {\n if (this.overlayRef) return;\n const tpl = this.panelTpl();\n if (!tpl) return;\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n ])\n .withPush(true);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.scrollStrategies.reposition(),\n width: this.host.nativeElement.getBoundingClientRect().width,\n panelClass: 'wr-tree-overlay',\n });\n\n this.overlayRef.attach(new TemplatePortal(tpl, this.vcr));\n\n // Virtual mode drives keyboard nav via aria-activedescendant on the list\n // container, so it must hold focus once the panel is attached.\n if (this.virtualized()) queueMicrotask(() => this.listElement?.focus());\n\n this.outsideClick\n .outsidePointerEvents(this.overlayRef)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (this.host.nativeElement.contains(event.target as Node)) return;\n this.open.set(false);\n });\n\n this.overlayRef\n .keydownEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.open.set(false);\n }\n });\n }\n\n private closeOverlay(): void {\n if (!this.overlayRef) return;\n // Hand the focus back before the panel it lives in disappears. The keyboard\n // path in virtual mode focuses the list itself, so closing left the document\n // focused on `<body>` and the next Tab started from the top of the page —\n // `wr-dropdown` returns focus to its own trigger for the same reason.\n const active = this.host.nativeElement.ownerDocument.activeElement;\n const inPanel = active instanceof Node && this.overlayRef.overlayElement.contains(active);\n this.overlayRef.dispose();\n this.overlayRef = null;\n if (inPanel) this.host.nativeElement.querySelector<HTMLElement>('.wr-tree__trigger')?.focus();\n }\n}\n","@if (isOverlay()) {\n <button\n type=\"button\"\n class=\"wr-tree__trigger\"\n role=\"combobox\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n [disabled]=\"disabled()\"\n [attr.aria-haspopup]=\"'tree'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n (click)=\"onTriggerClick()\"\n (blur)=\"onBlur()\"\n >\n @if (isMulti()) {\n @if (hasSelection()) {\n <span class=\"wr-tree__chips\">\n @for (chip of visibleChips(); track chip.id) {\n <span class=\"wr-tree__chip\">\n <span class=\"wr-tree__chip-label\">{{ chip.label }}</span>\n <span\n class=\"wr-tree__chip-remove\"\n role=\"button\"\n [attr.aria-label]=\"chipRemoveLabel({ label: chip.label })\"\n tabindex=\"-1\"\n (click)=\"removeChip(chip.id, $event)\"\n (keydown.enter)=\"removeChip(chip.id, $event)\"\n (keydown.space)=\"removeChip(chip.id, $event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n </span>\n }\n @if (hiddenChipCount(); as extra) {\n <span class=\"wr-tree__chip wr-tree__chip--more\">+{{ extra }} more</span>\n }\n </span>\n } @else {\n <span class=\"wr-tree__placeholder\">{{ resolvedPlaceholder() }}</span>\n }\n } @else {\n @if (singleLabel(); as label) {\n <span class=\"wr-tree__value\">{{ label }}</span>\n } @else {\n <span class=\"wr-tree__placeholder\">{{ resolvedPlaceholder() }}</span>\n }\n }\n\n @if (clearable() && hasSelection() && !disabled()) {\n <span\n class=\"wr-tree__clear\"\n role=\"button\"\n [attr.aria-label]=\"clearLabel\"\n tabindex=\"-1\"\n (click)=\"clearSelection($event)\"\n (keydown.enter)=\"clearSelection($event)\"\n (keydown.space)=\"clearSelection($event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n }\n\n <svg\n class=\"wr-icon__svg wr-tree__chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n <!-- Tree list lives inside the overlay panel. -->\n <ng-template #panelTpl>\n <div class=\"wr-tree-panel\" [class.wr-tree-panel--virtual]=\"virtualized()\" [attr.id]=\"panelId\">\n <ng-container [ngTemplateOutlet]=\"listTpl\" />\n </div>\n </ng-template>\n} @else {\n <ng-container [ngTemplateOutlet]=\"listTpl\" />\n}\n\n<!-- Shared row list — rendered inline (default) or projected into the\n overlay panel (when openOn=\"overlay\"). -->\n<ng-template #listTpl>\n <!-- Roving tabindex (non-virtual) / aria-activedescendant (virtual): the tree\n owns keyboard focus and routes arrow keys to its currently-focused row. -->\n <ul\n class=\"wr-tree__list\"\n role=\"tree\"\n [attr.aria-multiselectable]=\"isMulti() ? 'true' : null\"\n [class.wr-tree__list--virtual]=\"virtualized()\"\n [attr.tabindex]=\"virtualized() ? 0 : null\"\n [attr.aria-activedescendant]=\"activeRowId()\"\n [style.max-height]=\"virtualized() ? resolvedViewportHeight() : null\"\n [style.overflow-y]=\"virtualized() ? 'auto' : null\"\n (keydown)=\"onKeydown($event)\"\n >\n @if (virtualized() && virtualWindow().padTop > 0) {\n <!-- `aria-setsize` / `aria-posinset` in BOTH shapes: the list is flat with no\n `role=\"group\"` either way, so the set a row belongs to is never expressed\n by the DOM. Gated behind the virtual flag, the same tree announced a\n position with windowing on and nothing with it off. -->\n <li\n class=\"wr-tree__spacer\"\n role=\"presentation\"\n aria-hidden=\"true\"\n [style.height.px]=\"virtualWindow().padTop\"\n ></li>\n }\n @for (entry of windowRows(); track entry.node.id) {\n <!-- Click handler lives on focusable rows; keyboard handling is owned\n by the parent <ul> via the roving-tabindex pattern. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events -->\n <li\n class=\"wr-tree__row\"\n role=\"treeitem\"\n [attr.id]=\"virtualized() ? rowId(entry.index) : null\"\n [class.wr-tree__row--selected]=\"selectedSet().has(entry.node.id)\"\n [class.wr-tree__row--active]=\"virtualized() && entry.index === cursorIndex()\"\n [class.wr-tree__row--disabled]=\"entry.node.disabled\"\n [attr.aria-level]=\"entry.depth + 1\"\n [attr.aria-setsize]=\"entry.setsize\"\n [attr.aria-posinset]=\"entry.posinset\"\n [attr.aria-expanded]=\"entry.hasChildren ? expandedSet().has(entry.node.id) : null\"\n [attr.aria-selected]=\"selectionMode() === 'none' ? null : selectedSet().has(entry.node.id)\"\n [attr.aria-disabled]=\"entry.node.disabled || disabled() || null\"\n [attr.data-tree-index]=\"entry.index\"\n [attr.tabindex]=\"virtualized() ? null : entry.index === cursorIndex() ? 0 : -1\"\n [style.--wr-tree-depth]=\"entry.depth\"\n (click)=\"onRowClick(entry, $event)\"\n >\n @if (entry.hasChildren) {\n <button\n type=\"button\"\n class=\"wr-tree__toggle\"\n tabindex=\"-1\"\n [attr.aria-label]=\"expandedSet().has(entry.node.id) ? collapseLabel : expandLabel\"\n (click)=\"onToggleClick(entry.node, $event)\"\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M3 1 L7 5 L3 9 Z\" fill=\"currentColor\" />\n </svg>\n </button>\n } @else {\n <span class=\"wr-tree__toggle wr-tree__toggle--leaf\" aria-hidden=\"true\"></span>\n }\n <span class=\"wr-tree__label\">{{ entry.node.label }}</span>\n </li>\n }\n @if (virtualized() && virtualWindow().padBottom > 0) {\n <li\n class=\"wr-tree__spacer\"\n role=\"presentation\"\n aria-hidden=\"true\"\n [style.height.px]=\"virtualWindow().padBottom\"\n ></li>\n }\n </ul>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngwr-tree.mjs","sources":["../../../projects/lib/tree/tree.ts","../../../projects/lib/tree/tree.html","../../../projects/lib/tree/ngwr-tree.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { NgTemplateOutlet, isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n Injector,\n PLATFORM_ID,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport type { FormValueControl } from '@angular/forms/signals';\n\nimport { readI18nText, useI18nFormatter, useI18nText } from 'ngwr/i18n';\nimport { WR_OVERLAY, WrOutsideClick } from 'ngwr/overlay';\n\nimport type { WrTreeNode, WrTreeSelectionMode } from './interfaces';\n\ninterface FlatNode<TId> {\n readonly node: WrTreeNode<TId>;\n readonly depth: number;\n readonly hasChildren: boolean;\n /** Absolute position in the flattened visible list. */\n readonly index: number;\n /** 1-based position within its sibling group (ARIA `aria-posinset`). */\n readonly posinset: number;\n /** Sibling count at this level (ARIA `aria-setsize`). */\n readonly setsize: number;\n}\n\ninterface SelectedChip<TId> {\n readonly id: TId;\n readonly label: string;\n}\n\nlet panelUid = 0;\n\n/**\n * Hierarchical tree. Data-driven — pass `[nodes]` with optional `children`\n * arrays. Supports single / multi selection (two-way `[(selected)]`),\n * controlled expand state (two-way `[(expanded)]`), and full keyboard\n * navigation.\n *\n * Two render shapes, picked by `[openOn]`:\n * - `'inline'` (default) — renders the tree list in-place. Use as a display\n * widget or form-less hierarchical picker.\n * - `'overlay'` — renders a `<wr-select>`-style trigger button (with chips\n * in multi mode) that opens a popover containing the tree. A signal-forms\n * native control: it implements `FormValueControl<unknown>`, so `[formField]`\n * binds straight to its `value` model — no `ControlValueAccessor` in between.\n * `[(value)]` and classic `[(ngModel)]` / reactive forms all keep working via\n * Angular's bridge. Replaces the standalone `<wr-tree-select>`.\n *\n * Value type in `overlay` mode: `TId | null` in single mode,\n * `readonly TId[]` in multi mode.\n *\n * @example\n * ```html\n * <!-- Inline tree (display widget) -->\n * <wr-tree [nodes]=\"folders\" [(selected)]=\"picked\" [(expanded)]=\"open\" />\n *\n * <!-- Form-bound combobox (signal forms) -->\n * <wr-tree\n * openOn=\"overlay\"\n * [nodes]=\"folders\"\n * selectionMode=\"single\"\n * [formField]=\"form.folder\"\n * placeholder=\"Pick a folder\"\n * />\n *\n * <!-- standalone two-way binding -->\n * <wr-tree openOn=\"overlay\" [nodes]=\"folders\" [(value)]=\"picked\" placeholder=\"Pick a folder\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/tree\n */\n@Component({\n selector: 'wr-tree',\n templateUrl: './tree.html',\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()' },\n imports: [NgTemplateOutlet],\n})\nexport class WrTree<TId = string> implements FormValueControl<unknown> {\n /** Tree data. */\n readonly nodes = input<readonly WrTreeNode<TId>[]>([]);\n\n /** Selected node ids (two-way bindable). */\n readonly selected = model<readonly TId[]>([]);\n\n /** Expanded node ids (two-way bindable). */\n readonly expanded = model<readonly TId[]>([]);\n\n /** Selection behavior. @default 'single' */\n readonly selectionMode = input<WrTreeSelectionMode>('single');\n\n /**\n * Disable the whole tree. Bound automatically from the field's disabled\n * state when used with `[formField]`.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n // Overlay-mode inputs (ignored when openOn='inline')\n\n /** Render shape. @default 'inline' */\n readonly openOn = input<'inline' | 'overlay'>('inline');\n\n /** Placeholder shown on the trigger when no node is selected. */\n readonly placeholder = input<string>('');\n\n /**\n * The same fall-through `wr-select` has had all along: an unset placeholder\n * takes the catalog's `tree.placeholder`, so an overlay trigger with nothing\n * selected reads \"Select…\" in the app's language instead of rendering an\n * empty span. The key shipped in both catalogs and nothing read it.\n */\n protected readonly resolvedPlaceholder = useI18nText(this.placeholder, 'tree.placeholder', '');\n\n /**\n * Accessible name of the overlay trigger. Falls back to the placeholder, then\n * to `select.label` — a `role=\"combobox\"` with nothing selected and no\n * placeholder otherwise has no name at all.\n */\n readonly ariaLabel = input<string | null>(null);\n\n private readonly labelText = useI18nText(this.ariaLabel, 'select.label', 'Select');\n protected readonly resolvedAriaLabel = computed(() => {\n // Not `??`: an empty placeholder must fall through to the catalog string.\n const explicit = this.ariaLabel();\n if (explicit) return explicit;\n const placeholder = this.resolvedPlaceholder();\n return placeholder ? placeholder : this.labelText();\n });\n\n /** Show a clear-all (×) button on the trigger when at least one node is selected. @default true */\n readonly clearable = input(true, { transform: coerceBooleanProperty });\n\n /**\n * Cap on the number of chips rendered on the trigger before\n * collapsing the rest into `+N more` (multi mode only). `0` = render\n * every chip. @default 0\n */\n readonly maxTagCount = input(0, {\n transform: (v: unknown): number => Math.max(0, Number(v) || 0),\n });\n\n /** Auto-expand every node that has children on first open of the overlay. @default false */\n readonly defaultExpandAll = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Window the visible-node list so a large tree keeps only ~one viewport of\n * rows in the DOM. Opt-in and OFF by default — a tree without it renders\n * byte-identically to today. Works in both `inline` and `overlay` shapes;\n * while on, keyboard navigation switches to the `aria-activedescendant`\n * pattern so Arrow / Home / End / Enter keep working across un-rendered rows.\n * @default false\n */\n readonly virtualScroll = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Uniform row height in px used to map scroll offset to node index. `0`\n * (default) measures the first rendered row once and reuses it, so it adapts\n * to the active density / touch target automatically. Read only when\n * `virtualScroll` is on. @default 0\n */\n readonly rowHeight = input(0, { transform: (v: unknown): number => Math.max(0, coerceNumberProperty(v, 0)) });\n\n /**\n * Height of the scroll viewport when `virtualScroll` is on — a number (px) or\n * any CSS length (`'60vh'`). A numeric px value lets the server prerender the\n * exact first window. @default 288\n */\n readonly viewportHeight = input<number | string>(288);\n\n /** Extra rows kept rendered above and below the viewport as scroll headroom. @default 6 */\n readonly overscan = input(6, { transform: (v: unknown): number => Math.max(0, coerceNumberProperty(v, 6)) });\n\n /**\n * Form value — the current selection as seen by a bound field. Bound by\n * `[formField]`, or two-way via `[(value)]`. Shape follows `selectionMode`:\n * `TId | null` in single mode, `readonly TId[]` in multi mode. Meaningful in\n * `overlay` mode; inline mode drives selection via `[(selected)]` instead.\n */\n readonly value = model<unknown>(undefined);\n\n /** Emitted on blur so a bound field can mark itself touched. */\n readonly touch = output<void>();\n\n // Internals\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly overlay = inject(WR_OVERLAY);\n private readonly outsideClick = inject(WrOutsideClick);\n private readonly vcr = inject(ViewContainerRef);\n private readonly scrollStrategies = inject(ScrollStrategyOptions);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly injector = inject(Injector);\n /**\n * Ambient reading direction. Optional so a bare `TestBed` — or a consumer who\n * never set a direction — needs no provider; `Directionality` is root-provided\n * anyway, and a missing one simply reads as `ltr`.\n *\n * Read at keystroke time rather than cached, so a runtime `dir` flip needs no\n * subscription to `change`.\n */\n private readonly dir = inject(Directionality, { optional: true });\n\n /** Currently focused row's index in the flattened visible list. */\n protected readonly focusedIndex = signal(0);\n\n /**\n * The cursor as the DOM sees it, clamped to the list that exists RIGHT NOW.\n *\n * The raw index is only ever written when a row is focused, and nothing shrank\n * it when the list did: collapsing a branch above the cursor left the index\n * past the end, which gave the tree zero rows with `tabindex=\"0\"` (no way back\n * in with Tab) and made every arrow key a no-op, because `onKeydown` bails when\n * `flat[i]` is undefined.\n */\n protected readonly cursorIndex = computed(() => {\n const last = Math.max(0, this.flat().length - 1);\n return Math.min(this.focusedIndex(), last);\n });\n\n /** Resolved ARIA labels — signals, so they follow both a late catalog and a locale switch. */\n protected readonly clearLabel = readI18nText('tree.clearSelection', 'Clear selection');\n protected readonly expandLabel = readI18nText('tree.expand', 'Expand');\n protected readonly collapseLabel = readI18nText('tree.collapse', 'Collapse');\n protected readonly chipRemoveLabel = useI18nFormatter('tree.removeItem', 'Remove {{label}}');\n\n /** Flattened list of currently visible nodes — what the template renders. */\n protected readonly flat = computed<readonly FlatNode<TId>[]>(() => {\n const expanded = new Set(this.expanded());\n const out: FlatNode<TId>[] = [];\n const walk = (list: readonly WrTreeNode<TId>[], depth: number): void => {\n list.forEach((node, i) => {\n const hasChildren = (node.children?.length ?? 0) > 0;\n out.push({ node, depth, hasChildren, index: out.length, posinset: i + 1, setsize: list.length });\n if (hasChildren && expanded.has(node.id)) walk(node.children!, depth + 1);\n });\n };\n walk(this.nodes(), 0);\n return out;\n });\n\n protected readonly selectedSet = computed(() => new Set(this.selected()));\n protected readonly expandedSet = computed(() => new Set(this.expanded()));\n\n protected readonly isOverlay = computed(() => this.openOn() === 'overlay');\n protected readonly isMulti = computed(() => this.selectionMode() === 'multi');\n protected readonly hasSelection = computed(() => this.selected().length > 0);\n\n /** Overlay-mode trigger label / chip map. */\n private readonly labelMap = computed<ReadonlyMap<TId, string>>(() => {\n const map = new Map<TId, string>();\n const walk = (list: readonly WrTreeNode<TId>[]): void => {\n for (const n of list) {\n map.set(n.id, n.label);\n if (n.children?.length) walk(n.children);\n }\n };\n walk(this.nodes());\n return map;\n });\n\n protected readonly selectedChips = computed<readonly SelectedChip<TId>[]>(() => {\n const map = this.labelMap();\n return this.selected().map<SelectedChip<TId>>(id => ({ id, label: map.get(id) ?? String(id) }));\n });\n\n protected readonly visibleChips = computed<readonly SelectedChip<TId>[]>(() => {\n const cap = this.maxTagCount();\n const chips = this.selectedChips();\n return cap > 0 && chips.length > cap ? chips.slice(0, cap) : chips;\n });\n\n protected readonly hiddenChipCount = computed(() => {\n const cap = this.maxTagCount();\n const total = this.selectedChips().length;\n return cap > 0 && total > cap ? total - cap : 0;\n });\n\n protected readonly singleLabel = computed<string | null>(() => {\n if (this.isMulti()) return null;\n const first = this.selected()[0];\n if (first == null) return null;\n return this.labelMap().get(first) ?? null;\n });\n\n /** Overlay open state. Only meaningful when `openOn='overlay'`. */\n protected readonly open = signal(false);\n\n /** Trigger / panel id for `aria-controls`. */\n protected readonly panelId = `wr-tree-panel-${++panelUid}`;\n\n protected readonly classes = computed(() => {\n const parts = ['wr-tree'];\n if (this.disabled()) parts.push('wr-tree--disabled');\n if (this.isOverlay()) {\n parts.push('wr-tree--combobox');\n if (this.open()) parts.push('wr-tree--open');\n if (this.isMulti()) parts.push('wr-tree--multi');\n }\n return parts.join(' ');\n });\n\n protected readonly panelTpl = viewChild('panelTpl', { read: TemplateRef });\n\n private overlayRef: OverlayRef | null = null;\n\n // --- Virtual scroll -------------------------------------------------------\n\n private static readonly FALLBACK_ROW_PX = 32;\n private static readonly FALLBACK_VIEWPORT_PX = 288;\n\n /** Live vertical scroll offset (px); 0 on the server / before first scroll. */\n private readonly scrollTop = signal(0);\n /** Measured viewport clientHeight (px); 0 until the browser observer fires. */\n private readonly viewportPx = signal(0);\n /** Measured first-row height (px) when `rowHeight` is auto; 0 until measured. */\n private readonly measuredRowPx = signal(0);\n\n /** Virtualization active (opt-in and there is anything to window). */\n protected readonly virtualized = computed(() => this.virtualScroll() && this.flat().length > 0);\n\n /** Effective uniform row height (px). */\n protected readonly effRowH = computed(() =>\n this.rowHeight() > 0 ? this.rowHeight() : this.measuredRowPx() || WrTree.FALLBACK_ROW_PX\n );\n\n /** Deterministic viewport px for SSR + first paint (numeric height, else fallback). */\n private readonly fallbackViewportPx = computed(() => {\n const h = this.viewportHeight();\n if (typeof h === 'number') return h;\n return /^\\d+$/.test(h) ? Number(h) : WrTree.FALLBACK_VIEWPORT_PX;\n });\n\n /** `viewportHeight` as a CSS length for the inline max-height (bare number → px). */\n protected readonly resolvedViewportHeight = computed(() => {\n const h = this.viewportHeight();\n return typeof h === 'number' || /^\\d+$/.test(h) ? `${h}px` : h;\n });\n\n /** Rendered window [start,end) + spacer pads (px). Pure math from `scrollTop`. */\n protected readonly virtualWindow = computed<{ start: number; end: number; padTop: number; padBottom: number }>(() => {\n const total = this.flat().length;\n if (!this.virtualized() || total === 0) return { start: 0, end: total, padTop: 0, padBottom: 0 };\n const h = this.effRowH();\n const vp = this.viewportPx() || this.fallbackViewportPx();\n const over = this.overscan();\n // Clamp `first` so a transient effRowH shrink (auto-measure landing below the\n // fallback within one frame) can't push it past the list and slice to empty.\n const first = Math.min(Math.floor(this.scrollTop() / h), total - 1);\n // `+ 1` covers the partial row at the viewport's bottom edge even at overscan 0.\n const count = Math.ceil(vp / h) + 1;\n const start = Math.max(0, first - over);\n const end = Math.min(total, first + count + over);\n return { start, end, padTop: start * h, padBottom: (total - end) * h };\n });\n\n /** Nodes placed in the list. SAME array instance as `flat()` when off → byte-identical DOM. */\n protected readonly windowRows = computed<readonly FlatNode<TId>[]>(() => {\n if (!this.virtualized()) return this.flat();\n const { start, end } = this.virtualWindow();\n return this.flat().slice(start, end);\n });\n\n /** Stable id for a row at flat index `i` — the `aria-activedescendant` target. */\n protected rowId(i: number): string {\n return `${this.panelId}-row-${i}`;\n }\n\n /**\n * Active-descendant id when virtualized (focus stays on the list container),\n * else `null`. Returns `null` while the focused row is outside the rendered\n * window (e.g. mouse-wheeled away) so `aria-activedescendant` never dangles at\n * a removed element — the next arrow key scrolls it back and re-establishes it.\n */\n protected readonly activeRowId = computed(() => {\n if (!this.virtualized()) return null;\n const i = this.cursorIndex();\n const { start, end } = this.virtualWindow();\n return i >= start && i < end ? this.rowId(i) : null;\n });\n\n /** The scrollable `<ul>` — inside the overlay panel in overlay mode, else in the host. */\n private get listElement(): HTMLElement | null {\n const root = this.overlayRef?.overlayElement ?? this.host.nativeElement;\n return root.querySelector<HTMLElement>('.wr-tree__list');\n }\n\n /** Scroll flat index `i` just into view (sets the `scrollTop` signal synchronously). */\n private ensureVisible(i: number): void {\n const h = this.effRowH();\n const vp = this.viewportPx() || this.fallbackViewportPx();\n const top = i * h;\n const cur = this.scrollTop();\n let next = cur;\n if (top < cur) next = top;\n else if (top + h > cur + vp) next = top + h - vp;\n if (next !== cur) {\n this.scrollTop.set(next);\n this.listElement?.scrollTo({ top: next });\n }\n }\n\n /** Whether this OPEN has already auto-expanded; reset when the panel closes. */\n private didExpandAll = false;\n\n constructor() {\n // Drive the overlay open/close in response to the `open` signal.\n effect(() => {\n if (!this.isOverlay()) return;\n if (this.open()) {\n this.openOverlay();\n // Once per OPEN, which is what the input documents. Reading `expanded()`\n // as part of the guard made it a dependency of this effect, so closing\n // the last branch re-ran it and inflated the tree again — collapsible one\n // branch at a time, never all the way.\n if (this.defaultExpandAll() && !this.didExpandAll) {\n this.didExpandAll = true;\n untracked(() => {\n if (this.expanded().length === 0) this.expanded.set(this.collectExpandableIds(this.nodes()));\n });\n }\n } else {\n this.didExpandAll = false;\n this.closeOverlay();\n }\n });\n\n // Disabling the control closes any open overlay (mirrors the side effect\n // of the old CVA setDisabledState).\n effect(() => {\n if (this.disabled()) this.open.set(false);\n });\n\n // Bridge an external `value` write back into the internal `selected`\n // state (this is the old writeValue body). `undefined` is the untouched\n // sentinel — no field / ngModel has written yet, so leave any preset\n // `[(selected)]` alone; a real `null` still clears, exactly as\n // `writeValue(null)` did. Guarded against the echo of our own `emit()`\n // (equality check under `untracked`) so a live pick is never clobbered.\n effect(() => {\n const value = this.value();\n if (value === undefined) return;\n untracked(() => {\n const next: readonly TId[] = this.isMulti()\n ? Array.isArray(value)\n ? (value as readonly TId[])\n : []\n : value == null\n ? []\n : [value as TId];\n const current = this.selected();\n if (next.length === current.length && next.every((id, i) => id === current[i])) return;\n this.selected.set(next);\n });\n });\n\n // Wire the scroll listener + viewport/row measurement — only while virtual\n // and in the browser. Re-runs when the list (re)appears (overlay open, data\n // change), deferring the DOM read to a microtask so the portal / inline list\n // is attached. No-op on the server (SSR renders the deterministic first\n // window from inputs alone).\n effect(onCleanup => {\n if (!isPlatformBrowser(this.platformId) || !this.virtualScroll()) return;\n const open = this.isOverlay() ? this.open() : true;\n this.flat();\n if (!open) return;\n let raf = 0;\n let ro: ResizeObserver | null = null;\n let el: HTMLElement | null = null;\n const onScroll = (): void => {\n if (raf) return;\n raf = requestAnimationFrame(() => {\n raf = 0;\n if (el) this.scrollTop.set(el.scrollTop);\n });\n };\n queueMicrotask(() => {\n el = this.listElement;\n if (!el) return;\n // The overlay `<ul>` is destroyed + recreated on each open, but the\n // `scrollTop` signal persists — restore the fresh element to it so a\n // reopened panel isn't blank (window computed from a non-zero signal\n // while the new DOM sits at scrollTop 0). No-op on first open / inline.\n if (el.scrollTop !== this.scrollTop()) el.scrollTop = this.scrollTop();\n this.viewportPx.set(el.clientHeight);\n if (this.rowHeight() === 0) {\n const h = el.querySelector<HTMLElement>('.wr-tree__row')?.offsetHeight ?? 0;\n if (h > 0) this.measuredRowPx.set(h);\n }\n el.addEventListener('scroll', onScroll, { passive: true });\n if (typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(() => {\n if (el) this.viewportPx.set(el.clientHeight);\n });\n ro.observe(el);\n }\n });\n onCleanup(() => {\n if (raf) cancelAnimationFrame(raf);\n if (el) el.removeEventListener('scroll', onScroll);\n ro?.disconnect();\n });\n });\n\n this.destroyRef.onDestroy(() => this.closeOverlay());\n }\n\n // Template handlers\n\n protected onRowClick(flat: FlatNode<TId>, event: MouseEvent): void {\n if (this.disabled() || flat.node.disabled) return;\n if (flat.hasChildren && (event.target as HTMLElement).closest('.wr-tree__toggle')) {\n this.toggleExpanded(flat.node.id);\n return;\n }\n this.focusIndex(flat.index);\n this.select(flat.node.id, event.ctrlKey || event.metaKey);\n }\n\n protected onToggleClick(node: WrTreeNode<TId>, event: MouseEvent): void {\n event.stopPropagation();\n if (this.disabled() || node.disabled) return;\n this.toggleExpanded(node.id);\n }\n\n /**\n * Map a physical arrow onto the expand / collapse axis.\n *\n * The APG gives ArrowRight the job of opening a branch and ArrowLeft the job\n * of closing it because the arrows follow the INDENT, and the indent grows\n * rightward. Under `dir=\"rtl\"` it grows leftward, so the two swap — without\n * this an RTL user cannot open a node at all.\n *\n * Up / Down travel the block axis and Home / End name a semantic position\n * (first / last), so all four are returned untouched in both directions.\n */\n private inlineKey(key: string): string {\n if (this.dir?.value !== 'rtl') return key;\n if (key === 'ArrowRight') return 'ArrowLeft';\n if (key === 'ArrowLeft') return 'ArrowRight';\n return key;\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n const flat = this.flat();\n const i = this.cursorIndex();\n const current = flat[i];\n if (!current) return;\n\n // The cursor move is identical in both render shapes — `focusIndex()` owns\n // the roving-tabindex / `aria-activedescendant` split — so mirroring here\n // covers the windowed tree too.\n switch (this.inlineKey(event.key)) {\n case 'ArrowDown':\n event.preventDefault();\n this.focusIndex(Math.min(flat.length - 1, i + 1));\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.focusIndex(Math.max(0, i - 1));\n break;\n case 'ArrowRight':\n event.preventDefault();\n if (current.hasChildren && !this.expandedSet().has(current.node.id)) {\n this.toggleExpanded(current.node.id);\n } else if (current.hasChildren) {\n this.focusIndex(Math.min(flat.length - 1, i + 1));\n }\n break;\n case 'ArrowLeft':\n event.preventDefault();\n if (current.hasChildren && this.expandedSet().has(current.node.id)) {\n this.toggleExpanded(current.node.id);\n } else if (current.depth > 0) {\n for (let j = i - 1; j >= 0; j--) {\n if (flat[j].depth < current.depth) {\n this.focusIndex(j);\n break;\n }\n }\n }\n break;\n case 'Home':\n event.preventDefault();\n this.focusIndex(0);\n break;\n case 'End':\n event.preventDefault();\n this.focusIndex(flat.length - 1);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (!current.node.disabled) this.select(current.node.id, event.ctrlKey || event.metaKey);\n break;\n default:\n break;\n }\n }\n\n // Overlay-mode trigger handlers\n\n protected onTriggerClick(): void {\n if (this.disabled()) return;\n this.open.update(v => !v);\n }\n\n /** Trigger blur — mark the bound field touched. */\n protected onBlur(): void {\n this.touch.emit();\n }\n\n protected removeChip(id: TId, event: Event): void {\n event.stopPropagation();\n if (this.disabled()) return;\n const next = this.selected().filter(x => x !== id);\n this.selected.set(next);\n this.emit();\n }\n\n protected clearSelection(event: Event): void {\n event.stopPropagation();\n if (this.disabled()) return;\n this.selected.set([]);\n this.emit();\n }\n\n // Selection / expansion plumbing\n\n private toggleExpanded(id: TId): void {\n const set = new Set(this.expanded());\n if (set.has(id)) set.delete(id);\n else set.add(id);\n this.expanded.set([...set]);\n }\n\n private select(id: TId, additive: boolean): void {\n const mode = this.selectionMode();\n if (mode === 'none') return;\n if (mode === 'single') {\n this.selected.set([id]);\n } else {\n const set = new Set(this.selected());\n if (additive) {\n if (set.has(id)) set.delete(id);\n else set.add(id);\n } else {\n // Plain click toggles single id in multi mode — common UX.\n if (set.size === 1 && set.has(id)) set.delete(id);\n else {\n set.clear();\n set.add(id);\n }\n }\n this.selected.set([...set]);\n }\n\n // Overlay mode: propagate to the bound value, close on single-mode pick.\n if (this.isOverlay()) {\n this.emit();\n if (mode === 'single' && this.selected().length > 0) {\n this.open.set(false);\n }\n }\n }\n\n private emit(): void {\n this.touch.emit();\n if (this.isMulti()) {\n this.value.set(this.selected());\n } else {\n this.value.set(this.selected()[0] ?? null);\n }\n }\n\n private focusIndex(i: number): void {\n this.focusedIndex.set(i);\n if (this.virtualized()) {\n // Managed-focus (aria-activedescendant): focus stays on the list container.\n // Setting `scrollTop` synchronously materializes row `i` in the SAME change\n // detection pass, so the id referenced by `aria-activedescendant` is present\n // — no rAF/microtask race, no \"points at an absent id\" gap.\n this.ensureVisible(i);\n this.listElement?.focus();\n return;\n }\n // Non-virtual roving tabindex: defer so the DOM has updated tabindex, then\n // move focus to the row element.\n queueMicrotask(() => {\n const root = this.overlayRef?.overlayElement ?? this.host.nativeElement;\n const row = root.querySelector<HTMLElement>(`[data-tree-index=\"${i}\"]`);\n row?.focus();\n });\n }\n\n // Overlay\n\n private collectExpandableIds(list: readonly WrTreeNode<TId>[]): readonly TId[] {\n const out: TId[] = [];\n const walk = (items: readonly WrTreeNode<TId>[]): void => {\n for (const n of items) {\n if (n.children?.length) {\n out.push(n.id);\n walk(n.children);\n }\n }\n };\n walk(list);\n return out;\n }\n\n private openOverlay(): void {\n if (this.overlayRef) return;\n const tpl = this.panelTpl();\n if (!tpl) return;\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n ])\n .withPush(true);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.scrollStrategies.reposition(),\n width: this.host.nativeElement.getBoundingClientRect().width,\n panelClass: 'wr-tree-overlay',\n });\n\n this.overlayRef.attach(new TemplatePortal(tpl, this.vcr));\n\n // The panel owns the keyboard from here, in BOTH render shapes. `onKeydown`\n // lives on the `<ul>` inside the portal and the trigger has no handler of\n // its own, so leaving focus on the trigger — which is what the non-virtual\n // shape used to do — made an overlay tree mouse-only: arrows, Home/End and\n // Enter all did nothing, and the rows were reachable only by tabbing through\n // the rest of the page, since the pane is appended to `<body>`. Virtual mode\n // focuses the LIST (managed focus via `aria-activedescendant`); the\n // non-virtual shape focuses the roving row, which carries the tab stop.\n //\n // `afterNextRender`, NOT `queueMicrotask`: under zoneless CD the scheduler\n // runs change detection in a macrotask, so a microtask queued here fires\n // first and focuses whatever the panel held before this open — the same trap\n // that once left `wr-calendar`'s ring and real focus on different days.\n afterNextRender(\n () => {\n if (this.virtualized()) {\n this.listElement?.focus();\n return;\n }\n const row = this.overlayRef?.overlayElement.querySelector<HTMLElement>(\n `[data-tree-index=\"${this.cursorIndex()}\"]`\n );\n row?.focus();\n },\n { injector: this.injector }\n );\n\n this.outsideClick\n .outsidePointerEvents(this.overlayRef)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (this.host.nativeElement.contains(event.target as Node)) return;\n this.open.set(false);\n });\n\n this.overlayRef\n .keydownEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.open.set(false);\n }\n });\n }\n\n private closeOverlay(): void {\n if (!this.overlayRef) return;\n // Hand the focus back before the panel it lives in disappears. The keyboard\n // path in virtual mode focuses the list itself, so closing left the document\n // focused on `<body>` and the next Tab started from the top of the page —\n // `wr-dropdown` returns focus to its own trigger for the same reason.\n const active = this.host.nativeElement.ownerDocument.activeElement;\n const inPanel = active instanceof Node && this.overlayRef.overlayElement.contains(active);\n this.overlayRef.dispose();\n this.overlayRef = null;\n if (inPanel) this.host.nativeElement.querySelector<HTMLElement>('.wr-tree__trigger')?.focus();\n }\n}\n","@if (isOverlay()) {\n <button\n type=\"button\"\n class=\"wr-tree__trigger\"\n role=\"combobox\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n [disabled]=\"disabled()\"\n [attr.aria-haspopup]=\"'tree'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n (click)=\"onTriggerClick()\"\n (blur)=\"onBlur()\"\n >\n @if (isMulti()) {\n @if (hasSelection()) {\n <span class=\"wr-tree__chips\">\n @for (chip of visibleChips(); track chip.id) {\n <span class=\"wr-tree__chip\">\n <span class=\"wr-tree__chip-label\">{{ chip.label }}</span>\n <span\n class=\"wr-tree__chip-remove\"\n role=\"button\"\n [attr.aria-label]=\"chipRemoveLabel({ label: chip.label })\"\n tabindex=\"-1\"\n (click)=\"removeChip(chip.id, $event)\"\n (keydown.enter)=\"removeChip(chip.id, $event)\"\n (keydown.space)=\"removeChip(chip.id, $event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n </span>\n }\n @if (hiddenChipCount(); as extra) {\n <span class=\"wr-tree__chip wr-tree__chip--more\">+{{ extra }} more</span>\n }\n </span>\n } @else {\n <span class=\"wr-tree__placeholder\">{{ resolvedPlaceholder() }}</span>\n }\n } @else {\n @if (singleLabel(); as label) {\n <span class=\"wr-tree__value\">{{ label }}</span>\n } @else {\n <span class=\"wr-tree__placeholder\">{{ resolvedPlaceholder() }}</span>\n }\n }\n\n @if (clearable() && hasSelection() && !disabled()) {\n <span\n class=\"wr-tree__clear\"\n role=\"button\"\n [attr.aria-label]=\"clearLabel()\"\n tabindex=\"-1\"\n (click)=\"clearSelection($event)\"\n (keydown.enter)=\"clearSelection($event)\"\n (keydown.space)=\"clearSelection($event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n }\n\n <svg\n class=\"wr-icon__svg wr-tree__chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n <!-- Tree list lives inside the overlay panel. -->\n <ng-template #panelTpl>\n <div class=\"wr-tree-panel\" [class.wr-tree-panel--virtual]=\"virtualized()\" [attr.id]=\"panelId\">\n <ng-container [ngTemplateOutlet]=\"listTpl\" />\n </div>\n </ng-template>\n} @else {\n <ng-container [ngTemplateOutlet]=\"listTpl\" />\n}\n\n<!-- Shared row list — rendered inline (default) or projected into the\n overlay panel (when openOn=\"overlay\"). -->\n<ng-template #listTpl>\n <!-- Roving tabindex (non-virtual) / aria-activedescendant (virtual): the tree\n owns keyboard focus and routes arrow keys to its currently-focused row. -->\n <ul\n class=\"wr-tree__list\"\n role=\"tree\"\n [attr.aria-multiselectable]=\"isMulti() ? 'true' : null\"\n [class.wr-tree__list--virtual]=\"virtualized()\"\n [attr.tabindex]=\"virtualized() ? 0 : null\"\n [attr.aria-activedescendant]=\"activeRowId()\"\n [style.max-height]=\"virtualized() ? resolvedViewportHeight() : null\"\n [style.overflow-y]=\"virtualized() ? 'auto' : null\"\n (keydown)=\"onKeydown($event)\"\n >\n @if (virtualized() && virtualWindow().padTop > 0) {\n <!-- `aria-setsize` / `aria-posinset` in BOTH shapes: the list is flat with no\n `role=\"group\"` either way, so the set a row belongs to is never expressed\n by the DOM. Gated behind the virtual flag, the same tree announced a\n position with windowing on and nothing with it off. -->\n <li\n class=\"wr-tree__spacer\"\n role=\"presentation\"\n aria-hidden=\"true\"\n [style.height.px]=\"virtualWindow().padTop\"\n ></li>\n }\n @for (entry of windowRows(); track entry.node.id) {\n <!-- Click handler lives on focusable rows; keyboard handling is owned\n by the parent <ul> via the roving-tabindex pattern. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events -->\n <li\n class=\"wr-tree__row\"\n role=\"treeitem\"\n [attr.id]=\"virtualized() ? rowId(entry.index) : null\"\n [class.wr-tree__row--selected]=\"selectedSet().has(entry.node.id)\"\n [class.wr-tree__row--active]=\"virtualized() && entry.index === cursorIndex()\"\n [class.wr-tree__row--disabled]=\"entry.node.disabled\"\n [attr.aria-level]=\"entry.depth + 1\"\n [attr.aria-setsize]=\"entry.setsize\"\n [attr.aria-posinset]=\"entry.posinset\"\n [attr.aria-expanded]=\"entry.hasChildren ? expandedSet().has(entry.node.id) : null\"\n [attr.aria-selected]=\"selectionMode() === 'none' ? null : selectedSet().has(entry.node.id)\"\n [attr.aria-disabled]=\"entry.node.disabled || disabled() || null\"\n [attr.data-tree-index]=\"entry.index\"\n [attr.tabindex]=\"virtualized() ? null : entry.index === cursorIndex() ? 0 : -1\"\n [style.--wr-tree-depth]=\"entry.depth\"\n (click)=\"onRowClick(entry, $event)\"\n >\n @if (entry.hasChildren) {\n <button\n type=\"button\"\n class=\"wr-tree__toggle\"\n tabindex=\"-1\"\n [attr.aria-label]=\"expandedSet().has(entry.node.id) ? collapseLabel() : expandLabel()\"\n (click)=\"onToggleClick(entry.node, $event)\"\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M3 1 L7 5 L3 9 Z\" fill=\"currentColor\" />\n </svg>\n </button>\n } @else {\n <span class=\"wr-tree__toggle wr-tree__toggle--leaf\" aria-hidden=\"true\"></span>\n }\n <span class=\"wr-tree__label\">{{ entry.node.label }}</span>\n </li>\n }\n @if (virtualized() && virtualWindow().padBottom > 0) {\n <li\n class=\"wr-tree__spacer\"\n role=\"presentation\"\n aria-hidden=\"true\"\n [style.height.px]=\"virtualWindow().padBottom\"\n ></li>\n }\n </ul>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -96,6 +96,20 @@ class WrTypewriterHarness extends ComponentHarness {
96
96
  }
97
97
  content = this.locatorFor(CONTENT);
98
98
  cursor = this.locatorForOptional(CURSOR);
99
+ /**
100
+ * One custom property off the host's `style` ATTRIBUTE.
101
+ *
102
+ * Not `getCssValue()`, which is `getComputedStyle`: with the entry point's own
103
+ * stylesheet loaded that resolves the sheet's declaration, so the method
104
+ * answers plausibly at exactly the moment the host binding — the thing under
105
+ * test — is what broke. The sibling reader below already says this; the
106
+ * blink duration was reading the computed value anyway.
107
+ */
108
+ async inlineVar(property) {
109
+ const attr = (await (await this.host()).getAttribute('style')) ?? '';
110
+ const found = new RegExp(`(?:^|;)\\s*${property}\\s*:\\s*([^;]+)`).exec(attr);
111
+ return (found?.[1] ?? '').trim();
112
+ }
99
113
  /**
100
114
  * What has been typed so far — a FRAGMENT while the machine is running.
101
115
  *
@@ -181,7 +195,7 @@ class WrTypewriterHarness extends ComponentHarness {
181
195
  * writing the default correctly.
182
196
  */
183
197
  async getCursorBlinkDuration() {
184
- const raw = (await (await this.host()).getCssValue('--wr-typewriter-cursor-blink')).trim();
198
+ const raw = await this.inlineVar('--wr-typewriter-cursor-blink');
185
199
  const seconds = Number.parseFloat(raw);
186
200
  if (!Number.isFinite(seconds)) {
187
201
  throw new Error(`WrTypewriterHarness.getCursorBlinkDuration(): --wr-typewriter-cursor-blink reads ${JSON.stringify(raw)}, ` +
@@ -1 +1 @@
1
- {"version":3,"file":"ngwr-typewriter-testing.mjs","sources":["../../../projects/lib/typewriter/testing/wr-typewriter-harness.ts","../../../projects/lib/typewriter/testing/ngwr-typewriter-testing.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { ComponentHarness, HarnessPredicate, type TestElement } from '@angular/cdk/testing';\n\nimport type { WrTypewriterHarnessFilters } from './interfaces';\n\n/** The one text node the state machine writes into — the whole of its observable output. */\nconst CONTENT = '.wr-typewriter__content';\n\n/** The caret. Not hidden when it is unwanted — removed from the document entirely. */\nconst CURSOR = '.wr-typewriter__cursor';\n\n/**\n * A `color:` declaration in an inline `style` attribute.\n *\n * The run has to start at the beginning or just after a `;` so that `background-color`\n * — or any other `-color` longhand a consumer's own style attribute might carry — cannot\n * be mistaken for it.\n */\nconst INLINE_COLOR = /(?:^|;)\\s*color\\s*:\\s*([^;]+)/;\n\n/** Exactly what the element holds — untrimmed, unlike `TestElement.text()`. */\nasync function rawText(element: TestElement): Promise<string> {\n return (await element.getProperty<string | null>('textContent')) ?? '';\n}\n\n/**\n * Test harness for `<wr-typewriter>`.\n *\n * **The typed string is the entire component, and it is a moving target.**\n * {@link getText} reads the one text node the machine writes into, which mid-run holds\n * a FRAGMENT — `'Hell'` on the way to `'Hello'` — and between sentences holds whatever\n * is left of the previous one. That is not a limitation to work around; it is what the\n * component renders, and pinning it tick by tick is what proves the machine types one\n * character at a time, deletes one at a time, pauses, cycles, and stops when told not to\n * loop. Install fake timers for `setTimeout` / `clearTimeout` only and advance the clock\n * yourself before every read — awaiting a harness method flushes microtasks, never\n * timers, so an unadvanced read answers with the previous frame.\n *\n * **What is typed is also what is announced, and no second copy exists.** There is\n * deliberately no `getAccessibleText()` here: the component renders one plain text node\n * and nothing else, so a screen reader landing mid-word hears the fragment. (Its sibling\n * `wr-rotating-text` carries a visually-hidden copy of the whole phrase; this one does\n * not, and inventing a method that implied otherwise would report an accessible layer\n * that is not there.) The single a11y decision the component does make is the caret, and\n * {@link isCursorDecorative} is how a spec holds it: without `aria-hidden` every phrase\n * is announced as `Hello pipe`, and nothing else in the DOM would change.\n *\n * **The methods that are missing are missing on purpose.** There is no `isTyping()` or\n * `getPhase()` — the phase is a private signal that never reaches the document, and its\n * only proxy, the caret vanishing, exists solely when `hideCursorWhileTyping` is set, so\n * the method would report \"not typing\" for the DEFAULT configuration while the machine\n * types. No `isComplete()` / `isFinished()`: a machine stopped on its last sentence and\n * one pausing between sentences render the identical string and the identical caret, so\n * assert the `sentenceComplete` output instead. No `isCursorBlinking()` /\n * `getCursorOpacity()`: the blink is a `@keyframes` rule from a stylesheet a unit test\n * never loads, and a mid-animation opacity is a number that means nothing.\n * No `isVisible()` / `waitForVisible()`: `startOnVisible` hangs off an\n * `IntersectionObserver` jsdom does not implement, so any answer would be the spec's own\n * stub echoing back. And no `getTypingSpeed()` / `getDeletingSpeed()` /\n * `getPauseDuration()` / `getInitialDelay()`: none of them is ever written to the DOM, so\n * reading them would mean reading the component instance rather than the rendered\n * control. They are observable exactly once — as the cadence of {@link getText}.\n *\n * What DOES survive a test with no layout, besides the string: the caret's presence,\n * glyph and `aria-hidden`, and the two values the host writes inline —\n * {@link getColor} and {@link getCursorBlinkDuration}.\n *\n * ```ts\n * // jsdom implements no IntersectionObserver, so `[startOnVisible]` throws on boot.\n * vi.stubGlobal('IntersectionObserver', StubObserver);\n * // Fake these two and no more: faking the microtask queue deadlocks `whenStable`,\n * // which is where the machine boots and where every harness read stabilizes.\n * vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] });\n * ```\n *\n * @example\n * ```ts\n * const typewriter = await loader.getHarness(WrTypewriterHarness);\n *\n * vi.advanceTimersByTime(0); // the first tick is scheduled at `initialDelay`\n * expect(await typewriter.getText()).toBe('H');\n *\n * vi.advanceTimersByTime(50);\n * expect(await typewriter.getText()).toBe('He');\n * expect(await typewriter.isCursorDecorative()).toBe(true);\n * ```\n *\n * @see https://ngwr.dev/guides/testing\n */\nexport class WrTypewriterHarness extends ComponentHarness {\n static hostSelector = 'wr-typewriter';\n\n /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */\n static with(options: WrTypewriterHarnessFilters = {}): HarnessPredicate<WrTypewriterHarness> {\n return new HarnessPredicate(WrTypewriterHarness, options)\n .addOption('text', options.text, (harness, text) => HarnessPredicate.stringMatches(harness.getText(), text))\n .addOption(\n 'hasCursor',\n options.hasCursor,\n async (harness, hasCursor) => (await harness.hasCursor()) === hasCursor\n );\n }\n\n private readonly content = this.locatorFor(CONTENT);\n private readonly cursor = this.locatorForOptional(CURSOR);\n\n /**\n * What has been typed so far — a FRAGMENT while the machine is running.\n *\n * This is the whole state machine in one string, and every timing input is observable\n * only through it: one character per `typingSpeed`, one fewer per `deletingSpeed`, the\n * `pauseDuration` gap, the swap to the next entry in `[texts]`, and the stop that\n * `[loop]=\"false\"` puts on the last sentence. `reverseMode` shows up here too, and\n * `[...await getText()].length` is what proves the reversal counted CODE POINTS: a\n * `split('')` reversal turns one emoji into two lone surrogates, which is a pair of\n * broken glyphs on screen and the same character count as a correct answer.\n *\n * Untrimmed, because the fragment is what it is: a phrase typed as far as `'Hello '`\n * genuinely has a trailing space, and trimming would make that frame indistinguishable\n * from the one before it.\n *\n * The empty string is a real state, not a failure — nothing has been typed until the\n * first tick fires, and a deletion run passes back through it on its way to the next\n * sentence.\n */\n async getText(): Promise<string> {\n return rawText(await this.content());\n }\n\n /**\n * Whether a caret is in the document at all.\n *\n * The component removes the element rather than hiding it, which makes this two\n * questions at once. Statically it answers `showCursor`. While the machine runs it\n * also answers `hideCursorWhileTyping` — and the caret going away is the ONLY evidence\n * anywhere in the DOM that the component considers itself mid-phase, since the phase\n * signal is private. Do not read that as `isTyping()`, though: with\n * `hideCursorWhileTyping` off, which is the default, the caret stays put from the first\n * character to the last.\n */\n async hasCursor(): Promise<boolean> {\n return (await this.cursor()) !== null;\n }\n\n /**\n * The caret glyph, or `null` when there is no caret.\n *\n * `null` rather than `''` on purpose: \"no cursor element\" and \"a cursor element\n * rendering nothing\" are different failures, and an interpolated glyph that stopped\n * arriving is exactly the second one. Untrimmed, since a caret can legitimately be a\n * space-padded glyph and `TestElement.text()` would erase it.\n */\n async getCursorCharacter(): Promise<string | null> {\n const cursor = await this.cursor();\n return cursor ? rawText(cursor) : null;\n }\n\n /**\n * Whether the caret is kept out of the accessibility tree.\n *\n * The component's one deliberate a11y decision, and a silent one to lose: drop the\n * attribute and nothing on screen changes while every phrase starts being announced as\n * `Hello pipe`.\n *\n * Throws when there is no caret. `false` would read as \"the caret is announced\", which\n * is the opposite of what an absent caret means — and it is the answer a component that\n * stopped rendering its cursor entirely would also give. Ask {@link hasCursor} first\n * when the caret's presence is itself in question.\n */\n async isCursorDecorative(): Promise<boolean> {\n const cursor = await this.cursor();\n\n if (!cursor) {\n throw new Error(\n 'WrTypewriterHarness.isCursorDecorative(): this <wr-typewriter> has no cursor element, so there is ' +\n 'nothing to be hidden from a screen reader and \"false\" would read as \"the cursor is announced\" — the ' +\n 'opposite of what an absent cursor means. `showCursor` is off, or `hideCursorWhileTyping` has taken ' +\n 'it away for this phase; ask hasCursor().'\n );\n }\n\n return (await cursor.getAttribute('aria-hidden')) === 'true';\n }\n\n /**\n * The caret's blink half-cycle in seconds, from the custom property the host writes.\n *\n * The blink itself is a CSS keyframe and unobservable, so this custom property is the\n * only channel `[cursorBlinkDuration]` has into it — a binding that quietly stopped\n * writing it would leave the blink stuck at the stylesheet's default with no other\n * symptom anywhere.\n *\n * Throws rather than answering when the property is missing or unparseable, and says\n * which it was. The stylesheet's own `0.5s` fallback is never applied in a test that\n * loads no stylesheets, so an absent property reads as the empty string here — and\n * `0.5` returned from a `parseFloat('')` would be indistinguishable from the component\n * writing the default correctly.\n */\n async getCursorBlinkDuration(): Promise<number> {\n const raw = (await (await this.host()).getCssValue('--wr-typewriter-cursor-blink')).trim();\n const seconds = Number.parseFloat(raw);\n\n if (!Number.isFinite(seconds)) {\n throw new Error(\n `WrTypewriterHarness.getCursorBlinkDuration(): --wr-typewriter-cursor-blink reads ${JSON.stringify(raw)}, ` +\n 'which is not a number of seconds. The component writes this property inline on every render; the ' +\n 'stylesheet default behind it never applies in a test, so an empty read means the binding stopped ' +\n 'reaching the DOM rather than that the caret blinks at 0.5s.'\n );\n }\n\n return seconds;\n }\n\n /**\n * The colour the host paints the phrase in, exactly as it is written inline.\n *\n * `[textColors]` cycles per SENTENCE, so this is how a spec pins that the colour index\n * follows the sentence index rather than drifting; and with no colours given the\n * component writes the literal `inherit`, which is a value worth asserting rather than\n * an absence.\n *\n * Read off the `style` ATTRIBUTE rather than through `getCssValue`, which would answer\n * from a computed style. jsdom hands `inherit` straight back, so `getCssValue` would\n * agree here and lie in a real browser, where the keyword resolves to whatever rgb\n * triple the parent happens to carry.\n *\n * Throws when the host carries no `color` declaration: the component writes one on\n * every render, so its absence means the binding is gone, and any string returned in\n * its place would be a guess at what the page inherits.\n */\n async getColor(): Promise<string> {\n const style = (await (await this.host()).getAttribute('style')) ?? '';\n const declaration = INLINE_COLOR.exec(style);\n\n if (!declaration) {\n throw new Error(\n `WrTypewriterHarness.getColor(): the host carries no inline color — its style attribute is ` +\n `${JSON.stringify(style)}. The component writes one on every render, \"inherit\" when [textColors] is ` +\n 'empty, so nothing there means the binding stopped reaching the DOM.'\n );\n }\n\n return declaration[1].trim();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngwr-typewriter-testing.mjs","sources":["../../../projects/lib/typewriter/testing/wr-typewriter-harness.ts","../../../projects/lib/typewriter/testing/ngwr-typewriter-testing.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { ComponentHarness, HarnessPredicate, type TestElement } from '@angular/cdk/testing';\n\nimport type { WrTypewriterHarnessFilters } from './interfaces';\n\n/** The one text node the state machine writes into — the whole of its observable output. */\nconst CONTENT = '.wr-typewriter__content';\n\n/** The caret. Not hidden when it is unwanted — removed from the document entirely. */\nconst CURSOR = '.wr-typewriter__cursor';\n\n/**\n * A `color:` declaration in an inline `style` attribute.\n *\n * The run has to start at the beginning or just after a `;` so that `background-color`\n * — or any other `-color` longhand a consumer's own style attribute might carry — cannot\n * be mistaken for it.\n */\nconst INLINE_COLOR = /(?:^|;)\\s*color\\s*:\\s*([^;]+)/;\n\n/** Exactly what the element holds — untrimmed, unlike `TestElement.text()`. */\nasync function rawText(element: TestElement): Promise<string> {\n return (await element.getProperty<string | null>('textContent')) ?? '';\n}\n\n/**\n * Test harness for `<wr-typewriter>`.\n *\n * **The typed string is the entire component, and it is a moving target.**\n * {@link getText} reads the one text node the machine writes into, which mid-run holds\n * a FRAGMENT — `'Hell'` on the way to `'Hello'` — and between sentences holds whatever\n * is left of the previous one. That is not a limitation to work around; it is what the\n * component renders, and pinning it tick by tick is what proves the machine types one\n * character at a time, deletes one at a time, pauses, cycles, and stops when told not to\n * loop. Install fake timers for `setTimeout` / `clearTimeout` only and advance the clock\n * yourself before every read — awaiting a harness method flushes microtasks, never\n * timers, so an unadvanced read answers with the previous frame.\n *\n * **What is typed is also what is announced, and no second copy exists.** There is\n * deliberately no `getAccessibleText()` here: the component renders one plain text node\n * and nothing else, so a screen reader landing mid-word hears the fragment. (Its sibling\n * `wr-rotating-text` carries a visually-hidden copy of the whole phrase; this one does\n * not, and inventing a method that implied otherwise would report an accessible layer\n * that is not there.) The single a11y decision the component does make is the caret, and\n * {@link isCursorDecorative} is how a spec holds it: without `aria-hidden` every phrase\n * is announced as `Hello pipe`, and nothing else in the DOM would change.\n *\n * **The methods that are missing are missing on purpose.** There is no `isTyping()` or\n * `getPhase()` — the phase is a private signal that never reaches the document, and its\n * only proxy, the caret vanishing, exists solely when `hideCursorWhileTyping` is set, so\n * the method would report \"not typing\" for the DEFAULT configuration while the machine\n * types. No `isComplete()` / `isFinished()`: a machine stopped on its last sentence and\n * one pausing between sentences render the identical string and the identical caret, so\n * assert the `sentenceComplete` output instead. No `isCursorBlinking()` /\n * `getCursorOpacity()`: the blink is a `@keyframes` rule from a stylesheet a unit test\n * never loads, and a mid-animation opacity is a number that means nothing.\n * No `isVisible()` / `waitForVisible()`: `startOnVisible` hangs off an\n * `IntersectionObserver` jsdom does not implement, so any answer would be the spec's own\n * stub echoing back. And no `getTypingSpeed()` / `getDeletingSpeed()` /\n * `getPauseDuration()` / `getInitialDelay()`: none of them is ever written to the DOM, so\n * reading them would mean reading the component instance rather than the rendered\n * control. They are observable exactly once — as the cadence of {@link getText}.\n *\n * What DOES survive a test with no layout, besides the string: the caret's presence,\n * glyph and `aria-hidden`, and the two values the host writes inline —\n * {@link getColor} and {@link getCursorBlinkDuration}.\n *\n * ```ts\n * // jsdom implements no IntersectionObserver, so `[startOnVisible]` throws on boot.\n * vi.stubGlobal('IntersectionObserver', StubObserver);\n * // Fake these two and no more: faking the microtask queue deadlocks `whenStable`,\n * // which is where the machine boots and where every harness read stabilizes.\n * vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] });\n * ```\n *\n * @example\n * ```ts\n * const typewriter = await loader.getHarness(WrTypewriterHarness);\n *\n * vi.advanceTimersByTime(0); // the first tick is scheduled at `initialDelay`\n * expect(await typewriter.getText()).toBe('H');\n *\n * vi.advanceTimersByTime(50);\n * expect(await typewriter.getText()).toBe('He');\n * expect(await typewriter.isCursorDecorative()).toBe(true);\n * ```\n *\n * @see https://ngwr.dev/guides/testing\n */\nexport class WrTypewriterHarness extends ComponentHarness {\n static hostSelector = 'wr-typewriter';\n\n /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */\n static with(options: WrTypewriterHarnessFilters = {}): HarnessPredicate<WrTypewriterHarness> {\n return new HarnessPredicate(WrTypewriterHarness, options)\n .addOption('text', options.text, (harness, text) => HarnessPredicate.stringMatches(harness.getText(), text))\n .addOption(\n 'hasCursor',\n options.hasCursor,\n async (harness, hasCursor) => (await harness.hasCursor()) === hasCursor\n );\n }\n\n private readonly content = this.locatorFor(CONTENT);\n private readonly cursor = this.locatorForOptional(CURSOR);\n\n /**\n * One custom property off the host's `style` ATTRIBUTE.\n *\n * Not `getCssValue()`, which is `getComputedStyle`: with the entry point's own\n * stylesheet loaded that resolves the sheet's declaration, so the method\n * answers plausibly at exactly the moment the host binding — the thing under\n * test — is what broke. The sibling reader below already says this; the\n * blink duration was reading the computed value anyway.\n */\n private async inlineVar(property: string): Promise<string> {\n const attr = (await (await this.host()).getAttribute('style')) ?? '';\n const found = new RegExp(`(?:^|;)\\\\s*${property}\\\\s*:\\\\s*([^;]+)`).exec(attr);\n return (found?.[1] ?? '').trim();\n }\n\n /**\n * What has been typed so far — a FRAGMENT while the machine is running.\n *\n * This is the whole state machine in one string, and every timing input is observable\n * only through it: one character per `typingSpeed`, one fewer per `deletingSpeed`, the\n * `pauseDuration` gap, the swap to the next entry in `[texts]`, and the stop that\n * `[loop]=\"false\"` puts on the last sentence. `reverseMode` shows up here too, and\n * `[...await getText()].length` is what proves the reversal counted CODE POINTS: a\n * `split('')` reversal turns one emoji into two lone surrogates, which is a pair of\n * broken glyphs on screen and the same character count as a correct answer.\n *\n * Untrimmed, because the fragment is what it is: a phrase typed as far as `'Hello '`\n * genuinely has a trailing space, and trimming would make that frame indistinguishable\n * from the one before it.\n *\n * The empty string is a real state, not a failure — nothing has been typed until the\n * first tick fires, and a deletion run passes back through it on its way to the next\n * sentence.\n */\n async getText(): Promise<string> {\n return rawText(await this.content());\n }\n\n /**\n * Whether a caret is in the document at all.\n *\n * The component removes the element rather than hiding it, which makes this two\n * questions at once. Statically it answers `showCursor`. While the machine runs it\n * also answers `hideCursorWhileTyping` — and the caret going away is the ONLY evidence\n * anywhere in the DOM that the component considers itself mid-phase, since the phase\n * signal is private. Do not read that as `isTyping()`, though: with\n * `hideCursorWhileTyping` off, which is the default, the caret stays put from the first\n * character to the last.\n */\n async hasCursor(): Promise<boolean> {\n return (await this.cursor()) !== null;\n }\n\n /**\n * The caret glyph, or `null` when there is no caret.\n *\n * `null` rather than `''` on purpose: \"no cursor element\" and \"a cursor element\n * rendering nothing\" are different failures, and an interpolated glyph that stopped\n * arriving is exactly the second one. Untrimmed, since a caret can legitimately be a\n * space-padded glyph and `TestElement.text()` would erase it.\n */\n async getCursorCharacter(): Promise<string | null> {\n const cursor = await this.cursor();\n return cursor ? rawText(cursor) : null;\n }\n\n /**\n * Whether the caret is kept out of the accessibility tree.\n *\n * The component's one deliberate a11y decision, and a silent one to lose: drop the\n * attribute and nothing on screen changes while every phrase starts being announced as\n * `Hello pipe`.\n *\n * Throws when there is no caret. `false` would read as \"the caret is announced\", which\n * is the opposite of what an absent caret means — and it is the answer a component that\n * stopped rendering its cursor entirely would also give. Ask {@link hasCursor} first\n * when the caret's presence is itself in question.\n */\n async isCursorDecorative(): Promise<boolean> {\n const cursor = await this.cursor();\n\n if (!cursor) {\n throw new Error(\n 'WrTypewriterHarness.isCursorDecorative(): this <wr-typewriter> has no cursor element, so there is ' +\n 'nothing to be hidden from a screen reader and \"false\" would read as \"the cursor is announced\" — the ' +\n 'opposite of what an absent cursor means. `showCursor` is off, or `hideCursorWhileTyping` has taken ' +\n 'it away for this phase; ask hasCursor().'\n );\n }\n\n return (await cursor.getAttribute('aria-hidden')) === 'true';\n }\n\n /**\n * The caret's blink half-cycle in seconds, from the custom property the host writes.\n *\n * The blink itself is a CSS keyframe and unobservable, so this custom property is the\n * only channel `[cursorBlinkDuration]` has into it — a binding that quietly stopped\n * writing it would leave the blink stuck at the stylesheet's default with no other\n * symptom anywhere.\n *\n * Throws rather than answering when the property is missing or unparseable, and says\n * which it was. The stylesheet's own `0.5s` fallback is never applied in a test that\n * loads no stylesheets, so an absent property reads as the empty string here — and\n * `0.5` returned from a `parseFloat('')` would be indistinguishable from the component\n * writing the default correctly.\n */\n async getCursorBlinkDuration(): Promise<number> {\n const raw = await this.inlineVar('--wr-typewriter-cursor-blink');\n const seconds = Number.parseFloat(raw);\n\n if (!Number.isFinite(seconds)) {\n throw new Error(\n `WrTypewriterHarness.getCursorBlinkDuration(): --wr-typewriter-cursor-blink reads ${JSON.stringify(raw)}, ` +\n 'which is not a number of seconds. The component writes this property inline on every render; the ' +\n 'stylesheet default behind it never applies in a test, so an empty read means the binding stopped ' +\n 'reaching the DOM rather than that the caret blinks at 0.5s.'\n );\n }\n\n return seconds;\n }\n\n /**\n * The colour the host paints the phrase in, exactly as it is written inline.\n *\n * `[textColors]` cycles per SENTENCE, so this is how a spec pins that the colour index\n * follows the sentence index rather than drifting; and with no colours given the\n * component writes the literal `inherit`, which is a value worth asserting rather than\n * an absence.\n *\n * Read off the `style` ATTRIBUTE rather than through `getCssValue`, which would answer\n * from a computed style. jsdom hands `inherit` straight back, so `getCssValue` would\n * agree here and lie in a real browser, where the keyword resolves to whatever rgb\n * triple the parent happens to carry.\n *\n * Throws when the host carries no `color` declaration: the component writes one on\n * every render, so its absence means the binding is gone, and any string returned in\n * its place would be a guess at what the page inherits.\n */\n async getColor(): Promise<string> {\n const style = (await (await this.host()).getAttribute('style')) ?? '';\n const declaration = INLINE_COLOR.exec(style);\n\n if (!declaration) {\n throw new Error(\n `WrTypewriterHarness.getColor(): the host carries no inline color — its style attribute is ` +\n `${JSON.stringify(style)}. The component writes one on every render, \"inherit\" when [textColors] is ` +\n 'empty, so nothing there means the binding stopped reaching the DOM.'\n );\n }\n\n return declaration[1].trim();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;AAAA;;;;;AAKG;AAMH;AACA,MAAM,OAAO,GAAG,yBAAyB;AAEzC;AACA,MAAM,MAAM,GAAG,wBAAwB;AAEvC;;;;;;AAMG;AACH,MAAM,YAAY,GAAG,+BAA+B;AAEpD;AACA,eAAe,OAAO,CAAC,OAAoB,EAAA;IACzC,OAAO,CAAC,MAAM,OAAO,CAAC,WAAW,CAAgB,aAAa,CAAC,KAAK,EAAE;AACxE;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DG;AACG,MAAO,mBAAoB,SAAQ,gBAAgB,CAAA;AACvD,IAAA,OAAO,YAAY,GAAG,eAAe;;AAGrC,IAAA,OAAO,IAAI,CAAC,OAAA,GAAsC,EAAE,EAAA;AAClD,QAAA,OAAO,IAAI,gBAAgB,CAAC,mBAAmB,EAAE,OAAO;aACrD,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,KAAK,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC;aAC1G,SAAS,CACR,WAAW,EACX,OAAO,CAAC,SAAS,EACjB,OAAO,OAAO,EAAE,SAAS,KAAK,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,MAAM,SAAS,CACxE;IACL;AAEiB,IAAA,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;AAClC,IAAA,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;AAEzD;;;;;;;;AAQG;IACK,MAAM,SAAS,CAAC,QAAgB,EAAA;AACtC,QAAA,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE;AACpE,QAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,CAAA,WAAA,EAAc,QAAQ,CAAA,gBAAA,CAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7E,QAAA,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE;IAClC;AAEA;;;;;;;;;;;;;;;;;;AAkBG;AACH,IAAA,MAAM,OAAO,GAAA;QACX,OAAO,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACtC;AAEA;;;;;;;;;;AAUG;AACH,IAAA,MAAM,SAAS,GAAA;QACb,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI;IACvC;AAEA;;;;;;;AAOG;AACH,IAAA,MAAM,kBAAkB,GAAA;AACtB,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE;AAClC,QAAA,OAAO,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI;IACxC;AAEA;;;;;;;;;;;AAWG;AACH,IAAA,MAAM,kBAAkB,GAAA;AACtB,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE;QAElC,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,IAAI,KAAK,CACb,oGAAoG;gBAClG,sGAAsG;gBACtG,qGAAqG;AACrG,gBAAA,0CAA0C,CAC7C;QACH;QAEA,OAAO,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,MAAM;IAC9D;AAEA;;;;;;;;;;;;;AAaG;AACH,IAAA,MAAM,sBAAsB,GAAA;QAC1B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QAEtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YAC7B,MAAM,IAAI,KAAK,CACb,CAAA,iFAAA,EAAoF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,EAAA,CAAI;gBACzG,mGAAmG;gBACnG,mGAAmG;AACnG,gBAAA,6DAA6D,CAChE;QACH;AAEA,QAAA,OAAO,OAAO;IAChB;AAEA;;;;;;;;;;;;;;;;AAgBG;AACH,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE;QACrE,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QAE5C,IAAI,CAAC,WAAW,EAAE;YAChB,MAAM,IAAI,KAAK,CACb,CAAA,0FAAA,CAA4F;AAC1F,gBAAA,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA,2EAAA,CAA6E;AACrG,gBAAA,qEAAqE,CACxE;QACH;AAEA,QAAA,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;IAC9B;;;ACzQF;;AAEG;;;;"}