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
@@ -0,0 +1,470 @@
1
+ import { BaseHarnessFilters, ContentContainerComponentHarness, HarnessPredicate, HarnessLoader, ComponentHarness } 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
+ /**
11
+ * The sizes a strip renders — the `size` input as the host actually paints it.
12
+ *
13
+ * `md` is the default and carries no modifier class, so it is read as the ABSENCE
14
+ * of the other two. `<wr-tabs>` resolves this input on its own rather than through
15
+ * `provideWrConfig()`, so what the harness reports and what the consumer wrote are
16
+ * the same thing here.
17
+ */
18
+ type WrTabsHarnessSize = 'sm' | 'md' | 'lg';
19
+ /** Narrows which `<wr-tabs>` a harness query matches. */
20
+ interface WrTabsHarnessFilters extends BaseHarnessFilters {
21
+ /**
22
+ * Match a strip that offers a tab with this label — a string is an exact match,
23
+ * a RegExp is tested. Any of its tabs, not the selected one; see `selectedLabel`.
24
+ */
25
+ readonly tabLabel?: string | RegExp;
26
+ /**
27
+ * Match the label of the SELECTED tab — a string is an exact match, a RegExp is
28
+ * tested. A strip with no selected tab (a router strip whose route matches none
29
+ * of them) never matches.
30
+ */
31
+ readonly selectedLabel?: string | RegExp;
32
+ /** Match the size the strip renders at. */
33
+ readonly size?: WrTabsHarnessSize;
34
+ /**
35
+ * Match only router strips (`true`) or only content strips (`false`).
36
+ *
37
+ * One `routerLink` anywhere in the strip switches the whole thing over, so this
38
+ * is a property of the strip and not of one tab.
39
+ */
40
+ readonly router?: boolean;
41
+ }
42
+ /**
43
+ * Narrows which tab of a `<wr-tabs>` strip a harness query matches.
44
+ *
45
+ * Tabs are addressed by their LABEL rather than by their `key`: the key names the
46
+ * tab in the `active` model and reaches the DOM only buried inside the generated
47
+ * header and panel ids, and a tab that never set one carries a random id instead.
48
+ */
49
+ interface WrTabHarnessFilters extends BaseHarnessFilters {
50
+ /** Match the tab's visible label — a string is an exact match, a RegExp is tested. */
51
+ readonly label?: string | RegExp;
52
+ /** Match only the selected tab (`true`) or only the others (`false`). */
53
+ readonly selected?: boolean;
54
+ /** Match only disabled (`true`) or only enabled (`false`) tabs. */
55
+ readonly disabled?: boolean;
56
+ }
57
+
58
+ /**
59
+ * @license
60
+ *
61
+ * Use of this source code is governed by an MIT-style license that can be
62
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
63
+ */
64
+
65
+ /**
66
+ * Test harness for one tab of a `<wr-tabs>` strip — the header, and the panel it
67
+ * controls.
68
+ *
69
+ * Its host is the RENDERED HEADER, not the `<wr-tab>` element. A `<wr-tab>` is
70
+ * `display:none` and holds nothing but a `<ng-template>`: the label, the selection
71
+ * state, the tab stop and the click target all live on the element the parent
72
+ * renders for it, which is a `<button role="tab">` in content mode and an
73
+ * `<a role="tab">` in router mode. A harness hosted on `wr-tab` would answer every
74
+ * question with nothing.
75
+ *
76
+ * Also a CONTENT CONTAINER, scoped to the panel this tab controls, so
77
+ * `tab.getHarness(WrButtonHarness…)` reaches the consumer's own components inside
78
+ * the tab's content. The panel is not a descendant of the header — it is a sibling
79
+ * of the whole strip — so it is resolved through the `aria-controls` id, which is
80
+ * also the pairing {@link isPanelBound} checks. Only the SELECTED tab has a panel
81
+ * to reach: `<wr-tabs>` renders one panel and destroys it on every switch.
82
+ *
83
+ * @example
84
+ * ```ts
85
+ * const tabs = await loader.getHarness(WrTabsHarness);
86
+ * const [first] = await tabs.getTabs();
87
+ *
88
+ * expect(await first.isSelected()).toBe(true);
89
+ * expect(await first.isPanelBound()).toBe(true);
90
+ * await (await first.getHarness(WrButtonHarness.with({ text: 'Save' }))).click();
91
+ * ```
92
+ *
93
+ * @see https://ngwr.dev/guides/testing
94
+ */
95
+ declare class WrTabHarness extends ContentContainerComponentHarness {
96
+ /** The header the strip renders for a `<wr-tab>` — a `<button>`, or an `<a>` in router mode. */
97
+ static hostSelector: string;
98
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
99
+ static with(options?: WrTabHarnessFilters): HarnessPredicate<WrTabHarness>;
100
+ /** The tab's visible label, trimmed — the `<wr-tab>`'s `title`. */
101
+ getLabel(): Promise<string>;
102
+ /**
103
+ * The header's own id, which is what the panel points back at with
104
+ * `aria-labelledby` — the tab is the panel's accessible name.
105
+ *
106
+ * Generated from the tab's `key`, so two strips on one page whose tabs share keys
107
+ * publish the same ids and each panel then names whichever header came first.
108
+ */
109
+ getId(): Promise<string | null>;
110
+ /**
111
+ * Whether this is the strip's selected tab.
112
+ *
113
+ * `aria-selected` first, because that is the state a screen reader acts on and
114
+ * the `--active` class is only what it looks like. A ROUTER tab carries no
115
+ * `aria-selected` at all — the router paints the class through
116
+ * `routerLinkActive` and nothing announces the selection — so the class is the
117
+ * fallback rather than the first choice, and the two branches are not
118
+ * interchangeable: reading the class first would report a content tab as selected
119
+ * while `aria-selected="false"` told assistive tech otherwise.
120
+ */
121
+ isSelected(): Promise<boolean>;
122
+ /**
123
+ * Whether the tab refuses activation.
124
+ *
125
+ * The two shapes say it differently and both are read: a content tab is a real
126
+ * `<button>` and carries the native `disabled`, a router tab is an `<a>` — which
127
+ * cannot be disabled natively — and carries `aria-disabled` with `tabindex="-1"`.
128
+ * The `--disabled` class is on both and is deliberately not the source: a class
129
+ * says how the tab looks, these two say what it refuses.
130
+ */
131
+ isDisabled(): Promise<boolean>;
132
+ /** Whether this tab is a link — the router shape, where selection follows the route. */
133
+ isLink(): Promise<boolean>;
134
+ /**
135
+ * The resolved href of a router tab, or `null` for a content tab.
136
+ *
137
+ * `null` is the answer for a `<button>` rather than a gap — a content tab
138
+ * navigates nowhere, it swaps a panel.
139
+ */
140
+ getHref(): Promise<string | null>;
141
+ /**
142
+ * Whether a Tab press can land on this header.
143
+ *
144
+ * A content strip is ONE tab stop and hands it to the selected tab; a router
145
+ * strip makes every enabled tab a stop of its own. See
146
+ * `WrTabsHarness.getTabStopLabels()` — the difference is a mode difference, not
147
+ * a rounding error.
148
+ *
149
+ * A non-negative `tabindex` is not enough on its own, which is why `disabled` is
150
+ * read too: `<wr-tabs>` gives the roving `tabindex="0"` to whatever `active`
151
+ * names without checking whether that tab is disabled, so a host binding `active`
152
+ * to a disabled tab's key renders a `<button disabled tabindex="0">` — which no
153
+ * Tab press reaches. jsdom will focus such a button anyway, so this is the only
154
+ * place a unit test can tell the difference.
155
+ */
156
+ isTabStop(): Promise<boolean>;
157
+ /**
158
+ * The id of the panel this tab controls, or `null` when it controls none.
159
+ *
160
+ * `null` for a router tab — the strip renders no panel in that mode, the consumer
161
+ * drops a `<router-outlet>` after it — and that missing `aria-controls` is the
162
+ * honest report: there is nothing for the header to point at.
163
+ */
164
+ getPanelId(): Promise<string | null>;
165
+ /** Whether this tab's panel is in the DOM right now — true only for the selected tab. */
166
+ hasPanel(): Promise<boolean>;
167
+ /**
168
+ * Whether the panel and this header really name each other.
169
+ *
170
+ * Both halves, because each covers a different failure: the header's
171
+ * `aria-controls` has to reach the panel that is showing, and the panel's
172
+ * `aria-labelledby` has to come back to THIS header. A panel wired to the wrong
173
+ * tab looks perfect on screen — the right content is under the right header — and
174
+ * announces the wrong name, which is the whole of a tabbed interface for anyone
175
+ * not looking at it. It also has to be a `tabpanel`: the reference resolving to
176
+ * some other element is a broken pairing, not a styling detail.
177
+ *
178
+ * Throws when there is no panel at all, which is a different fact from a broken
179
+ * pairing — see {@link getPanelText}.
180
+ */
181
+ isPanelBound(): Promise<boolean>;
182
+ /**
183
+ * The text of this tab's panel, trimmed.
184
+ *
185
+ * Throws rather than answering `''` for a tab whose panel is not rendered, and
186
+ * the message says which of the two reasons it is: `<wr-tabs>` keeps only the
187
+ * selected tab's panel in the DOM (the content of every other tab sits in an
188
+ * unrendered `<ng-template>`, so switching tabs destroys a panel and builds the
189
+ * next one), and a router strip renders no panel at all.
190
+ */
191
+ getPanelText(): Promise<string>;
192
+ /**
193
+ * Activate this tab the way a pointer does.
194
+ *
195
+ * A disabled CONTENT tab is left alone: it is a real `<button disabled>`, which
196
+ * fires no click at all. A disabled ROUTER tab is NOT — the anchor carries
197
+ * `aria-disabled="true"` and `tabindex="-1"`, and nothing cancels its
198
+ * `routerLink`, so a click on it still navigates. That is a gap in the component
199
+ * rather than in this harness, and it is why a router strip's expectations belong
200
+ * on the resolved route rather than on the click.
201
+ */
202
+ click(): Promise<void>;
203
+ /** Move keyboard focus onto this header. */
204
+ focus(): Promise<void>;
205
+ /** Take focus off this header. */
206
+ blur(): Promise<void>;
207
+ /** Whether this header holds keyboard focus — the roving cursor, not the selection. */
208
+ isFocused(): Promise<boolean>;
209
+ /** `getHarness(…)` searches this tab's PANEL, which is where its content is. */
210
+ protected getRootHarnessLoader(): Promise<HarnessLoader>;
211
+ /** The panel element, or `null` when this tab has none rendered. */
212
+ private panelOrNull;
213
+ /** The panel element, or a failure naming which of the two reasons there isn't one. */
214
+ private panelOrThrow;
215
+ /** This tab's `aria-controls`, or a failure saying a router strip has no panels. */
216
+ private panelIdOrThrow;
217
+ /**
218
+ * An id selector that survives the id it is given.
219
+ *
220
+ * `[id="…"]` rather than `#…`: the ids here are built from the consumer's `key`,
221
+ * and a key holding a dot, a colon or a leading digit turns `#id` into a selector
222
+ * that either throws or matches something else entirely.
223
+ */
224
+ private static byId;
225
+ }
226
+
227
+ /**
228
+ * @license
229
+ *
230
+ * Use of this source code is governed by an MIT-style license that can be
231
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
232
+ */
233
+
234
+ /**
235
+ * Test harness for `<wr-tabs>`, with {@link WrTabHarness} for one tab and the panel
236
+ * it controls.
237
+ *
238
+ * The component has two modes and they answer "which tab is active" differently,
239
+ * which is most of what this harness exists to keep straight:
240
+ *
241
+ * - **Content** — the tabs are `<button role="tab">`s, the strip is ONE tab stop
242
+ * (the roving `tabindex` sits on the selected tab), and the arrow keys ACTIVATE
243
+ * the tab they move to, the APG's automatic-activation pattern. `<wr-tabs>`
244
+ * renders exactly one panel: the selected tab's.
245
+ * - **Router** — one `routerLink` on any child switches the whole strip over. The
246
+ * tabs become `<a role="tab">`s, they announce no `aria-selected` at all (the
247
+ * router paints `--active` and nothing else), the strip renders NO panel, and it
248
+ * stops being one tab stop — every enabled tab is a Tab stop of its own. The
249
+ * arrow keys still move focus, but they select nothing: the route does that.
250
+ *
251
+ * So {@link getSelectedLabel} and {@link getFocusedLabel} are two different
252
+ * questions, and {@link getTabStopLabels} is a third. They coincide in content mode
253
+ * and come apart in router mode; a spec that asserts one and means another passes
254
+ * through the bug.
255
+ *
256
+ * Everything here is driven from the KEYBOARD rather than by clicking a coordinate:
257
+ * a unit test has no layout, so a hit test would answer with nothing, and the
258
+ * keyboard is the accessible path anyway. {@link select} is the exception — a
259
+ * no-arg click needs no coordinate.
260
+ *
261
+ * @example
262
+ * ```ts
263
+ * const tabs = await loader.getHarness(WrTabsHarness);
264
+ *
265
+ * expect(await tabs.getTabLabels()).toEqual(['One', 'Two', 'Three']);
266
+ * await tabs.select({ label: 'Two' });
267
+ * expect(await tabs.getPanelText()).toContain('Second panel');
268
+ * ```
269
+ *
270
+ * @see https://ngwr.dev/reference/components/tabs
271
+ * @see https://ngwr.dev/guides/testing
272
+ */
273
+ declare class WrTabsHarness extends ComponentHarness {
274
+ static hostSelector: string;
275
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
276
+ static with(options?: WrTabsHarnessFilters): HarnessPredicate<WrTabsHarness>;
277
+ /**
278
+ * The role the strip announces — `tablist`.
279
+ *
280
+ * Read off the strip, not the host: `<wr-tabs>` carries the `wr-tabs` class and no
281
+ * role of its own, and the `tablist` is the scrolling `.wr-tabs__strip` inside it.
282
+ * Without that role the headers are a row of buttons: nothing tells a screen
283
+ * reader how many tabs there are or which one of them is showing.
284
+ */
285
+ getRole(): Promise<string | null>;
286
+ /**
287
+ * The axis the strip announces, which decides which arrow keys a screen-reader
288
+ * user is told to press.
289
+ *
290
+ * `<wr-tabs>` ships one orientation — the strip is a horizontal scroller and hard
291
+ * codes `aria-orientation="horizontal"` — so today this always answers
292
+ * `'horizontal'`. It is read from the DOM and normalized the way ARIA reads it:
293
+ * anything that is not `vertical`, a missing attribute included, is `'horizontal'`,
294
+ * the default for a `tablist`.
295
+ *
296
+ * Which means an assertion here catches a strip that starts ANNOUNCING `vertical`
297
+ * while its arrow keys still walk the horizontal axis — and cannot catch the
298
+ * mirror image, a vertical mode that forgets to update the attribute: that one
299
+ * answers `'horizontal'` and looks unchanged. One attribute is all this reads.
300
+ */
301
+ getOrientation(): Promise<'horizontal' | 'vertical'>;
302
+ /**
303
+ * The size the strip renders at, from the host modifier.
304
+ *
305
+ * `md` is the default and paints no modifier of its own, so its absence is the
306
+ * answer rather than a missing one.
307
+ */
308
+ getSize(): Promise<WrTabsHarnessSize>;
309
+ /**
310
+ * Whether this strip navigates instead of swapping panels.
311
+ *
312
+ * Derived from what got RENDERED — a router tab is an `<a>` — rather than from the
313
+ * `routerLink` inputs, because the switch is all-or-nothing: one `routerLink`
314
+ * anywhere in the strip turns every tab into a link and drops the panel. A strip
315
+ * with no tabs at all is content mode, which is what the component does with it.
316
+ */
317
+ isRouterMode(): Promise<boolean>;
318
+ /**
319
+ * This strip's tabs, in render order.
320
+ *
321
+ * Scoped to this strip rather than to the host, which is what keeps a `<wr-tabs>`
322
+ * NESTED in a panel from answering for its parent: the inner strip is a descendant
323
+ * of the outer host, so a host-wide query would hand back both sets of tabs as one
324
+ * flat list.
325
+ */
326
+ getTabs(filters?: WrTabHarnessFilters): Promise<WrTabHarness[]>;
327
+ /** The label of every tab, in render order. */
328
+ getTabLabels(): Promise<string[]>;
329
+ /**
330
+ * The selected tab, or `null` when none is.
331
+ *
332
+ * A content strip always has one — it falls back to the first tab when `active`
333
+ * matches nothing — so `null` means a router strip whose current route matches no
334
+ * tab, or a strip with no tabs.
335
+ */
336
+ getSelectedTab(): Promise<WrTabHarness | null>;
337
+ /** The label of the selected tab, or `null` when none is selected. */
338
+ getSelectedLabel(): Promise<string | null>;
339
+ /**
340
+ * Select the first tab matching the filters, the way a pointer does.
341
+ *
342
+ * Throws when nothing matches, naming the tabs that do exist, and throws again
343
+ * when the tab is still unselected afterwards — with both causes named, because a
344
+ * click that quietly did nothing surfaces as an unrelated assertion three lines
345
+ * later. Those causes are a disabled CONTENT tab (a `<button disabled>` never sees
346
+ * the click at all) and a router strip whose navigation did not land on this tab.
347
+ *
348
+ * A router strip is otherwise fine here: the click starts a route change, the
349
+ * harness stabilizes the pending navigation before it re-reads the strip, and
350
+ * `routerLinkActive` has painted the selection by then — so this resolves. It is a
351
+ * guard, a redirect or an unmatched path that leaves the tab unselected. Note that
352
+ * `disabled` does not stop a router tab at all; see {@link WrTabHarness.click}.
353
+ */
354
+ select(filters: WrTabHarnessFilters): Promise<void>;
355
+ /**
356
+ * Select the tab at this position in render order, counting from 0.
357
+ *
358
+ * Throws on an index the strip does not have, naming its length: a silent no-op
359
+ * there reads as "the tab did not react" when the tab was never addressed.
360
+ */
361
+ selectByIndex(index: number): Promise<void>;
362
+ /**
363
+ * The labels of every tab a Tab press can land on, in render order.
364
+ *
365
+ * A LIST rather than one label, because the count is the mode: a content strip
366
+ * roves a single `tabindex="0"` and answers with exactly one label — the selected
367
+ * tab — while a router strip makes every enabled tab its own stop and answers with
368
+ * all of them. Either way a disabled tab is never in here.
369
+ */
370
+ getTabStopLabels(): Promise<string[]>;
371
+ /**
372
+ * Whether the strip is a single tab stop — the roving-`tabindex` pattern the APG
373
+ * asks a `tablist` for.
374
+ *
375
+ * True for a content strip, false for a router one, which puts every enabled tab
376
+ * in the page tab order. A strip whose every tab is disabled has no stop at all
377
+ * and answers `true`: nothing to rove, and Tab skips it.
378
+ */
379
+ isRoving(): Promise<boolean>;
380
+ /**
381
+ * The label of the tab holding keyboard focus, or `null` when focus is elsewhere.
382
+ *
383
+ * The other answer to "which tab is active", and not the same as
384
+ * {@link getSelectedLabel}: the arrow keys move this. In content mode they also
385
+ * select what they land on, so the two stay together; in router mode focus walks
386
+ * the strip while the selection stays on whatever the route resolved to.
387
+ */
388
+ getFocusedLabel(): Promise<string | null>;
389
+ /**
390
+ * Put focus where a Tab press would put it — the first tab stop in render order.
391
+ *
392
+ * That is the selected tab in content mode, and the first enabled tab in a router
393
+ * strip. Throws when the strip has no stop at all, because Tab then skips past it
394
+ * rather than entering it — a content strip whose selected tab is disabled has
395
+ * none, and neither has one whose every tab is disabled, or one with no tabs.
396
+ */
397
+ focusTabStop(): Promise<void>;
398
+ /**
399
+ * ArrowRight on the strip — one tab toward the visual RIGHT, wrapping at the end
400
+ * and skipping disabled tabs.
401
+ *
402
+ * The physical key, because that is what a keyboard has. The component follows
403
+ * visual order per the APG, so under `dir="rtl"` this moves to the PREVIOUS tab —
404
+ * a spec exercising a mirrored strip swaps this and {@link pressArrowLeft}.
405
+ *
406
+ * In content mode the tab it lands on is also SELECTED (automatic activation); in
407
+ * router mode only focus moves.
408
+ */
409
+ pressArrowRight(): Promise<void>;
410
+ /** ArrowLeft on the strip — one tab toward the visual LEFT, mirrored under `dir="rtl"`. */
411
+ pressArrowLeft(): Promise<void>;
412
+ /**
413
+ * Home on the strip — the FIRST enabled tab.
414
+ *
415
+ * Home and End name a position in the tab list rather than an edge of the strip,
416
+ * so unlike the arrows they read the same in both reading directions.
417
+ */
418
+ pressHome(): Promise<void>;
419
+ /** End on the strip — the LAST enabled tab, in both reading directions. */
420
+ pressEnd(): Promise<void>;
421
+ /** Whether this strip is showing a panel at all — false for a router strip. */
422
+ hasPanel(): Promise<boolean>;
423
+ /**
424
+ * The text of the panel that is showing, trimmed — the selected tab's content, and
425
+ * the only tab content in the DOM.
426
+ *
427
+ * Throws when nothing is selected. Delegates to the selected tab, so the panel it
428
+ * reads is the one that tab's `aria-controls` points at rather than "the first
429
+ * `.wr-tabs__panel` around" — the two are only the same page when the wiring is
430
+ * right, and {@link WrTabHarness.isPanelBound} is what says whether it is.
431
+ */
432
+ getPanelText(): Promise<string>;
433
+ /**
434
+ * Which edges of the strip are faded out, from the public `--fade-start` /
435
+ * `--fade-end` host modifiers — the cue that there are more tabs than fit, on the
436
+ * side they are on.
437
+ *
438
+ * The component computes these from the strip's scroll metrics, so in a unit test
439
+ * both are always `false`: jsdom lays nothing out, every element measures 0x0, and
440
+ * a strip that never overflows never fades. Assert this in a real browser, or
441
+ * declare the metrics and dispatch a `scroll` the way the component's own spec
442
+ * does.
443
+ */
444
+ getFades(): Promise<{
445
+ start: boolean;
446
+ end: boolean;
447
+ }>;
448
+ /** Click a tab and check it took, or say which of the two reasons it did not. */
449
+ private activate;
450
+ /**
451
+ * Send a key to the `role="tablist"` strip.
452
+ *
453
+ * The strip owns the keydown handler, and a real user's keypress on the focused
454
+ * header bubbles to exactly here — so this is the honest target, and the one that
455
+ * still works when jsdom has left real focus on `<body>`. It is also the target
456
+ * that leaves the headers alone: the CDK types into whatever element it is handed,
457
+ * which on a `<button>` means writing a `value` attribute onto a tab.
458
+ */
459
+ private press;
460
+ /** This strip's own `role="tablist"` element — the first one under the host. */
461
+ private strip;
462
+ /**
463
+ * A loader rooted at this strip, so tab queries cannot reach a nested strip's tabs:
464
+ * a nested `<wr-tabs>` lives in the PANEL, which is outside this element.
465
+ */
466
+ private stripLoader;
467
+ }
468
+
469
+ export { WrTabHarness, WrTabsHarness };
470
+ export type { WrTabHarnessFilters, WrTabsHarnessFilters, WrTabsHarnessSize };
@@ -99,6 +99,15 @@ declare class WrTabs implements WrTabsContext {
99
99
  /** Visual size variant. */
100
100
  readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
101
101
  protected readonly tabs: _angular_core.Signal<readonly WrTab[]>;
102
+ private readonly dir;
103
+ /**
104
+ * Reading direction of the strip. `Directionality` is root-provided, so this
105
+ * always resolves — `optional` only guards a consumer who has deliberately
106
+ * torn the provider out. It reads the document once at construction; a
107
+ * subtree that overrides the direction does it with the CDK's `Dir`
108
+ * directive, which writes `valueSignal`, so the read stays reactive.
109
+ */
110
+ private readonly isRtl;
102
111
  /** When any child has a routerLink, the whole strip switches to router mode. */
103
112
  protected readonly isRouter: _angular_core.Signal<boolean>;
104
113
  /** Content-mode: the tab whose key matches `active()` (or the first tab if none yet). */
@@ -0,0 +1,184 @@
1
+ import { BaseHarnessFilters, ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
2
+ import { WrTextareaSize, WrTextareaResize } from 'ngwr/textarea';
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 `<wr-textarea>` a harness query matches. */
12
+ interface WrTextareaHarnessFilters extends BaseHarnessFilters {
13
+ /** Match the current value — a string is an exact match, a RegExp is tested. */
14
+ readonly value?: string | RegExp;
15
+ /** Match the placeholder — a string is an exact match, a RegExp is tested. */
16
+ readonly placeholder?: string | RegExp;
17
+ /**
18
+ * Match the accessible name the field answers to — the explicit `ariaLabel`,
19
+ * or the `placeholder` it falls back to. A string is an exact match, a RegExp
20
+ * is tested.
21
+ */
22
+ readonly label?: string | RegExp;
23
+ /** Match only enabled (`false`) or only disabled (`true`) fields. */
24
+ readonly disabled?: boolean;
25
+ }
26
+
27
+ /**
28
+ * @license
29
+ *
30
+ * Use of this source code is governed by an MIT-style license that can be
31
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
32
+ */
33
+
34
+ /**
35
+ * Test harness for `<wr-textarea>` — the multi-line COMPONENT.
36
+ *
37
+ * Not to be confused with `WrInputHarness` (`ngwr/input/testing`), which drives
38
+ * `[wrInput]` — the directive form, applied to a real `<textarea>` the consumer
39
+ * wrote themselves. Pick by the markup: `<wr-textarea …>` is this harness,
40
+ * `<textarea wrInput>` is that one. They are not interchangeable, because here
41
+ * the native element is INSIDE the component: the value, the name and every
42
+ * native state below are read off `.wr-textarea__native` (the host carries only
43
+ * the `wr-textarea--*` modifiers), and the accessible name has to be forwarded
44
+ * onto it — a `<label for>` in the consumer's template cannot reach inside.
45
+ *
46
+ * Two things this deliberately does NOT offer:
47
+ *
48
+ * - **A character counter or `maxlength`.** `<wr-textarea>` has neither — it
49
+ * forwards only `placeholder`, `rows`, `readonly`, `disabled`, `value` and the
50
+ * resolved `aria-label` to the native element, so there is no counter to read, and a
51
+ * `maxlength` attribute written on `<wr-textarea>` lands on the wrapper where
52
+ * nothing consumes it. A `getMaxLength()` could only ever answer `null`, which
53
+ * would read as "no limit set" rather than "no limit possible". Cap the text in
54
+ * the model instead.
55
+ * - **A height, or a grip drag.** Autosize fits from `scrollHeight`, and the grip
56
+ * is driven by pointer coordinates. A DOM with no layout reports 0 for both, so
57
+ * either method would answer confidently and wrongly. What survives without
58
+ * layout is who OWNS the height ({@link hasFittedHeight}) and which direction
59
+ * the grip advertises ({@link getResizeDirection}); the grip is also
60
+ * `aria-hidden` and has no keyboard path, so there is no accessible route for a
61
+ * harness to drive it down.
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * const notes = await loader.getHarness(WrTextareaHarness.with({ placeholder: 'Notes' }));
66
+ *
67
+ * await notes.setValue('first draft');
68
+ * expect(await notes.getValue()).toBe('first draft');
69
+ * ```
70
+ *
71
+ * @see https://ngwr.dev/guides/testing
72
+ */
73
+ declare class WrTextareaHarness extends ComponentHarness {
74
+ static hostSelector: string;
75
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
76
+ static with(options?: WrTextareaHarnessFilters): HarnessPredicate<WrTextareaHarness>;
77
+ private readonly native;
78
+ /**
79
+ * The text currently in the field.
80
+ *
81
+ * The `value` PROPERTY, never the element's text: a `<textarea>`'s text content
82
+ * is only its initial content, and this one is bound with `[value]`, so the
83
+ * text content stays empty for the field's whole life no matter what is typed.
84
+ */
85
+ getValue(): Promise<string>;
86
+ /**
87
+ * Type a value in, the way a user would as far as the component can tell.
88
+ *
89
+ * No `change` is dispatched: `sendKeys` fires one `input` per character (plus the
90
+ * key events around it), and `input` is the only value event the component
91
+ * listens to. It hands the result out through the `value` model, so signal forms,
92
+ * `[formField]`, `[(ngModel)]` and `[(value)]` all hear that single write.
93
+ * `WrInputHarness` dispatches a `change` on top for the directive form; that is
94
+ * belt-and-braces rather than a requirement, since Angular's own accessors for
95
+ * text controls listen to `input` too.
96
+ *
97
+ * Throws on a disabled or read-only field — see {@link assertWritable}.
98
+ */
99
+ setValue(value: string): Promise<void>;
100
+ /** Empty the field, dispatching the same `input` a user's last backspace would. */
101
+ clear(): Promise<void>;
102
+ /** The placeholder text, or `''` when the field has none. */
103
+ getPlaceholder(): Promise<string>;
104
+ /**
105
+ * The accessible name the field answers to, or `null` when it has none.
106
+ *
107
+ * Read from the native element's `aria-label`, which is the only place a name
108
+ * can live for this component: the `<textarea>` is inside it, so a
109
+ * `<label for>` outside cannot reach it and an `aria-label` on `<wr-textarea>`
110
+ * names the wrapper rather than the control. The component forwards `ariaLabel`
111
+ * and falls back to `placeholder` — and an empty placeholder is treated as no
112
+ * name at all rather than an empty one, so this answers `null`, not `''`.
113
+ */
114
+ getLabel(): Promise<string | null>;
115
+ /** The visible row count (`rows`) — the field's height until autosize takes over. */
116
+ getRows(): Promise<number>;
117
+ /** The control size. `md` is the default and earns no modifier, so a bare host IS `md`. */
118
+ getSize(): Promise<WrTextareaSize>;
119
+ /**
120
+ * Whether the field refuses input.
121
+ *
122
+ * The native element's `disabled` property, not the host's `--disabled` class:
123
+ * the property is what actually blocks typing and what the accessibility tree
124
+ * reports, while the class only paints it.
125
+ */
126
+ isDisabled(): Promise<boolean>;
127
+ /** Whether the field shows its value but refuses edits (`readonly`). */
128
+ isReadonly(): Promise<boolean>;
129
+ /**
130
+ * Whether the field is marked invalid.
131
+ *
132
+ * The native element is checked first, because that is the element a screen
133
+ * reader reports on — but `<wr-textarea>` forwards nothing here (it takes no
134
+ * `ariaInvalid` input and, unlike `[wrInput]`, does not read the surrounding
135
+ * `<wr-form-field>`), so a consumer marks the field by binding `aria-invalid`
136
+ * on the host. Both are read for that reason, and a native `aria-invalid="false"`
137
+ * wins over the wrapper rather than falling through to it.
138
+ */
139
+ isInvalid(): Promise<boolean>;
140
+ /**
141
+ * Whether the field grows with its content (`autosize`).
142
+ *
143
+ * Read from `wr-textarea--no-resize`, which is named for what it does to the
144
+ * grip but is added by `autosize` and by nothing else — `[resizable]="false"`
145
+ * takes the grip away without it.
146
+ */
147
+ isAutosizing(): Promise<boolean>;
148
+ /**
149
+ * Whether autosize currently OWNS the field's height: the inline `height` it
150
+ * writes on the native element, and hands back when `autosize` goes off.
151
+ *
152
+ * The fitted number itself is not exposed — see the class docs. What is worth
153
+ * asserting is the handover: a field left frozen at the last fitted height
154
+ * ignores `rows` from then on, which reads as the input having done nothing.
155
+ *
156
+ * An inline `height` a consumer wrote themselves is indistinguishable from a
157
+ * fitted one; pair this with {@link isAutosizing} when that matters.
158
+ */
159
+ hasFittedHeight(): Promise<boolean>;
160
+ /**
161
+ * The direction the corner grip will drag in, or `'none'` when there is no grip
162
+ * to drag — which is any of `[resizable]="false"`, `autosize` or `disabled`.
163
+ * {@link isAutosizing} and {@link isDisabled} tell those three apart.
164
+ */
165
+ getResizeDirection(): Promise<WrTextareaResize>;
166
+ /** Move keyboard focus onto the native element — the host itself is not focusable. */
167
+ focus(): Promise<void>;
168
+ /** Take focus away, which is what makes the component emit `touch`. */
169
+ blur(): Promise<void>;
170
+ isFocused(): Promise<boolean>;
171
+ /**
172
+ * The native element, or a targeted failure when writing to it would prove
173
+ * nothing.
174
+ *
175
+ * A browser drops every keystroke aimed at a disabled or read-only field, but a
176
+ * DOM with no input gating accepts them and the model updates — so a harness
177
+ * that typed anyway would hand a consumer a green spec for behaviour that
178
+ * cannot happen in their app.
179
+ */
180
+ private assertWritable;
181
+ }
182
+
183
+ export { WrTextareaHarness };
184
+ export type { WrTextareaHarnessFilters };