ngwr 10.2.0 → 11.0.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 (471) hide show
  1. package/README.md +39 -19
  2. package/anchor/styles/_index.scss +4 -4
  3. package/back-top/styles/_index.scss +6 -1
  4. package/blur-text/styles/_index.scss +13 -0
  5. package/button/styles/_index.scss +11 -6
  6. package/carousel/styles/_index.scss +13 -2
  7. package/cascader/styles/_index.scss +2 -2
  8. package/circular-text/styles/_index.scss +2 -0
  9. package/collapse/styles/_index.scss +1 -1
  10. package/color-picker/styles/_index.scss +6 -1
  11. package/compare/styles/_index.scss +1 -2
  12. package/context-menu/styles/_index.scss +6 -1
  13. package/descriptions/styles/_index.scss +2 -2
  14. package/dialog/styles/_index.scss +38 -0
  15. package/drawer/styles/_index.scss +20 -1
  16. package/dropdown/styles/_index.scss +19 -5
  17. package/empty/styles/_index.scss +10 -0
  18. package/fesm2022/ngwr-action-sheet.mjs +15 -5
  19. package/fesm2022/ngwr-action-sheet.mjs.map +1 -1
  20. package/fesm2022/ngwr-affix.mjs +43 -16
  21. package/fesm2022/ngwr-affix.mjs.map +1 -1
  22. package/fesm2022/ngwr-alert.mjs +3 -3
  23. package/fesm2022/ngwr-anchor.mjs +20 -8
  24. package/fesm2022/ngwr-anchor.mjs.map +1 -1
  25. package/fesm2022/ngwr-aurora.mjs +4 -4
  26. package/fesm2022/ngwr-aurora.mjs.map +1 -1
  27. package/fesm2022/ngwr-avatar.mjs +33 -9
  28. package/fesm2022/ngwr-avatar.mjs.map +1 -1
  29. package/fesm2022/ngwr-back-top.mjs +8 -4
  30. package/fesm2022/ngwr-back-top.mjs.map +1 -1
  31. package/fesm2022/ngwr-badge.mjs +6 -6
  32. package/fesm2022/ngwr-badge.mjs.map +1 -1
  33. package/fesm2022/ngwr-bar-chart.mjs +32 -11
  34. package/fesm2022/ngwr-bar-chart.mjs.map +1 -1
  35. package/fesm2022/ngwr-blur-text.mjs +4 -4
  36. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  37. package/fesm2022/ngwr-border-glow.mjs +4 -4
  38. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  39. package/fesm2022/ngwr-breadcrumbs.mjs +9 -8
  40. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  41. package/fesm2022/ngwr-burger.mjs +11 -6
  42. package/fesm2022/ngwr-burger.mjs.map +1 -1
  43. package/fesm2022/ngwr-button-testing.mjs +96 -0
  44. package/fesm2022/ngwr-button-testing.mjs.map +1 -0
  45. package/fesm2022/ngwr-button.mjs +89 -24
  46. package/fesm2022/ngwr-button.mjs.map +1 -1
  47. package/fesm2022/ngwr-calendar-heatmap.mjs +42 -10
  48. package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
  49. package/fesm2022/ngwr-calendar.mjs +108 -9
  50. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  51. package/fesm2022/ngwr-card.mjs +10 -10
  52. package/fesm2022/ngwr-card.mjs.map +1 -1
  53. package/fesm2022/ngwr-carousel-testing.mjs +377 -0
  54. package/fesm2022/ngwr-carousel-testing.mjs.map +1 -0
  55. package/fesm2022/ngwr-carousel.mjs +72 -18
  56. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  57. package/fesm2022/ngwr-cascader-testing.mjs +534 -0
  58. package/fesm2022/ngwr-cascader-testing.mjs.map +1 -0
  59. package/fesm2022/ngwr-cascader.mjs +4 -4
  60. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  61. package/fesm2022/ngwr-checkbox-testing.mjs +90 -0
  62. package/fesm2022/ngwr-checkbox-testing.mjs.map +1 -0
  63. package/fesm2022/ngwr-checkbox.mjs +15 -9
  64. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  65. package/fesm2022/ngwr-circular-text.mjs +4 -4
  66. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  67. package/fesm2022/ngwr-click-spark.mjs +4 -4
  68. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  69. package/fesm2022/ngwr-clipboard.mjs +18 -4
  70. package/fesm2022/ngwr-clipboard.mjs.map +1 -1
  71. package/fesm2022/ngwr-collapse-testing.mjs +368 -0
  72. package/fesm2022/ngwr-collapse-testing.mjs.map +1 -0
  73. package/fesm2022/ngwr-collapse.mjs +9 -9
  74. package/fesm2022/ngwr-color-picker.mjs +139 -19
  75. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  76. package/fesm2022/ngwr-command-palette-testing.mjs +589 -0
  77. package/fesm2022/ngwr-command-palette-testing.mjs.map +1 -0
  78. package/fesm2022/ngwr-command-palette.mjs +60 -10
  79. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  80. package/fesm2022/ngwr-compare.mjs +105 -15
  81. package/fesm2022/ngwr-compare.mjs.map +1 -1
  82. package/fesm2022/ngwr-confetti.mjs +3 -3
  83. package/fesm2022/ngwr-config.mjs +106 -0
  84. package/fesm2022/ngwr-config.mjs.map +1 -0
  85. package/fesm2022/ngwr-context-menu-testing.mjs +631 -0
  86. package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -0
  87. package/fesm2022/ngwr-context-menu.mjs +104 -18
  88. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  89. package/fesm2022/ngwr-cookie.mjs +8 -4
  90. package/fesm2022/ngwr-cookie.mjs.map +1 -1
  91. package/fesm2022/ngwr-counter.mjs +17 -9
  92. package/fesm2022/ngwr-counter.mjs.map +1 -1
  93. package/fesm2022/ngwr-date-adapter-fns.mjs +3 -3
  94. package/fesm2022/ngwr-date-adapter-luxon.mjs +55 -7
  95. package/fesm2022/ngwr-date-adapter-luxon.mjs.map +1 -1
  96. package/fesm2022/ngwr-date-adapter.mjs +57 -11
  97. package/fesm2022/ngwr-date-adapter.mjs.map +1 -1
  98. package/fesm2022/ngwr-date-picker-testing.mjs +766 -0
  99. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -0
  100. package/fesm2022/ngwr-date-picker.mjs +409 -57
  101. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  102. package/fesm2022/ngwr-decrypt-text.mjs +30 -12
  103. package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
  104. package/fesm2022/ngwr-density.mjs +6 -6
  105. package/fesm2022/ngwr-descriptions.mjs +6 -6
  106. package/fesm2022/ngwr-dialog-testing.mjs +89 -0
  107. package/fesm2022/ngwr-dialog-testing.mjs.map +1 -0
  108. package/fesm2022/ngwr-dialog.mjs +33 -17
  109. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  110. package/fesm2022/ngwr-directives.mjs +48 -24
  111. package/fesm2022/ngwr-directives.mjs.map +1 -1
  112. package/fesm2022/ngwr-divider.mjs +3 -3
  113. package/fesm2022/ngwr-donut-chart.mjs +24 -7
  114. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  115. package/fesm2022/ngwr-drag-drop.mjs +7 -7
  116. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  117. package/fesm2022/ngwr-drawer-testing.mjs +250 -0
  118. package/fesm2022/ngwr-drawer-testing.mjs.map +1 -0
  119. package/fesm2022/ngwr-drawer.mjs +37 -19
  120. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  121. package/fesm2022/ngwr-dropdown-testing.mjs +291 -0
  122. package/fesm2022/ngwr-dropdown-testing.mjs.map +1 -0
  123. package/fesm2022/ngwr-dropdown.mjs +19 -11
  124. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  125. package/fesm2022/ngwr-empty.mjs +26 -9
  126. package/fesm2022/ngwr-empty.mjs.map +1 -1
  127. package/fesm2022/ngwr-event-calendar.mjs +62 -15
  128. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  129. package/fesm2022/ngwr-falling-text.mjs +4 -4
  130. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  131. package/fesm2022/ngwr-file-upload-testing.mjs +332 -0
  132. package/fesm2022/ngwr-file-upload-testing.mjs.map +1 -0
  133. package/fesm2022/ngwr-file-upload.mjs +3 -3
  134. package/fesm2022/ngwr-form-testing.mjs +451 -0
  135. package/fesm2022/ngwr-form-testing.mjs.map +1 -0
  136. package/fesm2022/ngwr-form.mjs +28 -12
  137. package/fesm2022/ngwr-form.mjs.map +1 -1
  138. package/fesm2022/ngwr-fuzzy-text.mjs +11 -4
  139. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  140. package/fesm2022/ngwr-gauge.mjs +21 -7
  141. package/fesm2022/ngwr-gauge.mjs.map +1 -1
  142. package/fesm2022/ngwr-glitch-text.mjs +4 -4
  143. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  144. package/fesm2022/ngwr-gradient-text.mjs +4 -4
  145. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  146. package/fesm2022/ngwr-hotkey.mjs +31 -10
  147. package/fesm2022/ngwr-hotkey.mjs.map +1 -1
  148. package/fesm2022/ngwr-i18n-en.mjs +61 -0
  149. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  150. package/fesm2022/ngwr-i18n-ru.mjs +59 -0
  151. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  152. package/fesm2022/ngwr-i18n.mjs +9 -9
  153. package/fesm2022/ngwr-icon.mjs +6 -6
  154. package/fesm2022/ngwr-image-cropper.mjs +26 -3
  155. package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
  156. package/fesm2022/ngwr-input-number-testing.mjs +306 -0
  157. package/fesm2022/ngwr-input-number-testing.mjs.map +1 -0
  158. package/fesm2022/ngwr-input-number.mjs +37 -5
  159. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  160. package/fesm2022/ngwr-input-otp-testing.mjs +419 -0
  161. package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -0
  162. package/fesm2022/ngwr-input-otp.mjs +39 -8
  163. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  164. package/fesm2022/ngwr-input-testing.mjs +102 -0
  165. package/fesm2022/ngwr-input-testing.mjs.map +1 -0
  166. package/fesm2022/ngwr-input.mjs +62 -25
  167. package/fesm2022/ngwr-input.mjs.map +1 -1
  168. package/fesm2022/ngwr-keyboard.mjs +3 -3
  169. package/fesm2022/ngwr-knob.mjs +46 -10
  170. package/fesm2022/ngwr-knob.mjs.map +1 -1
  171. package/fesm2022/ngwr-layout.mjs +36 -20
  172. package/fesm2022/ngwr-layout.mjs.map +1 -1
  173. package/fesm2022/ngwr-lightbox.mjs +35 -8
  174. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  175. package/fesm2022/ngwr-line-chart.mjs +19 -6
  176. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  177. package/fesm2022/ngwr-list.mjs +14 -9
  178. package/fesm2022/ngwr-list.mjs.map +1 -1
  179. package/fesm2022/ngwr-loading-bar.mjs +71 -31
  180. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  181. package/fesm2022/ngwr-markdown-testing.mjs +516 -0
  182. package/fesm2022/ngwr-markdown-testing.mjs.map +1 -0
  183. package/fesm2022/ngwr-markdown.mjs +1492 -0
  184. package/fesm2022/ngwr-markdown.mjs.map +1 -0
  185. package/fesm2022/ngwr-marquee.mjs +19 -8
  186. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  187. package/fesm2022/ngwr-media.mjs +3 -3
  188. package/fesm2022/ngwr-mention-testing.mjs +513 -0
  189. package/fesm2022/ngwr-mention-testing.mjs.map +1 -0
  190. package/fesm2022/ngwr-mention.mjs +16 -7
  191. package/fesm2022/ngwr-mention.mjs.map +1 -1
  192. package/fesm2022/ngwr-meta.mjs +28 -13
  193. package/fesm2022/ngwr-meta.mjs.map +1 -1
  194. package/fesm2022/ngwr-meter-group.mjs +22 -8
  195. package/fesm2022/ngwr-meter-group.mjs.map +1 -1
  196. package/fesm2022/ngwr-overlay.mjs +57 -8
  197. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  198. package/fesm2022/ngwr-page-header.mjs +3 -3
  199. package/fesm2022/ngwr-pagination-testing.mjs +389 -0
  200. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -0
  201. package/fesm2022/ngwr-pagination.mjs +27 -11
  202. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  203. package/fesm2022/ngwr-pipes.mjs +21 -21
  204. package/fesm2022/ngwr-platform.mjs +9 -9
  205. package/fesm2022/ngwr-popconfirm-testing.mjs +309 -0
  206. package/fesm2022/ngwr-popconfirm-testing.mjs.map +1 -0
  207. package/fesm2022/ngwr-popconfirm.mjs +99 -21
  208. package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
  209. package/fesm2022/ngwr-popover-testing.mjs +316 -0
  210. package/fesm2022/ngwr-popover-testing.mjs.map +1 -0
  211. package/fesm2022/ngwr-popover.mjs +48 -10
  212. package/fesm2022/ngwr-popover.mjs.map +1 -1
  213. package/fesm2022/ngwr-progress.mjs +3 -3
  214. package/fesm2022/ngwr-pull-to-refresh.mjs +19 -4
  215. package/fesm2022/ngwr-pull-to-refresh.mjs.map +1 -1
  216. package/fesm2022/ngwr-qr.mjs +15 -5
  217. package/fesm2022/ngwr-qr.mjs.map +1 -1
  218. package/fesm2022/ngwr-radio-testing.mjs +392 -0
  219. package/fesm2022/ngwr-radio-testing.mjs.map +1 -0
  220. package/fesm2022/ngwr-radio.mjs +16 -9
  221. package/fesm2022/ngwr-radio.mjs.map +1 -1
  222. package/fesm2022/ngwr-rating-testing.mjs +384 -0
  223. package/fesm2022/ngwr-rating-testing.mjs.map +1 -0
  224. package/fesm2022/ngwr-rating.mjs +40 -5
  225. package/fesm2022/ngwr-rating.mjs.map +1 -1
  226. package/fesm2022/ngwr-result.mjs +12 -12
  227. package/fesm2022/ngwr-rotating-text.mjs +3 -3
  228. package/fesm2022/ngwr-scroll.mjs +3 -3
  229. package/fesm2022/ngwr-segmented-testing.mjs +512 -0
  230. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -0
  231. package/fesm2022/ngwr-segmented.mjs +3 -3
  232. package/fesm2022/ngwr-select-testing.mjs +268 -0
  233. package/fesm2022/ngwr-select-testing.mjs.map +1 -0
  234. package/fesm2022/ngwr-select.mjs +96 -25
  235. package/fesm2022/ngwr-select.mjs.map +1 -1
  236. package/fesm2022/ngwr-shiny-text.mjs +7 -7
  237. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  238. package/fesm2022/ngwr-sidebar.mjs +67 -14
  239. package/fesm2022/ngwr-sidebar.mjs.map +1 -1
  240. package/fesm2022/ngwr-skeleton.mjs +3 -3
  241. package/fesm2022/ngwr-slider-testing.mjs +478 -0
  242. package/fesm2022/ngwr-slider-testing.mjs.map +1 -0
  243. package/fesm2022/ngwr-slider.mjs +59 -15
  244. package/fesm2022/ngwr-slider.mjs.map +1 -1
  245. package/fesm2022/ngwr-sparkline.mjs +28 -8
  246. package/fesm2022/ngwr-sparkline.mjs.map +1 -1
  247. package/fesm2022/ngwr-speed-dial.mjs +39 -6
  248. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  249. package/fesm2022/ngwr-spinner.mjs +14 -5
  250. package/fesm2022/ngwr-spinner.mjs.map +1 -1
  251. package/fesm2022/ngwr-splash-cursor.mjs +4 -4
  252. package/fesm2022/ngwr-splash-cursor.mjs.map +1 -1
  253. package/fesm2022/ngwr-split-text.mjs +4 -4
  254. package/fesm2022/ngwr-split-text.mjs.map +1 -1
  255. package/fesm2022/ngwr-splitter.mjs +72 -11
  256. package/fesm2022/ngwr-splitter.mjs.map +1 -1
  257. package/fesm2022/ngwr-spotlight-card.mjs +7 -7
  258. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  259. package/fesm2022/ngwr-squircle.mjs +6 -6
  260. package/fesm2022/ngwr-star-border.mjs +4 -4
  261. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  262. package/fesm2022/ngwr-statistic.mjs +33 -16
  263. package/fesm2022/ngwr-statistic.mjs.map +1 -1
  264. package/fesm2022/ngwr-stepper-testing.mjs +477 -0
  265. package/fesm2022/ngwr-stepper-testing.mjs.map +1 -0
  266. package/fesm2022/ngwr-stepper.mjs +6 -6
  267. package/fesm2022/ngwr-storage.mjs +27 -17
  268. package/fesm2022/ngwr-storage.mjs.map +1 -1
  269. package/fesm2022/ngwr-switch-testing.mjs +77 -0
  270. package/fesm2022/ngwr-switch-testing.mjs.map +1 -0
  271. package/fesm2022/ngwr-switch.mjs +12 -6
  272. package/fesm2022/ngwr-switch.mjs.map +1 -1
  273. package/fesm2022/ngwr-table-testing.mjs +580 -0
  274. package/fesm2022/ngwr-table-testing.mjs.map +1 -0
  275. package/fesm2022/ngwr-table.mjs +105 -44
  276. package/fesm2022/ngwr-table.mjs.map +1 -1
  277. package/fesm2022/ngwr-tabs-testing.mjs +617 -0
  278. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -0
  279. package/fesm2022/ngwr-tabs.mjs +44 -12
  280. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  281. package/fesm2022/ngwr-textarea-testing.mjs +238 -0
  282. package/fesm2022/ngwr-textarea-testing.mjs.map +1 -0
  283. package/fesm2022/ngwr-textarea.mjs +35 -7
  284. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  285. package/fesm2022/ngwr-theme.mjs +3 -3
  286. package/fesm2022/ngwr-tilt-card.mjs +7 -7
  287. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  288. package/fesm2022/ngwr-timeline.mjs +6 -6
  289. package/fesm2022/ngwr-toast-testing.mjs +101 -0
  290. package/fesm2022/ngwr-toast-testing.mjs.map +1 -0
  291. package/fesm2022/ngwr-toast.mjs +55 -21
  292. package/fesm2022/ngwr-toast.mjs.map +1 -1
  293. package/fesm2022/ngwr-toolbar.mjs +3 -3
  294. package/fesm2022/ngwr-tour.mjs +67 -15
  295. package/fesm2022/ngwr-tour.mjs.map +1 -1
  296. package/fesm2022/ngwr-transfer-testing.mjs +538 -0
  297. package/fesm2022/ngwr-transfer-testing.mjs.map +1 -0
  298. package/fesm2022/ngwr-transfer.mjs +47 -16
  299. package/fesm2022/ngwr-transfer.mjs.map +1 -1
  300. package/fesm2022/ngwr-tree-testing.mjs +734 -0
  301. package/fesm2022/ngwr-tree-testing.mjs.map +1 -0
  302. package/fesm2022/ngwr-tree.mjs +75 -9
  303. package/fesm2022/ngwr-tree.mjs.map +1 -1
  304. package/fesm2022/ngwr-typewriter.mjs +7 -5
  305. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  306. package/fesm2022/ngwr-typography.mjs +3 -3
  307. package/fesm2022/ngwr-version.mjs +1 -1
  308. package/fesm2022/ngwr-version.mjs.map +1 -1
  309. package/fesm2022/ngwr-virtual-scroll.mjs +33 -7
  310. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  311. package/fesm2022/ngwr-waves.mjs +5 -5
  312. package/fesm2022/ngwr-waves.mjs.map +1 -1
  313. package/fesm2022/ngwr-window.mjs +88 -18
  314. package/fesm2022/ngwr-window.mjs.map +1 -1
  315. package/gauge/styles/_index.scss +1 -1
  316. package/glitch-text/styles/_index.scss +4 -0
  317. package/i18n/en.json +56 -0
  318. package/i18n/ru.json +56 -0
  319. package/image-cropper/styles/_index.scss +13 -1
  320. package/input/styles/_index.scss +2 -2
  321. package/input-number/styles/_index.scss +7 -2
  322. package/knob/styles/_index.scss +8 -1
  323. package/layout/styles/_index.scss +3 -3
  324. package/lightbox/styles/_index.scss +10 -2
  325. package/line-chart/styles/_index.scss +6 -0
  326. package/llms-full.txt +151 -4
  327. package/llms.txt +57 -8
  328. package/loading-bar/styles/_index.scss +1 -2
  329. package/markdown/styles/_index.scss +296 -0
  330. package/marquee/styles/_index.scss +12 -0
  331. package/mcp/api.js +512 -0
  332. package/mcp/catalog.js +157 -0
  333. package/mcp/server.js +273 -0
  334. package/mcp/tools.js +366 -0
  335. package/meter-group/styles/_index.scss +1 -1
  336. package/package.json +186 -35
  337. package/pagination/styles/_index.scss +6 -6
  338. package/popover/styles/_index.scss +37 -5
  339. package/rating/styles/_index.scss +10 -0
  340. package/schematics/use/symbol-map.json +2 -0
  341. package/segmented/styles/_index.scss +7 -0
  342. package/select/styles/_index.scss +29 -9
  343. package/sidebar/styles/_index.scss +30 -5
  344. package/slider/styles/_index.scss +15 -0
  345. package/speed-dial/styles/_index.scss +20 -0
  346. package/split-text/styles/_index.scss +13 -0
  347. package/star-border/styles/_index.scss +2 -0
  348. package/stepper/styles/_index.scss +1 -1
  349. package/styles/_grid.scss +4 -4
  350. package/styles.scss +1 -0
  351. package/switch/styles/_index.scss +5 -3
  352. package/table/styles/_index.scss +22 -11
  353. package/tabs/styles/_index.scss +11 -1
  354. package/textarea/styles/_index.scss +5 -0
  355. package/theme/styles/_colors.scss +29 -13
  356. package/theme/styles/_dark.scss +11 -3
  357. package/theme/styles/_mixins.scss +3 -0
  358. package/timeline/styles/_index.scss +2 -2
  359. package/toast/styles/_index.scss +17 -8
  360. package/toolbar/styles/_index.scss +3 -3
  361. package/tour/styles/_index.scss +7 -1
  362. package/tree/styles/_index.scss +5 -3
  363. package/types/ngwr-action-sheet.d.ts +9 -1
  364. package/types/ngwr-affix.d.ts +7 -1
  365. package/types/ngwr-anchor.d.ts +8 -1
  366. package/types/ngwr-avatar.d.ts +13 -3
  367. package/types/ngwr-bar-chart.d.ts +16 -0
  368. package/types/ngwr-burger.d.ts +6 -2
  369. package/types/ngwr-button-testing.d.ts +85 -0
  370. package/types/ngwr-button.d.ts +58 -10
  371. package/types/ngwr-calendar-heatmap.d.ts +16 -2
  372. package/types/ngwr-calendar.d.ts +37 -1
  373. package/types/ngwr-carousel-testing.d.ts +257 -0
  374. package/types/ngwr-carousel.d.ts +20 -4
  375. package/types/ngwr-cascader-testing.d.ts +392 -0
  376. package/types/ngwr-checkbox-testing.d.ts +77 -0
  377. package/types/ngwr-checkbox.d.ts +7 -2
  378. package/types/ngwr-clipboard.d.ts +8 -1
  379. package/types/ngwr-collapse-testing.d.ts +290 -0
  380. package/types/ngwr-color-picker.d.ts +20 -11
  381. package/types/ngwr-command-palette-testing.d.ts +437 -0
  382. package/types/ngwr-command-palette.d.ts +25 -2
  383. package/types/ngwr-compare.d.ts +50 -2
  384. package/types/ngwr-config.d.ts +176 -0
  385. package/types/ngwr-context-menu-testing.d.ts +401 -0
  386. package/types/ngwr-context-menu.d.ts +65 -17
  387. package/types/ngwr-counter.d.ts +6 -1
  388. package/types/ngwr-date-adapter-luxon.d.ts +26 -0
  389. package/types/ngwr-date-picker-testing.d.ts +518 -0
  390. package/types/ngwr-date-picker.d.ts +128 -8
  391. package/types/ngwr-dialog-testing.d.ts +79 -0
  392. package/types/ngwr-dialog.d.ts +13 -0
  393. package/types/ngwr-directives.d.ts +10 -1
  394. package/types/ngwr-donut-chart.d.ts +8 -1
  395. package/types/ngwr-drawer-testing.d.ts +196 -0
  396. package/types/ngwr-drawer.d.ts +15 -0
  397. package/types/ngwr-dropdown-testing.d.ts +202 -0
  398. package/types/ngwr-dropdown.d.ts +7 -1
  399. package/types/ngwr-empty.d.ts +19 -4
  400. package/types/ngwr-event-calendar.d.ts +26 -1
  401. package/types/ngwr-file-upload-testing.d.ts +194 -0
  402. package/types/ngwr-form-testing.d.ts +379 -0
  403. package/types/ngwr-form.d.ts +17 -0
  404. package/types/ngwr-gauge.d.ts +13 -1
  405. package/types/ngwr-hotkey.d.ts +2 -0
  406. package/types/ngwr-image-cropper.d.ts +10 -0
  407. package/types/ngwr-input-number-testing.d.ts +226 -0
  408. package/types/ngwr-input-number.d.ts +29 -1
  409. package/types/ngwr-input-otp-testing.d.ts +299 -0
  410. package/types/ngwr-input-otp.d.ts +23 -2
  411. package/types/ngwr-input-testing.d.ts +84 -0
  412. package/types/ngwr-input.d.ts +20 -6
  413. package/types/ngwr-knob.d.ts +18 -0
  414. package/types/ngwr-layout.d.ts +1 -0
  415. package/types/ngwr-lightbox.d.ts +17 -3
  416. package/types/ngwr-line-chart.d.ts +9 -2
  417. package/types/ngwr-list.d.ts +7 -2
  418. package/types/ngwr-loading-bar.d.ts +4 -7
  419. package/types/ngwr-markdown-testing.d.ts +462 -0
  420. package/types/ngwr-markdown.d.ts +534 -0
  421. package/types/ngwr-marquee.d.ts +12 -2
  422. package/types/ngwr-mention-testing.d.ts +359 -0
  423. package/types/ngwr-meta.d.ts +4 -2
  424. package/types/ngwr-meter-group.d.ts +11 -1
  425. package/types/ngwr-overlay.d.ts +33 -2
  426. package/types/ngwr-pagination-testing.d.ts +291 -0
  427. package/types/ngwr-pagination.d.ts +7 -1
  428. package/types/ngwr-popconfirm-testing.d.ts +235 -0
  429. package/types/ngwr-popconfirm.d.ts +31 -21
  430. package/types/ngwr-popover-testing.d.ts +221 -0
  431. package/types/ngwr-popover.d.ts +19 -2
  432. package/types/ngwr-pull-to-refresh.d.ts +7 -0
  433. package/types/ngwr-qr.d.ts +9 -1
  434. package/types/ngwr-radio-testing.d.ts +296 -0
  435. package/types/ngwr-radio.d.ts +8 -2
  436. package/types/ngwr-rating-testing.d.ts +291 -0
  437. package/types/ngwr-rating.d.ts +23 -0
  438. package/types/ngwr-segmented-testing.d.ts +401 -0
  439. package/types/ngwr-select-testing.d.ts +175 -0
  440. package/types/ngwr-select.d.ts +45 -4
  441. package/types/ngwr-sidebar.d.ts +17 -2
  442. package/types/ngwr-slider-testing.d.ts +329 -0
  443. package/types/ngwr-slider.d.ts +35 -1
  444. package/types/ngwr-sparkline.d.ts +12 -2
  445. package/types/ngwr-speed-dial.d.ts +17 -18
  446. package/types/ngwr-spinner.d.ts +8 -1
  447. package/types/ngwr-splitter.d.ts +24 -1
  448. package/types/ngwr-statistic.d.ts +12 -2
  449. package/types/ngwr-stepper-testing.d.ts +346 -0
  450. package/types/ngwr-storage.d.ts +10 -1
  451. package/types/ngwr-switch-testing.d.ts +66 -0
  452. package/types/ngwr-switch.d.ts +7 -2
  453. package/types/ngwr-table-testing.d.ts +423 -0
  454. package/types/ngwr-table.d.ts +42 -0
  455. package/types/ngwr-tabs-testing.d.ts +470 -0
  456. package/types/ngwr-tabs.d.ts +9 -0
  457. package/types/ngwr-textarea-testing.d.ts +184 -0
  458. package/types/ngwr-textarea.d.ts +7 -2
  459. package/types/ngwr-toast-testing.d.ts +80 -0
  460. package/types/ngwr-toast.d.ts +19 -4
  461. package/types/ngwr-tour.d.ts +27 -0
  462. package/types/ngwr-transfer-testing.d.ts +444 -0
  463. package/types/ngwr-transfer.d.ts +16 -1
  464. package/types/ngwr-tree-testing.d.ts +501 -0
  465. package/types/ngwr-tree.d.ts +33 -0
  466. package/types/ngwr-version.d.ts +1 -1
  467. package/types/ngwr-virtual-scroll.d.ts +13 -1
  468. package/types/ngwr-window.d.ts +23 -2
  469. package/typewriter/styles/_index.scss +1 -1
  470. package/typography/styles/_index.scss +1 -1
  471. package/window/styles/_index.scss +32 -9
@@ -21,7 +21,15 @@ interface WrTransferItem<TValue = unknown> {
21
21
  /** A pane's rows plus the header state derived from them. */
22
22
  interface PaneState {
23
23
  readonly rows: readonly WrTransferItem[];
24
+ /**
25
+ * The staged values this pane is actually SHOWING — visible and enabled. The
26
+ * staging signals can hold more than that (a filter change hides rows without
27
+ * unstaging them), and every consumer of the staged set has to agree on which
28
+ * one it means: the count, the header checkbox and the move all read this.
29
+ */
30
+ readonly checked: readonly unknown[];
24
31
  readonly checkedCount: number;
32
+ readonly enabledCount: number;
25
33
  readonly allChecked: boolean;
26
34
  readonly someChecked: boolean;
27
35
  }
@@ -76,6 +84,11 @@ declare class WrTransfer implements FormValueControl<readonly unknown[]> {
76
84
  readonly searchPlaceholder: _angular_core.InputSignal<string | null>;
77
85
  /** Shown in a pane with no rows. Falls back to `transfer.empty`. */
78
86
  readonly emptyText: _angular_core.InputSignal<string | null>;
87
+ /**
88
+ * Accessible name of each pane's select-all checkbox, composed with the pane
89
+ * heading. Falls back to `transfer.selectAll`.
90
+ */
91
+ readonly selectAllLabel: _angular_core.InputSignal<string | null>;
79
92
  /** Accessible name of the move-right button. Falls back to `transfer.toTarget`. */
80
93
  readonly toTargetLabel: _angular_core.InputSignal<string | null>;
81
94
  /** Accessible name of the move-left button. Falls back to `transfer.toSource`. */
@@ -84,6 +97,7 @@ declare class WrTransfer implements FormValueControl<readonly unknown[]> {
84
97
  protected readonly resolvedTargetTitle: _angular_core.Signal<string>;
85
98
  protected readonly resolvedSearch: _angular_core.Signal<string>;
86
99
  protected readonly resolvedEmpty: _angular_core.Signal<string>;
100
+ protected readonly resolvedSelectAll: _angular_core.Signal<string>;
87
101
  protected readonly resolvedToTarget: _angular_core.Signal<string>;
88
102
  protected readonly resolvedToSource: _angular_core.Signal<string>;
89
103
  /** `{{checked}} / {{total}}` under each heading. @internal */
@@ -95,6 +109,7 @@ declare class WrTransfer implements FormValueControl<readonly unknown[]> {
95
109
  /** Staged rows, per pane. Cleared as soon as a move commits them. */
96
110
  private readonly sourceChecked;
97
111
  private readonly targetChecked;
112
+ private readonly selected;
98
113
  private readonly valueSet;
99
114
  protected readonly source: _angular_core.Signal<PaneState>;
100
115
  protected readonly target: _angular_core.Signal<PaneState>;
@@ -111,7 +126,7 @@ declare class WrTransfer implements FormValueControl<readonly unknown[]> {
111
126
  /** Filter, then derive the header state from what survived. */
112
127
  private pane;
113
128
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrTransfer, never>;
114
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTransfer, "wr-transfer", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "sourceTitle": { "alias": "sourceTitle"; "required": false; "isSignal": true; }; "targetTitle": { "alias": "targetTitle"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "toTargetLabel": { "alias": "toTargetLabel"; "required": false; "isSignal": true; }; "toSourceLabel": { "alias": "toSourceLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
129
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTransfer, "wr-transfer", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "sourceTitle": { "alias": "sourceTitle"; "required": false; "isSignal": true; }; "targetTitle": { "alias": "targetTitle"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "selectAllLabel": { "alias": "selectAllLabel"; "required": false; "isSignal": true; }; "toTargetLabel": { "alias": "toTargetLabel"; "required": false; "isSignal": true; }; "toSourceLabel": { "alias": "toSourceLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
115
130
  }
116
131
 
117
132
  export { WrTransfer };
@@ -0,0 +1,501 @@
1
+ import { BaseHarnessFilters, ComponentHarness, HarnessPredicate, ContentContainerComponentHarness, HarnessLoader } from '@angular/cdk/testing';
2
+
3
+ /**
4
+ * @license
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
8
+ */
9
+
10
+ /** Narrows which `<wr-tree>` a harness query matches. */
11
+ interface WrTreeHarnessFilters extends BaseHarnessFilters {
12
+ /**
13
+ * Match the trigger's selection text — the selected label, or the chip labels joined
14
+ * by `', '` (without the `+N more` count a `maxTagCount` adds); `''` while the
15
+ * placeholder is showing. A string is an exact match, a RegExp is tested. Only an
16
+ * `openOn="overlay"` tree has a trigger; an inline one never matches.
17
+ */
18
+ readonly text?: string | RegExp;
19
+ /**
20
+ * Match a tree that is SHOWING a node with this label — the readable way to tell
21
+ * two trees apart when neither has a trigger. A node inside a collapsed branch is
22
+ * not rendered and does not count, and neither does anything in an overlay tree
23
+ * whose panel is closed.
24
+ */
25
+ readonly nodeLabel?: string | RegExp;
26
+ /** Match only enabled (`false`) or only disabled (`true`) trees. */
27
+ readonly disabled?: boolean;
28
+ /**
29
+ * Match only open (`true`) or only closed (`false`) trees. An inline tree is
30
+ * always open — its rows are part of the host — so it only matches `true`.
31
+ */
32
+ readonly open?: boolean;
33
+ }
34
+ /** Narrows which node inside a tree a harness query matches. */
35
+ interface WrTreeNodeHarnessFilters extends BaseHarnessFilters {
36
+ /** Match the node's label — a string is an exact match, a RegExp is tested. */
37
+ readonly label?: string | RegExp;
38
+ /** Match only selected (`true`) or only unselected (`false`) nodes. */
39
+ readonly selected?: boolean;
40
+ /**
41
+ * Match only enabled (`false`) or only disabled (`true`) nodes. Every node of a
42
+ * disabled TREE is disabled, so `false` matches nothing there.
43
+ */
44
+ readonly disabled?: boolean;
45
+ /**
46
+ * Match only open (`true`) or only closed (`false`) BRANCHES. A leaf announces no
47
+ * expanded state at all and matches neither — which is what makes
48
+ * `{ expanded: false }` mean "a branch waiting to be opened" rather than "every
49
+ * row that is not open".
50
+ */
51
+ readonly expanded?: boolean;
52
+ /** Match the node's 1-based `aria-level`, i.e. its depth in the tree. */
53
+ readonly level?: number;
54
+ }
55
+
56
+ /**
57
+ * @license
58
+ *
59
+ * Use of this source code is governed by an MIT-style license that can be
60
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
61
+ */
62
+
63
+ /**
64
+ * Test harness for one node of a `<wr-tree>` — a `role="treeitem"` row.
65
+ *
66
+ * Everything about a tree's shape that a screen reader gets lives on these rows:
67
+ * the list itself is FLAT, with no `role="group"` and no nesting, so `aria-level`,
68
+ * `aria-posinset` and `aria-setsize` are the only place the hierarchy exists. The
69
+ * indent is decoration.
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * const src = await tree.getNode({ label: 'src' });
74
+ *
75
+ * await src.expand();
76
+ * expect(await src.getLevel()).toBe(1);
77
+ * ```
78
+ *
79
+ * @see https://ngwr.dev/guides/testing
80
+ */
81
+ declare class WrTreeNodeHarness extends ComponentHarness {
82
+ /**
83
+ * The row, and nothing else the list can hold.
84
+ *
85
+ * A windowed tree pads its list with `<li class="wr-tree__spacer" role="presentation">`
86
+ * at each end, so `li` would hand back up to two "nodes" with no label and no
87
+ * state. `[role="treeitem"]` selects exactly the same set as this class.
88
+ */
89
+ static hostSelector: string;
90
+ /** Build a predicate that narrows the query. */
91
+ static with(options?: WrTreeNodeHarnessFilters): HarnessPredicate<WrTreeNodeHarness>;
92
+ /**
93
+ * The node's label.
94
+ *
95
+ * Read from `.wr-tree__label` rather than from the row's text, so the answer stays
96
+ * the label alone however the row is decorated around it.
97
+ */
98
+ getLabel(): Promise<string>;
99
+ /** The node's 1-based depth, as the row announces it (`aria-level`). */
100
+ getLevel(): Promise<number>;
101
+ /**
102
+ * The node's 1-based position within its SIBLING GROUP (`aria-posinset`) — not its
103
+ * position in the flat list of visible rows.
104
+ *
105
+ * `src`'s first child is `posinset` 1 even though it is the second row on screen.
106
+ * That is what ARIA asks for, and the whole reason the attribute is needed here:
107
+ * the rendered list cannot express the nesting on its own.
108
+ */
109
+ getPosInSet(): Promise<number>;
110
+ /** How many nodes are in this node's sibling group, itself included (`aria-setsize`). */
111
+ getSetSize(): Promise<number>;
112
+ /**
113
+ * The node's index in the full list of VISIBLE nodes — every rendered row plus the
114
+ * ones a window left out, in the order the tree would show them.
115
+ *
116
+ * It is the index the tree's own keyboard code addresses rows by, and while the
117
+ * tree is windowed it is the only way to place a row: DOM order then says nothing,
118
+ * because the rows in the DOM are a slice.
119
+ */
120
+ getIndex(): Promise<number>;
121
+ /**
122
+ * The row's DOM id, or `null`.
123
+ *
124
+ * Only a windowed tree gives its rows ids, because that is the shape where the
125
+ * list keeps focus and names the cursor row with `aria-activedescendant` — the id
126
+ * exists to be pointed at.
127
+ */
128
+ getId(): Promise<string | null>;
129
+ /**
130
+ * Whether the node is a branch — it has children, whether or not they are showing.
131
+ *
132
+ * From `aria-expanded`: only a branch carries it, and a branch that does not is
133
+ * announced as a leaf, so the user never learns there is anything underneath. The
134
+ * toggle element cannot answer this — a leaf renders a `<span>` with the same
135
+ * `.wr-tree__toggle` class purely to hold the indent.
136
+ */
137
+ isExpandable(): Promise<boolean>;
138
+ /** Whether the branch is open. A leaf is never expanded. */
139
+ isExpanded(): Promise<boolean>;
140
+ /** Open the branch. Already-open branches are left alone; a leaf throws. */
141
+ expand(): Promise<void>;
142
+ /** Close the branch. Already-closed branches are left alone; a leaf throws. */
143
+ collapse(): Promise<void>;
144
+ /**
145
+ * Click the branch's expand toggle.
146
+ *
147
+ * Expanding is the TOGGLE's job and not the row's: a click anywhere else in the row
148
+ * selects instead, which is the one thing a spec driving this by hand tends to get
149
+ * wrong.
150
+ */
151
+ toggleExpand(): Promise<void>;
152
+ /**
153
+ * Whether the node is selected.
154
+ *
155
+ * From `aria-selected` rather than the `--selected` modifier: both are public, but
156
+ * the attribute is what a screen reader acts on, and a row that looks selected
157
+ * without saying so is the bug worth catching.
158
+ */
159
+ isSelected(): Promise<boolean>;
160
+ /**
161
+ * Whether the tree offers selection at all.
162
+ *
163
+ * A `selectionMode="none"` tree announces NO `aria-selected` on its rows, which is
164
+ * how an unselectable node differs from one that is merely unselected — the two
165
+ * look identical otherwise.
166
+ */
167
+ isSelectable(): Promise<boolean>;
168
+ /**
169
+ * Whether the node refuses interaction (`aria-disabled`).
170
+ *
171
+ * True for EVERY node while the whole tree is disabled, not just for the ones the
172
+ * data marks — the row announces the effective state, which is the one a user runs
173
+ * into.
174
+ */
175
+ isDisabled(): Promise<boolean>;
176
+ /**
177
+ * Whether the node is where the keyboard cursor sits.
178
+ *
179
+ * The two patterns publish the cursor differently, and this covers both: a tree
180
+ * that renders every row hands the single tab stop to the cursor row (roving
181
+ * tabindex), while a windowed one keeps focus on the list and marks the row with
182
+ * the `--active` modifier plus the list's `aria-activedescendant`.
183
+ * `WrTreeHarness.getActiveNodeLabel()` reads that reference itself.
184
+ */
185
+ isActive(): Promise<boolean>;
186
+ /**
187
+ * Whether the row holds real DOM focus.
188
+ *
189
+ * Deliberately separate from {@link isActive}: in a windowed tree the two DIVERGE
190
+ * by design — focus stays on the `role="tree"` list and only the announced cursor
191
+ * moves — so a spec asserting that a key press moved focus needs to know which of
192
+ * the two it is asking about.
193
+ */
194
+ isFocused(): Promise<boolean>;
195
+ /**
196
+ * Click the node — which SELECTS it. A disabled node, and any node of a
197
+ * `selectionMode="none"` tree, ignores the click.
198
+ *
199
+ * In multi mode a plain click REPLACES the selection rather than adding to it (the
200
+ * component's deliberate choice: one selected node clicked again clears it, and any
201
+ * other click starts over from that node). {@link ctrlClick} is how a selection is
202
+ * accumulated.
203
+ */
204
+ click(): Promise<void>;
205
+ /**
206
+ * Ctrl-click the node — ADDS it to the selection, or removes it, in multi mode.
207
+ *
208
+ * The component takes Cmd as well as Ctrl; the harness sends Ctrl because a unit
209
+ * test has no platform. In single mode it behaves exactly like {@link click}.
210
+ */
211
+ ctrlClick(): Promise<void>;
212
+ /** The branch's toggle button, or a failure that says this row is a leaf. */
213
+ private toggleElement;
214
+ /** A numeric attribute every row carries, or a failure that says the row is broken. */
215
+ private announcedNumber;
216
+ }
217
+
218
+ /**
219
+ * @license
220
+ *
221
+ * Use of this source code is governed by an MIT-style license that can be
222
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
223
+ */
224
+
225
+ /**
226
+ * Test harness for `<wr-tree>`, with {@link WrTreeNodeHarness} for one row.
227
+ *
228
+ * The component has two render shapes and this harness covers both:
229
+ * - `openOn="inline"` (default) — the rows live in the host, and the tree is always
230
+ * showing them.
231
+ * - `openOn="overlay"` — a `role="combobox"` trigger opens a panel that is a template
232
+ * portal in the shared overlay container, a sibling of the whole app. Nothing in it
233
+ * is a descendant of the host, so every row is read through the document root,
234
+ * SCOPED by the `aria-controls` id the trigger publishes — which is what keeps two
235
+ * trees on one page from answering with each other's nodes.
236
+ *
237
+ * A tree is data-driven and projects nothing, so the scoped loader exists to point the
238
+ * node queries at the right shape rather than to reach a consumer's own components: the
239
+ * inherited `getHarness(…)` resolves wherever THIS tree's rows are, and there is nothing
240
+ * else in there.
241
+ *
242
+ * Two things the harness cannot do, both jsdom rather than the component:
243
+ * - it never clicks a row by coordinate, and it drives the cursor with the KEYBOARD,
244
+ * which is the accessible path anyway. There is no layout in a unit test, so a
245
+ * hit test would answer with nothing.
246
+ * - it offers no SCROLL for a windowed tree. jsdom does remember a `scrollTop` write,
247
+ * but it fires no `scroll` event for it, so the tree — which learns its offset from
248
+ * that event — would not move until the caller also dispatched one and waited a
249
+ * frame: a scroll gesture that only works because the test faked the notification.
250
+ * The keyboard moves the window honestly instead — see {@link focusLast}. (jsdom has
251
+ * no `Element.scrollTo` at all, which the tree calls while windowed, so a spec for
252
+ * that shape has to stub it.)
253
+ *
254
+ * @example
255
+ * ```ts
256
+ * const tree = await loader.getHarness(WrTreeHarness);
257
+ *
258
+ * await (await tree.getNode({ label: 'src' })).expand();
259
+ * await tree.selectNode({ label: 'main.ts' });
260
+ *
261
+ * expect(await tree.getSelectedLabels()).toEqual(['main.ts']);
262
+ * ```
263
+ *
264
+ * @see https://ngwr.dev/guides/testing
265
+ */
266
+ declare class WrTreeHarness extends ContentContainerComponentHarness {
267
+ static hostSelector: string;
268
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
269
+ static with(options?: WrTreeHarnessFilters): HarnessPredicate<WrTreeHarness>;
270
+ /** Whether this tree is the combobox shape (`openOn="overlay"`) rather than inline. */
271
+ isOverlay(): Promise<boolean>;
272
+ /**
273
+ * Whether the rows are showing.
274
+ *
275
+ * From the trigger's `aria-expanded` rather than the `--open` modifier: both are
276
+ * public, but that attribute is the promise the combobox makes to a screen reader.
277
+ * An inline tree is always open — its rows are part of the host and there is
278
+ * nothing to open or close.
279
+ */
280
+ isOpen(): Promise<boolean>;
281
+ /**
282
+ * Open the panel. An already-open tree — and every inline one — is left alone.
283
+ *
284
+ * Note for a spec with two overlay trees: this clicks, and a click is an outside
285
+ * pointer event for every other open overlay, so it closes any panel already up.
286
+ * There is no second gesture to swap in: the trigger is opened by its `click`
287
+ * handler, and while a real keyboard user reaches that through a `<button>`'s native
288
+ * activation, a SYNTHETIC Enter / Space never produces a click — so a harness cannot
289
+ * open a panel any other way.
290
+ */
291
+ open(): Promise<void>;
292
+ /** Close the panel with Escape. An already-closed tree is left alone. */
293
+ close(): Promise<void>;
294
+ /**
295
+ * Whether the tree refuses interaction.
296
+ *
297
+ * The host modifier is the only answer both shapes carry: an inline tree has no
298
+ * control of its own to mark `disabled`, and a closed overlay tree has no rows to
299
+ * read `aria-disabled` from. The rows do announce it — see
300
+ * {@link WrTreeNodeHarness.isDisabled}.
301
+ */
302
+ isDisabled(): Promise<boolean>;
303
+ /**
304
+ * Whether the tree takes more than one selected node.
305
+ *
306
+ * From the list's `aria-multiselectable`, which is what a screen reader acts on. The
307
+ * list does not exist while an overlay panel is closed, so the host modifier answers
308
+ * then — it is only painted in the combobox shape, which is exactly the shape that
309
+ * can be asked while closed.
310
+ */
311
+ isMultiple(): Promise<boolean>;
312
+ /**
313
+ * How much the tree lets you select.
314
+ *
315
+ * `'none'` is not "nothing selected": it is a tree whose rows announce no
316
+ * `aria-selected` at all, and telling that from `'single'` needs a row — so an empty
317
+ * tree throws rather than guessing.
318
+ */
319
+ getSelectionMode(): Promise<'none' | 'single' | 'multi'>;
320
+ /**
321
+ * Whether the list is WINDOWED right now.
322
+ *
323
+ * Read from the list's modifier rather than from the input, and that is the point:
324
+ * `virtualScroll` only takes effect when there is something to window, so an empty
325
+ * tree renders the plain shape however the input is set.
326
+ */
327
+ isVirtual(): Promise<boolean>;
328
+ /**
329
+ * The role the list announces — `tree`.
330
+ *
331
+ * Worth asking: rendered without it, the rows are a bag of names, identical on
332
+ * screen and structureless to anyone not looking at it.
333
+ */
334
+ getRole(): Promise<string | null>;
335
+ /**
336
+ * What the trigger shows as the selection: the chip labels joined by `', '` in multi
337
+ * mode, the label in single mode, and `''` when nothing is selected (the placeholder
338
+ * is showing). The `+N more` chip a `maxTagCount` produces is NOT part of it — it is
339
+ * a count rather than a selection, and {@link getOverflowText} reads it. Inline trees
340
+ * have no trigger and throw.
341
+ */
342
+ getValueText(): Promise<string>;
343
+ /** The placeholder, or `null` when a selection is hiding it. */
344
+ getPlaceholder(): Promise<string | null>;
345
+ /**
346
+ * The chip labels on the trigger, in order (multi mode).
347
+ *
348
+ * The `+N more` overflow chip is not one of them — it is a count, not a selection.
349
+ * {@link getOverflowText} reads it.
350
+ */
351
+ getChipLabels(): Promise<string[]>;
352
+ /**
353
+ * The `+N more` chip's text, or `null` when every selected node has a chip of its
354
+ * own. Only a `maxTagCount` below the number selected produces one.
355
+ */
356
+ getOverflowText(): Promise<string | null>;
357
+ /** Remove one chip by its label. */
358
+ removeChip(label: string): Promise<void>;
359
+ /** Click the clear (×) control on the trigger. */
360
+ clear(): Promise<void>;
361
+ /**
362
+ * The nodes currently rendered, in the order they are shown.
363
+ *
364
+ * A collapsed branch's children are not rendered at all, so this is the VISIBLE
365
+ * tree — expand first to reach deeper.
366
+ *
367
+ * While {@link isVirtual} is true it is narrower still: the list holds only the
368
+ * window around the scroll offset — padded by a spacer at whichever end has rows
369
+ * outside it, so a window resting at the top has one and a window in the middle has
370
+ * two — and this returns the WINDOW, not the dataset. Nothing in the DOM carries a
371
+ * total —
372
+ * `aria-setsize` counts a SIBLING GROUP, not the flat list — so the harness cannot
373
+ * offer one; {@link WrTreeNodeHarness.getIndex} places each row in the full visible
374
+ * list, and the `[nodes]` data is where the total actually lives.
375
+ *
376
+ * Throws while an overlay panel is closed: the rows do not exist anywhere until it
377
+ * opens, and an empty array reads like a tree that rendered nothing.
378
+ */
379
+ getNodes(filters?: WrTreeNodeHarnessFilters): Promise<WrTreeNodeHarness[]>;
380
+ /** The labels of the nodes currently rendered, in order. */
381
+ getNodeLabels(): Promise<string[]>;
382
+ /** The first node matching the filters, or a failure that says what is showing. */
383
+ getNode(filters: WrTreeNodeHarnessFilters): Promise<WrTreeNodeHarness>;
384
+ /**
385
+ * Open the panel if needed, then select the first node matching the filters.
386
+ *
387
+ * `additive` ctrl-clicks instead, which is how a multi-mode selection is built up: a
388
+ * plain click there REPLACES the selection, by the component's own choice.
389
+ *
390
+ * Throws rather than clicking into the void on a disabled node or a
391
+ * `selectionMode="none"` tree — both ignore the click, and the silence turns into a
392
+ * confusing failure at the next assertion. Reach for `getNode().click()` when
393
+ * proving exactly that.
394
+ */
395
+ selectNode(filters: WrTreeNodeHarnessFilters, options?: {
396
+ additive?: boolean;
397
+ }): Promise<void>;
398
+ /**
399
+ * The labels of the selected nodes, in row order.
400
+ *
401
+ * Only among the rows that are RENDERED: a selected node inside a collapsed branch,
402
+ * or outside a window, is not here. The `[(selected)]` model is the whole set.
403
+ */
404
+ getSelectedLabels(): Promise<string[]>;
405
+ /**
406
+ * Open every branch, level by level — each pass reveals the next one down.
407
+ *
408
+ * Refuses on a windowed tree instead of half-doing it: only the window is rendered,
409
+ * so the branches outside it cannot be reached from the DOM at all. Write the
410
+ * `[(expanded)]` model there.
411
+ */
412
+ expandAll(): Promise<void>;
413
+ /**
414
+ * The label of the node the keyboard cursor is on, or `null`.
415
+ *
416
+ * Read the way the shape publishes it: a windowed tree keeps focus on the list and
417
+ * names the row with `aria-activedescendant` (which goes `null` while the cursor has
418
+ * been scrolled out of the window, so the reference never dangles at a row that was
419
+ * removed), while a plain one hands the single tab stop to the cursor row.
420
+ */
421
+ getActiveNodeLabel(): Promise<string | null>;
422
+ /** Move the cursor down one row — ArrowDown. Stops at the last row. */
423
+ focusNext(): Promise<void>;
424
+ /** Move the cursor up one row — ArrowUp. Stops at the first row. */
425
+ focusPrevious(): Promise<void>;
426
+ /** Move the cursor to the first row — Home. */
427
+ focusFirst(): Promise<void>;
428
+ /**
429
+ * Move the cursor to the last row — End.
430
+ *
431
+ * On a windowed tree this also moves the WINDOW: the tree writes its scroll offset
432
+ * synchronously so the row it is about to point at exists in the same change
433
+ * detection pass. It is the honest way to reach the far end of a window in a unit
434
+ * test — jsdom keeps a `scrollTop` write but never fires the `scroll` event the tree
435
+ * listens for, so a scroll gesture would move the window only for a test that also
436
+ * dispatched the notification itself.
437
+ */
438
+ focusLast(): Promise<void>;
439
+ /**
440
+ * ArrowRight on the cursor row — the APG's one key with two jobs: it OPENS a closed
441
+ * branch, and on an already-open one it steps into the first child. A leaf ignores
442
+ * it.
443
+ *
444
+ * These two send the PHYSICAL key, because that is what a keyboard has. Under
445
+ * `dir="rtl"` the tree follows the indent and swaps the pair, so a spec exercising
446
+ * an RTL tree opens with {@link collapseActive} and closes with this one. The
447
+ * names describe the LTR job, which is the one worth naming.
448
+ */
449
+ expandActive(): Promise<void>;
450
+ /**
451
+ * ArrowLeft on the cursor row — CLOSES an open branch, and on anything else steps
452
+ * out to the parent row. A root-level leaf ignores it.
453
+ *
454
+ * Physical, and mirrored by the component under `dir="rtl"` — see
455
+ * {@link expandActive}.
456
+ */
457
+ collapseActive(): Promise<void>;
458
+ /**
459
+ * Select the cursor row from the keyboard — Enter.
460
+ *
461
+ * `additive` holds Ctrl, the keyboard twin of {@link WrTreeNodeHarness.ctrlClick}:
462
+ * in multi mode a plain Enter replaces the selection, Ctrl-Enter adds to it. A
463
+ * disabled row is skipped by the component, silently — assert the model.
464
+ */
465
+ selectActive(options?: {
466
+ additive?: boolean;
467
+ }): Promise<void>;
468
+ /**
469
+ * The loader every node query runs through — the host inline, THIS tree's overlay
470
+ * panel otherwise.
471
+ *
472
+ * Scoped by the published panel id rather than by `.wr-tree-panel`: the overlay
473
+ * container is shared, so a bare class query would answer with whichever tree
474
+ * happened to open first.
475
+ */
476
+ protected getRootHarnessLoader(): Promise<HarnessLoader>;
477
+ /**
478
+ * Send a key to the `role="tree"` list.
479
+ *
480
+ * The list owns the keydown handler in both patterns — the roving-tabindex one
481
+ * focuses a row, whose event bubbles to exactly here — so this is the honest target
482
+ * either way, and the one that works when jsdom has left real focus on `<body>`.
483
+ */
484
+ private press;
485
+ /**
486
+ * The `<ul role="tree">` of THIS tree — in the host inline, in this tree's own
487
+ * overlay panel otherwise.
488
+ */
489
+ private list;
490
+ /** The combobox trigger, or a failure that says this tree renders inline. */
491
+ private trigger;
492
+ /** The id the trigger publishes as `aria-controls`, which its panel carries. */
493
+ private panelId;
494
+ /** The trigger's text for the `text` filter, or `null` for an inline tree (which never matches). */
495
+ private triggerTextIfAny;
496
+ /** The rendered labels for the `nodeLabel` filter — a closed tree matches nothing rather than failing. */
497
+ private nodeLabelsIfShowing;
498
+ }
499
+
500
+ export { WrTreeHarness, WrTreeNodeHarness };
501
+ export type { WrTreeHarnessFilters, WrTreeNodeHarnessFilters };
@@ -151,8 +151,27 @@ declare class WrTree<TId = string> implements FormValueControl<unknown> {
151
151
  private readonly scrollStrategies;
152
152
  private readonly destroyRef;
153
153
  private readonly platformId;
154
+ /**
155
+ * Ambient reading direction. Optional so a bare `TestBed` — or a consumer who
156
+ * never set a direction — needs no provider; `Directionality` is root-provided
157
+ * anyway, and a missing one simply reads as `ltr`.
158
+ *
159
+ * Read at keystroke time rather than cached, so a runtime `dir` flip needs no
160
+ * subscription to `change`.
161
+ */
162
+ private readonly dir;
154
163
  /** Currently focused row's index in the flattened visible list. */
155
164
  protected readonly focusedIndex: _angular_core.WritableSignal<number>;
165
+ /**
166
+ * The cursor as the DOM sees it, clamped to the list that exists RIGHT NOW.
167
+ *
168
+ * The raw index is only ever written when a row is focused, and nothing shrank
169
+ * it when the list did: collapsing a branch above the cursor left the index
170
+ * past the end, which gave the tree zero rows with `tabindex="0"` (no way back
171
+ * in with Tab) and made every arrow key a no-op, because `onKeydown` bails when
172
+ * `flat[i]` is undefined.
173
+ */
174
+ protected readonly cursorIndex: _angular_core.Signal<number>;
156
175
  /** Resolved ARIA labels — resolved once at construction, so a runtime locale switch needs a re-create. */
157
176
  protected readonly clearLabel: string;
158
177
  protected readonly expandLabel: string;
@@ -216,9 +235,23 @@ declare class WrTree<TId = string> implements FormValueControl<unknown> {
216
235
  private get listElement();
217
236
  /** Scroll flat index `i` just into view (sets the `scrollTop` signal synchronously). */
218
237
  private ensureVisible;
238
+ /** Whether this OPEN has already auto-expanded; reset when the panel closes. */
239
+ private didExpandAll;
219
240
  constructor();
220
241
  protected onRowClick(flat: FlatNode<TId>, event: MouseEvent): void;
221
242
  protected onToggleClick(node: WrTreeNode<TId>, event: MouseEvent): void;
243
+ /**
244
+ * Map a physical arrow onto the expand / collapse axis.
245
+ *
246
+ * The APG gives ArrowRight the job of opening a branch and ArrowLeft the job
247
+ * of closing it because the arrows follow the INDENT, and the indent grows
248
+ * rightward. Under `dir="rtl"` it grows leftward, so the two swap — without
249
+ * this an RTL user cannot open a node at all.
250
+ *
251
+ * Up / Down travel the block axis and Home / End name a semantic position
252
+ * (first / last), so all four are returned untouched in both directions.
253
+ */
254
+ private inlineKey;
222
255
  protected onKeydown(event: KeyboardEvent): void;
223
256
  protected onTriggerClick(): void;
224
257
  /** Trigger blur — mark the bound field touched. */
@@ -16,7 +16,7 @@ import { InjectionToken } from '@angular/core';
16
16
  * Distinct from `Version` exported by `@angular/core`, which reports the
17
17
  * loaded Angular runtime version (e.g. `'22.0.0'`), not ngwr's.
18
18
  */
19
- declare const NGWR_VERSION = "10.2.0";
19
+ declare const NGWR_VERSION = "11.0.0";
20
20
 
21
21
  /**
22
22
  * @license
@@ -49,13 +49,25 @@ declare class WrVirtualScroll<T = unknown> {
49
49
  protected readonly rowTemplate: _angular_core.Signal<TemplateRef<any>>;
50
50
  protected readonly viewport: _angular_core.Signal<CdkVirtualScrollViewport>;
51
51
  protected readonly resolvedHeight: _angular_core.Signal<string>;
52
+ /**
53
+ * The two buffers, resolved as a PAIR. CDK requires `maxBufferPx >= minBufferPx` and
54
+ * throws `CDK virtual scroll: maxBufferPx must be greater than or equal to minBufferPx`
55
+ * outright otherwise — so resolving them independently meant that setting just one of
56
+ * them, the obvious thing to do, crashed the viewport on construction. Whichever a
57
+ * consumer gave is honoured and the other follows it.
58
+ */
59
+ private readonly buffers;
52
60
  protected readonly resolvedMinBuffer: _angular_core.Signal<number>;
53
61
  protected readonly resolvedMaxBuffer: _angular_core.Signal<number>;
54
62
  /** Scroll a specific index into view. Mirrors the CDK API. */
55
63
  scrollToIndex(index: number, behavior?: ScrollBehavior): void;
56
64
  /** Scroll to a pixel offset. */
57
65
  scrollToOffset(offset: number, behavior?: ScrollBehavior): void;
58
- /** Manually trigger size recheck (e.g. after host resize outside ResizeObserver). */
66
+ /**
67
+ * Re-measure the viewport. CDK already watches the window with its `ViewportRuler`, so
68
+ * this is for a size change it cannot see — the host being resized by a layout the
69
+ * window never noticed, or a parent that was display:none until now.
70
+ */
59
71
  checkViewportSize(): void;
60
72
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrVirtualScroll<any>, never>;
61
73
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrVirtualScroll<any>, "wr-virtual-scroll", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "itemSize": { "alias": "itemSize"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "minBufferPx": { "alias": "minBufferPx"; "required": false; "isSignal": true; }; "maxBufferPx": { "alias": "maxBufferPx"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; }, {}, ["rowTemplate"], never, true, never>;