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
@@ -35,8 +35,12 @@ declare class WrTextarea implements FormValueControl<string> {
35
35
  */
36
36
  readonly ariaLabel: _angular_core.InputSignal<string | null>;
37
37
  protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
38
- /** Control size — shares the `--wr-control-*` contract. @default 'md' */
39
- readonly size: _angular_core.InputSignal<WrTextareaSize>;
38
+ /**
39
+ * Control size — shares the `--wr-control-*` contract. Unset, it falls back to
40
+ * `provideWrConfig({ textarea: { size } })`. @default 'md'
41
+ */
42
+ readonly size: _angular_core.InputSignal<WrTextareaSize | null>;
43
+ protected readonly resolvedSize: _angular_core.Signal<"sm" | "md" | "lg">;
40
44
  /** Visible row count. @default 3 */
41
45
  readonly rows: _angular_core.InputSignalWithTransform<number, unknown>;
42
46
  /** Allow user resize via the corner grip. @default true */
@@ -83,6 +87,7 @@ declare class WrTextarea implements FormValueControl<string> {
83
87
  protected startResize(event: PointerEvent): void;
84
88
  protected onResize(event: PointerEvent): void;
85
89
  protected endResize(event: PointerEvent): void;
90
+ private releaseHeight;
86
91
  private autofit;
87
92
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrTextarea, never>;
88
93
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTextarea, "wr-textarea", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "resize": { "alias": "resize"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "autosize": { "alias": "autosize"; "required": false; "isSignal": true; }; "maxRows": { "alias": "maxRows"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
@@ -0,0 +1,80 @@
1
+ import { BaseHarnessFilters, ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
2
+ import { WrToastType } from 'ngwr/toast';
3
+
4
+ /**
5
+ * @license
6
+ *
7
+ * Use of this source code is governed by an MIT-style license that can be
8
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
9
+ */
10
+
11
+ /** Narrows which toast a harness query matches. */
12
+ interface WrToastHarnessFilters extends BaseHarnessFilters {
13
+ /** Match the toast's message — a string is an exact match, a RegExp is tested. */
14
+ readonly message?: string | RegExp;
15
+ /** Match the toast's title. A toast with no title never matches. */
16
+ readonly title?: string | RegExp;
17
+ /** Match the intent: `info`, `success`, `warning` or `danger`. */
18
+ readonly type?: WrToastType;
19
+ }
20
+
21
+ /**
22
+ * @license
23
+ *
24
+ * Use of this source code is governed by an MIT-style license that can be
25
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
26
+ */
27
+
28
+ /**
29
+ * Test harness for a toast shown with `WrToast.show()`.
30
+ *
31
+ * Toasts live in the overlay, so load this from
32
+ * `TestbedHarnessEnvironment.documentRootLoader()`. What is worth asserting on a
33
+ * toast is mostly what it ANNOUNCES: `getRole()` and `getLiveLevel()` are how a
34
+ * screen-reader user learns something happened, and they escalate with the
35
+ * intent — a `danger` toast interrupts, an `info` toast waits its turn.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * const rootLoader = TestbedHarnessEnvironment.documentRootLoader(fixture);
40
+ * const toast = await rootLoader.getHarness(WrToastHarness.with({ type: 'danger' }));
41
+ *
42
+ * expect(await toast.getMessage()).toBe('Could not save');
43
+ * expect(await toast.getRole()).toBe('alert');
44
+ * await toast.dismiss();
45
+ * ```
46
+ *
47
+ * @see https://ngwr.dev/guides/testing
48
+ */
49
+ declare class WrToastHarness extends ComponentHarness {
50
+ static hostSelector: string;
51
+ /** Build a predicate that narrows the query — several toasts are usually stacked. */
52
+ static with(options?: WrToastHarnessFilters): HarnessPredicate<WrToastHarness>;
53
+ /** The toast's message line. */
54
+ getMessage(): Promise<string>;
55
+ /** The toast's title, or `null` when it was shown without one. */
56
+ getTitle(): Promise<string | null>;
57
+ /** The intent, read from the `wr-toast--*` modifier. */
58
+ getType(): Promise<WrToastType | null>;
59
+ /** `'alert'` for a danger toast, `'status'` otherwise — how urgently it interrupts. */
60
+ getRole(): Promise<string | null>;
61
+ /** `'assertive'` for danger and warning, `'polite'` otherwise. */
62
+ getLiveLevel(): Promise<string | null>;
63
+ /** Whether the toast offers a dismiss button. */
64
+ isDismissible(): Promise<boolean>;
65
+ /** Whether the toast offers a copy button. */
66
+ hasCopyAction(): Promise<boolean>;
67
+ /** Click the dismiss button. Throws on a toast shown `dismissible: false`. */
68
+ dismiss(): Promise<void>;
69
+ /** Click the copy button. Throws unless the toast was shown `showCopy: true`. */
70
+ copy(): Promise<void>;
71
+ /** Whether the auto-dismiss progress bar is showing. */
72
+ hasProgressBar(): Promise<boolean>;
73
+ /** Hover the toast — which is what pauses its auto-dismiss timer. */
74
+ hover(): Promise<void>;
75
+ /** Move the pointer away again, resuming the timer. */
76
+ mouseAway(): Promise<void>;
77
+ }
78
+
79
+ export { WrToastHarness };
80
+ export type { WrToastHarnessFilters };
@@ -39,7 +39,11 @@ interface WrToastOptions {
39
39
  readonly duration?: number;
40
40
  /** Show a close (×) button. @default true */
41
41
  readonly dismissible?: boolean;
42
- /** Override the corner for this toast only. */
42
+ /**
43
+ * Corner this toast opens in. The whole stack shares one host, so this is
44
+ * not per-toast: passing a different corner relocates the toasts already on
45
+ * screen along with this one.
46
+ */
43
47
  readonly position?: WrToastPosition;
44
48
  /** Override the progress bar visibility for this toast only. */
45
49
  readonly showProgress?: boolean;
@@ -90,7 +94,16 @@ interface WrToastConfig {
90
94
  readonly showCloseAll: boolean;
91
95
  /** Minimum number of stacked toasts before "Close all" appears. @default 2 */
92
96
  readonly closeAllThreshold: number;
93
- /** Maximum toasts visible at once. Oldest is dismissed when exceeded. `0` = unlimited. @default 5 */
97
+ /**
98
+ * Maximum toasts visible at once. `0` = unlimited.
99
+ *
100
+ * Nothing on screen is taken away to make room: once the cap is reached the
101
+ * *newest* toast waits in a queue, and queued toasts are promoted FIFO as
102
+ * visible ones dismiss. A queued toast's auto-dismiss countdown only starts
103
+ * when it becomes visible, so it can never expire unseen.
104
+ *
105
+ * @default 5
106
+ */
94
107
  readonly maxStack: number;
95
108
  /** Labels rendered in the UI. Keep short — meant to be overridden for i18n. */
96
109
  readonly labels: {
@@ -195,13 +208,15 @@ declare class WrToast {
195
208
  * position: 'bottom-end',
196
209
  * showCopy: true,
197
210
  * maxStack: 3,
198
- * labels: { close: 'Закрыть', copy: 'Копировать', copied: 'Скопировано', closeAll: 'Закрыть все' },
211
+ * labels: { close: 'Закрыть' },
199
212
  * }),
200
213
  * ],
201
214
  * });
202
215
  * ```
203
216
  */
204
- declare function provideWrToastConfig(config: Partial<WrToastConfig>): EnvironmentProviders;
217
+ declare function provideWrToastConfig(config: Partial<Omit<WrToastConfig, 'labels'>> & {
218
+ readonly labels?: Partial<WrToastConfig['labels']>;
219
+ }): EnvironmentProviders;
205
220
 
206
221
  /**
207
222
  * @license
@@ -51,6 +51,7 @@ interface WrTourStep {
51
51
  */
52
52
  declare class WrTour {
53
53
  private readonly overlay;
54
+ private readonly dir;
54
55
  private readonly scrollStrategies;
55
56
  private readonly injector;
56
57
  private readonly focusTrapFactory;
@@ -59,6 +60,7 @@ declare class WrTour {
59
60
  private readonly steps;
60
61
  private readonly cursor;
61
62
  private overlayRef;
63
+ private focusTrap;
62
64
  private spotlight;
63
65
  private detachKeydown;
64
66
  private detachReposition;
@@ -71,6 +73,15 @@ declare class WrTour {
71
73
  readonly total: _angular_core.Signal<number>;
72
74
  /** The step being shown, or `null` when idle. */
73
75
  readonly step: _angular_core.Signal<WrTourStep | null>;
76
+ private readonly noStepAfter;
77
+ /**
78
+ * Whether this is the last step the user will see. Not `index() === total() - 1`:
79
+ * a trailing step whose target is missing is skipped, so comparing against the
80
+ * raw count left the primary button reading "Next" on the final card and then
81
+ * ending the tour when it was pressed.
82
+ */
83
+ readonly isLast: _angular_core.Signal<boolean>;
84
+ constructor();
74
85
  /**
75
86
  * Begin a tour. Restarts if one is already running. A no-op under SSR — a
76
87
  * tour is a client-side affordance and there is nothing to spotlight on the
@@ -89,10 +100,20 @@ declare class WrTour {
89
100
  * between two dead ends.
90
101
  */
91
102
  private goTo;
103
+ /** Whether the tour has a step past `index` that can actually be shown. */
104
+ private anyResolvableAfter;
92
105
  private resolve;
93
106
  private openStep;
94
107
  private placeSpotlight;
95
108
  private teardownStep;
109
+ /**
110
+ * Whether the app reads right-to-left.
111
+ *
112
+ * Optional inject: `Directionality` is root-provided, so this is never null in
113
+ * an app — but a bare `TestBed` that provides nothing should still get a
114
+ * component that works, and defaulting to LTR is the honest fallback.
115
+ */
116
+ private isRtl;
96
117
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrTour, never>;
97
118
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<WrTour>;
98
119
  }
@@ -102,6 +123,12 @@ interface WrTourController {
102
123
  readonly index: () => number;
103
124
  readonly total: () => number;
104
125
  readonly step: () => WrTourStep | null;
126
+ /**
127
+ * Whether this is the last step the user will actually see — the service looks
128
+ * ahead for a reachable one, because a trailing step whose target is missing gets
129
+ * skipped and the raw count would call the final card "Next".
130
+ */
131
+ readonly isLast: () => boolean;
105
132
  next(): void;
106
133
  prev(): void;
107
134
  stop(): void;
@@ -0,0 +1,444 @@
1
+ import { BaseHarnessFilters, ComponentHarness, HarnessPredicate } 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
+ * Which pane of a `<wr-transfer>` a call is about — the left one (`'source'`, the
11
+ * rows NOT in the value) or the right one (`'target'`, the rows that are).
12
+ *
13
+ * These are the component's own two names for the panes, `[sourceTitle]` /
14
+ * `[targetTitle]` and the `wr-transfer__pane--target` modifier, rather than
15
+ * left / right: a pane's side is a fact about the value it stands for, and under
16
+ * `dir="rtl"` the left pane is on the right.
17
+ */
18
+ type WrTransferSide = 'source' | 'target';
19
+
20
+ /**
21
+ * @license
22
+ *
23
+ * Use of this source code is governed by an MIT-style license that can be
24
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
25
+ */
26
+
27
+ /** Narrows which `<wr-transfer>` a harness query matches. */
28
+ interface WrTransferHarnessFilters extends BaseHarnessFilters {
29
+ /** Match the LEFT pane's heading. A string is an exact match, a RegExp is tested. */
30
+ readonly sourceTitle?: string | RegExp;
31
+ /** Match the RIGHT pane's heading. A string is an exact match, a RegExp is tested. */
32
+ readonly targetTitle?: string | RegExp;
33
+ /**
34
+ * Match a transfer SHOWING a row with this label, in either pane — the readable
35
+ * way to tell two transfers apart, since both headings fall back to the same
36
+ * built-in strings when a template sets neither. A row a pane's filter has hidden
37
+ * is not rendered and does not count.
38
+ */
39
+ readonly itemLabel?: string | RegExp;
40
+ /** Match only transfers with a filter box above each pane (`true`) or without (`false`). */
41
+ readonly searchable?: boolean;
42
+ /** Match only disabled (`true`) or only enabled (`false`) transfers. */
43
+ readonly disabled?: boolean;
44
+ }
45
+ /** Narrows which pane of a transfer a harness query matches. */
46
+ interface WrTransferPaneHarnessFilters extends BaseHarnessFilters {
47
+ /** Match one side — what `WrTransferHarness.getPane()` narrows by. */
48
+ readonly side?: WrTransferSide;
49
+ /** Match the pane's heading. A string is an exact match, a RegExp is tested. */
50
+ readonly title?: string | RegExp;
51
+ }
52
+ /** Narrows which row inside a pane a harness query matches. */
53
+ interface WrTransferItemHarnessFilters extends BaseHarnessFilters {
54
+ /** Match the row's label — a string is an exact match, a RegExp is tested. */
55
+ readonly label?: string | RegExp;
56
+ /**
57
+ * Match only staged (`true`) or only unstaged (`false`) rows. Staged is the
58
+ * transient tick a move spends — NOT membership of the value, which is the pane
59
+ * the row sits in.
60
+ */
61
+ readonly checked?: boolean;
62
+ /**
63
+ * Match only rows that refuse staging (`true`) or only rows that accept it
64
+ * (`false`). Every row of a disabled TRANSFER refuses it, so `false` matches
65
+ * nothing there.
66
+ */
67
+ readonly disabled?: boolean;
68
+ }
69
+
70
+ /**
71
+ * @license
72
+ *
73
+ * Use of this source code is governed by an MIT-style license that can be
74
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
75
+ */
76
+
77
+ /**
78
+ * Test harness for one row of a `<wr-transfer>` pane.
79
+ *
80
+ * A row is a `<li>` holding a `<wr-checkbox>`, and the checkbox is the thing the
81
+ * user operates — so the state is read from the native `<input type="checkbox">`
82
+ * inside it, and {@link toggle} clicks that. The pane is deliberately NOT a
83
+ * `role="listbox"` of `role="option"` rows (an option may not contain an
84
+ * interactive control, and the axe gate says so), which is why there is no
85
+ * `aria-selected` here to read: the checkbox's own state IS the announcement.
86
+ *
87
+ * **Checked is not the value.** A tick stages the row for the next move and
88
+ * nothing more; which pane the row sits in is what `[(value)]` carries. Staging is
89
+ * spent — and cleared — by the move that commits it.
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * const source = await transfer.getPane('source');
94
+ * await (await source.getItem({ label: 'Read' })).check();
95
+ *
96
+ * await transfer.moveTo('target');
97
+ * ```
98
+ *
99
+ * @see https://ngwr.dev/guides/testing
100
+ */
101
+ declare class WrTransferItemHarness extends ComponentHarness {
102
+ /**
103
+ * `.wr-transfer__item` is a DATA row and nothing else.
104
+ *
105
+ * An empty pane renders an `<li class="wr-transfer__empty">` for its placeholder,
106
+ * so querying `li` would hand that back as a row with no checkbox to read.
107
+ */
108
+ static hostSelector: string;
109
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
110
+ static with(options?: WrTransferItemHarnessFilters): HarnessPredicate<WrTransferItemHarness>;
111
+ private readonly input;
112
+ /** The row's label, trimmed — the `WrTransferItem.label` the pane shows and the search matches. */
113
+ getLabel(): Promise<string>;
114
+ /**
115
+ * Whether the row is STAGED for the next move.
116
+ *
117
+ * Not "selected": a row's pane is what the value says, and the tick is transient
118
+ * staging the move spends. `WrTransferPaneHarness.getCheckedLabels()` reads the
119
+ * whole staged set of a pane.
120
+ */
121
+ isChecked(): Promise<boolean>;
122
+ /**
123
+ * Whether the row refuses staging.
124
+ *
125
+ * The native input's `disabled` — the state a screen reader is given and the one
126
+ * that decides whether a click does anything. It answers `true` for BOTH reasons a
127
+ * row can be inert: the item's own `disabled` flag, and a disabled transfer, which
128
+ * disables every row. The `wr-transfer__item--disabled` modifier only marks the
129
+ * first of those, so it is the narrower question and not the one that predicts
130
+ * behaviour.
131
+ */
132
+ isDisabled(): Promise<boolean>;
133
+ /**
134
+ * Flip the row's staging.
135
+ *
136
+ * Refuses a disabled row rather than clicking into the void: the component drops
137
+ * the toggle outright, so the click would resolve having changed nothing and the
138
+ * failure would surface as an unexplained empty move two assertions later.
139
+ */
140
+ toggle(): Promise<void>;
141
+ /** Stage the row if it is not already staged. */
142
+ check(): Promise<void>;
143
+ /** Unstage the row if it is staged. */
144
+ uncheck(): Promise<void>;
145
+ /** Move keyboard focus onto the row's checkbox — the row's only tab stop. */
146
+ focus(): Promise<void>;
147
+ /** Whether the row's checkbox has focus. */
148
+ isFocused(): Promise<boolean>;
149
+ }
150
+
151
+ /**
152
+ * @license
153
+ *
154
+ * Use of this source code is governed by an MIT-style license that can be
155
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
156
+ */
157
+
158
+ /**
159
+ * Test harness for ONE pane of a `<wr-transfer>` — reached with
160
+ * `WrTransferHarness.getPane('source' | 'target')`.
161
+ *
162
+ * The two panes are the same block rendered twice (the component's template
163
+ * iterates them), so they are one harness class keyed by side rather than two sets
164
+ * of `…Source` / `…Target` methods: the side is named once, at `getPane()`, and
165
+ * every question after that is asked of a pane without repeating which one. It also
166
+ * means the symmetry cannot rot — a method that only works on the left is
167
+ * impossible to write here.
168
+ *
169
+ * What a pane SHOWS is the honest scope of everything below. `[items]` minus the
170
+ * value on the left, the value on the right, and then the pane's own filter on top:
171
+ * rows a filter has hidden are not rendered at all, are not counted by the header,
172
+ * and — the component's own rule — are not moved either, however they were staged.
173
+ *
174
+ * @example
175
+ * ```ts
176
+ * const source = await transfer.getPane('source');
177
+ *
178
+ * await source.search('adm');
179
+ * await source.checkAll();
180
+ * expect(await source.getCheckedLabels()).toEqual(['Admin']);
181
+ * ```
182
+ *
183
+ * @see https://ngwr.dev/guides/testing
184
+ */
185
+ declare class WrTransferPaneHarness extends ComponentHarness {
186
+ /**
187
+ * The pane is a plain `<div>` with no role of its own — the heading names the
188
+ * list, and the checkbox in each row carries the semantics — so its BEM class is
189
+ * the only handle, and being `ViewEncapsulation.None` that class is public API.
190
+ */
191
+ static hostSelector: string;
192
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
193
+ static with(options?: WrTransferPaneHarnessFilters): HarnessPredicate<WrTransferPaneHarness>;
194
+ private readonly list;
195
+ private readonly selectAllBox;
196
+ private readonly searchBox;
197
+ /**
198
+ * Which side this pane is.
199
+ *
200
+ * From the `--target` modifier rather than from DOM order: order is a layout fact
201
+ * that `dir="rtl"` and any future reflow are free to change, while the modifier is
202
+ * what the component says the pane MEANS.
203
+ */
204
+ getSide(): Promise<WrTransferSide>;
205
+ /** The pane's heading — `[sourceTitle]` / `[targetTitle]`, or the i18n fallback. */
206
+ getTitle(): Promise<string>;
207
+ /**
208
+ * The count beside the heading, verbatim — `'1 / 4'` with the built-in copy.
209
+ *
210
+ * Deliberately not parsed into numbers: it is an i18n FORMAT
211
+ * (`transfer.count`) a consuming app can replace wholesale, so a harness that
212
+ * split it on `/` would answer for the default catalog and break on a translated
213
+ * one. Its two numbers are `(await getCheckedLabels()).length` and
214
+ * `(await getItems()).length` — both of which this harness reads from the rendered
215
+ * rows, so a spec can assert the header agrees with them.
216
+ */
217
+ getCountText(): Promise<string>;
218
+ /**
219
+ * The list's accessible name — the `aria-label` on the `<ul>`, which repeats the
220
+ * heading so that a row announced in isolation still says which pane it is in.
221
+ */
222
+ getListLabel(): Promise<string | null>;
223
+ /**
224
+ * The explicit `role` on the pane's list, which is `null` — and that `null` is the
225
+ * ANSWER, not a gap worth fixing.
226
+ *
227
+ * The pane is a plain `<ul>` of checkboxes on purpose. Dressing it as a
228
+ * `role="listbox"` of `role="option"` rows reads better in the abstract but is
229
+ * invalid: an option may not contain an interactive control, and the axe gate
230
+ * rejects it. Pinning this is what keeps that "improvement" from looking like a
231
+ * win.
232
+ */
233
+ getListRole(): Promise<string | null>;
234
+ /** The rows the pane is showing, in render order. */
235
+ getItems(filters?: WrTransferItemHarnessFilters): Promise<WrTransferItemHarness[]>;
236
+ /**
237
+ * The labels the pane is showing, in render order.
238
+ *
239
+ * On the right that is the value, in the order the user built it — not `[items]`
240
+ * order, which the component deliberately does not impose.
241
+ */
242
+ getItemLabels(): Promise<string[]>;
243
+ /** The first row matching the filters, or a failure that says what the pane is showing. */
244
+ getItem(filters: WrTransferItemHarnessFilters): Promise<WrTransferItemHarness>;
245
+ /**
246
+ * The labels of the rows STAGED for the next move, in render order.
247
+ *
248
+ * The staged set and the value are different things, and this is the one the pane
249
+ * shows: read from the rendered rows, so a row staged before a search hid it is
250
+ * absent — exactly as the header count and the move itself treat it.
251
+ */
252
+ getCheckedLabels(): Promise<string[]>;
253
+ /** The placeholder shown in a pane with no rows, or `null` while it has some. */
254
+ getEmptyText(): Promise<string | null>;
255
+ /** Whether this pane has a filter box — `[searchable]` puts one above both panes. */
256
+ hasSearch(): Promise<boolean>;
257
+ /**
258
+ * Type into the pane's filter box, narrowing it to the rows whose label contains
259
+ * the query (case-insensitively).
260
+ *
261
+ * Pass `''` to clear it. No `change` is dispatched — `input` is the event the
262
+ * component listens for, and the one a real keystroke carries; a browser defers
263
+ * `change` on a text field to the commit, so nothing here depends on it. (The
264
+ * keystrokes themselves come with the `keydown` / `keypress` / `keyup` the CDK
265
+ * sends alongside, which this component ignores.)
266
+ */
267
+ search(query: string): Promise<void>;
268
+ /** What is currently typed in the pane's filter box, or `''`. Throws when there is none. */
269
+ getSearchValue(): Promise<string>;
270
+ /** The filter box's placeholder — `[searchPlaceholder]`, or the i18n fallback. */
271
+ getSearchPlaceholder(): Promise<string>;
272
+ /**
273
+ * The filter box's accessible name.
274
+ *
275
+ * Composed with the pane heading by the component, and it has to be: both panes
276
+ * carry the same placeholder, so an unnamed pair announces as two identical
277
+ * "Search" fields with no way to tell which list either one filters.
278
+ */
279
+ getSearchLabel(): Promise<string | null>;
280
+ /**
281
+ * The select-all box's accessible name.
282
+ *
283
+ * It has one of its own — the heading names the LIST, so reusing it here would
284
+ * leave a screen reader announcing two different controls identically.
285
+ */
286
+ getSelectAllLabel(): Promise<string | null>;
287
+ /** Whether every row the pane is showing that CAN be staged is staged. */
288
+ isAllChecked(): Promise<boolean>;
289
+ /**
290
+ * Whether some of the pane's stageable rows are staged and others are not.
291
+ *
292
+ * `indeterminate` is a DOM PROPERTY, not an attribute — reading the attribute
293
+ * would report `null` for a box that is visibly dashed.
294
+ */
295
+ isPartiallyChecked(): Promise<boolean>;
296
+ /**
297
+ * Whether the select-all box refuses interaction — a disabled transfer, or a pane
298
+ * with nothing stageable in it (empty, filtered to nothing, or showing only
299
+ * disabled rows).
300
+ */
301
+ isSelectAllDisabled(): Promise<boolean>;
302
+ /**
303
+ * Click the select-all box once.
304
+ *
305
+ * Its scope is the rows the pane is SHOWING and can stage: a filtered-out row and
306
+ * a disabled row are both outside it. Worth knowing before asserting on a partial
307
+ * pane — the box reads UNchecked while the staging is partial, so one click there
308
+ * stages everything rather than clearing it. {@link uncheckAll} handles that.
309
+ */
310
+ toggleSelectAll(): Promise<void>;
311
+ /** Stage every row the pane shows that can be staged. A pane already fully staged is left alone. */
312
+ checkAll(): Promise<void>;
313
+ /** Clear the pane's staging. */
314
+ uncheckAll(): Promise<void>;
315
+ /** The filter box, or a failure naming the input that turns it on. */
316
+ private searchOrThrow;
317
+ }
318
+
319
+ /**
320
+ * @license
321
+ *
322
+ * Use of this source code is governed by an MIT-style license that can be
323
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
324
+ */
325
+
326
+ /**
327
+ * Test harness for `<wr-transfer>` — the root of a small family, since a dual
328
+ * listbox is three things and not one control: {@link WrTransferPaneHarness} for one
329
+ * pane and {@link WrTransferItemHarness} for one row inside it.
330
+ *
331
+ * **Everything is keyed by SIDE, never duplicated per pane.** The two panes are the
332
+ * same block rendered twice, so a `…Source` / `…Target` method pair for each
333
+ * question would double the surface and let the halves drift; instead
334
+ * {@link getPane} takes the side once and the pane answers, and the two whole-
335
+ * control operations that are inherently directional — the move buttons — take the
336
+ * side they move rows INTO. `moveTo('target')` is the right-facing button in an LTR
337
+ * layout, and stays the correct one under `dir="rtl"`, where "right" is not.
338
+ *
339
+ * **The staged ticks are not the value.** `[(value)]` is the RIGHT pane's
340
+ * membership; a tick inside either pane is transient staging that the next move
341
+ * spends and clears. Conflating them is the failure this component invites, so the
342
+ * two are separate questions here: {@link WrTransferPaneHarness.getItemLabels} is
343
+ * what a pane HOLDS (the value, on the right) and
344
+ * {@link WrTransferPaneHarness.getCheckedLabels} is what it has STAGED.
345
+ *
346
+ * Both are scoped to what a pane is showing, which is also the component's own rule
347
+ * for a move: a row staged before a search hid it is no longer counted, no longer
348
+ * ticked, and does not travel.
349
+ *
350
+ * @example
351
+ * ```ts
352
+ * const transfer = await loader.getHarness(WrTransferHarness);
353
+ * const source = await transfer.getPane('source');
354
+ *
355
+ * await (await source.getItem({ label: 'Read' })).check();
356
+ * await transfer.moveTo('target');
357
+ *
358
+ * expect(await (await transfer.getPane('target')).getItemLabels()).toEqual(['Read']);
359
+ * ```
360
+ *
361
+ * @see https://ngwr.dev/guides/testing
362
+ */
363
+ declare class WrTransferHarness extends ComponentHarness {
364
+ static hostSelector: string;
365
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
366
+ static with(options?: WrTransferHarnessFilters): HarnessPredicate<WrTransferHarness>;
367
+ /**
368
+ * One of the two panes — `'source'` is the left one (the rows outside the value),
369
+ * `'target'` the right one (the value).
370
+ *
371
+ * The side is named here and nowhere else; see the class note.
372
+ */
373
+ getPane(side: WrTransferSide): Promise<WrTransferPaneHarness>;
374
+ /**
375
+ * Whether the whole control refuses interaction.
376
+ *
377
+ * From the host modifier, which is the only signal the host itself carries: a
378
+ * `<wr-transfer>` element is not a control and publishes no `aria-disabled` of its
379
+ * own — the state reaches assistive tech through the checkboxes, the buttons and
380
+ * the filter boxes it disables, which is where
381
+ * {@link WrTransferItemHarness.isDisabled} and {@link canMoveTo} read it.
382
+ */
383
+ isDisabled(): Promise<boolean>;
384
+ /** Whether the panes have filter boxes — `[searchable]` gives both one or neither. */
385
+ isSearchable(): Promise<boolean>;
386
+ /**
387
+ * Whether the button that moves rows INTO `side` is offering itself.
388
+ *
389
+ * It is enabled only while the OTHER pane has something staged and showing, so
390
+ * this is also the readable way to assert that staging landed — and that a search
391
+ * which hid a staged row took the move away again.
392
+ *
393
+ * Read from the native `disabled` attribute: these are `button[wr-btn]`, the
394
+ * native shape, where that attribute is the state. (`wr-btn` adds `aria-disabled`
395
+ * only for its custom-element shape, on which `disabled` is inert.)
396
+ */
397
+ canMoveTo(side: WrTransferSide): Promise<boolean>;
398
+ /**
399
+ * The accessible name of the button that moves rows INTO `side` —
400
+ * `[toTargetLabel]` / `[toSourceLabel]`, or the i18n fallback.
401
+ *
402
+ * Worth pinning: the button's only content is an `aria-hidden` chevron, so this
403
+ * `aria-label` is the entire announcement. Lose it and the pair becomes two
404
+ * unnamed buttons.
405
+ */
406
+ getMoveLabel(side: WrTransferSide): Promise<string | null>;
407
+ /**
408
+ * Press the button that moves the staged rows INTO `side`, committing them to the
409
+ * value.
410
+ *
411
+ * Only the rows the other pane is SHOWING as staged travel, and the staging is
412
+ * cleared afterwards — the component's rule, not this harness's.
413
+ *
414
+ * Refuses a disabled button rather than pressing it: a native disabled `<button>`
415
+ * swallows the click before Angular's listener sees it, so the call would resolve
416
+ * having moved nothing at all.
417
+ */
418
+ moveTo(side: WrTransferSide): Promise<void>;
419
+ /**
420
+ * Stage everything the other pane can stage, then move it INTO `side`.
421
+ *
422
+ * "Everything" is the pane's own scope: the rows it is SHOWING, disabled ones
423
+ * excluded. A search narrows it, and with a filter typed this moves what is
424
+ * visible rather than the whole pane.
425
+ */
426
+ moveAllTo(side: WrTransferSide): Promise<void>;
427
+ /** The heading of one pane — the `sourceTitle` / `targetTitle` filters run through this. */
428
+ private paneTitle;
429
+ /** Every label rendered in either pane, for the `itemLabel` filter. */
430
+ private shownLabels;
431
+ /**
432
+ * The move button for a direction, addressed by its `--to-source` / `--to-target`
433
+ * modifier.
434
+ *
435
+ * Not by DOM order, and that is the point: two identically classed buttons whose
436
+ * only difference was their position would let a template reshuffle silently
437
+ * reverse every `moveTo()` in every consumer's suite, with both directions still
438
+ * green. Not by the `aria-label` either — that string is localizable.
439
+ */
440
+ private moveButton;
441
+ }
442
+
443
+ export { WrTransferHarness, WrTransferItemHarness, WrTransferPaneHarness };
444
+ export type { WrTransferHarnessFilters, WrTransferItemHarnessFilters, WrTransferPaneHarnessFilters, WrTransferSide };